diff options
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 24 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4property_p.h | 41 |
3 files changed, 35 insertions, 36 deletions
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index 35fa998f21..4d02d46135 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -140,12 +140,12 @@ void Object::putValue(Property *pd, PropertyAttributes attrs, const ValueRef val return; if (attrs.isAccessor()) { - if (pd->set) { - Scope scope(pd->set->engine()); + if (FunctionObject *set = pd->setter()) { + Scope scope(set->engine()); ScopedCallData callData(scope, 1); callData->args[0] = *value; callData->thisObject = this; - pd->set->call(callData); + set->call(callData); return; } goto reject; diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 806da833ea..410f243a3c 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -501,14 +501,14 @@ ReturnedValue ObjectPrototype::method_defineGetter(CallContext *ctx) return ctx->throwTypeError(); Scope scope(ctx); - Scoped<String> prop(scope, ctx->argument(0), Scoped<String>::Convert); - if (scope.engine->hasException) - return Encode::undefined(); - Scoped<FunctionObject> f(scope, ctx->argument(1)); if (!f) return ctx->throwTypeError(); + Scoped<String> prop(scope, ctx->argument(0), Scoped<String>::Convert); + if (scope.engine->hasException) + return Encode::undefined(); + Scoped<Object> o(scope, ctx->callData->thisObject); if (!o) { if (!ctx->callData->thisObject.isUndefined()) @@ -516,7 +516,9 @@ ReturnedValue ObjectPrototype::method_defineGetter(CallContext *ctx) o = ctx->engine->globalObject; } - Property pd = Property::fromAccessor(f.getPointer(), 0); + Property pd; + pd.value = f; + pd.set = Primitive::emptyValue(); o->__defineOwnProperty__(ctx, prop, pd, Attr_Accessor); return Encode::undefined(); } @@ -527,14 +529,14 @@ ReturnedValue ObjectPrototype::method_defineSetter(CallContext *ctx) return ctx->throwTypeError(); Scope scope(ctx); - Scoped<String> prop(scope, ctx->argument(0), Scoped<String>::Convert); - if (scope.engine->hasException) - return Encode::undefined(); - Scoped<FunctionObject> f(scope, ctx->argument(1)); if (!f) return ctx->throwTypeError(); + Scoped<String> prop(scope, ctx->argument(0), Scoped<String>::Convert); + if (scope.engine->hasException) + return Encode::undefined(); + Scoped<Object> o(scope, ctx->callData->thisObject); if (!o) { if (!ctx->callData->thisObject.isUndefined()) @@ -542,7 +544,9 @@ ReturnedValue ObjectPrototype::method_defineSetter(CallContext *ctx) o = ctx->engine->globalObject; } - Property pd = Property::fromAccessor(0, f.getPointer()); + Property pd; + pd.value = Primitive::emptyValue(); + pd.set = f; o->__defineOwnProperty__(ctx, prop, pd, Attr_Accessor); return Encode::undefined(); } diff --git a/src/qml/jsruntime/qv4property_p.h b/src/qml/jsruntime/qv4property_p.h index ff9ea59514..4b0896b264 100644 --- a/src/qml/jsruntime/qv4property_p.h +++ b/src/qml/jsruntime/qv4property_p.h @@ -52,13 +52,8 @@ namespace QV4 { struct FunctionObject; struct Property { - union { - SafeValue value; - struct { - FunctionObject *get; - FunctionObject *set; - }; - }; + SafeValue value; + SafeValue set; // Section 8.10 inline void fullyPopulated(PropertyAttributes *attrs) { @@ -67,10 +62,10 @@ struct Property { } if (attrs->type() == PropertyAttributes::Accessor) { attrs->clearWritable(); - if (get == (FunctionObject *)0x1) - get = 0; - if (set == (FunctionObject *)0x1) - set = 0; + if (value.managed() == (Managed *)0x1) + value = Primitive::fromManaged(0); + if (set.managed() == (Managed *)0x1) + set = Primitive::fromManaged(0); } attrs->resolve(); } @@ -82,8 +77,8 @@ struct Property { } static inline Property fromAccessor(FunctionObject *getter, FunctionObject *setter) { Property pd; - pd.get = getter; - pd.set = setter; + pd.value = Primitive::fromManaged(reinterpret_cast<Managed *>(getter)); + pd.set = Primitive::fromManaged(reinterpret_cast<Managed *>(setter)); return pd; } @@ -96,10 +91,10 @@ struct Property { inline bool isSubset(const PropertyAttributes &attrs, const Property &other, PropertyAttributes otherAttrs) const; inline void merge(PropertyAttributes &attrs, const Property &other, PropertyAttributes otherAttrs); - inline FunctionObject *getter() const { return get; } - inline FunctionObject *setter() const { return set; } - inline void setGetter(FunctionObject *g) { get = g; } - inline void setSetter(FunctionObject *s) { set = s; } + inline FunctionObject *getter() const { return reinterpret_cast<FunctionObject *>(value.managed()); } + inline FunctionObject *setter() const { return reinterpret_cast<FunctionObject *>(set.managed()); } + inline void setGetter(FunctionObject *g) { value = Primitive::fromManaged(reinterpret_cast<Managed *>(g)); } + inline void setSetter(FunctionObject *s) { set = Primitive::fromManaged(reinterpret_cast<Managed *>(s)); } }; inline bool Property::isSubset(const PropertyAttributes &attrs, const Property &other, PropertyAttributes otherAttrs) const @@ -115,9 +110,9 @@ inline bool Property::isSubset(const PropertyAttributes &attrs, const Property & if (attrs.type() == PropertyAttributes::Data && !value.sameValue(other.value)) return false; if (attrs.type() == PropertyAttributes::Accessor) { - if (get != other.get) + if (value.managed() != other.value.managed()) return false; - if (set != other.set) + if (set.managed() != other.set.managed()) return false; } return true; @@ -133,10 +128,10 @@ inline void Property::merge(PropertyAttributes &attrs, const Property &other, Pr attrs.setWritable(otherAttrs.isWritable()); if (otherAttrs.type() == PropertyAttributes::Accessor) { attrs.setType(PropertyAttributes::Accessor); - if (other.get) - get = (other.get == (FunctionObject *)0x1) ? 0 : other.get; - if (other.set) - set = (other.set == (FunctionObject *)0x1) ? 0 : other.set; + if (other.value.managed()) + value = (other.value.managed() == (Managed *)0x1) ? Primitive::fromManaged(0).asReturnedValue() : other.value.asReturnedValue(); + if (other.set.managed()) + set = (other.set.managed() == (Managed *)0x1) ? Primitive::fromManaged(0).asReturnedValue() : other.set.asReturnedValue(); } else if (otherAttrs.type() == PropertyAttributes::Data){ attrs.setType(PropertyAttributes::Data); value = other.value; |