local SExpr gl0MakeLocals(Foam locals, SExpr inits0) { SExpr typedVars, liId, inits = inits0; int i, argc = foamDDeclArgc(locals); Foam *argv = locals->foamDDecl.argv; String id, typeId; assert(foamTag(locals) == FOAM_DDecl); typedVars = sxNil; for (i=0; i<argc; i++) { id = argv[i]->foamDecl.id; liId = gl0Id(FOAM_Loc, i, id); typeId = foamInfo(argv[i]->foamDecl.type).str; typedVars = sxCons(lisp1(liId, gl0typeName(typeId)), typedVars); } if (sxiNull(inits0)) return sxNReverse(typedVars); for(; inits != sxNil; inits = sxCdr(inits)) { liId = sxSecond(sxCar(inits)); /* Nasty ! */ typeId = symString(sxiToSymbol(liId))[0]=='l' ? "Level" : "Env"; typedVars = sxCons(lisp1(liId, gl0typeName(typeId)), typedVars); } return sxNReverse(typedVars); }
local SExpr gliExpr(Foam foam) { SExpr sx = sxNil; switch (foamTag(foam)) { case FOAM_Prog: bugBadCase(FOAM_Prog); break; case FOAM_NOp: case FOAM_Nil: sx = GL_Nil; break; case FOAM_CCall: { sx = gl0ExprOf(GL_CCall, 1, foam); break; } case FOAM_OCall: { sx = gl0OpenCall(foam); break; } case FOAM_BVal: { FoamTag op = foam->foamBVal.builtinTag; sx = gl0ExprOf(foamBValSExpr(op), 1, foam); break; } case FOAM_BCall: { FoamTag op = foam->foamBCall.op; sx = gl0ExprOf(foamBValSExpr(op), 1, foam); break; } case FOAM_PCall: sx = gliPCall(foam); break; case FOAM_If: sx = gliIf(foam); break; case FOAM_Set: sx = gliSet(foam); break; case FOAM_Def: sx = gliDef(foam); break; case FOAM_PushEnv: sx = gliPushEnv(foam); break; case FOAM_PopEnv: sx = GL_Nil; break; case FOAM_EEnv: sx = gliEEnv(foam); break; case FOAM_Seq: sx = gl0ExprOf(GL_Progn, int0, foam); break; case FOAM_Par: case FOAM_Loc: case FOAM_Glo: case FOAM_Const: sx = gliId(foam); break; case FOAM_Lex: sx = gliLex(foam); break; case FOAM_Return: sx = lisp2(GL_ReturnBlock, glvFunName, gliExpr(foam->foamReturn.value)); break; case FOAM_Cast: sx = gliExpr(foam->foamCast.expr); break; case FOAM_Clos: sx = gl0ExprOf(GL_Clos, int0, foam); break; case FOAM_Env: sx = gliEnv(foam); break; case FOAM_EInfo: sx = gliEInfo(foam); break; case FOAM_PRef: sx = gliPRef(foam); break; case FOAM_Arr: sx = gliArr(foam); break; case FOAM_CEnv: sx = gl0ExprOf(GL_ClosEnv, int0, foam); break; case FOAM_CProg: sx = gl0ExprOf(GL_ClosFun, int0, foam); break; case FOAM_Values: if (foamArgc(foam) == 0) sx = sxNil; else sx = gl0ExprOf(GL_Values, int0, foam); break; case FOAM_MFmt: sx = gliExpr(foam->foamMFmt.value); break; case FOAM_EElt: sx = gliEElt(foam); break; case FOAM_Char: /* XXX: Should be fixed elsewhere */ sx = lisp2(GL_The, GL_Char, (foam->foamChar.CharData=='\0') ? GL_NUL : sxiFrChar(foam->foamChar.CharData)); break; case FOAM_Bool: sx = lisp2(GL_The, GL_Bool, (foam->foamBool.BoolData ? GL_T : GL_Nil)); break; case FOAM_Byte: sx = lisp2(GL_The, GL_Byte, sxiFrInteger(foam->foamByte.ByteData)); break; case FOAM_SInt: sx = lisp2(GL_The, GL_SInt, sxiFrInteger(foam->foamSInt.SIntData)); break; case FOAM_HInt: sx = lisp2(GL_The, GL_HInt, sxiFrInteger(foam->foamHInt.HIntData)); break; case FOAM_BInt: sx = lisp2(GL_The, GL_BInt, sxiFrBigInteger(foam->foamBInt.BIntData)); break; case FOAM_SFlo: sx = lisp2(GL_The, GL_SFlo, sxiFrSFloat(foamToSFlo(foam))); break; case FOAM_DFlo: sx = lisp2(GL_The, GL_DFlo, sxiFrDFloat(foamToDFlo(foam))); break; case FOAM_Goto: sx = lisp1(GL_Go, lispId(strPrintf("Lab%d", foam->foamGoto.label))); glvHasGoto = 1; break; case FOAM_Label: sx = lispId(strPrintf("Lab%d", foam->foamGoto.label)); break; case FOAM_Select: sx = gliSelect(foam); break; case FOAM_ANew: sx = gliANew(foam); break; case FOAM_RNew: sx = gliRNew(foam); break; case FOAM_AElt: sx = gliAElt(foam); break; case FOAM_RElt: sx = gliRElt(foam); break; case FOAM_Free: sx = lisp1(GL_FoamFree, gliExpr(foam->foamFree.place)); break; case FOAM_EEnsure: sx = lisp1(GL_FoamEEnsure, gliExpr(foam->foamEEnsure.env)); break; default: printf("unhandled foamTag = %s\n", foamInfo(foamTag(foam)).str); sx = lispId("unhandled!"); break; } return sx; }
void compInfoAudit(void) { #if !defined(NDEBUG) int i; for (i = 0; i < OB_LIMIT; i++) if (obInfo[i].code != i) bug("obInfo is badly initialized at %d.", i); compInfoByteLimit(OB_LIMIT, "OB_LIMIT"); for (i = 0; i < PH_LIMIT; i++) if (phInfo[i].phno != i) bug("phInfo is badly initialized at %d.", i); compInfoByteLimit(PH_LIMIT, "PH_LIMIT"); for (i = TK_START; i < TK_LIMIT; i++) if (tokInfo(i).tag != i) bug("tokInfo is badly initialized at %d.", i); compInfoByteLimit(TK_LIMIT, "TK_LIMIT"); for (i = AB_START; i < AB_LIMIT; i++) if (abInfo(i).tag != i) bug("abInfo is badly initialized at %d.", i); compInfoByteLimit(AB_LIMIT, "AB_LIMIT"); for (i = TF_START; i < TF_LIMIT; i++) if (tformInfo(i).tag != i) bug("tformInfo is badly initialized at %d.", i); compInfoByteLimit(TF_LIMIT, "TF_LIMIT"); for (i = 0; i < SYME_LIMIT; i++) if (symeInfo[i].kind != i) bug("symeInfo is badly initialized at %d.", i); compInfoByteLimit(SYME_LIMIT, "SYME_LIMIT"); for (i = FOAM_START; i < FOAM_LIMIT; i++) if (foamInfo(i).tag != i) bug("foamInfo is badly initialized at %s = %d.", foamStr(i), i); compInfoByteLimit(foamTagLimit(), "foamTagLimit()"); for (i = LIB_NAME_START; i < LIB_NAME_LIMIT; i++) if (libSectInfo(i).tag != i) bug("libSectInfo is badly initialized at %s = %d.", libSectInfo(i).str, i); compInfoByteLimit(LIB_NAME_LIMIT, "LIB_NAME_LIMIT"); for (i = FOAM_BVAL_START; i < FOAM_BVAL_LIMIT; i++) if (foamBValInfo(i).tag != i) bug("foamBValInfo is badly initialized at %s = %d.", foamBValStr(i), i); #if SMALL_BVAL_TAGS compInfoByteLimit(FOAM_BVAL_LIMIT, "FOAM_BVAL_LIMIT"); #endif for (i = FOAM_PROTO_START; i < FOAM_PROTO_LIMIT; i++) if (foamProtoInfo(i).tag != i) bug("foamProtoInfo is badly initialized at %s = %d.", foamProtoStr(i), i); compInfoByteLimit(FOAM_PROTO_LIMIT, "FOAM_PROTO_LIMIT"); for (i = CCO_START; i < CCO_LIMIT; i++) if (ccoInfo(i).tag != i) bug("ccoInfo is badly initialized at %d.", i); compInfoByteLimit(CCO_LIMIT, "CCO_LIMIT"); #endif }