···4141 jsval_t tval; // holds last parsed numeric or string literal value
4242 jsval_t scope; // current scope
4343 jsval_t global; // global root object
4444+ jsval_t object; // global object prototype
4445 jsval_t this_val; // 'this' value for currently executing function
4546 jsval_t super_val; // 'super' value for class methods
4647 jsval_t new_target; // constructor called with 'new', undefined otherwise
···11+let d = new Date();
22+33+// Test 1: Default behavior
44+console.log(d[Symbol.toPrimitive]('default')); // Should call toString
55+66+// Test 2: String hint
77+console.log(d[Symbol.toPrimitive]('string')); // Should call toString
88+99+// Test 3: Number hint
1010+console.log(d[Symbol.toPrimitive]('number')); // Should call valueOf (timestamp)
1111+1212+// Test 4: Coercion tests
1313+console.log(d + ''); // Uses default hint -> string
1414+console.log(+d); // Uses number hint -> number
1515+console.log(d - 0); // Uses number hint -> number
1616+1717+// Test 5: Verify order - SAVE ORIGINAL METHODS FIRST
1818+const originalValueOf = Date.prototype.valueOf;
1919+const originalToString = Date.prototype.toString;
2020+2121+Date.prototype.valueOf = function () {
2222+ console.log('valueOf called');
2323+ return originalValueOf.call(this); // Call the SAVED original
2424+};
2525+Date.prototype.toString = function () {
2626+ console.log('toString called');
2727+ return originalToString.call(this); // Call the SAVED original
2828+};
2929+3030+let d2 = new Date();
3131+console.log('\nTesting string hint:');
3232+d2[Symbol.toPrimitive]('string'); // Should log: toString only (returns primitive)
3333+3434+console.log('\nTesting number hint:');
3535+d2[Symbol.toPrimitive]('number'); // Should log: valueOf only (returns primitive)
3636+3737+console.log('\nTesting default hint:');
3838+d2[Symbol.toPrimitive]('default'); // Should log: toString only (returns primitive)
3939+4040+// Restore original methods
4141+Date.prototype.valueOf = originalValueOf;
4242+Date.prototype.toString = originalToString;
+35
tests/sym_id.js
···11+console.log('=== SYMBOL KEY STRINGIFICATION TEST ===\n');
22+33+const obj = {};
44+55+obj[Symbol.iterator] = 'iter-value';
66+obj[Symbol.asyncIterator] = 'async-iter-value';
77+obj[Symbol.toStringTag] = 'tag-value';
88+obj[Symbol.hasInstance] = 'has-instance-value';
99+obj[Symbol.observable] = 'observable-value';
1010+obj[Symbol.toPrimitive] = 'to-primitive-value';
1111+obj[Symbol('custom')] = 'custom-value';
1212+obj[Symbol()] = 'anonymous-value';
1313+obj.normalKey = 'normal-value';
1414+1515+console.log('Object with symbol keys:');
1616+console.log(obj);
1717+1818+console.log('\nIndividual access:');
1919+console.log(' [Symbol.iterator]: ' + obj[Symbol.iterator]);
2020+console.log(' [Symbol.toStringTag]: ' + obj[Symbol.toStringTag]);
2121+2222+console.log('\nObject.keys (should NOT include symbols):');
2323+console.log(Object.keys(obj));
2424+2525+console.log('\nObject.getOwnPropertySymbols (if supported):');
2626+try {
2727+ console.log(Object.getOwnPropertySymbols(obj));
2828+} catch (e) {
2929+ console.log(' Not supported: ' + e.message);
3030+}
3131+3232+console.log('\nJSON.stringify (symbols should be skipped):');
3333+console.log(JSON.stringify(obj));
3434+3535+console.log('\n=== DONE ===');