From 4f98ccae0f461da06fcc9805ca2131851e0a36f9 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 30 Apr 2013 23:43:26 +0200 Subject: [PATCH] Simplify function signature for ExecutionEngine::newArrayObject Change-Id: Id8d79e0029816a043798feaee97e1ecb05d5c856 Reviewed-by: Simon Hausmann --- src/qml/qml/v4/qv4arrayobject.cpp | 17 +++++++++++------ src/qml/qml/v4/qv4arrayobject_p.h | 2 +- src/qml/qml/v4/qv4engine.cpp | 4 ++-- src/qml/qml/v4/qv4engine_p.h | 2 +- src/qml/qml/v4/qv4jsonobject.cpp | 2 +- src/qml/qml/v4/qv4object.cpp | 4 ++-- src/qml/qml/v4/qv4object_p.h | 4 ++-- src/qml/qml/v4/qv4objectproto.cpp | 4 ++-- src/qml/qml/v4/qv4regexpobject.cpp | 2 +- src/qml/qml/v4/qv4runtime.cpp | 2 +- src/qml/qml/v4/qv4stringobject.cpp | 4 ++-- src/qml/qml/v4/qv4v8.cpp | 6 +++--- src/qml/qml/v8/qjsconverter_impl_p.h | 2 +- src/qml/qml/v8/qjsengine.cpp | 4 +++- src/qml/qml/v8/qv4jsonwrapper.cpp | 2 +- src/qml/qml/v8/qv8engine.cpp | 8 ++++---- 16 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/qml/qml/v4/qv4arrayobject.cpp b/src/qml/qml/v4/qv4arrayobject.cpp index b489c78..04421ed 100644 --- a/src/qml/qml/v4/qv4arrayobject.cpp +++ b/src/qml/qml/v4/qv4arrayobject.cpp @@ -54,7 +54,7 @@ ArrayCtor::ArrayCtor(ExecutionContext *scope) Value ArrayCtor::construct(Managed *, ExecutionContext *ctx, Value *argv, int argc) { - ArrayObject *a = ctx->engine->newArrayObject(ctx); + ArrayObject *a = ctx->engine->newArrayObject(); uint len; if (argc == 1 && argv[0].isNumber()) { bool ok; @@ -82,6 +82,11 @@ Value ArrayCtor::call(Managed *that, ExecutionContext *ctx, const Value &thisObj return construct(that, ctx, argv, argc); } +ArrayPrototype::ArrayPrototype(ExecutionContext *context) + : ArrayObject(context->engine) +{ +} + void ArrayPrototype::init(ExecutionContext *ctx, const Value &ctor) { ctor.objectValue()->defineReadonlyProperty(ctx->engine->id_length, Value::fromInt32(1)); @@ -137,7 +142,7 @@ Value ArrayPrototype::method_toLocaleString(SimpleCallContext *ctx) Value ArrayPrototype::method_concat(SimpleCallContext *ctx) { - ArrayObject *result = ctx->engine->newArrayObject(ctx); + ArrayObject *result = ctx->engine->newArrayObject(); if (ArrayObject *instance = ctx->thisObject.asArrayObject()) { result->copyArrayData(instance); @@ -381,7 +386,7 @@ Value ArrayPrototype::method_slice(SimpleCallContext *ctx) { Object *o = ctx->thisObject.toObject(ctx); - ArrayObject *result = ctx->engine->newArrayObject(ctx); + ArrayObject *result = ctx->engine->newArrayObject(); uint len = o->get(ctx, ctx->engine->id_length).toUInt32(); double s = ctx->argument(0).toInteger(); uint start; @@ -430,7 +435,7 @@ Value ArrayPrototype::method_splice(SimpleCallContext *ctx) Object *instance = ctx->thisObject.toObject(ctx); uint len = getLength(ctx, instance); - ArrayObject *newArray = ctx->engine->newArrayObject(ctx); + ArrayObject *newArray = ctx->engine->newArrayObject(); double rs = ctx->argument(0).toInteger(); uint start; @@ -712,7 +717,7 @@ Value ArrayPrototype::method_map(SimpleCallContext *ctx) Value thisArg = ctx->argument(1); - ArrayObject *a = ctx->engine->newArrayObject(ctx); + ArrayObject *a = ctx->engine->newArrayObject(); a->arrayReserve(len); a->setArrayLengthUnchecked(len); @@ -744,7 +749,7 @@ Value ArrayPrototype::method_filter(SimpleCallContext *ctx) Value thisArg = ctx->argument(1); - ArrayObject *a = ctx->engine->newArrayObject(ctx); + ArrayObject *a = ctx->engine->newArrayObject(); a->arrayReserve(len); uint to = 0; diff --git a/src/qml/qml/v4/qv4arrayobject_p.h b/src/qml/qml/v4/qv4arrayobject_p.h index a76510c..4201997 100644 --- a/src/qml/qml/v4/qv4arrayobject_p.h +++ b/src/qml/qml/v4/qv4arrayobject_p.h @@ -62,7 +62,7 @@ protected: struct ArrayPrototype: ArrayObject { - ArrayPrototype(ExecutionContext *context) : ArrayObject(context) {} + ArrayPrototype(ExecutionContext *context); void init(ExecutionContext *ctx, const Value &ctor); diff --git a/src/qml/qml/v4/qv4engine.cpp b/src/qml/qml/v4/qv4engine.cpp index 4fcde52..3bb19d1 100644 --- a/src/qml/qml/v4/qv4engine.cpp +++ b/src/qml/qml/v4/qv4engine.cpp @@ -408,9 +408,9 @@ Object *ExecutionEngine::newFunctionObject(ExecutionContext *ctx) return object; } -ArrayObject *ExecutionEngine::newArrayObject(ExecutionContext *ctx) +ArrayObject *ExecutionEngine::newArrayObject() { - ArrayObject *object = new (memoryManager) ArrayObject(ctx); + ArrayObject *object = new (memoryManager) ArrayObject(this); object->prototype = arrayPrototype; return object; } diff --git a/src/qml/qml/v4/qv4engine_p.h b/src/qml/qml/v4/qv4engine_p.h index de894a5..1f0fc9a 100644 --- a/src/qml/qml/v4/qv4engine_p.h +++ b/src/qml/qml/v4/qv4engine_p.h @@ -226,7 +226,7 @@ struct Q_QML_EXPORT ExecutionEngine Object *newBooleanObject(const Value &value); Object *newFunctionObject(ExecutionContext *ctx); - ArrayObject *newArrayObject(ExecutionContext *ctx); + ArrayObject *newArrayObject(); DateObject *newDateObject(const Value &value); diff --git a/src/qml/qml/v4/qv4jsonobject.cpp b/src/qml/qml/v4/qv4jsonobject.cpp index 2e91229..b2d5d7b 100644 --- a/src/qml/qml/v4/qv4jsonobject.cpp +++ b/src/qml/qml/v4/qv4jsonobject.cpp @@ -293,7 +293,7 @@ bool JsonParser::parseMember(Object *o) Value JsonParser::parseArray() { BEGIN << "parseArray"; - ArrayObject *array = context->engine->newArrayObject(context); + ArrayObject *array = context->engine->newArrayObject(); if (++nestingLevel > nestingLimit) { lastError = QJsonParseError::DeepNesting; diff --git a/src/qml/qml/v4/qv4object.cpp b/src/qml/qml/v4/qv4object.cpp index 42ec8f2..405be3f 100644 --- a/src/qml/qml/v4/qv4object.cpp +++ b/src/qml/qml/v4/qv4object.cpp @@ -1231,10 +1231,10 @@ void Object::markArrayObjects() const } } -void ArrayObject::init(ExecutionContext *context) +void ArrayObject::init(ExecutionEngine *engine) { type = Type_ArrayObject; - internalClass = context->engine->arrayClass; + internalClass = engine->arrayClass; memberData = new Property[4]; memberData[LengthPropertyIndex].value = Value::fromInt32(0); diff --git a/src/qml/qml/v4/qv4object_p.h b/src/qml/qml/v4/qv4object_p.h index 675c149..e7e7818 100644 --- a/src/qml/qml/v4/qv4object_p.h +++ b/src/qml/qml/v4/qv4object_p.h @@ -388,8 +388,8 @@ struct ArrayObject: Object { LengthPropertyIndex = 0 }; - ArrayObject(ExecutionContext *ctx) : Object(ctx->engine) { init(ctx); } - void init(ExecutionContext *context); + ArrayObject(ExecutionEngine *engine) : Object(engine) { init(engine); } + void init(ExecutionEngine *engine); }; inline uint Object::arrayLength() const diff --git a/src/qml/qml/v4/qv4objectproto.cpp b/src/qml/qml/v4/qv4objectproto.cpp index 01e14cf..5787421 100644 --- a/src/qml/qml/v4/qv4objectproto.cpp +++ b/src/qml/qml/v4/qv4objectproto.cpp @@ -156,7 +156,7 @@ Value ObjectPrototype::method_getOwnPropertyNames(SimpleCallContext *context) if (!O) context->throwTypeError(); - ArrayObject *array = context->engine->newArrayObject(context)->asArrayObject(); + ArrayObject *array = context->engine->newArrayObject(); ObjectIterator it(O, ObjectIterator::NoFlags); while (1) { Value v = it.nextPropertyNameAsString(); @@ -354,7 +354,7 @@ Value ObjectPrototype::method_keys(SimpleCallContext *ctx) Object *o = ctx->argument(0).objectValue(); - ArrayObject *a = ctx->engine->newArrayObject(ctx); + ArrayObject *a = ctx->engine->newArrayObject(); ObjectIterator it(o, ObjectIterator::EnumberableOnly); while (1) { diff --git a/src/qml/qml/v4/qv4regexpobject.cpp b/src/qml/qml/v4/qv4regexpobject.cpp index 622c46e..6183315 100644 --- a/src/qml/qml/v4/qv4regexpobject.cpp +++ b/src/qml/qml/v4/qv4regexpobject.cpp @@ -200,7 +200,7 @@ Value RegExpPrototype::method_exec(SimpleCallContext *ctx) } // fill in result data - ArrayObject *array = ctx->engine->newArrayObject(ctx)->asArrayObject(); + ArrayObject *array = ctx->engine->newArrayObject(); for (int i = 0; i < r->value->captureCount(); ++i) { int start = matchOffsets[i * 2]; int end = matchOffsets[i * 2 + 1]; diff --git a/src/qml/qml/v4/qv4runtime.cpp b/src/qml/qml/v4/qv4runtime.cpp index b510d4c..b7a2fb4 100644 --- a/src/qml/qml/v4/qv4runtime.cpp +++ b/src/qml/qml/v4/qv4runtime.cpp @@ -1229,7 +1229,7 @@ void __qmljs_builtin_define_property(ExecutionContext *ctx, const Value &object, void __qmljs_builtin_define_array(ExecutionContext *ctx, Value *array, Value *values, uint length) { - ArrayObject *a = ctx->engine->newArrayObject(ctx); + ArrayObject *a = ctx->engine->newArrayObject(); // ### FIXME: We need to allocate the array data to avoid crashes other places // This should rather be done when required diff --git a/src/qml/qml/v4/qv4stringobject.cpp b/src/qml/qml/v4/qv4stringobject.cpp index 53a0fcf..faa778f 100644 --- a/src/qml/qml/v4/qv4stringobject.cpp +++ b/src/qml/qml/v4/qv4stringobject.cpp @@ -324,7 +324,7 @@ Value StringPrototype::method_match(SimpleCallContext *context) String *lastIndex = context->engine->newString(QStringLiteral("lastIndex")); rx->put(context, lastIndex, Value::fromInt32(0)); - ArrayObject *a = context->engine->newArrayObject(context); + ArrayObject *a = context->engine->newArrayObject(); double previousLastIndex = 0; uint n = 0; @@ -542,7 +542,7 @@ Value StringPrototype::method_split(SimpleCallContext *ctx) Value separatorValue = ctx->argumentCount > 0 ? ctx->argument(0) : Value::undefinedValue(); Value limitValue = ctx->argumentCount > 1 ? ctx->argument(1) : Value::undefinedValue(); - ArrayObject* array = ctx->engine->newArrayObject(ctx); + ArrayObject* array = ctx->engine->newArrayObject(); Value result = Value::fromObject(array); if (separatorValue.isUndefined()) { diff --git a/src/qml/qml/v4/qv4v8.cpp b/src/qml/qml/v4/qv4v8.cpp index b476f39..914fd12 100644 --- a/src/qml/qml/v4/qv4v8.cpp +++ b/src/qml/qml/v4/qv4v8.cpp @@ -943,7 +943,7 @@ Local Object::GetPropertyNames() QV4::Object *o = ConstValuePtr(this)->asObject(); assert(o); - QV4::ArrayObject *array = currentEngine()->newArrayObject(currentEngine()->current)->asArrayObject(); + QV4::ArrayObject *array = currentEngine()->newArrayObject(); ObjectIterator it(o, ObjectIterator::WithProtoChain|ObjectIterator::EnumberableOnly); while (1) { QV4::Value v = it.nextPropertyNameAsString(); @@ -959,7 +959,7 @@ Local Object::GetOwnPropertyNames() QV4::Object *o = ConstValuePtr(this)->asObject(); assert(o); QV4::Value arg = QV4::Value::fromObject(o); - ArrayObject *array = currentEngine()->newArrayObject(currentEngine()->current)->asArrayObject(); + ArrayObject *array = currentEngine()->newArrayObject(); ObjectIterator it(o, ObjectIterator::EnumberableOnly); while (1) { QV4::Value v = it.nextPropertyNameAsString(); @@ -1115,7 +1115,7 @@ Local Array::New(int length) { if (length < 0) length = 0; - QV4::ArrayObject *a = currentEngine()->newArrayObject(currentEngine()->current); + QV4::ArrayObject *a = currentEngine()->newArrayObject(); if (length < 0x1000) a->arrayReserve(length); diff --git a/src/qml/qml/v8/qjsconverter_impl_p.h b/src/qml/qml/v8/qjsconverter_impl_p.h index 16bd330..99a34cc 100644 --- a/src/qml/qml/v8/qjsconverter_impl_p.h +++ b/src/qml/qml/v8/qjsconverter_impl_p.h @@ -126,7 +126,7 @@ QV4::RegExpObject *QJSConverter::toRegExp(const QRegExp &re) QV4::Value QJSConverter::toStringList(const QStringList &list) { QV4::ExecutionEngine *e = v8::Isolate::GetCurrent()->GetEngine(); - QV4::ArrayObject *a = e->newArrayObject(e->current); + QV4::ArrayObject *a = e->newArrayObject(); int len = list.count(); a->arrayReserve(len); for (int ii = 0; ii < len; ++ii) diff --git a/src/qml/qml/v8/qjsengine.cpp b/src/qml/qml/v8/qjsengine.cpp index b842e05..c2fd45a 100644 --- a/src/qml/qml/v8/qjsengine.cpp +++ b/src/qml/qml/v8/qjsengine.cpp @@ -291,8 +291,10 @@ QJSValue QJSEngine::newObject() */ QJSValue QJSEngine::newArray(uint length) { - QV4::ArrayObject *array = d->m_v4Engine->newArrayObject(d->m_v4Engine->current); + QV4::ArrayObject *array = d->m_v4Engine->newArrayObject(); array->setArrayLength(length); + for (uint i = 0; i < length; ++i) + array->arrayData[i].value = QV4::Value::undefinedValue(); return new QJSValuePrivate(d->m_v4Engine, array); } diff --git a/src/qml/qml/v8/qv4jsonwrapper.cpp b/src/qml/qml/v8/qv4jsonwrapper.cpp index 01cc194..7aee1fd 100644 --- a/src/qml/qml/v8/qv4jsonwrapper.cpp +++ b/src/qml/qml/v8/qv4jsonwrapper.cpp @@ -149,7 +149,7 @@ QJsonObject QV4JsonWrapper::toJsonObject(QV4::Object *o, V4ObjectSet &visitedObj QV4::Value QV4JsonWrapper::fromJsonArray(const QJsonArray &array) { int size = array.size(); - ArrayObject *a = m_engine->newArrayObject(m_engine->current); + ArrayObject *a = m_engine->newArrayObject(); a->arrayReserve(size); for (int i = 0; i < size; i++) a->arrayData[i].value = fromJsonValue(array.at(i)); diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index c5f022e..e452d98 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -284,7 +284,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) static QV4::Value arrayFromStringList(QV8Engine *engine, const QStringList &list) { QV4::ExecutionEngine *e = QV8Engine::getV4(engine); - QV4::ArrayObject *a = e->newArrayObject(e->current); + QV4::ArrayObject *a = e->newArrayObject(); int len = list.count(); a->arrayReserve(len); for (int ii = 0; ii < len; ++ii) @@ -296,7 +296,7 @@ static QV4::Value arrayFromStringList(QV8Engine *engine, const QStringList &list static QV4::Value arrayFromVariantList(QV8Engine *engine, const QVariantList &list) { QV4::ExecutionEngine *e = QV8Engine::getV4(engine); - QV4::ArrayObject *a = e->newArrayObject(e->current); + QV4::ArrayObject *a = e->newArrayObject(); int len = list.count(); a->arrayReserve(len); for (int ii = 0; ii < len; ++ii) @@ -485,7 +485,7 @@ const QStringHash &QV8Engine::illegalNames() const QV4::Value QV8Engine::getOwnPropertyNames(const QV4::Value &o) { if (!o.asObject()) - return QV4::Value::fromObject(m_v4Engine->newArrayObject(m_v4Engine->current)); + return QV4::Value::fromObject(m_v4Engine->newArrayObject()); QV4::SimpleCallContext ctx; QV4::Value args = o; ctx.arguments = &args; @@ -913,7 +913,7 @@ QV4::Value QV8Engine::global() // elements converted to JS, recursively. QV4::Value QV8Engine::variantListToJS(const QVariantList &lst) { - QV4::ArrayObject *a = m_v4Engine->newArrayObject(m_v4Engine->current); + QV4::ArrayObject *a = m_v4Engine->newArrayObject(); a->arrayReserve(lst.size()); for (int i = 0; i < lst.size(); i++) a->arrayData[i].value = variantToJS(lst.at(i)); -- 2.7.4