diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/JSCJSValueInlines.h | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSCJSValueInlines.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/JSCJSValueInlines.h | 189 |
1 files changed, 43 insertions, 146 deletions
diff --git a/Source/JavaScriptCore/runtime/JSCJSValueInlines.h b/Source/JavaScriptCore/runtime/JSCJSValueInlines.h index 6ce961517..b34adf809 100644 --- a/Source/JavaScriptCore/runtime/JSCJSValueInlines.h +++ b/Source/JavaScriptCore/runtime/JSCJSValueInlines.h @@ -26,14 +26,10 @@ #ifndef JSValueInlines_h #define JSValueInlines_h -#include "ExceptionHelpers.h" -#include "Identifier.h" #include "InternalFunction.h" #include "JSCJSValue.h" #include "JSCellInlines.h" -#include "JSObject.h" #include "JSFunction.h" -#include <wtf/text/StringImpl.h> namespace JSC { @@ -46,7 +42,7 @@ ALWAYS_INLINE int32_t JSValue::toInt32(ExecState* exec) const inline uint32_t JSValue::toUInt32(ExecState* exec) const { - // See comment on JSC::toUInt32, in JSCJSValue.h. + // See comment on JSC::toUInt32, above. return toInt32(exec); } @@ -69,7 +65,7 @@ inline double JSValue::asNumber() const inline JSValue jsNaN() { - return JSValue(PNaN); + return JSValue(QNaN); } inline JSValue::JSValue(char i) @@ -214,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 @@ -305,7 +301,6 @@ ALWAYS_INLINE JSCell* JSValue::asCell() const ALWAYS_INLINE JSValue::JSValue(EncodeAsDoubleTag, double d) { - ASSERT(!isImpureNaN(d)); u.asDouble = d; } @@ -315,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; @@ -330,7 +325,7 @@ inline bool JSValue::isNumber() const inline bool JSValue::isBoolean() const { - return tag() == BooleanTag; + return isTrue() || isFalse(); } inline bool JSValue::asBoolean() const @@ -363,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 @@ -472,7 +467,6 @@ inline double reinterpretInt64ToDouble(int64_t value) ALWAYS_INLINE JSValue::JSValue(EncodeAsDoubleTag, double d) { - ASSERT(!isImpureNaN(d)); u.asInt64 = reinterpretDoubleToInt64(d) + DoubleEncodeOffset; } @@ -500,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 @@ -552,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 @@ -567,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(); @@ -612,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(); @@ -653,7 +608,7 @@ inline bool JSValue::getPrimitiveNumber(ExecState* exec, double& number, JSValue return true; } ASSERT(isUndefined()); - number = PNaN; + number = QNaN; value = *this; return true; } @@ -682,16 +637,6 @@ inline bool JSValue::isFunction() const return isCell() && (asCell()->inherits(JSFunction::info()) || asCell()->inherits(InternalFunction::info())); } -// FIXME: We could do this in a smarter way. See: https://bugs.webkit.org/show_bug.cgi?id=153670 -inline bool JSValue::isConstructor() const -{ - if (isFunction()) { - ConstructData data; - return getConstructData(*this, data) != ConstructTypeNone; - } - return false; -} - // this method is here to be after the inline declaration of JSCell::inherits inline bool JSValue::inherits(const ClassInfo* classInfo) const { @@ -700,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(), PropertySlot::InternalMethodType::Get); + 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(), PropertySlot::InternalMethodType::Get); + 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 @@ -759,25 +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); -} - -ALWAYS_INLINE void JSValue::putInline(ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot) -{ - if (UNLIKELY(!isCell())) { - putToPrimitive(exec, propertyName, value, slot); - return; - } - JSCell* cell = asCell(); - auto putMethod = cell->methodTable(exec->vm())->put; - if (LIKELY(putMethod == JSObject::put)) { - JSObject::putInline(cell, exec, propertyName, value, slot); - return; - } - - PutPropertySlot otherSlot = slot; - putMethod(cell, exec, propertyName, value, otherSlot); - slot = otherSlot; + asCell()->methodTable()->put(asCell(), exec, propertyName, value, slot); } inline void JSValue::putByIndex(ExecState* exec, unsigned propertyName, JSValue value, bool shouldThrow) @@ -786,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 @@ -807,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(); @@ -815,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()) { @@ -853,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); @@ -885,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; } @@ -906,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()) @@ -929,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); @@ -946,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 |