Annotation of GNUtools/emacs/src/bytecode.c, revision 1.1.1.1

1.1       root        1: /* Execution of byte code produced by bytecomp.el.
                      2:    Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 1, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU Emacs is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU Emacs; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: 
                     21: #include "config.h"
                     22: #include "lisp.h"
                     23: #include "buffer.h"
                     24: 
                     25: Lisp_Object Qbytecode;
                     26: 
                     27: /*  Byte codes: */
                     28: 
                     29: #define Bvarref 010
                     30: #define Bvarset 020
                     31: #define Bvarbind 030
                     32: #define Bcall 040
                     33: #define Bunbind 050
                     34: 
                     35: #define Bnth 070
                     36: #define Bsymbolp 071
                     37: #define Bconsp 072
                     38: #define Bstringp 073
                     39: #define Blistp 074
                     40: #define Beq 075
                     41: #define Bmemq 076
                     42: #define Bnot 077
                     43: #define Bcar 0100
                     44: #define Bcdr 0101
                     45: #define Bcons 0102
                     46: #define Blist1 0103
                     47: #define Blist2 0104
                     48: #define Blist3 0105
                     49: #define Blist4 0106
                     50: #define Blength 0107
                     51: #define Baref 0110
                     52: #define Baset 0111
                     53: #define Bsymbol_value 0112
                     54: #define Bsymbol_function 0113
                     55: #define Bset 0114
                     56: #define Bfset 0115
                     57: #define Bget 0116
                     58: #define Bsubstring 0117
                     59: #define Bconcat2 0120
                     60: #define Bconcat3 0121
                     61: #define Bconcat4 0122
                     62: #define Bsub1 0123
                     63: #define Badd1 0124
                     64: #define Beqlsign 0125
                     65: #define Bgtr 0126
                     66: #define Blss 0127
                     67: #define Bleq 0130
                     68: #define Bgeq 0131
                     69: #define Bdiff 0132
                     70: #define Bnegate 0133
                     71: #define Bplus 0134
                     72: #define Bmax 0135
                     73: #define Bmin 0136
                     74: 
                     75: #define Bpoint 0140
                     76: #define Bmark 0141 /* no longer generated as of v18 */
                     77: #define Bgoto_char 0142
                     78: #define Binsert 0143
                     79: #define Bpoint_max 0144
                     80: #define Bpoint_min 0145
                     81: #define Bchar_after 0146
                     82: #define Bfollowing_char 0147
                     83: #define Bpreceding_char 0150
                     84: #define Bcurrent_column 0151
                     85: #define Bindent_to 0152
                     86: #define Bscan_buffer 0153 /* No longer generated as of v18 */
                     87: #define Beolp 0154
                     88: #define Beobp 0155
                     89: #define Bbolp 0156
                     90: #define Bbobp 0157
                     91: #define Bcurrent_buffer 0160
                     92: #define Bset_buffer 0161
                     93: #define Bread_char 0162
                     94: #define Bset_mark 0163 /* this loser is no longer generated as of v18 */
                     95: #define Binteractive_p 0164 /* Needed since interactive-p takes unevalled args */
                     96: 
                     97: #define Bconstant2 0201
                     98: #define Bgoto 0202
                     99: #define Bgotoifnil 0203
                    100: #define Bgotoifnonnil 0204
                    101: #define Bgotoifnilelsepop 0205
                    102: #define Bgotoifnonnilelsepop 0206
                    103: #define Breturn 0207
                    104: #define Bdiscard 0210
                    105: #define Bdup 0211
                    106: 
                    107: #define Bsave_excursion 0212
                    108: #define Bsave_window_excursion 0213
                    109: #define Bsave_restriction 0214
                    110: #define Bcatch 0215
                    111: 
                    112: #define Bunwind_protect 0216
                    113: #define Bcondition_case 0217
                    114: #define Btemp_output_buffer_setup 0220
                    115: #define Btemp_output_buffer_show 0221
                    116: 
                    117: #define Bconstant 0300
                    118: #define CONSTANTLIM 0100
                    119: 
                    120: /* Fetch the next byte from the bytecode stream */
                    121: 
                    122: #define FETCH ((unsigned char *)XSTRING (bytestr)->data)[pc++]
                    123: 
                    124: /* Fetch two bytes from the bytecode stream
                    125:  and make a 16-bit number out of them */
                    126: 
                    127: #define FETCH2 (op = FETCH, op + (FETCH << 8))
                    128: 
                    129: /* Push x onto the execution stack. */
                    130: 
                    131: #define PUSH(x) (*++stackp = (x))
                    132: 
                    133: /* Pop a value off the execution stack.  */
                    134: 
                    135: #define POP (*stackp--)
                    136: 
                    137: /* Discard n values from the execution stack.  */
                    138: 
                    139: #define DISCARD(n) (stackp -= (n))
                    140: 
                    141: /* Get the value which is at the top of the execution stack, but don't pop it. */
                    142: 
                    143: #define TOP (*stackp)
                    144: 
                    145: 
                    146: DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0,
                    147:   "")
                    148:   (bytestr, vector, maxdepth)
                    149:      Lisp_Object bytestr, vector, maxdepth;
                    150: {
                    151:   struct gcpro gcpro1, gcpro2, gcpro3;
                    152:   int count = specpdl_ptr - specpdl;
                    153:   register int pc = 0;
                    154:   register int op;
                    155:   Lisp_Object *stack;
                    156:   register Lisp_Object *stackp;
                    157:   Lisp_Object *stacke;
                    158:   register Lisp_Object v1, v2;
                    159:   register Lisp_Object *vectorp = XVECTOR (vector)->contents;
                    160: 
                    161:   CHECK_STRING (bytestr, 0);
                    162:   if (XTYPE (vector) != Lisp_Vector)
                    163:     vector = wrong_type_argument (Qvectorp, vector);
                    164:   CHECK_NUMBER (maxdepth, 2);
                    165: 
                    166:   stackp = (Lisp_Object *) alloca (XFASTINT (maxdepth) * sizeof (Lisp_Object));
                    167:   bzero (stackp, XFASTINT (maxdepth) * sizeof (Lisp_Object));
                    168:   GCPRO3 (bytestr, vector, *stackp);
                    169:   gcpro3.nvars = XFASTINT (maxdepth);
                    170: 
                    171:   --stackp;
                    172:   stack = stackp;
                    173:   stacke = stackp + XFASTINT (maxdepth);
                    174: 
                    175:   while (1)
                    176:     {
                    177:       if (stackp > stacke)
                    178:        error ("Stack overflow in byte code (byte compiler bug), pc = %d", pc);
                    179:       if (stackp < stack)
                    180:        error ("Stack underflow in byte code (byte compiler bug), pc = %d", pc);
                    181:       switch (op = FETCH)
                    182:        {
                    183:        case Bvarref+6:
                    184:          op = FETCH;
                    185:          goto varref;
                    186: 
                    187:        case Bvarref+7:
                    188:          op = FETCH2;
                    189:          goto varref;
                    190: 
                    191:        case Bvarref: case Bvarref+1: case Bvarref+2: case Bvarref+3:
                    192:        case Bvarref+4: case Bvarref+5:
                    193:          op = op - Bvarref;
                    194:        varref:
                    195:          v1 = vectorp[op];
                    196:          if (XTYPE (v1) != Lisp_Symbol)
                    197:            v2 = Fsymbol_value (v1);
                    198:          else
                    199:            {
                    200:              v2 = XSYMBOL (v1)->value;
                    201: #ifdef SWITCH_ENUM_BUG
                    202:              switch ((int) XTYPE (v2))
                    203: #else
                    204:              switch (XTYPE (v2))
                    205: #endif
                    206:                {
                    207:                case Lisp_Symbol:
                    208:                  if (!EQ (v2, Qunbound))
                    209:                    break;
                    210:                case Lisp_Intfwd:
                    211:                case Lisp_Boolfwd:
                    212:                case Lisp_Objfwd:
                    213:                case Lisp_Buffer_Local_Value:
                    214:                case Lisp_Some_Buffer_Local_Value:
                    215:                case Lisp_Buffer_Objfwd:
                    216:                case Lisp_Void:
                    217:                  v2 = Fsymbol_value (v1);
                    218:                }
                    219:            }
                    220:          PUSH (v2);
                    221:          break;
                    222: 
                    223:        case Bvarset+6:
                    224:          op = FETCH;
                    225:          goto varset;
                    226: 
                    227:        case Bvarset+7:
                    228:          op = FETCH2;
                    229:          goto varset;
                    230: 
                    231:        case Bvarset: case Bvarset+1: case Bvarset+2: case Bvarset+3:
                    232:        case Bvarset+4: case Bvarset+5:
                    233:          op -= Bvarset;
                    234:        varset:
                    235:          Fset (vectorp[op], POP);
                    236:          break;
                    237: 
                    238:        case Bvarbind+6:
                    239:          op = FETCH;
                    240:          goto varbind;
                    241: 
                    242:        case Bvarbind+7:
                    243:          op = FETCH2;
                    244:          goto varbind;
                    245: 
                    246:        case Bvarbind: case Bvarbind+1: case Bvarbind+2: case Bvarbind+3:
                    247:        case Bvarbind+4: case Bvarbind+5:
                    248:          op -= Bvarbind;
                    249:        varbind:
                    250:          specbind (vectorp[op], POP);
                    251:          break;
                    252: 
                    253:        case Bcall+6:
                    254:          op = FETCH;
                    255:          goto docall;
                    256: 
                    257:        case Bcall+7:
                    258:          op = FETCH2;
                    259:          goto docall;
                    260: 
                    261:        case Bcall: case Bcall+1: case Bcall+2: case Bcall+3:
                    262:        case Bcall+4: case Bcall+5:
                    263:          op -= Bcall;
                    264:        docall:
                    265:          DISCARD(op);
                    266:          /* Ffuncall now follows the standard convention that a
                    267:             function with MANY args relies on the caller to protect.  */
                    268: #if 0
                    269:          /* Remove protection from the args we are giving to Ffuncall.
                    270:             FFuncall will protect them, and double protection would
                    271:             cause disasters.  */
                    272:          gcpro3.nvars = &TOP - stack - 1;
                    273: #endif
                    274:          TOP = Ffuncall (op + 1, &TOP);
                    275: #if 0
                    276:          gcpro3.nvars = XFASTINT (maxdepth);
                    277: #endif
                    278:          break;
                    279: 
                    280:        case Bunbind+6:
                    281:          op = FETCH;
                    282:          goto dounbind;
                    283: 
                    284:        case Bunbind+7:
                    285:          op = FETCH2;
                    286:          goto dounbind;
                    287: 
                    288:        case Bunbind: case Bunbind+1: case Bunbind+2: case Bunbind+3:
                    289:        case Bunbind+4: case Bunbind+5:
                    290:          op -= Bunbind;
                    291:        dounbind:
                    292:          unbind_to (specpdl_ptr - specpdl - op);
                    293:          break;
                    294: 
                    295:        case Bgoto:
                    296:          QUIT;
                    297:          op = FETCH2;    /* pc = FETCH2 loses since FETCH2 contains pc++ */
                    298:          /* A loop always uses a plain goto to jump back.
                    299:             So this makes sure we consider GC in each loop.  */
                    300:          if (op < pc && consing_since_gc > gc_cons_threshold)
                    301:            Fgarbage_collect ();
                    302:          pc = op;
                    303:          break;
                    304: 
                    305:        case Bgotoifnil:
                    306:          QUIT;
                    307:          op = FETCH2;
                    308:          if (NULL (POP))
                    309:            pc = op;
                    310:          break;
                    311: 
                    312:        case Bgotoifnonnil:
                    313:          QUIT;
                    314:          op = FETCH2;
                    315:          if (!NULL (POP))
                    316:            pc = op;
                    317:          break;
                    318: 
                    319:        case Bgotoifnilelsepop:
                    320:          QUIT;
                    321:          op = FETCH2;
                    322:          if (NULL (TOP))
                    323:            pc = op;
                    324:          else DISCARD(1);
                    325:          break;
                    326: 
                    327:        case Bgotoifnonnilelsepop:
                    328:          QUIT;
                    329:          op = FETCH2;
                    330:          if (!NULL (TOP))
                    331:            pc = op;
                    332:          else DISCARD(1);
                    333:          break;
                    334: 
                    335:        case Breturn:
                    336:          v1 = POP;
                    337:          goto exit;
                    338: 
                    339:        case Bdiscard:
                    340:          DISCARD(1);
                    341:          break;
                    342: 
                    343:        case Bdup:
                    344:          v1 = TOP;
                    345:          PUSH (v1);
                    346:          break;
                    347: 
                    348:        case Bconstant2:
                    349:          PUSH (vectorp[FETCH2]);
                    350:          break;
                    351: 
                    352:        case Bsave_excursion:
                    353:          record_unwind_protect (save_excursion_restore, save_excursion_save ());
                    354:          break;
                    355: 
                    356:        case Bsave_window_excursion:
                    357:          TOP = Fsave_window_excursion (TOP);
                    358:          break;
                    359: 
                    360:        case Bsave_restriction:
                    361:          record_unwind_protect (save_restriction_restore, save_restriction_save ());
                    362:          break;
                    363: 
                    364:        case Bcatch:
                    365:          v1 = POP;
                    366:          TOP = internal_catch (TOP, Feval, v1);
                    367:          break;
                    368: 
                    369:        case Bunwind_protect:
                    370:          record_unwind_protect (0, POP);
                    371:          (specpdl_ptr - 1)->symbol = Qnil;
                    372:          break;
                    373: 
                    374:        case Bcondition_case:
                    375:          v1 = POP;
                    376:          v1 = Fcons (POP, v1);
                    377:          TOP = Fcondition_case (Fcons (TOP, v1));
                    378:          break;
                    379: 
                    380:        case Btemp_output_buffer_setup:
                    381:          temp_output_buffer_setup (XSTRING (TOP)->data);
                    382:          TOP = Vstandard_output;
                    383:          break;
                    384: 
                    385:        case Btemp_output_buffer_show:
                    386:          v1 = POP;
                    387:          temp_output_buffer_show (TOP);
                    388:          TOP = v1;
                    389:          /* pop binding of standard-output */
                    390:          unbind_to (specpdl_ptr - specpdl - 1);
                    391:          break;
                    392: 
                    393:        case Bnth:
                    394:          v1 = POP;
                    395:          v2 = TOP;
                    396:          CHECK_NUMBER (v2, 0);
                    397:          op = XINT (v2);
                    398:          immediate_quit = 1;
                    399:          while (--op >= 0)
                    400:            {
                    401:              if (CONSP (v1))
                    402:                v1 = XCONS (v1)->cdr;
                    403:              else if (!NULL (v1))
                    404:                {
                    405:                  immediate_quit = 0;
                    406:                  v1 = wrong_type_argument (Qlistp, v1);
                    407:                  immediate_quit = 1;
                    408:                  op++;
                    409:                }
                    410:            }
                    411:          immediate_quit = 0;
                    412:          goto docar;
                    413: 
                    414:        case Bsymbolp:
                    415:          TOP = XTYPE (TOP) == Lisp_Symbol ? Qt : Qnil;
                    416:          break;
                    417: 
                    418:        case Bconsp:
                    419:          TOP = CONSP (TOP) ? Qt : Qnil;
                    420:          break;
                    421: 
                    422:        case Bstringp:
                    423:          TOP = XTYPE (TOP) == Lisp_String ? Qt : Qnil;
                    424:          break;
                    425: 
                    426:        case Blistp:
                    427:          TOP = CONSP (TOP) || NULL (TOP) ? Qt : Qnil;
                    428:          break;
                    429: 
                    430:        case Beq:
                    431:          v1 = POP;
                    432:          TOP = EQ (v1, TOP) ? Qt : Qnil;
                    433:          break;
                    434: 
                    435:        case Bmemq:
                    436:          v1 = POP;
                    437:          TOP = Fmemq (TOP, v1);
                    438:          break;
                    439: 
                    440:        case Bnot:
                    441:          TOP = NULL (TOP) ? Qt : Qnil;
                    442:          break;
                    443: 
                    444:        case Bcar:
                    445:          v1 = TOP;
                    446:        docar:
                    447:          if (CONSP (v1)) TOP = XCONS (v1)->car;
                    448:          else if (NULL (v1)) TOP = Qnil;
                    449:          else Fcar (wrong_type_argument (Qlistp, v1));
                    450:          break;
                    451: 
                    452:        case Bcdr:
                    453:          v1 = TOP;
                    454:          if (CONSP (v1)) TOP = XCONS (v1)->cdr;
                    455:          else if (NULL (v1)) TOP = Qnil;
                    456:          else Fcdr (wrong_type_argument (Qlistp, v1));
                    457:          break;
                    458: 
                    459:        case Bcons:
                    460:          v1 = POP;
                    461:          TOP = Fcons (TOP, v1);
                    462:          break;
                    463: 
                    464:        case Blist1:
                    465:          TOP = Fcons (TOP, Qnil);
                    466:          break;
                    467: 
                    468:        case Blist2:
                    469:          v1 = POP;
                    470:          TOP = Fcons (TOP, Fcons (v1, Qnil));
                    471:          break;
                    472: 
                    473:        case Blist3:
                    474:          DISCARD(2);
                    475:          TOP = Flist (3, &TOP);
                    476:          break;
                    477: 
                    478:        case Blist4:
                    479:          DISCARD(3);
                    480:          TOP = Flist (4, &TOP);
                    481:          break;
                    482: 
                    483:        case Blength:
                    484:          TOP = Flength (TOP);
                    485:          break;
                    486: 
                    487:        case Baref:
                    488:          v1 = POP;
                    489:          TOP = Faref (TOP, v1);
                    490:          break;
                    491: 
                    492:        case Baset:
                    493:          v2 = POP; v1 = POP;
                    494:          TOP = Faset (TOP, v1, v2);
                    495:          break;
                    496: 
                    497:        case Bsymbol_value:
                    498:          TOP = Fsymbol_value (TOP);
                    499:          break;
                    500: 
                    501:        case Bsymbol_function:
                    502:          TOP = Fsymbol_function (TOP);
                    503:          break;
                    504: 
                    505:        case Bset:
                    506:          v1 = POP;
                    507:          TOP = Fset (TOP, v1);
                    508:          break;
                    509: 
                    510:        case Bfset:
                    511:          v1 = POP;
                    512:          TOP = Ffset (TOP, v1);
                    513:          break;
                    514: 
                    515:        case Bget:
                    516:          v1 = POP;
                    517:          TOP = Fget (TOP, v1);
                    518:          break;
                    519: 
                    520:        case Bsubstring:
                    521:          v2 = POP; v1 = POP;
                    522:          TOP = Fsubstring (TOP, v1, v2);
                    523:          break;
                    524: 
                    525:        case Bconcat2:
                    526:          DISCARD(1);
                    527:          TOP = Fconcat (2, &TOP);
                    528:          break;
                    529: 
                    530:        case Bconcat3:
                    531:          DISCARD(2);
                    532:          TOP = Fconcat (3, &TOP);
                    533:          break;
                    534: 
                    535:        case Bconcat4:
                    536:          DISCARD(3);
                    537:          TOP = Fconcat (4, &TOP);
                    538:          break;
                    539: 
                    540:        case Bsub1:
                    541:          v1 = TOP;
                    542:          if (XTYPE (v1) == Lisp_Int)
                    543:            {
                    544:              XSETINT (v1, XINT (v1) - 1);
                    545:              TOP = v1;
                    546:            }
                    547:          else
                    548:            TOP = Fsub1 (v1);
                    549:          break;
                    550: 
                    551:        case Badd1:
                    552:          v1 = TOP;
                    553:          if (XTYPE (v1) == Lisp_Int)
                    554:            {
                    555:              XSETINT (v1, XINT (v1) + 1);
                    556:              TOP = v1;
                    557:            }
                    558:          else
                    559:            TOP = Fadd1 (v1);
                    560:          break;
                    561: 
                    562:        case Beqlsign:
                    563:          v2 = POP; v1 = TOP;
                    564:          CHECK_NUMBER_COERCE_MARKER (v1, 0);
                    565:          CHECK_NUMBER_COERCE_MARKER (v2, 0);
                    566:          TOP = XINT (v1) == XINT (v2) ? Qt : Qnil;
                    567:          break;
                    568: 
                    569:        case Bgtr:
                    570:          v1 = POP;
                    571:          TOP = Fgtr (TOP, v1);
                    572:          break;
                    573: 
                    574:        case Blss:
                    575:          v1 = POP;
                    576:          TOP = Flss (TOP, v1);
                    577:          break;
                    578: 
                    579:        case Bleq:
                    580:          v1 = POP;
                    581:          TOP = Fleq (TOP, v1);
                    582:          break;
                    583: 
                    584:        case Bgeq:
                    585:          v1 = POP;
                    586:          TOP = Fgeq (TOP, v1);
                    587:          break;
                    588: 
                    589:        case Bdiff:
                    590:          DISCARD(1);
                    591:          TOP = Fminus (2, &TOP);
                    592:          break;
                    593: 
                    594:        case Bnegate:
                    595:          v1 = TOP;
                    596:          if (XTYPE (v1) == Lisp_Int)
                    597:            {
                    598:              XSETINT (v1, - XINT (v1));
                    599:              TOP = v1;
                    600:            }
                    601:          else
                    602:            TOP = Fminus (1, &TOP);
                    603:          break;
                    604: 
                    605:        case Bplus:
                    606:          DISCARD(1);
                    607:          TOP = Fplus (2, &TOP);
                    608:          break;
                    609: 
                    610:        case Bmax:
                    611:          DISCARD(1);
                    612:          TOP = Fmax (2, &TOP);
                    613:          break;
                    614: 
                    615:        case Bmin:
                    616:          DISCARD(1);
                    617:          TOP = Fmin (2, &TOP);
                    618:          break;
                    619: 
                    620:        case Bpoint:
                    621:          XFASTINT (v1) = point;
                    622:          PUSH (v1);
                    623:          break;
                    624: 
                    625:        case Bmark:             /* this loser is no longer generated as of v18 */
                    626:          PUSH (Fmarker_position (current_buffer->mark));
                    627:          break;
                    628: 
                    629:        case Bgoto_char:
                    630:          TOP = Fgoto_char (TOP);
                    631:          break;
                    632: 
                    633:        case Binsert:
                    634:          TOP = Finsert (1, &TOP);
                    635:          break;
                    636: 
                    637:        case Bpoint_max:
                    638:          XFASTINT (v1) = ZV;
                    639:          PUSH (v1);
                    640:          break;
                    641: 
                    642:        case Bpoint_min:
                    643:          XFASTINT (v1) = BEGV;
                    644:          PUSH (v1);
                    645:          break;
                    646: 
                    647:        case Bchar_after:
                    648:          TOP = Fchar_after (TOP);
                    649:          break;
                    650: 
                    651:        case Bfollowing_char:
                    652:          XFASTINT (v1) = PT == ZV ? 0 : FETCH_CHAR (point);
                    653:          PUSH (v1);
                    654:          break;
                    655: 
                    656:        case Bpreceding_char:
                    657:          XFASTINT (v1) = point == BEGV ? 0 : FETCH_CHAR (point - 1);
                    658:          PUSH (v1);
                    659:          break;
                    660: 
                    661:        case Bcurrent_column:
                    662:          XFASTINT (v1) = current_column ();
                    663:          PUSH (v1);
                    664:          break;
                    665: 
                    666:        case Bindent_to:
                    667:          TOP = Findent_to (TOP, Qnil);
                    668:          break;
                    669: 
                    670:        case Bscan_buffer:
                    671:          /* Get an appropriate error.  */
                    672:          Fsymbol_function (intern ("scan-buffer"));
                    673:          break;
                    674: 
                    675:        case Beolp:
                    676:          PUSH (Feolp ());
                    677:          break;
                    678: 
                    679:        case Beobp:
                    680:          PUSH (Feobp ());
                    681:          break;
                    682: 
                    683:        case Bbolp:
                    684:          PUSH (Fbolp ());
                    685:          break;
                    686: 
                    687:        case Bbobp:
                    688:          PUSH (Fbobp ());
                    689:          break;
                    690: 
                    691:        case Bcurrent_buffer:
                    692:          PUSH (Fcurrent_buffer ());
                    693:          break;
                    694: 
                    695:        case Bset_buffer:
                    696:          TOP = Fset_buffer (TOP);
                    697:          break;
                    698: 
                    699:        case Bread_char:
                    700:          PUSH (Fread_char ());
                    701:          QUIT;
                    702:          break;
                    703: 
                    704:        case Bset_mark:         /* this loser is no longer generated as of v18 */
                    705:          /* TOP = Fset_mark (TOP); */
                    706:          TOP = Fset_marker (current_buffer->mark, TOP, Fcurrent_buffer ());
                    707:          break;
                    708: 
                    709:        case Binteractive_p:
                    710:          PUSH (Finteractive_p ());
                    711:          break;
                    712: 
                    713:        default:
                    714:          if ((op -= Bconstant) < (unsigned)CONSTANTLIM)
                    715:            PUSH (vectorp[op]);
                    716:        }
                    717:     }
                    718: 
                    719:  exit:
                    720:   UNGCPRO;
                    721:   /* Binds and unbinds are supposed to be compiled balanced.  */
                    722:   if (specpdl_ptr - specpdl != count)
                    723:     abort ();
                    724:   return v1;
                    725: }
                    726: 
                    727: syms_of_bytecode ()
                    728: {
                    729:   Qbytecode = intern ("byte-code");
                    730:   staticpro (&Qbytecode);
                    731: 
                    732:   defsubr (&Sbyte_code);
                    733: }
                    734: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.