Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions src/jsc/JSPromise.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,10 +266,8 @@ impl JSPromise {
return value;
}

if value.is_any_error() {
return Self::dangerously_create_rejected_promise_value_without_notifying_vm(
global, value,
);
if let Some(err) = value.to_error() {
return Self::rejected_promise(global, err).to_js();
}

Self::resolved_promise_value(global, value)
Expand Down Expand Up @@ -327,6 +325,18 @@ impl JSPromise {
JSPromise::opaque_mut(JSC__JSPromise__rejectedPromise(global, value))
}

/// Create a new promise rejected with the exception `err` proves is pending,
/// taking it off the VM. The reason is converted like [`reject`](Self::reject)
/// does; a termination is propagated instead of becoming a reason.
Comment thread
robobun marked this conversation as resolved.
pub fn rejected_promise_with_caught_exception(
global: &JSGlobalObject,
err: JsError,
) -> Result<&mut JSPromise, JsTerminated> {
let promise = Self::create(global);
promise.reject(global, Err(err))?;
Ok(promise)
}

/// **DEPRECATED** use `rejected_promise` instead.
///
/// Create a new rejected promise without notifying the VM. Unhandled
Expand Down
1 change: 0 additions & 1 deletion src/jsc/bindings/ImportMetaObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

extern "C" JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolveSync);
extern "C" JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolveSyncPrivate);
extern "C" JSC::EncodedJSValue Bun__resolve(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, JSC::EncodedJSValue from, bool is_esm);
extern "C" JSC::EncodedJSValue Bun__resolveSync(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, JSC::EncodedJSValue from, bool is_esm, bool isUserRequireResolve);
extern "C" JSC::EncodedJSValue Bun__resolveSyncWithPaths(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, JSC::EncodedJSValue from, bool is_esm, bool isUserRequireResolve, const BunString* paths, size_t paths_len);
extern "C" JSC::EncodedJSValue Bun__resolveSyncWithSource(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, BunString* from, bool is_esm, bool isUserRequireResolve);
Expand Down
41 changes: 1 addition & 40 deletions src/runtime/api/BunObject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1219,53 +1219,14 @@ fn resolve(global_object: &JSGlobalObject, callframe: &CallFrame) -> JsResult<JS
let value = match do_resolve(global_object, callframe.arguments()) {
Ok(v) => v,
Err(e) => {
let err = global_object.take_error(e);
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
global_object,
err,
),
JSPromise::rejected_promise_with_caught_exception(global_object, e)?.to_js(),
);
}
};
Ok(JSPromise::resolved_promise_value(global_object, value))
}

// HOST_EXPORT(Bun__resolve, c)
pub fn bun_resolve(
global: &JSGlobalObject,
specifier: JSValue,
source: JSValue,
is_esm: bool,
) -> JSValue {
let Ok(specifier_str) = specifier.to_bun_string(global) else {
return JSValue::ZERO;
};
let specifier_str = scopeguard::guard(specifier_str, |s| s.deref());

let Ok(source_str) = source.to_bun_string(global) else {
return JSValue::ZERO;
};
let source_str = scopeguard::guard(source_str, |s| s.deref());

let value = match do_resolve_with_args::<true>(
global,
*specifier_str,
*source_str,
ResolveMode::from_ffi_bools(is_esm, false),
) {
Ok(v) => v,
Err(_) => {
let err = global.try_take_exception().unwrap();
return JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
global, err,
);
}
};

JSPromise::resolved_promise_value(global, value)
}

// HOST_EXPORT(Bun__resolveSync, c)
pub fn bun_resolve_sync(
global: &JSGlobalObject,
Expand Down
5 changes: 1 addition & 4 deletions src/runtime/api/bun/subprocess.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1384,10 +1384,7 @@ impl Subprocess<'_> {
),
Status::Err(err) => {
let js_err = err.to_js(global_this);
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
global_this,
js_err,
)
JSPromise::rejected_promise(global_this, js_err).to_js()
}
_ => {
let promise = JSPromise::create(global_this).to_js();
Expand Down
6 changes: 1 addition & 5 deletions src/runtime/node/node_fs_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,7 @@ fn run_async<A: FsArgument>(
if A::HAVE_ABORT_SIGNAL {
if let Some(signal) = args.signal() {
if let Some(abort_error) = signal.node_abort_error_if_aborted(global) {
let promise =
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
global,
abort_error,
);
let promise = JSPromise::rejected_promise(global, abort_error).to_js();
args.unprotect();
drop(args);
// SAFETY: not yet dropped; only drop site for this path.
Expand Down
73 changes: 32 additions & 41 deletions src/runtime/server/server_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2426,24 +2426,22 @@ where
jsc::mark_binding!();

if self.config.on_request.is_empty() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ZigString::init(b"fetch() requires the server to have a fetch handler")
.to_error_instance(ctx),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ZigString::init(b"fetch() requires the server to have a fetch handler")
.to_error_instance(ctx),
)
.to_js());
}

let arguments = callframe.arguments();
if arguments.is_empty() {
let fetch_error = Fetch::FETCH_ERROR_NO_ARGS;
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ZigString::init(fetch_error.as_bytes()).to_error_instance(ctx),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ZigString::init(fetch_error.as_bytes()).to_error_instance(ctx),
)
.to_js());
}

let mut headers: Option<HeadersRef> = None;
Expand All @@ -2462,12 +2460,11 @@ where

if temp_url_str.is_empty() {
let fetch_error = Fetch::FETCH_ERROR_BLANK_URL;
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ZigString::init(fetch_error.as_bytes()).to_error_instance(ctx),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ZigString::init(fetch_error.as_bytes()).to_error_instance(ctx),
)
.to_js());
}

let mut url = URL::parse(temp_url_str);
Expand Down Expand Up @@ -2516,11 +2513,11 @@ where
if let Some(body__) = opts.fast_get(ctx, jsc::BuiltinName::Body)? {
match Blob::get::<true, false>(ctx, body__) {
Ok(new_blob) => body = BodyValue::Blob(new_blob),
Err(_) => {
return Ok(JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ZigString::init(b"fetch() received invalid body").to_error_instance(ctx),
));
Err(err) => {
return Ok(JSPromise::rejected_promise_with_caught_exception(
ctx, err,
)?
.to_js());
}
}
}
Expand All @@ -2545,9 +2542,7 @@ where
} else {
let fetch_error = Fetch::fetch_type_error_string(first_arg);
let err = jsc::ErrorCode::INVALID_ARG_TYPE.fmt(ctx, format_args!("{}", fetch_error));
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(ctx, err),
);
return Ok(JSPromise::rejected_promise(ctx, err).to_js());
};

// `Request::to_js` stores `self as *mut
Expand All @@ -2565,25 +2560,21 @@ where
let response_value =
match on_request.call(&global_this, self.js_value_assert_alive(), &[request_value]) {
Ok(v) => v,
Err(err) => global_this.take_exception(err),
Err(err) => {
return Ok(JSPromise::rejected_promise_with_caught_exception(ctx, err)?.to_js());
}
};

if response_value.is_any_error() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
response_value,
),
);
if let Some(err) = response_value.to_error() {
return Ok(JSPromise::rejected_promise(ctx, err).to_js());
}

if response_value.is_empty_or_undefined_or_null() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ZigString::init(b"fetch() returned an empty value").to_error_instance(ctx),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ZigString::init(b"fetch() returned an empty value").to_error_instance(ctx),
)
.to_js());
}

if response_value.as_any_promise().is_some() {
Expand Down
Loading
Loading