From b11ec085703a0b019c8115ff505ee6e2553fd4f1 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sat, 5 Apr 2014 20:23:20 +0200 Subject: Move Managed data into it's own subclass This prepares for moving over to a d pointer scheme, where Managed subclasses don't hold any data directly. This is required to be able to move over to a modern GC. Change-Id: I3f59633ac07a7da461bd2d4f0f9f3a8e3b0baf02 Reviewed-by: Simon Hausmann --- src/qml/jsapi/qjsvalue.cpp | 2 +- src/qml/jsruntime/qv4argumentsobject.cpp | 12 +-- src/qml/jsruntime/qv4argumentsobject_p.h | 2 +- src/qml/jsruntime/qv4arraydata.cpp | 2 +- src/qml/jsruntime/qv4arraydata_p.h | 2 +- src/qml/jsruntime/qv4arrayobject.cpp | 2 +- src/qml/jsruntime/qv4context.cpp | 14 ++-- src/qml/jsruntime/qv4dateobject_p.h | 2 +- src/qml/jsruntime/qv4engine.cpp | 4 +- src/qml/jsruntime/qv4engine_p.h | 6 +- src/qml/jsruntime/qv4errorobject.cpp | 6 +- src/qml/jsruntime/qv4errorobject_p.h | 2 +- src/qml/jsruntime/qv4functionobject.cpp | 52 ++++++------- src/qml/jsruntime/qv4functionobject_p.h | 4 + src/qml/jsruntime/qv4globalobject.cpp | 8 +- src/qml/jsruntime/qv4identifiertable.cpp | 4 +- src/qml/jsruntime/qv4identifiertable_p.h | 8 +- src/qml/jsruntime/qv4internalclass.cpp | 38 +++++----- src/qml/jsruntime/qv4lookup.cpp | 122 +++++++++++++++---------------- src/qml/jsruntime/qv4managed.cpp | 28 ++----- src/qml/jsruntime/qv4managed_p.h | 93 +++++++++++++---------- src/qml/jsruntime/qv4mm.cpp | 33 ++++----- src/qml/jsruntime/qv4object.cpp | 112 ++++++++++++++-------------- src/qml/jsruntime/qv4object_p.h | 18 +++-- src/qml/jsruntime/qv4objectproto.cpp | 22 +++--- src/qml/jsruntime/qv4qobjectwrapper.cpp | 4 +- src/qml/jsruntime/qv4regexp.cpp | 1 - src/qml/jsruntime/qv4regexpobject.cpp | 4 +- src/qml/jsruntime/qv4runtime.cpp | 4 +- src/qml/jsruntime/qv4script.cpp | 8 +- src/qml/jsruntime/qv4sequenceobject.cpp | 2 +- src/qml/jsruntime/qv4string.cpp | 18 ++--- src/qml/jsruntime/qv4string_p.h | 9 +-- src/qml/jsruntime/qv4stringobject.cpp | 4 +- src/qml/jsruntime/qv4value.cpp | 6 +- src/qml/jsruntime/qv4value_inl_p.h | 4 +- src/qml/jsruntime/qv4variantobject.cpp | 18 ++--- src/qml/qml/qqmlbinding.cpp | 2 +- src/qml/qml/qqmlproperty.cpp | 6 +- src/qml/qml/qqmlvaluetypewrapper.cpp | 4 +- src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 2 +- src/qml/qml/v8/qv8engine.cpp | 16 ++-- 42 files changed, 356 insertions(+), 354 deletions(-) (limited to 'src/qml') diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index b17ac17752..502fa1e64f 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -682,7 +682,7 @@ QJSValue QJSValue::prototype() const Scoped p(scope, o->prototype()); if (!p) return QJSValue(NullValue); - return new QJSValuePrivate(o->internalClass->engine, p); + return new QJSValuePrivate(o->internalClass()->engine, p); } /*! diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 91945875a1..7d4df899a6 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -58,8 +58,8 @@ ArgumentsObject::ArgumentsObject(CallContext *context) setArrayType(ArrayData::Complex); if (context->strictMode) { - Q_ASSERT(CalleePropertyIndex == internalClass->find(context->engine->id_callee)); - Q_ASSERT(CallerPropertyIndex == internalClass->find(context->engine->id_caller)); + Q_ASSERT(CalleePropertyIndex == internalClass()->find(context->engine->id_callee)); + Q_ASSERT(CallerPropertyIndex == internalClass()->find(context->engine->id_caller)); propertyAt(CalleePropertyIndex)->value = v4->thrower; propertyAt(CalleePropertyIndex)->set = v4->thrower; propertyAt(CallerPropertyIndex)->value = v4->thrower; @@ -69,14 +69,14 @@ ArgumentsObject::ArgumentsObject(CallContext *context) arrayPut(0, context->callData->args, context->callData->argc); fullyCreated = true; } else { - hasAccessorProperty = 1; - Q_ASSERT(CalleePropertyIndex == internalClass->find(context->engine->id_callee)); + setHasAccessorProperty(); + Q_ASSERT(CalleePropertyIndex == internalClass()->find(context->engine->id_callee)); memberData[CalleePropertyIndex] = context->function->asReturnedValue(); } - Q_ASSERT(LengthPropertyIndex == internalClass->find(context->engine->id_length)); + Q_ASSERT(LengthPropertyIndex == internalClass()->find(context->engine->id_length)); memberData[LengthPropertyIndex] = Primitive::fromInt32(context->realArgumentCount); - Q_ASSERT(internalClass->vtable == staticVTable()); + Q_ASSERT(internalClass()->vtable == staticVTable()); } void ArgumentsObject::fullyCreate() diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index c693669b40..9c27b83ae2 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -84,7 +84,7 @@ struct ArgumentsObject: Object { ArgumentsObject(CallContext *context); static bool isNonStrictArgumentsObject(Managed *m) { - return m->internalClass->vtable->type == Type_ArgumentsObject && + return m->internalClass()->vtable->type == Type_ArgumentsObject && !static_cast(m)->context->strictMode; } diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index 0d68a7cd82..93660a2616 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -583,7 +583,7 @@ uint ArrayData::append(Object *obj, const ArrayObject *otherObj, uint n) uint oldSize = obj->getLength(); if (other->isSparse()) { - if (otherObj->hasAccessorProperty && other->hasAttributes()) { + if (otherObj->hasAccessorProperty() && other->hasAttributes()) { Scope scope(obj->engine()); ScopedValue v(scope); for (const SparseArrayNode *it = static_cast(other)->sparse->begin(); diff --git a/src/qml/jsruntime/qv4arraydata_p.h b/src/qml/jsruntime/qv4arraydata_p.h index dec1573da7..eef3816ef6 100644 --- a/src/qml/jsruntime/qv4arraydata_p.h +++ b/src/qml/jsruntime/qv4arraydata_p.h @@ -97,7 +97,7 @@ struct Q_QML_EXPORT ArrayData : public Managed PropertyAttributes *attrs; Value *data; - const ArrayVTable *vtable() const { return reinterpret_cast(internalClass->vtable); } + const ArrayVTable *vtable() const { return reinterpret_cast(internalClass()->vtable); } bool isSparse() const { return this && type == Sparse; } uint length() const { diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp index d5b3b8a651..1e120892a6 100644 --- a/src/qml/jsruntime/qv4arrayobject.cpp +++ b/src/qml/jsruntime/qv4arrayobject.cpp @@ -613,7 +613,7 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx) ScopedValue value(scope); - if (instance->hasAccessorProperty || (instance->arrayType() >= ArrayData::Sparse) || instance->protoHasArray()) { + if (instance->hasAccessorProperty() || (instance->arrayType() >= ArrayData::Sparse) || instance->protoHasArray()) { // lets be safe and slow for (uint i = fromIndex; i < len; ++i) { bool exists; diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index b43b4893a3..fdfa72cdb0 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -63,7 +63,7 @@ CallContext *ExecutionContext::newCallContext(FunctionObject *function, CallData c->function = function; c->realArgumentCount = callData->argc; - c->strictMode = function->strictMode; + c->strictMode = function->strictMode(); c->outer = function->scope; c->activation = 0; @@ -227,7 +227,7 @@ bool ExecutionContext::deleteProperty(const StringRef name) } else if (ctx->type >= Type_CallContext) { CallContext *c = static_cast(ctx); FunctionObject *f = c->function; - if (f->needsActivation || hasWith) { + if (f->needsActivation() || hasWith) { uint index = f->function->internalClass->find(name); if (index < UINT_MAX) // ### throw in strict mode? @@ -249,7 +249,7 @@ bool ExecutionContext::deleteProperty(const StringRef name) bool CallContext::needsOwnArguments() const { - return function->needsActivation || callData->argc < static_cast(function->formalParameterCount()); + return function->needsActivation() || callData->argc < static_cast(function->formalParameterCount()); } void ExecutionContext::markObjects(Managed *m, ExecutionEngine *engine) @@ -323,9 +323,9 @@ void ExecutionContext::setProperty(const StringRef name, const ValueRef value) activation->put(name, value); return; } else { - uint member = activation->internalClass->find(name); + uint member = activation->internalClass()->find(name); if (member < UINT_MAX) { - activation->putValue(activation->propertyAt(member), activation->internalClass->propertyData[member], value); + activation->putValue(activation->propertyAt(member), activation->internalClass()->propertyData[member], value); return; } } @@ -373,7 +373,7 @@ ReturnedValue ExecutionContext::getProperty(const StringRef name) else if (ctx->type >= Type_CallContext) { QV4::CallContext *c = static_cast(ctx); ScopedFunctionObject f(scope, c->function); - if (f->function && (f->needsActivation || hasWith || hasCatchScope)) { + if (f->function && (f->needsActivation() || hasWith || hasCatchScope)) { uint index = f->function->internalClass->find(name); if (index < UINT_MAX) { if (index < c->function->formalParameterCount()) @@ -439,7 +439,7 @@ ReturnedValue ExecutionContext::getPropertyAndBase(const StringRef name, ObjectR else if (ctx->type >= Type_CallContext) { QV4::CallContext *c = static_cast(ctx); FunctionObject *f = c->function; - if (f->function && (f->needsActivation || hasWith || hasCatchScope)) { + if (f->function && (f->needsActivation() || hasWith || hasCatchScope)) { uint index = f->function->internalClass->find(name); if (index < UINT_MAX) { if (index < c->function->formalParameterCount()) diff --git a/src/qml/jsruntime/qv4dateobject_p.h b/src/qml/jsruntime/qv4dateobject_p.h index c52e8c3ee1..7619d553ea 100644 --- a/src/qml/jsruntime/qv4dateobject_p.h +++ b/src/qml/jsruntime/qv4dateobject_p.h @@ -64,7 +64,7 @@ struct DateObject: Object { protected: DateObject(InternalClass *ic): Object(ic) { - Q_ASSERT(internalClass->vtable == staticVTable()); + Q_ASSERT(internalClass()->vtable == staticVTable()); value = Primitive::fromDouble(qSNaN()); } }; diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index d1ed6566a9..1af5359985 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -327,7 +327,7 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) VariantPrototype *variantPrototype = new (memoryManager) VariantPrototype(InternalClass::create(this, VariantPrototype::staticVTable(), objectPrototype)); variantClass = InternalClass::create(this, VariantObject::staticVTable(), variantPrototype); Q_ASSERT(variantClass->prototype == variantPrototype); - Q_ASSERT(variantPrototype->internalClass->prototype == objectPrototype); + Q_ASSERT(variantPrototype->internalClass()->prototype == objectPrototype); sequencePrototype = new (memoryManager) SequencePrototype(arrayClass); @@ -372,7 +372,7 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) globalObject = newObject()->getPointer(); rootContext->global = globalObject; rootContext->callData->thisObject = globalObject; - Q_ASSERT(globalObject->internalClass->vtable); + Q_ASSERT(globalObject->internalClass()->vtable); globalObject->defineDefaultProperty(QStringLiteral("Object"), objectCtor); globalObject->defineDefaultProperty(QStringLiteral("String"), stringCtor); diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index a7808edd9b..070aec7f6a 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -379,10 +379,10 @@ private: inline void Managed::mark(QV4::ExecutionEngine *engine) { - Q_ASSERT(inUse); - if (markBit) + Q_ASSERT(inUse()); + if (markBit()) return; - markBit = 1; + managedData()->markBit = 1; engine->pushForGC(this); } diff --git a/src/qml/jsruntime/qv4errorobject.cpp b/src/qml/jsruntime/qv4errorobject.cpp index 9d6403e7dd..6742d5624c 100644 --- a/src/qml/jsruntime/qv4errorobject.cpp +++ b/src/qml/jsruntime/qv4errorobject.cpp @@ -86,7 +86,7 @@ ErrorObject::ErrorObject(InternalClass *ic, const ValueRef message, ErrorType t) : Object(ic) , stack(0) { - subtype = t; + setSubtype(t); Scope scope(engine()); ScopedValue protectThis(scope, this); @@ -109,7 +109,7 @@ ErrorObject::ErrorObject(InternalClass *ic, const QString &message, ErrorObject: : Object(ic) , stack(0) { - subtype = t; + setSubtype(t); Scope scope(engine()); ScopedValue protectThis(scope, this); @@ -132,7 +132,7 @@ ErrorObject::ErrorObject(InternalClass *ic, const QString &message, const QStrin : Object(ic) , stack(0) { - subtype = t; + setSubtype(t); Scope scope(engine()); ScopedValue protectThis(scope, this); diff --git a/src/qml/jsruntime/qv4errorobject_p.h b/src/qml/jsruntime/qv4errorobject_p.h index c44cc5cdb2..ffb22743e5 100644 --- a/src/qml/jsruntime/qv4errorobject_p.h +++ b/src/qml/jsruntime/qv4errorobject_p.h @@ -225,7 +225,7 @@ struct URIErrorPrototype: ErrorObject inline SyntaxErrorObject *ErrorObject::asSyntaxError() { - return subtype == SyntaxError ? static_cast(this) : 0; + return subtype() == SyntaxError ? static_cast(this) : 0; } } diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index 04d1afbf76..e5d210eae9 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -109,8 +109,8 @@ FunctionObject::FunctionObject(InternalClass *ic) , scope(ic->engine->rootContext) , function(0) { - needsActivation = false; - strictMode = false; + managedData()->needsActivation = false; + managedData()->strictMode = false; memberData[Index_Prototype] = Encode::undefined(); } @@ -122,11 +122,11 @@ FunctionObject::~FunctionObject() void FunctionObject::init(const StringRef n, bool createProto) { - Scope s(internalClass->engine); + Scope s(internalClass()->engine); ScopedValue protectThis(s, this); - needsActivation = true; - strictMode = false; + managedData()->needsActivation = true; + managedData()->strictMode = false; if (createProto) { Scoped proto(s, scope->engine->newObject(scope->engine->protoClass)); @@ -148,14 +148,14 @@ ReturnedValue FunctionObject::name() ReturnedValue FunctionObject::newInstance() { - Scope scope(internalClass->engine); + Scope scope(internalClass()->engine); ScopedCallData callData(scope, 0); return construct(callData); } ReturnedValue FunctionObject::construct(Managed *that, CallData *) { - that->internalClass->engine->currentContext()->throwTypeError(); + that->internalClass()->engine->currentContext()->throwTypeError(); return Encode::undefined(); } @@ -195,7 +195,7 @@ FunctionCtor::FunctionCtor(ExecutionContext *scope) ReturnedValue FunctionCtor::construct(Managed *that, CallData *callData) { FunctionCtor *f = static_cast(that); - ExecutionEngine *v4 = f->internalClass->engine; + ExecutionEngine *v4 = f->internalClass()->engine; ExecutionContext *ctx = v4->currentContext(); QString arguments; QString body; @@ -229,7 +229,7 @@ ReturnedValue FunctionCtor::construct(Managed *that, CallData *callData) IR::Module module(v4->debugger != 0); - QQmlJS::RuntimeCodegen cg(v4->currentContext(), f->strictMode); + QQmlJS::RuntimeCodegen cg(v4->currentContext(), f->strictMode()); cg.generateFromFunctionExpression(QString(), function, fe, &module); QV4::Compiler::JSUnitGenerator jsGenerator(&module); @@ -300,7 +300,7 @@ ReturnedValue FunctionPrototype::method_apply(CallContext *ctx) ScopedCallData callData(scope, len); if (len) { - if (arr->arrayType() != ArrayData::Simple || arr->protoHasArray() || arr->hasAccessorProperty) { + if (arr->arrayType() != ArrayData::Simple || arr->protoHasArray() || arr->hasAccessorProperty()) { for (quint32 i = 0; i < len; ++i) callData->args[i] = arr->getIndexed(i); } else { @@ -363,8 +363,8 @@ ScriptFunction::ScriptFunction(ExecutionContext *scope, Function *function) Scope s(scope); ScopedValue protectThis(s, this); - needsActivation = function->needsActivation(); - strictMode = function->isStrict(); + managedData()->needsActivation = function->needsActivation(); + managedData()->strictMode = function->isStrict(); defineReadonlyProperty(scope->engine->id_length, Primitive::fromInt32(formalParameterCount())); @@ -378,7 +378,7 @@ ScriptFunction::ScriptFunction(ExecutionContext *scope, Function *function) ReturnedValue ScriptFunction::construct(Managed *that, CallData *callData) { - ExecutionEngine *v4 = that->internalClass->engine; + ExecutionEngine *v4 = that->engine(); if (v4->hasException) return Encode::undefined(); CHECK_STACK_LIMITS(v4); @@ -407,7 +407,7 @@ ReturnedValue ScriptFunction::construct(Managed *that, CallData *callData) ReturnedValue ScriptFunction::call(Managed *that, CallData *callData) { ScriptFunction *f = static_cast(that); - ExecutionEngine *v4 = f->internalClass->engine; + ExecutionEngine *v4 = f->engine(); if (v4->hasException) return Encode::undefined(); CHECK_STACK_LIMITS(v4); @@ -447,8 +447,8 @@ SimpleScriptFunction::SimpleScriptFunction(ExecutionContext *scope, Function *fu ExecutionEngine *v4 = scope->engine; - needsActivation = function->needsActivation(); - strictMode = function->isStrict(); + managedData()->needsActivation = function->needsActivation(); + managedData()->strictMode = function->isStrict(); defineReadonlyProperty(scope->engine->id_length, Primitive::fromInt32(formalParameterCount())); @@ -461,7 +461,7 @@ SimpleScriptFunction::SimpleScriptFunction(ExecutionContext *scope, Function *fu ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData) { - ExecutionEngine *v4 = that->internalClass->engine; + ExecutionEngine *v4 = that->engine(); if (v4->hasException) return Encode::undefined(); CHECK_STACK_LIMITS(v4); @@ -476,7 +476,7 @@ ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData) ExecutionContextSaver ctxSaver(context); CallContext ctx(v4); - ctx.strictMode = f->strictMode; + ctx.strictMode = f->strictMode(); ctx.callData = callData; ctx.function = f.getPointer(); ctx.compilationUnit = f->function->compilationUnit; @@ -501,7 +501,7 @@ ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData) ReturnedValue SimpleScriptFunction::call(Managed *that, CallData *callData) { - ExecutionEngine *v4 = that->internalClass->engine; + ExecutionEngine *v4 = that->internalClass()->engine; if (v4->hasException) return Encode::undefined(); CHECK_STACK_LIMITS(v4); @@ -513,7 +513,7 @@ ReturnedValue SimpleScriptFunction::call(Managed *that, CallData *callData) ExecutionContextSaver ctxSaver(context); CallContext ctx(v4); - ctx.strictMode = f->strictMode; + ctx.strictMode = f->strictMode(); ctx.callData = callData; ctx.function = f; ctx.compilationUnit = f->function->compilationUnit; @@ -538,10 +538,10 @@ InternalClass *SimpleScriptFunction::internalClassForConstructor() { ReturnedValue proto = protoProperty(); InternalClass *classForConstructor; - Scope scope(internalClass->engine); + Scope scope(internalClass()->engine); ScopedObject p(scope, proto); if (p) - classForConstructor = internalClass->engine->constructClass->changePrototype(p.getPointer()); + classForConstructor = internalClass()->engine->constructClass->changePrototype(p.getPointer()); else classForConstructor = scope.engine->objectClass; @@ -561,13 +561,13 @@ BuiltinFunction::BuiltinFunction(ExecutionContext *scope, const StringRef name, ReturnedValue BuiltinFunction::construct(Managed *f, CallData *) { - return f->internalClass->engine->currentContext()->throwTypeError(); + return f->internalClass()->engine->currentContext()->throwTypeError(); } ReturnedValue BuiltinFunction::call(Managed *that, CallData *callData) { BuiltinFunction *f = static_cast(that); - ExecutionEngine *v4 = f->internalClass->engine; + ExecutionEngine *v4 = f->internalClass()->engine; if (v4->hasException) return Encode::undefined(); CHECK_STACK_LIMITS(v4); @@ -586,7 +586,7 @@ ReturnedValue BuiltinFunction::call(Managed *that, CallData *callData) ReturnedValue IndexedBuiltinFunction::call(Managed *that, CallData *callData) { IndexedBuiltinFunction *f = static_cast(that); - ExecutionEngine *v4 = f->internalClass->engine; + ExecutionEngine *v4 = f->internalClass()->engine; if (v4->hasException) return Encode::undefined(); CHECK_STACK_LIMITS(v4); @@ -612,7 +612,7 @@ BoundFunction::BoundFunction(ExecutionContext *scope, FunctionObjectRef target, , boundArgs(boundArgs) { setVTable(staticVTable()); - subtype = FunctionObject::BoundFunction; + setSubtype(FunctionObject::BoundFunction); this->boundThis = boundThis; Scope s(scope); diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index ef58ffce7f..0160bfd986 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -139,6 +139,10 @@ struct Q_QML_EXPORT FunctionObject: Object { ReturnedValue protoProperty() { return memberData[Index_Prototype].asReturnedValue(); } + bool needsActivation() const { return managedData()->needsActivation; } + bool strictMode() const { return managedData()->strictMode; } + bool bindingKeyFlag() const { return managedData()->bindingKeyFlag; } + protected: FunctionObject(InternalClass *ic); diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp index eb0994c1e6..72be42d972 100644 --- a/src/qml/jsruntime/qv4globalobject.cpp +++ b/src/qml/jsruntime/qv4globalobject.cpp @@ -409,11 +409,11 @@ ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall) if (!function) return Encode::undefined(); - strictMode = function->isStrict() || (ctx->strictMode); + managedData()->strictMode = function->isStrict() || (ctx->strictMode); - needsActivation = function->needsActivation(); + managedData()->needsActivation = function->needsActivation(); - if (strictMode) { + if (strictMode()) { ScopedFunctionObject e(scope, FunctionObject::createScriptFunction(ctx, function)); ScopedCallData callData(scope, 0); callData->thisObject = ctx->callData->thisObject; @@ -428,7 +428,7 @@ ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall) ctx->currentEvalCode = &evalCode; // set the correct strict mode flag on the context - ctx->strictMode = strictMode; + ctx->strictMode = strictMode(); ctx->compilationUnit = function->compilationUnit; return function->code(ctx, function->codeData); diff --git a/src/qml/jsruntime/qv4identifiertable.cpp b/src/qml/jsruntime/qv4identifiertable.cpp index e300a4811e..3b56b5cf9f 100644 --- a/src/qml/jsruntime/qv4identifiertable.cpp +++ b/src/qml/jsruntime/qv4identifiertable.cpp @@ -77,7 +77,7 @@ void IdentifierTable::addEntry(String *str) { uint hash = str->hashValue(); - if (str->subtype == String::StringType_ArrayIndex) + if (str->subtype() == String::StringType_ArrayIndex) return; str->identifier = new Identifier; @@ -140,7 +140,7 @@ Identifier *IdentifierTable::identifierImpl(const String *str) if (str->identifier) return str->identifier; uint hash = str->hashValue(); - if (str->subtype == String::StringType_ArrayIndex) + if (str->subtype() == String::StringType_ArrayIndex) return 0; uint idx = hash % alloc; diff --git a/src/qml/jsruntime/qv4identifiertable_p.h b/src/qml/jsruntime/qv4identifiertable_p.h index 09956fc342..2f5ba0d707 100644 --- a/src/qml/jsruntime/qv4identifiertable_p.h +++ b/src/qml/jsruntime/qv4identifiertable_p.h @@ -82,11 +82,11 @@ public: void mark(ExecutionEngine *e) { for (int i = 0; i < alloc; ++i) { String *entry = entries[i]; - if (!entry || entry->markBit) + if (!entry || entry->data.markBit) continue; - entry->markBit = 1; - Q_ASSERT(entry->internalClass->vtable->markObjects); - entry->internalClass->vtable->markObjects(entry, e); + entry->data.markBit = 1; + Q_ASSERT(entry->data.internalClass->vtable->markObjects); + entry->data.internalClass->vtable->markObjects(entry, e); } } }; diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp index 3dc20b8e76..cb8841e681 100644 --- a/src/qml/jsruntime/qv4internalclass.cpp +++ b/src/qml/jsruntime/qv4internalclass.cpp @@ -155,18 +155,18 @@ InternalClass::InternalClass(const QV4::InternalClass &other) void InternalClass::changeMember(Object *object, String *string, PropertyAttributes data, uint *index) { uint idx; - InternalClass *newClass = object->internalClass->changeMember(string, data, &idx); + InternalClass *newClass = object->internalClass()->changeMember(string, data, &idx); if (index) *index = idx; - if (newClass->size > object->internalClass->size) { - Q_ASSERT(newClass->size == object->internalClass->size + 1); - memmove(object->memberData.data() + idx + 2, object->memberData.data() + idx + 1, (object->internalClass->size - idx - 1)*sizeof(Value)); - } else if (newClass->size < object->internalClass->size) { - Q_ASSERT(newClass->size == object->internalClass->size - 1); - memmove(object->memberData.data() + idx + 1, object->memberData.data() + idx + 2, (object->internalClass->size - idx - 2)*sizeof(Value)); + if (newClass->size > object->internalClass()->size) { + Q_ASSERT(newClass->size == object->internalClass()->size + 1); + memmove(object->memberData.data() + idx + 2, object->memberData.data() + idx + 1, (object->internalClass()->size - idx - 1)*sizeof(Value)); + } else if (newClass->size < object->internalClass()->size) { + Q_ASSERT(newClass->size == object->internalClass()->size - 1); + memmove(object->memberData.data() + idx + 1, object->memberData.data() + idx + 2, (object->internalClass()->size - idx - 2)*sizeof(Value)); } - object->internalClass = newClass; + object->setInternalClass(newClass); } InternalClass *InternalClass::changeMember(String *string, PropertyAttributes data, uint *index) @@ -279,18 +279,18 @@ void InternalClass::addMember(Object *object, StringRef string, PropertyAttribut void InternalClass::addMember(Object *object, String *string, PropertyAttributes data, uint *index) { data.resolve(); - object->internalClass->engine->identifierTable->identifier(string); - if (object->internalClass->propertyTable.lookup(string->identifier) < object->internalClass->size) { + object->internalClass()->engine->identifierTable->identifier(string); + if (object->internalClass()->propertyTable.lookup(string->identifier) < object->internalClass()->size) { changeMember(object, string, data, index); return; } uint idx; - InternalClass *newClass = object->internalClass->addMemberImpl(string, data, &idx); + InternalClass *newClass = object->internalClass()->addMemberImpl(string, data, &idx); if (index) *index = idx; - object->internalClass = newClass; + object->setInternalClass(newClass); } @@ -346,15 +346,15 @@ InternalClass *InternalClass::addMemberImpl(String *string, PropertyAttributes d void InternalClass::removeMember(Object *object, Identifier *id) { - InternalClass *oldClass = object->internalClass; + InternalClass *oldClass = object->internalClass(); uint propIdx = oldClass->propertyTable.lookup(id); Q_ASSERT(propIdx < oldClass->size); Transition t = { { id } , -1 }; - QHash::const_iterator tit = object->internalClass->transitions.constFind(t); + QHash::const_iterator tit = object->internalClass()->transitions.constFind(t); - if (tit != object->internalClass->transitions.constEnd()) { - object->internalClass = tit.value(); + if (tit != object->internalClass()->transitions.constEnd()) { + object->setInternalClass(tit.value()); } else { // create a new class and add it to the tree InternalClass *newClass = oldClass->engine->emptyClass->changeVTable(oldClass->vtable); @@ -365,13 +365,13 @@ void InternalClass::removeMember(Object *object, Identifier *id) if (!oldClass->propertyData.at(i).isEmpty()) newClass = newClass->addMember(oldClass->nameMap.at(i), oldClass->propertyData.at(i)); } - object->internalClass = newClass; + object->setInternalClass(newClass); } // remove the entry in memberdata - memmove(object->memberData.data() + propIdx, object->memberData.data() + propIdx + 1, (object->internalClass->size - propIdx)*sizeof(Value)); + memmove(object->memberData.data() + propIdx, object->memberData.data() + propIdx + 1, (object->internalClass()->size - propIdx)*sizeof(Value)); - oldClass->transitions.insert(t, object->internalClass); + oldClass->transitions.insert(t, object->internalClass()); } uint InternalClass::find(const StringRef string) diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp index 1155bbf9e9..024dc0aeee 100644 --- a/src/qml/jsruntime/qv4lookup.cpp +++ b/src/qml/jsruntime/qv4lookup.cpp @@ -51,12 +51,12 @@ ReturnedValue Lookup::lookup(ValueRef thisObject, Object *obj, PropertyAttribute { int i = 0; while (i < Size && obj) { - classList[i] = obj->internalClass; + classList[i] = obj->internalClass(); - index = obj->internalClass->find(name); + index = obj->internalClass()->find(name); if (index != UINT_MAX) { level = i; - *attrs = obj->internalClass->propertyData.at(index); + *attrs = obj->internalClass()->propertyData.at(index); return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : obj->getValue(thisObject, obj->propertyAt(index), *attrs); } @@ -66,9 +66,9 @@ ReturnedValue Lookup::lookup(ValueRef thisObject, Object *obj, PropertyAttribute level = Size; while (obj) { - index = obj->internalClass->find(name); + index = obj->internalClass()->find(name); if (index != UINT_MAX) { - *attrs = obj->internalClass->propertyData.at(index); + *attrs = obj->internalClass()->propertyData.at(index); return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : obj->getValue(thisObject, obj->propertyAt(index), *attrs); } @@ -82,12 +82,12 @@ ReturnedValue Lookup::lookup(Object *obj, PropertyAttributes *attrs) Object *thisObject = obj; int i = 0; while (i < Size && obj) { - classList[i] = obj->internalClass; + classList[i] = obj->internalClass(); - index = obj->internalClass->find(name); + index = obj->internalClass()->find(name); if (index != UINT_MAX) { level = i; - *attrs = obj->internalClass->propertyData.at(index); + *attrs = obj->internalClass()->propertyData.at(index); return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs); } @@ -97,9 +97,9 @@ ReturnedValue Lookup::lookup(Object *obj, PropertyAttributes *attrs) level = Size; while (obj) { - index = obj->internalClass->find(name); + index = obj->internalClass()->find(name); if (index != UINT_MAX) { - *attrs = obj->internalClass->propertyData.at(index); + *attrs = obj->internalClass()->propertyData.at(index); return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs); } @@ -340,7 +340,7 @@ ReturnedValue Lookup::getter0(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass) + if (l->classList[0] == o->internalClass()) return o->memberData[l->index].asReturnedValue(); } return getterTwoClasses(l, object); @@ -352,8 +352,8 @@ ReturnedValue Lookup::getter1(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) return o->prototype()->memberData[l->index].asReturnedValue(); } return getterTwoClasses(l, object); @@ -365,11 +365,11 @@ ReturnedValue Lookup::getter2(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { o = o->prototype(); - if (l->classList[1] == o->internalClass) { + if (l->classList[1] == o->internalClass()) { o = o->prototype(); - if (l->classList[2] == o->internalClass) + if (l->classList[2] == o->internalClass()) return o->memberData[l->index].asReturnedValue(); } } @@ -384,9 +384,9 @@ ReturnedValue Lookup::getter0getter0(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass) + if (l->classList[0] == o->internalClass()) return o->memberData[l->index].asReturnedValue(); - if (l->classList[2] == o->internalClass) + if (l->classList[2] == o->internalClass()) return o->memberData[l->index2].asReturnedValue(); } l->getter = getterFallback; @@ -399,10 +399,10 @@ ReturnedValue Lookup::getter0getter1(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass) + if (l->classList[0] == o->internalClass()) return o->memberData[l->index].asReturnedValue(); - if (l->classList[2] == o->internalClass && - l->classList[3] == o->prototype()->internalClass) + if (l->classList[2] == o->internalClass() && + l->classList[3] == o->prototype()->internalClass()) return o->prototype()->memberData[l->index2].asReturnedValue(); } l->getter = getterFallback; @@ -415,11 +415,11 @@ ReturnedValue Lookup::getter1getter1(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) return o->prototype()->memberData[l->index].asReturnedValue(); - if (l->classList[2] == o->internalClass && - l->classList[3] == o->prototype()->internalClass) + if (l->classList[2] == o->internalClass() && + l->classList[3] == o->prototype()->internalClass()) return o->prototype()->memberData[l->index2].asReturnedValue(); return getterFallback(l, object); } @@ -434,7 +434,7 @@ ReturnedValue Lookup::getterAccessor0(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->propertyAt(l->index)->getter(); if (!getter) @@ -455,8 +455,8 @@ ReturnedValue Lookup::getterAccessor1(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) { + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->prototype()->propertyAt(l->index)->getter(); if (!getter) @@ -477,11 +477,11 @@ ReturnedValue Lookup::getterAccessor2(Lookup *l, const ValueRef object) // we can safely cast to a QV4::Object here. If object is actually a string, // the internal class won't match Object *o = object->objectValue(); - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { o = o->prototype(); - if (l->classList[1] == o->internalClass) { + if (l->classList[1] == o->internalClass()) { o = o->prototype(); - if (l->classList[2] == o->internalClass) { + if (l->classList[2] == o->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->propertyAt(l->index)->getter(); if (!getter) @@ -502,7 +502,7 @@ ReturnedValue Lookup::primitiveGetter0(Lookup *l, const ValueRef object) { if (object->type() == l->type) { Object *o = l->proto; - if (l->classList[0] == o->internalClass) + if (l->classList[0] == o->internalClass()) return o->memberData[l->index].asReturnedValue(); } l->getter = getterGeneric; @@ -513,8 +513,8 @@ ReturnedValue Lookup::primitiveGetter1(Lookup *l, const ValueRef object) { if (object->type() == l->type) { Object *o = l->proto; - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) return o->prototype()->memberData[l->index].asReturnedValue(); } l->getter = getterGeneric; @@ -525,7 +525,7 @@ ReturnedValue Lookup::primitiveGetterAccessor0(Lookup *l, const ValueRef object) { if (object->type() == l->type) { Object *o = l->proto; - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->propertyAt(l->index)->getter(); if (!getter) @@ -544,8 +544,8 @@ ReturnedValue Lookup::primitiveGetterAccessor1(Lookup *l, const ValueRef object) { if (object->type() == l->type) { Object *o = l->proto; - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) { + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->prototype()->propertyAt(l->index)->getter(); if (!getter) @@ -611,7 +611,7 @@ ReturnedValue Lookup::globalGetterGeneric(Lookup *l, ExecutionContext *ctx) ReturnedValue Lookup::globalGetter0(Lookup *l, ExecutionContext *ctx) { Object *o = ctx->engine->globalObject; - if (l->classList[0] == o->internalClass) + if (l->classList[0] == o->internalClass()) return o->memberData[l->index].asReturnedValue(); l->globalGetter = globalGetterGeneric; @@ -621,8 +621,8 @@ ReturnedValue Lookup::globalGetter0(Lookup *l, ExecutionContext *ctx) ReturnedValue Lookup::globalGetter1(Lookup *l, ExecutionContext *ctx) { Object *o = ctx->engine->globalObject; - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) return o->prototype()->memberData[l->index].asReturnedValue(); l->globalGetter = globalGetterGeneric; @@ -632,11 +632,11 @@ ReturnedValue Lookup::globalGetter1(Lookup *l, ExecutionContext *ctx) ReturnedValue Lookup::globalGetter2(Lookup *l, ExecutionContext *ctx) { Object *o = ctx->engine->globalObject; - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { o = o->prototype(); - if (l->classList[1] == o->internalClass) { + if (l->classList[1] == o->internalClass()) { o = o->prototype(); - if (l->classList[2] == o->internalClass) { + if (l->classList[2] == o->internalClass()) { return o->prototype()->memberData[l->index].asReturnedValue(); } } @@ -648,7 +648,7 @@ ReturnedValue Lookup::globalGetter2(Lookup *l, ExecutionContext *ctx) ReturnedValue Lookup::globalGetterAccessor0(Lookup *l, ExecutionContext *ctx) { Object *o = ctx->engine->globalObject; - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->propertyAt(l->index)->getter(); if (!getter) @@ -665,8 +665,8 @@ ReturnedValue Lookup::globalGetterAccessor0(Lookup *l, ExecutionContext *ctx) ReturnedValue Lookup::globalGetterAccessor1(Lookup *l, ExecutionContext *ctx) { Object *o = ctx->engine->globalObject; - if (l->classList[0] == o->internalClass && - l->classList[1] == o->prototype()->internalClass) { + if (l->classList[0] == o->internalClass() && + l->classList[1] == o->prototype()->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->prototype()->propertyAt(l->index)->getter(); if (!getter) @@ -683,11 +683,11 @@ ReturnedValue Lookup::globalGetterAccessor1(Lookup *l, ExecutionContext *ctx) ReturnedValue Lookup::globalGetterAccessor2(Lookup *l, ExecutionContext *ctx) { Object *o = ctx->engine->globalObject; - if (l->classList[0] == o->internalClass) { + if (l->classList[0] == o->internalClass()) { o = o->prototype(); - if (l->classList[1] == o->internalClass) { + if (l->classList[1] == o->internalClass()) { o = o->prototype(); - if (l->classList[2] == o->internalClass) { + if (l->classList[2] == o->internalClass()) { Scope scope(o->engine()); FunctionObject *getter = o->propertyAt(l->index)->getter(); if (!getter) @@ -750,7 +750,7 @@ void Lookup::setterFallback(Lookup *l, const ValueRef object, const ValueRef val void Lookup::setter0(Lookup *l, const ValueRef object, const ValueRef value) { Object *o = static_cast(object->asManaged()); - if (o && o->internalClass == l->classList[0]) { + if (o && o->internalClass() == l->classList[0]) { o->memberData[l->index] = *value; return; } @@ -761,12 +761,12 @@ void Lookup::setter0(Lookup *l, const ValueRef object, const ValueRef value) void Lookup::setterInsert0(Lookup *l, const ValueRef object, const ValueRef value) { Object *o = static_cast(object->asManaged()); - if (o && o->internalClass == l->classList[0]) { + if (o && o->internalClass() == l->classList[0]) { if (!o->prototype()) { if (l->index >= o->memberData.size()) o->ensureMemberIndex(l->index); o->memberData[l->index] = *value; - o->internalClass = l->classList[3]; + o->setInternalClass(l->classList[3]); return; } } @@ -778,13 +778,13 @@ void Lookup::setterInsert0(Lookup *l, const ValueRef object, const ValueRef valu void Lookup::setterInsert1(Lookup *l, const ValueRef object, const ValueRef value) { Object *o = static_cast(object->asManaged()); - if (o && o->internalClass == l->classList[0]) { + if (o && o->internalClass() == l->classList[0]) { Object *p = o->prototype(); - if (p && p->internalClass == l->classList[1]) { + if (p && p->internalClass() == l->classList[1]) { if (l->index >= o->memberData.size()) o->ensureMemberIndex(l->index); o->memberData[l->index] = *value; - o->internalClass = l->classList[3]; + o->setInternalClass(l->classList[3]); return; } } @@ -796,15 +796,15 @@ void Lookup::setterInsert1(Lookup *l, const ValueRef object, const ValueRef valu void Lookup::setterInsert2(Lookup *l, const ValueRef object, const ValueRef value) { Object *o = static_cast(object->asManaged()); - if (o && o->internalClass == l->classList[0]) { + if (o && o->internalClass() == l->classList[0]) { Object *p = o->prototype(); - if (p && p->internalClass == l->classList[1]) { + if (p && p->internalClass() == l->classList[1]) { p = p->prototype(); - if (p && p->internalClass == l->classList[2]) { + if (p && p->internalClass() == l->classList[2]) { if (l->index >= o->memberData.size()) o->ensureMemberIndex(l->index); o->memberData[l->index] = *value; - o->internalClass = l->classList[3]; + o->setInternalClass(l->classList[3]); return; } } @@ -818,11 +818,11 @@ void Lookup::setter0setter0(Lookup *l, const ValueRef object, const ValueRef val { Object *o = static_cast(object->asManaged()); if (o) { - if (o->internalClass == l->classList[0]) { + if (o->internalClass() == l->classList[0]) { o->memberData[l->index] = *value; return; } - if (o->internalClass == l->classList[1]) { + if (o->internalClass() == l->classList[1]) { o->memberData[l->index2] = *value; return; } diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp index 69022df07d..1bddf69dbb 100644 --- a/src/qml/jsruntime/qv4managed.cpp +++ b/src/qml/jsruntime/qv4managed.cpp @@ -70,33 +70,15 @@ void *Managed::operator new(size_t size, MemoryManager *mm) return mm->allocManaged(size); } -void Managed::operator delete(void *ptr) -{ - if (!ptr) - return; - - Managed *m = static_cast(ptr); - m->_data = 0; - m->markBit = 0; - m->~Managed(); -} - -void Managed::operator delete(void *ptr, MemoryManager *mm) -{ - Q_UNUSED(mm); - - operator delete(ptr); -} - ExecutionEngine *Managed::engine() const { - return internalClass ? internalClass->engine : 0; + return internalClass()->engine; } QString Managed::className() const { const char *s = 0; - switch (Type(internalClass->vtable->type)) { + switch (Type(internalClass()->vtable->type)) { case Type_Invalid: case Type_String: return QString(); @@ -125,7 +107,7 @@ QString Managed::className() const s = "RegExp"; break; case Type_ErrorObject: - switch (ErrorObject::ErrorType(subtype)) { + switch (ErrorObject::ErrorType(subtype())) { case ErrorObject::Error: s = "Error"; break; @@ -178,8 +160,8 @@ QString Managed::className() const void Managed::setVTable(const ManagedVTable *vt) { - Q_ASSERT(internalClass); - internalClass = internalClass->changeVTable(vt); + Q_ASSERT(internalClass()); + managedData()->internalClass = internalClass()->changeVTable(vt); } bool Managed::isEqualTo(Managed *, Managed *) diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 93a50e21e6..99ba0a09bf 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -188,17 +188,17 @@ private: protected: Managed(InternalClass *internal) - : internalClass(internal), _data(0) { - Q_ASSERT(internalClass && internalClass->vtable); - inUse = 1; extensible = 1; + Q_ASSERT(internal && internal->vtable); + managedData()->internalClass = internal; + managedData()->_data = 0; + managedData()->inUse = 1; + managedData()->extensible = 1; } public: void *operator new(size_t size, MemoryManager *mm); void *operator new(size_t, Managed *m) { return m; } - void operator delete(void *ptr); - void operator delete(void *ptr, MemoryManager *mm); inline void mark(QV4::ExecutionEngine *engine); @@ -231,12 +231,12 @@ public: template T *as() { // ### FIXME: - if (!this || !internalClass) + if (!this || !internalClass()) return 0; #if !defined(QT_NO_QOBJECT_CHECK) static_cast(this)->qt_check_for_QMANAGED_macro(static_cast(this)); #endif - return internalClass->vtable == T::staticVTable() ? static_cast(this) : 0; + return internalClass()->vtable == T::staticVTable() ? static_cast(this) : 0; } template const T *as() const { @@ -246,24 +246,24 @@ public: #if !defined(QT_NO_QOBJECT_CHECK) static_cast(this)->qt_check_for_QMANAGED_macro(static_cast(const_cast(this))); #endif - return internalClass->vtable == T::staticVTable() ? static_cast(this) : 0; + return internalClass()->vtable == T::staticVTable() ? static_cast(this) : 0; } - String *asString() { return internalClass->vtable->isString ? reinterpret_cast(this) : 0; } - Object *asObject() { return internalClass->vtable->isObject ? reinterpret_cast(this) : 0; } - ArrayObject *asArrayObject() { return internalClass->vtable->type == Type_ArrayObject ? reinterpret_cast(this) : 0; } - FunctionObject *asFunctionObject() { return internalClass->vtable->isFunctionObject ? reinterpret_cast(this) : 0; } - BooleanObject *asBooleanObject() { return internalClass->vtable->type == Type_BooleanObject ? reinterpret_cast(this) : 0; } - NumberObject *asNumberObject() { return internalClass->vtable->type == Type_NumberObject ? reinterpret_cast(this) : 0; } - StringObject *asStringObject() { return internalClass->vtable->type == Type_StringObject ? reinterpret_cast(this) : 0; } - DateObject *asDateObject() { return internalClass->vtable->type == Type_DateObject ? reinterpret_cast(this) : 0; } - ErrorObject *asErrorObject() { return internalClass->vtable->isErrorObject ? reinterpret_cast(this) : 0; } - ArgumentsObject *asArgumentsObject() { return internalClass->vtable->type == Type_ArgumentsObject ? reinterpret_cast(this) : 0; } + String *asString() { return internalClass()->vtable->isString ? reinterpret_cast(this) : 0; } + Object *asObject() { return internalClass()->vtable->isObject ? reinterpret_cast(this) : 0; } + ArrayObject *asArrayObject() { return internalClass()->vtable->type == Type_ArrayObject ? reinterpret_cast(this) : 0; } + FunctionObject *asFunctionObject() { return internalClass()->vtable->isFunctionObject ? reinterpret_cast(this) : 0; } + BooleanObject *asBooleanObject() { return internalClass()->vtable->type == Type_BooleanObject ? reinterpret_cast(this) : 0; } + NumberObject *asNumberObject() { return internalClass()->vtable->type == Type_NumberObject ? reinterpret_cast(this) : 0; } + StringObject *asStringObject() { return internalClass()->vtable->type == Type_StringObject ? reinterpret_cast(this) : 0; } + DateObject *asDateObject() { return internalClass()->vtable->type == Type_DateObject ? reinterpret_cast(this) : 0; } + ErrorObject *asErrorObject() { return internalClass()->vtable->isErrorObject ? reinterpret_cast(this) : 0; } + ArgumentsObject *asArgumentsObject() { return internalClass()->vtable->type == Type_ArgumentsObject ? reinterpret_cast(this) : 0; } - bool isListType() const { return internalClass->vtable->type == Type_QmlSequence; } + bool isListType() const { return internalClass()->vtable->type == Type_QmlSequence; } - bool isArrayObject() const { return internalClass->vtable->type == Type_ArrayObject; } - bool isStringObject() const { return internalClass->vtable->type == Type_StringObject; } + bool isArrayObject() const { return internalClass()->vtable->type == Type_ArrayObject; } + bool isStringObject() const { return internalClass()->vtable->type == Type_StringObject; } QString className() const; @@ -280,33 +280,46 @@ public: void setVTable(const ManagedVTable *vt); bool isEqualTo(Managed *other) - { return internalClass->vtable->isEqualTo(this, other); } + { return internalClass()->vtable->isEqualTo(this, other); } static bool isEqualTo(Managed *m, Managed *other); ReturnedValue asReturnedValue() { return Value::fromManaged(this).asReturnedValue(); } - - InternalClass *internalClass; - - union { - uint _data; - struct { - uchar markBit : 1; - uchar inUse : 1; - uchar extensible : 1; // used by Object - uchar _unused : 1; - uchar needsActivation : 1; // used by FunctionObject - uchar strictMode : 1; // used by FunctionObject - uchar bindingKeyFlag : 1; - uchar hasAccessorProperty : 1; - uchar _type; - mutable uchar subtype; - uchar _flags; + struct Data { + InternalClass *internalClass; + union { + uint _data; + struct { + uchar markBit : 1; + uchar inUse : 1; + uchar extensible : 1; // used by Object + uchar _unused : 1; + uchar needsActivation : 1; // used by FunctionObject + uchar strictMode : 1; // used by FunctionObject + uchar bindingKeyFlag : 1; + uchar hasAccessorProperty : 1; + uchar _type; + mutable uchar subtype; + uchar _flags; + }; }; }; - static void destroy(Managed *) {} + Data data; + + Data *managedData() { return &data; } + const Data *managedData() const { return &data; } + + InternalClass *internalClass() const { return managedData()->internalClass; } + void setInternalClass(InternalClass *ic) { managedData()->internalClass = ic; } + uchar subtype() const { return managedData()->subtype; } + void setSubtype(uchar subtype) const { managedData()->subtype = subtype; } + + bool inUse() const { return managedData()->inUse; } + bool markBit() const { return managedData()->markBit; } + + static void destroy(Managed *) {} private: friend class MemoryManager; friend struct Identifiers; diff --git a/src/qml/jsruntime/qv4mm.cpp b/src/qml/jsruntime/qv4mm.cpp index 3998857291..fdc8c9b25f 100644 --- a/src/qml/jsruntime/qv4mm.cpp +++ b/src/qml/jsruntime/qv4mm.cpp @@ -237,7 +237,6 @@ Managed *MemoryManager::alloc(std::size_t size) Managed **last = &m_d->smallItems[pos]; while (chunk <= end) { Managed *o = reinterpret_cast(chunk); - o->_data = 0; *last = o; last = o->nextFreeRef(); chunk += size; @@ -318,8 +317,8 @@ void MemoryManager::mark() // now that we marked all roots, start marking recursively and popping from the mark stack while (m_d->engine->jsStackTop > markBase) { Managed *m = m_d->engine->popForGC(); - Q_ASSERT (m->internalClass->vtable->markObjects); - m->internalClass->vtable->markObjects(m, m_d->engine); + Q_ASSERT (m->internalClass()->vtable->markObjects); + m->internalClass()->vtable->markObjects(m, m_d->engine); } } @@ -335,7 +334,7 @@ void MemoryManager::sweep(bool lastSweep) continue; } if (Managed *m = weak->value.asManaged()) { - if (!m->markBit) { + if (!m->markBit()) { weak->value = Primitive::undefinedValue(); PersistentValuePrivate *n = weak->next; weak->removeFromList(); @@ -348,7 +347,7 @@ void MemoryManager::sweep(bool lastSweep) if (MultiplyWrappedQObjectMap *multiplyWrappedQObjects = m_d->engine->m_multiplyWrappedQObjects) { for (MultiplyWrappedQObjectMap::Iterator it = multiplyWrappedQObjects->begin(); it != multiplyWrappedQObjects->end();) { - if (!it.value()->markBit) + if (!it.value()->markBit()) it = multiplyWrappedQObjects->erase(it); else ++it; @@ -362,15 +361,15 @@ void MemoryManager::sweep(bool lastSweep) Data::LargeItem **last = &m_d->largeItems; while (i) { Managed *m = i->managed(); - Q_ASSERT(m->inUse); - if (m->markBit) { - m->markBit = 0; + Q_ASSERT(m->inUse()); + if (m->markBit()) { + m->managedData()->markBit = 0; last = &i->next; i = i->next; continue; } - if (m->internalClass->vtable->destroy) - m->internalClass->vtable->destroy(m); + if (m->internalClass()->vtable->destroy) + m->internalClass()->vtable->destroy(m); *last = i->next; free(Q_V4_PROFILE_DEALLOC(m_d->engine, i, i->size + sizeof(Data::LargeItem), @@ -403,16 +402,16 @@ void MemoryManager::sweep(char *chunkStart, std::size_t chunkSize, size_t size) Q_ASSERT((qintptr) chunk % 16 == 0); - if (m->inUse) { - if (m->markBit) { - m->markBit = 0; + if (m->inUse()) { + if (m->markBit()) { + m->managedData()->markBit = 0; } else { // qDebug() << "-- collecting it." << m << *f << m->nextFree(); #ifdef V4_USE_VALGRIND VALGRIND_ENABLE_ERROR_REPORTING; #endif - if (m->internalClass->vtable->destroy) - m->internalClass->vtable->destroy(m); + if (m->internalClass()->vtable->destroy) + m->internalClass()->vtable->destroy(m); memset(m, 0, size); m->setNextFree(*f); @@ -486,7 +485,7 @@ size_t MemoryManager::getUsedMem() const for (char *chunk = chunkStart; chunk <= chunkEnd; chunk += i->chunkSize) { Managed *m = reinterpret_cast(chunk); Q_ASSERT((qintptr) chunk % 16 == 0); - if (m->inUse) + if (m->inUse()) usedMem += i->chunkSize; } } @@ -570,7 +569,7 @@ void MemoryManager::collectFromJSStack() const Value *top = m_d->engine->jsStackTop; while (v < top) { Managed *m = v->asManaged(); - if (m && m->inUse) + if (m && m->inUse()) // Skip pointers to already freed objects, they are bogus as well m->mark(m_d->engine); ++v; diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index 11f8202325..cc123866be 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -78,13 +78,13 @@ Object::Object(ExecutionEngine *engine) Object::Object(InternalClass *ic) : Managed(ic) { - Q_ASSERT(internalClass->vtable && internalClass->vtable != &Managed::static_vtbl); + Q_ASSERT(internalClass()->vtable != &Managed::static_vtbl); Q_ASSERT(!memberData.d()); - if (internalClass->size) { + if (internalClass()->size) { Scope scope(engine()); ScopedObject protectThis(scope, this); - memberData.ensureIndex(engine(), internalClass->size); + memberData.ensureIndex(engine(), internalClass()->size); } } @@ -96,7 +96,7 @@ bool Object::setPrototype(Object *proto) return false; pp = pp->prototype(); } - internalClass = internalClass->changePrototype(proto); + setInternalClass(internalClass()->changePrototype(proto)); return true; } @@ -123,7 +123,7 @@ ReturnedValue Object::getValue(const ValueRef thisObject, const Property *p, Pro void Object::putValue(Property *pd, PropertyAttributes attrs, const ValueRef value) { - if (internalClass->engine->hasException) + if (internalClass()->engine->hasException) return; if (attrs.isAccessor()) { @@ -227,10 +227,10 @@ void Object::insertMember(const StringRef s, const Property &p, PropertyAttribut InternalClass::addMember(this, s.getPointer(), attributes, &idx); - ensureMemberIndex(internalClass->size); + ensureMemberIndex(internalClass()->size); if (attributes.isAccessor()) { - hasAccessorProperty = 1; + setHasAccessorProperty(); Property *pp = propertyAt(idx); pp->value = p.value; pp->set = p.set; @@ -246,10 +246,10 @@ Property *Object::__getOwnProperty__(const StringRef name, PropertyAttributes *a if (idx != UINT_MAX) return __getOwnProperty__(idx, attrs); - uint member = internalClass->find(name); + uint member = internalClass()->find(name); if (member < UINT_MAX) { if (attrs) - *attrs = internalClass->propertyData[member]; + *attrs = internalClass()->propertyData[member]; return propertyAt(member); } @@ -287,10 +287,10 @@ Property *Object::__getPropertyDescriptor__(const StringRef name, PropertyAttrib const Object *o = this; while (o) { - uint idx = o->internalClass->find(name.getPointer()); + uint idx = o->internalClass()->find(name.getPointer()); if (idx < UINT_MAX) { if (attrs) - *attrs = o->internalClass->propertyData[idx]; + *attrs = o->internalClass()->propertyData[idx]; return o->propertyAt(idx); } @@ -362,7 +362,7 @@ bool Object::hasOwnProperty(const StringRef name) const if (idx != UINT_MAX) return hasOwnProperty(idx); - if (internalClass->find(name) < UINT_MAX) + if (internalClass()->find(name) < UINT_MAX) return true; if (!query(name).isEmpty()) return true; @@ -420,9 +420,9 @@ PropertyAttributes Object::query(const Managed *m, StringRef name) return queryIndexed(m, idx); const Object *o = static_cast(m); - idx = o->internalClass->find(name.getPointer()); + idx = o->internalClass()->find(name.getPointer()); if (idx < UINT_MAX) - return o->internalClass->propertyData[idx]; + return o->internalClass()->propertyData[idx]; return Attr_Invalid; } @@ -487,11 +487,11 @@ void Object::setLookup(Managed *m, Lookup *l, const ValueRef value) Scope scope(m->engine()); ScopedObject o(scope, static_cast(m)); - InternalClass *c = o->internalClass; + InternalClass *c = o->internalClass(); uint idx = c->find(l->name); if (!o->isArrayObject() || idx != ArrayObject::LengthPropertyIndex) { - if (idx != UINT_MAX && o->internalClass->propertyData[idx].isData() && o->internalClass->propertyData[idx].isWritable()) { - l->classList[0] = o->internalClass; + if (idx != UINT_MAX && o->internalClass()->propertyData[idx].isData() && o->internalClass()->propertyData[idx].isWritable()) { + l->classList[0] = o->internalClass(); l->index = idx; l->setter = Lookup::setter0; o->memberData[idx] = *value; @@ -499,7 +499,7 @@ void Object::setLookup(Managed *m, Lookup *l, const ValueRef value) } if (idx != UINT_MAX) { - o->putValue(o->propertyAt(idx), o->internalClass->propertyData[idx], value); + o->putValue(o->propertyAt(idx), o->internalClass()->propertyData[idx], value); return; } } @@ -507,26 +507,26 @@ void Object::setLookup(Managed *m, Lookup *l, const ValueRef value) ScopedString s(scope, l->name); o->put(s, value); - if (o->internalClass == c) + if (o->internalClass() == c) return; - idx = o->internalClass->find(l->name); + idx = o->internalClass()->find(l->name); if (idx == UINT_MAX) return; l->classList[0] = c; - l->classList[3] = o->internalClass; + l->classList[3] = o->internalClass(); l->index = idx; if (!o->prototype()) { l->setter = Lookup::setterInsert0; return; } o = o->prototype(); - l->classList[1] = o->internalClass; + l->classList[1] = o->internalClass(); if (!o->prototype()) { l->setter = Lookup::setterInsert1; return; } o = o->prototype(); - l->classList[2] = o->internalClass; + l->classList[2] = o->internalClass(); if (!o->prototype()) { l->setter = Lookup::setterInsert2; return; @@ -578,8 +578,8 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uin } } - while (it->memberIndex < o->internalClass->size) { - String *n = o->internalClass->nameMap.at(it->memberIndex); + while (it->memberIndex < o->internalClass()->size) { + String *n = o->internalClass()->nameMap.at(it->memberIndex); if (!n) { // accessor properties have a dummy entry with n == 0 ++it->memberIndex; @@ -587,7 +587,7 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uin } Property *p = o->propertyAt(it->memberIndex); - PropertyAttributes a = o->internalClass->propertyData[it->memberIndex]; + PropertyAttributes a = o->internalClass()->propertyData[it->memberIndex]; ++it->memberIndex; if (!(it->flags & ObjectIterator::EnumerableOnly) || a.isEnumerable()) { name = n; @@ -611,11 +611,11 @@ ReturnedValue Object::internalGet(const StringRef name, bool *hasProperty) Object *o = this; while (o) { - uint idx = o->internalClass->find(name.getPointer()); + uint idx = o->internalClass()->find(name.getPointer()); if (idx < UINT_MAX) { if (hasProperty) *hasProperty = true; - return getValue(o->propertyAt(idx), o->internalClass->propertyData.at(idx)); + return getValue(o->propertyAt(idx), o->internalClass()->propertyData.at(idx)); } o = o->prototype(); @@ -663,7 +663,7 @@ ReturnedValue Object::internalGetIndexed(uint index, bool *hasProperty) // Section 8.12.5 void Object::internalPut(const StringRef name, const ValueRef value) { - if (internalClass->engine->hasException) + if (internalClass()->engine->hasException) return; uint idx = name->asArrayIndex(); @@ -672,12 +672,12 @@ void Object::internalPut(const StringRef name, const ValueRef value) name->makeIdentifier(); - uint member = internalClass->find(name.getPointer()); + uint member = internalClass()->find(name.getPointer()); Property *pd = 0; PropertyAttributes attrs; if (member < UINT_MAX) { pd = propertyAt(member); - attrs = internalClass->propertyData[member]; + attrs = internalClass()->propertyData[member]; } // clause 1 @@ -703,7 +703,7 @@ void Object::internalPut(const StringRef name, const ValueRef value) } return; } else if (!prototype()) { - if (!extensible) + if (!isExtensible()) goto reject; } else { // clause 4 @@ -711,10 +711,10 @@ void Object::internalPut(const StringRef name, const ValueRef value) if (attrs.isAccessor()) { if (!pd->setter()) goto reject; - } else if (!extensible || !attrs.isWritable()) { + } else if (!isExtensible() || !attrs.isWritable()) { goto reject; } - } else if (!extensible) { + } else if (!isExtensible()) { goto reject; } } @@ -747,7 +747,7 @@ void Object::internalPut(const StringRef name, const ValueRef value) void Object::internalPutIndexed(uint index, const ValueRef value) { - if (internalClass->engine->hasException) + if (internalClass()->engine->hasException) return; PropertyAttributes attrs; @@ -775,7 +775,7 @@ void Object::internalPutIndexed(uint index, const ValueRef value) pd->value = *value; return; } else if (!prototype()) { - if (!extensible) + if (!isExtensible()) goto reject; } else { // clause 4 @@ -783,10 +783,10 @@ void Object::internalPutIndexed(uint index, const ValueRef value) if (attrs.isAccessor()) { if (!pd->setter()) goto reject; - } else if (!extensible || !attrs.isWritable()) { + } else if (!isExtensible() || !attrs.isWritable()) { goto reject; } - } else if (!extensible) { + } else if (!isExtensible()) { goto reject; } } @@ -816,7 +816,7 @@ void Object::internalPutIndexed(uint index, const ValueRef value) // Section 8.12.7 bool Object::internalDeleteProperty(const StringRef name) { - if (internalClass->engine->hasException) + if (internalClass()->engine->hasException) return false; uint idx = name->asArrayIndex(); @@ -825,9 +825,9 @@ bool Object::internalDeleteProperty(const StringRef name) name->makeIdentifier(); - uint memberIdx = internalClass->find(name); + uint memberIdx = internalClass()->find(name); if (memberIdx != UINT_MAX) { - if (internalClass->propertyData[memberIdx].isConfigurable()) { + if (internalClass()->propertyData[memberIdx].isConfigurable()) { InternalClass::removeMember(this, name->identifier); return true; } @@ -841,7 +841,7 @@ bool Object::internalDeleteProperty(const StringRef name) bool Object::internalDeleteIndexedProperty(uint index) { - if (internalClass->engine->hasException) + if (internalClass()->engine->hasException) return false; if (!arrayData || arrayData->vtable()->del(this, index)) @@ -867,9 +867,9 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name, uint memberIndex; if (isArrayObject() && name->equals(ctx->engine->id_length)) { - assert(ArrayObject::LengthPropertyIndex == internalClass->find(ctx->engine->id_length)); + assert(ArrayObject::LengthPropertyIndex == internalClass()->find(ctx->engine->id_length)); Property *lp = propertyAt(ArrayObject::LengthPropertyIndex); - cattrs = internalClass->propertyData.constData() + ArrayObject::LengthPropertyIndex; + cattrs = internalClass()->propertyData.constData() + ArrayObject::LengthPropertyIndex; if (attrs.isEmpty() || p.isSubset(attrs, *lp, *cattrs)) return true; if (!cattrs->isWritable() || attrs.type() == PropertyAttributes::Accessor || attrs.isConfigurable() || attrs.isEnumerable()) @@ -890,18 +890,18 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name, if (!succeeded) goto reject; if (attrs.isAccessor()) - hasAccessorProperty = 1; + setHasAccessorProperty(); return true; } // Clause 1 - memberIndex = internalClass->find(name.getPointer()); + memberIndex = internalClass()->find(name.getPointer()); current = (memberIndex < UINT_MAX) ? propertyAt(memberIndex) : 0; - cattrs = internalClass->propertyData.constData() + memberIndex; + cattrs = internalClass()->propertyData.constData() + memberIndex; if (!current) { // clause 3 - if (!extensible) + if (!isExtensible()) goto reject; // clause 4 Property pd; @@ -921,7 +921,7 @@ reject: bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Property &p, PropertyAttributes attrs) { // 15.4.5.1, 4b - if (isArrayObject() && index >= getLength() && !internalClass->propertyData[ArrayObject::LengthPropertyIndex].isWritable()) + if (isArrayObject() && index >= getLength() && !internalClass()->propertyData[ArrayObject::LengthPropertyIndex].isWritable()) goto reject; if (ArgumentsObject::isNonStrictArgumentsObject(this)) @@ -947,7 +947,7 @@ bool Object::defineOwnProperty2(ExecutionContext *ctx, uint index, const Propert if (!current) { // clause 3 - if (!extensible) + if (!isExtensible()) goto reject; // clause 4 Property pp; @@ -980,7 +980,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Stri PropertyAttributes cattrs; if (!member.isNull()) { current = propertyAt(index); - cattrs = internalClass->propertyData[index]; + cattrs = internalClass()->propertyData[index]; } else { current = arrayData->getProperty(index); cattrs = arrayData->attributes(index); @@ -1054,7 +1054,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Stri setArrayAttributes(index, cattrs); } if (cattrs.isAccessor()) - hasAccessorProperty = 1; + setHasAccessorProperty(); return true; reject: if (ctx->strictMode) @@ -1076,7 +1076,7 @@ void Object::copyArrayData(Object *other) Q_ASSERT(isArrayObject()); Scope scope(engine()); - if (other->protoHasArray() || other->hasAccessorProperty) { + if (other->protoHasArray() || other->hasAccessorProperty()) { uint len = other->getLength(); Q_ASSERT(len); @@ -1086,7 +1086,7 @@ void Object::copyArrayData(Object *other) } } else if (!other->arrayData) { ; - } else if (other->hasAccessorProperty && other->arrayData->attrs && other->arrayData->isSparse()){ + } else if (other->hasAccessorProperty() && other->arrayData->attrs && other->arrayData->isSparse()){ // do it the slow way ScopedValue v(scope); for (const SparseArrayNode *it = static_cast(other->arrayData)->sparse->begin(); @@ -1122,7 +1122,7 @@ uint Object::getLength(const Managed *m) bool Object::setArrayLength(uint newLen) { Q_ASSERT(isArrayObject()); - if (!internalClass->propertyData[ArrayObject::LengthPropertyIndex].isWritable()) + if (!internalClass()->propertyData[ArrayObject::LengthPropertyIndex].isWritable()) return false; uint oldLen = getLength(); bool ok = true; @@ -1203,7 +1203,7 @@ QStringList ArrayObject::toQStringList() const { QStringList result; - QV4::ExecutionEngine *engine = internalClass->engine; + QV4::ExecutionEngine *engine = internalClass()->engine; Scope scope(engine); ScopedValue v(scope); diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 666b6c91f9..9a443f0569 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -117,8 +117,8 @@ struct Q_QML_EXPORT Object: Managed { Object(ExecutionEngine *engine); Object(InternalClass *internalClass); - const ObjectVTable *vtable() const { return reinterpret_cast(internalClass->vtable); } - Object *prototype() const { return internalClass->prototype; } + const ObjectVTable *vtable() const { return reinterpret_cast(internalClass()->vtable); } + Object *prototype() const { return internalClass()->prototype; } bool setPrototype(Object *proto); Property *__getOwnProperty__(const StringRef name, PropertyAttributes *attrs = 0); @@ -172,7 +172,13 @@ struct Q_QML_EXPORT Object: Managed { } void insertMember(const StringRef s, const Property &p, PropertyAttributes attributes); - inline ExecutionEngine *engine() const { return internalClass->engine; } + inline ExecutionEngine *engine() const { return internalClass()->engine; } + + inline bool hasAccessorProperty() const { return managedData()->hasAccessorProperty; } + inline void setHasAccessorProperty() { managedData()->hasAccessorProperty = true; } + + bool isExtensible() const { return managedData()->extensible; } + void setExtensible(bool b) { managedData()->extensible = b; } // Array handling @@ -308,7 +314,7 @@ struct BooleanObject: Object { protected: BooleanObject(InternalClass *ic) : Object(ic) { - Q_ASSERT(internalClass->vtable == staticVTable()); + Q_ASSERT(internalClass()->vtable == staticVTable()); value = Encode(false); } }; @@ -324,7 +330,7 @@ struct NumberObject: Object { protected: NumberObject(InternalClass *ic) : Object(ic) { - Q_ASSERT(internalClass->vtable == staticVTable()); + Q_ASSERT(internalClass()->vtable == staticVTable()); value = Encode((int)0); } }; @@ -370,7 +376,7 @@ inline void Object::arraySet(uint index, const Property &p, PropertyAttributes a // ### Clean up arrayCreate(); if (attributes.isAccessor()) { - hasAccessorProperty = 1; + setHasAccessorProperty(); initSparseArray(); } else if (index > 0x1000 && index > 2*arrayData->alloc) { initSparseArray(); diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 5c824bdfbd..92c62d4cfd 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -268,9 +268,9 @@ ReturnedValue ObjectPrototype::method_seal(CallContext *ctx) if (!o) return ctx->throwTypeError(); - o->extensible = false; + o->setExtensible(false); - o->internalClass = o->internalClass->sealed(); + o->setInternalClass(o->internalClass()->sealed()); if (o->arrayData) { ArrayData::ensureAttributes(o.getPointer()); @@ -293,9 +293,9 @@ ReturnedValue ObjectPrototype::method_freeze(CallContext *ctx) if (ArgumentsObject::isNonStrictArgumentsObject(o.getPointer())) Scoped(scope, o)->fullyCreate(); - o->extensible = false; + o->setExtensible(false); - o->internalClass = o->internalClass->frozen(); + o->setInternalClass(o->internalClass()->frozen()); if (o->arrayData) { ArrayData::ensureAttributes(o.getPointer()); @@ -316,7 +316,7 @@ ReturnedValue ObjectPrototype::method_preventExtensions(CallContext *ctx) if (!o) return ctx->throwTypeError(); - o->extensible = false; + o->setExtensible(false); return o.asReturnedValue(); } @@ -327,10 +327,10 @@ ReturnedValue ObjectPrototype::method_isSealed(CallContext *ctx) if (!o) return ctx->throwTypeError(); - if (o->extensible) + if (o->isExtensible()) return Encode(false); - if (o->internalClass != o->internalClass->sealed()) + if (o->internalClass() != o->internalClass()->sealed()) return Encode(false); if (!o->arrayData || !o->arrayData->length()) @@ -356,10 +356,10 @@ ReturnedValue ObjectPrototype::method_isFrozen(CallContext *ctx) if (!o) return ctx->throwTypeError(); - if (o->extensible) + if (o->isExtensible()) return Encode(false); - if (o->internalClass != o->internalClass->frozen()) + if (o->internalClass() != o->internalClass()->frozen()) return Encode(false); if (!o->arrayData->length()) @@ -385,7 +385,7 @@ ReturnedValue ObjectPrototype::method_isExtensible(CallContext *ctx) if (!o) return ctx->throwTypeError(); - return Encode((bool)o->extensible); + return Encode((bool)o->isExtensible()); } ReturnedValue ObjectPrototype::method_keys(CallContext *ctx) @@ -578,7 +578,7 @@ ReturnedValue ObjectPrototype::method_set_proto(CallContext *ctx) if (!!p) { if (o->prototype() == p.getPointer()) { ok = true; - } else if (o->extensible) { + } else if (o->isExtensible()) { ok = o->setPrototype(p.getPointer()); } } diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 5915f2d039..198ac4c217 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -460,7 +460,7 @@ void QObjectWrapper::setProperty(QObject *object, ExecutionContext *ctx, QQmlPro QV4::Scope scope(ctx); QV4::ScopedFunctionObject f(scope, value); if (f) { - if (!f->bindingKeyFlag) { + if (!f->bindingKeyFlag()) { if (!property->isVarProperty() && property->propType != qMetaTypeId()) { // assigning a JS function to a non var or QJSValue property or is not allowed. QString error = QLatin1String("Cannot assign JavaScript function to "); @@ -1759,7 +1759,7 @@ QObjectMethod::QObjectMethod(ExecutionContext *scope, QObject *object, int index , m_index(index) { setVTable(staticVTable()); - subtype = WrappedQtMethod; + setSubtype(WrappedQtMethod); m_qmlGlobal = qmlGlobal; } diff --git a/src/qml/jsruntime/qv4regexp.cpp b/src/qml/jsruntime/qv4regexp.cpp index e5490cffd1..23ef62f992 100644 --- a/src/qml/jsruntime/qv4regexp.cpp +++ b/src/qml/jsruntime/qv4regexp.cpp @@ -121,7 +121,6 @@ RegExp::~RegExp() RegExpCacheKey key(this); m_cache->remove(key); } - _data = 0; } void RegExp::destroy(Managed *that) diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp index 7a7666b89d..18d07b9df5 100644 --- a/src/qml/jsruntime/qv4regexpobject.cpp +++ b/src/qml/jsruntime/qv4regexpobject.cpp @@ -76,7 +76,7 @@ RegExpObject::RegExpObject(InternalClass *ic) , value(RegExp::create(ic->engine, QString(), false, false)) , global(false) { - Q_ASSERT(internalClass->vtable == staticVTable()); + Q_ASSERT(internalClass()->vtable == staticVTable()); init(ic->engine); } @@ -180,7 +180,7 @@ void RegExpObject::markObjects(Managed *that, ExecutionEngine *e) Property *RegExpObject::lastIndexProperty(ExecutionContext *ctx) { Q_UNUSED(ctx); - Q_ASSERT(0 == internalClass->find(ctx->engine->newIdentifier(QStringLiteral("lastIndex")))); + Q_ASSERT(0 == internalClass()->find(ctx->engine->newIdentifier(QStringLiteral("lastIndex")))); return propertyAt(0); } diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index bd52f0e678..23b51ac8b7 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -310,7 +310,7 @@ QV4::ReturnedValue Runtime::instanceof(ExecutionContext *ctx, const ValueRef lef if (!f) return ctx->throwTypeError(); - if (f->subtype == FunctionObject::BoundFunction) + if (f->subtype() == FunctionObject::BoundFunction) f = static_cast(f)->target; Object *v = left->asObject(); @@ -382,7 +382,7 @@ ReturnedValue RuntimeHelpers::objectDefaultValue(Object *object, int typeHint) typeHint = NUMBER_HINT; } - ExecutionEngine *engine = object->internalClass->engine; + ExecutionEngine *engine = object->internalClass()->engine; if (engine->hasException) return Encode::undefined(); diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index 36f61a1df5..dd7c35a0d4 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -66,13 +66,13 @@ QmlBindingWrapper::QmlBindingWrapper(ExecutionContext *scope, Function *f, Objec , qml(qml) , qmlContext(0) { - Q_ASSERT(scope->inUse); + Q_ASSERT(scope->inUse()); setVTable(staticVTable()); function = f; if (function) function->compilationUnit->ref(); - needsActivation = function ? function->needsActivation() : false; + managedData()->needsActivation = function ? function->needsActivation() : false; Scope s(scope); ScopedValue protectThis(s, this); @@ -88,11 +88,11 @@ QmlBindingWrapper::QmlBindingWrapper(ExecutionContext *scope, ObjectRef qml) , qml(qml) , qmlContext(0) { - Q_ASSERT(scope->inUse); + Q_ASSERT(scope->inUse()); setVTable(staticVTable()); function = 0; - needsActivation = false; + managedData()->needsActivation = false; Scope s(scope); ScopedValue protectThis(s, this); diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index 89231cfe5f..ad2706c262 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -231,7 +231,7 @@ public: void containerPutIndexed(uint index, const QV4::ValueRef value) { - if (internalClass->engine->hasException) + if (internalClass()->engine->hasException) return; /* Qt containers have int (rather than uint) allowable indexes. */ diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp index d9aa881f21..e88888a71e 100644 --- a/src/qml/jsruntime/qv4string.cpp +++ b/src/qml/jsruntime/qv4string.cpp @@ -235,7 +235,7 @@ bool String::isEqualTo(Managed *t, Managed *o) if (t == o) return true; - if (!o->internalClass->vtable->isString) + if (!o->internalClass()->vtable->isString) return false; String *that = static_cast(t); @@ -244,7 +244,7 @@ bool String::isEqualTo(Managed *t, Managed *o) return false; if (that->identifier && that->identifier == other->identifier) return true; - if (that->subtype >= StringType_UInt && that->subtype == other->subtype) + if (that->subtype() >= StringType_UInt && that->subtype() == other->subtype()) return true; return that->toQString() == other->toQString(); @@ -258,7 +258,7 @@ String::String(ExecutionEngine *engine, const QString &text) { _text->ref.ref(); len = _text->size; - subtype = StringType_Unknown; + setSubtype(StringType_Unknown); } String::String(ExecutionEngine *engine, String *l, String *r) @@ -267,7 +267,7 @@ String::String(ExecutionEngine *engine, String *l, String *r) , stringHash(UINT_MAX), largestSubLength(qMax(l->largestSubLength, r->largestSubLength)) , len(l->len + r->len) { - subtype = StringType_Unknown; + setSubtype(StringType_Unknown); if (!l->largestSubLength && l->len > largestSubLength) largestSubLength = l->len; @@ -283,9 +283,9 @@ uint String::toUInt(bool *ok) const { *ok = true; - if (subtype == StringType_Unknown) + if (subtype() == StringType_Unknown) createHashValue(); - if (subtype >= StringType_UInt) + if (subtype() >= StringType_UInt) return stringHash; // ### this conversion shouldn't be required @@ -305,7 +305,7 @@ bool String::equals(const StringRef other) const return false; if (identifier && identifier == other->identifier) return true; - if (subtype >= StringType_UInt && subtype == other->subtype) + if (subtype() >= StringType_UInt && subtype() == other->subtype()) return true; return toQString() == other->toQString(); @@ -358,7 +358,7 @@ void String::createHashValue() const bool ok; stringHash = ::toArrayIndex(ch, end, &ok); if (ok) { - subtype = (stringHash == UINT_MAX) ? StringType_UInt : StringType_ArrayIndex; + setSubtype((stringHash == UINT_MAX) ? StringType_UInt : StringType_ArrayIndex); return; } @@ -369,7 +369,7 @@ void String::createHashValue() const } stringHash = h; - subtype = StringType_Regular; + setSubtype(StringType_Regular); } uint String::createHashValue(const QChar *ch, int length) diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h index ed2a4e3646..5f5d00cf77 100644 --- a/src/qml/jsruntime/qv4string_p.h +++ b/src/qml/jsruntime/qv4string_p.h @@ -72,7 +72,6 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed { ~String() { if (!largestSubLength && !_text->ref.deref()) QStringData::deallocate(_text); - _data = 0; } bool equals(const StringRef other) const; @@ -84,7 +83,7 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed { Q_ASSERT(!largestSubLength); if (identifier && identifier == other->identifier) return true; - if (subtype >= StringType_UInt && subtype == other->subtype) + if (subtype() >= StringType_UInt && subtype() == other->subtype()) return true; return toQString() == other->toQString(); @@ -105,17 +104,17 @@ struct Q_QML_PRIVATE_EXPORT String : public Managed { void simplifyString() const; inline unsigned hashValue() const { - if (subtype == StringType_Unknown) + if (subtype() == StringType_Unknown) createHashValue(); Q_ASSERT(!largestSubLength); return stringHash; } uint asArrayIndex() const { - if (subtype == StringType_Unknown) + if (subtype() == StringType_Unknown) createHashValue(); Q_ASSERT(!largestSubLength); - if (subtype == StringType_ArrayIndex) + if (subtype() == StringType_ArrayIndex) return stringHash; return UINT_MAX; } diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp index f1e51703a8..25b2b78025 100644 --- a/src/qml/jsruntime/qv4stringobject.cpp +++ b/src/qml/jsruntime/qv4stringobject.cpp @@ -80,7 +80,7 @@ DEFINE_OBJECT_VTABLE(StringObject); StringObject::StringObject(InternalClass *ic) : Object(ic) { - Q_ASSERT(internalClass->vtable == staticVTable()); + Q_ASSERT(internalClass()->vtable == staticVTable()); Scope scope(engine()); ScopedObject protectThis(scope, this); @@ -113,7 +113,7 @@ Property *StringObject::getIndex(uint index) const QString str = value.stringValue()->toQString(); if (index >= (uint)str.length()) return 0; - tmpProperty.value = Encode(internalClass->engine->newString(str.mid(index, 1))); + tmpProperty.value = Encode(internalClass()->engine->newString(str.mid(index, 1))); return &tmpProperty; } diff --git a/src/qml/jsruntime/qv4value.cpp b/src/qml/jsruntime/qv4value.cpp index e9246f7a14..e122b18892 100644 --- a/src/qml/jsruntime/qv4value.cpp +++ b/src/qml/jsruntime/qv4value.cpp @@ -95,7 +95,7 @@ double Value::toNumberImpl() const if (isString()) return RuntimeHelpers::stringToNumber(stringValue()->toQString()); { - ExecutionContext *ctx = objectValue()->internalClass->engine->currentContext(); + ExecutionContext *ctx = objectValue()->internalClass()->engine->currentContext(); Scope scope(ctx); ScopedValue prim(scope, RuntimeHelpers::toPrimitive(ValueRef::fromRawValue(this), NUMBER_HINT)); return prim->toNumber(); @@ -129,7 +129,7 @@ QString Value::toQStringNoThrow() const if (isString()) return stringValue()->toQString(); { - ExecutionContext *ctx = objectValue()->internalClass->engine->currentContext(); + ExecutionContext *ctx = objectValue()->internalClass()->engine->currentContext(); Scope scope(ctx); ScopedValue ex(scope); bool caughtException = false; @@ -182,7 +182,7 @@ QString Value::toQString() const if (isString()) return stringValue()->toQString(); { - ExecutionContext *ctx = objectValue()->internalClass->engine->currentContext(); + ExecutionContext *ctx = objectValue()->internalClass()->engine->currentContext(); Scope scope(ctx); ScopedValue prim(scope, RuntimeHelpers::toPrimitive(ValueRef::fromRawValue(this), STRING_HINT)); return prim->toQString(); diff --git a/src/qml/jsruntime/qv4value_inl_p.h b/src/qml/jsruntime/qv4value_inl_p.h index 1fe9e1c165..84a8e1adf2 100644 --- a/src/qml/jsruntime/qv4value_inl_p.h +++ b/src/qml/jsruntime/qv4value_inl_p.h @@ -64,13 +64,13 @@ inline bool Value::isString() const { if (!isManaged()) return false; - return managed() && managed()->internalClass->vtable->isString; + return managed() && managed()->internalClass()->vtable->isString; } inline bool Value::isObject() const { if (!isManaged()) return false; - return managed() && managed()->internalClass->vtable->isObject; + return managed() && managed()->internalClass()->vtable->isObject; } inline bool Value::isPrimitive() const diff --git a/src/qml/jsruntime/qv4variantobject.cpp b/src/qml/jsruntime/qv4variantobject.cpp index 92cc19d8b9..6937368f87 100644 --- a/src/qml/jsruntime/qv4variantobject.cpp +++ b/src/qml/jsruntime/qv4variantobject.cpp @@ -91,7 +91,7 @@ QVariant VariantObject::toVariant(const QV4::ValueRef v) bool VariantObject::isScarce() const { - QVariant::Type t = data.type(); + QVariant::Type t = ExecutionEngine::ScarceResourceData::data.type(); return t == QVariant::Pixmap || t == QVariant::Image; } @@ -109,10 +109,10 @@ bool VariantObject::isEqualTo(Managed *m, Managed *other) assert(lv); if (QV4::VariantObject *rv = other->as()) - return lv->data == rv->data; + return lv->ExecutionEngine::ScarceResourceData::data == rv->ExecutionEngine::ScarceResourceData::data; if (QV4::QmlValueTypeWrapper *v = other->as()) - return v->isEqual(lv->data); + return v->isEqual(lv->ExecutionEngine::ScarceResourceData::data); return false; } @@ -133,7 +133,7 @@ void VariantObject::removeVmePropertyReference() // and add to the ep->scarceResources list // since it is now eligible to be released // automatically by the engine. - internalClass->engine->scarceResources.insert(this); + internalClass()->engine->scarceResources.insert(this); } } @@ -167,7 +167,7 @@ QV4::ReturnedValue VariantPrototype::method_destroy(CallContext *ctx) if (o) { if (o->isScarce()) o->node.remove(); - o->data = QVariant(); + o->ExecutionEngine::ScarceResourceData::data = QVariant(); } return Encode::undefined(); } @@ -178,9 +178,9 @@ QV4::ReturnedValue VariantPrototype::method_toString(CallContext *ctx) Scoped o(scope, ctx->callData->thisObject.as()); if (!o) return Encode::undefined(); - QString result = o->data.toString(); - if (result.isEmpty() && !o->data.canConvert(QVariant::String)) - result = QString::fromLatin1("QVariant(%0)").arg(QString::fromLatin1(o->data.typeName())); + QString result = o->ExecutionEngine::ScarceResourceData::data.toString(); + if (result.isEmpty() && !o->ExecutionEngine::ScarceResourceData::data.canConvert(QVariant::String)) + result = QString::fromLatin1("QVariant(%0)").arg(QString::fromLatin1(o->ExecutionEngine::ScarceResourceData::data.typeName())); return Encode(ctx->engine->newString(result)); } @@ -189,7 +189,7 @@ QV4::ReturnedValue VariantPrototype::method_valueOf(CallContext *ctx) Scope scope(ctx); Scoped o(scope, ctx->callData->thisObject.as()); if (o) { - QVariant v = o->data; + QVariant v = o->ExecutionEngine::ScarceResourceData::data; switch (v.type()) { case QVariant::Invalid: return Encode::undefined(); diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index 68037c558b..b580225d81 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -185,7 +185,7 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags) QV4::Scope scope(ep->v4engine()); QV4::ScopedFunctionObject f(scope, v4function.value()); Q_ASSERT(f); - if (f->bindingKeyFlag) { + if (f->bindingKeyFlag()) { QQmlSourceLocation loc = f->as()->bindingLocation; url = loc.sourceFile; lineNumber = loc.line; diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index c9d5f76fbd..96f303dcb5 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -1534,7 +1534,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, return false; } else if (isVarProperty) { QV4::FunctionObject *f = result->asFunctionObject(); - if (f && f->bindingKeyFlag) { + if (f && f->bindingKeyFlag()) { // we explicitly disallow this case to avoid confusion. Users can still store one // in an array in a var property if they need to, but the common case is user error. expression->delayedError()->setErrorDescription(QLatin1String("Invalid use of Qt.binding() in a binding declaration.")); @@ -1552,7 +1552,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, writeValueProperty(object, core, QVariant(), context, flags); } else if (type == qMetaTypeId()) { QV4::FunctionObject *f = result->asFunctionObject(); - if (f && f->bindingKeyFlag) { + if (f && f->bindingKeyFlag()) { expression->delayedError()->setErrorDescription(QLatin1String("Invalid use of Qt.binding() in a binding declaration.")); expression->delayedError()->setErrorObject(object); return false; @@ -1570,7 +1570,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object, expression->delayedError()->setErrorObject(object); return false; } else if (QV4::FunctionObject *f = result->asFunctionObject()) { - if (f->bindingKeyFlag) + if (f->bindingKeyFlag()) expression->delayedError()->setErrorDescription(QLatin1String("Invalid use of Qt.binding() in a binding declaration.")); else expression->delayedError()->setErrorDescription(QLatin1String("Unable to assign a function to a property of any type other than var.")); diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 9a87493e54..db35171528 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -197,7 +197,7 @@ bool QmlValueTypeWrapper::isEqualTo(Managed *m, Managed *other) assert(lv); if (QV4::VariantObject *rv = other->as()) - return lv->isEqual(rv->data); + return lv->isEqual(rv->ExecutionEngine::ScarceResourceData::data); if (QV4::QmlValueTypeWrapper *v = other->as()) return lv->isEqual(v->toVariant()); @@ -362,7 +362,7 @@ void QmlValueTypeWrapper::put(Managed *m, const StringRef name, const ValueRef v QV4::ScopedFunctionObject f(scope, value); if (f) { - if (!f->bindingKeyFlag) { + if (!f->bindingKeyFlag()) { // assigning a JS function to a non-var-property is not allowed. QString error = QLatin1String("Cannot assign JavaScript function to value-type property"); Scoped e(scope, r->v8->toString(error)); diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 67e9e80efb..322e81c681 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -1181,7 +1181,7 @@ QQmlBindingFunction::QQmlBindingFunction(FunctionObject *originalFunction) , originalFunction(originalFunction) { setVTable(staticVTable()); - bindingKeyFlag = true; + managedData()->bindingKeyFlag = true; } void QQmlBindingFunction::initBindingLocation() diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 8305649177..b0de533ea8 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -130,7 +130,7 @@ QVariant QV8Engine::toVariant(const QV4::ValueRef value, int typeHint) QV4::Scope scope(m_v4Engine); if (QV4::VariantObject *v = value->as()) - return v->data; + return v->QV4::ExecutionEngine::ScarceResourceData::data; if (typeHint == QVariant::Bool) return QVariant(value->toBoolean()); @@ -444,9 +444,9 @@ void QV8Engine::initializeGlobal() qt_add_sqlexceptions(m_v4Engine); { - for (uint i = 0; i < m_v4Engine->globalObject->internalClass->size; ++i) { - if (m_v4Engine->globalObject->internalClass->nameMap.at(i)) - m_illegalNames.insert(m_v4Engine->globalObject->internalClass->nameMap.at(i)->toQString()); + for (uint i = 0; i < m_v4Engine->globalObject->internalClass()->size; ++i) { + if (m_v4Engine->globalObject->internalClass()->nameMap.at(i)) + m_illegalNames.insert(m_v4Engine->globalObject->internalClass()->nameMap.at(i)->toQString()); } } @@ -882,7 +882,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) return true; if (value->as() && name.endsWith('*')) { int valueType = QMetaType::type(name.left(name.size()-1)); - QVariant &var = value->as()->data; + QVariant &var = value->as()->QV4::ExecutionEngine::ScarceResourceData::data; if (valueType == var.userType()) { // We have T t, T* is requested, so return &t. *reinterpret_cast(data) = var.data(); @@ -893,7 +893,7 @@ bool QV8Engine::metaTypeFromJS(const QV4::ValueRef value, int type, void *data) while (proto) { bool canCast = false; if (QV4::VariantObject *vo = proto->as()) { - const QVariant &v = vo->data; + const QVariant &v = vo->QV4::ExecutionEngine::ScarceResourceData::data; canCast = (type == v.userType()) || (valueType && (valueType == v.userType())); } else if (proto->as()) { @@ -969,7 +969,7 @@ QVariant QV8Engine::variantFromJS(const QV4::ValueRef value, if (QV4::RegExpObject *re = value->as()) return re->toQRegExp(); if (QV4::VariantObject *v = value->as()) - return v->data; + return v->QV4::ExecutionEngine::ScarceResourceData::data; if (value->as()) return qVariantFromValue(qtObjectFromJS(value)); if (QV4::QmlValueTypeWrapper *v = value->as()) @@ -1003,7 +1003,7 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::ValueRef value) QV4::Scoped v(scope, value); if (v) { - QVariant variant = v->data; + QVariant variant = v->QV4::ExecutionEngine::ScarceResourceData::data; int type = variant.userType(); if (type == QMetaType::QObjectStar) return *reinterpret_cast(variant.constData()); -- cgit v1.2.3