From cdbfd5e9303cd84342a08333e19137fe814bc851 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 23 Jan 2013 10:22:52 +0100 Subject: [PATCH] Method signature changes to remove duplicate logic. Change-Id: Ib4a17dd90629a71f1ee2daa442e49d2237b1073d Reviewed-by: Lars Knoll --- moth/qv4isel_moth.cpp | 38 ++++++++++++++------------------------ moth/qv4isel_moth_p.h | 8 ++++---- qv4isel_llvm.cpp | 8 ++++---- qv4isel_llvm_p.h | 8 ++++---- qv4isel_masm.cpp | 42 ++++++++++++++++++------------------------ qv4isel_masm_p.h | 8 ++++---- qv4isel_p.cpp | 24 ++++++++++++------------ qv4isel_p.h | 8 ++++---- 8 files changed, 64 insertions(+), 80 deletions(-) diff --git a/moth/qv4isel_moth.cpp b/moth/qv4isel_moth.cpp index 1a7c8d1..aef7d41 100644 --- a/moth/qv4isel_moth.cpp +++ b/moth/qv4isel_moth.cpp @@ -329,28 +329,22 @@ void InstructionSelection::run(VM::Function *vmFunction, IR::Function *function) delete[] codeStart; } -void InstructionSelection::callValue(IR::Call *c, IR::Temp *result) +void InstructionSelection::callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) { - IR::Temp *t = c->base->asTemp(); - Q_ASSERT(t); - Instruction::CallValue call; - prepareCallArgs(c->args, call.argc, call.args); - call.destIndex = t->index; + prepareCallArgs(args, call.argc, call.args); + call.destIndex = value->index; call.targetTempIndex = result ? result->index : scratchTempIndex(); addInstruction(call); } -void InstructionSelection::callProperty(IR::Call *c, IR::Temp *result) +void InstructionSelection::callProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) { - IR::Member *m = c->base->asMember(); - Q_ASSERT(m); - // call the property on the loaded base Instruction::CallProperty call; - call.baseTemp = m->base->asTemp()->index; - call.name = engine()->newString(*m->name); - prepareCallArgs(c->args, call.argc, call.args); + call.baseTemp = base->index; + call.name = engine()->newString(name); + prepareCallArgs(args, call.argc, call.args); call.targetTempIndex = result ? result->index : scratchTempIndex(); addInstruction(call); } @@ -366,25 +360,21 @@ void InstructionSelection::constructActivationProperty(IR::Name *func, addInstruction(create); } -void InstructionSelection::constructProperty(IR::New *call, IR::Temp *result) +void InstructionSelection::constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) { - IR::Member *member = call->base->asMember(); - assert(member != 0); - assert(member->base->asTemp() != 0); - Instruction::CreateProperty create; - create.base = member->base->asTemp()->index; - create.name = engine()->newString(*member->name); - prepareCallArgs(call->args, create.argc, create.args); + create.base = base->index; + create.name = engine()->newString(name); + prepareCallArgs(args, create.argc, create.args); create.targetTempIndex = result->index; addInstruction(create); } -void InstructionSelection::constructValue(IR::New *call, IR::Temp *result) +void InstructionSelection::constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) { Instruction::CreateValue create; - create.func = call->base->asTemp()->index; - prepareCallArgs(call->args, create.argc, create.args); + create.func = value->index; + prepareCallArgs(args, create.argc, create.args); create.targetTempIndex = result->index; addInstruction(create); } diff --git a/moth/qv4isel_moth_p.h b/moth/qv4isel_moth_p.h index 0350033..6cac936 100644 --- a/moth/qv4isel_moth_p.h +++ b/moth/qv4isel_moth_p.h @@ -45,11 +45,11 @@ protected: virtual void callBuiltinDeclareVar(bool deletable, const QString &name); virtual void callBuiltinDefineGetterSetter(IR::Temp *object, const QString &name, IR::Temp *getter, IR::Temp *setter); virtual void callBuiltinDefineProperty(IR::Temp *object, const QString &name, IR::Temp *value); - virtual void callValue(IR::Call *c, IR::Temp *result); - virtual void callProperty(IR::Call *c, IR::Temp *result); + virtual void callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result); + virtual void callProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result); virtual void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Temp *result); - virtual void constructProperty(IR::New *call, IR::Temp *result); - virtual void constructValue(IR::New *call, IR::Temp *result); + virtual void constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result); + virtual void constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result); virtual void loadThisObject(IR::Temp *temp); virtual void loadConst(IR::Const *sourceConst, IR::Temp *targetTemp); virtual void loadString(const QString &str, IR::Temp *targetTemp); diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp index a4a20a5..79458be 100644 --- a/qv4isel_llvm.cpp +++ b/qv4isel_llvm.cpp @@ -448,14 +448,14 @@ void InstructionSelection::callBuiltinDefineProperty(IR::Temp *object, const QSt Q_UNREACHABLE(); } -void InstructionSelection::callValue(IR::Call *c, IR::Temp *temp) +void InstructionSelection::callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) { // TODO assert(!"TODO!"); Q_UNREACHABLE(); } -void InstructionSelection::callProperty(IR::Call *c, IR::Temp *temp) +void InstructionSelection::callProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) { // TODO assert(!"TODO!"); @@ -471,14 +471,14 @@ void InstructionSelection::constructActivationProperty(IR::Name *func, Q_UNREACHABLE(); } -void InstructionSelection::constructProperty(IR::New *call, IR::Temp *result) +void InstructionSelection::constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) { // TODO assert(!"TODO!"); Q_UNREACHABLE(); } -void InstructionSelection::constructValue(IR::New *call, IR::Temp *result) +void InstructionSelection::constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) { // TODO assert(!"TODO!"); diff --git a/qv4isel_llvm_p.h b/qv4isel_llvm_p.h index 777bfcd..78e54b6 100644 --- a/qv4isel_llvm_p.h +++ b/qv4isel_llvm_p.h @@ -91,11 +91,11 @@ public: // methods from InstructionSelection: virtual void callBuiltinDeclareVar(bool deletable, const QString &name); virtual void callBuiltinDefineGetterSetter(IR::Temp *object, const QString &name, IR::Temp *getter, IR::Temp *setter); virtual void callBuiltinDefineProperty(IR::Temp *object, const QString &name, IR::Temp *value); - virtual void callValue(IR::Call *c, IR::Temp *temp); - virtual void callProperty(IR::Call *c, IR::Temp *temp); + virtual void callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result); + virtual void callProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result); virtual void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Temp *result); - virtual void constructProperty(IR::New *call, IR::Temp *result); - virtual void constructValue(IR::New *call, IR::Temp *result); + virtual void constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result); + virtual void constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result); virtual void loadThisObject(IR::Temp *temp); virtual void loadConst(IR::Const *con, IR::Temp *temp); virtual void loadString(const QString &str, IR::Temp *targetTemp); diff --git a/qv4isel_masm.cpp b/qv4isel_masm.cpp index 085706b..3aead74 100644 --- a/qv4isel_masm.cpp +++ b/qv4isel_masm.cpp @@ -543,14 +543,11 @@ void InstructionSelection::callBuiltinDefineProperty(IR::Temp *object, const QSt object, identifier(name), value, Assembler::ContextRegister); } -void InstructionSelection::callValue(IR::Call *call, IR::Temp *result) +void InstructionSelection::callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) { - IR::Temp *baseTemp = call->base->asTemp(); - assert(baseTemp != 0); - - int argc = prepareVariableArguments(call->args); + int argc = prepareVariableArguments(args); IR::Temp* thisObject = 0; - generateFunctionCall(result, __qmljs_call_value, Assembler::ContextRegister, thisObject, baseTemp, baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); + generateFunctionCall(result, __qmljs_call_value, Assembler::ContextRegister, thisObject, value, baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); } void InstructionSelection::loadThisObject(IR::Temp *temp) @@ -726,14 +723,16 @@ void InstructionSelection::inplaceMemberOp(IR::AluOp oper, IR::Expr *source, IR: } } -void InstructionSelection::callProperty(IR::Call *call, IR::Temp *result) +void InstructionSelection::callProperty(IR::Temp *base, const QString &name, + IR::ExprList *args, IR::Temp *result) { - IR::Member *member = call->base->asMember(); - assert(member != 0); - assert(member->base->asTemp() != 0); + assert(base != 0); - int argc = prepareVariableArguments(call->args); - generateFunctionCall(result, __qmljs_call_property, Assembler::ContextRegister, member->base->asTemp(), identifier(*member->name), baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); + int argc = prepareVariableArguments(args); + generateFunctionCall(result, __qmljs_call_property, + Assembler::ContextRegister, base, identifier(name), + baseAddressForCallArguments(), + Assembler::TrustedImm32(argc)); } String *InstructionSelection::identifier(const QString &s) @@ -748,23 +747,18 @@ void InstructionSelection::constructActivationProperty(IR::Name *func, IR::ExprL callRuntimeMethod(result, __qmljs_construct_activation_property, func, args); } -void InstructionSelection::constructProperty(IR::New *call, IR::Temp *result) +void InstructionSelection::constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) { - IR::Member *member = call->base->asMember(); - assert(member != 0); - assert(member->base->asTemp() != 0); - - int argc = prepareVariableArguments(call->args); - generateFunctionCall(result, __qmljs_construct_property, Assembler::ContextRegister, member->base->asTemp(), identifier(*member->name), baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); + int argc = prepareVariableArguments(args); + generateFunctionCall(result, __qmljs_construct_property, Assembler::ContextRegister, base, identifier(name), baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); } -void InstructionSelection::constructValue(IR::New *call, IR::Temp *result) +void InstructionSelection::constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) { - IR::Temp *baseTemp = call->base->asTemp(); - assert(baseTemp != 0); + assert(value != 0); - int argc = prepareVariableArguments(call->args); - generateFunctionCall(result, __qmljs_construct_value, Assembler::ContextRegister, baseTemp, baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); + int argc = prepareVariableArguments(args); + generateFunctionCall(result, __qmljs_construct_value, Assembler::ContextRegister, value, baseAddressForCallArguments(), Assembler::TrustedImm32(argc)); } void InstructionSelection::visitJump(IR::Jump *s) diff --git a/qv4isel_masm_p.h b/qv4isel_masm_p.h index 192439b..3d18036 100644 --- a/qv4isel_masm_p.h +++ b/qv4isel_masm_p.h @@ -673,8 +673,8 @@ protected: virtual void callBuiltinDeclareVar(bool deletable, const QString &name); virtual void callBuiltinDefineGetterSetter(IR::Temp *object, const QString &name, IR::Temp *getter, IR::Temp *setter); virtual void callBuiltinDefineProperty(IR::Temp *object, const QString &name, IR::Temp *value); - virtual void callProperty(IR::Call *call, IR::Temp *result); - virtual void callValue(IR::Call *call, IR::Temp *result); + virtual void callProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result); + virtual void callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result); virtual void loadThisObject(IR::Temp *temp); virtual void loadConst(IR::Const *sourceConst, IR::Temp *targetTemp); virtual void loadString(const QString &str, IR::Temp *targetTemp); @@ -723,8 +723,8 @@ protected: VM::String *identifier(const QString &s); virtual void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Temp *result); - virtual void constructProperty(IR::New *ctor, IR::Temp *result); - virtual void constructValue(IR::New *call, IR::Temp *result); + virtual void constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result); + virtual void constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result); virtual void visitJump(IR::Jump *); virtual void visitCJump(IR::CJump *); diff --git a/qv4isel_p.cpp b/qv4isel_p.cpp index 28c35b0..9a694ae 100644 --- a/qv4isel_p.cpp +++ b/qv4isel_p.cpp @@ -102,11 +102,11 @@ void InstructionSelection::visitMove(IR::Move *s) if (Name *func = ctor->base->asName()) { constructActivationProperty(func, ctor->args, t); return; - } else if (ctor->base->asMember()) { - constructProperty(ctor, t); + } else if (IR::Member *member = ctor->base->asMember()) { + constructProperty(member->base->asTemp(), *member->name, ctor->args, t); return; - } else if (ctor->base->asTemp()) { - constructValue(ctor, t); + } else if (IR::Temp *value = ctor->base->asTemp()) { + constructValue(value, ctor->args, t); return; } } else if (IR::Member *m = s->source->asMember()) { @@ -132,11 +132,11 @@ void InstructionSelection::visitMove(IR::Move *s) if (c->base->asName()) { callBuiltin(c, t); return; - } else if (c->base->asMember()) { - callProperty(c, t); + } else if (Member *member = c->base->asMember()) { + callProperty(member->base, *member->name, c->args, t); return; - } else if (c->base->asTemp()) { - callValue(c, t); + } else if (IR::Temp *value = c->base->asTemp()) { + callValue(value, c->args, t); return; } } @@ -206,10 +206,10 @@ void InstructionSelection::visitExp(IR::Exp *s) // These are calls where the result is ignored. if (c->base->asName()) { callBuiltin(c, 0); - } else if (c->base->asTemp()) { - callValue(c, 0); - } else if (c->base->asMember()) { - callProperty(c, 0); + } else if (Temp *value = c->base->asTemp()) { + callValue(value, c->args, 0); + } else if (Member *member = c->base->asMember()) { + callProperty(member->base, *member->name, c->args, 0); } else { Q_UNIMPLEMENTED(); } diff --git a/qv4isel_p.h b/qv4isel_p.h index ca5eb69..8181853 100644 --- a/qv4isel_p.h +++ b/qv4isel_p.h @@ -101,11 +101,11 @@ public: // to implement by subclasses: virtual void callBuiltinDeclareVar(bool deletable, const QString &name) = 0; virtual void callBuiltinDefineGetterSetter(IR::Temp *object, const QString &name, IR::Temp *getter, IR::Temp *setter) = 0; virtual void callBuiltinDefineProperty(IR::Temp *object, const QString &name, IR::Temp *value) = 0; - virtual void callValue(IR::Call *c, IR::Temp *temp) = 0; - virtual void callProperty(IR::Call *c, IR::Temp *temp) = 0; + virtual void callValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) = 0; + virtual void callProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) = 0; virtual void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Temp *result) = 0; - virtual void constructProperty(IR::New *ctor, IR::Temp *result) = 0; - virtual void constructValue(IR::New *call, IR::Temp *result) = 0; + virtual void constructProperty(IR::Temp *base, const QString &name, IR::ExprList *args, IR::Temp *result) = 0; + virtual void constructValue(IR::Temp *value, IR::ExprList *args, IR::Temp *result) = 0; virtual void loadThisObject(IR::Temp *temp) = 0; virtual void loadConst(IR::Const *sourceConst, IR::Temp *targetTemp) = 0; virtual void loadString(const QString &str, IR::Temp *targetTemp) = 0; -- 2.7.4