Move Value::toInteger(double) and related to Primitive

Also clean up a few other direct uses of Value

Change-Id: Ie27d42c1b31b9e6d16d0a60071cb5e4e1c5b9e8b
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
This commit is contained in:
Lars Knoll 2013-09-25 13:52:15 +02:00 committed by The Qt Project
parent abd82c68d5
commit 4d40fa24c3
15 changed files with 42 additions and 41 deletions

View File

@ -221,7 +221,7 @@ QQmlV4Handle QQuickFontListModel::get(int idx) const
ScopedString s(scope); ScopedString s(scope);
for (int ii = 0; ii < d->roleNames.keys().count(); ++ii) { for (int ii = 0; ii < d->roleNames.keys().count(); ++ii) {
Property *p = o->insertMember((s = v4engine->newIdentifier(d->roleNames[Qt::UserRole + ii + 1])), PropertyAttributes()); Property *p = o->insertMember((s = v4engine->newIdentifier(d->roleNames[Qt::UserRole + ii + 1])), PropertyAttributes());
p->value = Value::fromReturnedValue(v8engine->fromVariant(data(index(idx, 0), Qt::UserRole + ii + 1))); p->value = v8engine->fromVariant(data(index(idx, 0), Qt::UserRole + ii + 1));
} }
return QQmlV4Handle(o); return QQmlV4Handle(o);

View File

@ -159,7 +159,7 @@ QQmlV4Handle QQuickWritingSystemListModel::get(int idx) const
ScopedString s(scope); ScopedString s(scope);
for (int ii = 0; ii < d->roleNames.keys().count(); ++ii) { for (int ii = 0; ii < d->roleNames.keys().count(); ++ii) {
Property *p = o->insertMember((s = v4engine->newIdentifier(d->roleNames[Qt::UserRole + ii + 1])), PropertyAttributes()); Property *p = o->insertMember((s = v4engine->newIdentifier(d->roleNames[Qt::UserRole + ii + 1])), PropertyAttributes());
p->value = Value::fromReturnedValue(v8engine->fromVariant(data(index(idx, 0), Qt::UserRole + ii + 1))); p->value = v8engine->fromVariant(data(index(idx, 0), Qt::UserRole + ii + 1));
} }
return QQmlV4Handle(o); return QQmlV4Handle(o);

View File

