void Scene::trace(Image &img, real x1, real y1, real x2, real y2, int lev) { Vector zAxis = cam.getDirection().normal()*cam.getImagePlaneDistance(); Vector yAxis = cam.getUp().normal(); Vector xAxis = zAxis.cross(yAxis).normal(); real xwidth = (x2-x1)/(img.getWidth()-1); real ywidth = (y2-y1)/(img.getHeight()-1); for (int i = 0;i<img.getWidth(); ++i) { Vector xVect = xAxis*(i*xwidth+x1); for (int j = 0;j<img.getHeight(); ++j) { Ray tempRay = Ray( cam.getLocation(), Vector( xVect + yAxis*((img.getHeight()-j)*ywidth+y1) + zAxis).normal()); img(i,j) = shade(rtrace(tempRay), tempRay, lev); } } }
Color Scene::shade(Intersection isect, Ray r, int level) { if (!isect.hits()) { return bgColor; } real eps; if (r.in()) { eps = 0.00001; } else { eps = -0.00001; } Texture *txt = isect.object()->getTexture(); Point isectPt = r.pointOn(isect.t()); Color curColor(0.0,0.0,0.0); Color specular(0,0,0); Color diffuse(0,0,0); Color shadowAmt(1,1,1); for (LightList::iterator lt_iter = lights.begin(); lt_iter != lights.end(); ++lt_iter) { Vector specL((*lt_iter)->location()-isectPt); Vector specV(cam.getLocation()-isectPt); Vector specHj((specL+specV)*(1.0/((specL+specV).length()))); Ray shade_ray = (*lt_iter)->getRayTo(r.pointOn(isect.t()+ eps)); ++shadow_rays_cast; Intersection tempI = rtrace(shade_ray, true, isect.object()); if (tempI.hits()) { if (level>0) { shadowAmt -= shade(tempI, shade_ray, level-1); } else { shadowAmt = Color(0.0,0.0,0.0); } } specular += (*lt_iter)->intensity()*std::pow(specHj.dot(isect.normal()), txt->n()); diffuse += (*lt_iter)->intensity()*shade_ray.getDir().dot(isect.normal()); } shadowAmt *= 1.0/real(lights.size()); Color reflective(0.0,0.0,0.0,0.0); if ((level>0) && (txt->kr().intensity()>0.01)) { ++reflective_rays_cast; Ray tempRay(r.pointOn(isect.t()+eps), r.getDir() - 2.0 * (r.getDir().dot(isect.normal())) * isect.normal()); reflective = shade(rtrace(tempRay), tempRay, level-1); } Color refractive(0.0,0.0,0.0); if ((level>0) && (txt->kt().intensity()>0.01)) { real eta; if (r.in()) { eta = 1.0/txt->ior(); } else { eta = txt->ior(); } real ci; if (r.in()) { ci = (r.getDir().dot(-1.0*isect.normal())); } else { ci = (r.getDir().dot(isect.normal())); } real costt = 1.0 - (eta*eta) * (1.0-ci*ci); if (costt<0.0) { refractive = Color(0,0,0); } else { ++refractive_rays_cast; Ray tempRay(r.pointOn(isect.t()+eps), ((eta*ci-std::sqrt(costt))*((r.in()?-1.0:1.0)*isect.normal()) - (eta*r.getDir())), !r.in()); refractive = shade(rtrace(tempRay, isect.object()), tempRay, level-1); } } curColor += txt->ka() + (txt->kd()*diffuse + txt->ks()*specular + txt->kr()*reflective + txt->kt()*refractive) * shadowAmt; return curColor.clamp(); }
//int interp(fsig, cargp) //int fsig; //dptr cargp; static int icall(dptr procptr, dptr arglistptr, dptr result) //cs { register word opnd; register word *rsp; register dptr rargp; register struct ef_marker *newefp; register struct gf_marker *newgfp; register word *wd; register word *firstwd, *lastwd; word *oldsp; int type, signal, args; // extern int (*optab[])(); extern int (*optab[])(dptr); //cs // extern int (*keytab[])(); extern int (*keytab[])(dptr); //cs struct b_proc *bproc; word savedlastop = lastop; //cs --- so that Icon::runerr works as expected through ttrace dptr oldxargp = xargp; //cs --- save the arguments passed to the C++ function calling Icon int oldxnargs = xnargs; //cs --- ditto dptr lval; //cs int fsig = 0; //cs dptr cargp = (dptr)(sp+1); //cs dptr return_cargp = cargp; //cs word *saved_sp = sp; //cs word *return_sp = sp + 2; //cs cargp[0] = *procptr; //cs cargp[1] = *arglistptr; //cs sp += 4; //cs //#line 189 "interp.r" if (BlkLoc(k_current) == BlkLoc(k_main) && ((char *)sp + PerilDelta) > (char *)stackend) fatalerr(301, NULL); //#line 195 "interp.r" #if GPX //cs if (!pollctr--) { pollctr = pollevent(); if (pollctr == -1) fatalerr(141, NULL); } #endif //#line 201 "interp.r" ilevel++; rsp = sp;; //#line 215 "interp.r" if (fsig == G_Csusp) { //#line 218 "interp.r" oldsp = rsp; //#line 223 "interp.r" newgfp = (struct gf_marker *)(rsp + 1); newgfp->gf_gentype = fsig; newgfp->gf_gfp = gfp; newgfp->gf_efp = efp; newgfp->gf_ipc = ipc; rsp += ((sizeof(struct gf_smallmarker) + sizeof(word) - 1) / sizeof(word)); //#line 235 "interp.r" if (gfp != 0) { if (gfp->gf_gentype == G_Psusp) firstwd = (word *)gfp + ((sizeof((*gfp)) + sizeof(word) - 1) / sizeof(word)); else firstwd = (word *)gfp + ((sizeof(struct gf_smallmarker) + sizeof(word) - 1) / sizeof(word)); } else firstwd = (word *)efp + ((sizeof((*efp)) + sizeof(word) - 1) / sizeof(word)); lastwd = (word *)cargp + 1; //#line 249 "interp.r" for (wd = firstwd; wd <= lastwd; wd++) *++rsp = *wd; gfp = newgfp; } //#line 257 "interp.r" goto apply; //cs for (; ; ) { //#line 330 "interp.r" lastop = (word)(*ipc.op++); if( rsp < return_sp ) //cs syserror("loadfuncpp: call of Icon from C++ must return a value, yet failed instead"); //#line 348 "interp.r" switch ((int)lastop) { //#line 359 "interp.r" case 51: ipc.op[-1] = (90); PushValSP(rsp, D_Cset); opnd = (*ipc.opnd++); opnd += (word)ipc.opnd; ipc.opnd[-1] = (opnd); PushValSP(rsp, opnd); break; case 90: PushValSP(rsp, D_Cset); PushValSP(rsp, (*ipc.opnd++)); break; case 60: PushValSP(rsp, D_Integer); PushValSP(rsp, (*ipc.opnd++)); break; case 75: ipc.op[-1] = (91); PushValSP(rsp, D_Real); opnd = (*ipc.opnd++); opnd += (word)ipc.opnd; PushValSP(rsp, opnd); ipc.opnd[-1] = (opnd); break; case 91: PushValSP(rsp, D_Real); PushValSP(rsp, (*ipc.opnd++)); break; case 77: ipc.op[-1] = (92); PushValSP(rsp, (*ipc.opnd++)); opnd = (word)strcons + (*ipc.opnd++); ipc.opnd[-1] = (opnd); PushValSP(rsp, opnd); break; case 92: PushValSP(rsp, (*ipc.opnd++)); PushValSP(rsp, (*ipc.opnd++)); break; //#line 407 "interp.r" case 81: PushValSP(rsp, D_Var); PushValSP(rsp, &glbl_argp[(*ipc.opnd++) + 1]); break; case 84: ipc.op[-1] = (93); PushValSP(rsp, D_Var); opnd = (*ipc.opnd++); PushValSP(rsp, &globals[opnd]); ipc.opnd[-1] = ((word)&globals[opnd]); break; case 93: PushValSP(rsp, D_Var); PushValSP(rsp, (*ipc.opnd++)); break; case 83: PushValSP(rsp, D_Var); PushValSP(rsp, &pfp->pf_locals[(*ipc.opnd++)]); break; case 82: ipc.op[-1] = (94); PushValSP(rsp, D_Var); opnd = (*ipc.opnd++); PushValSP(rsp, &statics[opnd]); ipc.opnd[-1] = ((word)&statics[opnd]); break; case 94: PushValSP(rsp, D_Var); PushValSP(rsp, (*ipc.opnd++)); break; //#line 448 "interp.r" case 4: case 19: case 23: case 34: case 37: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 1; xargp = rargp; sp = rsp;; //#line 453 "interp.r" ; Deref(rargp[1]); //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 455 "interp.r" ; case 43: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 1; xargp = rargp; sp = rsp;; //#line 458 "interp.r" ; Deref(rargp[1]); //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 460 "interp.r" ; case 21: case 22: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 1; xargp = rargp; sp = rsp;; //#line 464 "interp.r" ; //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 465 "interp.r" ; case 32: PushNullSP(rsp); //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 474 "interp.r" case 40: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 1; xargp = rargp; sp = rsp;; //#line 475 "interp.r" ; Deref(rargp[1]); //#line 105 "interp.r" signal = (*(optab[lastop]))(rargp); goto C_rtn_term; //#line 477 "interp.r" ; case 2: PushNullSP(rsp); //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 481 "interp.r" ; //#line 105 "interp.r" signal = (*(optab[lastop]))(rargp); goto C_rtn_term; //#line 482 "interp.r" ; //#line 486 "interp.r" case 3: case 5: case 6: case 8: case 9: case 16: case 17: case 18: case 31: case 42: case 30: case 7: case 10: case 11: case 12: case 13: case 14: case 15: case 20: case 24: case 25: case 26: case 27: case 29: case 28: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 511 "interp.r" ; Deref(rargp[1]); Deref(rargp[2]); //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 514 "interp.r" ; case 1: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 517 "interp.r" ; //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 518 "interp.r" ; case 39: PushNullSP(rsp); //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 3; xargp = rargp; sp = rsp;; //#line 522 "interp.r" ; //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 523 "interp.r" ; case 38: PushNullSP(rsp); //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 3; xargp = rargp; sp = rsp;; //#line 527 "interp.r" ; //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 528 "interp.r" ; //#line 531 "interp.r" case 33: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 532 "interp.r" ; //#line 105 "interp.r" signal = (*(optab[lastop]))(rargp); goto C_rtn_term; //#line 533 "interp.r" ; case 35: PushNullSP(rsp); //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 3; xargp = rargp; sp = rsp;; //#line 537 "interp.r" ; //#line 105 "interp.r" signal = (*(optab[lastop]))(rargp); goto C_rtn_term; //#line 538 "interp.r" ; //#line 542 "interp.r" case 36: PushNullSP(rsp); //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 4; xargp = rargp; sp = rsp;; //#line 544 "interp.r" ; //#line 85 "interp.r" if ((*(optab[lastop]))(rargp) == A_Resume) { //#line 89 "interp.r" goto efail_noev; } rsp = (word *)rargp + 1; //#line 95 "interp.r" break; //#line 545 "interp.r" ; //#line 548 "interp.r" case 41: //#line 65 "interp.r" rargp = (dptr)(rsp - 1) - 3; xargp = rargp; sp = rsp;; //#line 549 "interp.r" ; Deref(rargp[1]); Deref(rargp[2]); Deref(rargp[3]); //#line 105 "interp.r" signal = (*(optab[lastop]))(rargp); goto C_rtn_term; //#line 553 "interp.r" ; case 98: //#line 559 "interp.r" #if GPX //cs if (!pollctr--) { sp = rsp;; pollctr = pollevent(); rsp = sp;; if (pollctr == -1) fatalerr(141, NULL); } #endif //#line 570 "interp.r" break; //#line 573 "interp.r" case 108: { //#line 583 "interp.r" break; } case 64: //#line 590 "interp.r" #if GPX //cs if (!pollctr--) { sp = rsp;; pollctr = pollevent(); rsp = sp;; if (pollctr == -1) fatalerr(141, NULL); } #endif //#line 606 "interp.r" break; //#line 610 "interp.r" case 44: PushDescSP(rsp, k_subject); PushValSP(rsp, D_Integer); PushValSP(rsp, k_pos); //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 614 "interp.r" ; signal = Obscan(2, rargp); goto C_rtn_term; case 55: //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - 1; xargp = rargp; sp = rsp;; //#line 621 "interp.r" ; signal = Oescan(1, rargp); goto C_rtn_term; //#line 629 "interp.r" case 89: { apply: //cs union block *bp; int i, j; value_tmp = *(dptr)(rsp - 1); Deref(value_tmp); switch (Type(value_tmp)) { case T_List: { rsp -= 2; bp = BlkLoc(value_tmp); args = (int)bp->list.size; //#line 647 "interp.r" if (BlkLoc(k_current) == BlkLoc(k_main) && ((char *)sp + args * sizeof(struct descrip) > (char *)stackend)) fatalerr(301, NULL); //#line 653 "interp.r" for (bp = bp->list.listhead; //#line 657 "interp.r" bp != NULL; bp = bp->lelem.listnext) { for (i = 0; i < bp->lelem.nused; i++) { j = bp->lelem.first + i; if (j >= bp->lelem.nslots) j -= bp->lelem.nslots; PushDescSP(rsp, bp->lelem.lslots[j]); } } goto invokej; } case T_Record: { rsp -= 2; bp = BlkLoc(value_tmp); args = bp->record.recdesc->proc.nfields; for (i = 0; i < args; i++) { PushDescSP(rsp, bp->record.fields[i]); } goto invokej; } default: { xargp = (dptr)(rsp - 3); err_msg(126, &value_tmp); goto efail; } } } case 61: { args = (int)(*ipc.opnd++); invokej: { int nargs; dptr carg; sp = rsp;; type = invoke(args, &carg, &nargs); rsp = sp;; if (type == I_Fail) goto efail_noev; if (type == I_Continue) break; else { rargp = carg; //#line 712 "interp.r" #if GPX //cs pollctr >>= 1; if (!pollctr) { sp = rsp;; pollctr = pollevent(); rsp = sp;; if (pollctr == -1) fatalerr(141, NULL); } #endif //#line 726 "interp.r" bproc = (struct b_proc *)BlkLoc(*rargp); //#line 734 "interp.r" if (type == I_Vararg) { // int (*bfunc)(); int (*bfunc)(int, dptr); //cs // bfunc = bproc->entryp.ccode; bfunc = (int (*)(int,dptr))(bproc->entryp.ccode); //#line 741 "interp.r" signal = (*bfunc)(nargs, rargp); } else //#line 746 "interp.r" { // int (*bfunc)(); int (*bfunc)(dptr); // bfunc = bproc->entryp.ccode; bfunc = (int (*)(dptr))(bproc->entryp.ccode); //#line 753 "interp.r" signal = (*bfunc)(rargp); } //#line 767 "interp.r" goto C_rtn_term; } } } case 62: PushNullSP(rsp); opnd = (*ipc.opnd++); //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - 0; xargp = rargp; sp = rsp;; //#line 776 "interp.r" ; signal = (*(keytab[(int)opnd]))(rargp); goto C_rtn_term; case 65: opnd = (*ipc.opnd++); //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - opnd; xargp = rargp; sp = rsp;; //#line 793 "interp.r" ; //#line 796 "interp.r" { int i; for (i = 1; i <= opnd; i++) Deref(rargp[i]); } signal = Ollist((int)opnd, rargp); goto C_rtn_term; //#line 808 "interp.r" case 67: ipc.op[-1] = (96); opnd = (*ipc.opnd++); opnd += (word)ipc.opnd; ipc.opnd[-1] = (opnd); newefp = (struct ef_marker *)(rsp + 1); newefp->ef_failure.opnd = (word *)opnd; goto mark; case 96: newefp = (struct ef_marker *)(rsp + 1); newefp->ef_failure.opnd = (word *)(*ipc.opnd++); mark: newefp->ef_gfp = gfp; newefp->ef_efp = efp; newefp->ef_ilevel = ilevel; rsp += ((sizeof((*efp)) + sizeof(word) - 1) / sizeof(word)); efp = newefp; gfp = 0; break; case 85: mark0: newefp = (struct ef_marker *)(rsp + 1); newefp->ef_failure.opnd = 0; newefp->ef_gfp = gfp; newefp->ef_efp = efp; newefp->ef_ilevel = ilevel; rsp += ((sizeof((*efp)) + sizeof(word) - 1) / sizeof(word)); efp = newefp; gfp = 0; break; case 78: //#line 849 "interp.r" gfp = efp->ef_gfp; rsp = (word *)efp - 1; //#line 855 "interp.r" Unmark_uw: if (efp->ef_ilevel < ilevel) { --ilevel; sp = rsp;; //#line 866 "interp.r" return A_Unmark_uw; } efp = efp->ef_efp; break; //#line 874 "interp.r" case 56: { //#line 879 "interp.r" oldsp = rsp; newgfp = (struct gf_marker *)(rsp + 1); newgfp->gf_gentype = G_Esusp; newgfp->gf_gfp = gfp; newgfp->gf_efp = efp; newgfp->gf_ipc = ipc; gfp = newgfp; rsp += ((sizeof(struct gf_smallmarker) + sizeof(word) - 1) / sizeof(word)); //#line 892 "interp.r" if (efp->ef_gfp != 0) { newgfp = (struct gf_marker *)(efp->ef_gfp); if (newgfp->gf_gentype == G_Psusp) firstwd = (word *)efp->ef_gfp + ((sizeof((*gfp)) + sizeof(word) - 1) / sizeof(word)); else firstwd = (word *)efp->ef_gfp + ((sizeof(struct gf_smallmarker) + sizeof(word) - 1) / sizeof(word)); } else firstwd = (word *)efp->ef_efp + ((sizeof((*efp)) + sizeof(word) - 1) / sizeof(word)); lastwd = (word *)efp - 1; efp = efp->ef_efp; //#line 909 "interp.r" for (wd = firstwd; wd <= lastwd; wd++) *++rsp = *wd; PushValSP(rsp, oldsp[-1]); PushValSP(rsp, oldsp[0]); break; } case 66: { struct descrip sval; //#line 924 "interp.r" // dptr lval = (dptr)((word *)efp - 2); lval = (dptr)((word *)efp - 2); //cs //#line 929 "interp.r" if (--IntVal(*lval) > 0) { //#line 934 "interp.r" sval = *(dptr)(rsp - 1); //#line 941 "interp.r" if (efp->ef_gfp != 0) { newgfp = (struct gf_marker *)(efp->ef_gfp); if (newgfp->gf_gentype == G_Psusp) firstwd = (word *)efp->ef_gfp + ((sizeof((*gfp)) + sizeof(word) - 1) / sizeof(word)); else firstwd = (word *)efp->ef_gfp + ((sizeof(struct gf_smallmarker) + sizeof(word) - 1) / sizeof(word)); } else firstwd = (word *)efp->ef_efp + ((sizeof((*efp)) + sizeof(word) - 1) / sizeof(word)); lastwd = (word *)efp - 3; if (gfp == 0) gfp = efp->ef_gfp; efp = efp->ef_efp; //#line 960 "interp.r" rsp -= 2; for (wd = firstwd; wd <= lastwd; wd++) *++rsp = *wd; PushDescSP(rsp, sval); } else { //#line 973 "interp.r" *lval = *(dptr)(rsp - 1); //#line 981 "interp.r" gfp = efp->ef_gfp; //#line 987 "interp.r" Lsusp_uw: if (efp->ef_ilevel < ilevel) { --ilevel; sp = rsp;; //#line 997 "interp.r" return A_Lsusp_uw; } rsp = (word *)efp - 1; efp = efp->ef_efp; } break; } case 72: { //#line 1015 "interp.r" struct descrip tmp; dptr svalp; struct b_proc *sproc; //#line 1025 "interp.r" svalp = (dptr)(rsp - 1); if (Var(*svalp)) { sp = rsp;; retderef(svalp, (word *)glbl_argp, sp); rsp = sp;; } //#line 1035 "interp.r" oldsp = rsp; newgfp = (struct gf_marker *)(rsp + 1); newgfp->gf_gentype = G_Psusp; newgfp->gf_gfp = gfp; newgfp->gf_efp = efp; newgfp->gf_ipc = ipc; newgfp->gf_argp = glbl_argp; newgfp->gf_pfp = pfp; gfp = newgfp; rsp += ((sizeof((*gfp)) + sizeof(word) - 1) / sizeof(word)); //#line 1051 "interp.r" if (pfp->pf_gfp != 0) { newgfp = (struct gf_marker *)(pfp->pf_gfp); if (newgfp->gf_gentype == G_Psusp) firstwd = (word *)pfp->pf_gfp + ((sizeof((*gfp)) + sizeof(word) - 1) / sizeof(word)); else firstwd = (word *)pfp->pf_gfp + ((sizeof(struct gf_smallmarker) + sizeof(word) - 1) / sizeof(word)); } else firstwd = (word *)pfp->pf_efp + ((sizeof((*efp)) + sizeof(word) - 1) / sizeof(word)); lastwd = (word *)glbl_argp - 1; efp = efp->ef_efp; //#line 1068 "interp.r" for (wd = firstwd; wd <= lastwd; wd++) *++rsp = *wd; PushValSP(rsp, oldsp[-1]); PushValSP(rsp, oldsp[0]); --k_level; if (k_trace) { k_trace--; sproc = (struct b_proc *)BlkLoc(*glbl_argp); strace(&(sproc->pname), svalp); } //#line 1083 "interp.r" if (pfp->pf_scan != NULL) { //#line 1089 "interp.r" tmp = k_subject; k_subject = *pfp->pf_scan; *pfp->pf_scan = tmp; tmp = *(pfp->pf_scan + 1); IntVal(*(pfp->pf_scan + 1)) = k_pos; k_pos = IntVal(tmp); } //#line 1106 "interp.r" efp = pfp->pf_efp; ipc = pfp->pf_ipc; glbl_argp = pfp->pf_argp; pfp = pfp->pf_pfp; break; } //#line 1115 "interp.r" case 54: { //#line 1124 "interp.r" eret_tmp = *(dptr)&rsp[-1]; gfp = efp->ef_gfp; Eret_uw: //#line 1131 "interp.r" if (efp->ef_ilevel < ilevel) { --ilevel; sp = rsp;; //#line 1140 "interp.r" return A_Eret_uw; } rsp = (word *)efp - 1; efp = efp->ef_efp; PushDescSP(rsp, eret_tmp); break; } //#line 1149 "interp.r" case 71: { //#line 1163 "interp.r" struct b_proc *rproc; rproc = (struct b_proc *)BlkLoc(*glbl_argp); //#line 1173 "interp.r" *glbl_argp = *(dptr)(rsp - 1); if (Var(*glbl_argp)) { sp = rsp;; retderef(glbl_argp, (word *)glbl_argp, sp); rsp = sp;; } --k_level; if (k_trace) { k_trace--; rtrace(&(rproc->pname), glbl_argp); } Pret_uw: if (pfp->pf_ilevel < ilevel) { --ilevel; sp = rsp;; //#line 1196 "interp.r" return A_Pret_uw; } //#line 1203 "interp.r" rsp = (word *)glbl_argp + 1; efp = pfp->pf_efp; gfp = pfp->pf_gfp; ipc = pfp->pf_ipc; glbl_argp = pfp->pf_argp; pfp = pfp->pf_pfp; //#line 1219 "interp.r" //cs return to C++ if( rsp == return_sp ) { --ilevel; *result = *return_cargp; sp = saved_sp; lastop = savedlastop; xargp = oldxargp; xnargs = oldxnargs; return 0; } //cs end return to C++ break; } //#line 1224 "interp.r" case 53: efail: //#line 1229 "interp.r" efail_noev: //#line 1233 "interp.r" if (gfp == 0) { //#line 1251 "interp.r" ipc = efp->ef_failure; gfp = efp->ef_gfp; rsp = (word *)efp - 1; efp = efp->ef_efp; if (ipc.op == 0) goto efail; break; } else { //#line 1267 "interp.r" struct descrip tmp; register struct gf_marker *resgfp = gfp; type = (int)resgfp->gf_gentype; if (type == G_Psusp) { glbl_argp = resgfp->gf_argp; if (k_trace) { k_trace--; sp = rsp;; atrace(&(((struct b_proc *)BlkLoc(*glbl_argp))->pname)); rsp = sp;; } } ipc = resgfp->gf_ipc; efp = resgfp->gf_efp; gfp = resgfp->gf_gfp; rsp = (word *)resgfp - 1; if (type == G_Psusp) { pfp = resgfp->gf_pfp; //#line 1292 "interp.r" if (pfp->pf_scan != NULL) { tmp = k_subject; k_subject = *pfp->pf_scan; *pfp->pf_scan = tmp; tmp = *(pfp->pf_scan + 1); IntVal(*(pfp->pf_scan + 1)) = k_pos; k_pos = IntVal(tmp); } //#line 1313 "interp.r" ++k_level; } switch (type) { //#line 1336 "interp.r" case G_Csusp: ; --ilevel; sp = rsp;; //#line 1344 "interp.r" return A_Resume; case G_Esusp: ; goto efail_noev; case G_Psusp: ; break; } break; } case 68: { //#line 1374 "interp.r" --k_level; if (k_trace) { k_trace--; failtrace(&(((struct b_proc *)BlkLoc(*glbl_argp))->pname)); } Pfail_uw: if (pfp->pf_ilevel < ilevel) { --ilevel; sp = rsp;; //#line 1388 "interp.r" return A_Pfail_uw; } efp = pfp->pf_efp; gfp = pfp->pf_gfp; ipc = pfp->pf_ipc; glbl_argp = pfp->pf_argp; pfp = pfp->pf_pfp; //#line 1406 "interp.r" goto efail_noev; } //#line 1410 "interp.r" case 45: PushNullSP(rsp); PushValSP(rsp, ((word *)efp)[-2]); PushValSP(rsp, ((word *)efp)[-1]); break; case 46: opnd = (*ipc.opnd++); opnd += (word)ipc.opnd; efp->ef_failure.opnd = (word *)opnd; break; case 52: PushNullSP(rsp); rsp[1] = rsp[-3]; rsp[2] = rsp[-2]; rsp += 2; break; case 57: PushValSP(rsp, D_Integer); PushValSP(rsp, (*ipc.opnd++)); //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - 2; xargp = rargp; sp = rsp;; //#line 1432 "interp.r" ; signal = Ofield(2, rargp); goto C_rtn_term; case 58: ipc.op[-1] = (95); opnd = (*ipc.opnd++); opnd += (word)ipc.opnd; ipc.opnd[-1] = (opnd); ipc.opnd = (word *)opnd; break; case 95: opnd = (*ipc.opnd++); ipc.opnd = (word *)opnd; break; case 59: *--ipc.op = 58; opnd = sizeof((*ipc.op)) + sizeof((*rsp)); opnd += (word)ipc.opnd; ipc.opnd = (word *)opnd; break; case 63: //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - 0; xargp = rargp; sp = rsp;; //#line 1459 "interp.r" ; if (Olimit(0, rargp) == A_Resume) { //#line 1468 "interp.r" goto efail_noev; } else { //#line 1476 "interp.r" rsp = (word *)rargp + 1; } goto mark0; //#line 1486 "interp.r" case 69: PushNullSP(rsp); break; case 70: rsp -= 2; break; case 73: PushValSP(rsp, D_Integer); PushValSP(rsp, 1); break; case 74: PushValSP(rsp, D_Integer); PushValSP(rsp, -1); break; case 76: rsp += 2; rsp[-1] = rsp[-3]; rsp[0] = rsp[-2]; break; //#line 1512 "interp.r" case 50: //#line 1515 "interp.r" PushNullSP(rsp); //#line 79 "interp.r" rargp = (dptr)(rsp - 1) - 0; xargp = rargp; sp = rsp;; //#line 1516 "interp.r" ; opnd = (*ipc.opnd++); opnd += (word)ipc.opnd; signal = Ocreate((word *)opnd, rargp); goto C_rtn_term; //#line 1528 "interp.r" case 47: { //#line 1534 "interp.r" struct b_coexpr *ncp; dptr dp; sp = rsp;; dp = (dptr)(sp - 1); xargp = dp - 2; Deref(*dp); if (dp->dword != D_Coexpr) { err_msg(118, dp); goto efail; } ncp = (struct b_coexpr *)BlkLoc(*dp); signal = activate((dptr)(sp - 3), ncp, (dptr)(sp - 3)); rsp = sp;; if (signal == A_Resume) goto efail_noev; else rsp -= 2; break; } case 49: { //#line 1564 "interp.r" struct b_coexpr *ncp; sp = rsp;; ncp = popact((struct b_coexpr *)BlkLoc(k_current)); ++BlkLoc(k_current)->coexpr.size; co_chng(ncp, (dptr)&sp[-1], NULL, A_Coret, 1); rsp = sp;; break; } //#line 1577 "interp.r" case 48: { //#line 1582 "interp.r" struct b_coexpr *ncp; sp = rsp;; ncp = popact((struct b_coexpr *)BlkLoc(k_current)); co_chng(ncp, NULL, NULL, A_Cofail, 1); rsp = sp;; break; } case 86: //#line 1596 "interp.r" goto interp_quit; //#line 1599 "interp.r" default: { char buf[50]; sprintf(buf, "unimplemented opcode: %ld (0x%08x)\n", (long)lastop, lastop); syserr(buf); } } continue; C_rtn_term: rsp = sp;; switch (signal) { case A_Resume: //#line 1622 "interp.r" goto efail_noev; case A_Unmark_uw: //#line 1631 "interp.r" goto Unmark_uw; case A_Lsusp_uw: //#line 1640 "interp.r" goto Lsusp_uw; case A_Eret_uw: //#line 1649 "interp.r" goto Eret_uw; case A_Pret_uw: //#line 1658 "interp.r" goto Pret_uw; case A_Pfail_uw: //#line 1667 "interp.r" goto Pfail_uw; } rsp = (word *)rargp + 1; //#line 1682 "interp.r" continue; } interp_quit: --ilevel; if (ilevel != 0) syserror("interp: termination with inactive generators."); return 0; }