diff options
author | Bradley T. Hughes <bradley.hughes@nokia.com> | 2009-06-15 09:57:36 (GMT) |
---|---|---|
committer | Bradley T. Hughes <bradley.hughes@nokia.com> | 2009-06-15 09:57:36 (GMT) |
commit | 336dfcef05cb63df0a6d550b59a4badc7a0f01c1 (patch) | |
tree | a218ec97413e0c8ebc9600ac5db9b2adea485b32 /src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp | |
parent | e44d64510e019e5d3b379b704cfb824e0d7ccc9d (diff) | |
download | Qt-336dfcef05cb63df0a6d550b59a4badc7a0f01c1.zip Qt-336dfcef05cb63df0a6d550b59a4badc7a0f01c1.tar.gz Qt-336dfcef05cb63df0a6d550b59a4badc7a0f01c1.tar.bz2 |
Merge of master
Diffstat (limited to 'src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp')
-rw-r--r-- | src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp | 84 |
1 files changed, 65 insertions, 19 deletions
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp index 6f84303..093bbec 100644 --- a/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp +++ b/src/3rdparty/webkit/JavaScriptCore/runtime/Operations.cpp @@ -35,41 +35,87 @@ namespace JSC { -// ECMA 11.9.3 -bool equal(ExecState* exec, JSValuePtr v1, JSValuePtr v2) +bool JSValue::equalSlowCase(ExecState* exec, JSValue v1, JSValue v2) { - if (JSImmediate::areBothImmediateNumbers(v1, v2)) - return v1 == v2; - return equalSlowCaseInline(exec, v1, v2); } -bool equalSlowCase(ExecState* exec, JSValuePtr v1, JSValuePtr v2) +bool JSValue::strictEqualSlowCase(JSValue v1, JSValue v2) { - return equalSlowCaseInline(exec, v1, v2); + return strictEqualSlowCaseInline(v1, v2); } -bool strictEqual(JSValuePtr v1, JSValuePtr v2) +NEVER_INLINE JSValue throwOutOfMemoryError(ExecState* exec) { - if (JSImmediate::areBothImmediate(v1, v2)) - return v1 == v2; + JSObject* error = Error::create(exec, GeneralError, "Out of memory"); + exec->setException(error); + return error; +} - if (JSImmediate::isEitherImmediate(v1, v2) & (v1 != JSImmediate::from(0)) & (v2 != JSImmediate::from(0))) - return false; +NEVER_INLINE JSValue jsAddSlowCase(CallFrame* callFrame, JSValue v1, JSValue v2) +{ + // exception for the Date exception in defaultValue() + JSValue p1 = v1.toPrimitive(callFrame); + JSValue p2 = v2.toPrimitive(callFrame); - return strictEqualSlowCaseInline(v1, v2); + if (p1.isString() || p2.isString()) { + RefPtr<UString::Rep> value = concatenate(p1.toString(callFrame).rep(), p2.toString(callFrame).rep()); + if (!value) + return throwOutOfMemoryError(callFrame); + return jsString(callFrame, value.release()); + } + + return jsNumber(callFrame, p1.toNumber(callFrame) + p2.toNumber(callFrame)); } -bool strictEqualSlowCase(JSValuePtr v1, JSValuePtr v2) +JSValue jsTypeStringForValue(CallFrame* callFrame, JSValue v) { - return strictEqualSlowCaseInline(v1, v2); + if (v.isUndefined()) + return jsNontrivialString(callFrame, "undefined"); + if (v.isBoolean()) + return jsNontrivialString(callFrame, "boolean"); + if (v.isNumber()) + return jsNontrivialString(callFrame, "number"); + if (v.isString()) + return jsNontrivialString(callFrame, "string"); + if (v.isObject()) { + // Return "undefined" for objects that should be treated + // as null when doing comparisons. + if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined()) + return jsNontrivialString(callFrame, "undefined"); + CallData callData; + if (asObject(v)->getCallData(callData) != CallTypeNone) + return jsNontrivialString(callFrame, "function"); + } + return jsNontrivialString(callFrame, "object"); } -NEVER_INLINE JSValuePtr throwOutOfMemoryError(ExecState* exec) +bool jsIsObjectType(JSValue v) { - JSObject* error = Error::create(exec, GeneralError, "Out of memory"); - exec->setException(error); - return error; + if (!v.isCell()) + return v.isNull(); + + JSType type = asCell(v)->structure()->typeInfo().type(); + if (type == NumberType || type == StringType) + return false; + if (type == ObjectType) { + if (asObject(v)->structure()->typeInfo().masqueradesAsUndefined()) + return false; + CallData callData; + if (asObject(v)->getCallData(callData) != CallTypeNone) + return false; + } + return true; +} + +bool jsIsFunctionType(JSValue v) +{ + if (v.isObject()) { + CallData callData; + if (asObject(v)->getCallData(callData) != CallTypeNone) + return true; + } + return false; } } // namespace JSC |