aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4value.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-09-09 14:33:28 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-12 21:52:00 +0200
commita723c7ae756ba567c2f818bb77a83c24373d3438 (patch)
tree0508a1c1526e56a7aa3c4a3055c8a4b65a973b06 /src/qml/jsruntime/qv4value.cpp
parentbf22c55036f6429ccfc849ea71f33e757fae47fa (diff)
Use a ReturnedValue when converting to String or Object
Also rename Value::toQString() to Value::toQStringNoThrow(), and add a throwing toQString() method for JS use. Change-Id: I821b33fc61abb7d08839df965fd337685f61a545 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4value.cpp')
-rw-r--r--src/qml/jsruntime/qv4value.cpp58
1 files changed, 45 insertions, 13 deletions
diff --git a/src/qml/jsruntime/qv4value.cpp b/src/qml/jsruntime/qv4value.cpp
index 718b87d2c9..0347188ae0 100644
--- a/src/qml/jsruntime/qv4value.cpp
+++ b/src/qml/jsruntime/qv4value.cpp
@@ -119,30 +119,29 @@ double Value::toInteger() const
double Value::toNumber() const
{
- QV4::Value v = *this;
-
- redo:
- switch (v.type()) {
+ switch (type()) {
case QV4::Value::Undefined_Type:
return std::numeric_limits<double>::quiet_NaN();
case QV4::Value::Null_Type:
return 0;
case QV4::Value::Boolean_Type:
- return (v.booleanValue() ? 1. : 0.);
+ return (booleanValue() ? 1. : 0.);
case QV4::Value::Integer_Type:
- return v.int_32;
+ return int_32;
case QV4::Value::String_Type:
- return __qmljs_string_to_number(v.toQString());
+ return __qmljs_string_to_number(stringValue()->toQString());
case QV4::Value::Object_Type: {
- v = __qmljs_to_primitive(ValueRef::fromRawValue(this), QV4::NUMBER_HINT);
- goto redo;
+ ExecutionContext *ctx = objectValue()->internalClass->engine->current;
+ ValueScope scope(ctx);
+ ScopedValue prim(scope, __qmljs_to_primitive(ValueRef::fromRawValue(this), NUMBER_HINT));
+ return prim->toNumber();
}
default: // double
- return v.doubleValue();
+ return doubleValue();
}
}
-QString Value::toQString() const
+QString Value::toQStringNoThrow() const
{
switch (type()) {
case Value::Undefined_Type:
@@ -162,14 +161,14 @@ QString Value::toQString() const
try {
ScopedValue prim(scope, __qmljs_to_primitive(ValueRef::fromRawValue(this), STRING_HINT));
if (prim->isPrimitive())
- return prim->toQString();
+ return prim->toQStringNoThrow();
} catch (Exception &e) {
e.accept(ctx);
try {
ScopedValue ex(scope, e.value());
ScopedValue prim(scope, __qmljs_to_primitive(ex, STRING_HINT));
if (prim->isPrimitive())
- return prim->toQString();
+ return prim->toQStringNoThrow();
} catch(Exception &e) {
e.accept(ctx);
}
@@ -189,6 +188,39 @@ QString Value::toQString() const
} // switch
}
+QString Value::toQString() const
+{
+ switch (type()) {
+ case Value::Undefined_Type:
+ return QStringLiteral("undefined");
+ case Value::Null_Type:
+ return QStringLiteral("null");
+ case Value::Boolean_Type:
+ if (booleanValue())
+ return QStringLiteral("true");
+ else
+ return QStringLiteral("false");
+ case Value::String_Type:
+ return stringValue()->toQString();
+ case Value::Object_Type: {
+ ExecutionContext *ctx = objectValue()->internalClass->engine->current;
+ ValueScope scope(ctx);
+ ScopedValue prim(scope, __qmljs_to_primitive(ValueRef::fromRawValue(this), STRING_HINT));
+ return prim->toQString();
+ }
+ case Value::Integer_Type: {
+ QString str;
+ __qmljs_numberToString(&str, (double)int_32, 10);
+ return str;
+ }
+ default: { // double
+ QString str;
+ __qmljs_numberToString(&str, doubleValue(), 10);
+ return str;
+ }
+ } // switch
+}
+
bool Value::sameValue(Value other) const {
if (val == other.val)
return true;