static void redefine(any ex, any s, any x) { NeedSym(ex,s); CheckVar(ex,s); if (!isNil(val(s)) && s != val(s) && !equal(x,val(s))) redefMsg(s, NULL); val(s) = x; putSrc(s, NULL); }
void DataStmtEngine::CreateArrayElementExprInitializer(ArrayElementExpr *E, Expr *Parent) { auto Target = dyn_cast<VarExpr>(E->getTarget()); if(!Target) return VisitExpr(E); if(CheckVar(Target)) return; auto VD = Target->getVarDecl(); auto ATy = VD->getType()->asArrayType(); auto ElementType = ATy->getElementType(); uint64_t ArraySize; if(!ATy->EvaluateSize(ArraySize, Context)) return VisitExpr(E); SmallVector<Expr*, 32> Items(ArraySize); if(VD->hasInit()) { assert(isa<ArrayConstructorExpr>(VD->getInit())); auto InsertPoint = cast<ArrayConstructorExpr>(VD->getInit())->getItems(); for(uint64_t I = 0; I < ArraySize; ++I) Items[I] = InsertPoint[I]; } else { for(uint64_t I = 0; I < ArraySize; ++I) Items[I] = nullptr; } uint64_t Offset; if(!E->EvaluateOffset(Context, Offset, &ImpliedDoEvaluator)) return VisitExpr(E); ExprResult Val; if(Parent) { if(auto SE = dyn_cast<SubstringExpr>(Parent)) { Val = CreateSubstringExprInitializer(SE, ElementType); } else if(auto ME = dyn_cast<MemberExpr>(Parent)) { if(Offset < Items.size()) { const TypeConstructorExpr *Init = Items[Offset]? cast<TypeConstructorExpr>(Items[Offset]) : nullptr; Val = CreateMemberExprInitializer(ME, Init); } } else llvm_unreachable("invalid expression"); } else Val = getAndCheckAnyValue(ElementType, E); if(Val.isUsable() && Offset < Items.size()) { Items[Offset] = Val.get(); VD->setInit(ArrayConstructorExpr::Create(Context, Val.get()->getLocation(), Items, VD->getType())); } }
void DataStmtEngine::VisitMemberExpr(MemberExpr *E) { if(auto AE = dyn_cast<ArrayElementExpr>(E->getTarget())) { CreateArrayElementExprInitializer(AE, E); return; } auto Target = dyn_cast<VarExpr>(E->getTarget()); if(!Target) return VisitExpr(E); if(CheckVar(Target)) return; auto VD = Target->getVarDecl(); const TypeConstructorExpr *Init = VD->hasInit()? cast<TypeConstructorExpr>(VD->getInit()) : nullptr; auto Val = CreateMemberExprInitializer(E, Init); if(Val.isUsable()) VD->setInit(Val.get()); }
void DataStmtEngine::VisitSubstringExpr(SubstringExpr *E) { if(auto AE = dyn_cast<ArrayElementExpr>(E->getTarget())) { CreateArrayElementExprInitializer(AE, E); return; } auto Target = dyn_cast<VarExpr>(E->getTarget()); if(!Target) return VisitExpr(E); if(CheckVar(Target)) return; auto VD = Target->getVarDecl(); auto CharTy = VD->getType().getSelfOrArrayElementType(); auto Val = CreateSubstringExprInitializer(E, CharTy); if(Val.isUsable()) VD->setInit(Val.get()); }
void DataStmtEngine::VisitVarExpr(VarExpr *E) { if(CheckVar(E)) return; auto VD = E->getVarDecl(); auto Type = VD->getType(); if(auto ATy = Type->asArrayType()) { uint64_t ArraySize; if(!ATy->EvaluateSize(ArraySize, Context)) { VisitExpr(E); return; } // Construct an array constructor expression for initializer SmallVector<Expr*, 32> Items(ArraySize); bool IsUsable = true; SourceLocation Loc; auto ElementType = ATy->getElementType(); for(uint64_t I = 0; I < ArraySize; ++I) { if(!HasValues(E)) return; auto Val = getAndCheckAnyValue(ElementType, E); if(Val.isUsable()) { Items[I] = Val.get(); if(!Loc.isValid()) Loc = Val.get()->getLocation(); } else IsUsable = false; } if(IsUsable) { VD->setInit(ArrayConstructorExpr::Create(Context, Loc, Items, Type)); } return; } // single item auto Val = getAndCheckAnyValue(Type, E); if(Val.isUsable()) VD->setInit(Val.get()); }
// (state 'var (sym|lst exe [. prg]) ..) -> any any doState(any ex) { any x, y, a; cell c1; x = cdr(ex); Push(c1, EVAL(car(x))); NeedVar(ex,data(c1)); CheckVar(ex,data(c1)); while (isCell(x = cdr(x))) { y = car(x); if (car(y) == T || memq(val(data(c1)), car(y))) { y = cdr(y); if (!isNil(a = EVAL(car(y)))) { val(At) = val(data(c1)) = a; drop(c1); return prog(cdr(y)); } } } drop(c1); return Nil; }
// (def 'sym 'any) -> sym // (def 'sym 'sym 'any) -> sym any doDef(any ex) { any x, y; cell c1, c2, c3; x = cdr(ex), Push(c1, EVAL(car(x))); NeedSym(ex,data(c1)); CheckVar(ex,data(c1)); Touch(ex,data(c1)); x = cdr(x), Push(c2, EVAL(car(x))); if (!isCell(cdr(x))) { if (!isNil(y = val(data(c1))) && y != data(c1) && !equal(data(c2), y)) redefMsg(data(c1), NULL); val(data(c1)) = data(c2); putSrc(data(c1), NULL); } else { x = cdr(x), Push(c3, EVAL(car(x))); if (!isNil(y = get(data(c1), data(c2))) && !equal(data(c3), y)) redefMsg(data(c1), data(c2)); put(data(c1), data(c2), data(c3)); putSrc(data(c1), data(c2)); } return Pop(c1); }
int cmd(string str) { int i; mixed ret; string cmd, what; if(!str || str == ""){ help(); return 1; } i = sscanf(str,"%s %s %s", cmd, var, what); if(i != 3 || (cmd != "get" && cmd != "set")){ help(); return i; } if(cmd == "set"){ int tmp; i = sscanf(what,"%s %s", newval, what); if(i != 2){ help(); return i; } if(sscanf(newval,"%d",tmp)) newval = tmp; } ob = to_object(what); if(!ob){ string path = this_player()->query_cwd()+"/"; if(last(what,2) != ".c") what += ".c"; if(file_exists(what)) ob = load_object(what); else if(file_exists(path+what)) ob = load_object(path+what); } if(!ob){ write(truncate(what,2)+" not found."); return 1; } if(!CheckVar(var, ob)){ write("No such variable exists in that object."); return 1; } i = catch( ret = evaluate(bind( (: fetch_variable($(var)) :), ob)) ); if(i){ write("Error in variable query."); return 1; } write(var+" in "+identify(ob)+" is "+identify(ret)); if(cmd == "get"){ return 1; } if(cmd == "set"){ evaluate(bind( (: store_variable($(var), $(newval)) :), ob)); ret = evaluate(bind( (: fetch_variable($(var)) :), ob)); write(var+" in "+identify(ob)+" is now "+identify(ret)); return 1; }
/* store the primary register */ void StoreVar(char name) { CheckVar(name); sprintf(tmp, "movl %%eax, %c", name); EmitLn(tmp); }
/* Load a variable to the primary register */ void LoadVar(char name) { CheckVar(name); sprintf(tmp, "movl %c, %%eax", name); EmitLn(tmp); }
FCT_BGN() { { VCookieStore *pvcs = 0; FCT_FIXTURE_SUITE_BGN(VCookies) { FCT_SETUP_BGN() { pvcs = new VCStoreInMemory(); } FCT_SETUP_END(); FCT_TEARDOWN_BGN() { delete pvcs; } FCT_TEARDOWN_END(); FCT_TEST_BGN(CreateVCookie) { VCookie vc(12345, 6789, 9876, true, *pvcs); fct_chk ( !vc.IsModified()); } FCT_TEST_END(); FCT_TEST_BGN(CreateVCookie2) { VCookie vc(12345, 6789, 9876, true, *pvcs); SetupVCookie (vc); fct_chk ( vc.IsModified()); } FCT_TEST_END(); FCT_TEST_BGN(TestRelationVars) { VCookie vc(12345, 6789, 9876, true, *pvcs); time_t t = time(0); vc.SetVar(1, "Var1a", t, 0, ALLOC_TYPE_FIRST); fct_chk (CheckVar (vc, 1, "Var1", t, 0, 'a')); vc.SetVar(1, "Var1a", t+1, 1,ALLOC_TYPE_FIRST); fct_chk (CheckVar (vc, 1, "Var1", t, 0, 'a')); vc.SetVar(1, "Var1b", t+2, 2, ALLOC_TYPE_LAST); fct_chk (CheckVar (vc, 1, "Var1", t+2, 2, 'b')); fct_chk (vc.GetVar(1,1) == 0); vc.ClearVar (1); fct_chk (vc.GetVarElementCount(1) == 0); fct_chk (vc.GetVar(1) == 0); vc.SetVar(1, "Var1c", t+3, 3, ALLOC_TYPE_FIRST); fct_chk (CheckVar (vc, 1, "Var1", t+3, 3, 'c')); vc.SetVar(1, "Var1d", t+4, 4, ALLOC_TYPE_LINEAR, 1); fct_chk (CheckVar (vc, 1, "Var1", t+4, 4, 'd')); vc.SetVar(1, "Var1e", t+5, 5, ALLOC_TYPE_LINEAR, 2); fct_chk (CheckVar (vc, 1, "Var1", t+4, 4, 'd', 2)); vc.SetVar(1, "Var1f", t+6, 6, ALLOC_TYPE_LINEAR, 3); fct_chk (CheckVar (vc, 1, "Var1", t+4, 4, 'd', 3)); vc.SetVar(1, "Var1g", t+7, 7, ALLOC_TYPE_LINEAR, 3); fct_chk (CheckVar (vc, 1, "Var1", t+5, 5, 'e', 3)); vc.SetVar(1, "Var1h", t+8, 8, ALLOC_TYPE_LINEAR, 2); fct_chk (CheckVar (vc, 1, "Var1", t+7, 7, 'g', 2)); } FCT_TEST_END(); FCT_TEST_BGN(LoadVCookie) { VCookie vc(12345, 6789, 9876, true, *pvcs); SetupVCookie (vc); pvcs->SaveVCookie(vc); VCookie vc2(12345, 6789, 9876, false, *pvcs); fct_chk ( !vc2.IsModified()); fct_chk (vc == vc2); } FCT_TEST_END(); FCT_TEST_BGN(DeleteOld) { for (unsigned i=0; i < 100; ++i) { VCookie vc(12345, 6789+i, 9876-i, true, *pvcs); vc.SetLastHitTimeGMT(100000*i+1+10000000*(i%2)); } fct_chk (pvcs->GetVCookieCount() == 100); fct_chk (pvcs->DeleteOldVCookies(100000*50) == 25); fct_chk (pvcs->GetVCookieCount() == 75); } FCT_TEST_END(); } FCT_FIXTURE_SUITE_END(); } }