{
TRACE1(value);
- Value result = *value;
- if (result.tryIntegerConversion())
- return result.asReturnedValue();
+ if (value->isConvertibleToInt())
+ return Encode(value->int_32);
- double n = __qmljs_to_number(value);
- return QV4::Value::fromDouble(n).asReturnedValue();
+ double n = value->toNumber();
+ return Encode(n);
}
inline QV4::ReturnedValue __qmljs_uminus(const QV4::ValueRef value)
if (value->isConvertibleToInt())
n = value->int_32;
else
- n = QV4::Value::toInt32(__qmljs_to_number(value));
+ n = value->toInt32();
- return QV4::Value::fromInt32(~n).asReturnedValue();
+ return Encode((int)~n);
}
inline QV4::ReturnedValue __qmljs_not(const QV4::ValueRef value)
TRACE1(value);
bool b = value->toBoolean();
- return QV4::Value::fromBoolean(!b).asReturnedValue();
+ return Encode(!b);
}
// binary operators
if (QV4::Value::integerCompatible(*left, *right))
return QV4::Value::fromInt32(left->integerValue() | right->integerValue()).asReturnedValue();
- int lval = QV4::Value::toInt32(__qmljs_to_number(left));
- int rval = QV4::Value::toInt32(__qmljs_to_number(right));
+ int lval = left->toInt32();
+ int rval = right->toInt32();
return QV4::Value::fromInt32(lval | rval).asReturnedValue();
}
if (QV4::Value::integerCompatible(*left, *right))
return QV4::Value::fromInt32(left->integerValue() ^ right->integerValue()).asReturnedValue();
- int lval = QV4::Value::toInt32(__qmljs_to_number(left));
- int rval = QV4::Value::toInt32(__qmljs_to_number(right));
+ int lval = left->toInt32();
+ int rval = right->toInt32();
return QV4::Value::fromInt32(lval ^ rval).asReturnedValue();
}
if (QV4::Value::integerCompatible(*left, *right))
return QV4::Value::fromInt32(left->integerValue() & right->integerValue()).asReturnedValue();
- int lval = QV4::Value::toInt32(__qmljs_to_number(left));
- int rval = QV4::Value::toInt32(__qmljs_to_number(right));
+ int lval = left->toInt32();
+ int rval = right->toInt32();
return QV4::Value::fromInt32(lval & rval).asReturnedValue();
}
if (QV4::Value::integerCompatible(*left, *right))
return QV4::Value::fromInt32(left->integerValue() << ((uint(right->integerValue()) & 0x1f))).asReturnedValue();
- int lval = QV4::Value::toInt32(__qmljs_to_number(left));
- unsigned rval = QV4::Value::toUInt32(__qmljs_to_number(right)) & 0x1f;
+ int lval = left->toInt32();
+ unsigned rval = right->toUInt32() & 0x1f;
return QV4::Value::fromInt32(lval << rval).asReturnedValue();
}
if (QV4::Value::integerCompatible(*left, *right))
return QV4::Value::fromInt32(left->integerValue() >> ((uint(right->integerValue()) & 0x1f))).asReturnedValue();
- int lval = QV4::Value::toInt32(__qmljs_to_number(left));
- unsigned rval = QV4::Value::toUInt32(__qmljs_to_number(right)) & 0x1f;
+ int lval = left->toInt32();
+ unsigned rval = right->toUInt32() & 0x1f;
return QV4::Value::fromInt32(lval >> rval).asReturnedValue();
}
if (QV4::Value::integerCompatible(*left, *right)) {
res = uint(left->integerValue()) >> (uint(right->integerValue()) & 0x1f);
} else {
- unsigned lval = QV4::Value::toUInt32(__qmljs_to_number(left));
- unsigned rval = QV4::Value::toUInt32(__qmljs_to_number(right)) & 0x1f;
+ unsigned lval = left->toUInt32();
+ unsigned rval = right->toUInt32() & 0x1f;
res = lval >> rval;
}
using namespace QV4;
-int Value::toInt32() const
-{
- if (isConvertibleToInt())
- return int_32;
- double d;
- if (isDouble())
- d = dbl;
- else
- d = toNumber();
-
- const double D32 = 4294967296.0;
- const double D31 = D32 / 2.0;
-
- if ((d >= -D31 && d < D31))
- return static_cast<int>(d);
-
- return Value::toInt32(d);
-}
-
-unsigned int Value::toUInt32() const
-{
- if (isConvertibleToInt())
- return (unsigned) int_32;
- double d;
- if (isDouble())
- d = dbl;
- else
- d = toNumber();
-
- const double D32 = 4294967296.0;
- if (d >= 0 && d < D32)
- return static_cast<uint>(d);
- return toUInt32(d);
-}
-
int Value::toUInt16() const
{
if (isConvertibleToInt())
return Value::toInteger(toNumber());
}
-double Value::toNumber() const
+double Value::toNumberImpl() const
{
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 (booleanValue() ? 1. : 0.);
- case QV4::Value::Integer_Type:
- return int_32;
case QV4::Value::String_Type:
return __qmljs_string_to_number(stringValue()->toQString());
case QV4::Value::Object_Type: {
ScopedValue prim(scope, __qmljs_to_primitive(ValueRef::fromRawValue(this), NUMBER_HINT));
return prim->toNumber();
}
+ case QV4::Value::Null_Type:
+ case QV4::Value::Boolean_Type:
+ case QV4::Value::Integer_Type:
default: // double
- return doubleValue();
+ Q_UNREACHABLE();
}
}
return v;
}
+inline double Value::toNumber() const
+{
+ if (isConvertibleToInt())
+ return int_32;
+ if (isDouble())
+ return dbl;
+ return toNumberImpl();
+}
+
+inline int Value::toInt32() const
+{
+ if (isConvertibleToInt())
+ return int_32;
+ double d;
+ if (isDouble())
+ d = dbl;
+ else
+ d = toNumberImpl();
+
+ const double D32 = 4294967296.0;
+ const double D31 = D32 / 2.0;
+
+ if ((d >= -D31 && d < D31))
+ return static_cast<int>(d);
+
+ return Value::toInt32(d);
+}
+
+inline unsigned int Value::toUInt32() const
+{
+ if (isConvertibleToInt())
+ return (unsigned) int_32;
+ double d;
+ if (isDouble())
+ d = dbl;
+ else
+ d = toNumberImpl();
+
+ const double D32 = 4294967296.0;
+ if (d >= 0 && d < D32)
+ return static_cast<uint>(d);
+ return toUInt32(d);
+}
+
+
inline bool Value::toBoolean() const
{
switch (type()) {