Skip to content

Commit

Permalink
codesynt: early resolution for multinames
Browse files Browse the repository at this point in the history
If a multiname does not depend on runtime date, resolve it once
and save the pointer.
  • Loading branch information
mgehre committed Oct 26, 2011
1 parent 1367b0a commit 16eb7fb
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 37 deletions.
4 changes: 2 additions & 2 deletions src/scripting/abc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,9 +508,9 @@ multiname* ABCContext::getMultiname(unsigned int n, call_context* context)
* must be provided if getMultinameRTData(midx) returns 2.
* This is a helper used by codesynt.
*/
multiname* ABCContext::s_getMultiname(call_context* th, ASObject* n, ASObject* n2, int midx)
multiname* ABCContext::s_getMultiname(ABCContext* th, ASObject* n, ASObject* n2, int midx)
{
return th->context->getMultinameImpl(n,n2,midx);
return th->getMultinameImpl(n,n2,midx);
}

/*
Expand Down
7 changes: 3 additions & 4 deletions src/scripting/abc.h
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ struct opcode_handler
enum ARGS_TYPE { ARGS_OBJ_OBJ=0, ARGS_OBJ_INT, ARGS_OBJ, ARGS_INT, ARGS_OBJ_OBJ_INT, ARGS_NUMBER, ARGS_OBJ_NUMBER,
ARGS_BOOL, ARGS_INT_OBJ, ARGS_NONE, ARGS_NUMBER_OBJ, ARGS_INT_INT, ARGS_CONTEXT, ARGS_CONTEXT_INT, ARGS_CONTEXT_INT_INT,
ARGS_CONTEXT_INT_INT_INT, ARGS_CONTEXT_INT_INT_INT_BOOL, ARGS_CONTEXT_OBJ_OBJ_INT, ARGS_CONTEXT_OBJ, ARGS_CONTEXT_OBJ_OBJ,
ARGS_CONTEXT_OBJ_OBJ_OBJ };
ARGS_CONTEXT_OBJ_OBJ_OBJ, ARGS_OBJ_OBJ_OBJ_INT };

struct typed_opcode_handler
{
Expand All @@ -380,15 +380,14 @@ class ABCContext
{
friend class ABCVm;
friend class method_info;
private:
public:
method_info* get_method(unsigned int m);
const tiny_string& getString(unsigned int s) const;
//Qname getQname(unsigned int m, call_context* th=NULL) const;
static multiname* s_getMultiname(call_context*, ASObject* rt1, ASObject* rt2, int m);
static multiname* s_getMultiname(ABCContext*, ASObject* rt1, ASObject* rt2, int m);
static multiname* s_getMultiname_i(call_context*, uint32_t i , int m);
static multiname* s_getMultiname_d(call_context*, number_t i , int m);
ASObject* getConstant(int kind, int index);
public:
u16 minor;
u16 major;
cpool_info constant_pool;
Expand Down
75 changes: 44 additions & 31 deletions src/scripting/abc_codesynt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ typed_opcode_handler ABCVm::opcode_table_voidptr[]={
{"getGlobalScope",(void*)&ABCVm::getGlobalScope,ARGS_CONTEXT},
{"findPropStrict",(void*)&ABCVm::findPropStrict,ARGS_CONTEXT_OBJ},
{"findProperty",(void*)&ABCVm::findProperty,ARGS_CONTEXT_OBJ},
{"getMultiname",(void*)&ABCContext::s_getMultiname,ARGS_CONTEXT_OBJ_OBJ_INT},
{"getMultiname",(void*)&ABCContext::s_getMultiname,ARGS_OBJ_OBJ_OBJ_INT},
{"typeOf",(void*)ABCVm::typeOf,ARGS_OBJ},
{"coerce_s",(void*)&ABCVm::coerce_s,ARGS_OBJ},
{"checkfilter",(void*)&ABCVm::checkfilter,ARGS_OBJ},
Expand Down Expand Up @@ -337,6 +337,12 @@ void ABCVm::register_table(const llvm::Type* ret_type,typed_opcode_handler* tabl
sig_obj_obj_int.push_back(voidptr_type);
sig_obj_obj_int.push_back(int_type);

vector<const llvm::Type*> sig_obj_obj_obj_int;
sig_obj_obj_obj_int.push_back(voidptr_type);
sig_obj_obj_obj_int.push_back(voidptr_type);
sig_obj_obj_obj_int.push_back(voidptr_type);
sig_obj_obj_obj_int.push_back(int_type);

vector<const llvm::Type*> sig_number_obj;
sig_number_obj.push_back(number_type);
sig_number_obj.push_back(voidptr_type);
Expand Down Expand Up @@ -426,6 +432,9 @@ void ABCVm::register_table(const llvm::Type* ret_type,typed_opcode_handler* tabl
case ARGS_OBJ_OBJ_INT:
FT=llvm::FunctionType::get(ret_type, sig_obj_obj_int, false);
break;
case ARGS_OBJ_OBJ_OBJ_INT:
FT=llvm::FunctionType::get(ret_type, sig_obj_obj_obj_int, false);
break;
case ARGS_NUMBER_OBJ:
FT=llvm::FunctionType::get(ret_type, sig_number_obj, false);
break;
Expand Down Expand Up @@ -691,42 +700,46 @@ void method_info::consumeStackForRTMultiname(static_stack_types_vector& stack, i
/* Adds instructions to the builder to resolve the given multiname */
inline llvm::Value* getMultiname(llvm::ExecutionEngine* ex,llvm::IRBuilder<>& Builder, vector<stack_entry>& static_stack,
llvm::Value* dynamic_stack,llvm::Value* dynamic_stack_index,
llvm::Value* context, ABCContext* abccontext, int multinameIndex)
ABCContext* abccontext, int multinameIndex)
{
llvm::Value* mindx = llvm::ConstantInt::get(int_type, multinameIndex);
int rtdata=abccontext->getMultinameRTData(multinameIndex);
llvm::Value* name;
//HACK: we need to reinterpret the pointer to the generic type
//llvm::Value* reint_context=Builder.CreateBitCast(context,voidptr_type);
llvm::Value* constnull = llvm::ConstantExpr::getIntToPtr(llvm::ConstantInt::get(int_type, 0), voidptr_type);
if(rtdata==0)
{
name = Builder.CreateCall4(ex->FindFunctionNamed("getMultiname"), context, constnull, constnull, mindx);
//Multinames without runtime date persist
multiname* mname = ABCContext::s_getMultiname(abccontext,NULL,NULL,multinameIndex);
name = llvm::ConstantExpr::getIntToPtr(llvm::ConstantInt::get(ptr_type, (intptr_t)mname),voidptr_type);
}
else if(rtdata==1)
else
{
stack_entry rt1=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
llvm::Value* context = llvm::ConstantExpr::getIntToPtr(llvm::ConstantInt::get(ptr_type, (intptr_t)abccontext), voidptr_type);
llvm::Value* mindx = llvm::ConstantInt::get(int_type, multinameIndex);
if(rtdata==1)
{
llvm::Value* constnull = llvm::ConstantExpr::getIntToPtr(llvm::ConstantInt::get(int_type, 0), voidptr_type);
stack_entry rt1=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);

/*if(rt1.second==STACK_INT)
name = Builder.CreateCall3(ex->FindFunctionNamed("getMultiname_i"), context, rt1.first, mindx);
else if(rt1.second==STACK_NUMBER)
name = Builder.CreateCall3(ex->FindFunctionNamed("getMultiname_d"), context, rt1.first, mindx);
else*/
/*if(rt1.second==STACK_INT) //TODO: for them, first parameter is call_context, not ABCContext
name = Builder.CreateCall3(ex->FindFunctionNamed("getMultiname_i"), context, rt1.first, mindx);
else if(rt1.second==STACK_NUMBER)
name = Builder.CreateCall3(ex->FindFunctionNamed("getMultiname_d"), context, rt1.first, mindx);
else*/
{
abstract_value(ex,Builder,rt1);
name = Builder.CreateCall4(ex->FindFunctionNamed("getMultiname"), context, rt1.first, constnull, mindx);
}
}
else if(rtdata==2)
{
stack_entry rt1=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
stack_entry rt2=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
abstract_value(ex,Builder,rt1);
name = Builder.CreateCall4(ex->FindFunctionNamed("getMultiname"), context, rt1.first, constnull, mindx);
abstract_value(ex,Builder,rt2);
name = Builder.CreateCall4(ex->FindFunctionNamed("getMultiname"), context, rt1.first, rt2.first, mindx);
}
else
assert(false);
}
else if(rtdata==2)
{
stack_entry rt1=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
stack_entry rt2=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
abstract_value(ex,Builder,rt1);
abstract_value(ex,Builder,rt2);
name = Builder.CreateCall4(ex->FindFunctionNamed("getMultiname"), context, rt1.first, rt2.first, mindx);
}
else
assert(false);
return name;
}

