diff options
author | Lars Knoll <lars.knoll@digia.com> | 2012-11-17 22:10:52 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-19 10:29:39 +0100 |
commit | 1162d4dde662908e3affe0bdcd45afb26676a52d (patch) | |
tree | 8fe075a6fe351fea24cf0887b2d168eb2f7dad93 /qmljs_runtime.h | |
parent | 65724ce3e7ae798c6efad3a039072356063f3e4c (diff) |
Move Value into it's own header/cpp file
Change-Id: I2872d824a2016a653e64f0332f6416f416eef0e7
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'qmljs_runtime.h')
-rw-r--r-- | qmljs_runtime.h | 311 |
1 files changed, 2 insertions, 309 deletions
diff --git a/qmljs_runtime.h b/qmljs_runtime.h index 56cc95334d..549c8a4b91 100644 --- a/qmljs_runtime.h +++ b/qmljs_runtime.h @@ -41,12 +41,12 @@ #ifndef QMLJS_RUNTIME_H #define QMLJS_RUNTIME_H +#include <qmljs_value.h> + #include <QtCore/QString> #include <QtCore/qnumeric.h> #include <QtCore/QDebug> -#include <wtf/Platform.h> - #include <cmath> #include <cassert> @@ -87,185 +87,6 @@ struct ErrorObject; struct ActivationObject; struct ExecutionEngine; -typedef uint Bool; - -struct Value -{ - union { - quint64 val; - double dbl; - struct { -#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN - uint tag; -#endif - union { - uint uint_32; - int int_32; -#if CPU(X86_64) -#else - Object *o; - String *s; -#endif - }; -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - uint tag; -#endif - }; - }; - - enum Masks { - NotDouble_Mask = 0xfff80000, - Type_Mask = 0xffff0000, - Immediate_Mask = NotDouble_Mask | 0x00040000, - Tag_Shift = 32 - }; - enum ValueType { - Undefined_Type = Immediate_Mask | 0x00000, - Null_Type = Immediate_Mask | 0x10000, - Boolean_Type = Immediate_Mask | 0x20000, - Integer_Type = Immediate_Mask | 0x30000, - Object_Type = NotDouble_Mask | 0x00000, - String_Type = NotDouble_Mask | 0x10000 - }; - - enum ImmediateFlags { - ConvertibleToInt = Immediate_Mask | (0x1 << 15) - }; - - enum ValueTypeInternal { - _Undefined_Type = Undefined_Type, - _Null_Type = Null_Type | ConvertibleToInt, - _Boolean_Type = Boolean_Type | ConvertibleToInt, - _Integer_Type = Integer_Type | ConvertibleToInt, - _Object_Type = Object_Type, - _String_Type = String_Type - - }; - - inline ValueType type() const { - return (ValueType)(tag & Type_Mask); - } - - inline bool isUndefined() const { return tag == _Undefined_Type; } - inline bool isNull() const { return tag == _Null_Type; } - inline bool isBoolean() const { return tag == _Boolean_Type; } - inline bool isInteger() const { return tag == _Integer_Type; } - inline bool isDouble() const { return (tag & NotDouble_Mask) != NotDouble_Mask; } - inline bool isNumber() const { return tag == _Integer_Type || (tag & NotDouble_Mask) != NotDouble_Mask; } -#if CPU(X86_64) - inline bool isString() const { return (tag & Type_Mask) == String_Type; } - inline bool isObject() const { return (tag & Type_Mask) == Object_Type; } -#else - inline bool isString() const { return tag == String_Type; } - inline bool isObject() const { return tag == Object_Type; } -#endif - inline bool isConvertibleToInt() const { return (tag & ConvertibleToInt) == ConvertibleToInt; } - - Bool booleanValue() const { - return int_32; - } - double doubleValue() const { - return dbl; - } - void setDouble(double d) { - dbl = d; - } - double asDouble() const { - if (tag == _Integer_Type) - return int_32; - return dbl; - } - int integerValue() const { - return int_32; - } - -#if CPU(X86_64) - String *stringValue() const { - return (String *)(val & ~(quint64(Type_Mask) << Tag_Shift)); - } - Object *objectValue() const { - return (Object *)(val & ~(quint64(Type_Mask) << Tag_Shift)); - } -#else - String *stringValue() const { - return s; - } - Object *objectValue() const { - return o; - } -#endif - - quint64 rawValue() const { - return val; - } - - static Value undefinedValue(); - static Value nullValue(); - static Value fromBoolean(Bool b); - static Value fromDouble(double d); - static Value fromInt32(int i); - static Value fromString(String *s); - static Value fromObject(Object *o); - -#ifndef QMLJS_LLVM_RUNTIME - static Value fromString(ExecutionContext *ctx, const QString &fromString); -#endif - - static double toInteger(double fromNumber); - static int toInt32(double value); - static unsigned int toUInt32(double value); - - inline int toUInt16(ExecutionContext *ctx); - inline int toInt32(ExecutionContext *ctx); - inline unsigned int toUInt32(ExecutionContext *ctx); - inline Bool toBoolean(ExecutionContext *ctx) const; - inline double toInteger(ExecutionContext *ctx) const; - double toNumber(ExecutionContext *ctx) const; - inline String *toString(ExecutionContext *ctx) const; - inline Value toObject(ExecutionContext *ctx) const; - - inline bool isPrimitive() const { return !isObject(); } -#if CPU(X86_64) - static inline bool integerCompatible(Value a, Value b) { - const quint64 mask = quint64(ConvertibleToInt) << 32; - return ((a.val & b.val) & mask) == mask; - } - static inline bool bothDouble(Value a, Value b) { - const quint64 mask = quint64(NotDouble_Mask) << 32; - return ((a.val | b.val) & mask) != mask; - } -#else - static inline bool integerCompatible(Value a, Value b) { - return ((a.tag & b.tag) & ConvertibleToInt) == ConvertibleToInt; - } - static inline bool bothDouble(Value a, Value b) { - return ((a.tag | b.tag) & NotDouble_Mask) != NotDouble_Mask; - } -#endif - inline bool tryIntegerConversion() { - bool b = isConvertibleToInt(); - if (b) - tag = _Integer_Type; - return b; - } - - Object *asObject() const; - FunctionObject *asFunctionObject() const; - BooleanObject *asBooleanObject() const; - NumberObject *asNumberObject() const; - StringObject *asStringObject() const; - DateObject *asDateObject() const; - RegExpObject *asRegExpObject() const; - ArrayObject *asArrayObject() const; - ErrorObject *asErrorObject() const; - ActivationObject *asArgumentsObject() const; - - Value property(ExecutionContext *ctx, String *name) const; - - // Section 9.12 - bool sameValue(Value other); -}; - extern "C" { // context @@ -439,134 +260,6 @@ Bool __qmljs_cmp_in(Value left, Value right, ExecutionContext *ctx); } // extern "C" -inline int Value::toUInt16(ExecutionContext *ctx) -{ - return __qmljs_to_uint16(*this, ctx); -} - -inline int Value::toInt32(ExecutionContext *ctx) -{ - if (isConvertibleToInt()) - return int_32; - - return Value::toInt32(__qmljs_to_number(*this, ctx)); -} - -inline unsigned int Value::toUInt32(ExecutionContext *ctx) -{ - if (isConvertibleToInt()) - return (unsigned) int_32; - - return toUInt32(__qmljs_to_number(*this, ctx)); -} - -inline Bool Value::toBoolean(ExecutionContext *ctx) const -{ - return __qmljs_to_boolean(*this, ctx); -} - -inline double Value::toInteger(ExecutionContext *ctx) const -{ - return __qmljs_to_integer(*this, ctx); -} - -inline double Value::toNumber(ExecutionContext *ctx) const -{ - return __qmljs_to_number(*this, ctx); -} - -inline String *Value::toString(ExecutionContext *ctx) const -{ - Value v = __qmljs_to_string(*this, ctx); - assert(v.isString()); - return v.stringValue(); -} - -inline Value Value::toObject(ExecutionContext *ctx) const -{ - return __qmljs_to_object(*this, ctx); -} - -inline Value Value::undefinedValue() -{ - Value v; -#if CPU(X86_64) - v.val = quint64(_Undefined_Type) << Tag_Shift; -#else - v.tag = _Undefined_Type; - v.int_32 = 0; -#endif - return v; -} - -inline Value Value::nullValue() -{ - Value v; -#if CPU(X86_64) - v.val = quint64(_Null_Type) << Tag_Shift; -#else - v.tag = _Null_Type; - v.int_32 = 0; -#endif - return v; -} - -inline Value Value::fromBoolean(Bool b) -{ - Value v; - v.tag = _Boolean_Type; - v.int_32 = (bool)b; - return v; -} - -inline Value Value::fromDouble(double d) -{ - Value v; - v.dbl = d; - return v; -} - -inline Value Value::fromInt32(int i) -{ - Value v; - v.tag = _Integer_Type; - v.int_32 = i; - return v; -} - -inline Value Value::fromString(String *s) -{ - Value v; -#if CPU(X86_64) - v.val = (quint64)s; - v.val |= quint64(_String_Type) << Tag_Shift; -#else - v.tag = _String_Type; - v.s = s; -#endif - return v; -} - -inline Value Value::fromObject(Object *o) -{ - Value v; -#if CPU(X86_64) - v.val = (quint64)o; - v.val |= quint64(_Object_Type) << Tag_Shift; -#else - v.tag = _Object_Type; - v.o = o; -#endif - return v; -} - -inline bool Value::sameValue(Value other) { - if (val == other.val) - return true; - if (isString() && other.isString()) - return __qmljs_string_equal(stringValue(), other.stringValue()); - return false; -} #include <qmljs_math.h> |