Index: src/v8natives.js |
diff --git a/src/v8natives.js b/src/v8natives.js |
index a382350f242c3c4375bbf82f3f8ee4d47115219c..3d237e20e7810ade8793f993c691130f14355894 100644 |
--- a/src/v8natives.js |
+++ b/src/v8natives.js |
@@ -256,6 +256,9 @@ function ObjectValueOf() { |
// ECMA-262 - 15.2.4.5 |
function ObjectHasOwnProperty(V) { |
if (%IsJSProxy(this)) { |
+ // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
+ if (IS_SYMBOL(V)) return false; |
+ |
var handler = %GetHandler(this); |
return CallTrap1(handler, "hasOwn", DerivedHasOwnTrap, ToName(V)); |
} |
@@ -278,6 +281,9 @@ function ObjectIsPrototypeOf(V) { |
function ObjectPropertyIsEnumerable(V) { |
var P = ToName(V); |
if (%IsJSProxy(this)) { |
+ // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
+ if (IS_SYMBOL(V)) return false; |
+ |
var desc = GetOwnProperty(this, P); |
return IS_UNDEFINED(desc) ? false : desc.isEnumerable(); |
} |
@@ -645,6 +651,9 @@ function CallTrap2(handler, name, defaultTrap, x, y) { |
function GetOwnProperty(obj, v) { |
var p = ToName(v); |
if (%IsJSProxy(obj)) { |
+ // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
+ if (IS_SYMBOL(v)) return void 0; |
+ |
var handler = %GetHandler(obj); |
var descriptor = CallTrap1(handler, "getOwnPropertyDescriptor", void 0, p); |
if (IS_UNDEFINED(descriptor)) return descriptor; |
@@ -685,6 +694,9 @@ function Delete(obj, p, should_throw) { |
// Harmony proxies. |
function DefineProxyProperty(obj, p, attributes, should_throw) { |
+ // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
+ if (IS_SYMBOL(p)) return false; |
+ |
var handler = %GetHandler(obj); |
var result = CallTrap2(handler, "defineProperty", void 0, p, attributes); |
if (!ToBoolean(result)) { |
@@ -950,6 +962,9 @@ function DefineArrayProperty(obj, p, desc, should_throw) { |
// ES5 section 8.12.9, ES5 section 15.4.5.1 and Harmony proxies. |
function DefineOwnProperty(obj, p, desc, should_throw) { |
if (%IsJSProxy(obj)) { |
+ // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
+ if (IS_SYMBOL(p)) return false; |
+ |
var attributes = FromGenericPropertyDescriptor(desc); |
return DefineProxyProperty(obj, p, attributes, should_throw); |
} else if (IS_ARRAY(obj)) { |
@@ -987,16 +1002,20 @@ function ToNameArray(obj, trap, includeSymbols) { |
} |
var n = ToUint32(obj.length); |
var array = new $Array(n); |
+ var realLength = 0; |
var names = { __proto__: null }; // TODO(rossberg): use sets once ready. |
for (var index = 0; index < n; index++) { |
var s = ToName(obj[index]); |
+ // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
if (IS_SYMBOL(s) && !includeSymbols) continue; |
if (%HasLocalProperty(names, s)) { |
throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]); |
} |
array[index] = s; |
+ ++realLength; |
names[s] = 0; |
} |
+ array.length = realLength; |
return array; |
} |
@@ -1010,7 +1029,7 @@ function ObjectGetOwnPropertyNames(obj) { |
if (%IsJSProxy(obj)) { |
var handler = %GetHandler(obj); |
var names = CallTrap0(handler, "getOwnPropertyNames", void 0); |
- return ToNameArray(names, "getOwnPropertyNames", true); |
+ return ToNameArray(names, "getOwnPropertyNames", false); |
} |
var nameArrays = new InternalArray(); |
@@ -1036,7 +1055,7 @@ function ObjectGetOwnPropertyNames(obj) { |
// Find all the named properties. |
// Get the local property names. |
- nameArrays.push(%GetLocalPropertyNames(obj)); |
+ nameArrays.push(%GetLocalPropertyNames(obj, false)); |
// Get names for named interceptor properties if any. |
if ((interceptorInfo & 2) != 0) { |
@@ -1056,7 +1075,8 @@ function ObjectGetOwnPropertyNames(obj) { |
var propertySet = { __proto__: null }; |
var j = 0; |
for (var i = 0; i < propertyNames.length; ++i) { |
- var name = ToName(propertyNames[i]); |
+ if (IS_SYMBOL(propertyNames[i])) continue; |
+ var name = ToString(propertyNames[i]); |
// We need to check for the exact property value since for intrinsic |
// properties like toString if(propertySet["toString"]) will always |
// succeed. |