Expand Down Expand Up @@ -3114,7 +3127,7 @@ SyntheticFunction::synt_function method_info::synt_method()
LOG(LOG_TRACE, _("synt findpropstrict") );
u30 t;
code >> t;
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,context,this->context,t);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,this->context,t);
value=Builder.CreateCall2(ex->FindFunctionNamed("findPropStrict"), context, name);
static_stack_push(static_stack,stack_entry(value,STACK_OBJECT));
break;
Expand All @@ -3125,7 +3138,7 @@ SyntheticFunction::synt_function method_info::synt_method()
LOG(LOG_TRACE, _("synt findproperty") );
u30 t;
code >> t;
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,context,this->context,t);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,this->context,t);
value=Builder.CreateCall2(ex->FindFunctionNamed("findProperty"), context, name);
static_stack_push(static_stack,stack_entry(value,STACK_OBJECT));
break;
Expand All @@ -3148,7 +3161,7 @@ SyntheticFunction::synt_function method_info::synt_method()
u30 t;
code >> t;
stack_entry value=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,context,this->context,t);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,this->context,t);
stack_entry obj=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
if(value.second==STACK_INT)
Builder.CreateCall3(ex->FindFunctionNamed("setProperty_i"),value.first, obj.first, name);
Expand Down Expand Up @@ -3232,7 +3245,7 @@ SyntheticFunction::synt_function method_info::synt_method()
LOG(LOG_TRACE, _("synt getproperty") );
u30 t;
code >> t;
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,context,this->context,t);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,this->context,t);

stack_entry obj=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
abstract_value(ex,Builder,obj);
Expand Down Expand Up @@ -3262,7 +3275,7 @@ SyntheticFunction::synt_function method_info::synt_method()
u30 t;
code >> t;
stack_entry val=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,context,this->context,t);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,this->context,t);
stack_entry obj=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
Builder.CreateCall4(ex->FindFunctionNamed("initProperty"), context, obj.first, val.first, name);
break;
Expand All @@ -3273,7 +3286,7 @@ SyntheticFunction::synt_function method_info::synt_method()
LOG(LOG_TRACE, _("synt deleteproperty") );
u30 t;
code >> t;
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,context,this->context,t);
llvm::Value* name = getMultiname(ex,Builder,static_stack,dynamic_stack,dynamic_stack_index,this->context,t);
stack_entry v=static_stack_pop(Builder,static_stack,dynamic_stack,dynamic_stack_index);
abstract_value(ex,Builder,v);
Builder.CreateCall3(ex->FindFunctionNamed("deleteProperty"), context, v.first, name);
Expand Down

0 comments on commit 16eb7fb

Please sign in to comment.