From cfe24c1aa0f3ec168437cd22e355c28e5e7a4f09 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 28 Oct 2013 22:30:04 +0100 Subject: Move constants into the compiled data for the interpreter This makes it possible to remove the Value stored as part of the instruction stream. Reduces the size of the instruction stream and will allow to optimize Param lookup. Change-Id: I23dab5dbed76bf8d62df7042934064d4676bc43d Reviewed-by: Simon Hausmann --- src/qml/compiler/qv4instr_moth_p.h | 11 +++++------ src/qml/compiler/qv4isel_moth.cpp | 9 ++++++--- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'src/qml/compiler') diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h index f9a46a06d7..795576b2a9 100644 --- a/src/qml/compiler/qv4instr_moth_p.h +++ b/src/qml/compiler/qv4instr_moth_p.h @@ -125,29 +125,28 @@ namespace Moth { struct Param { enum { - ValueType = 0, + ConstantType = 0, ArgumentType = 1, LocalType = 2, TempType = 3, ScopedLocalType = 4 }; - QV4::Primitive value; unsigned type : 3; unsigned scope : 29; unsigned index; - bool isValue() const { return type == ValueType; } + bool isConstant() const { return type == ConstantType; } bool isArgument() const { return type == ArgumentType; } bool isLocal() const { return type == LocalType; } bool isTemp() const { return type == TempType; } bool isScopedLocal() const { return type == ScopedLocalType; } - static Param createValue(const QV4::Primitive &v) + static Param createConstant(int index) { Param p; - p.type = ValueType; + p.type = ConstantType; p.scope = 0; - p.value = v; + p.index = index; return p; } diff --git a/src/qml/compiler/qv4isel_moth.cpp b/src/qml/compiler/qv4isel_moth.cpp index 835f0a8a23..295227cb97 100644 --- a/src/qml/compiler/qv4isel_moth.cpp +++ b/src/qml/compiler/qv4isel_moth.cpp @@ -774,7 +774,8 @@ void InstructionSelection::callBuiltinDeleteName(const QString &name, V4IR::Temp void InstructionSelection::callBuiltinDeleteValue(V4IR::Temp *result) { Instruction::LoadValue load; - load.value = Param::createValue(QV4::Primitive::fromBoolean(false)); + int idx = jsUnitGenerator()->registerConstant(QV4::Encode(false)); + load.value = Param::createConstant(idx); load.result = getResultParam(result); addInstruction(load); } @@ -797,7 +798,8 @@ void InstructionSelection::callBuiltinReThrow() _patches[_block->catchBlock].append(loc); } else { Instruction::Ret ret; - ret.result = Param::createValue(QV4::Primitive::undefinedValue()); + int idx = jsUnitGenerator()->registerConstant(QV4::Encode::undefined()); + ret.result = Param::createConstant(idx); addInstruction(ret); } } @@ -988,7 +990,8 @@ Param InstructionSelection::getParam(V4IR::Expr *e) { assert(e); if (V4IR::Const *c = e->asConst()) { - return Param::createValue(convertToValue(c)); + int idx = jsUnitGenerator()->registerConstant(convertToValue(c).asReturnedValue()); + return Param::createConstant(idx); } else if (V4IR::Temp *t = e->asTemp()) { switch (t->kind) { case V4IR::Temp::Formal: -- cgit v1.2.3