Index: src/v8natives.js |
diff --git a/src/v8natives.js b/src/v8natives.js |
index 53a03173b3830731db7fb0ad02aa5ac7108fefdc..9843635866323d5c5495edf0ffbdb9d12400f01e 100644 |
--- a/src/v8natives.js |
+++ b/src/v8natives.js |
@@ -663,7 +663,8 @@ function DefineProxyProperty(obj, p, attributes, should_throw) { |
var result = %_CallFunction(handler, p, attributes, defineProperty); |
if (!ToBoolean(result)) { |
if (should_throw) { |
- throw MakeTypeError("handler_failed", [handler, "defineProperty"]); |
+ throw MakeTypeError("handler_returned_false", |
+ [handler, "defineProperty"]); |
} else { |
return false; |
} |
@@ -1020,11 +1021,30 @@ function ObjectDefineProperties(obj, properties) { |
} |
+// Harmony proxies. |
+function ProxyFix(obj) { |
+ var handler = %GetHandler(obj); |
+ var fix = handler.fix; |
+ if (IS_UNDEFINED(fix)) { |
+ throw MakeTypeError("handler_trap_missing", [handler, "fix"]); |
+ } |
+ var props = %_CallFunction(handler, fix); |
+ if (IS_UNDEFINED(props)) { |
+ throw MakeTypeError("handler_returned_undefined", [handler, "fix"]); |
+ } |
+ %Fix(obj); |
+ ObjectDefineProperties(obj, props); |
+} |
+ |
+ |
// ES5 section 15.2.3.8. |
function ObjectSeal(obj) { |
if (!IS_SPEC_OBJECT(obj)) { |
throw MakeTypeError("obj_ctor_property_non_object", ["seal"]); |
} |
+ if (%IsJSProxy(obj)) { |
+ ProxyFix(obj); |
+ } |
var names = ObjectGetOwnPropertyNames(obj); |
for (var i = 0; i < names.length; i++) { |
var name = names[i]; |
@@ -1034,7 +1054,8 @@ function ObjectSeal(obj) { |
DefineOwnProperty(obj, name, desc, true); |
} |
} |
- return ObjectPreventExtension(obj); |
+ %PreventExtensions(obj); |
+ return obj; |
} |
@@ -1043,6 +1064,9 @@ function ObjectFreeze(obj) { |
if (!IS_SPEC_OBJECT(obj)) { |
throw MakeTypeError("obj_ctor_property_non_object", ["freeze"]); |
} |
+ if (%IsJSProxy(obj)) { |
+ ProxyFix(obj); |
+ } |
var names = ObjectGetOwnPropertyNames(obj); |
for (var i = 0; i < names.length; i++) { |
var name = names[i]; |
@@ -1053,7 +1077,8 @@ function ObjectFreeze(obj) { |
DefineOwnProperty(obj, name, desc, true); |
} |
} |
- return ObjectPreventExtension(obj); |
+ %PreventExtensions(obj); |
+ return obj; |
} |
@@ -1062,6 +1087,9 @@ function ObjectPreventExtension(obj) { |
if (!IS_SPEC_OBJECT(obj)) { |
throw MakeTypeError("obj_ctor_property_non_object", ["preventExtension"]); |
} |
+ if (%IsJSProxy(obj)) { |
+ ProxyFix(obj); |
+ } |
%PreventExtensions(obj); |
return obj; |
} |
@@ -1072,6 +1100,9 @@ function ObjectIsSealed(obj) { |
if (!IS_SPEC_OBJECT(obj)) { |
throw MakeTypeError("obj_ctor_property_non_object", ["isSealed"]); |
} |
+ if (%IsJSProxy(obj)) { |
+ return false; |
+ } |
var names = ObjectGetOwnPropertyNames(obj); |
for (var i = 0; i < names.length; i++) { |
var name = names[i]; |
@@ -1090,6 +1121,9 @@ function ObjectIsFrozen(obj) { |
if (!IS_SPEC_OBJECT(obj)) { |
throw MakeTypeError("obj_ctor_property_non_object", ["isFrozen"]); |
} |
+ if (%IsJSProxy(obj)) { |
+ return false; |
+ } |
var names = ObjectGetOwnPropertyNames(obj); |
for (var i = 0; i < names.length; i++) { |
var name = names[i]; |
@@ -1109,6 +1143,9 @@ function ObjectIsExtensible(obj) { |
if (!IS_SPEC_OBJECT(obj)) { |
throw MakeTypeError("obj_ctor_property_non_object", ["isExtensible"]); |
} |
+ if (%IsJSProxy(obj)) { |
+ return true; |
+ } |
return %IsExtensible(obj); |
} |