Commit 17b548d9 authored by Marius Wachtler's avatar Marius Wachtler Committed by Boxiang Sun

BST: use constant table for the interned strings

parent 53a1a557
...@@ -279,10 +279,11 @@ private: ...@@ -279,10 +279,11 @@ private:
void visit_callattr(BST_CallAttr* node) override { void visit_callattr(BST_CallAttr* node) override {
CompilerType* t = getType(node->vreg_value); CompilerType* t = getType(node->vreg_value);
CompilerType* func = t->getattrType(node->attr, false); InternedString attr = getCodeConstants().getInternedString(node->index_attr);
CompilerType* func = t->getattrType(attr, false);
if (VERBOSITY() >= 2 && func == UNDEF) { if (VERBOSITY() >= 2 && func == UNDEF) {
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno); printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), attr.c_str(), node->lineno);
print_bst(node, code_constants); print_bst(node, code_constants);
printf("\n"); printf("\n");
} }
...@@ -292,10 +293,11 @@ private: ...@@ -292,10 +293,11 @@ private:
void visit_callclsattr(BST_CallClsAttr* node) override { void visit_callclsattr(BST_CallClsAttr* node) override {
CompilerType* t = getType(node->vreg_value); CompilerType* t = getType(node->vreg_value);
CompilerType* func = t->getattrType(node->attr, true); InternedString attr = getCodeConstants().getInternedString(node->index_attr);
CompilerType* func = t->getattrType(attr, true);
if (VERBOSITY() >= 2 && func == UNDEF) { if (VERBOSITY() >= 2 && func == UNDEF) {
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno); printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), attr.c_str(), node->lineno);
print_bst(node, code_constants); print_bst(node, code_constants);
printf("\n"); printf("\n");
} }
...@@ -379,7 +381,8 @@ private: ...@@ -379,7 +381,8 @@ private:
auto name_scope = node->lookup_type; auto name_scope = node->lookup_type;
if (name_scope == ScopeInfo::VarScopeType::GLOBAL) { if (name_scope == ScopeInfo::VarScopeType::GLOBAL) {
if (node->id.s() == "None") InternedString id = getCodeConstants().getInternedString(node->index_id);
if (id.s() == "None")
t = NONE; t = NONE;
} else if (name_scope == ScopeInfo::VarScopeType::FAST || name_scope == ScopeInfo::VarScopeType::CLOSURE) } else if (name_scope == ScopeInfo::VarScopeType::FAST || name_scope == ScopeInfo::VarScopeType::CLOSURE)
t = getType(node->vreg); t = getType(node->vreg);
...@@ -389,7 +392,8 @@ private: ...@@ -389,7 +392,8 @@ private:
void visit_loadattr(BST_LoadAttr* node) override { void visit_loadattr(BST_LoadAttr* node) override {
CompilerType* t = getType(node->vreg_value); CompilerType* t = getType(node->vreg_value);
CompilerType* rtn = t->getattrType(node->attr, node->clsonly); InternedString attr = getCodeConstants().getInternedString(node->index_attr);
CompilerType* rtn = t->getattrType(attr, node->clsonly);
if (speculation != TypeAnalysis::NONE) { if (speculation != TypeAnalysis::NONE) {
BoxedClass* speculated_class = predictClassFor(node); BoxedClass* speculated_class = predictClassFor(node);
...@@ -397,7 +401,7 @@ private: ...@@ -397,7 +401,7 @@ private:
} }
if (VERBOSITY() >= 2 && rtn == UNDEF) { if (VERBOSITY() >= 2 && rtn == UNDEF) {
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno); printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), attr.c_str(), node->lineno);
print_bst(node, code_constants); print_bst(node, code_constants);
printf("\n"); printf("\n");
} }
......
...@@ -1263,7 +1263,8 @@ Value ASTInterpreter::visit_makeClass(BST_MakeClass* mkclass) { ...@@ -1263,7 +1263,8 @@ Value ASTInterpreter::visit_makeClass(BST_MakeClass* mkclass) {
ArgPassSpec(0), 0, 0, 0, 0, 0); ArgPassSpec(0), 0, 0, 0, 0, 0);
AUTO_DECREF(attrDict); AUTO_DECREF(attrDict);
Box* classobj = createUserClass(node->name.getBox(), bases_tuple, attrDict); InternedString name = getCodeConstants().getInternedString(node->index_name);
Box* classobj = createUserClass(name.getBox(), bases_tuple, attrDict);
for (int i = decorators.size() - 1; i >= 0; i--) { for (int i = decorators.size() - 1; i >= 0; i--) {
classobj = runtimeCall(autoDecref(decorators[i]), ArgPassSpec(1), autoDecref(classobj), 0, 0, 0, 0); classobj = runtimeCall(autoDecref(decorators[i]), ArgPassSpec(1), autoDecref(classobj), 0, 0, 0, 0);
...@@ -1311,7 +1312,7 @@ void ASTInterpreter::visit_assert(BST_Assert* node) { ...@@ -1311,7 +1312,7 @@ void ASTInterpreter::visit_assert(BST_Assert* node) {
void ASTInterpreter::visit_deleteattr(BST_DeleteAttr* node) { void ASTInterpreter::visit_deleteattr(BST_DeleteAttr* node) {
Value target = getVReg(node->vreg_value); Value target = getVReg(node->vreg_value);
AUTO_DECREF(target.o); AUTO_DECREF(target.o);
BoxedString* str = node->attr.getBox(); BoxedString* str = getCodeConstants().getInternedString(node->index_attr).getBox();
if (jit) if (jit)
jit->emitDelAttr(target, str); jit->emitDelAttr(target, str);
delattr(target.o, str); delattr(target.o, str);
...@@ -1344,27 +1345,28 @@ void ASTInterpreter::visit_deletename(BST_DeleteName* target) { ...@@ -1344,27 +1345,28 @@ void ASTInterpreter::visit_deletename(BST_DeleteName* target) {
assert(target->lookup_type != ScopeInfo::VarScopeType::UNKNOWN); assert(target->lookup_type != ScopeInfo::VarScopeType::UNKNOWN);
ScopeInfo::VarScopeType vst = target->lookup_type; ScopeInfo::VarScopeType vst = target->lookup_type;
InternedString id = getCodeConstants().getInternedString(target->index_id);
if (vst == ScopeInfo::VarScopeType::GLOBAL) { if (vst == ScopeInfo::VarScopeType::GLOBAL) {
if (jit) if (jit)
jit->emitDelGlobal(target->id.getBox()); jit->emitDelGlobal(id.getBox());
delGlobal(frame_info.globals, target->id.getBox()); delGlobal(frame_info.globals, id.getBox());
} else if (vst == ScopeInfo::VarScopeType::NAME) { } else if (vst == ScopeInfo::VarScopeType::NAME) {
if (jit) if (jit)
jit->emitDelName(target->id); jit->emitDelName(id);
ASTInterpreterJitInterface::delNameHelper(this, target->id); ASTInterpreterJitInterface::delNameHelper(this, id);
} else { } else {
assert(vst == ScopeInfo::VarScopeType::FAST); assert(vst == ScopeInfo::VarScopeType::FAST);
assert(getVRegInfo().getVReg(target->id) == target->vreg); assert(getVRegInfo().getVReg(id) == target->vreg);
if (target->id.s()[0] == '#') { if (id.s()[0] == '#') {
assert(vregs[target->vreg] != NULL); assert(vregs[target->vreg] != NULL);
if (jit) if (jit)
jit->emitKillTemporary(target->vreg); jit->emitKillTemporary(target->vreg);
} else { } else {
abortJITing(); abortJITing();
if (vregs[target->vreg] == 0) { if (vregs[target->vreg] == 0) {
assertNameDefined(0, target->id.c_str(), NameError, true /* local_var_msg */); assertNameDefined(0, id.c_str(), NameError, true /* local_var_msg */);
return; return;
} }
} }
...@@ -1428,14 +1430,14 @@ Value ASTInterpreter::visit_call(BST_Call* node) { ...@@ -1428,14 +1430,14 @@ Value ASTInterpreter::visit_call(BST_Call* node) {
callattr_clsonly = false; callattr_clsonly = false;
auto* attr_ast = bst_cast<BST_CallAttr>(node); auto* attr_ast = bst_cast<BST_CallAttr>(node);
func = getVReg(attr_ast->vreg_value); func = getVReg(attr_ast->vreg_value);
attr = attr_ast->attr; attr = getCodeConstants().getInternedString(attr_ast->index_attr);
vreg_elts = bst_cast<BST_CallAttr>(node)->elts; vreg_elts = bst_cast<BST_CallAttr>(node)->elts;
} else if (node->type == BST_TYPE::CallClsAttr) { } else if (node->type == BST_TYPE::CallClsAttr) {
is_callattr = true; is_callattr = true;
callattr_clsonly = true; callattr_clsonly = true;
auto* attr_ast = bst_cast<BST_CallClsAttr>(node); auto* attr_ast = bst_cast<BST_CallClsAttr>(node);
func = getVReg(attr_ast->vreg_value); func = getVReg(attr_ast->vreg_value);
attr = attr_ast->attr; attr = getCodeConstants().getInternedString(attr_ast->index_attr);
vreg_elts = bst_cast<BST_CallClsAttr>(node)->elts; vreg_elts = bst_cast<BST_CallClsAttr>(node)->elts;
} else { } else {
auto* attr_ast = bst_cast<BST_CallFunc>(node); auto* attr_ast = bst_cast<BST_CallFunc>(node);
...@@ -1577,14 +1579,14 @@ Value ASTInterpreter::getVReg(int vreg, bool is_kill) { ...@@ -1577,14 +1579,14 @@ Value ASTInterpreter::getVReg(int vreg, bool is_kill) {
Value ASTInterpreter::visit_loadname(BST_LoadName* node) { Value ASTInterpreter::visit_loadname(BST_LoadName* node) {
assert(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN); assert(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN);
InternedString id = getCodeConstants().getInternedString(node->index_id);
switch (node->lookup_type) { switch (node->lookup_type) {
case ScopeInfo::VarScopeType::GLOBAL: { case ScopeInfo::VarScopeType::GLOBAL: {
Value v; Value v;
if (jit) if (jit)
v.var = jit->emitGetGlobal(node->id.getBox()); v.var = jit->emitGetGlobal(id.getBox());
v.o = getGlobal(frame_info.globals, node->id.getBox()); v.o = getGlobal(frame_info.globals, id.getBox());
return v; return v;
} }
case ScopeInfo::VarScopeType::DEREF: { case ScopeInfo::VarScopeType::DEREF: {
...@@ -1601,13 +1603,13 @@ Value ASTInterpreter::visit_loadname(BST_LoadName* node) { ...@@ -1601,13 +1603,13 @@ Value ASTInterpreter::visit_loadname(BST_LoadName* node) {
} }
if (is_live) if (is_live)
v.var = jit->emitGetLocal(node->id, node->vreg); v.var = jit->emitGetLocal(id, node->vreg);
else else
v.var = jit->emitGetBlockLocal(node->id, node->vreg); v.var = jit->emitGetBlockLocal(id, node->vreg);
} }
assert(node->vreg >= 0); assert(node->vreg >= 0);
assert(getVRegInfo().getVReg(node->id) == node->vreg); assert(getVRegInfo().getVReg(id) == node->vreg);
frame_info.num_vregs = std::max(frame_info.num_vregs, node->vreg + 1); frame_info.num_vregs = std::max(frame_info.num_vregs, node->vreg + 1);
Box* val = vregs[node->vreg]; Box* val = vregs[node->vreg];
...@@ -1617,14 +1619,14 @@ Value ASTInterpreter::visit_loadname(BST_LoadName* node) { ...@@ -1617,14 +1619,14 @@ Value ASTInterpreter::visit_loadname(BST_LoadName* node) {
return v; return v;
} }
assertNameDefined(0, node->id.c_str(), UnboundLocalError, true); assertNameDefined(0, id.c_str(), UnboundLocalError, true);
RELEASE_ASSERT(0, "should be unreachable"); RELEASE_ASSERT(0, "should be unreachable");
} }
case ScopeInfo::VarScopeType::NAME: { case ScopeInfo::VarScopeType::NAME: {
Value v; Value v;
if (jit) if (jit)
v.var = jit->emitGetBoxedLocal(node->id.getBox()); v.var = jit->emitGetBoxedLocal(id.getBox());
v.o = boxedLocalsGet(frame_info.boxedLocals, node->id.getBox(), frame_info.globals); v.o = boxedLocalsGet(frame_info.boxedLocals, id.getBox(), frame_info.globals);
return v; return v;
} }
default: default:
...@@ -1636,7 +1638,7 @@ Value ASTInterpreter::visit_loadattr(BST_LoadAttr* node) { ...@@ -1636,7 +1638,7 @@ Value ASTInterpreter::visit_loadattr(BST_LoadAttr* node) {
Value v = getVReg(node->vreg_value); Value v = getVReg(node->vreg_value);
AUTO_DECREF(v.o); AUTO_DECREF(v.o);
BoxedString* attr = node->attr.getBox(); BoxedString* attr = getCodeConstants().getInternedString(node->index_attr).getBox();
Value r; Value r;
if (node->clsonly) if (node->clsonly)
r = Value(getclsattr(v.o, attr), jit ? jit->emitGetClsAttr(v, attr) : NULL); r = Value(getclsattr(v.o, attr), jit ? jit->emitGetClsAttr(v, attr) : NULL);
...@@ -1680,7 +1682,7 @@ void ASTInterpreter::visit_storename(BST_StoreName* node) { ...@@ -1680,7 +1682,7 @@ void ASTInterpreter::visit_storename(BST_StoreName* node) {
assert(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN); assert(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN);
InternedString name = node->id; InternedString name = getCodeConstants().getInternedString(node->index_id);
ScopeInfo::VarScopeType vst = node->lookup_type; ScopeInfo::VarScopeType vst = node->lookup_type;
if (vst == ScopeInfo::VarScopeType::GLOBAL) { if (vst == ScopeInfo::VarScopeType::GLOBAL) {
if (jit) if (jit)
...@@ -1711,7 +1713,7 @@ void ASTInterpreter::visit_storename(BST_StoreName* node) { ...@@ -1711,7 +1713,7 @@ void ASTInterpreter::visit_storename(BST_StoreName* node) {
if (closure) { if (closure) {
ASTInterpreterJitInterface::setLocalClosureHelper(this, node->vreg, node->closure_offset, value.o); ASTInterpreterJitInterface::setLocalClosureHelper(this, node->vreg, node->closure_offset, value.o);
} else { } else {
assert(getVRegInfo().getVReg(node->id) == node->vreg); assert(getVRegInfo().getVReg(name) == node->vreg);
frame_info.num_vregs = std::max(frame_info.num_vregs, node->vreg + 1); frame_info.num_vregs = std::max(frame_info.num_vregs, node->vreg + 1);
Box* prev = vregs[node->vreg]; Box* prev = vregs[node->vreg];
vregs[node->vreg] = value.o; vregs[node->vreg] = value.o;
...@@ -1724,11 +1726,12 @@ void ASTInterpreter::visit_storename(BST_StoreName* node) { ...@@ -1724,11 +1726,12 @@ void ASTInterpreter::visit_storename(BST_StoreName* node) {
void ASTInterpreter::visit_storeattr(BST_StoreAttr* node) { void ASTInterpreter::visit_storeattr(BST_StoreAttr* node) {
Value value = getVReg(node->vreg_value); Value value = getVReg(node->vreg_value);
Value o = getVReg(node->vreg_target); Value o = getVReg(node->vreg_target);
InternedString attr = getCodeConstants().getInternedString(node->index_attr);
if (jit) { if (jit) {
jit->emitSetAttr(node, o, node->attr.getBox(), value); jit->emitSetAttr(node, o, attr.getBox(), value);
} }
AUTO_DECREF(o.o); AUTO_DECREF(o.o);
pyston::setattr(o.o, node->attr.getBox(), value.o); pyston::setattr(o.o, attr.getBox(), value.o);
} }
void ASTInterpreter::visit_storesub(BST_StoreSub* node) { void ASTInterpreter::visit_storesub(BST_StoreSub* node) {
...@@ -1860,8 +1863,8 @@ Box* ASTInterpreterJitInterface::derefHelper(void* _interpreter, BST_LoadName* n ...@@ -1860,8 +1863,8 @@ Box* ASTInterpreterJitInterface::derefHelper(void* _interpreter, BST_LoadName* n
} }
Box* val = closure->elts[deref_info.offset]; Box* val = closure->elts[deref_info.offset];
if (val == NULL) { if (val == NULL) {
raiseExcHelper(NameError, "free variable '%s' referenced before assignment in enclosing scope", InternedString id = interpreter->getCodeConstants().getInternedString(node->index_id);
node->id.c_str()); raiseExcHelper(NameError, "free variable '%s' referenced before assignment in enclosing scope", id.c_str());
} }
Py_INCREF(val); Py_INCREF(val);
return val; return val;
......
...@@ -1104,14 +1104,14 @@ private: ...@@ -1104,14 +1104,14 @@ private:
auto* attr_ast = bst_cast<BST_CallAttr>(node); auto* attr_ast = bst_cast<BST_CallAttr>(node);
vreg_elts = bst_cast<BST_CallAttr>(node)->elts; vreg_elts = bst_cast<BST_CallAttr>(node)->elts;
func = evalVReg(attr_ast->vreg_value); func = evalVReg(attr_ast->vreg_value);
attr = attr_ast->attr; attr = irstate->getCodeConstants().getInternedString(attr_ast->index_attr);
} else if (node->type == BST_TYPE::CallClsAttr) { } else if (node->type == BST_TYPE::CallClsAttr) {
is_callattr = true; is_callattr = true;
callattr_clsonly = true; callattr_clsonly = true;
auto* attr_ast = bst_cast<BST_CallClsAttr>(node); auto* attr_ast = bst_cast<BST_CallClsAttr>(node);
vreg_elts = bst_cast<BST_CallClsAttr>(node)->elts; vreg_elts = bst_cast<BST_CallClsAttr>(node)->elts;
func = evalVReg(attr_ast->vreg_value); func = evalVReg(attr_ast->vreg_value);
attr = attr_ast->attr; attr = irstate->getCodeConstants().getInternedString(attr_ast->index_attr);
} else { } else {
is_callattr = false; is_callattr = false;
auto* attr_ast = bst_cast<BST_CallFunc>(node); auto* attr_ast = bst_cast<BST_CallFunc>(node);
...@@ -1199,7 +1199,8 @@ private: ...@@ -1199,7 +1199,8 @@ private:
} }
ConcreteCompilerVariable* _getGlobal(BST_LoadName* node, const UnwindInfo& unw_info) { ConcreteCompilerVariable* _getGlobal(BST_LoadName* node, const UnwindInfo& unw_info) {
if (node->id.s() == "None") InternedString id = irstate->getCodeConstants().getInternedString(node->index_id);
if (id.s() == "None")
return emitter.getNone(); return emitter.getNone();
bool do_patchpoint = ENABLE_ICGETGLOBALS; bool do_patchpoint = ENABLE_ICGETGLOBALS;
...@@ -1208,8 +1209,8 @@ private: ...@@ -1208,8 +1209,8 @@ private:
std::vector<llvm::Value*> llvm_args; std::vector<llvm::Value*> llvm_args;
llvm_args.push_back(irstate->getGlobals()); llvm_args.push_back(irstate->getGlobals());
llvm_args.push_back(emitter.setType(embedRelocatablePtr(node->id.getBox(), g.llvm_boxedstring_type_ptr), llvm_args.push_back(
RefType::BORROWED)); emitter.setType(embedRelocatablePtr(id.getBox(), g.llvm_boxedstring_type_ptr), RefType::BORROWED));
llvm::Instruction* uncasted llvm::Instruction* uncasted
= emitter.createIC(std::move(pp), (void*)pyston::getGlobal, llvm_args, unw_info); = emitter.createIC(std::move(pp), (void*)pyston::getGlobal, llvm_args, unw_info);
...@@ -1219,8 +1220,7 @@ private: ...@@ -1219,8 +1220,7 @@ private:
} else { } else {
llvm::Value* r = emitter.createCall2( llvm::Value* r = emitter.createCall2(
unw_info, g.funcs.getGlobal, irstate->getGlobals(), unw_info, g.funcs.getGlobal, irstate->getGlobals(),
emitter.setType(embedRelocatablePtr(node->id.getBox(), g.llvm_boxedstring_type_ptr), emitter.setType(embedRelocatablePtr(id.getBox(), g.llvm_boxedstring_type_ptr), RefType::BORROWED));
RefType::BORROWED));
emitter.setType(r, RefType::OWNED); emitter.setType(r, RefType::OWNED);
return new ConcreteCompilerVariable(UNKNOWN, r); return new ConcreteCompilerVariable(UNKNOWN, r);
} }
...@@ -1264,6 +1264,7 @@ private: ...@@ -1264,6 +1264,7 @@ private:
CompilerVariable* evalLoadName(BST_LoadName* node, const UnwindInfo& unw_info) { CompilerVariable* evalLoadName(BST_LoadName* node, const UnwindInfo& unw_info) {
InternedString id = irstate->getCodeConstants().getInternedString(node->index_id);
// LoadName is never a kill // LoadName is never a kill
auto&& scope_info = irstate->getScopeInfo(); auto&& scope_info = irstate->getScopeInfo();
...@@ -1312,7 +1313,7 @@ private: ...@@ -1312,7 +1313,7 @@ private:
emitter.getBuilder()->SetInsertPoint(curblock); emitter.getBuilder()->SetInsertPoint(curblock);
llvm::CallSite call = emitter.createCall(unw_info, g.funcs.assertFailDerefNameDefined, llvm::CallSite call = emitter.createCall(unw_info, g.funcs.assertFailDerefNameDefined,
embedRelocatablePtr(node->id.c_str(), g.i8_ptr)); embedRelocatablePtr(id.c_str(), g.i8_ptr));
call.setDoesNotReturn(); call.setDoesNotReturn();
emitter.getBuilder()->CreateUnreachable(); emitter.getBuilder()->CreateUnreachable();
...@@ -1323,7 +1324,7 @@ private: ...@@ -1323,7 +1324,7 @@ private:
return new ConcreteCompilerVariable(UNKNOWN, lookupResult); return new ConcreteCompilerVariable(UNKNOWN, lookupResult);
} else if (vst == ScopeInfo::VarScopeType::NAME) { } else if (vst == ScopeInfo::VarScopeType::NAME) {
llvm::Value* boxedLocals = irstate->getBoxedLocalsVar(); llvm::Value* boxedLocals = irstate->getBoxedLocalsVar();
llvm::Value* attr = embedRelocatablePtr(node->id.getBox(), g.llvm_boxedstring_type_ptr); llvm::Value* attr = embedRelocatablePtr(id.getBox(), g.llvm_boxedstring_type_ptr);
emitter.setType(attr, RefType::BORROWED); emitter.setType(attr, RefType::BORROWED);
llvm::Value* module = irstate->getGlobals(); llvm::Value* module = irstate->getGlobals();
llvm::Value* r = emitter.createCall3(unw_info, g.funcs.boxedLocalsGet, boxedLocals, attr, module); llvm::Value* r = emitter.createCall3(unw_info, g.funcs.boxedLocalsGet, boxedLocals, attr, module);
...@@ -1337,7 +1338,7 @@ private: ...@@ -1337,7 +1338,7 @@ private:
// state = DEAD; // state = DEAD;
llvm::CallSite call = emitter.createCall( llvm::CallSite call = emitter.createCall(
unw_info, g.funcs.assertNameDefined, unw_info, g.funcs.assertNameDefined,
{ getConstantInt(0, g.i1), embedRelocatablePtr(node->id.c_str(), g.i8_ptr), { getConstantInt(0, g.i1), embedRelocatablePtr(id.c_str(), g.i8_ptr),
emitter.setType(embedRelocatablePtr(UnboundLocalError, g.llvm_class_type_ptr), RefType::BORROWED), emitter.setType(embedRelocatablePtr(UnboundLocalError, g.llvm_class_type_ptr), RefType::BORROWED),
getConstantInt(true, g.i1) }); getConstantInt(true, g.i1) });
call.setDoesNotReturn(); call.setDoesNotReturn();
...@@ -1349,7 +1350,7 @@ private: ...@@ -1349,7 +1350,7 @@ private:
if (is_defined_var) { if (is_defined_var) {
emitter.createCall( emitter.createCall(
unw_info, g.funcs.assertNameDefined, unw_info, g.funcs.assertNameDefined,
{ i1FromLLVMBool(emitter, is_defined_var), embedRelocatablePtr(node->id.c_str(), g.i8_ptr), { i1FromLLVMBool(emitter, is_defined_var), embedRelocatablePtr(id.c_str(), g.i8_ptr),
emitter.setType(embedRelocatablePtr(UnboundLocalError, g.llvm_class_type_ptr), RefType::BORROWED), emitter.setType(embedRelocatablePtr(UnboundLocalError, g.llvm_class_type_ptr), RefType::BORROWED),
getConstantInt(true, g.i1) }); getConstantInt(true, g.i1) });
...@@ -1412,8 +1413,8 @@ private: ...@@ -1412,8 +1413,8 @@ private:
CompilerVariable* evalLoadAttr(BST_LoadAttr* node, const UnwindInfo& unw_info) { CompilerVariable* evalLoadAttr(BST_LoadAttr* node, const UnwindInfo& unw_info) {
CompilerVariable* value = evalVReg(node->vreg_value); CompilerVariable* value = evalVReg(node->vreg_value);
CompilerVariable* rtn InternedString attr = irstate->getCodeConstants().getInternedString(node->index_attr);
= value->getattr(emitter, getOpInfoForNode(node, unw_info), node->attr.getBox(), node->clsonly); CompilerVariable* rtn = value->getattr(emitter, getOpInfoForNode(node, unw_info), attr.getBox(), node->clsonly);
return rtn; return rtn;
} }
...@@ -1526,9 +1527,10 @@ private: ...@@ -1526,9 +1527,10 @@ private:
ConcreteCompilerVariable* converted_attr_dict = attr_dict->makeConverted(emitter, attr_dict->getBoxType()); ConcreteCompilerVariable* converted_attr_dict = attr_dict->makeConverted(emitter, attr_dict->getBoxType());
InternedString name = irstate->getCodeConstants().getInternedString(node->index_name);
llvm::Value* classobj = emitter.createCall3( llvm::Value* classobj = emitter.createCall3(
unw_info, g.funcs.createUserClass, unw_info, g.funcs.createUserClass,
emitter.setType(embedRelocatablePtr(node->name.getBox(), g.llvm_boxedstring_type_ptr), RefType::BORROWED), emitter.setType(embedRelocatablePtr(name.getBox(), g.llvm_boxedstring_type_ptr), RefType::BORROWED),
bases_tuple->getValue(), converted_attr_dict->getValue()); bases_tuple->getValue(), converted_attr_dict->getValue());
emitter.setType(classobj, RefType::OWNED); emitter.setType(classobj, RefType::OWNED);
...@@ -1764,17 +1766,17 @@ private: ...@@ -1764,17 +1766,17 @@ private:
} }
void doStoreName(BST_StoreName* node, const UnwindInfo& unw_info) { void doStoreName(BST_StoreName* node, const UnwindInfo& unw_info) {
InternedString name = irstate->getCodeConstants().getInternedString(node->index_id);
CompilerVariable* val = evalVReg(node->vreg_value); CompilerVariable* val = evalVReg(node->vreg_value);
assert(node->id.s() != "None"); assert(name.s() != "None");
assert(node->id.s() != FRAME_INFO_PTR_NAME); assert(name.s() != FRAME_INFO_PTR_NAME);
assert(val->getType()->isUsable()); assert(val->getType()->isUsable());
auto vst = node->lookup_type; auto vst = node->lookup_type;
assert(vst != ScopeInfo::VarScopeType::UNKNOWN); assert(vst != ScopeInfo::VarScopeType::UNKNOWN);
assert(vst != ScopeInfo::VarScopeType::DEREF); assert(vst != ScopeInfo::VarScopeType::DEREF);
auto name = node->id;
auto vreg = node->vreg; auto vreg = node->vreg;
if (vst == ScopeInfo::VarScopeType::GLOBAL) { if (vst == ScopeInfo::VarScopeType::GLOBAL) {
...@@ -1831,7 +1833,8 @@ private: ...@@ -1831,7 +1833,8 @@ private:
void doStoreAttr(BST_StoreAttr* target, const UnwindInfo& unw_info) { void doStoreAttr(BST_StoreAttr* target, const UnwindInfo& unw_info) {
CompilerVariable* val = evalVReg(target->vreg_value); CompilerVariable* val = evalVReg(target->vreg_value);
CompilerVariable* t = evalVReg(target->vreg_target); CompilerVariable* t = evalVReg(target->vreg_target);
t->setattr(emitter, getEmptyOpInfo(unw_info), target->attr.getBox(), val); InternedString attr = irstate->getCodeConstants().getInternedString(target->index_attr);
t->setattr(emitter, getEmptyOpInfo(unw_info), attr.getBox(), val);
} }
void _assignSlice(llvm::Value* target, llvm::Value* value, const UnboxedSlice& slice_val, void _assignSlice(llvm::Value* target, llvm::Value* value, const UnboxedSlice& slice_val,
...@@ -1998,13 +2001,16 @@ private: ...@@ -1998,13 +2001,16 @@ private:
} }
void _doDelAttr(BST_DeleteAttr* node, const UnwindInfo& unw_info) { void _doDelAttr(BST_DeleteAttr* node, const UnwindInfo& unw_info) {
InternedString attr = irstate->getCodeConstants().getInternedString(node->index_attr);
CompilerVariable* value = evalVReg(node->vreg_value); CompilerVariable* value = evalVReg(node->vreg_value);
value->delattr(emitter, getEmptyOpInfo(unw_info), node->attr.getBox()); value->delattr(emitter, getEmptyOpInfo(unw_info), attr.getBox());
} }
void _doDelName(BST_DeleteName* target, const UnwindInfo& unw_info) { void _doDelName(BST_DeleteName* target, const UnwindInfo& unw_info) {
InternedString id = irstate->getCodeConstants().getInternedString(target->index_id);
// Hack: we don't have a bytecode for temporary-kills: // Hack: we don't have a bytecode for temporary-kills:
if (target->id.s()[0] == '#') { if (id.s()[0] == '#') {
// The refcounter will automatically delete this object. // The refcounter will automatically delete this object.
return; return;
} }
...@@ -2013,15 +2019,15 @@ private: ...@@ -2013,15 +2019,15 @@ private:
assert(vst != ScopeInfo::VarScopeType::UNKNOWN); assert(vst != ScopeInfo::VarScopeType::UNKNOWN);
if (vst == ScopeInfo::VarScopeType::GLOBAL) { if (vst == ScopeInfo::VarScopeType::GLOBAL) {
// Can't use delattr since the errors are different: // Can't use delattr since the errors are different:
emitter.createCall2(unw_info, g.funcs.delGlobal, irstate->getGlobals(), emitter.createCall2(
emitter.setType(embedRelocatablePtr(target->id.getBox(), g.llvm_boxedstring_type_ptr), unw_info, g.funcs.delGlobal, irstate->getGlobals(),
RefType::BORROWED)); emitter.setType(embedRelocatablePtr(id.getBox(), g.llvm_boxedstring_type_ptr), RefType::BORROWED));
return; return;
} }
if (vst == ScopeInfo::VarScopeType::NAME) { if (vst == ScopeInfo::VarScopeType::NAME) {
llvm::Value* boxedLocals = irstate->getBoxedLocalsVar(); llvm::Value* boxedLocals = irstate->getBoxedLocalsVar();
llvm::Value* attr = embedRelocatablePtr(target->id.getBox(), g.llvm_boxedstring_type_ptr); llvm::Value* attr = embedRelocatablePtr(id.getBox(), g.llvm_boxedstring_type_ptr);
emitter.setType(attr, RefType::BORROWED); emitter.setType(attr, RefType::BORROWED);
emitter.createCall2(unw_info, g.funcs.boxedLocalsDel, boxedLocals, attr); emitter.createCall2(unw_info, g.funcs.boxedLocalsDel, boxedLocals, attr);
return; return;
...@@ -2041,7 +2047,7 @@ private: ...@@ -2041,7 +2047,7 @@ private:
if (!symbol_table[target->vreg]) { if (!symbol_table[target->vreg]) {
llvm::CallSite call = emitter.createCall( llvm::CallSite call = emitter.createCall(
unw_info, g.funcs.assertNameDefined, unw_info, g.funcs.assertNameDefined,
{ getConstantInt(0, g.i1), embedConstantPtr(target->id.c_str(), g.i8_ptr), { getConstantInt(0, g.i1), embedConstantPtr(id.c_str(), g.i8_ptr),
emitter.setType(embedRelocatablePtr(NameError, g.llvm_class_type_ptr), RefType::BORROWED), emitter.setType(embedRelocatablePtr(NameError, g.llvm_class_type_ptr), RefType::BORROWED),
getConstantInt(true /*local_error_msg*/, g.i1) }); getConstantInt(true /*local_error_msg*/, g.i1) });
call.setDoesNotReturn(); call.setDoesNotReturn();
...@@ -2051,7 +2057,7 @@ private: ...@@ -2051,7 +2057,7 @@ private:
if (is_defined_var) { if (is_defined_var) {
emitter.createCall( emitter.createCall(
unw_info, g.funcs.assertNameDefined, unw_info, g.funcs.assertNameDefined,
{ i1FromLLVMBool(emitter, is_defined_var), embedConstantPtr(target->id.c_str(), g.i8_ptr), { i1FromLLVMBool(emitter, is_defined_var), embedConstantPtr(id.c_str(), g.i8_ptr),
emitter.setType(embedRelocatablePtr(NameError, g.llvm_class_type_ptr), RefType::BORROWED), emitter.setType(embedRelocatablePtr(NameError, g.llvm_class_type_ptr), RefType::BORROWED),
getConstantInt(true /*local_error_msg*/, g.i1) }); getConstantInt(true /*local_error_msg*/, g.i1) });
popDefinedVar(target->vreg); popDefinedVar(target->vreg);
......
...@@ -837,7 +837,7 @@ bool PrintVisitor::visit_callattr(BST_CallAttr* node) { ...@@ -837,7 +837,7 @@ bool PrintVisitor::visit_callattr(BST_CallAttr* node) {
visit_vreg(&node->vreg_dst, true); visit_vreg(&node->vreg_dst, true);
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
stream << "."; stream << ".";
stream << node->attr.s(); stream << code_constants.getInternedString(node->index_attr).s();
stream << "("; stream << "(";
bool prevarg = false; bool prevarg = false;
...@@ -867,7 +867,7 @@ bool PrintVisitor::visit_callclsattr(BST_CallClsAttr* node) { ...@@ -867,7 +867,7 @@ bool PrintVisitor::visit_callclsattr(BST_CallClsAttr* node) {
visit_vreg(&node->vreg_dst, true); visit_vreg(&node->vreg_dst, true);
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
stream << ":"; stream << ":";
stream << node->attr.s(); stream << code_constants.getInternedString(node->index_attr).s();
stream << "("; stream << "(";
bool prevarg = false; bool prevarg = false;
...@@ -909,7 +909,7 @@ bool PrintVisitor::visit_classdef(BST_ClassDef* node) { ...@@ -909,7 +909,7 @@ bool PrintVisitor::visit_classdef(BST_ClassDef* node) {
stream << "\n"; stream << "\n";
printIndent(); printIndent();
} }
stream << "class " << node->name.s() << "("; stream << "class " << code_constants.getInternedString(node->index_name).s() << "(";
visit_vreg(&node->vreg_bases_tuple); visit_vreg(&node->vreg_bases_tuple);
stream << ")"; stream << ")";
...@@ -954,7 +954,7 @@ bool PrintVisitor::visit_deleteattr(BST_DeleteAttr* node) { ...@@ -954,7 +954,7 @@ bool PrintVisitor::visit_deleteattr(BST_DeleteAttr* node) {
stream << "del "; stream << "del ";
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
stream << '.'; stream << '.';
stream << node->attr.s(); stream << code_constants.getInternedString(node->index_attr).s();
return true; return true;
} }
bool PrintVisitor::visit_deletename(BST_DeleteName* node) { bool PrintVisitor::visit_deletename(BST_DeleteName* node) {
...@@ -963,7 +963,7 @@ bool PrintVisitor::visit_deletename(BST_DeleteName* node) { ...@@ -963,7 +963,7 @@ bool PrintVisitor::visit_deletename(BST_DeleteName* node) {
visit_vreg(&node->vreg); visit_vreg(&node->vreg);
stream << " "; stream << " ";
} }
stream << node->id.s(); stream << code_constants.getInternedString(node->index_id).s();
return true; return true;
} }
...@@ -999,8 +999,8 @@ bool PrintVisitor::visit_functiondef(BST_FunctionDef* node) { ...@@ -999,8 +999,8 @@ bool PrintVisitor::visit_functiondef(BST_FunctionDef* node) {
} }
stream << "def "; stream << "def ";
if (node->name != InternedString()) if (node->index_name != VREG_UNDEFINED)
stream << node->name.s(); stream << code_constants.getInternedString(node->index_name).s();
else else
stream << "<lambda>"; stream << "<lambda>";
stream << "("; stream << "(";
...@@ -1226,14 +1226,14 @@ bool PrintVisitor::visit_loadname(BST_LoadName* node) { ...@@ -1226,14 +1226,14 @@ bool PrintVisitor::visit_loadname(BST_LoadName* node) {
visit_vreg(&node->vreg); visit_vreg(&node->vreg);
stream << " "; stream << " ";
} }
stream << node->id.s(); stream << code_constants.getInternedString(node->index_id).s();
return true; return true;
} }
bool PrintVisitor::visit_loadattr(BST_LoadAttr* node) { bool PrintVisitor::visit_loadattr(BST_LoadAttr* node) {
visit_vreg(&node->vreg_dst, true); visit_vreg(&node->vreg_dst, true);
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
stream << (node->clsonly ? ':' : '.') << node->attr.s(); stream << (node->clsonly ? ':' : '.') << code_constants.getInternedString(node->index_attr).s();
return true; return true;
} }
...@@ -1265,7 +1265,7 @@ bool PrintVisitor::visit_storename(BST_StoreName* node) { ...@@ -1265,7 +1265,7 @@ bool PrintVisitor::visit_storename(BST_StoreName* node) {
visit_vreg(&node->vreg); visit_vreg(&node->vreg);
stream << " "; stream << " ";
} }
stream << node->id.s(); stream << code_constants.getInternedString(node->index_id).s();
stream << " = "; stream << " = ";
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
return true; return true;
...@@ -1273,7 +1273,7 @@ bool PrintVisitor::visit_storename(BST_StoreName* node) { ...@@ -1273,7 +1273,7 @@ bool PrintVisitor::visit_storename(BST_StoreName* node) {
bool PrintVisitor::visit_storeattr(BST_StoreAttr* node) { bool PrintVisitor::visit_storeattr(BST_StoreAttr* node) {
visit_vreg(&node->vreg_target); visit_vreg(&node->vreg_target);
stream << "." << node->attr.s() << " = "; stream << "." << code_constants.getInternedString(node->index_attr).s() << " = ";
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
return true; return true;
} }
......
...@@ -258,7 +258,7 @@ class BST_StoreName : public BST_stmt { ...@@ -258,7 +258,7 @@ class BST_StoreName : public BST_stmt {
public: public:
int vreg_value = VREG_UNDEFINED; int vreg_value = VREG_UNDEFINED;
InternedString id; int index_id = VREG_UNDEFINED;
ScopeInfo::VarScopeType lookup_type; ScopeInfo::VarScopeType lookup_type;
int vreg = VREG_UNDEFINED; int vreg = VREG_UNDEFINED;
...@@ -272,7 +272,7 @@ public: ...@@ -272,7 +272,7 @@ public:
class BST_StoreAttr : public BST_stmt { class BST_StoreAttr : public BST_stmt {
public: public:
InternedString attr; int index_attr = VREG_UNDEFINED;
int vreg_target = VREG_UNDEFINED; int vreg_target = VREG_UNDEFINED;
int vreg_value = VREG_UNDEFINED; int vreg_value = VREG_UNDEFINED;
...@@ -299,7 +299,7 @@ public: ...@@ -299,7 +299,7 @@ public:
class BST_LoadName : public BST_stmt_with_dest { class BST_LoadName : public BST_stmt_with_dest {
public: public:
InternedString id; int index_id = VREG_UNDEFINED;
ScopeInfo::VarScopeType lookup_type; ScopeInfo::VarScopeType lookup_type;
// LoadName does not kill this vreg // LoadName does not kill this vreg
int vreg = VREG_UNDEFINED; int vreg = VREG_UNDEFINED;
...@@ -314,7 +314,7 @@ public: ...@@ -314,7 +314,7 @@ public:
class BST_LoadAttr : public BST_stmt_with_dest { class BST_LoadAttr : public BST_stmt_with_dest {
public: public:
InternedString attr; int index_attr = VREG_UNDEFINED;
int vreg_value = VREG_UNDEFINED; int vreg_value = VREG_UNDEFINED;
bool clsonly = false; bool clsonly = false;
...@@ -376,7 +376,7 @@ public: ...@@ -376,7 +376,7 @@ public:
class BST_CallAttr : public BST_Call { class BST_CallAttr : public BST_Call {
public: public:
int vreg_value = VREG_UNDEFINED; int vreg_value = VREG_UNDEFINED;
InternedString attr; int index_attr = VREG_UNDEFINED;
int elts[1]; int elts[1];
BSTVARVREGS2CALL(CallAttr, num_args, num_keywords, elts) BSTVARVREGS2CALL(CallAttr, num_args, num_keywords, elts)
...@@ -385,7 +385,7 @@ public: ...@@ -385,7 +385,7 @@ public:
class BST_CallClsAttr : public BST_Call { class BST_CallClsAttr : public BST_Call {
public: public:
int vreg_value = VREG_UNDEFINED; int vreg_value = VREG_UNDEFINED;
InternedString attr; int index_attr = VREG_UNDEFINED;
int elts[1]; int elts[1];
BSTVARVREGS2CALL(CallClsAttr, num_args, num_keywords, elts) BSTVARVREGS2CALL(CallClsAttr, num_args, num_keywords, elts)
...@@ -403,8 +403,8 @@ public: ...@@ -403,8 +403,8 @@ public:
class BST_ClassDef : public BST_stmt { class BST_ClassDef : public BST_stmt {
public: public:
InternedString name; int index_name = VREG_UNDEFINED;
int vreg_bases_tuple; int vreg_bases_tuple = VREG_UNDEFINED;
const int num_decorator; const int num_decorator;
int decorator[1]; int decorator[1];
...@@ -419,14 +419,14 @@ public: ...@@ -419,14 +419,14 @@ public:
class BST_DeleteAttr : public BST_stmt { class BST_DeleteAttr : public BST_stmt {
public: public:
int vreg_value = VREG_UNDEFINED; int vreg_value = VREG_UNDEFINED;
InternedString attr; int index_attr = VREG_UNDEFINED;
BSTFIXEDVREGS(DeleteAttr, BST_stmt) BSTFIXEDVREGS(DeleteAttr, BST_stmt)
}; };
class BST_DeleteName : public BST_stmt { class BST_DeleteName : public BST_stmt {
public: public:
InternedString id; int index_id = VREG_UNDEFINED;
ScopeInfo::VarScopeType lookup_type; ScopeInfo::VarScopeType lookup_type;
int vreg = VREG_UNDEFINED; int vreg = VREG_UNDEFINED;
...@@ -466,7 +466,7 @@ public: ...@@ -466,7 +466,7 @@ public:
class BST_FunctionDef : public BST_stmt { class BST_FunctionDef : public BST_stmt {
public: public:
InternedString name; // if the name is not set this is a lambda int index_name = VREG_UNDEFINED; // if the name is not set this is a lambda
const int num_decorator; const int num_decorator;
const int num_defaults; const int num_defaults;
......
...@@ -38,18 +38,18 @@ ...@@ -38,18 +38,18 @@
namespace pyston { namespace pyston {
template <typename Node> void fillScopingInfo(Node* node, ScopeInfo* scope_info) { template <typename Node> void fillScopingInfo(Node* node, InternedString id, ScopeInfo* scope_info) {
node->lookup_type = scope_info->getScopeTypeOfName(node->id); node->lookup_type = scope_info->getScopeTypeOfName(id);
if (node->lookup_type == ScopeInfo::VarScopeType::CLOSURE) if (node->lookup_type == ScopeInfo::VarScopeType::CLOSURE)
node->closure_offset = scope_info->getClosureOffset(node->id); node->closure_offset = scope_info->getClosureOffset(id);
else if (node->lookup_type == ScopeInfo::VarScopeType::DEREF) else if (node->lookup_type == ScopeInfo::VarScopeType::DEREF)
node->deref_info = scope_info->getDerefInfo(node->id); node->deref_info = scope_info->getDerefInfo(id);
assert(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN); assert(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN);
} }
template <> void fillScopingInfo<BST_Name>(BST_Name* node, ScopeInfo* scope_info) { void fillScopingInfo(BST_Name* node, ScopeInfo* scope_info) {
node->lookup_type = scope_info->getScopeTypeOfName(node->id); node->lookup_type = scope_info->getScopeTypeOfName(node->id);
if (node->lookup_type == ScopeInfo::VarScopeType::CLOSURE) if (node->lookup_type == ScopeInfo::VarScopeType::CLOSURE)
...@@ -504,6 +504,15 @@ private: ...@@ -504,6 +504,15 @@ private:
return name; return name;
} }
int remapInternedString(InternedString id) {
auto it = interned_string_constants.find(id);
if (it != interned_string_constants.end())
return it->second;
int index = code_constants.addInternedString(id);
interned_string_constants[id] = index;
return index;
}
TmpValue remapName(AST_Name* name) { TmpValue remapName(AST_Name* name) {
if (!name) if (!name)
return TmpValue(); return TmpValue();
...@@ -514,9 +523,9 @@ private: ...@@ -514,9 +523,9 @@ private:
auto rtn = new BST_LoadName; auto rtn = new BST_LoadName;
rtn->lineno = name->lineno; rtn->lineno = name->lineno;
rtn->id = name->id; rtn->index_id = remapInternedString(name->id);
rtn->lookup_type = name->lookup_type; rtn->lookup_type = name->lookup_type;
fillScopingInfo(rtn, scoping); fillScopingInfo(rtn, name->id, scoping);
return pushBackCreateDst(rtn); return pushBackCreateDst(rtn);
} }
...@@ -808,7 +817,7 @@ private: ...@@ -808,7 +817,7 @@ private:
BST_LoadAttr* rtn = new BST_LoadAttr(); BST_LoadAttr* rtn = new BST_LoadAttr();
rtn->clsonly = clsonly; rtn->clsonly = clsonly;
unmapExpr(base, &rtn->vreg_value); unmapExpr(base, &rtn->vreg_value);
rtn->attr = attr; rtn->index_attr = remapInternedString(attr);
rtn->lineno = base.lineno; rtn->lineno = base.lineno;
return pushBackCreateDst(rtn); return pushBackCreateDst(rtn);
} }
...@@ -850,7 +859,7 @@ private: ...@@ -850,7 +859,7 @@ private:
BST_Call* rtn = NULL; BST_Call* rtn = NULL;
if (!is_cls) { if (!is_cls) {
BST_CallAttr* call = BST_CallAttr::create(args.size(), 0 /* num keywords */); BST_CallAttr* call = BST_CallAttr::create(args.size(), 0 /* num keywords */);
call->attr = attr; call->index_attr = remapInternedString(attr);
unmapExpr(target, &call->vreg_value); unmapExpr(target, &call->vreg_value);
for (int i = 0; i < args.size(); ++i) { for (int i = 0; i < args.size(); ++i) {
unmapExpr(args[i], &call->elts[i]); unmapExpr(args[i], &call->elts[i]);
...@@ -858,7 +867,7 @@ private: ...@@ -858,7 +867,7 @@ private:
rtn = call; rtn = call;
} else { } else {
BST_CallClsAttr* call = BST_CallClsAttr::create(args.size(), 0 /* num keywords */); BST_CallClsAttr* call = BST_CallClsAttr::create(args.size(), 0 /* num keywords */);
call->attr = attr; call->index_attr = remapInternedString(attr);
unmapExpr(target, &call->vreg_value); unmapExpr(target, &call->vreg_value);
for (int i = 0; i < args.size(); ++i) { for (int i = 0; i < args.size(); ++i) {
unmapExpr(args[i], &call->elts[i]); unmapExpr(args[i], &call->elts[i]);
...@@ -882,8 +891,8 @@ private: ...@@ -882,8 +891,8 @@ private:
BST_StoreName* assign = new BST_StoreName(); BST_StoreName* assign = new BST_StoreName();
unmapExpr(val, &assign->vreg_value); unmapExpr(val, &assign->vreg_value);
assign->lineno = val.lineno; assign->lineno = val.lineno;
assign->id = ast_cast<AST_Name>(target)->id; assign->index_id = remapInternedString(ast_cast<AST_Name>(target)->id);
fillScopingInfo(assign, scoping); fillScopingInfo(assign, ast_cast<AST_Name>(target)->id, scoping);
push_back(assign); push_back(assign);
} else if (target->type == AST_TYPE::Subscript) { } else if (target->type == AST_TYPE::Subscript) {
AST_Subscript* s = ast_cast<AST_Subscript>(target); AST_Subscript* s = ast_cast<AST_Subscript>(target);
...@@ -912,7 +921,7 @@ private: ...@@ -912,7 +921,7 @@ private:
BST_StoreAttr* a_target = new BST_StoreAttr(); BST_StoreAttr* a_target = new BST_StoreAttr();
unmapExpr(val, &a_target->vreg_value); unmapExpr(val, &a_target->vreg_value);
unmapExpr(remapExpr(a->value), &a_target->vreg_target); unmapExpr(remapExpr(a->value), &a_target->vreg_target);
a_target->attr = scoping->mangleName(a->attr); a_target->index_attr = remapInternedString(scoping->mangleName(a->attr));
a_target->lineno = a->lineno; a_target->lineno = a->lineno;
push_back(a_target); push_back(a_target);
} else if (target->type == AST_TYPE::Tuple || target->type == AST_TYPE::List) { } else if (target->type == AST_TYPE::Tuple || target->type == AST_TYPE::List) {
...@@ -963,8 +972,8 @@ private: ...@@ -963,8 +972,8 @@ private:
auto* assign = new BST_StoreName(); auto* assign = new BST_StoreName();
unmapExpr(val, &assign->vreg_value); unmapExpr(val, &assign->vreg_value);
assign->lineno = val.lineno; assign->lineno = val.lineno;
assign->id = id; assign->index_id = remapInternedString(id);
fillScopingInfo(assign, scoping); fillScopingInfo(assign, id, scoping);
push_back(assign); push_back(assign);
} }
...@@ -989,7 +998,7 @@ private: ...@@ -989,7 +998,7 @@ private:
TmpValue remapAttribute(AST_Attribute* node) { TmpValue remapAttribute(AST_Attribute* node) {
BST_LoadAttr* rtn = new BST_LoadAttr(); BST_LoadAttr* rtn = new BST_LoadAttr();
rtn->lineno = node->lineno; rtn->lineno = node->lineno;
rtn->attr = scoping->mangleName(node->attr); rtn->index_attr = remapInternedString(scoping->mangleName(node->attr));
unmapExpr(remapExpr(node->value), &rtn->vreg_value); unmapExpr(remapExpr(node->value), &rtn->vreg_value);
return pushBackCreateDst(rtn); return pushBackCreateDst(rtn);
} }
...@@ -1077,7 +1086,7 @@ private: ...@@ -1077,7 +1086,7 @@ private:
if (node->func->type == AST_TYPE::Attribute) { if (node->func->type == AST_TYPE::Attribute) {
BST_CallAttr* rtn = BST_CallAttr::create(node->args.size(), node->keywords.size()); BST_CallAttr* rtn = BST_CallAttr::create(node->args.size(), node->keywords.size());
auto* attr = ast_cast<AST_Attribute>(node->func); auto* attr = ast_cast<AST_Attribute>(node->func);
rtn->attr = scoping->mangleName(attr->attr); rtn->index_attr = remapInternedString(scoping->mangleName(attr->attr));
unmapExpr(remapExpr(attr->value), &rtn->vreg_value); unmapExpr(remapExpr(attr->value), &rtn->vreg_value);
for (int i = 0; i < node->args.size(); ++i) { for (int i = 0; i < node->args.size(); ++i) {
unmapExpr(remapExpr(node->args[i]), &rtn->elts[i]); unmapExpr(remapExpr(node->args[i]), &rtn->elts[i]);
...@@ -1089,7 +1098,7 @@ private: ...@@ -1089,7 +1098,7 @@ private:
} else if (node->func->type == AST_TYPE::ClsAttribute) { } else if (node->func->type == AST_TYPE::ClsAttribute) {
BST_CallClsAttr* rtn = BST_CallClsAttr::create(node->args.size(), node->keywords.size()); BST_CallClsAttr* rtn = BST_CallClsAttr::create(node->args.size(), node->keywords.size());
auto* attr = ast_cast<AST_ClsAttribute>(node->func); auto* attr = ast_cast<AST_ClsAttribute>(node->func);
rtn->attr = scoping->mangleName(attr->attr); rtn->index_attr = remapInternedString(scoping->mangleName(attr->attr));
unmapExpr(remapExpr(attr->value), &rtn->vreg_value); unmapExpr(remapExpr(attr->value), &rtn->vreg_value);
for (int i = 0; i < node->args.size(); ++i) { for (int i = 0; i < node->args.size(); ++i) {
unmapExpr(remapExpr(node->args[i]), &rtn->elts[i]); unmapExpr(remapExpr(node->args[i]), &rtn->elts[i]);
...@@ -1129,7 +1138,7 @@ private: ...@@ -1129,7 +1138,7 @@ private:
BST_LoadAttr* rtn = new BST_LoadAttr(); BST_LoadAttr* rtn = new BST_LoadAttr();
rtn->clsonly = true; rtn->clsonly = true;
rtn->lineno = node->lineno; rtn->lineno = node->lineno;
rtn->attr = scoping->mangleName(node->attr); rtn->index_attr = remapInternedString(scoping->mangleName(node->attr));
unmapExpr(remapExpr(node->value), &rtn->vreg_value); unmapExpr(remapExpr(node->value), &rtn->vreg_value);
return pushBackCreateDst(rtn); return pushBackCreateDst(rtn);
} }
...@@ -1709,7 +1718,7 @@ public: ...@@ -1709,7 +1718,7 @@ public:
}; };
if (type == BST_TYPE::StoreName) { if (type == BST_TYPE::StoreName) {
if (bst_cast<BST_StoreName>(node)->id.s()[0] != '#') { if (code_constants.getInternedString(bst_cast<BST_StoreName>(node)->index_id).s()[0] != '#') {
curblock->push_back(node); curblock->push_back(node);
return; return;
} }
...@@ -1718,7 +1727,7 @@ public: ...@@ -1718,7 +1727,7 @@ public:
// Deleting temporary names is safe, since we only use it to represent kills. // Deleting temporary names is safe, since we only use it to represent kills.
if (node->type == BST_TYPE::DeleteName) { if (node->type == BST_TYPE::DeleteName) {
BST_DeleteName* del = bst_cast<BST_DeleteName>(node); BST_DeleteName* del = bst_cast<BST_DeleteName>(node);
if (del->id.s()[0] == '#') { if (code_constants.getInternedString(del->index_id).s()[0] == '#') {
curblock->push_back(node); curblock->push_back(node);
return; return;
} }
...@@ -1777,17 +1786,17 @@ public: ...@@ -1777,17 +1786,17 @@ public:
void pushStoreName(InternedString name, TmpValue value) { void pushStoreName(InternedString name, TmpValue value) {
BST_StoreName* store = new BST_StoreName(); BST_StoreName* store = new BST_StoreName();
store->id = name; store->index_id = remapInternedString(name);
unmapExpr(value, &store->vreg_value); unmapExpr(value, &store->vreg_value);
store->lineno = value.lineno; store->lineno = value.lineno;
fillScopingInfo(store, scoping); fillScopingInfo(store, name, scoping);
push_back(store); push_back(store);
} }
bool visit_classdef(AST_ClassDef* node) override { bool visit_classdef(AST_ClassDef* node) override {
auto def = BST_ClassDef::create(node->decorator_list.size()); auto def = BST_ClassDef::create(node->decorator_list.size());
def->lineno = node->lineno; def->lineno = node->lineno;
def->name = node->name; def->index_name = remapInternedString(node->name);
// Decorators are evaluated before bases: // Decorators are evaluated before bases:
for (int i = 0; i < node->decorator_list.size(); ++i) { for (int i = 0; i < node->decorator_list.size(); ++i) {
...@@ -1804,7 +1813,7 @@ public: ...@@ -1804,7 +1813,7 @@ public:
auto* code = cfgizer->runRecursively(node->body, node->name.getBox(), node->lineno, NULL, node); auto* code = cfgizer->runRecursively(node->body, node->name.getBox(), node->lineno, NULL, node);
auto mkclass = new BST_MakeClass(def, code_constants.addFuncOrClass(def, code)); auto mkclass = new BST_MakeClass(def, code_constants.addFuncOrClass(def, code));
auto tmp = pushBackCreateDst(mkclass); auto tmp = pushBackCreateDst(mkclass);
pushAssign(TmpValue(scoping->mangleName(def->name), node->lineno), tmp); pushAssign(TmpValue(scoping->mangleName(node->name), node->lineno), tmp);
return true; return true;
} }
...@@ -1812,7 +1821,7 @@ public: ...@@ -1812,7 +1821,7 @@ public:
bool visit_functiondef(AST_FunctionDef* node) override { bool visit_functiondef(AST_FunctionDef* node) override {
auto def = BST_FunctionDef::create(node->decorator_list.size(), node->args->defaults.size()); auto def = BST_FunctionDef::create(node->decorator_list.size(), node->args->defaults.size());
def->lineno = node->lineno; def->lineno = node->lineno;
def->name = node->name; def->index_name = remapInternedString(node->name);
// Decorators are evaluated before the defaults, so this *must* go before remapArguments(). // Decorators are evaluated before the defaults, so this *must* go before remapArguments().
// TODO(rntz): do we have a test for this // TODO(rntz): do we have a test for this
...@@ -1826,7 +1835,7 @@ public: ...@@ -1826,7 +1835,7 @@ public:
auto* code = cfgizer->runRecursively(node->body, node->name.getBox(), node->lineno, node->args, node); auto* code = cfgizer->runRecursively(node->body, node->name.getBox(), node->lineno, node->args, node);
auto mkfunc = new BST_MakeFunction(def, code_constants.addFuncOrClass(def, code)); auto mkfunc = new BST_MakeFunction(def, code_constants.addFuncOrClass(def, code));
auto tmp = pushBackCreateDst(mkfunc); auto tmp = pushBackCreateDst(mkfunc);
pushAssign(TmpValue(scoping->mangleName(def->name), node->lineno), tmp); pushAssign(TmpValue(scoping->mangleName(node->name), node->lineno), tmp);
return true; return true;
} }
...@@ -1885,7 +1894,8 @@ public: ...@@ -1885,7 +1894,8 @@ public:
auto* store = new BST_LoadAttr; auto* store = new BST_LoadAttr;
store->lineno = import->lineno; store->lineno = import->lineno;
store->attr = scoping->mangleName(internString(a->name.s().substr(l, r - l))); store->index_attr
= remapInternedString(scoping->mangleName(internString(a->name.s().substr(l, r - l))));
unmapExpr(tmpname, &store->vreg_value); unmapExpr(tmpname, &store->vreg_value);
unmapExpr(tmpname, &store->vreg_dst); unmapExpr(tmpname, &store->vreg_dst);
push_back(store); push_back(store);
...@@ -2095,7 +2105,7 @@ public: ...@@ -2095,7 +2105,7 @@ public:
BST_LoadAttr* a_lhs = new BST_LoadAttr(); BST_LoadAttr* a_lhs = new BST_LoadAttr();
unmapExpr(_dup(value_remapped), &a_lhs->vreg_value); unmapExpr(_dup(value_remapped), &a_lhs->vreg_value);
a_lhs->attr = scoping->mangleName(a->attr); a_lhs->index_attr = remapInternedString(scoping->mangleName(a->attr));
a_lhs->lineno = a->lineno; a_lhs->lineno = a->lineno;
TmpValue name_lhs = pushBackCreateDst(a_lhs); TmpValue name_lhs = pushBackCreateDst(a_lhs);
...@@ -2109,7 +2119,7 @@ public: ...@@ -2109,7 +2119,7 @@ public:
BST_StoreAttr* a_target = new BST_StoreAttr(); BST_StoreAttr* a_target = new BST_StoreAttr();
unmapExpr(node_name, &a_target->vreg_value); unmapExpr(node_name, &a_target->vreg_value);
unmapExpr(value_remapped, &a_target->vreg_target); unmapExpr(value_remapped, &a_target->vreg_target);
a_target->attr = a_lhs->attr; a_target->index_attr = a_lhs->index_attr;
a_target->lineno = a->lineno; a_target->lineno = a->lineno;
push_back(a_target); push_back(a_target);
...@@ -2156,7 +2166,7 @@ public: ...@@ -2156,7 +2166,7 @@ public:
auto* del = new BST_DeleteAttr; auto* del = new BST_DeleteAttr;
del->lineno = node->lineno; del->lineno = node->lineno;
unmapExpr(remapExpr(astattr->value), &del->vreg_value); unmapExpr(remapExpr(astattr->value), &del->vreg_value);
del->attr = scoping->mangleName(astattr->attr); del->index_attr = remapInternedString(scoping->mangleName(astattr->attr));
push_back(del); push_back(del);
break; break;
} }
...@@ -2164,8 +2174,8 @@ public: ...@@ -2164,8 +2174,8 @@ public:
AST_Name* s = static_cast<AST_Name*>(t); AST_Name* s = static_cast<AST_Name*>(t);
auto* del = new BST_DeleteName; auto* del = new BST_DeleteName;
del->lineno = node->lineno; del->lineno = node->lineno;
del->id = s->id; del->index_id = remapInternedString(s->id);
fillScopingInfo(del, scoping); fillScopingInfo(del, s->id, scoping);
push_back(del); push_back(del);
break; break;
} }
...@@ -2398,9 +2408,9 @@ public: ...@@ -2398,9 +2408,9 @@ public:
BST_stmt* makeKill(InternedString name) { BST_stmt* makeKill(InternedString name) {
// There might be a better way to represent this, maybe with a dedicated AST_Kill bytecode? // There might be a better way to represent this, maybe with a dedicated AST_Kill bytecode?
auto del = new BST_DeleteName(); auto del = new BST_DeleteName();
del->id = name; del->index_id = remapInternedString(name);
del->lineno = 0; del->lineno = 0;
fillScopingInfo(del, scoping); fillScopingInfo(del, name, scoping);
return del; return del;
} }
...@@ -2959,44 +2969,48 @@ public: ...@@ -2959,44 +2969,48 @@ public:
return sym_blocks_map[id].size() == 1; return sym_blocks_map[id].size() == 1;
} }
template <typename T> bool visit_nameHelper(T* node) { template <typename T> bool visit_nameHelper(T* node, InternedString id) {
if (node->vreg != VREG_UNDEFINED) if (node->vreg != VREG_UNDEFINED)
return true; return true;
ASSERT(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN, "%s", node->id.c_str()); ASSERT(node->lookup_type != ScopeInfo::VarScopeType::UNKNOWN, "%s", id.c_str());
if (node->lookup_type != ScopeInfo::VarScopeType::FAST && node->lookup_type != ScopeInfo::VarScopeType::CLOSURE) if (node->lookup_type != ScopeInfo::VarScopeType::FAST && node->lookup_type != ScopeInfo::VarScopeType::CLOSURE)
return true; return true;
if (step == TrackBlockUsage) { if (step == TrackBlockUsage) {
sym_blocks_map[node->id].insert(current_block); sym_blocks_map[id].insert(current_block);
return true; return true;
} else if (step == UserVisible) { } else if (step == UserVisible) {
if (node->id.isCompilerCreatedName()) if (id.isCompilerCreatedName())
return true; return true;
} else { } else {
bool is_block_local = node->lookup_type == ScopeInfo::VarScopeType::FAST bool is_block_local = node->lookup_type == ScopeInfo::VarScopeType::FAST && isNameUsedInSingleBlock(id);
&& isNameUsedInSingleBlock(node->id);
if (step == CrossBlock && is_block_local) if (step == CrossBlock && is_block_local)
return true; return true;
if (step == SingleBlockUse && !is_block_local) if (step == SingleBlockUse && !is_block_local)
return true; return true;
} }
node->vreg = assignVReg(node->id); node->vreg = assignVReg(id);
return true; return true;
} }
bool visit_loadname(BST_LoadName* node) override { bool visit_loadname(BST_LoadName* node) override {
visit_vreg(&node->vreg_dst, true); visit_vreg(&node->vreg_dst, true);
return visit_nameHelper(node); InternedString id = code_constants.getInternedString(node->index_id);
return visit_nameHelper(node, id);
} }
bool visit_storename(BST_StoreName* node) override { bool visit_storename(BST_StoreName* node) override {
visit_vreg(&node->vreg_value); visit_vreg(&node->vreg_value);
return visit_nameHelper(node); InternedString id = code_constants.getInternedString(node->index_id);
return visit_nameHelper(node, id);
} }
bool visit_deletename(BST_DeleteName* node) override { return visit_nameHelper(node); } bool visit_deletename(BST_DeleteName* node) override {
InternedString id = code_constants.getInternedString(node->index_id);
return visit_nameHelper(node, id);
}
int assignVReg(InternedString id) { int assignVReg(InternedString id) {
assert(id.s().size()); assert(id.s().size());
...@@ -3035,7 +3049,7 @@ void VRegInfo::assignVRegs(const CodeConstants& code_constants, CFG* cfg, const ...@@ -3035,7 +3049,7 @@ void VRegInfo::assignVRegs(const CodeConstants& code_constants, CFG* cfg, const
if (b == cfg->getStartingBlock()) { if (b == cfg->getStartingBlock()) {
for (auto* name : param_names.allArgsAsName()) { for (auto* name : param_names.allArgsAsName()) {
visitor.visit_nameHelper(name); visitor.visit_nameHelper(name, name->id);
} }
} }
...@@ -3084,11 +3098,12 @@ static std::pair<CFG*, CodeConstants> computeCFG(llvm::ArrayRef<AST_stmt*> body, ...@@ -3084,11 +3098,12 @@ static std::pair<CFG*, CodeConstants> computeCFG(llvm::ArrayRef<AST_stmt*> body,
bool skip_first = false; bool skip_first = false;
if (ast_type == AST_TYPE::ClassDef) { if (ast_type == AST_TYPE::ClassDef) {
InternedString id = stringpool.get("__name__");
// A classdef always starts with "__module__ = __name__" // A classdef always starts with "__module__ = __name__"
auto module_name_value = new BST_LoadName; auto module_name_value = new BST_LoadName;
module_name_value->lineno = lineno; module_name_value->lineno = lineno;
module_name_value->id = stringpool.get("__name__"); module_name_value->index_id = visitor.remapInternedString(id);
fillScopingInfo(module_name_value, scoping); fillScopingInfo(module_name_value, id, scoping);
TmpValue module_name = visitor.pushBackCreateDst(module_name_value); TmpValue module_name = visitor.pushBackCreateDst(module_name_value);
visitor.pushStoreName(stringpool.get("__module__"), module_name); visitor.pushStoreName(stringpool.get("__module__"), module_name);
...@@ -3118,9 +3133,9 @@ static std::pair<CFG*, CodeConstants> computeCFG(llvm::ArrayRef<AST_stmt*> body, ...@@ -3118,9 +3133,9 @@ static std::pair<CFG*, CodeConstants> computeCFG(llvm::ArrayRef<AST_stmt*> body,
assert(scoping->getScopeTypeOfName(arg_name) == ScopeInfo::VarScopeType::FAST); assert(scoping->getScopeTypeOfName(arg_name) == ScopeInfo::VarScopeType::FAST);
auto load = new BST_LoadName(); auto load = new BST_LoadName();
load->id = stringpool.get("." + std::to_string(counter)); load->index_id = visitor.remapInternedString(arg_name);
load->lineno = arg_expr->lineno; load->lineno = arg_expr->lineno;
fillScopingInfo(load, scoping); fillScopingInfo(load, arg_name, scoping);
TmpValue val = visitor.pushBackCreateDst(load); TmpValue val = visitor.pushBackCreateDst(load);
visitor.pushAssign(arg_expr, val); visitor.pushAssign(arg_expr, val);
......
...@@ -86,6 +86,14 @@ public: ...@@ -86,6 +86,14 @@ public:
bool isCompilerCreatedName() const; bool isCompilerCreatedName() const;
static InternedString unsafe(BoxedString* str) {
#ifndef NDEBUG
return InternedString(str, NULL);
#else
return InternedString(str);
#endif
}
friend class InternedStringPool; friend class InternedStringPool;
friend struct std::hash<InternedString>; friend struct std::hash<InternedString>;
friend struct std::less<InternedString>; friend struct std::less<InternedString>;
......
...@@ -1099,12 +1099,15 @@ public: ...@@ -1099,12 +1099,15 @@ public:
BORROWED(Box*) getConstant(int vreg) const { return constants[-(vreg + 1)]; } BORROWED(Box*) getConstant(int vreg) const { return constants[-(vreg + 1)]; }
InternedString getInternedString(int vreg) const { return InternedString::unsafe((BoxedString*)getConstant(vreg)); }
// returns the vreg num for the constant (which is a negative number) // returns the vreg num for the constant (which is a negative number)
int createVRegEntryForConstant(Box* o) { int createVRegEntryForConstant(Box* o) {
constants.push_back(o); constants.push_back(o);
return -constants.size(); return -constants.size();
} }
void addOwnedRef(Box* o) const { owned_refs.emplace_back(o); } void addOwnedRef(Box* o) const { owned_refs.emplace_back(o); }
BORROWED(BoxedInt*) getIntConstant(int64_t n) const; BORROWED(BoxedInt*) getIntConstant(int64_t n) const;
...@@ -1113,6 +1116,9 @@ public: ...@@ -1113,6 +1116,9 @@ public:
std::pair<BST_stmt*, BORROWED(BoxedCode*)> getFuncOrClass(int constant) const { std::pair<BST_stmt*, BORROWED(BoxedCode*)> getFuncOrClass(int constant) const {
return funcs_and_classes[constant]; return funcs_and_classes[constant];
} }
int addInternedString(InternedString s) { return createVRegEntryForConstant(s.getBox()); }
int addFuncOrClass(BST_stmt* stmt, STOLEN(BoxedCode*) code) { int addFuncOrClass(BST_stmt* stmt, STOLEN(BoxedCode*) code) {
funcs_and_classes.emplace_back(stmt, code); funcs_and_classes.emplace_back(stmt, code);
return funcs_and_classes.size() - 1; return funcs_and_classes.size() - 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment