| 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);
|
| }
|
|
|
|
|