diff options
author | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2014-11-12 16:07:56 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-11-21 13:08:28 +0100 |
commit | f58b5229a31e9fec49b4eb055c56f9a78e423866 (patch) | |
tree | 6214fb89929fd9482c2154b0fe17c7cba0f509cb /src/qml/jit | |
parent | e6db292366fa6ad25536fee08b2a972ea617d968 (diff) |
Fix run-time string handling with regards to the new heap
Changed runtimeStrings to be an array of Heap::String pointers instead of
indirect String pointers. Later that member along with other GC related members
will go into a managed subclass. Meanwhile the generated code no more loads
String pointers directly but just passes the index into the run-time strings to
the run-time functions, which in turn will load the heap string into a scoped
string.
Also replaced the template<T> Value::operator=(T *m) with a non-template
overload that takes a Managed *, in order to help the compiler choose the
non-template operator=(Heap::Base *) overload. This allows removing a bunch
of Value::fromHeapObject calls.
Change-Id: I20415c0549d33cca6813441a2495976b66d4c00e
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 5 | ||||
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 8 | ||||
-rw-r--r-- | src/qml/jit/qv4isel_masm.cpp | 33 |
3 files changed, 22 insertions, 24 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index afbdeeb10b..e0fe31d6cf 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -219,11 +219,8 @@ Assembler::Pointer Assembler::loadStringAddress(RegisterID reg, const QString &s void Assembler::loadStringRef(RegisterID reg, const QString &string) { - loadPtr(Address(Assembler::EngineRegister, qOffsetOf(QV4::ExecutionEngine, current)), reg); - loadPtr(Address(reg, qOffsetOf(QV4::Heap::ExecutionContext, compilationUnit)), reg); - loadPtr(Address(reg, qOffsetOf(QV4::CompiledData::CompilationUnit, runtimeStrings)), reg); const int id = _isel->registerString(string); - loadPtr(Address(reg, id * sizeof(QV4::String*)), reg); + move(TrustedImm32(id), reg); } void Assembler::storeValue(QV4::Primitive value, IR::Expr *destination) diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index a4105550c6..a143690793 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -316,8 +316,8 @@ public: {} IR::Expr *value; }; - struct PointerToString { - explicit PointerToString(const QString &string) : string(string) {} + struct StringToIndex { + explicit StringToIndex(const QString &string) : string(string) {} QString string; }; struct Reference { @@ -446,7 +446,7 @@ public: loadArgumentInRegister(addr, dest, argumentNumber); } } - void loadArgumentInRegister(PointerToString temp, RegisterID dest, int argumentNumber) + void loadArgumentInRegister(StringToIndex temp, RegisterID dest, int argumentNumber) { Q_UNUSED(argumentNumber); loadStringRef(dest, temp.string); @@ -662,7 +662,7 @@ public: } template <int StackSlot> - void loadArgumentOnStack(PointerToString temp, int argumentNumber) + void loadArgumentOnStack(StringToIndex temp, int argumentNumber) { Q_UNUSED(argumentNumber); loadStringRef(ScratchRegister, temp.string); diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp index 5c441a1edf..ff35abda67 100644 --- a/src/qml/jit/qv4isel_masm.cpp +++ b/src/qml/jit/qv4isel_masm.cpp @@ -313,7 +313,7 @@ void InstructionSelection::callBuiltinInvalid(IR::Name *func, IR::ExprList *args } else { generateFunctionCall(result, Runtime::callActivationProperty, Assembler::EngineRegister, - Assembler::PointerToString(*func->id), + Assembler::StringToIndex(*func->id), baseAddressForCallData()); } } @@ -322,7 +322,7 @@ void InstructionSelection::callBuiltinTypeofMember(IR::Expr *base, const QString IR::Expr *result) { generateFunctionCall(result, Runtime::typeofMember, Assembler::EngineRegister, - Assembler::PointerToValue(base), Assembler::PointerToString(name)); + Assembler::PointerToValue(base), Assembler::StringToIndex(name)); } void InstructionSelection::callBuiltinTypeofSubscript(IR::Expr *base, IR::Expr *index, @@ -336,7 +336,7 @@ void InstructionSelection::callBuiltinTypeofSubscript(IR::Expr *base, IR::Expr * void InstructionSelection::callBuiltinTypeofName(const QString &name, IR::Expr *result) { generateFunctionCall(result, Runtime::typeofName, Assembler::EngineRegister, - Assembler::PointerToString(name)); + Assembler::StringToIndex(name)); } void InstructionSelection::callBuiltinTypeofValue(IR::Expr *value, IR::Expr *result) @@ -348,7 +348,7 @@ void InstructionSelection::callBuiltinTypeofValue(IR::Expr *value, IR::Expr *res void InstructionSelection::callBuiltinDeleteMember(IR::Expr *base, const QString &name, IR::Expr *result) { generateFunctionCall(result, Runtime::deleteMember, Assembler::EngineRegister, - Assembler::Reference(base), Assembler::PointerToString(name)); + Assembler::Reference(base), Assembler::StringToIndex(name)); } void InstructionSelection::callBuiltinDeleteSubscript(IR::Expr *base, IR::Expr *index, @@ -361,7 +361,7 @@ void InstructionSelection::callBuiltinDeleteSubscript(IR::Expr *base, IR::Expr * void InstructionSelection::callBuiltinDeleteName(const QString &name, IR::Expr *result) { generateFunctionCall(result, Runtime::deleteName, Assembler::EngineRegister, - Assembler::PointerToString(name)); + Assembler::StringToIndex(name)); } void InstructionSelection::callBuiltinDeleteValue(IR::Expr *result) @@ -388,7 +388,7 @@ void InstructionSelection::callBuiltinUnwindException(IR::Expr *result) void InstructionSelection::callBuiltinPushCatchScope(const QString &exceptionName) { - generateFunctionCall(Assembler::Void, Runtime::pushCatchScope, Assembler::EngineRegister, Assembler::PointerToString(exceptionName)); + generateFunctionCall(Assembler::Void, Runtime::pushCatchScope, Assembler::EngineRegister, Assembler::StringToIndex(exceptionName)); } void InstructionSelection::callBuiltinForeachIteratorObject(IR::Expr *arg, IR::Expr *result) @@ -422,7 +422,7 @@ void InstructionSelection::callBuiltinPopScope() void InstructionSelection::callBuiltinDeclareVar(bool deletable, const QString &name) { generateFunctionCall(Assembler::Void, Runtime::declareVar, Assembler::EngineRegister, - Assembler::TrustedImm32(deletable), Assembler::PointerToString(name)); + Assembler::TrustedImm32(deletable), Assembler::StringToIndex(name)); } void InstructionSelection::callBuiltinDefineArray(IR::Expr *result, IR::ExprList *args) @@ -575,7 +575,7 @@ void InstructionSelection::loadQmlScopeObject(IR::Expr *temp) void InstructionSelection::loadQmlSingleton(const QString &name, IR::Expr *temp) { - generateFunctionCall(temp, Runtime::getQmlSingleton, Assembler::EngineRegister, Assembler::PointerToString(name)); + generateFunctionCall(temp, Runtime::getQmlSingleton, Assembler::EngineRegister, Assembler::StringToIndex(name)); } void InstructionSelection::loadConst(IR::Const *sourceConst, IR::Expr *target) @@ -632,14 +632,14 @@ void InstructionSelection::getActivationProperty(const IR::Name *name, IR::Expr generateLookupCall(target, index, qOffsetOf(QV4::Lookup, globalGetter), Assembler::EngineRegister, Assembler::Void); return; } - generateFunctionCall(target, Runtime::getActivationProperty, Assembler::EngineRegister, Assembler::PointerToString(*name->id)); + generateFunctionCall(target, Runtime::getActivationProperty, Assembler::EngineRegister, Assembler::StringToIndex(*name->id)); } void InstructionSelection::setActivationProperty(IR::Expr *source, const QString &targetName) { // ### should use a lookup call here generateFunctionCall(Assembler::Void, Runtime::setActivationProperty, - Assembler::EngineRegister, Assembler::PointerToString(targetName), Assembler::PointerToValue(source)); + Assembler::EngineRegister, Assembler::StringToIndex(targetName), Assembler::PointerToValue(source)); } void InstructionSelection::initClosure(IR::Closure *closure, IR::Expr *target) @@ -652,10 +652,10 @@ void InstructionSelection::getProperty(IR::Expr *base, const QString &name, IR:: { if (useFastLookups) { uint index = registerGetterLookup(name); - generateLookupCall(target, index, qOffsetOf(QV4::Lookup, getter), Assembler::PointerToValue(base), Assembler::Void); + generateLookupCall(target, index, qOffsetOf(QV4::Lookup, getter), Assembler::EngineRegister, Assembler::PointerToValue(base), Assembler::Void); } else { generateFunctionCall(target, Runtime::getProperty, Assembler::EngineRegister, - Assembler::PointerToValue(base), Assembler::PointerToString(name)); + Assembler::PointerToValue(base), Assembler::StringToIndex(name)); } } @@ -677,11 +677,12 @@ void InstructionSelection::setProperty(IR::Expr *source, IR::Expr *targetBase, if (useFastLookups) { uint index = registerSetterLookup(targetName); generateLookupCall(Assembler::Void, index, qOffsetOf(QV4::Lookup, setter), + Assembler::EngineRegister, Assembler::PointerToValue(targetBase), Assembler::PointerToValue(source)); } else { generateFunctionCall(Assembler::Void, Runtime::setProperty, Assembler::EngineRegister, - Assembler::PointerToValue(targetBase), Assembler::PointerToString(targetName), + Assembler::PointerToValue(targetBase), Assembler::StringToIndex(targetName), Assembler::PointerToValue(source)); } } @@ -894,7 +895,7 @@ void InstructionSelection::callProperty(IR::Expr *base, const QString &name, IR: baseAddressForCallData()); } else { generateFunctionCall(result, Runtime::callProperty, Assembler::EngineRegister, - Assembler::PointerToString(name), + Assembler::StringToIndex(name), baseAddressForCallData()); } } @@ -1222,7 +1223,7 @@ void InstructionSelection::constructActivationProperty(IR::Name *func, IR::ExprL generateFunctionCall(result, Runtime::constructActivationProperty, Assembler::EngineRegister, - Assembler::PointerToString(*func->id), + Assembler::StringToIndex(*func->id), baseAddressForCallData()); } @@ -1240,7 +1241,7 @@ void InstructionSelection::constructProperty(IR::Expr *base, const QString &name } generateFunctionCall(result, Runtime::constructProperty, Assembler::EngineRegister, - Assembler::PointerToString(name), + Assembler::StringToIndex(name), baseAddressForCallData()); } |