aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2014-11-12 16:07:56 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-11-21 13:08:28 +0100
commitf58b5229a31e9fec49b4eb055c56f9a78e423866 (patch)
tree6214fb89929fd9482c2154b0fe17c7cba0f509cb /src/qml/jit
parente6db292366fa6ad25536fee08b2a972ea617d968 (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.cpp5
-rw-r--r--src/qml/jit/qv4assembler_p.h8
-rw-r--r--src/qml/jit/qv4isel_masm.cpp33
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());
}