コード例 #1
0
ファイル: flow.c プロジェクト: evanrmurphy/PicoLisp
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);
}
コード例 #2
0
ファイル: SemaDataStmt.cpp プロジェクト: carlobertolli/flang
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()));
  }
}
コード例 #3
0
ファイル: SemaDataStmt.cpp プロジェクト: carlobertolli/flang
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());
}
コード例 #4
0
ファイル: SemaDataStmt.cpp プロジェクト: carlobertolli/flang
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());
}
コード例 #5
0
ファイル: SemaDataStmt.cpp プロジェクト: carlobertolli/flang
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());
}
コード例 #6
0
ファイル: flow.c プロジェクト: evanrmurphy/PicoLisp
// (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;
}
コード例 #7
0
ファイル: flow.c プロジェクト: evanrmurphy/PicoLisp
// (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);
}
コード例 #8
0
ファイル: var.c プロジェクト: arylwen/terebi
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;
    }
コード例 #9
0
/* store the primary register */
void StoreVar(char name)
{
    CheckVar(name);
    sprintf(tmp, "movl %%eax, %c", name);
    EmitLn(tmp);
}
コード例 #10
0
/* Load a variable to the primary register */
void LoadVar(char name)
{
    CheckVar(name);
    sprintf(tmp, "movl %c, %%eax", name);
    EmitLn(tmp);
}
コード例 #11
0
ファイル: test.cpp プロジェクト: pavel-paulau/elevator
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();
    }
}