# Unknown opcode in disassemble()

Brian Buchanan (brian@wasteland.calbbs.com)
Fri, 22 Mar 1996 17:32:22 PST

- Messages sorted by:[ date ][ thread ][ subject ][ author ]

    I disassembled the following verb($list_utils:assoc):

    "assoc(target,list[,index]) returns the first element of `list' whose own index-th element is target.  Index defaults to 1.";
    "returns {} if no such element is found";
    try
      return listassoc(@args);
    except (E_INVARG)
      {target, lst, ?indx = 1} = args;
      for t in (lst)
        if (t[indx] == target)
          "... do this test first since it's the most likely to fail; this needs -d";
          if (typeof(t) == LIST && length(t) >= indx)
            return t;
          endif
        endif
      endfor
      return {};
    endtry

    The try-except-endtry stuff is in there incase I ever compile the server
    without the listassoc() builtin.  Anyway, here's the disassemble of it:

    Language version number: 3
    First line number: 1

    Main code vector:
    =================
    [Bytes for labels = 1, literals = 1, forks = 1, variables = 1, stack refs = 1]
    [Maximum stack size = 4]
      0: 100 000               PUSH_LITERAL "assoc(target,list[,index]) returns
    the first element of `list' whose own index-th element is target.  Index
    defaults to 1."
      2: 111                   POP
      3: 100 001               PUSH_LITERAL "returns {} if no such element is
    found"
      5: 111                   POP
      6: 100 002               PUSH_LITERAL E_INVARG
      8: 016                 * MAKE_SINGLETON_LIST
      9: 112 002 023           *** Unknown extended opcode *** 23
     12: 112 008 001         * TRY_EXCEPT 1
     15: 076                   PUSH args
     16: 017                 * CHECK_LIST_FOR_SPLICE
     17: 012 023             * CALL_FUNC listassoc
     19: 108                   RETURN
     20: 112 004 082           END_EXCEPT 82
     23: 111                   POP
     24: 076                   PUSH args
     25: 112 013 003 002 004
         018 000 019 000 020
         037 040             * SCATTER 3/2/4: target/0 lst/0 indx/37 40
     37: 124                   NUM 1
     38: 054                 * PUT indx
     39: 111                   POP
     40: 111                   POP
     41: 086                   PUSH lst
     42: 124                   NUM 1
     43: 005 021 080         * FOR_LIST t 80
     46: 088                   PUSH t
     47: 087                   PUSH indx
     48: 014                 * INDEX
     49: 085                   PUSH target
     50: 023                 * EQ
     51: 000 078             * IF 78
     53: 100 003               PUSH_LITERAL "... do this test first since it's the
    most likely to fail; this needs -d"
     55: 111                   POP
     56: 088                   PUSH t
     57: 016                 * MAKE_SINGLETON_LIST
     58: 012 093             * CALL_FUNC typeof
     60: 070                   PUSH LIST
     61: 023                 * EQ
     62: 030 070             * AND 70
     64: 088                   PUSH t
     65: 016                 * MAKE_SINGLETON_LIST
     66: 012 046             * CALL_FUNC length
     68: 087                   PUSH indx
     69: 028                 * GE
     70: 000 076             * IF 76
     72: 088                   PUSH t
     73: 108                   RETURN
     74: 107 076               JUMP 76
     76: 107 078               JUMP 78
     78: 107 043               JUMP 43
     80: 101                   MAKE_EMPTY_LIST
     81: 108                   RETURN
     82: 110                   DONE

    Line 9 is what threw me... I dunno if that's dangerous or just something
    that wasn't updated in disassemble().  This is under version 1.8.0p2.

    ---
       Brian Buchanan    sysop@calbbs.com    brian@wasteland.calbbs.com
    -= ArchWizard of Digital Wasteland MOO (wasteland.calbbs.com 8888) =-