Index: src/runtime.js |
=================================================================== |
--- src/runtime.js (revision 3785) |
+++ src/runtime.js (working copy) |
@@ -506,6 +506,16 @@ |
} |
+// ECMA-262, section 9.2, page 30 |
+function ToBoolean(x) { |
+ if (IS_BOOLEAN(x)) return x; |
+ if (IS_STRING(x)) return x.length != 0; |
+ if (x == null) return false; |
+ if (IS_NUMBER(x)) return !((x == 0) || NUMBER_IS_NAN(x)); |
+ return true; |
+} |
+ |
+ |
// ECMA-262, section 9.3, page 31. |
function ToNumber(x) { |
if (IS_NUMBER(x)) return x; |
@@ -526,16 +536,6 @@ |
} |
-// ... where did this come from? |
-function ToBoolean(x) { |
- if (IS_BOOLEAN(x)) return x; |
- if (IS_STRING(x)) return x.length != 0; |
- if (x == null) return false; |
- if (IS_NUMBER(x)) return !((x == 0) || NUMBER_IS_NAN(x)); |
- return true; |
-} |
- |
- |
// ECMA-262, section 9.9, page 36. |
function ToObject(x) { |
if (IS_STRING(x)) return new $String(x); |
@@ -569,7 +569,26 @@ |
} |
+// ES5, section 9.12 |
+function SameValue(x, y) { |
+ if (typeof x != typeof y) return false; |
+ if (IS_NULL_OR_UNDEFINED(x)) return true; |
+ if (IS_NUMBER(x)) { |
+ if (NUMBER_IS_NAN(x) && NUMBER_IS_NAN(y)) return true; |
+ // x is +0 and y is -0 or vice versa |
+ if (x === 0 && y === 0 && !%_IsSmi(x) && !%_IsSmi(y) && |
+ ((1 / x < 0 && 1 / y > 0) || (1 / x > 0 && 1 / y < 0))) { |
+ return false; |
+ } |
+ return x == y; |
+ } |
+ if (IS_STRING(x)) return %StringEquals(x, y); |
+ if (IS_BOOLEAN(x))return %NumberEquals(%ToNumber(x),%ToNumber(y)); |
+ return %_ObjectEquals(x, y); |
+} |
+ |
+ |
/* --------------------------------- |
- - - U t i l i t i e s - - - |
--------------------------------- |