diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-08-16 13:21:31 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2013-08-16 16:52:18 +0200 |
commit | 944717a46c237e5a5b2d6e5ea2fd8389523638e4 (patch) | |
tree | 6e894837d1cd327bb578b00d7826e3de0cde816c /src/qml/compiler/qv4compiler.cpp | |
parent | 85e6b8e9e7e158b5cb4238c2dd5e28406bc913e2 (diff) |
Ported the compile-time class setup for object literals to be run-time based
Change-Id: I21225e4bf0f66914229cf64fa29ce870548c0e93
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4compiler.cpp')
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 385f668b42..8e09e57525 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -47,6 +47,7 @@ QV4::Compiler::JSUnitGenerator::JSUnitGenerator(QV4::ExecutionEngine *engine, QQmlJS::V4IR::Module *module) : irModule(module) , stringDataSize(0) + , jsClassDataSize(0) { } @@ -116,6 +117,37 @@ void QV4::Compiler::JSUnitGenerator::registerLineNumberMapping(QQmlJS::V4IR::Fun lineNumberMappingsPerFunction.insert(function, mappings); } +int QV4::Compiler::JSUnitGenerator::registerJSClass(QQmlJS::V4IR::ExprList *args) +{ + // ### re-use existing class definitions. + + QList<CompiledData::JSClassMember> members; + + QQmlJS::V4IR::ExprList *it = args; + while (it) { + CompiledData::JSClassMember member; + + QQmlJS::V4IR::Name *name = it->expr->asName(); + it = it->next; + + const bool isData = it->expr->asConst()->value; + it = it->next; + + member.nameOffset = registerString(*name->id); + member.isAccessor = !isData; + members << member; + + if (!isData) + it = it->next; + + it = it->next; + } + + jsClasses << members; + jsClassDataSize += CompiledData::JSClass::calculateSize(members.count()); + return jsClasses.size() - 1; +} + QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() { registerString(irModule->fileName); @@ -127,7 +159,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() registerString(*f->locals.at(i)); } - int unitSize = QV4::CompiledData::Unit::calculateSize(strings.size(), irModule->functions.size(), regexps.size(), lookups.size()); + int unitSize = QV4::CompiledData::Unit::calculateSize(strings.size(), irModule->functions.size(), regexps.size(), lookups.size(), jsClasses.count()); uint functionDataSize = 0; for (int i = 0; i < irModule->functions.size(); ++i) { @@ -142,7 +174,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() functionDataSize += QV4::CompiledData::Function::calculateSize(f->formals.size(), f->locals.size(), f->nestedFunctions.size(), lineNumberMappingCount); } - char *data = (char *)malloc(unitSize + functionDataSize + stringDataSize); + char *data = (char *)malloc(unitSize + functionDataSize + stringDataSize + jsClassDataSize); QV4::CompiledData::Unit *unit = (QV4::CompiledData::Unit*)data; memcpy(unit->magic, QV4::CompiledData::magic_str, sizeof(unit->magic)); @@ -157,6 +189,8 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() unit->offsetToLookupTable = unit->offsetToFunctionTable + unit->functionTableSize * sizeof(uint); unit->regexpTableSize = regexps.size(); unit->offsetToRegexpTable = unit->offsetToLookupTable + unit->lookupTableSize * CompiledData::Lookup::calculateSize(); + unit->jsClassTableSize = jsClasses.count(); + unit->offsetToJSClassTable = unit->offsetToRegexpTable + unit->regexpTableSize * CompiledData::RegExp::calculateSize(); unit->sourceFileIndex = getStringId(irModule->fileName); // write strings and string table @@ -200,6 +234,24 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() CompiledData::RegExp *regexpTable = (CompiledData::RegExp *)(data + unit->offsetToRegexpTable); memcpy(regexpTable, regexps.constData(), regexps.size() * sizeof(*regexpTable)); + // write js classes and js class lookup table + uint *jsClassTable = (uint*)(data + unit->offsetToJSClassTable); + char *jsClass = data + unitSize + stringDataSize + functionDataSize; + for (int i = 0; i < jsClasses.count(); ++i) { + jsClassTable[i] = jsClass - data; + + const QList<CompiledData::JSClassMember> members = jsClasses.at(i); + + CompiledData::JSClass *c = reinterpret_cast<CompiledData::JSClass*>(jsClass); + c->nMembers = members.count(); + + CompiledData::JSClassMember *memberToWrite = reinterpret_cast<CompiledData::JSClassMember*>(jsClass + sizeof(CompiledData::JSClass)); + foreach (const CompiledData::JSClassMember &member, members) + *memberToWrite++ = member; + + jsClass += CompiledData::JSClass::calculateSize(members.count()); + } + return unit; } |