📄 interpre.c
字号:
case stoulong: stoTYPE(ulval); break; case rvalulong: rvalTYPE(ulval); break; case pushulong: pushTYPE(ulval); break; case negulong: negTYPE(ulval); break; case addulong: addTYPE(ulval); break; case subulong: subTYPE(ulval); break; case divulong: divTYPE(ulval); break; case multulong: multTYPE(ulval); break; case modulong: modTYPE(ulval); break; case lshtulong: lshtTYPE(ulval); break; case rshtulong: rshtTYPE(ulval); break; case ltulong: ltTYPE(ulval); break; case leulong: leTYPE(ulval); break; case equlong: eqTYPE(ulval); break; case neulong: neTYPE(ulval); break; case gtulong: gtTYPE(ulval); break; case geulong: geTYPE(ulval); break; case lorulong: lorTYPE(ulval); break; case notulong: notTYPE(ulval); break; case borulong: borTYPE(ulval); break; case xorulong: xorTYPE(ulval); break; case andulong: andTYPE(ulval); break; case compulong: compTYPE(ulval); break; case ulong2double: castTYPES(ulval, dval, double); break; case ulong2ptr: castTYPES(ulval, p.p, void *); break; case ulong2int: castTYPES(ulval, ival, int); break; case ulong2llong: castTYPES(ulval, llval, eic_llong); break; /* specific long long stuff */ case incllong: STK[ToP].v.llval += InSt[p].val.ival; break; case decllong: STK[ToP].v.llval -= InSt[p].val.ival; break; case drefllong: drefTYPE(eic_llong, llval); break; case refllong: refTYPE(eic_llong, llval); break; case stollong: stoTYPE(llval); break; case rvalllong: rvalTYPE(llval); break; case pushllong: pushTYPE(llval); break; case negllong: negTYPE(llval); break; case addllong: addTYPE(llval); break; case subllong: subTYPE(llval); break; case divllong: divTYPE(llval); break; case multllong: multTYPE(llval); break; case modllong: modTYPE(llval); break; case lshtllong: lshtTYPE(llval); break; case rshtllong: rshtTYPE(llval); break; case ltllong: ltTYPE(llval); break; case lellong: leTYPE(llval); break; case eqllong: eqTYPE(llval); break; case nellong: neTYPE(llval); break; case gtllong: gtTYPE(llval); break; case gellong: geTYPE(llval); break; case lorllong: lorTYPE(llval); break; case landllong: landTYPE(llval); break; case notllong: notTYPE(llval); break; case borllong: borTYPE(llval); break; case xorllong: xorTYPE(llval); break; case andllong: andTYPE(llval); break; case compllong: compTYPE(llval); break; case llong2double: castTYPES(llval, dval, double); break; case llong2ptr: castTYPES(llval, p.p, void *); break; case llong2int: castTYPES(llval, ival, int); break; case llong2long: castTYPES(llval, lval, long); break; /* specific double stuff */ case incdouble:STK[ToP].v.dval += InSt[p].val.ival; break; case decdouble:STK[ToP].v.dval -= InSt[p].val.ival; break; case drefdouble: drefTYPE(double, dval); break; case refdouble: refTYPE(double, dval); break; case stodouble: stoTYPE(dval); break; case rvaldouble: rvalTYPE(dval); break; case pushdouble: pushTYPE(dval); break; case negdouble: negTYPE(dval); break; case adddouble: addTYPE(dval); break; case subdouble: subTYPE(dval); break; case divdouble: divTYPE(dval); break; case multdouble: multTYPE(dval); break; case ltdouble: ltTYPE(dval); break; case ledouble: leTYPE(dval); break; case eqdouble: eqTYPE(dval); break; case nedouble: neTYPE(dval); break; case gtdouble: gtTYPE(dval); break; case gedouble: geTYPE(dval); break; case lordouble: lorTYPE(dval); break; case landdouble: landTYPE(dval); break; case notdouble: notTYPE(dval); break; case double2int: castTYPES(dval, uival, unsigned int); break; case double2long: castTYPES(dval, ulval, unsigned long); break; case double2llong: castTYPES(dval, llval, eic_llong); break; case double2float: castTYPES(dval, fval, float); break; /*specific pointer stuff */ case incptr: STK[ToP].v.p.p = (char *) STK[ToP].v.p.p + InSt[p].val.ival; break; case decptr: STK[ToP].v.p.p = (char *) STK[ToP].v.p.p - InSt[p].val.ival; break; case lda:#if 0 STK[ToP].v.p = AR[1][InSt[p].val.ival].v.p; STK[ToP].v.p.p = (char*)STK[ToP].v.p.sp + InSt[p].ext; STK[ToP].v.p.sp = STK[ToP].v.p.p;#else { ptr_t *q = &AR[1][InSt[p].val.ival].v.p; ptr_t *a = &STK[ToP].v.p; a->p = a->sp = (char*)q->sp + InSt[p].ext; a->ep = q->ep; if(vp) { /* patch previous lda assignment */ ((ptr_t*)vp)->ep = (char*)a->p; } /* Take advantage of the fact that the next InSt * has the location of where `a' is to be stored. */ vp = &AR[1][InSt[p+1].val.ival].v.p; } #endif break; case ixa: ToP--; STK[ToP].v.p.p = (char *) STK[ToP].v.p.p + STK[ToP+1].v.ival*InSt[p].val.ival; break; case addptr2int: ToP--; STK[ToP].v.p.p = (char *) STK[ToP].v.p.p + STK[ToP + 1].v.ival; break; case addint2ptr: ToP--; STK[ToP].v.p.p = STK[ToP].v.ival + (char *) STK[ToP+1].v.p.p; break; case subptrint: ToP--; STK[ToP].v.p.p = (char *) STK[ToP].v.p.p - STK[ToP + 1].v.ival; break; case subptr: ToP--; STK[ToP].v.ival = (int) ((long) STK[ToP].v.p.p - (long) STK[ToP+1].v.p.p); break; case drefptr: drefTYPE(ptr_t, p); break; case drefuptr: drefTYPE(void**,p.p); STK[ToP].v.p.sp = 0; STK[ToP].v.p.ep = (void *) ULONG_MAX; break; case refptr: refTYPE(ptr_t, p); break; case refuptr: refTYPE(void *, p.p); break; case stoptr: stoTYPE(p); break; case stouptr: stoTYPE(p.p); break; case rvalptr: rvalTYPE(p); break; case rvaluptr: rvalTYPE(p); STK[ToP].v.p.sp = 0; STK[ToP].v.p.ep = (void*) ULONG_MAX; /* set to a very high value */ break; case pushptr: pushTYPE(p); break; case ltptr: ltTYPE(p.p); break; case leptr: leTYPE(p.p); break; case eqptr: eqTYPE(p.p); break; case neptr: neTYPE(p.p); break; case gtptr: gtTYPE(p.p); break; case geptr: geTYPE(p.p); break; case lorptr: lorTYPE(p.p); break; case landptr: landTYPE(p.p); break; case notptr: notTYPE(p.p); break; case ptr2int: castTYPES(p.p, ival, int); break; case ptr2long: castTYPES(p.p, lval, long); break; case lval: /* on the fly safe pointer */ STK[ToP].v.p.p = &AR[InSt[p].ext][InSt[p].val.ival].v; STK[ToP].v.p.ep = (char *) STK[ToP].v.p.p + (size_t) InSt[p].val.p.ep; STK[ToP].v.p.sp = STK[ToP].v.p.p; break; case assigntype: assignTYPE; break; case stoval: switch(InSt[p].ext) { case t_char: case t_uchar: STK[ToP].v.cval = STK[ToP].v.ival; break; case t_short: case t_ushort: STK[ToP].v.sval = STK[ToP].v.ival; break; case t_float: STK[ToP].v.fval = STK[ToP].v.dval;/* case t_struct: case t_union: printf("stoVa1l with struct/union\n");*/ } stoVAL; break; case pushval: pushVAL; break; case eiccall: if(!((symentry_t*)STK[ToP - 1].v.p.p)->tag) { AdjustTop(6); STK[ToP + 1].v.ival = p; STK[ToP + 1].type = (void*)EiC_CurrentFile; /* save file */ STK[ToP + 2].v.p.p = InSt; STK[ToP + 3].v.lval = AR[1] - env->LAR; STK[ToP + 4].v.ival = env->lsp - STK[ToP].v.ival; AR[1] = &env->LAR[env->lsp] /* - STK[ToP].v.ival] */ ; code = ! STK[ToP - 1].v.p.p ? NULL : AR[0][((symentry_t *) STK[ToP - 1].v.p.p)->val.ival].v.p.p; if (code == NULL) { if(STK[ToP - 1].v.p.p) { EiC_formatMessage("Link error: undefined function :-> %s\n", ((symentry_t *) STK[ToP - 1].v.p.p)->id); } else EiC_formatMessage("Link error: possible usage of a function pointer" " before assignment.\n"); env->lsp = 0; raise(SIGINT); } EiC_CurrentFile = codeName(code); InSt = code->inst; p = -1; ToP += 5; if(EiC_traceON) lastln = -1; break; } case call: argc = ARGC; hold_AR = AR[2]; hold_AR1 = AR[1]; ARGC = STK[ToP].v.ival; /*AR[2] = &env->LAR[env->lsp - ARGC];*/ AR[2] = &env->LAR[env->lsp]; if(InSt[p].ext) STK[ToP - 1].v = STK[ToP - 1].v.vfunc (); else STK[ToP - 1].v.vfunc(); env->lsp -= STK[ToP].v.ival; ARGC = argc; AR[2] = hold_AR; AR[1] = hold_AR1; ToP--; break; case eicreturn: ToP -= 6; /* over write code pointer */ p = STK[ToP + 2].v.ival; EiC_CurrentFile = (char*)STK[ToP+2].type; InSt = STK[ToP + 3].v.p.p; env->lsp = STK[ToP + 5].v.ival; STK[ToP].v = STK[ToP + 6].v; AR[1] = &env->LAR[STK[ToP + 4].v.ival]; if(EiC_traceON) { EiC_eicpop(&names,&v); EiC_formatMessage("\n[%s] ", (char*)v.p.p); lastln = -1; } break;#if 1 case __eiclongjmp: { _EiC_jmp_buf * reg; reg = (_EiC_jmp_buf *) ((char*)STK[ToP].v.p.p - STK[ToP+1].v.ival); p = reg->p; EiC_CurrentFile = reg->file; InSt = reg->inst; env->lsp = reg->lsp; AR[1] = &env->LAR[reg->offset]; /*reg->ar; */ if(STK[ToP+1].v.ival == 0) STK[reg->top].v.ival = 1; else STK[reg->top].v.ival = STK[ToP+1].v.ival; ToP = reg->top; } break; case __eicsetjmp: { _EiC_jmp_buf * reg; reg = (_EiC_jmp_buf *) STK[ToP].v.p.p; reg->p = p; reg->file = (void*)EiC_CurrentFile; /* save file */ reg->inst = InSt; reg->lsp = env->lsp; reg->offset = AR[1] - env->LAR; reg->ar = AR[1]; reg->top = ToP; STK[ToP].v.ival = 0; } break;#endif case massign: { val_t *v = &AR[InSt[p].ext][InSt[p].val.ival].v; v->p.sp = (void*)xcalloc(STK[ToP].v.ival,1); v->p.ep = (char*)v->p.sp + STK[ToP].v.ival; vp = NULL; } break; case fmem: FMEM; break; case refmem: refMEM; break; case minit: memcpy(STK[ToP].v.p.p,InSt[p].val.p.p, InSt[p].ext); break; case reducear: env->lsp -= InSt[p].val.ival; break; case checkar:{ size_t d; ptrdiff_t d2; d = env->LARsize - env->lsp; if (d < InSt[p].val.ival) { /* printf("expanding AR %d\n",env->LARsize);*/ d2 = (AR[1] - env->LAR); env->LARsize += InSt[p].val.ival - d; env->LAR = (AR_t *) xrealloc(env->LAR, env->LARsize * sizeof(AR_t)); AR[1] = &env->LAR[(size_t) d2]; } if (InSt[p].ext == 0) { env->lsp += InSt[p].val.ival; /*AR[1][0].v.p.p = NULL;*/ } } break; case halt: STK[ToP].type = InSt[p].val.p.p; ON = 0; EiC_STaCK_VaLuE = STK[ToP].v; break; case empty: break; } p++; } end = clock(); if(EiC_traceON) EiC_messageDisplay("\n"); if(EiC_interActive) EiC_showvalue(&STK[ToP]); if (EiC_TIMER) { fprintf(stdout," <time taken>: %g\n", (end-start)/(float)CLOCKS_PER_SEC); } xfree(STK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -