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:
parent
743249b409
commit
630d2928b7
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue