aboutsummaryrefslogtreecommitdiffstats
path: root/qmljs_runtime.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2012-11-17 22:10:52 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2012-11-19 10:29:39 +0100
commit1162d4dde662908e3affe0bdcd45afb26676a52d (patch)
tree8fe075a6fe351fea24cf0887b2d168eb2f7dad93 /qmljs_runtime.h
parent65724ce3e7ae798c6efad3a039072356063f3e4c (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.h311
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>