mirror of
https://github.com/denoland/rusty_v8.git
synced 2025-03-09 21:47:00 -04:00
support for import.meta (#128)
This commit is contained in:
parent
d65c604f3a
commit
57d13f7622
3 changed files with 91 additions and 2 deletions
|
@ -82,10 +82,14 @@ void v8__Isolate__SetPromiseRejectCallback(v8::Isolate* isolate,
|
||||||
|
|
||||||
void v8__Isolate__SetCaptureStackTraceForUncaughtExceptions(
|
void v8__Isolate__SetCaptureStackTraceForUncaughtExceptions(
|
||||||
v8::Isolate* isolate, bool capture, int frame_limit) {
|
v8::Isolate* isolate, bool capture, int frame_limit) {
|
||||||
// Note: StackTraceOptions are deprecated so we don't bother to bind to it.
|
|
||||||
isolate->SetCaptureStackTraceForUncaughtExceptions(capture, frame_limit);
|
isolate->SetCaptureStackTraceForUncaughtExceptions(capture, frame_limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void v8__Isolate__SetHostInitializeImportMetaObjectCallback(
|
||||||
|
v8::Isolate* isolate, v8::HostInitializeImportMetaObjectCallback callback) {
|
||||||
|
isolate->SetHostInitializeImportMetaObjectCallback(callback);
|
||||||
|
}
|
||||||
|
|
||||||
bool v8__Isolate__AddMessageListener(v8::Isolate& isolate,
|
bool v8__Isolate__AddMessageListener(v8::Isolate& isolate,
|
||||||
v8::MessageCallback callback) {
|
v8::MessageCallback callback) {
|
||||||
return isolate.AddMessageListener(callback);
|
return isolate.AddMessageListener(callback);
|
||||||
|
|
|
@ -4,8 +4,11 @@ use crate::promise::PromiseRejectMessage;
|
||||||
use crate::support::Delete;
|
use crate::support::Delete;
|
||||||
use crate::support::Opaque;
|
use crate::support::Opaque;
|
||||||
use crate::support::UniqueRef;
|
use crate::support::UniqueRef;
|
||||||
|
use crate::Context;
|
||||||
use crate::Local;
|
use crate::Local;
|
||||||
use crate::Message;
|
use crate::Message;
|
||||||
|
use crate::Module;
|
||||||
|
use crate::Object;
|
||||||
use crate::StartupData;
|
use crate::StartupData;
|
||||||
use crate::Value;
|
use crate::Value;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
@ -16,6 +19,9 @@ type MessageCallback = extern "C" fn(Local<Message>, Local<Value>);
|
||||||
|
|
||||||
type PromiseRejectCallback = extern "C" fn(PromiseRejectMessage);
|
type PromiseRejectCallback = extern "C" fn(PromiseRejectMessage);
|
||||||
|
|
||||||
|
type HostInitializeImportMetaObjectCallback =
|
||||||
|
extern "C" fn(Local<Context>, Local<Module>, Local<Object>);
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn v8__Isolate__New(params: *mut CreateParams) -> *mut Isolate;
|
fn v8__Isolate__New(params: *mut CreateParams) -> *mut Isolate;
|
||||||
fn v8__Isolate__Dispose(this: *mut Isolate);
|
fn v8__Isolate__Dispose(this: *mut Isolate);
|
||||||
|
@ -34,6 +40,10 @@ extern "C" {
|
||||||
isolate: *mut Isolate,
|
isolate: *mut Isolate,
|
||||||
callback: PromiseRejectCallback,
|
callback: PromiseRejectCallback,
|
||||||
);
|
);
|
||||||
|
fn v8__Isolate__SetHostInitializeImportMetaObjectCallback(
|
||||||
|
isolate: *mut Isolate,
|
||||||
|
callback: HostInitializeImportMetaObjectCallback,
|
||||||
|
);
|
||||||
fn v8__Isolate__ThrowException(
|
fn v8__Isolate__ThrowException(
|
||||||
isolate: &Isolate,
|
isolate: &Isolate,
|
||||||
exception: &Value,
|
exception: &Value,
|
||||||
|
@ -131,6 +141,16 @@ impl Isolate {
|
||||||
) {
|
) {
|
||||||
unsafe { v8__Isolate__SetPromiseRejectCallback(self, callback) }
|
unsafe { v8__Isolate__SetPromiseRejectCallback(self, callback) }
|
||||||
}
|
}
|
||||||
|
/// This specifies the callback called by the upcoming importa.meta
|
||||||
|
/// language feature to retrieve host-defined meta data for a module.
|
||||||
|
pub fn set_host_initialize_import_meta_object_callback(
|
||||||
|
&mut self,
|
||||||
|
callback: HostInitializeImportMetaObjectCallback,
|
||||||
|
) {
|
||||||
|
unsafe {
|
||||||
|
v8__Isolate__SetHostInitializeImportMetaObjectCallback(self, callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Schedules an exception to be thrown when returning to JavaScript. When an
|
/// Schedules an exception to be thrown when returning to JavaScript. When an
|
||||||
/// exception has been scheduled it is illegal to invoke any JavaScript
|
/// exception has been scheduled it is illegal to invoke any JavaScript
|
||||||
|
|
|
@ -307,7 +307,7 @@ fn throw_exception() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn isolate_add_message_listener() {
|
fn add_message_listener() {
|
||||||
let g = setup();
|
let g = setup();
|
||||||
let mut params = v8::Isolate::create_params();
|
let mut params = v8::Isolate::create_params();
|
||||||
params.set_array_buffer_allocator(v8::Allocator::new_default_allocator());
|
params.set_array_buffer_allocator(v8::Allocator::new_default_allocator());
|
||||||
|
@ -344,6 +344,62 @@ fn isolate_add_message_listener() {
|
||||||
drop(g);
|
drop(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn unexpected_module_resolve_callback(
|
||||||
|
_context: v8::Local<v8::Context>,
|
||||||
|
_specifier: v8::Local<v8::String>,
|
||||||
|
_referrer: v8::Local<v8::Module>,
|
||||||
|
) -> *mut v8::Module {
|
||||||
|
unreachable!()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn set_host_initialize_import_meta_object_callback() {
|
||||||
|
let g = setup();
|
||||||
|
let mut params = v8::Isolate::create_params();
|
||||||
|
params.set_array_buffer_allocator(v8::Allocator::new_default_allocator());
|
||||||
|
let mut isolate = v8::Isolate::new(params);
|
||||||
|
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
static CALL_COUNT: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
|
||||||
|
extern "C" fn callback(
|
||||||
|
mut context: Local<v8::Context>,
|
||||||
|
_module: Local<v8::Module>,
|
||||||
|
meta: Local<v8::Object>,
|
||||||
|
) {
|
||||||
|
CALL_COUNT.fetch_add(1, Ordering::SeqCst);
|
||||||
|
let key = v8::String::new(&mut *context, "foo").unwrap();
|
||||||
|
let value = v8::String::new(&mut *context, "bar").unwrap();
|
||||||
|
meta.create_data_property(context, cast(key), value.into());
|
||||||
|
}
|
||||||
|
isolate.set_host_initialize_import_meta_object_callback(callback);
|
||||||
|
|
||||||
|
let mut locker = v8::Locker::new(&isolate);
|
||||||
|
v8::HandleScope::enter(&mut locker, |s| {
|
||||||
|
let mut context = v8::Context::new(s);
|
||||||
|
context.enter();
|
||||||
|
|
||||||
|
let source = mock_source(s, "google.com", "import.meta;");
|
||||||
|
let mut module =
|
||||||
|
v8::script_compiler::compile_module(&isolate, source).unwrap();
|
||||||
|
let result =
|
||||||
|
module.instantiate_module(context, unexpected_module_resolve_callback);
|
||||||
|
assert!(result.is_some());
|
||||||
|
let meta = module.evaluate(context).unwrap();
|
||||||
|
assert!(meta.is_object());
|
||||||
|
let meta: Local<v8::Object> = cast(meta);
|
||||||
|
let key = v8::String::new(&mut *context, "foo").unwrap();
|
||||||
|
let expected = v8::String::new(&mut *context, "bar").unwrap();
|
||||||
|
let actual = meta.get(context, key.into()).unwrap();
|
||||||
|
assert!(expected.strict_equals(actual));
|
||||||
|
assert_eq!(CALL_COUNT.load(Ordering::SeqCst), 1);
|
||||||
|
|
||||||
|
context.exit();
|
||||||
|
});
|
||||||
|
drop(locker);
|
||||||
|
drop(g);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn script_compile_and_run() {
|
fn script_compile_and_run() {
|
||||||
setup();
|
setup();
|
||||||
|
@ -794,6 +850,15 @@ fn mock_script_origin<'sc>(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn mock_source(
|
||||||
|
isolate: &mut impl AsMut<v8::Isolate>,
|
||||||
|
resource_name: &str,
|
||||||
|
source: &str,
|
||||||
|
) -> v8::script_compiler::Source {
|
||||||
|
let script_origin = mock_script_origin(isolate, resource_name);
|
||||||
|
v8::script_compiler::Source::new(v8_str(isolate, source), &script_origin)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn script_compiler_source() {
|
fn script_compiler_source() {
|
||||||
let g = setup();
|
let g = setup();
|
||||||
|
|
Loading…
Add table
Reference in a new issue