mirror of
https://github.com/denoland/deno
synced 2024-10-03 23:03:45 +00:00
fix(ext/node): promise rejection in VM contexts (#23305)
Fixes https://github.com/denoland/deno/issues/23297 `docusaurus build` works! ``` $ deno run -A repro.js fish: Job 1, 'deno run -A ../../littledivy/fs…' terminated by signal SIGSEGV (Address boundary error) $ denod run -A repro.js error: Uncaught (in promise) Error: rejected ``` Depends on https://github.com/denoland/deno_core/pull/693
This commit is contained in:
parent
720e45d25b
commit
402d59eea9
|
@ -4,6 +4,7 @@ use deno_core::error::type_error;
|
||||||
use deno_core::error::AnyError;
|
use deno_core::error::AnyError;
|
||||||
use deno_core::v8;
|
use deno_core::v8;
|
||||||
use deno_core::v8::MapFnTo;
|
use deno_core::v8::MapFnTo;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
pub const PRIVATE_SYMBOL_NAME: v8::OneByteConst =
|
pub const PRIVATE_SYMBOL_NAME: v8::OneByteConst =
|
||||||
v8::String::create_external_onebyte_const(b"node:contextify:context");
|
v8::String::create_external_onebyte_const(b"node:contextify:context");
|
||||||
|
@ -75,13 +76,19 @@ impl ContextifyContext {
|
||||||
Self::from_context(scope, context, sandbox_obj);
|
Self::from_context(scope, context, sandbox_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_context(
|
fn from_context(
|
||||||
scope: &mut v8::HandleScope,
|
scope: &mut v8::HandleScope,
|
||||||
v8_context: v8::Local<v8::Context>,
|
v8_context: v8::Local<v8::Context>,
|
||||||
sandbox_obj: v8::Local<v8::Object>,
|
sandbox_obj: v8::Local<v8::Object>,
|
||||||
) {
|
) {
|
||||||
let main_context = scope.get_current_context();
|
let main_context = scope.get_current_context();
|
||||||
|
let context_state = main_context
|
||||||
|
.get_slot::<Rc<deno_core::ContextState>>(scope)
|
||||||
|
.unwrap()
|
||||||
|
.clone();
|
||||||
|
|
||||||
v8_context.set_security_token(main_context.get_security_token(scope));
|
v8_context.set_security_token(main_context.get_security_token(scope));
|
||||||
|
v8_context.set_slot(scope, context_state);
|
||||||
|
|
||||||
let context = v8::Global::new(scope, v8_context);
|
let context = v8::Global::new(scope, v8_context);
|
||||||
let sandbox = v8::Global::new(scope, sandbox_obj);
|
let sandbox = v8::Global::new(scope, sandbox_obj);
|
||||||
|
@ -95,7 +102,7 @@ impl ContextifyContext {
|
||||||
// lives longer than the execution context, so this should be safe.
|
// lives longer than the execution context, so this should be safe.
|
||||||
unsafe {
|
unsafe {
|
||||||
v8_context.set_aligned_pointer_in_embedder_data(
|
v8_context.set_aligned_pointer_in_embedder_data(
|
||||||
0,
|
1,
|
||||||
ptr as *const ContextifyContext as _,
|
ptr as *const ContextifyContext as _,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -157,7 +164,7 @@ impl ContextifyContext {
|
||||||
) -> Option<&'c ContextifyContext> {
|
) -> Option<&'c ContextifyContext> {
|
||||||
let context = object.get_creation_context(scope)?;
|
let context = object.get_creation_context(scope)?;
|
||||||
|
|
||||||
let context_ptr = context.get_aligned_pointer_from_embedder_data(0);
|
let context_ptr = context.get_aligned_pointer_from_embedder_data(1);
|
||||||
// SAFETY: We are storing a pointer to the ContextifyContext
|
// SAFETY: We are storing a pointer to the ContextifyContext
|
||||||
// in the embedder data of the v8::Context during creation.
|
// in the embedder data of the v8::Context during creation.
|
||||||
Some(unsafe { &*(context_ptr as *const ContextifyContext) })
|
Some(unsafe { &*(context_ptr as *const ContextifyContext) })
|
||||||
|
@ -228,6 +235,7 @@ fn init_global_template_inner(scope: &mut v8::HandleScope) {
|
||||||
let global_func_template =
|
let global_func_template =
|
||||||
v8::FunctionTemplate::builder_raw(c_noop).build(scope);
|
v8::FunctionTemplate::builder_raw(c_noop).build(scope);
|
||||||
let global_object_template = global_func_template.instance_template(scope);
|
let global_object_template = global_func_template.instance_template(scope);
|
||||||
|
global_object_template.set_internal_field_count(2);
|
||||||
|
|
||||||
let named_property_handler_config = {
|
let named_property_handler_config = {
|
||||||
let mut config = v8::NamedPropertyHandlerConfiguration::new()
|
let mut config = v8::NamedPropertyHandlerConfiguration::new()
|
||||||
|
|
|
@ -132,3 +132,19 @@ Deno.test({
|
||||||
assertEquals(isContext(sandbox), false);
|
assertEquals(isContext(sandbox), false);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// https://github.com/denoland/deno/issues/23297
|
||||||
|
Deno.test({
|
||||||
|
name: "vm context promise rejection",
|
||||||
|
fn() {
|
||||||
|
const code = `
|
||||||
|
function reject() {
|
||||||
|
return Promise.reject(new Error('rejected'));
|
||||||
|
}
|
||||||
|
reject().catch(() => {})
|
||||||
|
`;
|
||||||
|
|
||||||
|
const script = new Script(code);
|
||||||
|
script.runInNewContext();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue