diff options
author | Lars Knoll <[email protected]> | 2013-09-18 14:30:53 +0200 |
---|---|---|
committer | The Qt Project <[email protected]> | 2013-09-22 01:06:20 +0200 |
commit | 1aa618970a9bed46123d0648500e957688d725ec (patch) | |
tree | 1235d0de9aacc2e01b41f06b3bb50ddab7c3d39b | |
parent | 3c325823a778e1a6542eb746e047d5d7bfb43566 (diff) |
Use StringRef for most methods in Object
Change-Id: I8e2dad0e9e34c5a549952bc0765cd57f6aa8aadf
Reviewed-by: Simon Hausmann <[email protected]>
-rw-r--r-- | src/qml/jsapi/qjsvalue.cpp | 20 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context.cpp | 19 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4debugging.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4identifiertable.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4identifiertable_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4internalclass.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4internalclass_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 44 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectiterator.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 37 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4scopedvalue_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string.cpp | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string_p.h | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlcontextwrapper.cpp | 3 |
16 files changed, 103 insertions, 70 deletions
diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index 6b3d15df59..87c45e4779 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -974,12 +974,16 @@ bool QJSValue::deleteProperty(const QString &name) */ bool QJSValue::hasProperty(const QString &name) const { - Object *o = d->value.asObject(); + ExecutionEngine *engine = d->engine; + if (!engine) + return false; + + Scope scope(engine); + ScopedObject o(scope, d->value); if (!o) return false; - ExecutionEngine *engine = d->engine; - String *s = engine->newIdentifier(name); + ScopedString s(scope, engine->newIdentifier(name)); return o->__hasProperty__(s); } @@ -991,12 +995,16 @@ bool QJSValue::hasProperty(const QString &name) const */ bool QJSValue::hasOwnProperty(const QString &name) const { - Object *o = d->value.asObject(); + ExecutionEngine *engine = d->engine; + if (!engine) + return false; + + Scope scope(engine); + ScopedObject o(scope, d->value); if (!o) return false; - ExecutionEngine *engine = d->engine; - String *s = engine->newIdentifier(name); + ScopedString s(scope, engine->newIdentifier(name)); return o->__getOwnProperty__(s); } diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index 01cb2dd780..449ec21b05 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -174,6 +174,8 @@ CallContext *ExecutionContext::newQmlContext(FunctionObject *f, Object *qml) void ExecutionContext::createMutableBinding(String *name, bool deletable) { + Scope scope(this); + ScopedString n(scope, name); // find the right context to create the binding on Object *activation = engine->globalObject; @@ -189,12 +191,12 @@ void ExecutionContext::createMutableBinding(String *name, bool deletable) ctx = ctx->outer; } - if (activation->__hasProperty__(name)) + if (activation->__hasProperty__(n)) return; Property desc = Property::fromValue(Value::undefinedValue()); PropertyAttributes attrs(Attr_Data); attrs.setConfigurable(deletable); - activation->__defineOwnProperty__(this, name, desc, attrs); + activation->__defineOwnProperty__(this, n, desc, attrs); } String * const *ExecutionContext::formals() const @@ -286,12 +288,14 @@ void CallContext::initQmlContext(ExecutionContext *parentContext, Object *qml, F bool ExecutionContext::deleteProperty(String *name) { + Scope scope(this); + ScopedString n(scope, name); bool hasWith = false; for (ExecutionContext *ctx = this; ctx; ctx = ctx->outer) { if (ctx->type == Type_WithContext) { hasWith = true; WithContext *w = static_cast<WithContext *>(ctx); - if (w->withObject->__hasProperty__(name)) + if (w->withObject->__hasProperty__(n)) return w->withObject->deleteProperty(name); } else if (ctx->type == Type_CatchContext) { CatchContext *c = static_cast<CatchContext *>(ctx); @@ -308,11 +312,11 @@ bool ExecutionContext::deleteProperty(String *name) if (f->formalParameterList[i]->isEqualTo(name)) return false; } - if (c->activation && c->activation->__hasProperty__(name)) + if (c->activation && c->activation->__hasProperty__(n)) return c->activation->deleteProperty(name); } else if (ctx->type == Type_GlobalContext) { GlobalContext *g = static_cast<GlobalContext *>(ctx); - if (g->global->__hasProperty__(name)) + if (g->global->__hasProperty__(n)) return g->global->deleteProperty(name); } } @@ -366,10 +370,11 @@ void ExecutionContext::mark() void ExecutionContext::setProperty(String *name, const Value& value) { Scope scope(this); + ScopedString n(scope, name); for (ExecutionContext *ctx = this; ctx; ctx = ctx->outer) { if (ctx->type == Type_WithContext) { Object *w = static_cast<WithContext *>(ctx)->withObject; - if (w->__hasProperty__(name)) { + if (w->__hasProperty__(n)) { w->put(name, value); return; } @@ -395,7 +400,7 @@ void ExecutionContext::setProperty(String *name, const Value& value) activation = static_cast<GlobalContext *>(ctx)->global; } - if (activation && (ctx->type == Type_QmlContext || activation->__hasProperty__(name))) { + if (activation && (ctx->type == Type_QmlContext || activation->__hasProperty__(n))) { activation->put(name, value); return; } diff --git a/src/qml/jsruntime/qv4debugging.cpp b/src/qml/jsruntime/qv4debugging.cpp index 34b72e95fb..b4da4bba87 100644 --- a/src/qml/jsruntime/qv4debugging.cpp +++ b/src/qml/jsruntime/qv4debugging.cpp @@ -273,11 +273,11 @@ static void realDumpValue(QV4::Value v, QV4::ExecutionContext *ctx, std::string cout << prefix << "properties:" << endl; ForEachIteratorObject it(ctx, o); - QV4::ScopedValue name(scope); + ScopedValue name(scope); for (name = it.nextPropertyName(); !name->isNull(); name = it.nextPropertyName()) { cout << prefix << "\t\"" << qPrintable(name->stringValue()->toQString()) << "\"" << endl; PropertyAttributes attrs; - Property *d = o->__getOwnProperty__(name->stringValue(), &attrs); + Property *d = o->__getOwnProperty__(ScopedString(scope, name), &attrs); Value pval = Value::fromReturnedValue(o->getValue(d, attrs)); cout << prefix << "\tvalue:" << endl; realDumpValue(pval, ctx, prefix + "\t"); diff --git a/src/qml/jsruntime/qv4identifiertable.cpp b/src/qml/jsruntime/qv4identifiertable.cpp index 618696a124..6553e78b22 100644 --- a/src/qml/jsruntime/qv4identifiertable.cpp +++ b/src/qml/jsruntime/qv4identifiertable.cpp @@ -135,7 +135,7 @@ String *IdentifierTable::insertString(const QString &s) } -Identifier *IdentifierTable::identifierImpl(String *str) +Identifier *IdentifierTable::identifierImpl(const String *str) { if (str->identifier) return str->identifier; @@ -153,7 +153,7 @@ Identifier *IdentifierTable::identifierImpl(String *str) idx %= alloc; } - addEntry(str); + addEntry(const_cast<QV4::String *>(str)); return str->identifier; } diff --git a/src/qml/jsruntime/qv4identifiertable_p.h b/src/qml/jsruntime/qv4identifiertable_p.h index 6450a874d2..a02d90e7e2 100644 --- a/src/qml/jsruntime/qv4identifiertable_p.h +++ b/src/qml/jsruntime/qv4identifiertable_p.h @@ -68,7 +68,7 @@ public: String *insertString(const QString &s); - Identifier *identifier(String *str) { + Identifier *identifier(const String *str) { if (str->identifier) return str->identifier; return identifierImpl(str); @@ -77,7 +77,7 @@ public: Identifier *identifier(const QString &s); Identifier *identifier(const char *s, int len); - Identifier *identifierImpl(String *str); + Identifier *identifierImpl(const String *str); void mark() { for (int i = 0; i < alloc; ++i) diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp index 16038b0b68..4f6adc2c88 100644 --- a/src/qml/jsruntime/qv4internalclass.cpp +++ b/src/qml/jsruntime/qv4internalclass.cpp @@ -255,7 +255,7 @@ void InternalClass::removeMember(Object *object, Identifier *id) transitions.insert(t, object->internalClass); } -uint InternalClass::find(String *string) +uint InternalClass::find(const String *string) { engine->identifierTable->identifier(string); const Identifier *id = string->identifier; diff --git a/src/qml/jsruntime/qv4internalclass_p.h b/src/qml/jsruntime/qv4internalclass_p.h index 1fba947a37..ecb5c0bfab 100644 --- a/src/qml/jsruntime/qv4internalclass_p.h +++ b/src/qml/jsruntime/qv4internalclass_p.h @@ -140,7 +140,7 @@ struct InternalClass { InternalClass *addMember(String *string, PropertyAttributes data, uint *index = 0); InternalClass *changeMember(String *string, PropertyAttributes data, uint *index = 0); void removeMember(Object *object, Identifier *id); - uint find(String *s); + uint find(const String *s); InternalClass *sealed(); InternalClass *frozen(); diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index 3acf4bf9ab..68469f1f2d 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -318,7 +318,7 @@ Property *Object::insertMember(const StringRef s, PropertyAttributes attributes) } // Section 8.12.1 -Property *Object::__getOwnProperty__(String *name, PropertyAttributes *attrs) +Property *Object::__getOwnProperty__(const StringRef name, PropertyAttributes *attrs) { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -363,7 +363,7 @@ Property *Object::__getOwnProperty__(uint index, PropertyAttributes *attrs) } // Section 8.12.2 -Property *Object::__getPropertyDescriptor__(String *name, PropertyAttributes *attrs) const +Property *Object::__getPropertyDescriptor__(const StringRef name, PropertyAttributes *attrs) const { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -372,7 +372,7 @@ Property *Object::__getPropertyDescriptor__(String *name, PropertyAttributes *at const Object *o = this; while (o) { - uint idx = o->internalClass->find(name); + uint idx = o->internalClass->find(name.getPointer()); if (idx < UINT_MAX) { if (attrs) *attrs = o->internalClass->propertyData[idx]; @@ -414,14 +414,14 @@ Property *Object::__getPropertyDescriptor__(uint index, PropertyAttributes *attr return 0; } -bool Object::__hasProperty__(String *name) const +bool Object::__hasProperty__(const StringRef name) const { if (__getPropertyDescriptor__(name)) return true; const Object *o = this; while (o) { - if (!o->query(name).isEmpty()) + if (!o->query(name.getPointer()).isEmpty()) return true; o = o->prototype(); } @@ -456,7 +456,9 @@ ReturnedValue Object::getIndexed(Managed *m, uint index, bool *hasProperty) void Object::put(Managed *m, String *name, const Value &value) { - static_cast<Object *>(m)->internalPut(name, value); + Scope scope(m->engine()); + ScopedString s(scope, name); + static_cast<Object *>(m)->internalPut(s, value); } void Object::putIndexed(Managed *m, uint index, const Value &value) @@ -704,7 +706,7 @@ ReturnedValue Object::internalGetIndexed(uint index, bool *hasProperty) // Section 8.12.5 -void Object::internalPut(String *name, const Value &value) +void Object::internalPut(const StringRef name, const Value &value) { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -712,7 +714,7 @@ void Object::internalPut(String *name, const Value &value) name->makeIdentifier(); - uint member = internalClass->find(name); + uint member = internalClass->find(name.getPointer()); Property *pd = 0; PropertyAttributes attrs; if (member < UINT_MAX) { @@ -772,9 +774,7 @@ void Object::internalPut(String *name, const Value &value) } { - Scope scope(engine()); - ScopedString s(scope, name); - Property *p = insertMember(s, Attr_Data); + Property *p = insertMember(name, Attr_Data); p->value = value; return; } @@ -910,7 +910,7 @@ bool Object::internalDeleteIndexedProperty(uint index) } // Section 8.12.9 -bool Object::__defineOwnProperty__(ExecutionContext *ctx, String *name, const Property &p, PropertyAttributes attrs) +bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name, const Property &p, PropertyAttributes attrs) { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -948,7 +948,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, String *name, const Pr // Clause 1 { - uint member = internalClass->find(name); + uint member = internalClass->find(name.getPointer()); current = (member < UINT_MAX) ? memberData + member : 0; cattrs = internalClass->propertyData.data() + member; } @@ -958,9 +958,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, String *name, const Pr if (!extensible) goto reject; // clause 4 - Scope scope(engine()); - ScopedString s(scope, name); - Property *pd = insertMember(s, attrs); + Property *pd = insertMember(name, attrs); *pd = p; pd->fullyPopulated(&attrs); return true; @@ -1004,21 +1002,21 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Prop return true; } - return __defineOwnProperty__(ctx, current, 0 /*member*/, p, attrs); + return __defineOwnProperty__(ctx, current, StringRef::null(), p, attrs); reject: if (ctx->strictMode) ctx->throwTypeError(); return false; } -bool Object::__defineOwnProperty__(ExecutionContext *ctx, Property *current, String *member, const Property &p, PropertyAttributes attrs) +bool Object::__defineOwnProperty__(ExecutionContext *ctx, Property *current, const StringRef member, const Property &p, PropertyAttributes attrs) { // clause 5 if (attrs.isEmpty()) return true; PropertyAttributes cattrs = Attr_Data; - if (member) + if (!member.isNull()) cattrs = internalClass->propertyData[current - memberData]; else if (arrayAttributes) cattrs = arrayAttributes[current - arrayData]; @@ -1074,8 +1072,8 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, Property *current, Str accept: current->merge(cattrs, p, attrs); - if (member) { - internalClass = internalClass->changeMember(member, cattrs); + if (!member.isNull()) { + internalClass = internalClass->changeMember(member.getPointer(), cattrs); } else { if (cattrs != Attr_Data) ensureArrayAttributes(); @@ -1094,7 +1092,9 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, Property *current, Str bool Object::__defineOwnProperty__(ExecutionContext *ctx, const QString &name, const Property &p, PropertyAttributes attrs) { - return __defineOwnProperty__(ctx, ctx->engine->newString(name), p, attrs); + Scope scope(ctx); + ScopedString s(scope, ctx->engine->newString(name)); + return __defineOwnProperty__(ctx, s, p, attrs); } diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 0ca64f71fe..17e0b6dcf5 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -131,17 +131,17 @@ struct Q_QML_EXPORT Object: Managed { Object *prototype() const { return internalClass->prototype; } bool setPrototype(Object *proto); - Property *__getOwnProperty__(String *name, PropertyAttributes *attrs = 0); + Property *__getOwnProperty__(const StringRef name, PropertyAttributes *attrs = 0); Property *__getOwnProperty__(uint index, PropertyAttributes *attrs = 0); - Property *__getPropertyDescriptor__(String *name, PropertyAttributes *attrs = 0) const; + Property *__getPropertyDescriptor__(const StringRef name, PropertyAttributes *attrs = 0) const; Property *__getPropertyDescriptor__(uint index, PropertyAttributes *attrs = 0) const; - bool __hasProperty__(String *name) const; + bool __hasProperty__(const StringRef name) const; bool __hasProperty__(uint index) const; - bool __defineOwnProperty__(ExecutionContext *ctx, Property *current, String *member, const Property &p, PropertyAttributes attrs); - bool __defineOwnProperty__(ExecutionContext *ctx, String *name, const Property &p, PropertyAttributes attrs); + bool __defineOwnProperty__(ExecutionContext *ctx, Property *current, const StringRef member, const Property &p, PropertyAttributes attrs); + bool __defineOwnProperty__(ExecutionContext *ctx, const StringRef name, const Property &p, PropertyAttributes attrs); bool __defineOwnProperty__(ExecutionContext *ctx, uint index, const Property &p, PropertyAttributes attrs); bool __defineOwnProperty__(ExecutionContext *ctx, const QString &name, const Property &p, PropertyAttributes attrs); @@ -325,7 +325,7 @@ protected: private: ReturnedValue internalGet(String *name, bool *hasProperty); ReturnedValue internalGetIndexed(uint index, bool *hasProperty); - void internalPut(String *name, const Value &value); + void internalPut(const StringRef name, const Value &value); void internalPutIndexed(uint index, const Value &value); bool internalDeleteProperty(String *name); bool internalDeleteIndexedProperty(uint index); diff --git a/src/qml/jsruntime/qv4objectiterator.cpp b/src/qml/jsruntime/qv4objectiterator.cpp index f03c2d6b86..a9c9e817f7 100644 --- a/src/qml/jsruntime/qv4objectiterator.cpp +++ b/src/qml/jsruntime/qv4objectiterator.cpp @@ -70,7 +70,9 @@ Property *ObjectIterator::next(String **name, uint *index, PropertyAttributes *a if (current != object) { Property *pp; if (*name) { - pp = object->__getPropertyDescriptor__(*name); + Scope scope(object->engine()); + ScopedString n(scope, *name); + pp = object->__getPropertyDescriptor__(n); } else { assert (*index != UINT_MAX); pp = object->__getPropertyDescriptor__(*index); diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 67aeebf0a8..9cbf14990b 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -158,7 +158,7 @@ ReturnedValue ObjectPrototype::method_getOwnPropertyDescriptor(SimpleCallContext ScopedValue v(scope, ctx->argument(1)); Scoped<String> name(scope, v->toString(ctx)); PropertyAttributes attrs; - Property *desc = O->__getOwnProperty__(name.getPointer(), &attrs); + Property *desc = O->__getOwnProperty__(name, &attrs); return fromPropertyDescriptor(ctx, desc, attrs); } @@ -204,7 +204,7 @@ ReturnedValue ObjectPrototype::method_defineProperty(SimpleCallContext *ctx) PropertyAttributes attrs; toPropertyDescriptor(ctx, attributes, &pd, &attrs); - if (!O->__defineOwnProperty__(ctx, name.getPointer(), pd, attrs)) + if (!O->__defineOwnProperty__(ctx, name, pd, attrs)) ctx->throwTypeError(); return O.asReturnedValue(); @@ -222,9 +222,11 @@ ReturnedValue ObjectPrototype::method_defineProperties(SimpleCallContext *ctx) ObjectIterator it(o.getPointer(), ObjectIterator::EnumerableOnly); while (1) { uint index; - String *name; + ScopedString name(scope); PropertyAttributes attrs; - Property *pd = it.next(&name, &index, &attrs); + String *tmp = 0; + Property *pd = it.next(&tmp, &index, &attrs); + name = tmp; if (!pd) break; Property n; @@ -416,7 +418,7 @@ ReturnedValue ObjectPrototype::method_hasOwnProperty(SimpleCallContext *ctx) Scope scope(ctx); Scoped<String> P(scope, ctx->argument(0), Scoped<String>::Convert); Scoped<Object> O(scope, ctx->thisObject, Scoped<Object>::Convert); - bool r = O->__getOwnProperty__(P.getPointer()) != 0; + bool r = O->__getOwnProperty__(P) != 0; if (!r) r = !O->query(P.getPointer()).isEmpty(); return Encode(r); @@ -446,7 +448,7 @@ ReturnedValue ObjectPrototype::method_propertyIsEnumerable(SimpleCallContext *ct Scoped<Object> o(scope, ctx->thisObject, Scoped<Object>::Convert); PropertyAttributes attrs; - o->__getOwnProperty__(p.getPointer(), &attrs); + o->__getOwnProperty__(p, &attrs); return Encode(attrs.isEnumerable()); } @@ -470,7 +472,7 @@ ReturnedValue ObjectPrototype::method_defineGetter(SimpleCallContext *ctx) } Property pd = Property::fromAccessor(f.getPointer(), 0); - o->__defineOwnProperty__(ctx, prop.getPointer(), pd, Attr_Accessor); + o->__defineOwnProperty__(ctx, prop, pd, Attr_Accessor); return Encode::undefined(); } @@ -494,7 +496,7 @@ ReturnedValue ObjectPrototype::method_defineSetter(SimpleCallContext *ctx) } Property pd = Property::fromAccessor(0, f.getPointer()); - o->__defineOwnProperty__(ctx, prop.getPointer(), pd, Attr_Accessor); + o->__defineOwnProperty__(ctx, prop, pd, Attr_Accessor); return Encode::undefined(); } @@ -607,23 +609,30 @@ ReturnedValue ObjectPrototype::fromPropertyDescriptor(ExecutionContext *ctx, con Scope scope(engine); // Let obj be the result of creating a new object as if by the expression new Object() where Object is the standard built-in constructor with that name. Scoped<Object> o(scope, engine->newObject()); + ScopedString s(scope); Property pd; if (attrs.isData()) { pd.value = desc->value; - o->__defineOwnProperty__(ctx, engine->newString(QStringLiteral("value")), pd, Attr_Data); + s = engine->newString(QStringLiteral("value")); + o->__defineOwnProperty__(ctx, s, pd, Attr_Data); pd.value = Value::fromBoolean(attrs.isWritable()); - o->__defineOwnProperty__(ctx, engine->newString(QStringLiteral("writable")), pd, Attr_Data); + s = engine->newString(QStringLiteral("writable")); + o->__defineOwnProperty__(ctx, s, pd, Attr_Data); } else { pd.value = desc->getter() ? Value::fromObject(desc->getter()) : Value::undefinedValue(); - o->__defineOwnProperty__(ctx, engine->newString(QStringLiteral("get")), pd, Attr_Data); + s = engine->newString(QStringLiteral("get")); + o->__defineOwnProperty__(ctx, s, pd, Attr_Data); pd.value = desc->setter() ? Value::fromObject(desc->setter()) : Value::undefinedValue(); - o->__defineOwnProperty__(ctx, engine->newString(QStringLiteral("set")), pd, Attr_Data); + s = engine->newString(QStringLiteral("set")); + o->__defineOwnProperty__(ctx, s, pd, Attr_Data); } pd.value = Value::fromBoolean(attrs.isEnumerable()); - o->__defineOwnProperty__(ctx, engine->newString(QStringLiteral("enumerable")), pd, Attr_Data); + s = engine->newString(QStringLiteral("enumerable")); + o->__defineOwnProperty__(ctx, s, pd, Attr_Data); pd.value = Value::fromBoolean(attrs.isConfigurable()); - o->__defineOwnProperty__(ctx, engine->newString(QStringLiteral("configurable")), pd, Attr_Data); + s = engine->newString(QStringLiteral("configurable")); + o->__defineOwnProperty__(ctx, s, pd, Attr_Data); return o.asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index c01f172eb3..644db82823 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -304,7 +304,8 @@ QV4::ReturnedValue __qmljs_in(ExecutionContext *ctx, const ValueRef left, const { if (!right->isObject()) ctx->throwTypeError(); - String *s = left->toString(ctx); + Scope scope(ctx); + ScopedString s(scope, left->toString(ctx)); bool r = right->objectValue()->__hasProperty__(s); return Value::fromBoolean(r).asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index 58bad216fa..5ec0497f15 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -450,7 +450,11 @@ struct Referenced { } ReturnedValue asReturnedValue() const { return ptr->val; } + static Referenced null() { return Referenced(Null); } + bool isNull() const { return !ptr; } private: + enum _Null { Null }; + Referenced(_Null) { ptr = 0; } Value *ptr; }; diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp index bd1f14b680..806c37b283 100644 --- a/src/qml/jsruntime/qv4string.cpp +++ b/src/qml/jsruntime/qv4string.cpp @@ -131,6 +131,9 @@ void String::destroy(Managed *that) ReturnedValue String::get(Managed *m, String *name, bool *hasProperty) { + Scope scope(m->engine()); + ScopedString n(scope, name); + String *that = static_cast<String *>(m); ExecutionEngine *v4 = m->engine(); if (name == v4->id_length) { @@ -139,7 +142,7 @@ ReturnedValue String::get(Managed *m, String *name, bool *hasProperty) return Value::fromInt32(that->_text.length()).asReturnedValue(); } PropertyAttributes attrs; - Property *pd = v4->stringClass->prototype->__getPropertyDescriptor__(name, &attrs); + Property *pd = v4->stringClass->prototype->__getPropertyDescriptor__(n, &attrs); if (!pd || attrs.isGeneric()) { if (hasProperty) *hasProperty = false; @@ -256,7 +259,7 @@ uint String::toUInt(bool *ok) const return UINT_MAX; } -void String::makeIdentifierImpl() +void String::makeIdentifierImpl() const { engine()->identifierTable->identifier(this); } diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h index 7ad428a502..840e940802 100644 --- a/src/qml/jsruntime/qv4string_p.h +++ b/src/qml/jsruntime/qv4string_p.h @@ -101,13 +101,13 @@ struct Q_QML_EXPORT String : public Managed { } uint toUInt(bool *ok) const; - void makeIdentifier() { + void makeIdentifier() const { if (identifier) return; makeIdentifierImpl(); } - void makeIdentifierImpl(); + void makeIdentifierImpl() const; void createHashValue() const; static uint createHashValue(const QChar *ch, int length); diff --git a/src/qml/qml/qqmlcontextwrapper.cpp b/src/qml/qml/qqmlcontextwrapper.cpp index de317a2dcb..234700c675 100644 --- a/src/qml/qml/qqmlcontextwrapper.cpp +++ b/src/qml/qml/qqmlcontextwrapper.cpp @@ -293,7 +293,8 @@ void QmlContextWrapper::put(Managed *m, String *name, const Value &value) } PropertyAttributes attrs; - Property *pd = wrapper->__getOwnProperty__(name, &attrs); + ScopedString n(scope, name); + Property *pd = wrapper->__getOwnProperty__(n, &attrs); if (pd) { wrapper->putValue(pd, attrs, value); return; |