diff options
author | Idan Horowitz <idan.horowitz@gmail.com> | 2021-07-06 01:15:50 +0300 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-07-06 14:20:30 +0100 |
commit | e3ef2411086488ebdb8d193bcefd06cd77372d09 (patch) | |
tree | 6323321e9e8105be9d1278dbd03992876beafeaa | |
parent | 53f70e520889a58a75e243cb93ed14f08416cf8a (diff) | |
download | serenity-e3ef2411086488ebdb8d193bcefd06cd77372d09.zip |
LibJS: Remove the non-standard put helper and replace it's usages
This removes all usages of the non-standard put helper method and
replaces all of it's usages with the specification required alternative
or with define_direct_property where appropriate.
15 files changed, 40 insertions, 49 deletions
diff --git a/Userland/Applications/Spreadsheet/JSIntegration.cpp b/Userland/Applications/Spreadsheet/JSIntegration.cpp index b40f1fa976..1d44868d3a 100644 --- a/Userland/Applications/Spreadsheet/JSIntegration.cpp +++ b/Userland/Applications/Spreadsheet/JSIntegration.cpp @@ -265,8 +265,8 @@ JS_DEFINE_NATIVE_FUNCTION(SheetGlobalObject::parse_cell_name) return JS::js_undefined(); auto object = JS::Object::create(global_object, global_object.object_prototype()); - object->put("column", JS::js_string(vm, sheet_object->m_sheet.column(position.value().column))); - object->put("row", JS::Value((unsigned)position.value().row)); + object->define_direct_property("column", JS::js_string(vm, sheet_object->m_sheet.column(position.value().column)), JS::default_attributes); + object->define_direct_property("row", JS::Value((unsigned)position.value().row), JS::default_attributes); return object; } @@ -295,8 +295,8 @@ JS_DEFINE_NATIVE_FUNCTION(SheetGlobalObject::current_cell_position) auto position = current_cell->position(); auto object = JS::Object::create(global_object, global_object.object_prototype()); - object->put("column", JS::js_string(vm, sheet_object->m_sheet.column(position.column))); - object->put("row", JS::Value((unsigned)position.row)); + object->define_direct_property("column", JS::js_string(vm, sheet_object->m_sheet.column(position.column)), JS::default_attributes); + object->define_direct_property("row", JS::Value((unsigned)position.row), JS::default_attributes); return object; } diff --git a/Userland/Applications/Spreadsheet/Spreadsheet.cpp b/Userland/Applications/Spreadsheet/Spreadsheet.cpp index 95ddffcbca..12d2670c3a 100644 --- a/Userland/Applications/Spreadsheet/Spreadsheet.cpp +++ b/Userland/Applications/Spreadsheet/Spreadsheet.cpp @@ -42,8 +42,8 @@ Sheet::Sheet(Workbook& workbook) JS::DeferGC defer_gc(m_workbook.interpreter().heap()); m_global_object = m_workbook.interpreter().heap().allocate_without_global_object<SheetGlobalObject>(*this); global_object().initialize_global_object(); - global_object().put("workbook", m_workbook.workbook_object()); - global_object().put("thisSheet", &global_object()); // Self-reference is unfortunate, but required. + global_object().define_direct_property("workbook", m_workbook.workbook_object(), JS::default_attributes); + global_object().define_direct_property("thisSheet", &global_object(), JS::default_attributes); // Self-reference is unfortunate, but required. // Sadly, these have to be evaluated once per sheet. auto file_or_error = Core::File::open("/res/js/Spreadsheet/runtime.js", Core::OpenMode::ReadOnly); diff --git a/Userland/Applications/Spreadsheet/Workbook.cpp b/Userland/Applications/Spreadsheet/Workbook.cpp index c72cf1770b..1960cde984 100644 --- a/Userland/Applications/Spreadsheet/Workbook.cpp +++ b/Userland/Applications/Spreadsheet/Workbook.cpp @@ -38,7 +38,7 @@ Workbook::Workbook(NonnullRefPtrVector<Sheet>&& sheets) , m_interpreter_scope(JS::VM::InterpreterExecutionScope(interpreter())) { m_workbook_object = interpreter().heap().allocate<WorkbookObject>(global_object(), *this); - global_object().put("workbook", workbook_object()); + global_object().define_direct_property("workbook", workbook_object(), JS::default_attributes); } bool Workbook::set_filename(const String& filename) diff --git a/Userland/DevTools/HackStudio/Debugger/DebuggerGlobalJSObject.cpp b/Userland/DevTools/HackStudio/Debugger/DebuggerGlobalJSObject.cpp index 0223993c7b..3433af62e8 100644 --- a/Userland/DevTools/HackStudio/Debugger/DebuggerGlobalJSObject.cpp +++ b/Userland/DevTools/HackStudio/Debugger/DebuggerGlobalJSObject.cpp @@ -89,9 +89,8 @@ Optional<JS::Value> DebuggerGlobalJSObject::debugger_to_js(const Debug::DebugInf auto member_value = debugger_to_js(member); if (!member_value.has_value()) continue; - object->put(member.name, member_value.value(), {}); + object->define_direct_property(member.name, member_value.value(), JS::default_attributes); } - object->finish_writing_properties(); return JS::Value(object); } diff --git a/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.cpp b/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.cpp index fa3a1e7d17..02008e0397 100644 --- a/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.cpp +++ b/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.cpp @@ -29,11 +29,8 @@ DebuggerVariableJSObject::~DebuggerVariableJSObject() { } -bool DebuggerVariableJSObject::internal_set(const JS::PropertyName& property_name, JS::Value value, JS::Value receiver) +bool DebuggerVariableJSObject::internal_set(const JS::PropertyName& property_name, JS::Value value, JS::Value) { - if (m_is_writing_properties) - return Base::internal_set(property_name, value, receiver); - if (!property_name.is_string()) { vm().throw_exception<JS::TypeError>(global_object(), String::formatted("Invalid variable name {}", property_name.to_string())); return false; diff --git a/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.h b/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.h index 61f5e06fd2..39c54fc7d3 100644 --- a/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.h +++ b/Userland/DevTools/HackStudio/Debugger/DebuggerVariableJSObject.h @@ -25,13 +25,11 @@ public: virtual const char* class_name() const override { return m_variable_info.type_name.characters(); } bool internal_set(JS::PropertyName const&, JS::Value value, JS::Value receiver) override; - void finish_writing_properties() { m_is_writing_properties = false; } private: DebuggerGlobalJSObject& debugger_object() const; const Debug::DebugInfo::VariableInfo& m_variable_info; - bool m_is_writing_properties { true }; }; } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 27a072dcec..2ee26372a4 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -155,7 +155,7 @@ void IteratorToArray::execute_impl(Bytecode::Interpreter& interpreter) const if (vm.exception()) return; - array->put(index, value); + array->create_data_property_or_throw(index, value); index++; } } @@ -234,7 +234,7 @@ void GetById::execute_impl(Bytecode::Interpreter& interpreter) const void PutById::execute_impl(Bytecode::Interpreter& interpreter) const { if (auto* object = interpreter.reg(m_base).to_object(interpreter.global_object())) - object->put(interpreter.current_executable().get_string(m_property), interpreter.accumulator()); + object->set(interpreter.current_executable().get_string(m_property), interpreter.accumulator(), true); } void Jump::execute_impl(Bytecode::Interpreter& interpreter) const @@ -397,11 +397,11 @@ void Yield::execute_impl(Bytecode::Interpreter& interpreter) const { auto yielded_value = interpreter.accumulator().value_or(js_undefined()); auto object = JS::Object::create(interpreter.global_object(), nullptr); - object->put("result", yielded_value); + object->define_direct_property("result", yielded_value, JS::default_attributes); if (m_continuation_label.has_value()) - object->put("continuation", Value(static_cast<double>(reinterpret_cast<u64>(&m_continuation_label->block())))); + object->define_direct_property("continuation", Value(static_cast<double>(reinterpret_cast<u64>(&m_continuation_label->block()))), JS::default_attributes); else - object->put("continuation", Value(0)); + object->define_direct_property("continuation", Value(0), JS::default_attributes); interpreter.do_return(object); } @@ -427,7 +427,7 @@ void PutByValue::execute_impl(Bytecode::Interpreter& interpreter) const auto property_key = interpreter.reg(m_property).to_property_key(interpreter.global_object()); if (interpreter.vm().exception()) return; - object->put(property_key, interpreter.accumulator()); + object->set(property_key, interpreter.accumulator(), true); } } diff --git a/Userland/Libraries/LibJS/Interpreter.cpp b/Userland/Libraries/LibJS/Interpreter.cpp index c69d5fe335..1d8c29dbb7 100644 --- a/Userland/Libraries/LibJS/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Interpreter.cpp @@ -110,11 +110,11 @@ void Interpreter::enter_scope(const ScopeNode& scope_node, ScopeType scope_type, if (is_program_node && declaration.declaration_kind() == DeclarationKind::Var) { declarator.target().visit( [&](const NonnullRefPtr<Identifier>& id) { - global_object.put(id->string(), js_undefined()); + global_object.define_direct_property(id->string(), js_undefined(), JS::Attribute::Writable | JS::Attribute::Enumerable); }, [&](const NonnullRefPtr<BindingPattern>& binding) { binding->for_each_bound_name([&](const auto& name) { - global_object.put(name, js_undefined()); + global_object.define_direct_property(name, js_undefined(), JS::Attribute::Writable | JS::Attribute::Enumerable); }); }); if (exception()) diff --git a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp index 25b97c5ede..c192404548 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp @@ -369,7 +369,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::push) return {}; } auto new_length_value = Value((i32)new_length); - this_object->put(vm.names.length, new_length_value); + this_object->set(vm.names.length, new_length_value, true); if (vm.exception()) return {}; return new_length_value; @@ -420,7 +420,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::unshift) } } - this_object->put(vm.names.length, Value(new_length)); + this_object->set(vm.names.length, Value(new_length), true); if (vm.exception()) return {}; return Value(new_length); @@ -442,7 +442,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::pop) if (vm.exception()) return {}; if (length == 0) { - this_object->put(vm.names.length, Value(0)); + this_object->set(vm.names.length, Value(0), true); return js_undefined(); } auto index = length - 1; @@ -452,7 +452,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::pop) this_object->delete_property_or_throw(index); if (vm.exception()) return {}; - this_object->put(vm.names.length, Value((i32)index)); + this_object->set(vm.names.length, Value((i32)index), true); if (vm.exception()) return {}; return element; @@ -468,7 +468,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::shift) if (vm.exception()) return {}; if (length == 0) { - this_object->put(vm.names.length, Value(0)); + this_object->set(vm.names.length, Value(0), true); if (vm.exception()) return {}; return js_undefined(); @@ -501,7 +501,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::shift) if (vm.exception()) return {}; - this_object->put(vm.names.length, Value(length - 1)); + this_object->set(vm.names.length, Value(length - 1), true); if (vm.exception()) return {}; return first; @@ -693,7 +693,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat) return {}; } - new_array->put(vm.names.length, Value(n)); + new_array->set(vm.names.length, Value(n), true); if (vm.exception()) return {}; return Value(new_array); @@ -769,7 +769,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::slice) ++index; } - new_array->put(vm.names.length, Value(index)); + new_array->set(vm.names.length, Value(index), true); if (vm.exception()) return {}; @@ -1675,7 +1675,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice) } } - removed_elements->put(vm.names.length, Value(actual_delete_count)); + removed_elements->set(vm.names.length, Value(actual_delete_count), true); if (vm.exception()) return {}; @@ -1725,7 +1725,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice) return {}; } - this_object->put(vm.names.length, Value((i32)new_length)); + this_object->set(vm.names.length, Value((i32)new_length), true); if (vm.exception()) return {}; @@ -1771,7 +1771,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::fill) to = min(relative_end, length); for (size_t i = from; i < to; i++) { - this_object->put(i, vm.argument(0)); + this_object->set(i, vm.argument(0), true); if (vm.exception()) return {}; } @@ -1988,7 +1988,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::copy_within) auto from_value = this_object->get(from_i); if (vm.exception()) return {}; - this_object->put(to_i, from_value); + this_object->set(to_i, from_value, true); if (vm.exception()) return {}; } else { diff --git a/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp b/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp index 351e094fa3..2b4529737b 100644 --- a/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/GeneratorObject.cpp @@ -73,10 +73,10 @@ Value GeneratorObject::next_impl(VM& vm, GlobalObject& global_object, Optional<V return {}; auto result = Object::create(global_object, global_object.object_prototype()); - result->put("value", previous_generated_value); + result->define_direct_property("value", previous_generated_value, JS::default_attributes); if (m_done) { - result->put("done", Value(true)); + result->define_direct_property("done", Value(true), JS::default_attributes); return result; } @@ -88,7 +88,7 @@ Value GeneratorObject::next_impl(VM& vm, GlobalObject& global_object, Optional<V if (!next_block) { // The generator has terminated, now we can simply return done=true. m_done = true; - result->put("done", Value(true)); + result->define_direct_property("done", Value(true), JS::default_attributes); return result; } @@ -115,8 +115,8 @@ Value GeneratorObject::next_impl(VM& vm, GlobalObject& global_object, Optional<V m_done = generated_continuation(m_previous_value) == nullptr; - result->put("value", generated_value(m_previous_value)); - result->put("done", Value(m_done)); + result->define_direct_property("value", generated_value(m_previous_value), JS::default_attributes); + result->define_direct_property("done", Value(m_done), JS::default_attributes); if (vm.exception()) return {}; diff --git a/Userland/Libraries/LibJS/Runtime/Object.h b/Userland/Libraries/LibJS/Runtime/Object.h index d36a117089..178fe4c3c6 100644 --- a/Userland/Libraries/LibJS/Runtime/Object.h +++ b/Userland/Libraries/LibJS/Runtime/Object.h @@ -123,9 +123,6 @@ public: // Non-standard methods - // - Helpers using old, non-standard names but wrapping the standard methods. - // FIXME: Update all the code relying on these and remove them. - bool put(PropertyName const& property_name, Value value, Value receiver = {}) { return internal_set(property_name, value, receiver.value_or(this)); } Value get_without_side_effects(const PropertyName&) const; void define_direct_property(PropertyName const& property_name, Value value, PropertyAttributes attributes) { storage_set(property_name, { value, attributes }); }; diff --git a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp index 5a30b09c1e..7e13e2980a 100644 --- a/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp +++ b/Userland/Libraries/LibJS/Runtime/ObjectEnvironment.cpp @@ -34,7 +34,7 @@ Optional<Variable> ObjectEnvironment::get_from_environment(FlyString const& name bool ObjectEnvironment::put_into_environment(FlyString const& name, Variable variable) { - return m_binding_object.put(name, variable.value); + return m_binding_object.set(name, variable.value, false); } bool ObjectEnvironment::delete_from_environment(FlyString const& name) diff --git a/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp b/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp index 4402529fdb..fd31118585 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArrayConstructor.cpp @@ -180,7 +180,7 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayConstructor::of) if (vm.exception()) return {}; for (size_t k = 0; k < length; ++k) { - auto success = new_object->put(k, vm.argument(k)); + auto success = new_object->set(k, vm.argument(k), true); if (vm.exception()) return {}; if (!success) { diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index 031c1a72c5..fe04633b22 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -160,7 +160,7 @@ void VM::set_variable(const FlyString& name, Value value, GlobalObject& global_o return; } - global_object.put(name, value); + global_object.set(name, value, true); } bool VM::delete_variable(FlyString const& name) @@ -298,7 +298,7 @@ void VM::assign(const NonnullRefPtr<BindingPattern>& target, Value value, Global continue; if (seen_names.contains(object_property.key.to_display_string())) continue; - rest_object->put(object_property.key, object->get(object_property.key)); + rest_object->set(object_property.key, object->get(object_property.key), true); if (exception()) return; } diff --git a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp index 2dee5ffe2d..96654696eb 100644 --- a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp +++ b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp @@ -329,8 +329,8 @@ JS_DEFINE_NATIVE_FUNCTION(WebAssemblyObject::instantiate) auto instance_object = vm.heap().allocate<WebAssemblyInstanceObject>(global_object, global_object, result.value()); if (should_return_module) { auto object = JS::Object::create(global_object, nullptr); - object->put("module", vm.heap().allocate<WebAssemblyModuleObject>(global_object, global_object, s_compiled_modules.size() - 1)); - object->put("instance", instance_object); + object->define_direct_property("module", vm.heap().allocate<WebAssemblyModuleObject>(global_object, global_object, s_compiled_modules.size() - 1), JS::default_attributes); + object->define_direct_property("instance", instance_object, JS::default_attributes); promise->fulfill(object); } else { promise->fulfill(instance_object); |