| Index: src/runtime.js
|
| diff --git a/src/runtime.js b/src/runtime.js
|
| index 8f4388a453aa0c9380652a9cb2bd1603ba9efe62..22f888d814194c92216cd933f3310c627ef664a5 100644
|
| --- a/src/runtime.js
|
| +++ b/src/runtime.js
|
| @@ -69,16 +69,24 @@ function EQUALS(y) {
|
| } else if (IS_STRING(x)) {
|
| while (true) {
|
| if (IS_STRING(y)) return %StringEquals(x, y);
|
| + if (IS_SYMBOL(y)) return 1; // not equal
|
| if (IS_NUMBER(y)) return %NumberEquals(%ToNumber(x), y);
|
| if (IS_BOOLEAN(y)) return %NumberEquals(%ToNumber(x), %ToNumber(y));
|
| if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal
|
| y = %ToPrimitive(y, NO_HINT);
|
| }
|
| + } else if (IS_SYMBOL(x)) {
|
| + while (true) {
|
| + if (IS_SYMBOL(y)) return %_ObjectEquals(x, y) ? 0 : 1;
|
| + if (!IS_SPEC_OBJECT(y)) return 1; // not equal
|
| + y = %ToPrimitive(y, NO_HINT);
|
| + }
|
| } else if (IS_BOOLEAN(x)) {
|
| if (IS_BOOLEAN(y)) return %_ObjectEquals(x, y) ? 0 : 1;
|
| if (IS_NULL_OR_UNDEFINED(y)) return 1;
|
| if (IS_NUMBER(y)) return %NumberEquals(%ToNumber(x), y);
|
| if (IS_STRING(y)) return %NumberEquals(%ToNumber(x), %ToNumber(y));
|
| + if (IS_SYMBOL(y)) return 1; // not equal
|
| // y is object.
|
| x = %ToNumber(x);
|
| y = %ToPrimitive(y, NO_HINT);
|
| @@ -508,6 +516,7 @@ function ToPrimitive(x, hint) {
|
| if (IS_STRING(x)) return x;
|
| // Normal behavior.
|
| if (!IS_SPEC_OBJECT(x)) return x;
|
| + if (IS_SYMBOL_WRAPPER(x)) return %_ValueOf(x);
|
| if (hint == NO_HINT) hint = (IS_DATE(x)) ? STRING_HINT : NUMBER_HINT;
|
| return (hint == NUMBER_HINT) ? %DefaultNumber(x) : %DefaultString(x);
|
| }
|
|
|