Get rid of QV4::Function::generatedValues by porting moths' regexps to runtime expres...
authorSimon Hausmann <simon.hausmann@digia.com>
Fri, 16 Aug 2013 14:40:21 +0000 (16:40 +0200)
committerLars Knoll <lars.knoll@digia.com>
Fri, 16 Aug 2013 17:15:30 +0000 (19:15 +0200)
Change-Id: Iaae3c4855016948952159596d2528fca73341b72
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/compiler/qv4instr_moth_p.h
src/qml/compiler/qv4isel_moth.cpp
src/qml/jsruntime/qv4function.cpp
src/qml/jsruntime/qv4function_p.h
src/qml/jsruntime/qv4vme_moth.cpp

index 6e167e2..642e6f4 100644 (file)
@@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE
     F(Ret, ret) \
     F(LoadValue, loadValue) \
     F(LoadString, loadString) \
+    F(LoadRegExp, loadRegExp) \
     F(LoadClosure, loadClosure) \
     F(MoveTemp, moveTemp) \
     F(LoadName, loadName) \
@@ -224,6 +225,11 @@ union Instr
         int stringId;
         Param result;
     };
+    struct instr_loadRegExp {
+        MOTH_INSTR_HEADER
+        int regExpId;
+        Param result;
+    };
     struct instr_moveTemp {
         MOTH_INSTR_HEADER
         Param source;
@@ -544,6 +550,7 @@ union Instr
     instr_ret ret;
     instr_loadValue loadValue;
     instr_loadString loadString;
+    instr_loadRegExp loadRegExp;
     instr_moveTemp moveTemp;
     instr_loadClosure loadClosure;
     instr_loadName loadName;
index 7325ef0..fb4c780 100644 (file)
@@ -408,13 +408,8 @@ void InstructionSelection::loadString(const QString &str, V4IR::Temp *targetTemp
 
 void InstructionSelection::loadRegexp(V4IR::RegExp *sourceRegexp, V4IR::Temp *targetTemp)
 {
-    QV4::Value v = QV4::Value::fromObject(engine()->newRegExpObject(
-                                            *sourceRegexp->value,
-                                            sourceRegexp->flags));
-    _vmFunction->generatedValues.append(v);
-
-    Instruction::LoadValue load;
-    load.value = Instr::Param::createValue(v);
+    Instruction::LoadRegExp load;
+    load.regExpId = jsUnitGenerator.registerRegExp(sourceRegexp);
     load.result = getResultParam(targetTemp);
     addInstruction(load);
 }
index 3f7be84..32fd9c3 100644 (file)
@@ -94,9 +94,6 @@ void Function::mark()
         formals.at(i)->mark();
     for (int i = 0; i < locals.size(); ++i)
         locals.at(i)->mark();
-    for (int i = 0; i < generatedValues.size(); ++i)
-        if (Managed *m = generatedValues.at(i).asManaged())
-            m->mark();
 }
 
 namespace QV4 {
index 948729e..4263e39 100644 (file)
@@ -98,7 +98,6 @@ struct Function {
 
     QVector<String *> formals;
     QVector<String *> locals;
-    QVector<Value> generatedValues;
     QVector<Function *> nestedFunctions;
 
     QVector<LineNumberMapping> lineNumberMappings;
index 746a7be..133d72d 100644 (file)
@@ -265,6 +265,11 @@ QV4::Value VME::run(QV4::ExecutionContext *context, const uchar *&code,
         VALUE(instr.result) = QV4::Value::fromString(runtimeStrings[instr.stringId]);
     MOTH_END_INSTR(LoadString)
 
+    MOTH_BEGIN_INSTR(LoadRegExp)
+//        TRACE(value, "%s", instr.value.toString(context)->toQString().toUtf8().constData());
+        VALUE(instr.result) = context->runtimeFunction()->compilationUnit->runtimeRegularExpressions[instr.regExpId];
+    MOTH_END_INSTR(LoadRegExp)
+
     MOTH_BEGIN_INSTR(LoadClosure)
         __qmljs_init_closure(context, VALUEPTR(instr.result), instr.value);
     MOTH_END_INSTR(LoadClosure)