aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4context.cpp4
-rw-r--r--src/qml/jsruntime/qv4dateobject.cpp20
-rw-r--r--src/qml/jsruntime/qv4errorobject.cpp24
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4globalobject.cpp16
-rw-r--r--src/qml/jsruntime/qv4jsonobject.cpp10
-rw-r--r--src/qml/jsruntime/qv4numberobject.cpp12
-rw-r--r--src/qml/jsruntime/qv4objectproto.cpp6
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp4
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp2
-rw-r--r--src/qml/jsruntime/qv4scopedvalue_p.h13
-rw-r--r--src/qml/jsruntime/qv4sequenceobject.cpp8
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp50
-rw-r--r--src/qml/jsruntime/qv4value.cpp10
-rw-r--r--src/qml/jsruntime/qv4value_def_p.h7
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;