aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4argumentsobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4arrayobject.cpp10
-rw-r--r--src/qml/jsruntime/qv4context.cpp2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp2
-rw-r--r--src/qml/jsruntime/qv4functionobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp22
-rw-r--r--src/qml/jsruntime/qv4numberobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4object.cpp26
-rw-r--r--src/qml/jsruntime/qv4object_p.h40
-rw-r--r--src/qml/jsruntime/qv4objectproto.cpp23
-rw-r--r--src/qml/jsruntime/qv4objectproto_p.h2
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp76
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper_p.h6
-rw-r--r--src/qml/jsruntime/qv4regexp.cpp4
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp5
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp58
-rw-r--r--src/qml/jsruntime/qv4runtime_p.h53
-rw-r--r--src/qml/jsruntime/qv4scopedvalue_p.h6
-rw-r--r--src/qml/jsruntime/qv4script.cpp2
-rw-r--r--src/qml/jsruntime/qv4sequenceobject.cpp34
20 files changed, 201 insertions, 176 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp
index 7e4b828833..cf72cdef68 100644
--- a/src/qml/jsruntime/qv4argumentsobject.cpp
+++ b/src/qml/jsruntime/qv4argumentsobject.cpp
@@ -173,7 +173,7 @@ ReturnedValue ArgumentsSetterFunction::call(Managed *setter, CallData *callData)
assert(s->index < o->context->callData->argc);
o->context->callData->args[s->index] = callData->argc ? callData->args[0].asReturnedValue() : Encode::undefined();
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
void ArgumentsObject::markObjects(Managed *that)
diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp
index 7051276f4c..3ad3ec6f32 100644
--- a/src/qml/jsruntime/qv4arrayobject.cpp
+++ b/src/qml/jsruntime/qv4arrayobject.cpp
@@ -279,7 +279,7 @@ ReturnedValue ArrayPrototype::method_push(SimpleCallContext *ctx)
ScopedString str(scope, ctx->engine->newString(QStringLiteral("Array.prototype.push: Overflow")));
ctx->throwRangeError(str);
}
- return Primitive::fromDouble(newLen).asReturnedValue();
+ return Encode(newLen);
}
if (!instance->protoHasArray() && instance->arrayDataLen <= len) {
@@ -345,7 +345,7 @@ ReturnedValue ArrayPrototype::method_shift(SimpleCallContext *ctx)
if (!len) {
if (!instance->isArrayObject())
instance->put(ctx->engine->id_length, ScopedValue(scope, Primitive::fromInt32(0)));
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
Property *front = 0;
@@ -558,7 +558,7 @@ ReturnedValue ArrayPrototype::method_indexOf(SimpleCallContext *ctx)
ScopedObject instance(scope, ctx->callData->thisObject.toObject(ctx));
uint len = getLength(ctx, instance.getPointer());
if (!len)
- return Primitive::fromInt32(-1).asReturnedValue();
+ return Encode(-1);
ScopedValue searchValue(scope);
uint fromIndex = 0;
@@ -598,7 +598,7 @@ ReturnedValue ArrayPrototype::method_lastIndexOf(SimpleCallContext *ctx)
ScopedObject instance(scope, ctx->callData->thisObject.toObject(ctx));
uint len = getLength(ctx, instance.getPointer());
if (!len)
- return Primitive::fromInt32(-1).asReturnedValue();
+ return Encode(-1);
ScopedValue searchValue(scope);
uint fromIndex = len;
@@ -628,7 +628,7 @@ ReturnedValue ArrayPrototype::method_lastIndexOf(SimpleCallContext *ctx)
if (exists && __qmljs_strict_equal(v, searchValue))
return Encode(k);
}
- return Primitive::fromInt32(-1).asReturnedValue();
+ return Encode(-1);
}
ReturnedValue ArrayPrototype::method_every(SimpleCallContext *ctx)
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp
index aa0688ee9b..ff17754b8b 100644
--- a/src/qml/jsruntime/qv4context.cpp
+++ b/src/qml/jsruntime/qv4context.cpp
@@ -522,7 +522,7 @@ ReturnedValue ExecutionContext::getPropertyNoThrow(const StringRef name)
return v.asReturnedValue();
}
}
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
ReturnedValue ExecutionContext::getPropertyAndBase(const StringRef name, Object **base)
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 62d8a2cf0c..8808678b54 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -82,7 +82,7 @@ static QBasicAtomicInt engineSerial = Q_BASIC_ATOMIC_INITIALIZER(1);
static ReturnedValue throwTypeError(SimpleCallContext *ctx)
{
ctx->throwTypeError();
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
ExecutionEngine::ExecutionEngine(QQmlJS::EvalISelFactory *factory)
diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h
index 7fece1d2f4..29bfa31418 100644
--- a/src/qml/jsruntime/qv4functionobject_p.h
+++ b/src/qml/jsruntime/qv4functionobject_p.h
@@ -199,7 +199,7 @@ struct IndexedBuiltinFunction: FunctionObject
static ReturnedValue construct(Managed *m, CallData *)
{
m->engine()->current->throwTypeError();
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
static ReturnedValue call(Managed *that, CallData *callData);
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp
index d71d79e0ef..4527dcb33c 100644
--- a/src/qml/jsruntime/qv4lookup.cpp
+++ b/src/qml/jsruntime/qv4lookup.cpp
@@ -135,7 +135,7 @@ ReturnedValue Lookup::getterGeneric(QV4::Lookup *l, const ValueRef object)
}
}
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
ReturnedValue Lookup::getter0(Lookup *l, const ValueRef object)
@@ -182,7 +182,7 @@ ReturnedValue Lookup::getterAccessor0(Lookup *l, const ValueRef object)
Scope scope(o->engine());
FunctionObject *getter = o->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = *object;
@@ -201,7 +201,7 @@ ReturnedValue Lookup::getterAccessor1(Lookup *l, const ValueRef object)
Scope scope(o->engine());
FunctionObject *getter = o->prototype()->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = *object;
@@ -223,7 +223,7 @@ ReturnedValue Lookup::getterAccessor2(Lookup *l, const ValueRef object)
Scope scope(o->engine());
FunctionObject *getter = o->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = *object;
@@ -266,10 +266,9 @@ ReturnedValue Lookup::primitiveGetterAccessor0(Lookup *l, const ValueRef object)
Object *o = l->proto;
if (l->classList[0] == o->internalClass) {
Scope scope(o->engine());
- Value res;
FunctionObject *getter = o->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = *object;
@@ -287,10 +286,9 @@ ReturnedValue Lookup::primitiveGetterAccessor1(Lookup *l, const ValueRef object)
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass) {
Scope scope(o->engine());
- Value res;
FunctionObject *getter = o->prototype()->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = *object;
@@ -304,7 +302,7 @@ ReturnedValue Lookup::primitiveGetterAccessor1(Lookup *l, const ValueRef object)
ReturnedValue Lookup::stringLengthGetter(Lookup *l, const ValueRef object)
{
if (String *s = object->asString())
- return Primitive::fromUInt32(s->length()).asReturnedValue();
+ return Encode(s->length());
l->getter = getterGeneric;
return getterGeneric(l, object);
@@ -384,7 +382,7 @@ ReturnedValue Lookup::globalGetterAccessor0(Lookup *l, ExecutionContext *ctx)
Scope scope(o->engine());
FunctionObject *getter = o->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = Primitive::undefinedValue();
@@ -402,7 +400,7 @@ ReturnedValue Lookup::globalGetterAccessor1(Lookup *l, ExecutionContext *ctx)
Scope scope(o->engine());
FunctionObject *getter = o->prototype()->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = Primitive::undefinedValue();
@@ -423,7 +421,7 @@ ReturnedValue Lookup::globalGetterAccessor2(Lookup *l, ExecutionContext *ctx)
Scope scope(o->engine());
FunctionObject *getter = o->memberData[l->index].getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
ScopedCallData callData(scope, 0);
callData->thisObject = Primitive::undefinedValue();
diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp
index 5f25406987..06a04b4eb7 100644
--- a/src/qml/jsruntime/qv4numberobject.cpp
+++ b/src/qml/jsruntime/qv4numberobject.cpp
@@ -67,7 +67,7 @@ ReturnedValue NumberCtor::construct(Managed *m, CallData *callData)
ReturnedValue NumberCtor::call(Managed *, CallData *callData)
{
double dbl = callData->argc ? callData->args[0].toNumber() : 0.;
- return Primitive::fromDouble(dbl).asReturnedValue();
+ return Encode(dbl);
}
void NumberPrototype::init(ExecutionEngine *engine, ObjectRef ctor)
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index 3fdbf66523..f7401ea4a7 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -135,7 +135,7 @@ ReturnedValue Object::getValue(const ValueRef thisObject, const Property *p, Pro
return p->value.asReturnedValue();
FunctionObject *getter = p->getter();
if (!getter)
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
Scope scope(getter->engine());
ScopedCallData callData(scope, 0);
@@ -150,7 +150,7 @@ void Object::putValue(Property *pd, PropertyAttributes attrs, const ValueRef val
Scope scope(pd->set->engine());
ScopedCallData callData(scope, 1);
callData->args[0] = *value;
- callData->thisObject = Value::fromObject(this);
+ callData->thisObject = this;
pd->set->call(callData);
return;
}
@@ -538,7 +538,7 @@ ReturnedValue Object::getLookup(Managed *m, Lookup *l)
return o->getValue(p, attrs);
}
}
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
void Object::setLookup(Managed *m, Lookup *l, const ValueRef value)
@@ -710,7 +710,7 @@ ReturnedValue Object::internalGetIndexed(uint index, bool *hasProperty)
if (hasProperty)
*hasProperty = false;
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
@@ -777,7 +777,7 @@ void Object::internalPut(const StringRef name, const ValueRef value)
Scope scope(engine());
ScopedCallData callData(scope, 1);
callData->args[0] = *value;
- callData->thisObject = Value::fromObject(this);
+ callData->thisObject = this;
pd->setter()->call(callData);
return;
}
@@ -856,7 +856,7 @@ void Object::internalPutIndexed(uint index, const ValueRef value)
Scope scope(engine());
ScopedCallData callData(scope, 1);
callData->args[0] = *value;
- callData->thisObject = Value::fromObject(this);
+ callData->thisObject = this;
pd->setter()->call(callData);
return;
}
@@ -1140,7 +1140,7 @@ void Object::copyArrayData(Object *other)
}
-ReturnedValue Object::arrayIndexOf(Value v, uint fromIndex, uint endIndex, ExecutionContext *ctx, Object *o)
+ReturnedValue Object::arrayIndexOf(const ValueRef v, uint fromIndex, uint endIndex, ExecutionContext *ctx, Object *o)
{
Scope scope(engine());
ScopedValue value(scope);
@@ -1150,13 +1150,13 @@ ReturnedValue Object::arrayIndexOf(Value v, uint fromIndex, uint endIndex, Execu
for (uint i = fromIndex; i < endIndex; ++i) {
bool exists;
value = o->getIndexed(i, &exists);
- if (exists && __qmljs_strict_equal(value, ValueRef(&v)))
+ if (exists && __qmljs_strict_equal(value, v))
return Encode(i);
}
} else if (sparseArray) {
for (SparseArrayNode *n = sparseArray->lowerBound(fromIndex); n != sparseArray->end() && n->key() < endIndex; n = n->nextNode()) {
value = o->getValue(arrayData + n->value, arrayAttributes ? arrayAttributes[n->value] : Attr_Data);
- if (__qmljs_strict_equal(value, ValueRef(&v)))
+ if (__qmljs_strict_equal(value, v))
return Encode(n->key());
}
} else {
@@ -1168,7 +1168,7 @@ ReturnedValue Object::arrayIndexOf(Value v, uint fromIndex, uint endIndex, Execu
while (pd < end) {
if (!arrayAttributes || !arrayAttributes[pd - arrayData].isGeneric()) {
value = o->getValue(pd, arrayAttributes ? arrayAttributes[pd - arrayData] : Attr_Data);
- if (__qmljs_strict_equal(value, ValueRef(&v)))
+ if (__qmljs_strict_equal(value, v))
return Encode((uint)(pd - arrayData));
}
++pd;
@@ -1208,7 +1208,7 @@ void Object::arrayConcat(const ArrayObject *other)
if (other->arrayAttributes) {
for (int i = 0; i < other->arrayDataLen; ++i) {
bool exists;
- arrayData[oldSize + i].value = Value::fromReturnedValue(const_cast<ArrayObject *>(other)->getIndexed(i, &exists));
+ arrayData[oldSize + i].value = const_cast<ArrayObject *>(other)->getIndexed(i, &exists);
arrayDataLen = oldSize + i + 1;
if (arrayAttributes)
arrayAttributes[oldSize + i] = Attr_Data;
@@ -1250,11 +1250,11 @@ void Object::arraySort(ExecutionContext *context, ObjectRef thisObject, const Va
while (--len > i)
if (!arrayAttributes[len].isGeneric())
break;
- arrayData[i].value = Value::fromReturnedValue(getValue(arrayData + len, arrayAttributes[len]));
+ arrayData[i].value = getValue(arrayData + len, arrayAttributes[len]);
arrayAttributes[i] = Attr_Data;
arrayAttributes[len].clear();
} else if (arrayAttributes[i].isAccessor()) {
- arrayData[i].value = Value::fromReturnedValue(getValue(arrayData + i, arrayAttributes[i]));
+ arrayData[i].value = getValue(arrayData + i, arrayAttributes[i]);
arrayAttributes[i] = Attr_Data;
}
}
diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h
index bbf0786113..899fcde030 100644
--- a/src/qml/jsruntime/qv4object_p.h
+++ b/src/qml/jsruntime/qv4object_p.h
@@ -150,7 +150,7 @@ struct Q_QML_EXPORT Object: Managed {
static ReturnedValue getValue(const ValueRef thisObject, const Property *p, PropertyAttributes attrs);
ReturnedValue getValue(const Property *p, PropertyAttributes attrs) const {
Scope scope(this->engine());
- ScopedValue t(scope, Value::fromObject(const_cast<Object *>(this)));
+ ScopedValue t(scope, const_cast<Object *>(this));
return getValue(t, p, attrs);
}
@@ -270,7 +270,7 @@ public:
void arrayConcat(const ArrayObject *other);
void arraySort(ExecutionContext *context, ObjectRef thisObject, const ValueRef comparefn, uint arrayDataLen);
- ReturnedValue arrayIndexOf(Value v, uint fromIndex, uint arrayDataLen, ExecutionContext *ctx, Object *o);
+ ReturnedValue arrayIndexOf(const ValueRef v, uint fromIndex, uint arrayDataLen, ExecutionContext *ctx, Object *o);
void arrayReserve(uint n);
void ensureArrayAttributes();
@@ -350,17 +350,33 @@ protected:
};
struct BooleanObject: Object {
- Value value;
- BooleanObject(ExecutionEngine *engine, const ValueRef value): Object(engine->booleanClass), value(*value) { type = Type_BooleanObject; }
+ SafeValue value;
+ BooleanObject(ExecutionEngine *engine, const ValueRef val)
+ : Object(engine->booleanClass) {
+ type = Type_BooleanObject;
+ value = val;
+ }
protected:
- BooleanObject(InternalClass *ic): Object(ic), value(Primitive::fromBoolean(false)) { type = Type_BooleanObject; }
+ BooleanObject(InternalClass *ic)
+ : Object(ic) {
+ type = Type_BooleanObject;
+ value = Encode(false);
+ }
};
struct NumberObject: Object {
- Value value;
- NumberObject(ExecutionEngine *engine, const ValueRef value): Object(engine->numberClass), value(*value) { type = Type_NumberObject; }
+ SafeValue value;
+ NumberObject(ExecutionEngine *engine, const ValueRef val)
+ : Object(engine->numberClass) {
+ type = Type_NumberObject;
+ value = val;
+ }
protected:
- NumberObject(InternalClass *ic): Object(ic), value(Primitive::fromInt32(0)) { type = Type_NumberObject; }
+ NumberObject(InternalClass *ic)
+ : Object(ic) {
+ type = Type_NumberObject;
+ value = Encode((int)0);
+ }
};
struct ArrayObject: Object {
@@ -381,11 +397,9 @@ struct ArrayObject: Object {
inline uint Object::arrayLength() const
{
if (isArrayObject()) {
- // length is always the first property of an array
- Value v = memberData[ArrayObject::LengthPropertyIndex].value;
- if (v.isInteger())
- return v.integerValue();
- return Primitive::toUInt32(v.doubleValue());
+ if (memberData[ArrayObject::LengthPropertyIndex].value.isInteger())
+ return memberData[ArrayObject::LengthPropertyIndex].value.integerValue();
+ return Primitive::toUInt32(memberData[ArrayObject::LengthPropertyIndex].value.doubleValue());
}
return 0;
}
diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp
index 02f8cb6e95..65fd2188ac 100644
--- a/src/qml/jsruntime/qv4objectproto.cpp
+++ b/src/qml/jsruntime/qv4objectproto.cpp
@@ -91,7 +91,7 @@ ReturnedValue ObjectCtor::construct(Managed *that, CallData *callData)
obj->setPrototype(proto.getPointer());
return obj.asReturnedValue();
}
- return Value::fromReturnedValue(__qmljs_to_object(v4->current, ValueRef(&callData->args[0]))).asReturnedValue();
+ return __qmljs_to_object(v4->current, ValueRef(&callData->args[0]));
}
ReturnedValue ObjectCtor::call(Managed *m, CallData *callData)
@@ -220,6 +220,7 @@ ReturnedValue ObjectPrototype::method_defineProperties(SimpleCallContext *ctx)
ctx->throwTypeError();
Scoped<Object> o(scope, ctx->argument(1), Scoped<Object>::Convert);
+ ScopedValue val(scope);
ObjectIterator it(o.getPointer(), ObjectIterator::EnumerableOnly);
while (1) {
@@ -233,7 +234,8 @@ ReturnedValue ObjectPrototype::method_defineProperties(SimpleCallContext *ctx)
break;
Property n;
PropertyAttributes nattrs;
- toPropertyDescriptor(ctx, Value::fromReturnedValue(o->getValue(pd, attrs)), &n, &nattrs);
+ val = o->getValue(pd, attrs);
+ toPropertyDescriptor(ctx, val, &n, &nattrs);
bool ok;
if (name)
ok = O->__defineOwnProperty__(ctx, name, n, nattrs);
@@ -541,7 +543,7 @@ ReturnedValue ObjectPrototype::method_set_proto(SimpleCallContext *ctx)
return Encode::undefined();
}
-void ObjectPrototype::toPropertyDescriptor(ExecutionContext *ctx, Value v, Property *desc, PropertyAttributes *attrs)
+void ObjectPrototype::toPropertyDescriptor(ExecutionContext *ctx, const ValueRef v, Property *desc, PropertyAttributes *attrs)
{
Scope scope(ctx);
ScopedObject o(scope, v);
@@ -551,12 +553,13 @@ void ObjectPrototype::toPropertyDescriptor(ExecutionContext *ctx, Value v, Prope
attrs->clear();
desc->setGetter(0);
desc->setSetter(0);
+ ScopedValue tmp(scope);
if (o->__hasProperty__(ctx->engine->id_enumerable))
- attrs->setEnumerable(Value::fromReturnedValue(o->get(ctx->engine->id_enumerable)).toBoolean());
+ attrs->setEnumerable((tmp = o->get(ctx->engine->id_enumerable))->toBoolean());
if (o->__hasProperty__(ctx->engine->id_configurable))
- attrs->setConfigurable(Value::fromReturnedValue(o->get(ctx->engine->id_configurable)).toBoolean());
+ attrs->setConfigurable((tmp = o->get(ctx->engine->id_configurable))->toBoolean());
if (o->__hasProperty__(ctx->engine->id_get)) {
ScopedValue get(scope, o->get(ctx->engine->id_get));
@@ -587,7 +590,7 @@ void ObjectPrototype::toPropertyDescriptor(ExecutionContext *ctx, Value v, Prope
if (o->__hasProperty__(ctx->engine->id_writable)) {
if (attrs->isAccessor())
ctx->throwTypeError();
- attrs->setWritable(Value::fromReturnedValue(o->get(ctx->engine->id_writable)).toBoolean());
+ attrs->setWritable((tmp = o->get(ctx->engine->id_writable))->toBoolean());
// writable forces it to be a data descriptor
desc->value = Primitive::undefinedValue();
}
@@ -595,7 +598,7 @@ void ObjectPrototype::toPropertyDescriptor(ExecutionContext *ctx, Value v, Prope
if (o->__hasProperty__(ctx->engine->id_value)) {
if (attrs->isAccessor())
ctx->throwTypeError();
- desc->value = Value::fromReturnedValue(o->get(ctx->engine->id_value));
+ desc->value = o->get(ctx->engine->id_value);
attrs->setType(PropertyAttributes::Data);
}
@@ -613,7 +616,7 @@ 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());
+ ScopedObject o(scope, engine->newObject());
ScopedString s(scope);
Property pd;
@@ -625,10 +628,10 @@ ReturnedValue ObjectPrototype::fromPropertyDescriptor(ExecutionContext *ctx, con
s = engine->newString(QStringLiteral("writable"));
o->__defineOwnProperty__(ctx, s, pd, Attr_Data);
} else {
- pd.value = desc->getter() ? Value::fromObject(desc->getter()) : Primitive::undefinedValue();
+ pd.value = desc->getter() ? desc->getter()->asReturnedValue() : Encode::undefined();
s = engine->newString(QStringLiteral("get"));
o->__defineOwnProperty__(ctx, s, pd, Attr_Data);
- pd.value = desc->setter() ? Value::fromObject(desc->setter()) : Primitive::undefinedValue();
+ pd.value = desc->setter() ? desc->setter()->asReturnedValue() : Encode::undefined();
s = engine->newString(QStringLiteral("set"));
o->__defineOwnProperty__(ctx, s, pd, Attr_Data);
}
diff --git a/src/qml/jsruntime/qv4objectproto_p.h b/src/qml/jsruntime/qv4objectproto_p.h
index 8994ba558c..b5dcd06032 100644
--- a/src/qml/jsruntime/qv4objectproto_p.h
+++ b/src/qml/jsruntime/qv4objectproto_p.h
@@ -91,7 +91,7 @@ struct ObjectPrototype: Object
static ReturnedValue method_get_proto(SimpleCallContext *ctx);
static ReturnedValue method_set_proto(SimpleCallContext *ctx);
- static void toPropertyDescriptor(ExecutionContext *ctx, Value v, Property *desc, PropertyAttributes *attrs);
+ static void toPropertyDescriptor(ExecutionContext *ctx, const ValueRef v, Property *desc, PropertyAttributes *attrs);
static ReturnedValue fromPropertyDescriptor(ExecutionContext *ctx, const Property *desc, PropertyAttributes attrs);
static Returned<ArrayObject> *getOwnPropertyNames(ExecutionEngine *v4, const ValueRef o);
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index c206826cbc..d28514f0c8 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -85,23 +85,32 @@ QT_BEGIN_NAMESPACE
using namespace QV4;
-static QPair<QObject *, int> extractQtMethod(QV4::FunctionObject *function)
+static QPair<QObject *, int> extractQtMethod(QV4::FunctionObjectRef function)
{
- if (function && function->subtype == QV4::FunctionObject::WrappedQtMethod) {
- QObjectMethod *method = static_cast<QObjectMethod*>(function);
- return qMakePair(method->object(), method->methodIndex());
+ QV4::ExecutionEngine *v4 = function->engine();
+ if (v4) {
+ QV4::Scope scope(v4);
+ QV4::Scoped<QObjectMethod> method(scope, function->as<QObjectMethod>());
+ if (method)
+ return qMakePair(method->object(), method->methodIndex());
}
return qMakePair((QObject *)0, -1);
}
-static QPair<QObject *, int> extractQtSignal(const Value &value)
+static QPair<QObject *, int> extractQtSignal(const ValueRef value)
{
- if (QV4::FunctionObject *function = value.asFunctionObject())
- return extractQtMethod(function);
-
- if (QV4::QmlSignalHandler *handler = value.as<QV4::QmlSignalHandler>())
- return qMakePair(handler->object(), handler->signalIndex());
+ QV4::ExecutionEngine *v4 = value->engine();
+ if (v4) {
+ QV4::Scope scope(v4);
+ QV4::ScopedFunctionObject function(scope, value);
+ if (function)
+ return extractQtMethod(function);
+
+ QV4::Scoped<QV4::QmlSignalHandler> handler(scope, value);
+ if (handler)
+ return qMakePair(handler->object(), handler->signalIndex());
+ }
return qMakePair((QObject *)0, -1);
}
@@ -325,8 +334,7 @@ ReturnedValue QObjectWrapper::getQmlProperty(ExecutionContext *ctx, QQmlContextD
return vmemo->vmeMethod(result->coreIndex);
} else if (result->isV4Function()) {
QV4::Scoped<QV4::Object> qmlcontextobject(scope, ctx->engine->qmlContextObject());
- return QV4::QObjectMethod::create(ctx->engine->rootContext, m_object, result->coreIndex,
- qmlcontextobject.asValue()).asReturnedValue();
+ return QV4::QObjectMethod::create(ctx->engine->rootContext, m_object, result->coreIndex, qmlcontextobject);
} else if (result->isSignalHandler()) {
QV4::Scoped<QV4::QmlSignalHandler> handler(scope, new (ctx->engine->memoryManager) QV4::QmlSignalHandler(ctx->engine, m_object, result->coreIndex));
@@ -337,7 +345,7 @@ ReturnedValue QObjectWrapper::getQmlProperty(ExecutionContext *ctx, QQmlContextD
return handler.asReturnedValue();
} else {
- return QV4::QObjectMethod::create(ctx->engine->rootContext, m_object, result->coreIndex).asReturnedValue();
+ return QV4::QObjectMethod::create(ctx->engine->rootContext, m_object, result->coreIndex);
}
}
@@ -567,7 +575,7 @@ ReturnedValue QObjectWrapper::wrap(ExecutionEngine *engine, QObject *object)
// tainted object list
Scoped<Object> alternateWrapper(scope, (Object *)0);
if (engine->m_multiplyWrappedQObjects && ddata->hasTaintedV8Object)
- alternateWrapper = Value::fromObject(engine->m_multiplyWrappedQObjects->value(object));
+ alternateWrapper = engine->m_multiplyWrappedQObjects->value(object);
// If our tainted handle doesn't exist or has been collected, and there isn't
// a handle in the ddata, we can assume ownership of the ddata->v8object
@@ -658,7 +666,7 @@ Property *QObjectWrapper::advanceIterator(Managed *m, ObjectIterator *it, String
++it->arrayIndex;
if (attributes)
*attributes = QV4::Attr_Data;
- it->tmpDynamicProperty.value = QV4::Value::fromReturnedValue(that->get(n));
+ it->tmpDynamicProperty.value = that->get(n);
return &it->tmpDynamicProperty;
}
const int methodCount = mo->methodCount();
@@ -668,7 +676,7 @@ Property *QObjectWrapper::advanceIterator(Managed *m, ObjectIterator *it, String
++it->arrayIndex;
if (attributes)
*attributes = QV4::Attr_Data;
- it->tmpDynamicProperty.value = QV4::Value::fromReturnedValue(that->get(n));
+ it->tmpDynamicProperty.value = that->get(n);
return &it->tmpDynamicProperty;
}
return QV4::Object::advanceIterator(m, it, name, index, attributes);
@@ -708,13 +716,13 @@ struct QObjectSlotDispatcher : public QtPrivate::QSlotObjectBase
QV4::ExecutionContext *ctx = v4->current;
QV4::ScopedCallData callData(scope, argCount);
- callData->thisObject = This->thisObject.isUndefined() ? Value::fromObject(v4->globalObject) : Value::fromReturnedValue(This->thisObject.value());
+ callData->thisObject = This->thisObject.isUndefined() ? v4->globalObject->asReturnedValue() : This->thisObject.value();
for (int ii = 0; ii < argCount; ++ii) {
int type = argsTypes[ii + 1];
if (type == qMetaTypeId<QVariant>()) {
- callData->args[ii] = QV4::Value::fromReturnedValue(v4->v8Engine->fromVariant(*((QVariant *)metaArgs[ii + 1])));
+ callData->args[ii] = v4->v8Engine->fromVariant(*((QVariant *)metaArgs[ii + 1]));
} else {
- callData->args[ii] = QV4::Value::fromReturnedValue(v4->v8Engine->fromVariant(QVariant(type, metaArgs[ii + 1])));
+ callData->args[ii] = v4->v8Engine->fromVariant(QVariant(type, metaArgs[ii + 1]));
}
}
@@ -758,7 +766,7 @@ struct QObjectSlotDispatcher : public QtPrivate::QSlotObjectBase
(connection->thisObject.isUndefined() || __qmljs_strict_equal(connection->thisObject, thisObject))) {
QV4::ScopedFunctionObject f(scope, connection->function.value());
- QPair<QObject *, int> connectedFunctionData = extractQtMethod(f.getPointer());
+ QPair<QObject *, int> connectedFunctionData = extractQtMethod(f);
if (connectedFunctionData.first == receiverToDisconnect &&
connectedFunctionData.second == slotIndexToDisconnect) {
*ret = true;
@@ -837,6 +845,8 @@ ReturnedValue QObjectWrapper::method_disconnect(SimpleCallContext *ctx)
if (ctx->callData->argc == 0)
V4THROW_ERROR("Function.prototype.disconnect: no arguments given");
+ QV4::Scope scope(ctx);
+
QPair<QObject *, int> signalInfo = extractQtSignal(ctx->callData->thisObject);
QObject *signalObject = signalInfo.first;
int signalIndex = signalInfo.second;
@@ -850,8 +860,8 @@ ReturnedValue QObjectWrapper::method_disconnect(SimpleCallContext *ctx)
if (signalIndex < 0 || signalObject->metaObject()->method(signalIndex).methodType() != QMetaMethod::Signal)
V4THROW_ERROR("Function.prototype.disconnect: this object is not a signal");
- QV4::Value functionValue = QV4::Primitive::undefinedValue();
- QV4::Value functionThisValue = QV4::Primitive::undefinedValue();
+ QV4::ScopedFunctionObject functionValue(scope);
+ QV4::ScopedValue functionThisValue(scope, QV4::Encode::undefined());
if (ctx->callData->argc == 1) {
functionValue = ctx->callData->args[0];
@@ -860,18 +870,18 @@ ReturnedValue QObjectWrapper::method_disconnect(SimpleCallContext *ctx)
functionValue = ctx->callData->args[1];
}
- if (!functionValue.asFunctionObject())
+ if (!functionValue)
V4THROW_ERROR("Function.prototype.disconnect: target is not a function");
- if (!functionThisValue.isUndefined() && !functionThisValue.isObject())
+ if (!functionThisValue->isUndefined() && !functionThisValue->isObject())
V4THROW_ERROR("Function.prototype.disconnect: target this is not an object");
- QPair<QObject *, int> functionData = extractQtMethod(functionValue.asFunctionObject());
+ QPair<QObject *, int> functionData = extractQtMethod(functionValue);
void *a[] = {
ctx->engine,
- &functionValue,
- &functionThisValue,
+ functionValue.ptr,
+ functionThisValue.ptr,
functionData.first,
&functionData.second
};
@@ -1618,7 +1628,7 @@ QV4::ReturnedValue CallArgument::toValue(QV8Engine *engine)
QV4::Scoped<ArrayObject> array(scope, v4->newArrayObject());
array->arrayReserve(list.count());
for (int ii = 0; ii < list.count(); ++ii) {
- array->arrayData[ii].value = Value::fromReturnedValue(QV4::QObjectWrapper::wrap(v4, list.at(ii)));
+ array->arrayData[ii].value = QV4::QObjectWrapper::wrap(v4, list.at(ii));
array->arrayDataLen = ii + 1;
}
array->setArrayLengthUnchecked(list.count());
@@ -1644,19 +1654,19 @@ QV4::ReturnedValue CallArgument::toValue(QV8Engine *engine)
}
}
-Value QObjectMethod::create(ExecutionContext *scope, QObject *object, int index, const Value &qmlGlobal)
+ReturnedValue QObjectMethod::create(ExecutionContext *scope, QObject *object, int index, const ValueRef qmlGlobal)
{
- return Value::fromObject(new (scope->engine->memoryManager) QObjectMethod(scope, object, index, qmlGlobal));
+ return (new (scope->engine->memoryManager) QObjectMethod(scope, object, index, qmlGlobal))->asReturnedValue();
}
-QObjectMethod::QObjectMethod(ExecutionContext *scope, QObject *object, int index, const Value &qmlGlobal)
+QObjectMethod::QObjectMethod(ExecutionContext *scope, QObject *object, int index, const ValueRef qmlGlobal)
: FunctionObject(scope)
, m_object(object)
, m_index(index)
{
vtbl = &static_vtbl;
subtype = WrappedQtMethod;
- m_qmlGlobal = qmlGlobal.asReturnedValue();
+ m_qmlGlobal = qmlGlobal;
}
QV4::ReturnedValue QObjectMethod::method_toString(QV4::ExecutionContext *ctx)
@@ -1683,7 +1693,7 @@ QV4::ReturnedValue QObjectMethod::method_toString(QV4::ExecutionContext *ctx)
return ctx->engine->newString(result)->asReturnedValue();
}
-QV4::ReturnedValue QObjectMethod::method_destroy(QV4::ExecutionContext *ctx, const Value *args, int argc)
+QV4::ReturnedValue QObjectMethod::method_destroy(QV4::ExecutionContext *ctx, const ValueRef args, int argc)
{
if (!m_object)
return Encode::undefined();
diff --git a/src/qml/jsruntime/qv4qobjectwrapper_p.h b/src/qml/jsruntime/qv4qobjectwrapper_p.h
index ce0c206a18..74c436ca64 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper_p.h
+++ b/src/qml/jsruntime/qv4qobjectwrapper_p.h
@@ -126,16 +126,16 @@ struct QObjectMethod : public QV4::FunctionObject
enum { DestroyMethod = -1, ToStringMethod = -2 };
- static Value create(QV4::ExecutionContext *scope, QObject *object, int index, const Value &qmlGlobal = Primitive::undefinedValue());
+ static ReturnedValue create(QV4::ExecutionContext *scope, QObject *object, int index, const ValueRef qmlGlobal = Primitive::undefinedValue());
int methodIndex() const { return m_index; }
QObject *object() const { return m_object.data(); }
private:
- QObjectMethod(QV4::ExecutionContext *scope, QObject *object, int index, const QV4::Value &qmlGlobal);
+ QObjectMethod(QV4::ExecutionContext *scope, QObject *object, int index, const ValueRef qmlGlobal);
QV4::ReturnedValue method_toString(QV4::ExecutionContext *ctx);
- QV4::ReturnedValue method_destroy(QV4::ExecutionContext *ctx, const Value *args, int argc);
+ QV4::ReturnedValue method_destroy(QV4::ExecutionContext *ctx, const ValueRef args, int argc);
QPointer<QObject> m_object;
int m_index;
diff --git a/src/qml/jsruntime/qv4regexp.cpp b/src/qml/jsruntime/qv4regexp.cpp
index 3d9572eb5a..bc0955f547 100644
--- a/src/qml/jsruntime/qv4regexp.cpp
+++ b/src/qml/jsruntime/qv4regexp.cpp
@@ -138,12 +138,12 @@ void RegExp::markObjects(Managed *that)
ReturnedValue RegExp::get(Managed *, const StringRef, bool *)
{
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
ReturnedValue RegExp::getIndexed(Managed *m, uint index, bool *hasProperty)
{
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
void RegExp::put(Managed *m, const StringRef name, const ValueRef value)
diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp
index bab4a32073..899938faae 100644
--- a/src/qml/jsruntime/qv4regexpobject.cpp
+++ b/src/qml/jsruntime/qv4regexpobject.cpp
@@ -374,8 +374,9 @@ ReturnedValue RegExpPrototype::method_compile(SimpleCallContext *ctx)
ctx->throwTypeError();
ScopedCallData callData(scope, ctx->callData->argc);
- memcpy(callData->args, ctx->callData->args, ctx->callData->argc*sizeof(Value));
- RegExpObject *re = Value::fromReturnedValue(ctx->engine->regExpCtor.asFunctionObject()->construct(callData)).as<RegExpObject>();
+ memcpy(callData->args, ctx->callData->args, ctx->callData->argc*sizeof(SafeValue));
+
+ Scoped<RegExpObject> re(scope, ctx->engine->regExpCtor.asFunctionObject()->construct(callData));
r->value = re->value;
r->global = re->global;
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index cb059be3a8..dabd9ad84b 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -255,7 +255,7 @@ ReturnedValue __qmljs_delete_subscript(ExecutionContext *ctx, const ValueRef bas
if (o) {
uint n = index->asArrayIndex();
if (n < UINT_MAX) {
- return Primitive::fromBoolean(o->deleteIndexedProperty(n)).asReturnedValue();
+ return Encode((bool)o->deleteIndexedProperty(n));
}
}
@@ -291,7 +291,7 @@ QV4::ReturnedValue __qmljs_add_helper(ExecutionContext *ctx, const ValueRef left
}
double x = __qmljs_to_number(pleft);
double y = __qmljs_to_number(pright);
- return Primitive::fromDouble(x + y).asReturnedValue();
+ return Encode(x + y);
}
QV4::ReturnedValue __qmljs_instanceof(ExecutionContext *ctx, const ValueRef left, const ValueRef right)
@@ -301,7 +301,7 @@ QV4::ReturnedValue __qmljs_instanceof(ExecutionContext *ctx, const ValueRef left
ctx->throwTypeError();
bool r = o->hasInstance(left);
- return Primitive::fromBoolean(r).asReturnedValue();
+ return Encode(r);
}
QV4::ReturnedValue __qmljs_in(ExecutionContext *ctx, const ValueRef left, const ValueRef right)
@@ -311,7 +311,7 @@ QV4::ReturnedValue __qmljs_in(ExecutionContext *ctx, const ValueRef left, const
Scope scope(ctx);
ScopedString s(scope, left->toString(ctx));
bool r = right->objectValue()->__hasProperty__(s);
- return Primitive::fromBoolean(r).asReturnedValue();
+ return Encode(r);
}
static void inplaceBitOp(ExecutionContext *ctx, const StringRef name, const ValueRef value, BinOp op)
@@ -584,24 +584,24 @@ ReturnedValue __qmljs_object_default_value(Object *object, int typeHint)
ExecutionContext *ctx = engine->current;
Scope scope(ctx);
ScopedCallData callData(scope, 0);
- callData->thisObject = Value::fromObject(object);
+ callData->thisObject = object;
ScopedValue conv(scope, object->get(*meth1));
if (FunctionObject *o = conv->asFunctionObject()) {
- Value r = Value::fromReturnedValue(o->call(callData));
- if (r.isPrimitive())
- return r.asReturnedValue();
+ ScopedValue r(scope, o->call(callData));
+ if (r->isPrimitive())
+ return r->asReturnedValue();
}
conv = object->get(*meth2);
if (FunctionObject *o = conv->asFunctionObject()) {
- Value r = Value::fromReturnedValue(o->call(callData));
- if (r.isPrimitive())
- return r.asReturnedValue();
+ ScopedValue r(scope, o->call(callData));
+ if (r->isPrimitive())
+ return r->asReturnedValue();
}
ctx->throwTypeError();
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
Bool __qmljs_to_boolean(const ValueRef value)
@@ -674,7 +674,7 @@ ReturnedValue __qmljs_get_element(ExecutionContext *ctx, const ValueRef object,
if (idx < UINT_MAX) {
if (String *str = object->asString()) {
if (idx >= (uint)str->toQString().length()) {
- return Primitive::undefinedValue().asReturnedValue();
+ return Encode::undefined();
}
const QString s = str->toQString().mid(idx, 1);
return scope.engine->newString(s)->asReturnedValue();
@@ -813,11 +813,9 @@ uint __qmljs_equal_helper(const ValueRef x, const ValueRef y)
double dx = __qmljs_to_number(x);
return dx == y->asDouble();
} else if (x->isBoolean()) {
- Value nx = Primitive::fromDouble((double) x->booleanValue());
- return __qmljs_cmp_eq(ValueRef(&nx), y);
+ return __qmljs_cmp_eq(Primitive::fromDouble((double) x->booleanValue()), y);
} else if (y->isBoolean()) {
- Value ny = Primitive::fromDouble((double) y->booleanValue());
- return __qmljs_cmp_eq(x, ValueRef(&ny));
+ return __qmljs_cmp_eq(x, Primitive::fromDouble((double) y->booleanValue()));
} else if ((x->isNumber() || x->isString()) && y->isObject()) {
Scope scope(y->objectValue()->engine());
ScopedValue py(scope, __qmljs_to_primitive(y, PREFERREDTYPE_HINT));
@@ -964,13 +962,15 @@ ReturnedValue __qmljs_call_activation_property(ExecutionContext *context, const
Object *base;
ScopedValue func(scope, context->getPropertyAndBase(name, &base));
if (base)
- callData->thisObject = Value::fromObject(base);
+ callData->thisObject = base;
FunctionObject *o = func->asFunctionObject();
if (!o) {
QString objectAsString = QStringLiteral("[null]");
- if (base)
- objectAsString = Value::fromObject(base).toQStringNoThrow();
+ if (base) {
+ ScopedValue b(scope, base);
+ objectAsString = b->toQStringNoThrow();
+ }
QString msg = QStringLiteral("Property '%1' of object %2 is not a function").arg(name->toQString()).arg(objectAsString);
context->throwTypeError(msg);
}
@@ -1021,11 +1021,11 @@ ReturnedValue __qmljs_call_property_lookup(ExecutionContext *context, uint index
ReturnedValue __qmljs_call_element(ExecutionContext *context, const ValueRef index, CallDataRef callData)
{
Scope scope(context);
- Object *baseObject = callData->thisObject.toObject(context);
- callData->thisObject = Value::fromObject(baseObject);
+ ScopedObject baseObject(scope, callData->thisObject.toObject(context));
+ callData->thisObject = baseObject;
ScopedString s(scope, index->toString(context));
- Scoped<Object> o(scope, baseObject->get(s));
+ ScopedObject o(scope, baseObject->get(s));
if (!o)
context->throwTypeError();
@@ -1247,11 +1247,11 @@ QV4::ReturnedValue __qmljs_increment(const QV4::ValueRef value)
{
TRACE1(value);
- if (value->isInteger())
- return Primitive::fromInt32(value->integerValue() + 1).asReturnedValue();
+ if (value->isInteger() && value->integerValue() < INT_MAX)
+ return Encode(value->integerValue() + 1);
else {
double d = value->toNumber();
- return Primitive::fromDouble(d + 1).asReturnedValue();
+ return Encode(d + 1.);
}
}
@@ -1259,11 +1259,11 @@ QV4::ReturnedValue __qmljs_decrement(const QV4::ValueRef value)
{
TRACE1(value);
- if (value->isInteger())
- return Primitive::fromInt32(value->integerValue() - 1).asReturnedValue();
+ if (value->isInteger() && value->integerValue() > INT_MIN)
+ return Encode(value->integerValue() - 1);
else {
double d = value->toNumber();
- return Primitive::fromDouble(d - 1).asReturnedValue();
+ return Encode(d - 1.);
}
}
diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h
index a9e8e01232..da7f98e2ca 100644
--- a/src/qml/jsruntime/qv4runtime_p.h
+++ b/src/qml/jsruntime/qv4runtime_p.h
@@ -311,10 +311,10 @@ inline QV4::ReturnedValue __qmljs_uminus(const QV4::ValueRef value)
// +0 != -0, so we need to convert to double when negating 0
if (value->isInteger() && value->integerValue())
- return QV4::Primitive::fromInt32(-value->integerValue()).asReturnedValue();
+ return Encode(-value->integerValue());
else {
double n = __qmljs_to_number(value);
- return QV4::Primitive::fromDouble(-n).asReturnedValue();
+ return Encode(-n);
}
}
@@ -345,11 +345,11 @@ inline ReturnedValue __qmljs_bit_or(const QV4::ValueRef left, const QV4::ValueRe
TRACE2(left, right);
if (QV4::Value::integerCompatible(*left, *right))
- return QV4::Primitive::fromInt32(left->integerValue() | right->integerValue()).asReturnedValue();
+ return Encode(left->integerValue() | right->integerValue());
int lval = left->toInt32();
int rval = right->toInt32();
- return QV4::Primitive::fromInt32(lval | rval).asReturnedValue();
+ return Encode(lval | rval);
}
inline ReturnedValue __qmljs_bit_xor(const QV4::ValueRef left, const QV4::ValueRef right)
@@ -357,11 +357,11 @@ inline ReturnedValue __qmljs_bit_xor(const QV4::ValueRef left, const QV4::ValueR
TRACE2(left, right);
if (QV4::Value::integerCompatible(*left, *right))
- return QV4::Primitive::fromInt32(left->integerValue() ^ right->integerValue()).asReturnedValue();
+ return Encode(left->integerValue() ^ right->integerValue());
int lval = left->toInt32();
int rval = right->toInt32();
- return QV4::Primitive::fromInt32(lval ^ rval).asReturnedValue();
+ return Encode(lval ^ rval);
}
inline ReturnedValue __qmljs_bit_and(const QV4::ValueRef left, const QV4::ValueRef right)
@@ -369,11 +369,11 @@ inline ReturnedValue __qmljs_bit_and(const QV4::ValueRef left, const QV4::ValueR
TRACE2(left, right);
if (QV4::Value::integerCompatible(*left, *right))
- return QV4::Primitive::fromInt32(left->integerValue() & right->integerValue()).asReturnedValue();
+ return Encode(left->integerValue() & right->integerValue());
int lval = left->toInt32();
int rval = right->toInt32();
- return QV4::Primitive::fromInt32(lval & rval).asReturnedValue();
+ return Encode(lval & rval);
}
inline QV4::ReturnedValue __qmljs_add(QV4::ExecutionContext *ctx, const QV4::ValueRef left, const QV4::ValueRef right)
@@ -429,7 +429,7 @@ inline QV4::ReturnedValue __qmljs_mod(const QV4::ValueRef left, const QV4::Value
if (QV4::Value::integerCompatible(*left, *right) && right->integerValue() != 0) {
int intRes = left->integerValue() % right->integerValue();
if (intRes != 0 || left->integerValue() >= 0)
- return QV4::Primitive::fromInt32(intRes).asReturnedValue();
+ return Encode(intRes);
}
double lval = __qmljs_to_number(left);
@@ -442,11 +442,11 @@ inline QV4::ReturnedValue __qmljs_shl(const QV4::ValueRef left, const QV4::Value
TRACE2(left, right);
if (QV4::Value::integerCompatible(*left, *right))
- return QV4::Primitive::fromInt32(left->integerValue() << ((uint(right->integerValue()) & 0x1f))).asReturnedValue();
+ return Encode((int)(left->integerValue() << ((uint(right->integerValue()) & 0x1f))));
int lval = left->toInt32();
unsigned rval = right->toUInt32() & 0x1f;
- return QV4::Primitive::fromInt32(lval << rval).asReturnedValue();
+ return Encode((int)(lval << rval));
}
inline QV4::ReturnedValue __qmljs_shr(const QV4::ValueRef left, const QV4::ValueRef right)
@@ -454,11 +454,11 @@ inline QV4::ReturnedValue __qmljs_shr(const QV4::ValueRef left, const QV4::Value
TRACE2(left, right);
if (QV4::Value::integerCompatible(*left, *right))
- return QV4::Primitive::fromInt32(left->integerValue() >> ((uint(right->integerValue()) & 0x1f))).asReturnedValue();
+ return Encode((int)(left->integerValue() >> ((uint(right->integerValue()) & 0x1f))));
int lval = left->toInt32();
unsigned rval = right->toUInt32() & 0x1f;
- return QV4::Primitive::fromInt32(lval >> rval).asReturnedValue();
+ return Encode((int)(lval >> rval));
}
inline QV4::ReturnedValue __qmljs_ushr(const QV4::ValueRef left, const QV4::ValueRef right)
@@ -474,52 +474,55 @@ inline QV4::ReturnedValue __qmljs_ushr(const QV4::ValueRef left, const QV4::Valu
res = lval >> rval;
}
- if (res > INT_MAX)
- return QV4::Primitive::fromDouble(res).asReturnedValue();
- else
- return QV4::Primitive::fromInt32(res).asReturnedValue();
+ return Encode(res);
}
inline QV4::ReturnedValue __qmljs_gt(const QV4::ValueRef left, const QV4::ValueRef right)
{
TRACE2(left, right);
- return QV4::Primitive::fromBoolean(__qmljs_cmp_gt(left, right)).asReturnedValue();
+ bool r = __qmljs_cmp_gt(left, right);
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_lt(const QV4::ValueRef left, const QV4::ValueRef right)
{
TRACE2(left, right);
- return QV4::Primitive::fromBoolean(__qmljs_cmp_lt(left, right)).asReturnedValue();
+ bool r = __qmljs_cmp_lt(left, right);
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_ge(const QV4::ValueRef left, const QV4::ValueRef right)
{
TRACE2(left, right);
- return QV4::Primitive::fromBoolean(__qmljs_cmp_ge(left, right)).asReturnedValue();
+ bool r = __qmljs_cmp_ge(left, right);
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_le(const QV4::ValueRef left, const QV4::ValueRef right)
{
TRACE2(left, right);
- return QV4::Primitive::fromBoolean(__qmljs_cmp_le(left, right)).asReturnedValue();
+ bool r = __qmljs_cmp_le(left, right);
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_eq(const QV4::ValueRef left, const QV4::ValueRef right)
{
TRACE2(left, right);
- return QV4::Primitive::fromBoolean(__qmljs_cmp_eq(left, right)).asReturnedValue();
+ bool r = __qmljs_cmp_eq(left, right);
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_ne(const QV4::ValueRef left, const QV4::ValueRef right)
{
TRACE2(left, right);
- return QV4::Primitive::fromBoolean(!__qmljs_cmp_eq(left, right)).asReturnedValue();
+ bool r = !__qmljs_cmp_eq(left, right);
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_se(const QV4::ValueRef left, const QV4::ValueRef right)
@@ -527,7 +530,7 @@ inline QV4::ReturnedValue __qmljs_se(const QV4::ValueRef left, const QV4::ValueR
TRACE2(left, right);
bool r = __qmljs_strict_equal(left, right);
- return QV4::Primitive::fromBoolean(r).asReturnedValue();
+ return Encode(r);
}
inline QV4::ReturnedValue __qmljs_sne(const QV4::ValueRef left, const QV4::ValueRef right)
@@ -535,7 +538,7 @@ inline QV4::ReturnedValue __qmljs_sne(const QV4::ValueRef left, const QV4::Value
TRACE2(left, right);
bool r = ! __qmljs_strict_equal(left, right);
- return QV4::Primitive::fromBoolean(r).asReturnedValue();
+ return Encode(r);
}
inline QV4::Bool __qmljs_cmp_eq(const QV4::ValueRef left, const QV4::ValueRef right)
diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h
index 0f6c738411..b32aed12d9 100644
--- a/src/qml/jsruntime/qv4scopedvalue_p.h
+++ b/src/qml/jsruntime/qv4scopedvalue_p.h
@@ -72,12 +72,12 @@ struct Scope {
~Scope() {
#ifndef QT_NO_DEBUG
Q_ASSERT(engine->jsStackTop >= mark);
- memset(mark, 0, (engine->jsStackTop - mark)*sizeof(Value));
+ memset(mark, 0, (engine->jsStackTop - mark)*sizeof(SafeValue));
#endif
engine->jsStackTop = mark;
}
- Value *alloc(int nValues) {
+ SafeValue *alloc(int nValues) {
SafeValue *ptr = engine->jsStackTop;
engine->jsStackTop += nValues;
#ifndef QT_NO_DEBUG
@@ -364,7 +364,7 @@ struct CallData
struct ScopedCallData {
ScopedCallData(Scope &scope, int argc)
{
- int size = qMax(argc, (int)QV4::Global::ReservedArgumentCount) + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value);
+ int size = qMax(argc, (int)QV4::Global::ReservedArgumentCount) + qOffsetOf(QV4::CallData, args)/sizeof(QV4::SafeValue);
ptr = reinterpret_cast<CallData *>(scope.engine->stackPush(size));
ptr->tag = QV4::Value::Integer_Type;
ptr->argc = argc;
diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp
index 432e3b4b47..d2963dff8c 100644
--- a/src/qml/jsruntime/qv4script.cpp
+++ b/src/qml/jsruntime/qv4script.cpp
@@ -201,7 +201,7 @@ void Script::parse()
isel->setUseFastLookups(false);
QV4::CompiledData::CompilationUnit *compilationUnit = isel->compile();
vmFunction = compilationUnit->linkToEngine(v4);
- ScopedValue holder(valueScope, Value::fromObject(new (v4->memoryManager) CompilationUnitHolder(v4, compilationUnit)));
+ ScopedValue holder(valueScope, new (v4->memoryManager) CompilationUnitHolder(v4, compilationUnit));
compilationUnitHolder = holder;
}
diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp
index f864d4dabf..5c3204d5fc 100644
--- a/src/qml/jsruntime/qv4sequenceobject.cpp
+++ b/src/qml/jsruntime/qv4sequenceobject.cpp
@@ -79,33 +79,29 @@ static void generateWarning(QV4::ExecutionContext *ctx, const QString& descripti
F(QString, QString, QStringList, QString()) \
F(QUrl, Url, QList<QUrl>, QUrl())
-static QV4::Value convertElementToValue(QV4::ExecutionEngine *engine, const QString &element)
+static QV4::ReturnedValue convertElementToValue(QV4::ExecutionEngine *engine, const QString &element)
{
- QV4::Value v;
- v = engine->newString(element)->asReturnedValue();
- return v;
+ return engine->newString(element)->asReturnedValue();
}
-static QV4::Value convertElementToValue(QV4::ExecutionEngine *, int element)
+static QV4::ReturnedValue convertElementToValue(QV4::ExecutionEngine *, int element)
{
- return QV4::Primitive::fromInt32(element);
+ return QV4::Encode(element);
}
-static QV4::Value convertElementToValue(QV4::ExecutionEngine *engine, const QUrl &element)
+static QV4::ReturnedValue convertElementToValue(QV4::ExecutionEngine *engine, const QUrl &element)
{
- QV4::Value v;
- v = engine->newString(element.toString())->asReturnedValue();
- return v;
+ return engine->newString(element.toString())->asReturnedValue();
}
-static QV4::Value convertElementToValue(QV4::ExecutionEngine *, qreal element)
+static QV4::ReturnedValue convertElementToValue(QV4::ExecutionEngine *, qreal element)
{
- return QV4::Primitive::fromDouble(element);
+ return QV4::Encode(element);
}
-static QV4::Value convertElementToValue(QV4::ExecutionEngine *, bool element)
+static QV4::ReturnedValue convertElementToValue(QV4::ExecutionEngine *, bool element)
{
- return QV4::Primitive::fromBoolean(element);
+ return QV4::Encode(element);
}
static QString convertElementToString(const QString &element)
@@ -199,20 +195,20 @@ public:
defineAccessorProperty(QStringLiteral("length"), method_get_length, method_set_length);
}
- QV4::Value containerGetIndexed(uint index, bool *hasProperty)
+ QV4::ReturnedValue containerGetIndexed(uint index, bool *hasProperty)
{
/* Qt containers have int (rather than uint) allowable indexes. */
if (index > INT_MAX) {
generateWarning(engine()->current, QLatin1String("Index out of range during indexed get"));
if (hasProperty)
*hasProperty = false;
- return QV4::Primitive::undefinedValue();
+ return Encode::undefined();
}
if (m_isReference) {
if (!m_object) {
if (hasProperty)
*hasProperty = false;
- return QV4::Primitive::undefinedValue();
+ return Encode::undefined();
}
loadReference();
}
@@ -224,7 +220,7 @@ public:
}
if (hasProperty)
*hasProperty = false;
- return QV4::Primitive::undefinedValue();
+ return Encode::undefined();
}
void containerPutIndexed(uint index, const QV4::ValueRef value)
@@ -495,7 +491,7 @@ private:
bool m_isReference;
static QV4::ReturnedValue getIndexed(QV4::Managed *that, uint index, bool *hasProperty)
- { return static_cast<QQmlSequence<Container> *>(that)->containerGetIndexed(index, hasProperty).asReturnedValue(); }
+ { return static_cast<QQmlSequence<Container> *>(that)->containerGetIndexed(index, hasProperty); }
static void putIndexed(Managed *that, uint index, const QV4::ValueRef value)
{ static_cast<QQmlSequence<Container> *>(that)->containerPutIndexed(index, value); }
static QV4::PropertyAttributes queryIndexed(const QV4::Managed *that, uint index)