aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-04-05 20:23:20 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-07-22 13:48:54 +0200
commitb11ec085703a0b019c8115ff505ee6e2553fd4f1 (patch)
tree3336b31ba690f9b200b7fee8cc133aa4bf2e7837 /src/qml
parent05f17e841f971d3c8f635cc044c60c970c2055c9 (diff)
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 <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml')
-rw-r--r--src/qml/jsapi/qjsvalue.cpp2
-rw-r--r--src/qml/jsruntime/qv4argumentsobject.cpp12
-rw-r--r--src/qml/jsruntime/qv4argumentsobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp2
-rw-r--r--src/qml/jsruntime/qv4arraydata_p.h2
-rw-r--r--src/qml/jsruntime/qv4arrayobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4context.cpp14
-rw-r--r--src/qml/jsruntime/qv4dateobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp4
-rw-r--r--src/qml/jsruntime/qv4engine_p.h6
-rw-r--r--src/qml/jsruntime/qv4errorobject.cpp6
-rw-r--r--src/qml/jsruntime/qv4errorobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp52
-rw-r--r--src/qml/jsruntime/qv4functionobject_p.h4
-rw-r--r--src/qml/jsruntime/qv4globalobject.cpp8
-rw-r--r--src/qml/jsruntime/qv4identifiertable.cpp4
-rw-r--r--src/qml/jsruntime/qv4identifiertable_p.h8
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp38
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp122
-rw-r--r--src/qml/jsruntime/qv4managed.cpp28
-rw-r--r--src/qml/jsruntime/qv4managed_p.h93
-rw-r--r--src/qml/jsruntime/qv4mm.cpp33
-rw-r--r--src/qml/jsruntime/qv4object.cpp112
-rw-r--r--src/qml/jsruntime/qv4object_p.h18
-rw-r--r--src/qml/jsruntime/qv4objectproto.cpp22
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp4
-rw-r--r--src/qml/jsruntime/qv4regexp.cpp1
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp4
-rw-r--r--src/qml/jsruntime/qv4script.cpp8
-rw-r--r--src/qml/jsruntime/qv4sequenceobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4string.cpp18
-rw-r--r--src/qml/jsruntime/qv4string_p.h9
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4value.cpp6
-rw-r--r--src/qml/jsruntime/qv4value_inl_p.h4
-rw-r--r--src/qml/jsruntime/qv4variantobject.cpp18
-rw-r--r--src/qml/qml/qqmlbinding.cpp2
-rw-r--r--src/qml/qml/qqmlproperty.cpp6
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp4
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp2
-rw-r--r--src/qml/qml/v8/qv8engine.cpp16
42 files changed, 356 insertions, 354 deletions
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<Object> 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<ArgumentsObject *>(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<const SparseArrayData *>(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<const ArrayVTable *>(internalClass->vtable); }
+ const ArrayVTable *vtable() const { return reinterpret_cast<const ArrayVTable *>(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<CallContext *>(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<int>(function->formalParameterCount());
+ return function->needsActivation() || callData->argc < static_cast<int>(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<CallContext *>(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<CallContext *>(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<SyntaxErrorObject *>(this) : 0;
+ return subtype() == SyntaxError ? static_cast<SyntaxErrorObject *>(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<Object> 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<FunctionCtor *>(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<ScriptFunction *>(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<BuiltinFunction *>(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<IndexedBuiltinFunction *>(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<Transition, InternalClass *>::const_iterator tit = object->internalClass->transitions.constFind(t);
+ QHash<Transition, InternalClass *>::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 *>(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 *>(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 *>(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 *>(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 *>(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<Managed *>(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 <typename T>
T *as() {
// ### FIXME:
- if (!this || !internalClass)
+ if (!this || !internalClass())
return 0;
#if !defined(QT_NO_QOBJECT_CHECK)
static_cast<T *>(this)->qt_check_for_QMANAGED_macro(static_cast<T *>(this));
#endif
- return internalClass->vtable == T::staticVTable() ? static_cast<T *>(this) : 0;
+ return internalClass()->vtable == T::staticVTable() ? static_cast<T *>(this) : 0;
}
template <typename T>
const T *as() const {
@@ -246,24 +246,24 @@ public:
#if !defined(QT_NO_QOBJECT_CHECK)
static_cast<T *>(this)->qt_check_for_QMANAGED_macro(static_cast<T *>(const_cast<Managed *>(this)));
#endif
- return internalClass->vtable == T::staticVTable() ? static_cast<const T *>(this) : 0;
+ return internalClass()->vtable == T::staticVTable() ? static_cast<const T *>(this) : 0;
}
- String *asString() { return internalClass->vtable->isString ? reinterpret_cast<String *>(this) : 0; }
- Object *asObject() { return internalClass->vtable->isObject ? reinterpret_cast<Object *>(this) : 0; }
- ArrayObject *asArrayObject() { return internalClass->vtable->type == Type_ArrayObject ? reinterpret_cast<ArrayObject *>(this) : 0; }
- FunctionObject *asFunctionObject() { return internalClass->vtable->isFunctionObject ? reinterpret_cast<FunctionObject *>(this) : 0; }
- BooleanObject *asBooleanObject() { return internalClass->vtable->type == Type_BooleanObject ? reinterpret_cast<BooleanObject *>(this) : 0; }
- NumberObject *asNumberObject() { return internalClass->vtable->type == Type_NumberObject ? reinterpret_cast<NumberObject *>(this) : 0; }
- StringObject *asStringObject() { return internalClass->vtable->type == Type_StringObject ? reinterpret_cast<StringObject *>(this) : 0; }
- DateObject *asDateObject() { return internalClass->vtable->type == Type_DateObject ? reinterpret_cast<DateObject *>(this) : 0; }
- ErrorObject *asErrorObject() { return internalClass->vtable->isErrorObject ? reinterpret_cast<ErrorObject *>(this) : 0; }
- ArgumentsObject *asArgumentsObject() { return internalClass->vtable->type == Type_ArgumentsObject ? reinterpret_cast<ArgumentsObject *>(this) : 0; }
+ String *asString() { return internalClass()->vtable->isString ? reinterpret_cast<String *>(this) : 0; }
+ Object *asObject() { return internalClass()->vtable->isObject ? reinterpret_cast<Object *>(this) : 0; }
+ ArrayObject *asArrayObject() { return internalClass()->vtable->type == Type_ArrayObject ? reinterpret_cast<ArrayObject *>(this) : 0; }
+ FunctionObject *asFunctionObject() { return internalClass()->vtable->isFunctionObject ? reinterpret_cast<FunctionObject *>(this) : 0; }
+ BooleanObject *asBooleanObject() { return internalClass()->vtable->type == Type_BooleanObject ? reinterpret_cast<BooleanObject *>(this) : 0; }
+ NumberObject *asNumberObject() { return internalClass()->vtable->type == Type_NumberObject ? reinterpret_cast<NumberObject *>(this) : 0; }
+ StringObject *asStringObject() { return internalClass()->vtable->type == Type_StringObject ? reinterpret_cast<StringObject *>(this) : 0; }
+ DateObject *asDateObject() { return internalClass()->vtable->type == Type_DateObject ? reinterpret_cast<DateObject *>(this) : 0; }
+ ErrorObject *asErrorObject() { return internalClass()->vtable->isErrorObject ? reinterpret_cast<ErrorObject *>(this) : 0; }
+ ArgumentsObject *asArgumentsObject() { return internalClass()->vtable->type == Type_ArgumentsObject ? reinterpret_cast<ArgumentsObject *>(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<Managed *>(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<Managed *>(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<const Object *>(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<Object *>(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<const SparseArrayData *>(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<const ObjectVTable *>(internalClass->vtable); }
- Object *prototype() const { return internalClass->prototype; }
+ const ObjectVTable *vtable() const { return reinterpret_cast<const ObjectVTable *>(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<ArgumentsObject>(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<QJSValue>()) {
// 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<BoundFunction *>(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<String *>(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<QV4::VariantObject>())
- return lv->data == rv->data;
+ return lv->ExecutionEngine::ScarceResourceData::data == rv->ExecutionEngine::ScarceResourceData::data;
if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>())
- 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<VariantObject> o(scope, ctx->callData->thisObject.as<QV4::VariantObject>());
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<VariantObject> o(scope, ctx->callData->thisObject.as<QV4::VariantObject>());
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<QV4::QQmlBindingFunction>()->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<QJSValue>()) {
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<VariantObject>())
- return lv->isEqual(rv->data);
+ return lv->isEqual(rv->ExecutionEngine::ScarceResourceData::data);
if (QV4::QmlValueTypeWrapper *v = other->as<QmlValueTypeWrapper>())
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<String> 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<QV4::VariantObject>())
- 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<QV4::VariantObject>() && name.endsWith('*')) {
int valueType = QMetaType::type(name.left(name.size()-1));
- QVariant &var = value->as<QV4::VariantObject>()->data;
+ QVariant &var = value->as<QV4::VariantObject>()->QV4::ExecutionEngine::ScarceResourceData::data;
if (valueType == var.userType()) {
// We have T t, T* is requested, so return &t.
*reinterpret_cast<void* *>(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<QV4::VariantObject>()) {
- 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<QV4::QObjectWrapper>()) {
@@ -969,7 +969,7 @@ QVariant QV8Engine::variantFromJS(const QV4::ValueRef value,
if (QV4::RegExpObject *re = value->as<QV4::RegExpObject>())
return re->toQRegExp();
if (QV4::VariantObject *v = value->as<QV4::VariantObject>())
- return v->data;
+ return v->QV4::ExecutionEngine::ScarceResourceData::data;
if (value->as<QV4::QObjectWrapper>())
return qVariantFromValue(qtObjectFromJS(value));
if (QV4::QmlValueTypeWrapper *v = value->as<QV4::QmlValueTypeWrapper>())
@@ -1003,7 +1003,7 @@ QObject *QV8Engine::qtObjectFromJS(const QV4::ValueRef value)
QV4::Scoped<QV4::VariantObject> 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<QObject* const *>(variant.constData());