@ -131,7 +131,7 @@ static ReturnedValue qmlsqldatabase_version(SimpleCallContext *ctx)
if (!r || r->type != QQmlSqlDatabaseWrapper::Database) if (!r || r->type != QQmlSqlDatabaseWrapper::Database)
V4THROW_REFERENCE("Not a SQLDatabase object"); V4THROW_REFERENCE("Not a SQLDatabase object");
return Value::fromString(ctx->engine->newString(r->version)).asReturnedValue(); return Encode(ctx->engine->newString(r->version));
} }
static ReturnedValue qmlsqldatabase_rows_length(SimpleCallContext *ctx) static ReturnedValue qmlsqldatabase_rows_length(SimpleCallContext *ctx)
@ -295,7 +295,7 @@ static ReturnedValue qmlsqldatabase_executeSql(SimpleCallContext *ctx)
} }
} }
if (query.exec()) { if (query.exec()) {
QQmlSqlDatabaseWrapper *rows = new (ctx->engine->memoryManager) QQmlSqlDatabaseWrapper(engine); QV4::Scoped<QQmlSqlDatabaseWrapper> rows(scope, new (ctx->engine->memoryManager) QQmlSqlDatabaseWrapper(engine));
QV4::ScopedObject p(scope, databaseData(engine)->rowsProto.value()); QV4::ScopedObject p(scope, databaseData(engine)->rowsProto.value());
rows->setPrototype(p.getPointer()); rows->setPrototype(p.getPointer());
rows->type = QQmlSqlDatabaseWrapper::Rows; rows->type = QQmlSqlDatabaseWrapper::Rows;
@ -309,7 +309,7 @@ static ReturnedValue qmlsqldatabase_executeSql(SimpleCallContext *ctx)
ScopedValue v(scope); ScopedValue v(scope);
resultObject->put((s = ctx->engine->newIdentifier("rowsAffected")), (v = Primitive::fromInt32(query.numRowsAffected()))); resultObject->put((s = ctx->engine->newIdentifier("rowsAffected")), (v = Primitive::fromInt32(query.numRowsAffected())));
resultObject->put((s = ctx->engine->newIdentifier("insertId")), (v = engine->toString(query.lastInsertId().toString()))); resultObject->put((s = ctx->engine->newIdentifier("insertId")), (v = engine->toString(query.lastInsertId().toString())));
resultObject->put((s = ctx->engine->newIdentifier("rows")), (v = Value::fromObject(rows))); resultObject->put((s = ctx->engine->newIdentifier("rows")), rows);
} else { } else {
err = true; err = true;
} }
@ -343,8 +343,8 @@ static ReturnedValue qmlsqldatabase_changeVersion(SimpleCallContext *ctx)
if (from_version != r->version) if (from_version != r->version)
V4THROW_SQL(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("Version mismatch: expected %1, found %2").arg(from_version).arg(r->version)); V4THROW_SQL(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("Version mismatch: expected %1, found %2").arg(from_version).arg(r->version));
QQmlSqlDatabaseWrapper *w = new (ctx->engine->memoryManager) QQmlSqlDatabaseWrapper(engine); Scoped<QQmlSqlDatabaseWrapper> w(scope, new (ctx->engine->memoryManager) QQmlSqlDatabaseWrapper(engine));
QV4::ScopedObject p(scope, databaseData(engine)->queryProto.value()); ScopedObject p(scope, databaseData(engine)->queryProto.value());
w->setPrototype(p.getPointer()); w->setPrototype(p.getPointer());
w->type = QQmlSqlDatabaseWrapper::Query; w->type = QQmlSqlDatabaseWrapper::Query;
w->database = db; w->database = db;
@ -358,7 +358,7 @@ static ReturnedValue qmlsqldatabase_changeVersion(SimpleCallContext *ctx)
ScopedCallData callData(scope, 1); ScopedCallData callData(scope, 1);
callData->thisObject = engine->global(); callData->thisObject = engine->global();
callData->args[0] = Value::fromObject(w); callData->args[0] = w;
try { try {
callback->call(callData); callback->call(callData);
} catch (Exception &) { } catch (Exception &) {
@ -401,7 +401,7 @@ static ReturnedValue qmlsqldatabase_transaction_shared(SimpleCallContext *ctx, b
QSqlDatabase db = r->database; QSqlDatabase db = r->database;
QQmlSqlDatabaseWrapper *w = new (ctx->engine->memoryManager) QQmlSqlDatabaseWrapper(engine); Scoped<QQmlSqlDatabaseWrapper> w(scope, new (ctx->engine->memoryManager) QQmlSqlDatabaseWrapper(engine));
QV4::ScopedObject p(scope, databaseData(engine)->queryProto.value()); QV4::ScopedObject p(scope, databaseData(engine)->queryProto.value());
w->setPrototype(p.getPointer()); w->setPrototype(p.getPointer());
w->type = QQmlSqlDatabaseWrapper::Query; w->type = QQmlSqlDatabaseWrapper::Query;
@ -414,7 +414,7 @@ static ReturnedValue qmlsqldatabase_transaction_shared(SimpleCallContext *ctx, b
if (callback) { if (callback) {
ScopedCallData callData(scope, 1); ScopedCallData callData(scope, 1);
callData->thisObject = engine->global(); callData->thisObject = engine->global();
callData->args[0] = Value::fromObject(w); callData->args[0] = w;
try { try {
callback->call(callData); callback->call(callData);
} catch (Exception &) { } catch (Exception &) {

View File

@ -100,7 +100,7 @@ public Q_SLOTS:
QQmlEngine *engine = qmlEngine(this); QQmlEngine *engine = qmlEngine(this);
QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle()); QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle());
QV4::Scope scope(v4); QV4::Scope scope(v4);
QV4::ScopedValue s(scope, QV4::Value::fromString(v4->newString(name))); QV4::ScopedValue s(scope, v4->newString(name));
return QQmlV4Handle(s); return QQmlV4Handle(s);
} }

View File

@ -928,7 +928,7 @@ QQmlV4Handle QQuickXmlListModel::get(int index) const
for (int ii = 0; ii < d->roleObjects.count(); ++ii) { for (int ii = 0; ii < d->roleObjects.count(); ++ii) {
ScopedString name(scope, v4engine->newIdentifier(d->roleObjects[ii]->name())); ScopedString name(scope, v4engine->newIdentifier(d->roleObjects[ii]->name()));
Property *p = o->insertMember(name, PropertyAttributes()); Property *p = o->insertMember(name, PropertyAttributes());
p->value = Value::fromReturnedValue(v8engine->fromVariant(d->data.value(ii).value(index))); p->value = v8engine->fromVariant(d->data.value(ii).value(index));
} }
return QQmlV4Handle(o); return QQmlV4Handle(o);

View File

@ -556,7 +556,7 @@ V4IR::Expr *Codegen::unop(V4IR::AluOp op, V4IR::Expr *expr)
case V4IR::OpUPlus: case V4IR::OpUPlus:
return expr; return expr;
case V4IR::OpCompl: case V4IR::OpCompl:
return _block->CONST(V4IR::NumberType, ~QV4::Value::toInt32(c->value)); return _block->CONST(V4IR::NumberType, ~QV4::Primitive::toInt32(c->value));
case V4IR::OpIncrement: case V4IR::OpIncrement:
return _block->CONST(V4IR::NumberType, c->value + 1); return _block->CONST(V4IR::NumberType, c->value + 1);
case V4IR::OpDecrement: case V4IR::OpDecrement:
@ -595,13 +595,13 @@ V4IR::Expr *Codegen::binop(V4IR::AluOp op, V4IR::Expr *left, V4IR::Expr *right)
case V4IR::OpGt: return _block->CONST(V4IR::BoolType, c1->value > c2->value); case V4IR::OpGt: return _block->CONST(V4IR::BoolType, c1->value > c2->value);
case V4IR::OpLe: return _block->CONST(V4IR::BoolType, c1->value <= c2->value); case V4IR::OpLe: return _block->CONST(V4IR::BoolType, c1->value <= c2->value);
case V4IR::OpLt: return _block->CONST(V4IR::BoolType, c1->value < c2->value); case V4IR::OpLt: return _block->CONST(V4IR::BoolType, c1->value < c2->value);
case V4IR::OpLShift: return _block->CONST(V4IR::NumberType, QV4::Value::toInt32(c1->value) << (QV4::Value::toUInt32(c2->value) & 0x1f)); case V4IR::OpLShift: return _block->CONST(V4IR::NumberType, QV4::Primitive::toInt32(c1->value) << (QV4::Primitive::toUInt32(c2->value) & 0x1f));
case V4IR::OpMod: return _block->CONST(V4IR::NumberType, std::fmod(c1->value, c2->value)); case V4IR::OpMod: return _block->CONST(V4IR::NumberType, std::fmod(c1->value, c2->value));
case V4IR::OpMul: return _block->CONST(V4IR::NumberType, c1->value * c2->value); case V4IR::OpMul: return _block->CONST(V4IR::NumberType, c1->value * c2->value);
case V4IR::OpOr: return _block->CONST(V4IR::NumberType, c1->value ? c1->value : c2->value); case V4IR::OpOr: return _block->CONST(V4IR::NumberType, c1->value ? c1->value : c2->value);
case V4IR::OpRShift: return _block->CONST(V4IR::NumberType, QV4::Value::toInt32(c1->value) >> (QV4::Value::toUInt32(c2->value) & 0x1f)); case V4IR::OpRShift: return _block->CONST(V4IR::NumberType, QV4::Primitive::toInt32(c1->value) >> (QV4::Primitive::toUInt32(c2->value) & 0x1f));
case V4IR::OpSub: return _block->CONST(V4IR::NumberType, c1->value - c2->value); case V4IR::OpSub: return _block->CONST(V4IR::NumberType, c1->value - c2->value);
case V4IR::OpURShift: return _block->CONST(V4IR::NumberType,QV4::Value::toUInt32(c1->value) >> (QV4::Value::toUInt32(c2->value) & 0x1f)); case V4IR::OpURShift: return _block->CONST(V4IR::NumberType,QV4::Primitive::toUInt32(c1->value) >> (QV4::Primitive::toUInt32(c2->value) & 0x1f));
case V4IR::OpInstanceof: case V4IR::OpInstanceof:
case V4IR::OpIn: case V4IR::OpIn:

View File

@ -1583,10 +1583,10 @@ public:
case DoubleType: case DoubleType:
break; break;
case SInt32Type: case SInt32Type:
c->value = QV4::Value::toInt32(c->value); c->value = QV4::Primitive::toInt32(c->value);
break; break;
case UInt32Type: case UInt32Type:
c->value = QV4::Value::toUInt32(c->value); c->value = QV4::Primitive::toUInt32(c->value);
break; break;
case BoolType: case BoolType:
c->value = !(c->value == 0 || std::isnan(c->value)); c->value = !(c->value == 0 || std::isnan(c->value));
@ -1626,9 +1626,9 @@ protected:
virtual void visitConst(Const *c) { virtual void visitConst(Const *c) {
if (_ty & NumberType && c->type & NumberType) { if (_ty & NumberType && c->type & NumberType) {
if (_ty == SInt32Type) if (_ty == SInt32Type)
c->value = QV4::Value::toInt32(c->value); c->value = QV4::Primitive::toInt32(c->value);
else if (_ty == UInt32Type) else if (_ty == UInt32Type)
c->value = QV4::Value::toUInt32(c->value); c->value = QV4::Primitive::toUInt32(c->value);
c->type = _ty; c->type = _ty;
} }
} }
@ -2347,7 +2347,7 @@ void optimizeSSA(Function *function, DefUsesCalculator &defUses)
doneSomething = true; doneSomething = true;
break; break;
case OpCompl: case OpCompl:
constOperand->value = ~QV4::Value::toInt32(constOperand->value); constOperand->value = ~QV4::Primitive::toInt32(constOperand->value);
constOperand->type = SInt32Type; constOperand->type = SInt32Type;
doneSomething = true; doneSomething = true;
break; break;

View File

@ -212,7 +212,7 @@ static inline double MonthFromTime(double t)
static inline double DateFromTime(double t) static inline double DateFromTime(double t)
{ {
int m = (int) Value::toInteger(MonthFromTime(t)); int m = (int) Primitive::toInteger(MonthFromTime(t));
double d = DayWithinYear(t); double d = DayWithinYear(t);
double l = InLeapYear(t); double l = InLeapYear(t);
@ -336,7 +336,7 @@ static inline double TimeClip(double t)
{ {
if (! qIsFinite(t) || fabs(t) > 8.64e15) if (! qIsFinite(t) || fabs(t) > 8.64e15)
return qSNaN(); return qSNaN();
return Value::toInteger(t); return Primitive::toInteger(t);
} }
static inline double ParseString(const QString &s) static inline double ParseString(const QString &s)
@ -1193,7 +1193,7 @@ ReturnedValue DatePrototype::method_setYear(SimpleCallContext *ctx)
if (std::isnan(year)) { if (std::isnan(year)) {
r = qSNaN(); r = qSNaN();
} else { } else {
if ((Value::toInteger(year) >= 0) && (Value::toInteger(year) <= 99)) if ((Primitive::toInteger(year) >= 0) && (Primitive::toInteger(year) <= 99))
year += 1900; year += 1900;
r = MakeDay(year, MonthFromTime(t), DateFromTime(t)); r = MakeDay(year, MonthFromTime(t), DateFromTime(t));
r = UTC(MakeDate(r, TimeWithinDay(t))); r = UTC(MakeDate(r, TimeWithinDay(t)));

View File

@ -134,7 +134,7 @@ ReturnedValue NumberPrototype::method_toString(SimpleCallContext *ctx)
num = -num; num = -num;
} }
double frac = num - ::floor(num); double frac = num - ::floor(num);
num = Value::toInteger(num); num = Primitive::toInteger(num);
do { do {
char c = (char)::fmod(num, radix); char c = (char)::fmod(num, radix);
c = (c < 10) ? (c + '0') : (c - 10 + 'a'); c = (c < 10) ? (c + '0') : (c - 10 + 'a');

View File

@ -385,7 +385,7 @@ inline uint Object::arrayLength() const
Value v = memberData[ArrayObject::LengthPropertyIndex].value; Value v = memberData[ArrayObject::LengthPropertyIndex].value;
if (v.isInteger()) if (v.isInteger())
return v.integerValue(); return v.integerValue();
return Value::toUInt32(v.doubleValue()); return Primitive::toUInt32(v.doubleValue());
} }
return 0; return 0;
} }

View File

@ -216,7 +216,7 @@ void __qmljs_numberToString(QString *result, double num, int radix)
} }
double frac = num - ::floor(num); double frac = num - ::floor(num);
num = Value::toInteger(num); num = Primitive::toInteger(num);
do { do {
char c = (char)::fmod(num, radix); char c = (char)::fmod(num, radix);
@ -1294,7 +1294,7 @@ int __qmljs_value_to_int32(const ValueRef value)
int __qmljs_double_to_int32(const double &d) int __qmljs_double_to_int32(const double &d)
{ {
return Value::toInt32(d); return Primitive::toInt32(d);
} }
unsigned __qmljs_value_to_uint32(const ValueRef value) unsigned __qmljs_value_to_uint32(const ValueRef value)
@ -1304,7 +1304,7 @@ unsigned __qmljs_value_to_uint32(const ValueRef value)
unsigned __qmljs_double_to_uint32(const double &d) unsigned __qmljs_double_to_uint32(const double &d)
{ {
return Value::toUInt32(d); return Primitive::toUInt32(d);
} }
ReturnedValue __qmljs_value_from_string(String *string) ReturnedValue __qmljs_value_from_string(String *string)

View File

@ -703,8 +703,8 @@ ReturnedValue StringPrototype::method_substr(SimpleCallContext *context)
length = qMin(qMax(length, 0.0), count - start); length = qMin(qMax(length, 0.0), count - start);
qint32 x = Value::toInt32(start); qint32 x = Primitive::toInt32(start);
qint32 y = Value::toInt32(length); qint32 y = Primitive::toInt32(length);
return Value::fromString(context, value.mid(x, y)).asReturnedValue(); return Value::fromString(context, value.mid(x, y)).asReturnedValue();
} }

View File

@ -79,7 +79,7 @@ double Value::toInteger() const
if (integerCompatible()) if (integerCompatible())
return int_32; return int_32;
return Value::toInteger(toNumber()); return Primitive::toInteger(toNumber());
} }
double Value::toNumberImpl() const double Value::toNumberImpl() const
@ -213,7 +213,7 @@ Value Value::fromString(ExecutionEngine *engine, const QString &s)
} }
int Value::toInt32(double number) int Primitive::toInt32(double number)
{ {
const double D32 = 4294967296.0; const double D32 = 4294967296.0;
const double D31 = D32 / 2.0; const double D31 = D32 / 2.0;
@ -239,7 +239,7 @@ int Value::toInt32(double number)
return int(number); return int(number);
} }
unsigned int Value::toUInt32(double number) unsigned int Primitive::toUInt32(double number)
{ {
const double D32 = 4294967296.0; const double D32 = 4294967296.0;
if ((number >= 0 && number < D32)) if ((number >= 0 && number < D32))
@ -260,7 +260,7 @@ unsigned int Value::toUInt32(double number)
return unsigned(number); return unsigned(number);
} }
double Value::toInteger(double number) double Primitive::toInteger(double number)
{ {
if (std::isnan(number)) if (std::isnan(number))
return +0; return +0;

View File

@ -283,10 +283,6 @@ struct Q_QML_EXPORT Value
static Value fromString(ExecutionEngine *engine, const QString &s); static Value fromString(ExecutionEngine *engine, const QString &s);
#endif #endif
static double toInteger(double fromNumber);
static int toInt32(double value);
static unsigned int toUInt32(double value);
int toUInt16() const; int toUInt16() const;
int toInt32() const; int toInt32() const;
unsigned int toUInt32() const; unsigned int toUInt32() const;
@ -328,6 +324,7 @@ struct Q_QML_EXPORT Value
ReturnedValue asReturnedValue() const { return val; } ReturnedValue asReturnedValue() const { return val; }
static Value fromReturnedValue(ReturnedValue val) { Value v; v.val = val; return v; } static Value fromReturnedValue(ReturnedValue val) { Value v; v.val = val; return v; }
Value &operator=(ReturnedValue v) { val = v; return *this; }
// Section 9.12 // Section 9.12
bool sameValue(Value other) const; bool sameValue(Value other) const;
@ -356,7 +353,7 @@ struct SafeValue : public Value
Returned<T> *as(); Returned<T> *as();
}; };
struct Primitive : public Value struct Q_QML_EXPORT Primitive : public Value
{ {
static Primitive fromBoolean(bool b); static Primitive fromBoolean(bool b);
static Primitive fromInt32(int i); static Primitive fromInt32(int i);
@ -365,6 +362,10 @@ struct Primitive : public Value
static Primitive fromDouble(double d); static Primitive fromDouble(double d);
static Primitive fromUInt32(uint i); static Primitive fromUInt32(uint i);
static double toInteger(double fromNumber);
static int toInt32(double value);
static unsigned int toUInt32(double value);
inline operator ValueRef(); inline operator ValueRef();
Value asValue() const { return *this; } Value asValue() const { return *this; }
}; };

View File

@ -228,7 +228,7 @@ inline int Value::toInt32() const
if ((d >= -D31 && d < D31)) if ((d >= -D31 && d < D31))
return static_cast<int>(d); return static_cast<int>(d);
return Value::toInt32(d); return Primitive::toInt32(d);
} }
inline unsigned int Value::toUInt32() const inline unsigned int Value::toUInt32() const