Skip to content

Commit 4565a28

Browse files
author
Kevin Smith
committed
[MERGE #6082 @zenparsing] Call user-defined toPrimitive on symbol objects
Merge pull request #6082 from zenparsing:symbol-to-primitive Users can override the `Symbol.toPrimitive` method on symbol wrapper objects. Fixes #6036
2 parents bcb97d1 + 3f07aff commit 4565a28

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

lib/Runtime/Language/JavascriptConversion.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,13 @@ using namespace Js;
378378
case TypeIds_SymbolObject:
379379
{
380380
JavascriptSymbolObject* symbolObject = UnsafeVarTo<JavascriptSymbolObject>(aValue);
381+
ScriptContext* objectScriptContext = symbolObject->GetScriptContext();
382+
if (objectScriptContext->optimizationOverrides.GetSideEffects() & SideEffects_ToPrimitive)
383+
{
384+
return MethodCallToPrimitive<hint>(symbolObject, requestContext);
385+
}
381386

382-
return CrossSite::MarshalVar(requestContext, symbolObject->Unwrap(), symbolObject->GetScriptContext());
387+
return CrossSite::MarshalVar(requestContext, symbolObject->Unwrap(), objectScriptContext);
383388
}
384389

385390
case TypeIds_Date:

lib/Runtime/Types/TypeHandler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,6 @@ using namespace Js;
562562
scriptContext->optimizationOverrides.SetSideEffects((SideEffects)(SideEffects_ValueOf & possibleSideEffects));
563563
scriptContext->optimizationOverrides.SetSideEffects((SideEffects)(SideEffects_ToString & possibleSideEffects));
564564
}
565-
566565
else if (propertyId == PropertyIds::valueOf)
567566
{
568567
scriptContext->optimizationOverrides.SetSideEffects((SideEffects)(SideEffects_ValueOf & possibleSideEffects));

test/es6/toPrimitive.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ var tests = [
5555
assert.areEqual(s, Object(s)[Symbol.toPrimitive](), ""); // true
5656
assert.areEqual(s, Symbol.prototype[Symbol.toPrimitive].call(s), ""); // true
5757

58+
var symbolObject = Object(s);
59+
Object.defineProperty(symbolObject, Symbol.toPrimitive, {
60+
value: function() { return 42; },
61+
configurable: true,
62+
});
63+
assert.areEqual(+symbolObject, 42, "User-defined @@toPrimitive is called on symbol objects");
64+
Object.defineProperty(symbolObject, Symbol.toPrimitive, { value: undefined });
65+
Object.defineProperty(symbolObject, 'valueOf', {
66+
value: function() { return 43; },
67+
configurable: true,
68+
});
69+
assert.areEqual(+symbolObject, 43, "OrdinaryToPrimitive is called if @@toPrimitive is undefined");
70+
5871
assert.areEqual(Symbol.toPrimitive, Symbol.toPrimitive[Symbol.toPrimitive](), "Symbol.toPrimitive");
5972
assert.areEqual(Symbol.iterator, Symbol.iterator[Symbol.toPrimitive](), "Symbol.iterator");
6073
assert.areEqual(Symbol.hasInstance, Symbol.hasInstance[Symbol.toPrimitive](), "Symbol.hasInstance");

0 commit comments

Comments
 (0)