Skip to content

Commit

Permalink
LibJS: Fix .length attributes of various native functions
Browse files Browse the repository at this point in the history
Namely the Proxy revocation, Promise resolving, Promise then/catch
finally, and Promise GetCapabilitiesExecutor functions.
They were all missing an explicit 'Attribute::Configurable' argument
and therefore incorrectly used the default attributes (writable,
enumerable, configurable).
  • Loading branch information
linusg committed Jun 17, 2021
1 parent 631d36f commit d1c109b
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 5 deletions.
4 changes: 2 additions & 2 deletions Userland/Libraries/LibJS/Runtime/PromisePrototype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ JS_DEFINE_NATIVE_FUNCTION(PromisePrototype::finally)
});
return promise->invoke(vm.names.then.as_string(), value_thunk);
});
then_finally_function->define_property(vm.names.length, Value(1));
then_finally_function->define_property(vm.names.length, Value(1), Attribute::Configurable);

// 27.2.5.3.2 Catch Finally Functions, https://tc39.es/ecma262/#sec-catchfinallyfunctions
auto* catch_finally_function = NativeFunction::create(global_object, "", [constructor_handle = make_handle(constructor), on_finally_handle = make_handle(&on_finally.as_function())](auto& vm, auto& global_object) -> Value {
Expand All @@ -124,7 +124,7 @@ JS_DEFINE_NATIVE_FUNCTION(PromisePrototype::finally)
});
return promise->invoke(vm.names.then.as_string(), thrower);
});
catch_finally_function->define_property(vm.names.length, Value(1));
catch_finally_function->define_property(vm.names.length, Value(1), Attribute::Configurable);

then_finally = Value(then_finally_function);
catch_finally = Value(catch_finally_function);
Expand Down
3 changes: 2 additions & 1 deletion Userland/Libraries/LibJS/Runtime/PromiseReaction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ PromiseCapability new_promise_capability(GlobalObject& global_object, Value cons
Value reject { js_undefined() };
} promise_capability_functions;

// 27.2.1.5.1 GetCapabilitiesExecutor Functions, https://tc39.es/ecma262/#sec-getcapabilitiesexecutor-functions
auto* executor = NativeFunction::create(global_object, "", [&promise_capability_functions](auto& vm, auto& global_object) -> Value {
auto resolve = vm.argument(0);
auto reject = vm.argument(1);
Expand All @@ -41,7 +42,7 @@ PromiseCapability new_promise_capability(GlobalObject& global_object, Value cons
promise_capability_functions.reject = reject;
return js_undefined();
});
executor->define_property(vm.names.length, Value(2));
executor->define_property(vm.names.length, Value(2), Attribute::Configurable);

MarkedValueList arguments(vm.heap());
arguments.append(executor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ PromiseResolvingFunction::PromiseResolvingFunction(Promise& promise, AlreadyReso
void PromiseResolvingFunction::initialize(GlobalObject& global_object)
{
Base::initialize(global_object);
define_property(vm().names.length, Value(1));
define_property(vm().names.length, Value(1), Attribute::Configurable);
}

Value PromiseResolvingFunction::call()
Expand Down
2 changes: 1 addition & 1 deletion Userland/Libraries/LibJS/Runtime/ProxyConstructor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ JS_DEFINE_NATIVE_FUNCTION(ProxyConstructor::revocable)
proxy.revoke();
return js_undefined();
});
revoker->define_property(vm.names.length, Value(0));
revoker->define_property(vm.names.length, Value(0), Attribute::Configurable);

auto* result = Object::create(global_object, global_object.object_prototype());
result->define_property(vm.names.proxy, proxy);
Expand Down

0 comments on commit d1c109b

Please sign in to comment.