Index: src/v8natives.js |
=================================================================== |
--- src/v8natives.js (revision 6628) |
+++ src/v8natives.js (working copy) |
@@ -491,28 +491,29 @@ |
} |
+// Converts an array returned from Runtime_GetOwnProperty to an actual |
+// property descriptor. For a description of the array layout please |
+// see the runtime.cc file. |
+function ConvertDescriptorArrayToDescriptor(desc_array) { |
+ if (desc_array == false) { |
+ throw 'Internal error: invalid desc_array'; |
+ } |
-// ES5 section 8.12.1. |
-function GetOwnProperty(obj, p) { |
+ if (IS_UNDEFINED(desc_array)) { |
+ return void 0; |
+ } |
+ |
var desc = new PropertyDescriptor(); |
- |
- // GetOwnProperty returns an array indexed by the constants |
- // defined in macros.py. |
- // If p is not a property on obj undefined is returned. |
- var props = %GetOwnProperty(ToObject(obj), ToString(p)); |
- |
- if (IS_UNDEFINED(props)) return void 0; |
- |
- // This is an accessor |
- if (props[IS_ACCESSOR_INDEX]) { |
- desc.setGet(props[GETTER_INDEX]); |
- desc.setSet(props[SETTER_INDEX]); |
+ // This is an accessor. |
+ if (desc_array[IS_ACCESSOR_INDEX]) { |
+ desc.setGet(desc_array[GETTER_INDEX]); |
+ desc.setSet(desc_array[SETTER_INDEX]); |
} else { |
- desc.setValue(props[VALUE_INDEX]); |
- desc.setWritable(props[WRITABLE_INDEX]); |
+ desc.setValue(desc_array[VALUE_INDEX]); |
+ desc.setWritable(desc_array[WRITABLE_INDEX]); |
} |
- desc.setEnumerable(props[ENUMERABLE_INDEX]); |
- desc.setConfigurable(props[CONFIGURABLE_INDEX]); |
+ desc.setEnumerable(desc_array[ENUMERABLE_INDEX]); |
+ desc.setConfigurable(desc_array[CONFIGURABLE_INDEX]); |
return desc; |
} |
@@ -535,9 +536,27 @@ |
} |
+// ES5 section 8.12.1. |
+function GetOwnProperty(obj, p) { |
+ // GetOwnProperty returns an array indexed by the constants |
+ // defined in macros.py. |
+ // If p is not a property on obj undefined is returned. |
+ var props = %GetOwnProperty(ToObject(obj), ToString(p)); |
+ |
+ // A false value here means that access checks failed. |
+ if (props == false) return void 0; |
+ |
+ return ConvertDescriptorArrayToDescriptor(props); |
+} |
+ |
+ |
// ES5 8.12.9. |
function DefineOwnProperty(obj, p, desc, should_throw) { |
- var current = GetOwnProperty(obj, p); |
+ var current_or_access = %GetOwnProperty(ToObject(obj), ToString(p)); |
+ // A false value here means that access checks failed. |
+ if (current_or_access == false) return void 0; |
+ |
+ var current = ConvertDescriptorArrayToDescriptor(current_or_access); |
var extensible = %IsExtensible(ToObject(obj)); |
// Error handling according to spec. |