diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-08-15 15:54:36 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2013-08-16 10:14:13 +0200 |
commit | b88626a3a59f7dcd01be6fe2a8236b14ca1176f5 (patch) | |
tree | f3a1f6db220f2d6a7d71f2ddc7b466e205658f40 /src/qml/compiler/qv4compiler.cpp | |
parent | 214680abec598bc01c4f90b3cecc60c7968c0c41 (diff) |
Ported regular expressions over to be run-time generated data
Change-Id: I04e693d4923c97c3d869a5beb17011f6aad85f03
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4compiler.cpp')
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 6707283d93..d67b7deef7 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -94,6 +94,23 @@ uint QV4::Compiler::JSUnitGenerator::registerGlobalGetterLookup(const QString &n return lookups.size() - 1; } +int QV4::Compiler::JSUnitGenerator::registerRegExp(QQmlJS::V4IR::RegExp *regexp) +{ + CompiledData::RegExp re; + re.stringIndex = registerString(*regexp->value); + + re.flags = 0; + if (regexp->flags & QQmlJS::V4IR::RegExp::RegExp_Global) + re.flags |= CompiledData::RegExp::RegExp_Global; + if (regexp->flags & QQmlJS::V4IR::RegExp::RegExp_IgnoreCase) + re.flags |= CompiledData::RegExp::RegExp_IgnoreCase; + if (regexp->flags & QQmlJS::V4IR::RegExp::RegExp_Multiline) + re.flags |= CompiledData::RegExp::RegExp_Multiline; + + regexps.append(re); + return regexps.size() - 1; +} + QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() { registerString(irModule->fileName); @@ -105,7 +122,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() registerString(*f->locals.at(i)); } - int unitSize = QV4::CompiledData::Unit::calculateSize(strings.size(), irModule->functions.size()); + int unitSize = QV4::CompiledData::Unit::calculateSize(strings.size(), irModule->functions.size(), regexps.size()); uint functionDataSize = 0; for (int i = 0; i < irModule->functions.size(); ++i) { @@ -128,6 +145,8 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() unit->functionTableSize = irModule->functions.size(); unit->offsetToFunctionTable = unit->offsetToStringTable + unit->stringTableSize * sizeof(uint); unit->lookupTableSize = lookups.count(); + unit->regexpTableSize = regexps.size(); + unit->offsetToRegexpTable = unit->offsetToFunctionTable + unit->functionTableSize * sizeof(uint); unit->offsetToLookupTable = unitSize + stringDataSize + functionDataSize; unit->sourceFileIndex = getStringId(irModule->fileName); @@ -169,6 +188,9 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() foreach (const CompiledData::Lookup &l, lookups) *lookupsToWrite++ = l; + CompiledData::RegExp *regexpTable = (CompiledData::RegExp *)(data + unit->offsetToRegexpTable); + memcpy(regexpTable, regexps.constData(), regexps.size() * sizeof(*regexpTable)); + return unit; } |