mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 07:57:47 +00:00
LibJS: Use Set/CreateDataPropertyOrThrow in Array.prototype as in spec
Mapping: Set -> put (does not throw by default) CreateDataPropertyOrThrow -> define_property
This commit is contained in:
parent
15edad8202
commit
a770c26d54
1 changed files with 34 additions and 26 deletions
|
@ -77,16 +77,16 @@ void ArrayPrototype::initialize(GlobalObject& global_object)
|
||||||
|
|
||||||
// 23.1.3.34 Array.prototype [ @@unscopables ], https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
|
// 23.1.3.34 Array.prototype [ @@unscopables ], https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
|
||||||
auto* unscopable_list = Object::create(global_object, nullptr);
|
auto* unscopable_list = Object::create(global_object, nullptr);
|
||||||
unscopable_list->put(vm.names.copyWithin, Value(true));
|
unscopable_list->define_property(vm.names.copyWithin, Value(true));
|
||||||
unscopable_list->put(vm.names.entries, Value(true));
|
unscopable_list->define_property(vm.names.entries, Value(true));
|
||||||
unscopable_list->put(vm.names.fill, Value(true));
|
unscopable_list->define_property(vm.names.fill, Value(true));
|
||||||
unscopable_list->put(vm.names.find, Value(true));
|
unscopable_list->define_property(vm.names.find, Value(true));
|
||||||
unscopable_list->put(vm.names.findIndex, Value(true));
|
unscopable_list->define_property(vm.names.findIndex, Value(true));
|
||||||
unscopable_list->put(vm.names.flat, Value(true));
|
unscopable_list->define_property(vm.names.flat, Value(true));
|
||||||
unscopable_list->put(vm.names.flatMap, Value(true));
|
unscopable_list->define_property(vm.names.flatMap, Value(true));
|
||||||
unscopable_list->put(vm.names.includes, Value(true));
|
unscopable_list->define_property(vm.names.includes, Value(true));
|
||||||
unscopable_list->put(vm.names.keys, Value(true));
|
unscopable_list->define_property(vm.names.keys, Value(true));
|
||||||
unscopable_list->put(vm.names.values, Value(true));
|
unscopable_list->define_property(vm.names.values, Value(true));
|
||||||
|
|
||||||
define_property(vm.well_known_symbol_unscopables(), unscopable_list, Attribute::Configurable);
|
define_property(vm.well_known_symbol_unscopables(), unscopable_list, Attribute::Configurable);
|
||||||
}
|
}
|
||||||
|
@ -195,9 +195,13 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::filter)
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
size_t to_index = 0;
|
||||||
|
|
||||||
for_each_item(vm, global_object, "filter", [&](auto, auto value, auto callback_result) {
|
for_each_item(vm, global_object, "filter", [&](auto, auto value, auto callback_result) {
|
||||||
if (callback_result.to_boolean())
|
if (callback_result.to_boolean()) {
|
||||||
new_array->indexed_properties().append(value);
|
new_array->define_property(to_index, value);
|
||||||
|
++to_index;
|
||||||
|
}
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
});
|
});
|
||||||
return Value(new_array);
|
return Value(new_array);
|
||||||
|
@ -255,7 +259,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::push)
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < argument_count; ++i) {
|
for (size_t i = 0; i < argument_count; ++i) {
|
||||||
this_object->put(length + i, vm.argument(i));
|
this_object->define_property(length + i, vm.argument(i));
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -294,7 +298,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::unshift)
|
||||||
auto from_value = this_object->get(from).value_or(js_undefined());
|
auto from_value = this_object->get(from).value_or(js_undefined());
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
this_object->put(to, from_value);
|
this_object->define_property(to, from_value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
} else {
|
} else {
|
||||||
|
@ -305,7 +309,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::unshift)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t j = 0; j < arg_count; j++) {
|
for (size_t j = 0; j < arg_count; j++) {
|
||||||
this_object->put(j, vm.argument(j));
|
this_object->define_property(j, vm.argument(j));
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -378,7 +382,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::shift)
|
||||||
auto from_value = this_object->get(from).value_or(js_undefined());
|
auto from_value = this_object->get(from).value_or(js_undefined());
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
this_object->put(to, from_value);
|
this_object->define_property(to, from_value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
} else {
|
} else {
|
||||||
|
@ -554,7 +558,9 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat)
|
||||||
auto k_value = obj.get(k).value_or(js_undefined());
|
auto k_value = obj.get(k).value_or(js_undefined());
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return;
|
return;
|
||||||
new_array->put(n, k_value);
|
new_array->define_property(n, k_value);
|
||||||
|
if (vm.exception())
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
++n;
|
++n;
|
||||||
++k;
|
++k;
|
||||||
|
@ -564,7 +570,9 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat)
|
||||||
vm.throw_exception<TypeError>(global_object, ErrorType::ArrayMaxSize);
|
vm.throw_exception<TypeError>(global_object, ErrorType::ArrayMaxSize);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
new_array->put(n, arg);
|
new_array->define_property(n, arg);
|
||||||
|
if (vm.exception())
|
||||||
|
return;
|
||||||
++n;
|
++n;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -838,14 +846,14 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reverse)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lower_exists && upper_exists) {
|
if (lower_exists && upper_exists) {
|
||||||
this_object->put(lower, upper_value);
|
this_object->define_property(lower, upper_value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
this_object->put(upper, lower_value);
|
this_object->define_property(upper, lower_value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
} else if (!lower_exists && upper_exists) {
|
} else if (!lower_exists && upper_exists) {
|
||||||
this_object->put(lower, upper_value);
|
this_object->define_property(lower, upper_value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
this_object->delete_property(upper, true);
|
this_object->delete_property(upper, true);
|
||||||
|
@ -855,7 +863,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reverse)
|
||||||
this_object->delete_property(lower, true);
|
this_object->delete_property(lower, true);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
this_object->put(upper, lower_value);
|
this_object->define_property(upper, lower_value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -1227,7 +1235,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
|
||||||
auto to = i + insert_count;
|
auto to = i + insert_count;
|
||||||
|
|
||||||
if (!from.is_empty()) {
|
if (!from.is_empty()) {
|
||||||
this_object->put(to, from);
|
this_object->define_property(to, from);
|
||||||
} else {
|
} else {
|
||||||
this_object->delete_property(to, true);
|
this_object->delete_property(to, true);
|
||||||
}
|
}
|
||||||
|
@ -1249,7 +1257,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
|
||||||
auto to = i + insert_count - 1;
|
auto to = i + insert_count - 1;
|
||||||
|
|
||||||
if (!from.is_empty()) {
|
if (!from.is_empty()) {
|
||||||
this_object->put(to, from);
|
this_object->define_property(to, from);
|
||||||
} else {
|
} else {
|
||||||
this_object->delete_property(to, true);
|
this_object->delete_property(to, true);
|
||||||
}
|
}
|
||||||
|
@ -1259,7 +1267,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < insert_count; ++i) {
|
for (size_t i = 0; i < insert_count; ++i) {
|
||||||
this_object->put(actual_start + i, vm.argument(i + 2));
|
this_object->define_property(actual_start + i, vm.argument(i + 2));
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -1386,7 +1394,7 @@ static size_t flatten_into_array(GlobalObject& global_object, Object& new_array,
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
new_array.put(target_index, value);
|
new_array.define_property(target_index, value);
|
||||||
if (vm.exception())
|
if (vm.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue