diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-12-14 15:02:32 -0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-12-14 15:02:32 -0800 |
commit | b3a7de15b7f06e11bd326b60b0e5ffd762ae71c5 (patch) | |
tree | 5bd6feac02a7c9eed1fbc03fc678e952ab3a852f /deps/v8/src/v8natives.js | |
parent | be23c51f6979ef5fd519069a62648d81f25b2ec0 (diff) | |
download | node-new-b3a7de15b7f06e11bd326b60b0e5ffd762ae71c5.tar.gz |
Upgrade V8 to 3.8.0
Diffstat (limited to 'deps/v8/src/v8natives.js')
-rw-r--r-- | deps/v8/src/v8natives.js | 106 |
1 files changed, 100 insertions, 6 deletions
diff --git a/deps/v8/src/v8natives.js b/deps/v8/src/v8natives.js index 11b1a7eeb0..1d54e28e97 100644 --- a/deps/v8/src/v8natives.js +++ b/deps/v8/src/v8natives.js @@ -660,6 +660,21 @@ function GetOwnProperty(obj, v) { } +// ES5 section 8.12.7. +function Delete(obj, p, should_throw) { + var desc = GetOwnProperty(obj, p); + if (IS_UNDEFINED(desc)) return true; + if (desc.isConfigurable()) { + %DeleteProperty(obj, p, 0); + return true; + } else if (should_throw) { + throw MakeTypeError("define_disallowed", [p]); + } else { + return; + } +} + + // Harmony proxies. function DefineProxyProperty(obj, p, attributes, should_throw) { var handler = %GetHandler(obj); @@ -677,12 +692,7 @@ function DefineProxyProperty(obj, p, attributes, should_throw) { // ES5 8.12.9. -function DefineOwnProperty(obj, p, desc, should_throw) { - if (%IsJSProxy(obj)) { - var attributes = FromGenericPropertyDescriptor(desc); - return DefineProxyProperty(obj, p, attributes, should_throw); - } - +function DefineObjectProperty(obj, p, desc, should_throw) { 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; @@ -846,6 +856,90 @@ function DefineOwnProperty(obj, p, desc, should_throw) { } +// ES5 section 15.4.5.1. +function DefineArrayProperty(obj, p, desc, should_throw) { + // Note that the length of an array is not actually stored as part of the + // property, hence we use generated code throughout this function instead of + // DefineObjectProperty() to modify its value. + + // Step 3 - Special handling for length property. + if (p == "length") { + var length = obj.length; + if (!desc.hasValue()) { + return DefineObjectProperty(obj, "length", desc, should_throw); + } + var new_length = ToUint32(desc.getValue()); + if (new_length != ToNumber(desc.getValue())) { + throw new $RangeError('defineProperty() array length out of range'); + } + var length_desc = GetOwnProperty(obj, "length"); + if (new_length != length && !length_desc.isWritable()) { + if (should_throw) { + throw MakeTypeError("redefine_disallowed", [p]); + } else { + return false; + } + } + var threw = false; + while (new_length < length--) { + if (!Delete(obj, ToString(length), false)) { + new_length = length + 1; + threw = true; + break; + } + } + // Make sure the below call to DefineObjectProperty() doesn't overwrite + // any magic "length" property by removing the value. + obj.length = new_length; + desc.value_ = void 0; + desc.hasValue_ = false; + if (!DefineObjectProperty(obj, "length", desc, should_throw) || threw) { + if (should_throw) { + throw MakeTypeError("redefine_disallowed", [p]); + } else { + return false; + } + } + return true; + } + + // Step 4 - Special handling for array index. + var index = ToUint32(p); + if (index == ToNumber(p) && index != 4294967295) { + var length = obj.length; + var length_desc = GetOwnProperty(obj, "length"); + if ((index >= length && !length_desc.isWritable()) || + !DefineObjectProperty(obj, p, desc, true)) { + if (should_throw) { + throw MakeTypeError("define_disallowed", [p]); + } else { + return false; + } + } + if (index >= length) { + obj.length = index + 1; + } + return true; + } + + // Step 5 - Fallback to default implementation. + return DefineObjectProperty(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)) { + var attributes = FromGenericPropertyDescriptor(desc); + return DefineProxyProperty(obj, p, attributes, should_throw); + } else if (IS_ARRAY(obj)) { + return DefineArrayProperty(obj, p, desc, should_throw); + } else { + return DefineObjectProperty(obj, p, desc, should_throw); + } +} + + // ES5 section 15.2.3.2. function ObjectGetPrototypeOf(obj) { if (!IS_SPEC_OBJECT(obj)) { |