From 15edad8202be236794c8f274ca75f4ef603c645d Mon Sep 17 00:00:00 2001 From: davidot Date: Mon, 21 Jun 2021 16:32:07 +0200 Subject: [PATCH] LibJS: Make define_property always throw if specified Now put uses is_strict_mode to determine define_property should throw --- Userland/Libraries/LibJS/Runtime/Object.cpp | 7 +++---- .../LibJS/Tests/builtins/Array/Array.prototype.shift.js | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/Object.cpp b/Userland/Libraries/LibJS/Runtime/Object.cpp index d0bc36dcff..2997928da3 100644 --- a/Userland/Libraries/LibJS/Runtime/Object.cpp +++ b/Userland/Libraries/LibJS/Runtime/Object.cpp @@ -621,7 +621,7 @@ bool Object::put_own_property(const StringOrSymbol& property_name, Value value, if (!is_extensible() && new_property) { dbgln_if(OBJECT_DEBUG, "Disallow define_property of non-extensible object"); - if (throw_exceptions && vm().in_strict_mode()) + if (throw_exceptions) vm().throw_exception(global_object(), ErrorType::NonExtensibleDefine, property_name.to_display_string()); return false; } @@ -729,7 +729,7 @@ bool Object::put_own_property_by_index(u32 property_index, Value value, Property if (!is_extensible() && new_property) { dbgln_if(OBJECT_DEBUG, "Disallow define_property of non-extensible object"); - if (throw_exceptions && vm().in_strict_mode()) + if (throw_exceptions) vm().throw_exception(global_object(), ErrorType::NonExtensibleDefine, property_index); return false; } @@ -781,7 +781,6 @@ bool Object::delete_property(PropertyName const& property_name, bool force_throw return true; } - auto metadata = shape().lookup(property_name.to_string_or_symbol()); if (!metadata.has_value()) return true; @@ -923,7 +922,7 @@ bool Object::put(const PropertyName& property_name, Value value, Value receiver) if (vm().exception()) return false; } - return put_own_property(string_or_symbol, value, default_attributes, PutOwnPropertyMode::Put); + return put_own_property(string_or_symbol, value, default_attributes, PutOwnPropertyMode::Put, vm().in_strict_mode()); } bool Object::define_native_function(PropertyName const& property_name, AK::Function native_function, i32 length, PropertyAttributes attribute) diff --git a/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.shift.js b/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.shift.js index 57772934e5..7b2a27e45e 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.shift.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.shift.js @@ -26,7 +26,7 @@ test("Issue #5884, GenericIndexedPropertyStorage::take_first() loses elements", const a = []; for (let i = 0; i < 300; i++) { // NOTE: We use defineProperty to prevent the array from using SimpleIndexedPropertyStorage - Object.defineProperty(a, i, { value: i, writable: false }); + Object.defineProperty(a, i, { value: i, configurable: true }); } expect(a.length).toBe(300); for (let i = 0; i < 300; i++) {