diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSCJSValueInlines.h')
| -rw-r--r-- | Source/JavaScriptCore/runtime/JSCJSValueInlines.h | 154 |
1 files changed, 40 insertions, 114 deletions
diff --git a/Source/JavaScriptCore/runtime/JSCJSValueInlines.h b/Source/JavaScriptCore/runtime/JSCJSValueInlines.h index 71842c21c..b34adf809 100644 --- a/Source/JavaScriptCore/runtime/JSCJSValueInlines.h +++ b/Source/JavaScriptCore/runtime/JSCJSValueInlines.h @@ -26,13 +26,10 @@ #ifndef JSValueInlines_h #define JSValueInlines_h -#include "ExceptionHelpers.h" -#include "Identifier.h" #include "InternalFunction.h" #include "JSCJSValue.h" #include "JSCellInlines.h" #include "JSFunction.h" -#include <wtf/text/StringImpl.h> namespace JSC { @@ -68,7 +65,7 @@ inline double JSValue::asNumber() const inline JSValue jsNaN() { - return JSValue(PNaN); + return JSValue(QNaN); } inline JSValue::JSValue(char i) @@ -213,10 +210,10 @@ inline JSValue::JSValue(const JSCell* ptr) u.asBits.payload = reinterpret_cast<int32_t>(const_cast<JSCell*>(ptr)); } -inline JSValue::operator bool() const +inline JSValue::operator UnspecifiedBoolType*() const { ASSERT(tag() != DeletedValueTag); - return tag() != EmptyValueTag; + return tag() != EmptyValueTag ? reinterpret_cast<UnspecifiedBoolType*>(1) : 0; } inline bool JSValue::operator==(const JSValue& other) const @@ -304,7 +301,6 @@ ALWAYS_INLINE JSCell* JSValue::asCell() const ALWAYS_INLINE JSValue::JSValue(EncodeAsDoubleTag, double d) { - ASSERT(!isImpureNaN(d)); u.asDouble = d; } @@ -314,7 +310,7 @@ inline JSValue::JSValue(int i) u.asBits.payload = i; } -#if !ENABLE(JIT) +#if ENABLE(LLINT_C_LOOP) inline JSValue::JSValue(int32_t tag, int32_t payload) { u.asBits.tag = tag; @@ -329,7 +325,7 @@ inline bool JSValue::isNumber() const inline bool JSValue::isBoolean() const { - return tag() == BooleanTag; + return isTrue() || isFalse(); } inline bool JSValue::asBoolean() const @@ -362,9 +358,9 @@ inline JSValue::JSValue(const JSCell* ptr) u.asInt64 = reinterpret_cast<uintptr_t>(const_cast<JSCell*>(ptr)); } -inline JSValue::operator bool() const +inline JSValue::operator UnspecifiedBoolType*() const { - return u.asInt64; + return u.asInt64 ? reinterpret_cast<UnspecifiedBoolType*>(1) : 0; } inline bool JSValue::operator==(const JSValue& other) const @@ -471,7 +467,6 @@ inline double reinterpretInt64ToDouble(int64_t value) ALWAYS_INLINE JSValue::JSValue(EncodeAsDoubleTag, double d) { - ASSERT(!isImpureNaN(d)); u.asInt64 = reinterpretDoubleToInt64(d) + DoubleEncodeOffset; } @@ -499,43 +494,25 @@ ALWAYS_INLINE JSCell* JSValue::asCell() const #endif // USE(JSVALUE64) -inline int64_t tryConvertToInt52(double number) -{ - if (number != number) - return JSValue::notInt52; -#if OS(WINDOWS) && CPU(X86) - // The VS Compiler for 32-bit builds generates a floating point error when attempting to cast - // from an infinity to a 64-bit integer. We leave this routine with the floating point error - // left in a register, causing undefined behavior in later floating point operations. - // - // To avoid this issue, we check for infinity here, and return false in that case. - if (std::isinf(number)) - return JSValue::notInt52; -#endif - int64_t asInt64 = static_cast<int64_t>(number); - if (asInt64 != number) - return JSValue::notInt52; - if (!asInt64 && std::signbit(number)) - return JSValue::notInt52; - if (asInt64 >= (static_cast<int64_t>(1) << (JSValue::numberOfInt52Bits - 1))) - return JSValue::notInt52; - if (asInt64 < -(static_cast<int64_t>(1) << (JSValue::numberOfInt52Bits - 1))) - return JSValue::notInt52; - return asInt64; -} - -inline bool isInt52(double number) -{ - return tryConvertToInt52(number) != JSValue::notInt52; -} - inline bool JSValue::isMachineInt() const { if (isInt32()) return true; if (!isNumber()) return false; - return isInt52(asDouble()); + double number = asDouble(); + if (number != number) + return false; + int64_t asInt64 = static_cast<int64_t>(number); + if (asInt64 != number) + return false; + if (!asInt64 && std::signbit(number)) + return false; + if (asInt64 >= (static_cast<int64_t>(1) << (numberOfInt52Bits - 1))) + return false; + if (asInt64 < -(static_cast<int64_t>(1) << (numberOfInt52Bits - 1))) + return false; + return true; } inline int64_t JSValue::asMachineInt() const @@ -551,14 +528,9 @@ inline bool JSValue::isString() const return isCell() && asCell()->isString(); } -inline bool JSValue::isSymbol() const -{ - return isCell() && asCell()->isSymbol(); -} - inline bool JSValue::isPrimitive() const { - return !isCell() || asCell()->isString() || asCell()->isSymbol(); + return !isCell() || asCell()->isString(); } inline bool JSValue::isGetterSetter() const @@ -566,11 +538,6 @@ inline bool JSValue::isGetterSetter() const return isCell() && asCell()->isGetterSetter(); } -inline bool JSValue::isCustomGetterSetter() const -{ - return isCell() && asCell()->isCustomGetterSetter(); -} - inline bool JSValue::isObject() const { return isCell() && asCell()->isObject(); @@ -611,17 +578,6 @@ ALWAYS_INLINE bool JSValue::getUInt32(uint32_t& v) const return false; } -ALWAYS_INLINE Identifier JSValue::toPropertyKey(ExecState* exec) const -{ - if (isString()) - return asString(*this)->toIdentifier(exec); - - JSValue primitive = toPrimitive(exec, PreferString); - if (primitive.isSymbol()) - return Identifier::fromUid(asSymbol(primitive)->privateName()); - return primitive.toString(exec)->toIdentifier(exec); -} - inline JSValue JSValue::toPrimitive(ExecState* exec, PreferredPrimitiveType preferredType) const { return isCell() ? asCell()->toPrimitive(exec, preferredType) : asValue(); @@ -652,7 +608,7 @@ inline bool JSValue::getPrimitiveNumber(ExecState* exec, double& number, JSValue return true; } ASSERT(isUndefined()); - number = PNaN; + number = QNaN; value = *this; return true; } @@ -689,49 +645,45 @@ inline bool JSValue::inherits(const ClassInfo* classInfo) const inline JSValue JSValue::toThis(ExecState* exec, ECMAMode ecmaMode) const { - return isCell() ? asCell()->methodTable(exec->vm())->toThis(asCell(), exec, ecmaMode) : toThisSlowCase(exec, ecmaMode); + return isCell() ? asCell()->methodTable()->toThis(asCell(), exec, ecmaMode) : toThisSlowCase(exec, ecmaMode); } -ALWAYS_INLINE JSValue JSValue::get(ExecState* exec, PropertyName propertyName) const +inline JSValue JSValue::get(ExecState* exec, PropertyName propertyName) const { PropertySlot slot(asValue()); return get(exec, propertyName, slot); } -ALWAYS_INLINE JSValue JSValue::get(ExecState* exec, PropertyName propertyName, PropertySlot& slot) const -{ - return getPropertySlot(exec, propertyName, slot) ? - slot.getValue(exec, propertyName) : jsUndefined(); -} - -ALWAYS_INLINE bool JSValue::getPropertySlot(ExecState* exec, PropertyName propertyName, PropertySlot& slot) const +inline JSValue JSValue::get(ExecState* exec, PropertyName propertyName, PropertySlot& slot) const { // If this is a primitive, we'll need to synthesize the prototype - // and if it's a string there are special properties to check first. JSObject* object; if (UNLIKELY(!isObject())) { - if (isString() && asString(*this)->getStringPropertySlot(exec, propertyName, slot)) - return true; + if (isCell() && asString(*this)->getStringPropertySlot(exec, propertyName, slot)) + return slot.getValue(exec, propertyName); object = synthesizePrototype(exec); } else object = asObject(asCell()); - return object->getPropertySlot(exec, propertyName, slot); + if (object->getPropertySlot(exec, propertyName, slot)) + return slot.getValue(exec, propertyName); + return jsUndefined(); } -ALWAYS_INLINE JSValue JSValue::get(ExecState* exec, unsigned propertyName) const +inline JSValue JSValue::get(ExecState* exec, unsigned propertyName) const { PropertySlot slot(asValue()); return get(exec, propertyName, slot); } -ALWAYS_INLINE JSValue JSValue::get(ExecState* exec, unsigned propertyName, PropertySlot& slot) const +inline JSValue JSValue::get(ExecState* exec, unsigned propertyName, PropertySlot& slot) const { // If this is a primitive, we'll need to synthesize the prototype - // and if it's a string there are special properties to check first. JSObject* object; if (UNLIKELY(!isObject())) { - if (isString() && asString(*this)->getStringPropertySlot(exec, propertyName, slot)) + if (isCell() && asString(*this)->getStringPropertySlot(exec, propertyName, slot)) return slot.getValue(exec, propertyName); object = synthesizePrototype(exec); } else @@ -748,7 +700,7 @@ inline void JSValue::put(ExecState* exec, PropertyName propertyName, JSValue val putToPrimitive(exec, propertyName, value, slot); return; } - asCell()->methodTable(exec->vm())->put(asCell(), exec, propertyName, value, slot); + asCell()->methodTable()->put(asCell(), exec, propertyName, value, slot); } inline void JSValue::putByIndex(ExecState* exec, unsigned propertyName, JSValue value, bool shouldThrow) @@ -757,7 +709,7 @@ inline void JSValue::putByIndex(ExecState* exec, unsigned propertyName, JSValue putToPrimitiveByIndex(exec, propertyName, value, shouldThrow); return; } - asCell()->methodTable(exec->vm())->putByIndex(asCell(), exec, propertyName, value, shouldThrow); + asCell()->methodTable()->putByIndex(asCell(), exec, propertyName, value, shouldThrow); } inline JSValue JSValue::structureOrUndefined() const @@ -778,7 +730,6 @@ inline bool JSValue::equal(ExecState* exec, JSValue v1, JSValue v2) ALWAYS_INLINE bool JSValue::equalSlowCaseInline(ExecState* exec, JSValue v1, JSValue v2) { - VM& vm = exec->vm(); do { if (v1.isNumber() && v2.isNumber()) return v1.asNumber() == v2.asNumber(); @@ -786,20 +737,20 @@ ALWAYS_INLINE bool JSValue::equalSlowCaseInline(ExecState* exec, JSValue v1, JSV bool s1 = v1.isString(); bool s2 = v2.isString(); if (s1 && s2) - return WTF::equal(*asString(v1)->value(exec).impl(), *asString(v2)->value(exec).impl()); + return asString(v1)->value(exec) == asString(v2)->value(exec); if (v1.isUndefinedOrNull()) { if (v2.isUndefinedOrNull()) return true; if (!v2.isCell()) return false; - return v2.asCell()->structure(vm)->masqueradesAsUndefined(exec->lexicalGlobalObject()); + return v2.asCell()->structure()->masqueradesAsUndefined(exec->lexicalGlobalObject()); } if (v2.isUndefinedOrNull()) { if (!v1.isCell()) return false; - return v1.asCell()->structure(vm)->masqueradesAsUndefined(exec->lexicalGlobalObject()); + return v1.asCell()->structure()->masqueradesAsUndefined(exec->lexicalGlobalObject()); } if (v1.isObject()) { @@ -824,14 +775,6 @@ ALWAYS_INLINE bool JSValue::equalSlowCaseInline(ExecState* exec, JSValue v1, JSV continue; } - bool sym1 = v1.isSymbol(); - bool sym2 = v2.isSymbol(); - if (sym1 || sym2) { - if (sym1 && sym2) - return asSymbol(v1)->privateName() == asSymbol(v2)->privateName(); - return false; - } - if (s1 || s2) { double d1 = v1.toNumber(exec); double d2 = v2.toNumber(exec); @@ -856,9 +799,7 @@ ALWAYS_INLINE bool JSValue::strictEqualSlowCaseInline(ExecState* exec, JSValue v ASSERT(v1.isCell() && v2.isCell()); if (v1.asCell()->isString() && v2.asCell()->isString()) - return WTF::equal(*asString(v1)->value(exec).impl(), *asString(v2)->value(exec).impl()); - if (v1.asCell()->isSymbol() && v2.asCell()->isSymbol()) - return asSymbol(v1)->privateName() == asSymbol(v2)->privateName(); + return asString(v1)->value(exec) == asString(v2)->value(exec); return v1 == v2; } @@ -877,13 +818,6 @@ inline bool JSValue::strictEqual(ExecState* exec, JSValue v1, JSValue v2) return strictEqualSlowCaseInline(exec, v1, v2); } -inline int32_t JSValue::asInt32ForArithmetic() const -{ - if (isBoolean()) - return asBoolean(); - return asInt32(); -} - inline TriState JSValue::pureStrictEqual(JSValue v1, JSValue v2) { if (v1.isInt32() && v2.isInt32()) @@ -900,7 +834,7 @@ inline TriState JSValue::pureStrictEqual(JSValue v1, JSValue v2) const StringImpl* v2String = asString(v2)->tryGetValueImpl(); if (!v1String || !v2String) return MixedTriState; - return triState(WTF::equal(*v1String, *v2String)); + return triState(WTF::equal(v1String, v2String)); } return triState(v1 == v2); @@ -917,14 +851,6 @@ inline TriState JSValue::pureToBoolean() const return isTrue() ? TrueTriState : FalseTriState; } -ALWAYS_INLINE bool JSValue::requireObjectCoercible(ExecState* exec) const -{ - if (!isUndefinedOrNull()) - return true; - exec->vm().throwException(exec, createNotAnObjectError(exec, *this)); - return false; -} - } // namespace JSC #endif // JSValueInlines_h |
