X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9bcd318d5fa2a38139c9651d263a06c797529333..ba379fdc102753d6be2c4d937058fe40257329fe:/runtime/JSValue.cpp diff --git a/runtime/JSValue.cpp b/runtime/JSValue.cpp index f549bff..39a4093 100644 --- a/runtime/JSValue.cpp +++ b/runtime/JSValue.cpp @@ -23,29 +23,114 @@ #include "config.h" #include "JSValue.h" +#include "BooleanConstructor.h" +#include "BooleanPrototype.h" +#include "ExceptionHelpers.h" +#include "JSGlobalObject.h" #include "JSFunction.h" +#include "JSNotAnObject.h" +#include "NumberObject.h" #include +#include namespace JSC { static const double D32 = 4294967296.0; // ECMA 9.4 -double JSValuePtr::toInteger(ExecState* exec) const +double JSValue::toInteger(ExecState* exec) const { - if (isInt32Fast()) - return getInt32Fast(); + if (isInt32()) + return asInt32(); double d = toNumber(exec); return isnan(d) ? 0.0 : trunc(d); } -double JSValuePtr::toIntegerPreserveNaN(ExecState* exec) const +double JSValue::toIntegerPreserveNaN(ExecState* exec) const { - if (isInt32Fast()) - return getInt32Fast(); + if (isInt32()) + return asInt32(); return trunc(toNumber(exec)); } +JSObject* JSValue::toObjectSlowCase(ExecState* exec) const +{ + ASSERT(!isCell()); + + if (isInt32() || isDouble()) + return constructNumber(exec, asValue()); + if (isTrue() || isFalse()) + return constructBooleanFromImmediateBoolean(exec, asValue()); + ASSERT(isUndefinedOrNull()); + JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, isNull()); + exec->setException(exception); + return new (exec) JSNotAnObject(exec, exception); +} + +JSObject* JSValue::toThisObjectSlowCase(ExecState* exec) const +{ + ASSERT(!isCell()); + + if (isInt32() || isDouble()) + return constructNumber(exec, asValue()); + if (isTrue() || isFalse()) + return constructBooleanFromImmediateBoolean(exec, asValue()); + ASSERT(isUndefinedOrNull()); + return exec->globalThisValue(); +} + +JSObject* JSValue::synthesizeObject(ExecState* exec) const +{ + ASSERT(!isCell()); + if (isNumber()) + return constructNumber(exec, asValue()); + if (isBoolean()) + return constructBooleanFromImmediateBoolean(exec, asValue()); + + JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, isNull()); + exec->setException(exception); + return new (exec) JSNotAnObject(exec, exception); +} + +JSObject* JSValue::synthesizePrototype(ExecState* exec) const +{ + ASSERT(!isCell()); + if (isNumber()) + return exec->lexicalGlobalObject()->numberPrototype(); + if (isBoolean()) + return exec->lexicalGlobalObject()->booleanPrototype(); + + JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, isNull()); + exec->setException(exception); + return new (exec) JSNotAnObject(exec, exception); +} + +#ifndef NDEBUG +char* JSValue::description() +{ + static const size_t size = 32; + static char description[size]; + if (isInt32()) + snprintf(description, size, "Int32: %d", asInt32()); + else if (isDouble()) + snprintf(description, size, "Double: %lf", asDouble()); + else if (isCell()) + snprintf(description, size, "Cell: %p", asCell()); + else if (isTrue()) + snprintf(description, size, "True"); + else if (isFalse()) + snprintf(description, size, "False"); + else if (isNull()) + snprintf(description, size, "Null"); + else { + ASSERT(isUndefined()); + snprintf(description, size, "Undefined"); + } + + return description; +} +#endif + int32_t toInt32SlowCase(double d, bool& ok) { ok = true; @@ -84,4 +169,9 @@ uint32_t toUInt32SlowCase(double d, bool& ok) return static_cast(d32); } +NEVER_INLINE double nonInlineNaN() +{ + return std::numeric_limits::quiet_NaN(); +} + } // namespace JSC