/* * This program is used to map special classes like integer into * L&O programs * This program is only safe before the first GC */ ptrI defineSpecialProg(const char *name) { #ifdef MEMTRACE extern long gcCount; long gCount = gcCount; #endif insWord proc_seq[] = { // (gVar,_,tVar) :- name%3(gVar,name,tVar) instrhb(mAlit, 2, 0), /* name */ instrhb(lkawl, 3, 1), /* name%3 */ }; ptrI obj = buildCode(proc_seq, 3, NumberOf(proc_seq), 2); ptrI nameEnum = newEnumSym(name); updateCodeLit(codeV(obj), 0, nameEnum); /* name */ ptrI nameProg = newProgLbl(name, 3); /* name%3 */ defineProg(nameProg, obj); updateCodeLit(codeV(obj), 1, nameProg); #ifdef MEMTRACE assert(gcCount == gCount); #endif return obj; }
static ptrI buildCode(insPo cd, uint16 arity, unsigned long cdlen, unsigned long litCnt) { ptrI code = permCode(cdlen, litCnt, NULL); codePo pc = codeV(code); memcpy(pc->data, cd, cdlen * sizeof(insWord)); pc->arity = arity; return code; }
vector<MamaInstruction> TupleNode::codeC(const Environment &e, int sd) const { ENTERED("codeC"); // Slide 99 if (!_compiler.testFlag(Compiler::OptimizeConsNodeClosure)) { return Node::codeC(e, sd); } vector<MI> r(codeV(e, sd)); return r /= "tuple_C"; }