F(Ret, ret) \
F(LoadValue, loadValue) \
F(LoadString, loadString) \
+ F(LoadRegExp, loadRegExp) \
F(LoadClosure, loadClosure) \
F(MoveTemp, moveTemp) \
F(LoadName, loadName) \
int stringId;
Param result;
};
+ struct instr_loadRegExp {
+ MOTH_INSTR_HEADER
+ int regExpId;
+ Param result;
+ };
struct instr_moveTemp {
MOTH_INSTR_HEADER
Param source;
instr_ret ret;
instr_loadValue loadValue;
instr_loadString loadString;
+ instr_loadRegExp loadRegExp;
instr_moveTemp moveTemp;
instr_loadClosure loadClosure;
instr_loadName loadName;
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);
}
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 {
QVector<String *> formals;
QVector<String *> locals;
- QVector<Value> generatedValues;
QVector<Function *> nestedFunctions;
QVector<LineNumberMapping> lineNumberMappings;
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)