moth: add builtin_define_getter_setter and builtin_define_property.

Change-Id: Iffd8c79dbc99f9563235b440fa18e446cedabf0c
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Erik Verbruggen 2013-01-08 16:09:48 +01:00 committed by Lars Knoll
parent 743249b409
commit 630d2928b7
3 changed files with 58 additions and 0 deletions

View File

@ -28,6 +28,8 @@
F(CallBuiltinTypeofName, callBuiltinTypeofName) \
F(CallBuiltinTypeofValue, callBuiltinTypeofValue) \
F(CallBuiltinDeclareVar, callBuiltinDeclareVar) \
F(CallBuiltinDefineGetterSetter, callBuiltinDefineGetterSetter) \
F(CallBuiltinDefineProperty, callBuiltinDefineProperty) \
F(CreateValue, createValue) \
F(CreateProperty, createProperty) \
F(CreateActivationProperty, createActivationProperty) \
@ -215,6 +217,19 @@ union Instr
bool isDeletable;
VM::String *varName;
};
struct instr_callBuiltinDefineGetterSetter {
MOTH_INSTR_HEADER
int objectTemp;
VM::String *name;
int getterTemp;
int setterTemp;
};
struct instr_callBuiltinDefineProperty {
MOTH_INSTR_HEADER
int objectTemp;
VM::String *name;
int valueTemp;
};
struct instr_createValue {
MOTH_INSTR_HEADER
int func;
@ -313,6 +328,8 @@ union Instr
instr_callBuiltinTypeofName callBuiltinTypeofName;
instr_callBuiltinTypeofValue callBuiltinTypeofValue;
instr_callBuiltinDeclareVar callBuiltinDeclareVar;
instr_callBuiltinDefineGetterSetter callBuiltinDefineGetterSetter;
instr_callBuiltinDefineProperty callBuiltinDefineProperty;
instr_createValue createValue;
instr_createProperty createProperty;
instr_createActivationProperty createActivationProperty;

View File

@ -426,6 +426,39 @@ void InstructionSelection::callActivationProperty(IR::Call *c, int targetTempInd
}
} break;
case IR::Name::builtin_define_getter_setter: {
if (!c->args)
return;
IR::ExprList *args = c->args;
Instruction::CallBuiltinDefineGetterSetter call;
call.objectTemp = args->expr->asTemp()->index;
args = args->next;
assert(args);
call.name = engine()->newString(*args->expr->asName()->id);
args = args->next;
assert(args);
call.getterTemp = args->expr->asTemp()->index;
args = args->next;
assert(args);
call.setterTemp = args->expr->asTemp()->index;
addInstruction(call);
} break;
case IR::Name::builtin_define_property: {
if (!c->args)
return;
IR::ExprList *args = c->args;
Instruction::CallBuiltinDefineProperty call;
call.objectTemp = args->expr->asTemp()->index;
args = args->next;
assert(args);
call.name = engine()->newString(*args->expr->asName()->id);
args = args->next;
assert(args);
call.valueTemp = args->expr->asTemp()->index;
addInstruction(call);
} break;
default:
Q_UNIMPLEMENTED();
c->dump(qout); qout << endl;

View File

@ -319,6 +319,14 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co
__qmljs_builtin_declare_var(context, instr.isDeletable, instr.varName);
MOTH_END_INSTR(CallBuiltinDeleteValue)
MOTH_BEGIN_INSTR(CallBuiltinDefineGetterSetter)
__qmljs_builtin_define_getter_setter(TEMP(instr.objectTemp), instr.name, TEMP(instr.getterTemp), TEMP(instr.setterTemp), context);
MOTH_END_INSTR(CallBuiltinDefineGetterSetter)
MOTH_BEGIN_INSTR(CallBuiltinDefineProperty)
__qmljs_builtin_define_property(TEMP(instr.objectTemp), instr.name, TEMP(instr.valueTemp), context);
MOTH_END_INSTR(CallBuiltinDefineProperty)
MOTH_BEGIN_INSTR(CreateValue)
quint32 argStart = instr.args - context->variableCount();
VM::Value *args = stack + argStart;