void WhileObject::initialise( shared_ptr<X86Reference> v, bool write ) { ref = v; type = make_shared<X86ConstRef>(getTypeTag(w_type)); if ( write ) { writeMem(); } }
void WhileObject::assignType( shared_ptr<lang::Type> t, bool write ) { if (t->nameStr() == "real") { shared_ptr<X86Register> r = program->getFreeMmxRegister(); r->assign_itof( valueDirect() ); ref = r->ref(); } w_type = t; type = make_shared<X86ConstRef>(getTypeTag(t)); if ( write ) { writeMem(); } }
sExpression *lookupVariable(sSymbol *symbol, sEnvironment *env){ int i = 0; int keySize = strlen(symbol->name) * sizeof(char); TCXSTR *str = getTypeTag(symbol->name); void *result = tcmapget(env->varmap, symbol->name, keySize, &i); if(i == 0){ //fail find if(isNoParent(env)){ return &sNull; }else{ return lookupVariable(symbol, env->parent); } }else{ //success find sType *type = (sType *)tcmapget(env->varmap, tcxstrptr(str), tcxstrsize(str), &i); sExpression *resultExp = newExp(result, *type); return resultExp; } }
static void putVars(sList *parameterNames, sList *arguments, TCMAP *mapdb){ sExpression *firstP = car(parameterNames); sExpression *firstA = car(arguments); char *pName; void *aPointer; void *pPointer; int aSize; int pSize; if(isNull(firstP)){ return; } if(isSymbol(firstP)){ pName = toSymb(firstP)->name; }else{ return; } pPointer = pName; pSize = strlen(pName) * sizeof(char); aPointer = firstA->value; aSize = firstA->valueSize; TCXSTR *str = getTypeTag(pName); tcmapput(mapdb, pPointer, pSize, aPointer, aSize); tcmapput(mapdb, (char *)tcxstrptr(str), tcxstrsize(str), &(firstA->type), sizeof(sType)); sExpression *remainP = cdr(parameterNames); sExpression *remainA = cdr(arguments); if(isList(remainP) && isList(remainA)){ return putVars(toList(remainP), toList(remainA), mapdb); }else if(isSymbol(remainP)){ sList *lastOneParameter = toList(cons(remainP, &sNull)); sList *lastOneArgument = toList(cons(remainA, &sNull)); return putVars(lastOneParameter, lastOneArgument, mapdb); } return; }
shared_ptr<X86Reference> WhileObject::tagRef() { if (space.ref) return space.ref; else return make_shared<X86ConstRef>(getTypeTag(w_type)); }