diff options
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4context.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4dateobject.cpp | 20 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject.cpp | 24 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4globalobject.cpp | 16 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4jsonobject.cpp | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4regexpobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4scopedvalue_p.h | 13 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4sequenceobject.cpp | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4stringobject.cpp | 50 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4value.cpp | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4value_def_p.h | 7 |
16 files changed, 102 insertions, 90 deletions
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index d8990bf8be..aa0688ee9b 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -604,7 +604,7 @@ void ExecutionContext::throwError(const ValueRef value) void ExecutionContext::throwError(const QString &message) { Scope scope(this); - ScopedValue v(scope, Value::fromString(this, message)); + ScopedValue v(scope, engine->newString(message)); v = engine->newErrorObject(v); throwError(v); } @@ -640,7 +640,7 @@ void ExecutionContext::throwTypeError(const QString &message) void ExecutionContext::throwUnimplemented(const QString &message) { Scope scope(this); - ScopedValue v(scope, Value::fromString(this, QStringLiteral("Unimplemented ") + message)); + ScopedValue v(scope, engine->newString(QStringLiteral("Unimplemented ") + message)); v = engine->newErrorObject(v); throwError(v); } diff --git a/src/qml/jsruntime/qv4dateobject.cpp b/src/qml/jsruntime/qv4dateobject.cpp index d18f3eb681..cb5c37d421 100644 --- a/src/qml/jsruntime/qv4dateobject.cpp +++ b/src/qml/jsruntime/qv4dateobject.cpp @@ -698,7 +698,7 @@ ReturnedValue DateCtor::construct(Managed *m, CallData *callData) ReturnedValue DateCtor::call(Managed *m, CallData *) { double t = currentTime(); - return Value::fromString(m->engine()->current, ToString(t)).asReturnedValue(); + return m->engine()->newString(ToString(t))->asReturnedValue(); } void DatePrototype::init(ExecutionEngine *engine, const Value &ctor) @@ -807,37 +807,37 @@ ReturnedValue DatePrototype::method_now(SimpleCallContext *ctx) ReturnedValue DatePrototype::method_toString(SimpleCallContext *ctx) { double t = getThisDate(ctx); - return Value::fromString(ctx, ToString(t)).asReturnedValue(); + return ctx->engine->newString(ToString(t))->asReturnedValue(); } ReturnedValue DatePrototype::method_toDateString(SimpleCallContext *ctx) { double t = getThisDate(ctx); - return Value::fromString(ctx, ToDateString(t)).asReturnedValue(); + return ctx->engine->newString(ToDateString(t))->asReturnedValue(); } ReturnedValue DatePrototype::method_toTimeString(SimpleCallContext *ctx) { double t = getThisDate(ctx); - return Value::fromString(ctx, ToTimeString(t)).asReturnedValue(); + return ctx->engine->newString(ToTimeString(t))->asReturnedValue(); } ReturnedValue DatePrototype::method_toLocaleString(SimpleCallContext *ctx) { double t = getThisDate(ctx); - return Value::fromString(ctx, ToLocaleString(t)).asReturnedValue(); + return ctx->engine->newString(ToLocaleString(t))->asReturnedValue(); } ReturnedValue DatePrototype::method_toLocaleDateString(SimpleCallContext *ctx) { double t = getThisDate(ctx); - return Value::fromString(ctx, ToLocaleDateString(t)).asReturnedValue(); + return ctx->engine->newString(ToLocaleDateString(t))->asReturnedValue(); } ReturnedValue DatePrototype::method_toLocaleTimeString(SimpleCallContext *ctx) { double t = getThisDate(ctx); - return Value::fromString(ctx, ToLocaleTimeString(t)).asReturnedValue(); + return ctx->engine->newString(ToLocaleTimeString(t))->asReturnedValue(); } ReturnedValue DatePrototype::method_valueOf(SimpleCallContext *ctx) @@ -1242,7 +1242,7 @@ ReturnedValue DatePrototype::method_toUTCString(SimpleCallContext *ctx) ctx->throwTypeError(); double t = self->value.asDouble(); - return Value::fromString(ctx, ToUTCString(t)).asReturnedValue(); + return ctx->engine->newString(ToUTCString(t))->asReturnedValue(); } static void addZeroPrefixedInt(QString &str, int num, int nDigits) @@ -1272,7 +1272,7 @@ ReturnedValue DatePrototype::method_toISOString(SimpleCallContext *ctx) int year = (int)YearFromTime(t); if (year < 0 || year > 9999) { if (qAbs(year) >= 1000000) - return Value::fromString(ctx, QStringLiteral("Invalid Date")).asReturnedValue(); + return ctx->engine->newString(QStringLiteral("Invalid Date"))->asReturnedValue(); result += year < 0 ? '-' : '+'; year = qAbs(year); addZeroPrefixedInt(result, year, 6); @@ -1293,7 +1293,7 @@ ReturnedValue DatePrototype::method_toISOString(SimpleCallContext *ctx) addZeroPrefixedInt(result, msFromTime(t), 3); result += 'Z'; - return Value::fromString(ctx, result).asReturnedValue(); + return ctx->engine->newString(result)->asReturnedValue(); } ReturnedValue DatePrototype::method_toJSON(SimpleCallContext *ctx) diff --git a/src/qml/jsruntime/qv4errorobject.cpp b/src/qml/jsruntime/qv4errorobject.cpp index 21917a94f0..88c47a0c3a 100644 --- a/src/qml/jsruntime/qv4errorobject.cpp +++ b/src/qml/jsruntime/qv4errorobject.cpp @@ -82,7 +82,8 @@ ErrorObject::ErrorObject(InternalClass *ic) Scope scope(engine()); ScopedValue protectThis(scope, this); - defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, "Error")); + ScopedString s(scope, ic->engine->newString("Error")); + defineDefaultProperty(QStringLiteral("name"), s.asValue()); } ErrorObject::ErrorObject(InternalClass *ic, const ValueRef message, ErrorType t) @@ -100,11 +101,12 @@ ErrorObject::ErrorObject(InternalClass *ic, const ValueRef message, ErrorType t) if (!message->isUndefined()) defineDefaultProperty(QStringLiteral("message"), *message); - defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, className())); + ScopedString s(scope); + defineDefaultProperty(QStringLiteral("name"), (s = ic->engine->newString(className())).asValue()); stackTrace = ic->engine->stackTrace(); if (!stackTrace.isEmpty()) { - defineDefaultProperty(QStringLiteral("fileName"), Value::fromString(ic->engine, stackTrace.at(0).source)); + defineDefaultProperty(QStringLiteral("fileName"), (s = ic->engine->newString(stackTrace.at(0).source)).asValue()); defineDefaultProperty(QStringLiteral("lineNumber"), Primitive::fromInt32(stackTrace.at(0).line)); } } @@ -119,16 +121,17 @@ ErrorObject::ErrorObject(InternalClass *ic, const QString &message, ErrorObject: Scope scope(engine()); ScopedValue protectThis(scope, this); + ScopedString s(scope); defineAccessorProperty(QStringLiteral("stack"), ErrorObject::method_get_stack, 0); ScopedValue v(scope, ic->engine->newString(message)); defineDefaultProperty(QStringLiteral("message"), v); - defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, className())); + defineDefaultProperty(QStringLiteral("name"), (s = ic->engine->newString(className())).asValue()); stackTrace = ic->engine->stackTrace(); if (!stackTrace.isEmpty()) { - defineDefaultProperty(QStringLiteral("fileName"), Value::fromString(ic->engine, stackTrace.at(0).source)); + defineDefaultProperty(QStringLiteral("fileName"), (s = ic->engine->newString(stackTrace.at(0).source)).asValue()); defineDefaultProperty(QStringLiteral("lineNumber"), Primitive::fromInt32(stackTrace.at(0).line)); } } @@ -143,9 +146,10 @@ ErrorObject::ErrorObject(InternalClass *ic, const QString &message, const QStrin Scope scope(engine()); ScopedValue protectThis(scope, this); + ScopedString s(scope); defineAccessorProperty(QStringLiteral("stack"), ErrorObject::method_get_stack, 0); - defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, className())); + defineDefaultProperty(QStringLiteral("name"), (s = ic->engine->newString(className())).asValue()); stackTrace = ic->engine->stackTrace(); ExecutionEngine::StackFrame frame; @@ -155,7 +159,7 @@ ErrorObject::ErrorObject(InternalClass *ic, const QString &message, const QStrin stackTrace.prepend(frame); if (!stackTrace.isEmpty()) { - defineDefaultProperty(QStringLiteral("fileName"), Value::fromString(ic->engine, stackTrace.at(0).source)); + defineDefaultProperty(QStringLiteral("fileName"), (s = ic->engine->newString(stackTrace.at(0).source)).asValue()); defineDefaultProperty(QStringLiteral("lineNumber"), Primitive::fromInt32(stackTrace.at(0).line)); } @@ -368,11 +372,13 @@ ReturnedValue URIErrorCtor::construct(Managed *m, CallData *callData) void ErrorPrototype::init(ExecutionEngine *engine, const Value &ctor, Object *obj) { + Scope scope(engine); + ScopedString s(scope); ctor.objectValue()->defineReadonlyProperty(engine->id_prototype, Value::fromObject(obj)); ctor.objectValue()->defineReadonlyProperty(engine->id_length, Primitive::fromInt32(1)); obj->defineDefaultProperty(QStringLiteral("constructor"), ctor); obj->defineDefaultProperty(engine->id_toString, method_toString, 0); - obj->defineDefaultProperty(QStringLiteral("message"), Value::fromString(engine, QString())); + obj->defineDefaultProperty(QStringLiteral("message"), (s = engine->newString(QString())).asValue()); } ReturnedValue ErrorPrototype::method_toString(SimpleCallContext *ctx) @@ -405,5 +411,5 @@ ReturnedValue ErrorPrototype::method_toString(SimpleCallContext *ctx) str = qname + QLatin1String(": ") + qmessage; } - return Value::fromString(ctx, str).asReturnedValue(); + return ctx->engine->newString(str)->asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index fbc5c10e3c..888be1733e 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -313,7 +313,7 @@ ReturnedValue FunctionPrototype::method_toString(SimpleCallContext *ctx) if (!fun) ctx->throwTypeError(); - return Value::fromString(ctx, QStringLiteral("function() { [code] }")).asReturnedValue(); + return ctx->engine->newString(QStringLiteral("function() { [code] }"))->asReturnedValue(); } ReturnedValue FunctionPrototype::method_apply(SimpleCallContext *ctx) diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp index 4cb351eeb0..856b85cc1c 100644 --- a/src/qml/jsruntime/qv4globalobject.cpp +++ b/src/qml/jsruntime/qv4globalobject.cpp @@ -605,7 +605,7 @@ ReturnedValue GlobalFunctions::method_decodeURI(SimpleCallContext *context) context->throwURIError(s); } - return Value::fromString(context, out).asReturnedValue(); + return context->engine->newString(out)->asReturnedValue(); } /// decodeURIComponent [15.1.3.2] @@ -623,7 +623,7 @@ ReturnedValue GlobalFunctions::method_decodeURIComponent(SimpleCallContext *cont context->throwURIError(s); } - return Value::fromString(context, out).asReturnedValue(); + return context->engine->newString(out)->asReturnedValue(); } /// encodeURI [15.1.3.3] @@ -641,7 +641,7 @@ ReturnedValue GlobalFunctions::method_encodeURI(SimpleCallContext *context) context->throwURIError(s); } - return Value::fromString(context, out).asReturnedValue(); + return context->engine->newString(out)->asReturnedValue(); } /// encodeURIComponent [15.1.3.4] @@ -659,23 +659,23 @@ ReturnedValue GlobalFunctions::method_encodeURIComponent(SimpleCallContext *cont context->throwURIError(s); } - return Value::fromString(context, out).asReturnedValue(); + return context->engine->newString(out)->asReturnedValue(); } ReturnedValue GlobalFunctions::method_escape(SimpleCallContext *context) { if (!context->callData->argc) - return Value::fromString(context, QStringLiteral("undefined")).asReturnedValue(); + return context->engine->newString(QStringLiteral("undefined"))->asReturnedValue(); QString str = context->callData->args[0].toString(context)->toQString(); - return Value::fromString(context, escape(str)).asReturnedValue(); + return context->engine->newString(escape(str))->asReturnedValue(); } ReturnedValue GlobalFunctions::method_unescape(SimpleCallContext *context) { if (!context->callData->argc) - return Value::fromString(context, QStringLiteral("undefined")).asReturnedValue(); + return context->engine->newString(QStringLiteral("undefined"))->asReturnedValue(); QString str = context->callData->args[0].toString(context)->toQString(); - return Value::fromString(context, unescape(str)).asReturnedValue(); + return context->engine->newString(unescape(str))->asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4jsonobject.cpp b/src/qml/jsruntime/qv4jsonobject.cpp index b6429278c2..53bdb6d630 100644 --- a/src/qml/jsruntime/qv4jsonobject.cpp +++ b/src/qml/jsruntime/qv4jsonobject.cpp @@ -400,7 +400,7 @@ bool JsonParser::parseValue(ValueRef val) return false; DEBUG << "value: string"; END; - *val = Value::fromString(context, value); + val = context->engine->newString(value); return true; } case BeginArray: { @@ -709,7 +709,7 @@ QString Stringify::Str(const QString &key, Value value) if (!!toJSON) { ScopedCallData callData(scope, 1); callData->thisObject = value; - callData->args[0] = Value::fromString(ctx, key); + callData->args[0] = ctx->engine->newString(key); value = Value::fromReturnedValue(toJSON->call(callData)); } } @@ -719,7 +719,7 @@ QString Stringify::Str(const QString &key, Value value) ScopedValue v(scope, value); holder->put(ctx, QString(), v); ScopedCallData callData(scope, 2); - callData->args[0] = Value::fromString(ctx, key); + callData->args[0] = ctx->engine->newString(key); callData->args[1] = value; callData->thisObject = holder; value = Value::fromReturnedValue(replacerFunction->call(callData)); @@ -940,7 +940,7 @@ ReturnedValue JsonObject::method_stringify(SimpleCallContext *ctx) QString result = stringify.Str(QString(), arg0); if (result.isEmpty()) return Encode::undefined(); - return Value::fromString(ctx, result).asReturnedValue(); + return ctx->engine->newString(result)->asReturnedValue(); } @@ -948,7 +948,7 @@ ReturnedValue JsonObject::method_stringify(SimpleCallContext *ctx) ReturnedValue JsonObject::fromJsonValue(ExecutionEngine *engine, const QJsonValue &value) { if (value.isString()) - return Value::fromString(engine->current, value.toString()).asReturnedValue(); + return engine->current->engine->newString(value.toString())->asReturnedValue(); else if (value.isDouble()) return Encode(value.toDouble()); else if (value.isBool()) diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp index 9bf0d506f4..38cf899427 100644 --- a/src/qml/jsruntime/qv4numberobject.cpp +++ b/src/qml/jsruntime/qv4numberobject.cpp @@ -121,9 +121,9 @@ ReturnedValue NumberPrototype::method_toString(SimpleCallContext *ctx) } if (std::isnan(num)) { - return Value::fromString(ctx, QStringLiteral("NaN")).asReturnedValue(); + return ctx->engine->newString(QStringLiteral("NaN"))->asReturnedValue(); } else if (qIsInf(num)) { - return Value::fromString(ctx, QLatin1String(num < 0 ? "-Infinity" : "Infinity")).asReturnedValue(); + return ctx->engine->newString(QLatin1String(num < 0 ? "-Infinity" : "Infinity"))->asReturnedValue(); } if (radix != 10) { @@ -153,7 +153,7 @@ ReturnedValue NumberPrototype::method_toString(SimpleCallContext *ctx) } if (negative) str.prepend(QLatin1Char('-')); - return Value::fromString(ctx, str).asReturnedValue(); + return ctx->engine->newString(str)->asReturnedValue(); } } @@ -198,7 +198,7 @@ ReturnedValue NumberPrototype::method_toFixed(SimpleCallContext *ctx) str = QString::number(v, 'f', int (fdigits)); else return __qmljs_string_from_number(ctx, v)->asReturnedValue(); - return Value::fromString(ctx, str).asReturnedValue(); + return ctx->engine->newString(str)->asReturnedValue(); } ReturnedValue NumberPrototype::method_toExponential(SimpleCallContext *ctx) @@ -221,7 +221,7 @@ ReturnedValue NumberPrototype::method_toExponential(SimpleCallContext *ctx) double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToExponential(d, fdigits, &builder); QString result = QString::fromLatin1(builder.Finalize()); - return Value::fromString(ctx, result).asReturnedValue(); + return ctx->engine->newString(result)->asReturnedValue(); } ReturnedValue NumberPrototype::method_toPrecision(SimpleCallContext *ctx) @@ -244,5 +244,5 @@ ReturnedValue NumberPrototype::method_toPrecision(SimpleCallContext *ctx) double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToPrecision(v->asDouble(), precision, &builder); QString result = QString::fromLatin1(builder.Finalize()); - return Value::fromString(ctx, result).asReturnedValue(); + return ctx->engine->newString(result)->asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index fb47c4a15e..49bee363a3 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -388,13 +388,13 @@ ReturnedValue ObjectPrototype::method_toString(SimpleCallContext *ctx) { Scope scope(ctx); if (ctx->callData->thisObject.isUndefined()) { - return Value::fromString(ctx, QStringLiteral("[object Undefined]")).asReturnedValue(); + return ctx->engine->newString(QStringLiteral("[object Undefined]"))->asReturnedValue(); } else if (ctx->callData->thisObject.isNull()) { - return Value::fromString(ctx, QStringLiteral("[object Null]")).asReturnedValue(); + return ctx->engine->newString(QStringLiteral("[object Null]"))->asReturnedValue(); } else { ScopedObject obj(scope, __qmljs_to_object(ctx, ValueRef(&ctx->callData->thisObject))); QString className = obj->className(); - return Value::fromString(ctx, QString::fromUtf8("[object %1]").arg(className)).asReturnedValue(); + return ctx->engine->newString(QString::fromUtf8("[object %1]").arg(className))->asReturnedValue(); } } diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 6870cd693c..c206826cbc 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -170,7 +170,7 @@ static QV4::ReturnedValue LoadProperty(QV8Engine *engine, QObject *object, } else if (property.propType == QMetaType::QString) { QString v; ReadFunction(object, property, &v, notifier); - return Value::fromString(v4, v).asReturnedValue(); + return v4->newString(v)->asReturnedValue(); } else if (property.propType == QMetaType::UInt) { uint v = 0; ReadFunction(object, property, &v, notifier); @@ -1680,7 +1680,7 @@ QV4::ReturnedValue QObjectMethod::method_toString(QV4::ExecutionContext *ctx) result = QLatin1String("null"); } - return QV4::Value::fromString(ctx, result).asReturnedValue(); + return ctx->engine->newString(result)->asReturnedValue(); } QV4::ReturnedValue QObjectMethod::method_destroy(QV4::ExecutionContext *ctx, const Value *args, int argc) diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp index b3dec63d53..126188fcb7 100644 --- a/src/qml/jsruntime/qv4regexpobject.cpp +++ b/src/qml/jsruntime/qv4regexpobject.cpp @@ -332,7 +332,7 @@ ReturnedValue RegExpPrototype::method_exec(SimpleCallContext *ctx) for (int i = 0; i < len; ++i) { int start = matchOffsets[i * 2]; int end = matchOffsets[i * 2 + 1]; - array->arrayData[i].value = (start != -1 && end != -1) ? Value::fromString(ctx, s.mid(start, end - start)) : Primitive::undefinedValue(); + array->arrayData[i].value = (start != -1 && end != -1) ? ctx->engine->newString(s.mid(start, end - start))->asReturnedValue() : Encode::undefined(); array->arrayDataLen = i + 1; } array->setArrayLengthUnchecked(len); @@ -360,7 +360,7 @@ ReturnedValue RegExpPrototype::method_toString(SimpleCallContext *ctx) if (!r) ctx->throwTypeError(); - return Value::fromString(ctx, r->toString()).asReturnedValue(); + return ctx->engine->newString(r->toString())->asReturnedValue(); } ReturnedValue RegExpPrototype::method_compile(SimpleCallContext *ctx) diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 0d7be34e74..8d1171a18b 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -677,7 +677,7 @@ ReturnedValue __qmljs_get_element(ExecutionContext *ctx, const ValueRef object, return Primitive::undefinedValue().asReturnedValue(); } const QString s = str->toQString().mid(idx, 1); - return Value::fromString(ctx, s).asReturnedValue(); + return scope.engine->newString(s)->asReturnedValue(); } } diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index 775225a83b..b629c2fa54 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -406,6 +406,11 @@ struct ValueRef { ptr->val = v; return *this; } + template <typename T> + ValueRef &operator=(Returned<T> *v) { + ptr->val = v->asReturnedValue(); + return *this; + } operator const Value *() const { return ptr; @@ -583,6 +588,14 @@ private: Encode(void *); }; + +template <typename T> +inline Value &Value::operator=(Returned<T> *t) +{ + val = t->getPointer()->asReturnedValue(); + return *this; +} + inline SafeValue &SafeValue::operator =(const ScopedValue &v) { val = v.ptr->val; diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index 4ec5644352..f864d4dabf 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -81,7 +81,9 @@ static void generateWarning(QV4::ExecutionContext *ctx, const QString& descripti static QV4::Value convertElementToValue(QV4::ExecutionEngine *engine, const QString &element) { - return QV4::Value::fromString(engine, element); + QV4::Value v; + v = engine->newString(element)->asReturnedValue(); + return v; } static QV4::Value convertElementToValue(QV4::ExecutionEngine *, int element) @@ -91,7 +93,9 @@ static QV4::Value convertElementToValue(QV4::ExecutionEngine *, int element) static QV4::Value convertElementToValue(QV4::ExecutionEngine *engine, const QUrl &element) { - return QV4::Value::fromString(engine, element.toString()); + QV4::Value v; + v = engine->newString(element.toString())->asReturnedValue(); + return v; } static QV4::Value convertElementToValue(QV4::ExecutionEngine *, qreal element) diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp index af6e92105f..adff8e3978 100644 --- a/src/qml/jsruntime/qv4stringobject.cpp +++ b/src/qml/jsruntime/qv4stringobject.cpp @@ -78,10 +78,11 @@ using namespace QV4; DEFINE_MANAGED_VTABLE(StringObject); StringObject::StringObject(InternalClass *ic) - : Object(ic), value(Value::fromString(ic->engine, "")) + : Object(ic) { vtbl = &static_vtbl; type = Type_StringObject; + value = ic->engine->newString("")->asReturnedValue(); tmpProperty.value = Primitive::undefinedValue(); @@ -171,7 +172,7 @@ ReturnedValue StringCtor::construct(Managed *m, CallData *callData) if (callData->argc) value = callData->args[0].toString(v4->current); else - value = Value::fromString(v4->current, QString()); + value = v4->newString(QString()); return Encode(v4->newStringObject(value)); } @@ -183,7 +184,7 @@ ReturnedValue StringCtor::call(Managed *m, CallData *callData) if (callData->argc) value = callData->args[0].toString(v4->current); else - value = Value::fromString(v4->current, QString()); + value = v4->newString(QString()); return value.asReturnedValue(); } @@ -252,7 +253,7 @@ ReturnedValue StringPrototype::method_charAt(SimpleCallContext *context) if (pos >= 0 && pos < str.length()) result += str.at(pos); - return Value::fromString(context, result).asReturnedValue(); + return context->engine->newString(result)->asReturnedValue(); } ReturnedValue StringPrototype::method_charCodeAt(SimpleCallContext *context) @@ -283,7 +284,7 @@ ReturnedValue StringPrototype::method_concat(SimpleCallContext *context) value += v->stringValue()->toQString(); } - return Value::fromString(context, value).asReturnedValue(); + return context->engine->newString(value)->asReturnedValue(); } ReturnedValue StringPrototype::method_indexOf(SimpleCallContext *context) @@ -513,21 +514,22 @@ ReturnedValue StringPrototype::method_replace(SimpleCallContext *ctx) ScopedCallData callData(scope, numCaptures + 2); callData->thisObject = Primitive::undefinedValue(); int lastEnd = 0; + ScopedValue entry(scope); for (int i = 0; i < numStringMatches; ++i) { for (int k = 0; k < numCaptures; ++k) { int idx = (i * numCaptures + k) * 2; uint start = matchOffsets[idx]; uint end = matchOffsets[idx + 1]; - Value entry = Primitive::undefinedValue(); + entry = Primitive::undefinedValue(); if (start != JSC::Yarr::offsetNoMatch && end != JSC::Yarr::offsetNoMatch) - entry = Value::fromString(ctx, string.mid(start, end - start)); + entry = ctx->engine->newString(string.mid(start, end - start)); callData->args[k] = entry; } uint matchStart = matchOffsets[i * numCaptures * 2]; Q_ASSERT(matchStart >= lastEnd); uint matchEnd = matchOffsets[i * numCaptures * 2 + 1]; callData->args[numCaptures] = Primitive::fromUInt32(matchStart); - callData->args[numCaptures + 1] = Value::fromString(ctx, string); + callData->args[numCaptures + 1] = ctx->engine->newString(string); replacement = searchCallback->call(callData); result += string.midRef(lastEnd, matchStart - lastEnd); @@ -557,7 +559,7 @@ ReturnedValue StringPrototype::method_replace(SimpleCallContext *ctx) if (matchOffsets != _matchOffsets) free(matchOffsets); - return Value::fromString(ctx, result).asReturnedValue(); + return ctx->engine->newString(result)->asReturnedValue(); } ReturnedValue StringPrototype::method_search(SimpleCallContext *ctx) @@ -604,7 +606,7 @@ ReturnedValue StringPrototype::method_slice(SimpleCallContext *ctx) const int intEnd = int(end); int count = qMax(0, intEnd - intStart); - return Value::fromString(ctx, text.mid(intStart, count)).asReturnedValue(); + return ctx->engine->newString(text.mid(intStart, count))->asReturnedValue(); } ReturnedValue StringPrototype::method_split(SimpleCallContext *ctx) @@ -623,7 +625,7 @@ ReturnedValue StringPrototype::method_split(SimpleCallContext *ctx) array->push_back(s); return array.asReturnedValue(); } - return Value::fromString(ctx, text.left(limitValue->toInteger())).asReturnedValue(); + return ctx->engine->newString(text.left(limitValue->toInteger()))->asReturnedValue(); } uint limit = limitValue->isUndefined() ? UINT_MAX : limitValue->toUInt32(); @@ -635,7 +637,7 @@ ReturnedValue StringPrototype::method_split(SimpleCallContext *ctx) if (re) { if (re->value->pattern().isEmpty()) { re = (RegExpObject *)0; - separatorValue = Value::fromString(ctx, QString()); + separatorValue = ctx->engine->newString(QString()); } } @@ -648,7 +650,7 @@ ReturnedValue StringPrototype::method_split(SimpleCallContext *ctx) if (result == JSC::Yarr::offsetNoMatch) break; - array->push_back((s = Value::fromString(ctx, text.mid(offset, matchOffsets[0] - offset)))); + array->push_back((s = ctx->engine->newString(text.mid(offset, matchOffsets[0] - offset)))); offset = qMax(offset + 1, matchOffsets[1]); if (array->arrayLength() >= limit) @@ -657,31 +659,31 @@ ReturnedValue StringPrototype::method_split(SimpleCallContext *ctx) for (int i = 1; i < re->value->captureCount(); ++i) { uint start = matchOffsets[i * 2]; uint end = matchOffsets[i * 2 + 1]; - array->push_back((s = Value::fromString(ctx, text.mid(start, end - start)))); + array->push_back((s = ctx->engine->newString(text.mid(start, end - start)))); if (array->arrayLength() >= limit) break; } } if (array->arrayLength() < limit) - array->push_back((s = Value::fromString(ctx, text.mid(offset)))); + array->push_back((s = ctx->engine->newString(text.mid(offset)))); } else { QString separator = separatorValue->toString(ctx)->toQString(); if (separator.isEmpty()) { for (uint i = 0; i < qMin(limit, uint(text.length())); ++i) - array->push_back((s = Value::fromString(ctx, text.mid(i, 1)))); + array->push_back((s = ctx->engine->newString(text.mid(i, 1)))); return array.asReturnedValue(); } int start = 0; int end; while ((end = text.indexOf(separator, start)) != -1) { - array->push_back((s = Value::fromString(ctx, text.mid(start, end - start)))); + array->push_back((s = ctx->engine->newString(text.mid(start, end - start)))); start = end + separator.size(); if (array->arrayLength() >= limit) break; } if (array->arrayLength() < limit && start != -1) - array->push_back((s = Value::fromString(ctx, text.mid(start)))); + array->push_back((s = ctx->engine->newString(text.mid(start)))); } return array.asReturnedValue(); } @@ -706,7 +708,7 @@ ReturnedValue StringPrototype::method_substr(SimpleCallContext *context) qint32 x = Primitive::toInt32(start); qint32 y = Primitive::toInt32(length); - return Value::fromString(context, value.mid(x, y)).asReturnedValue(); + return context->engine->newString(value.mid(x, y))->asReturnedValue(); } ReturnedValue StringPrototype::method_substring(SimpleCallContext *context) @@ -745,13 +747,13 @@ ReturnedValue StringPrototype::method_substring(SimpleCallContext *context) qint32 x = (int)start; qint32 y = (int)(end - start); - return Value::fromString(context, value.mid(x, y)).asReturnedValue(); + return context->engine->newString(value.mid(x, y))->asReturnedValue(); } ReturnedValue StringPrototype::method_toLowerCase(SimpleCallContext *ctx) { QString value = getThisString(ctx); - return Value::fromString(ctx, value.toLower()).asReturnedValue(); + return ctx->engine->newString(value.toLower())->asReturnedValue(); } ReturnedValue StringPrototype::method_toLocaleLowerCase(SimpleCallContext *ctx) @@ -762,7 +764,7 @@ ReturnedValue StringPrototype::method_toLocaleLowerCase(SimpleCallContext *ctx) ReturnedValue StringPrototype::method_toUpperCase(SimpleCallContext *ctx) { QString value = getThisString(ctx); - return Value::fromString(ctx, value.toUpper()).asReturnedValue(); + return ctx->engine->newString(value.toUpper())->asReturnedValue(); } ReturnedValue StringPrototype::method_toLocaleUpperCase(SimpleCallContext *ctx) @@ -778,7 +780,7 @@ ReturnedValue StringPrototype::method_fromCharCode(SimpleCallContext *context) *ch = QChar(context->callData->args[i].toUInt16()); ++ch; } - return Value::fromString(context, str).asReturnedValue(); + return context->engine->newString(str)->asReturnedValue(); } ReturnedValue StringPrototype::method_trim(SimpleCallContext *ctx) @@ -796,5 +798,5 @@ ReturnedValue StringPrototype::method_trim(SimpleCallContext *ctx) break; } - return Value::fromString(ctx, QString(chars + start, end - start + 1)).asReturnedValue(); + return ctx->engine->newString(QString(chars + start, end - start + 1))->asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4value.cpp b/src/qml/jsruntime/qv4value.cpp index 66e80cfa01..623f9ae3b6 100644 --- a/src/qml/jsruntime/qv4value.cpp +++ b/src/qml/jsruntime/qv4value.cpp @@ -202,16 +202,6 @@ bool Value::sameValue(Value other) const { return false; } -Value Value::fromString(ExecutionContext *ctx, const QString &s) -{ - return fromManaged(ctx->engine->newString(s)->getPointer()); -} - -Value Value::fromString(ExecutionEngine *engine, const QString &s) -{ - return fromManaged(engine->newString(s)->getPointer()); -} - int Primitive::toInt32(double number) { diff --git a/src/qml/jsruntime/qv4value_def_p.h b/src/qml/jsruntime/qv4value_def_p.h index b10a412555..bc73a85e04 100644 --- a/src/qml/jsruntime/qv4value_def_p.h +++ b/src/qml/jsruntime/qv4value_def_p.h @@ -277,11 +277,6 @@ struct Q_QML_EXPORT Value static Value fromObject(Object *o); static Value fromManaged(Managed *o); -#ifndef QMLJS_LLVM_RUNTIME - static Value fromString(ExecutionContext *ctx, const QString &fromString); - static Value fromString(ExecutionEngine *engine, const QString &s); -#endif - int toUInt16() const; int toInt32() const; unsigned int toUInt32() const; @@ -324,6 +319,8 @@ struct Q_QML_EXPORT Value ReturnedValue asReturnedValue() const { return val; } static Value fromReturnedValue(ReturnedValue val) { Value v; v.val = val; return v; } Value &operator=(ReturnedValue v) { val = v; return *this; } + template <typename T> + inline Value &operator=(Returned<T> *t); // Section 9.12 bool sameValue(Value other) const; |