Index: src/json.js |
diff --git a/src/json.js b/src/json.js |
index 0799deadfe957f9bf598cbfc3006d25eb60e6a2b..fc4b58decaf67b7335812377b2f1c6a8f25eb2a7 100644 |
--- a/src/json.js |
+++ b/src/json.js |
@@ -213,14 +213,21 @@ function JSONStringify(value, replacer, space) { |
if (IS_ARRAY(replacer)) { |
// Deduplicate replacer array items. |
var property_list = new InternalArray(); |
- var seen_properties = {}; |
+ var seen_properties = { __proto__: null }; |
+ var seen_sentinel = {}; |
var length = replacer.length; |
for (var i = 0; i < length; i++) { |
var item = replacer[i]; |
- if (IS_NUMBER(item)) item = %_NumberToString(item); |
- if (IS_STRING(item) && !(item in seen_properties)) { |
+ if (IS_STRING_WRAPPER(item)) { |
+ item = ToString(item); |
+ } else { |
+ if (IS_NUMBER_WRAPPER(item)) item = ToNumber(item); |
+ if (IS_NUMBER(item)) item = %_NumberToString(item); |
+ } |
+ if (IS_STRING(item) && seen_properties[item] != seen_sentinel) { |
property_list.push(item); |
- seen_properties[item] = true; |
+ // We cannot use true here because __proto__ needs to be an object. |
+ seen_properties[item] = seen_sentinel; |
} |
} |
replacer = property_list; |