void CloneExpr::visitConst(Const *e)
{
- cloned = block->CONST(e->type, e->value);
+ cloned = cloneConst(e, block->function);
}
void CloneExpr::visitString(String *e)
void CloneExpr::visitName(Name *e)
{
- if (e->id)
- cloned = block->NAME(*e->id, e->line, e->column);
- else
- cloned = block->NAME(e->builtin, e->line, e->column);
+ cloned = cloneName(e, block->function);
}
void CloneExpr::visitTemp(Temp *e)
{
- Temp *t = block->function->New<Temp>();
- t->init(e->kind, e->index, e->scope);
- cloned = t;
+ cloned = cloneTemp(e, block->function);
}
void CloneExpr::visitClosure(Closure *e)
return static_cast<_Expr *>(c);
}
+ static Const *cloneConst(Const *c, Function *f)
+ {
+ Const *newConst = f->New<Const>();
+ newConst->init(c->type, c->value);
+ return newConst;
+ }
+
+ static Name *cloneName(Name *n, Function *f)
+ {
+ Name *newName = f->New<Name>();
+ newName->type = n->type;
+ newName->id = n->id;
+ newName->builtin = n->builtin;
+ newName->global = n->global;
+ newName->line = n->line;
+ newName->column = n->column;
+ return newName;
+ }
+
+ static Temp *cloneTemp(Temp *t, Function *f)
+ {
+ Temp *newTemp = f->New<Temp>();
+ newTemp->init(t->kind, t->index, t->scope);
+ newTemp->type = t->type;
+ return newTemp;
+ }
+
protected:
V4IR::ExprList *clone(V4IR::ExprList *list);