mirror of
https://github.com/denoland/rusty_v8.git
synced 2025-03-09 13:38:51 -04:00
default options for v8::script_compiler::compile_module (#125)
And other clean ups
This commit is contained in:
parent
51737506dd
commit
b97abb17b9
4 changed files with 45 additions and 55 deletions
|
@ -55,8 +55,7 @@ pub use isolate::Isolate;
|
||||||
pub use isolate::OwnedIsolate;
|
pub use isolate::OwnedIsolate;
|
||||||
pub use local::Local;
|
pub use local::Local;
|
||||||
pub use locker::Locker;
|
pub use locker::Locker;
|
||||||
pub use module::Module;
|
pub use module::*;
|
||||||
pub use module::ModuleStatus;
|
|
||||||
pub use number::{Integer, Number};
|
pub use number::{Integer, Number};
|
||||||
pub use object::Object;
|
pub use object::Object;
|
||||||
pub use primitive_array::PrimitiveArray;
|
pub use primitive_array::PrimitiveArray;
|
||||||
|
|
|
@ -11,11 +11,13 @@ use std::mem::MaybeUninit;
|
||||||
type v8__Module__ResolveCallback =
|
type v8__Module__ResolveCallback =
|
||||||
extern "C" fn(Local<Context>, Local<String>, Local<Module>) -> *mut Module;
|
extern "C" fn(Local<Context>, Local<String>, Local<Module>) -> *mut Module;
|
||||||
|
|
||||||
type ResolveCallback = fn(
|
/// Called during Module::instantiate_module. Provided with arguments:
|
||||||
Local<Context>,
|
/// (context, specifier, referrer)
|
||||||
Local<String>,
|
/// Return null on error.
|
||||||
Local<Module>,
|
/// Hint: to tranform Local<Module> to *mut Module do this:
|
||||||
) -> Option<Local<'static, Module>>;
|
/// &mut *module
|
||||||
|
pub type ResolveCallback =
|
||||||
|
fn(Local<Context>, Local<String>, Local<Module>) -> *mut Module;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn v8__Module__GetStatus(this: *const Module) -> ModuleStatus;
|
fn v8__Module__GetStatus(this: *const Module) -> ModuleStatus;
|
||||||
|
@ -144,10 +146,7 @@ impl Module {
|
||||||
) -> *mut Module {
|
) -> *mut Module {
|
||||||
let guard = RESOLVE_CALLBACK.lock().unwrap();
|
let guard = RESOLVE_CALLBACK.lock().unwrap();
|
||||||
let cb = guard.unwrap();
|
let cb = guard.unwrap();
|
||||||
match cb(context, specifier, referrer) {
|
cb(context, specifier, referrer)
|
||||||
None => std::ptr::null_mut(),
|
|
||||||
Some(mut p) => &mut *p,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
let r =
|
let r =
|
||||||
unsafe { v8__Module__InstantiateModule(self, context, c_cb) }.into();
|
unsafe { v8__Module__InstantiateModule(self, context, c_cb) }.into();
|
||||||
|
|
|
@ -79,6 +79,19 @@ pub enum NoCacheReason {
|
||||||
pub fn compile_module(
|
pub fn compile_module(
|
||||||
isolate: &Isolate,
|
isolate: &Isolate,
|
||||||
source: Source,
|
source: Source,
|
||||||
|
) -> Option<Local<Module>> {
|
||||||
|
compile_module2(
|
||||||
|
isolate,
|
||||||
|
source,
|
||||||
|
CompileOptions::NoCompileOptions,
|
||||||
|
NoCacheReason::NoReason,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Same as compile_module with more options.
|
||||||
|
pub fn compile_module2(
|
||||||
|
isolate: &Isolate,
|
||||||
|
source: Source,
|
||||||
options: CompileOptions,
|
options: CompileOptions,
|
||||||
no_cache_reason: NoCacheReason,
|
no_cache_reason: NoCacheReason,
|
||||||
) -> Option<Local<Module>> {
|
) -> Option<Local<Module>> {
|
||||||
|
|
|
@ -779,12 +779,7 @@ fn script_compiler_source() {
|
||||||
let source =
|
let source =
|
||||||
v8::script_compiler::Source::new(v8_str(scope, source), &script_origin);
|
v8::script_compiler::Source::new(v8_str(scope, source), &script_origin);
|
||||||
|
|
||||||
let result = v8::script_compiler::compile_module(
|
let result = v8::script_compiler::compile_module(&isolate, source);
|
||||||
&isolate,
|
|
||||||
source,
|
|
||||||
v8::script_compiler::CompileOptions::NoCompileOptions,
|
|
||||||
v8::script_compiler::NoCacheReason::NoReason,
|
|
||||||
);
|
|
||||||
assert!(result.is_some());
|
assert!(result.is_some());
|
||||||
|
|
||||||
context.exit();
|
context.exit();
|
||||||
|
@ -814,13 +809,8 @@ fn module_instantiation_failures1() {
|
||||||
let origin = mock_script_origin(scope, "foo.js");
|
let origin = mock_script_origin(scope, "foo.js");
|
||||||
let source = v8::script_compiler::Source::new(source_text, &origin);
|
let source = v8::script_compiler::Source::new(source_text, &origin);
|
||||||
|
|
||||||
let mut module = v8::script_compiler::compile_module(
|
let mut module =
|
||||||
&isolate,
|
v8::script_compiler::compile_module(&isolate, source).unwrap();
|
||||||
source,
|
|
||||||
v8::script_compiler::CompileOptions::NoCompileOptions,
|
|
||||||
v8::script_compiler::NoCacheReason::NoReason,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(v8::ModuleStatus::Uninstantiated, module.get_status());
|
assert_eq!(v8::ModuleStatus::Uninstantiated, module.get_status());
|
||||||
assert_eq!(2, module.get_module_requests_length());
|
assert_eq!(2, module.get_module_requests_length());
|
||||||
|
|
||||||
|
@ -848,11 +838,11 @@ fn module_instantiation_failures1() {
|
||||||
mut context: v8::Local<v8::Context>,
|
mut context: v8::Local<v8::Context>,
|
||||||
_specifier: v8::Local<v8::String>,
|
_specifier: v8::Local<v8::String>,
|
||||||
_referrer: v8::Local<v8::Module>,
|
_referrer: v8::Local<v8::Module>,
|
||||||
) -> Option<v8::Local<'static, v8::Module>> {
|
) -> *mut v8::Module {
|
||||||
let isolate: &mut v8::Isolate = context.as_mut();
|
let isolate: &mut v8::Isolate = context.as_mut();
|
||||||
let e = v8_str(isolate, "boom");
|
let e = v8_str(isolate, "boom");
|
||||||
isolate.throw_exception(e.into());
|
isolate.throw_exception(e.into());
|
||||||
None
|
std::ptr::null_mut()
|
||||||
}
|
}
|
||||||
let result = module.instantiate_module(context, resolve_callback);
|
let result = module.instantiate_module(context, resolve_callback);
|
||||||
assert!(result.is_none());
|
assert!(result.is_none());
|
||||||
|
@ -871,6 +861,18 @@ fn module_instantiation_failures1() {
|
||||||
drop(g);
|
drop(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn compile_specifier_as_module_resolve_callback(
|
||||||
|
mut context: v8::Local<v8::Context>,
|
||||||
|
specifier: v8::Local<v8::String>,
|
||||||
|
_referrer: v8::Local<v8::Module>,
|
||||||
|
) -> *mut v8::Module {
|
||||||
|
let isolate: &mut v8::Isolate = context.as_mut();
|
||||||
|
let origin = mock_script_origin(isolate, "module.js");
|
||||||
|
let source = v8::script_compiler::Source::new(specifier, &origin);
|
||||||
|
let module = v8::script_compiler::compile_module(isolate, source).unwrap();
|
||||||
|
&mut *cast(module)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn module_evaluation() {
|
fn module_evaluation() {
|
||||||
let g = setup();
|
let g = setup();
|
||||||
|
@ -891,37 +893,14 @@ fn module_evaluation() {
|
||||||
let origin = mock_script_origin(scope, "foo.js");
|
let origin = mock_script_origin(scope, "foo.js");
|
||||||
let source = v8::script_compiler::Source::new(source_text, &origin);
|
let source = v8::script_compiler::Source::new(source_text, &origin);
|
||||||
|
|
||||||
let mut module = v8::script_compiler::compile_module(
|
let mut module =
|
||||||
&isolate,
|
v8::script_compiler::compile_module(&isolate, source).unwrap();
|
||||||
source,
|
|
||||||
v8::script_compiler::CompileOptions::NoCompileOptions,
|
|
||||||
v8::script_compiler::NoCacheReason::NoReason,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(v8::ModuleStatus::Uninstantiated, module.get_status());
|
assert_eq!(v8::ModuleStatus::Uninstantiated, module.get_status());
|
||||||
|
|
||||||
fn resolve_callback(
|
let result = module.instantiate_module(
|
||||||
mut context: v8::Local<v8::Context>,
|
context,
|
||||||
specifier: v8::Local<v8::String>,
|
compile_specifier_as_module_resolve_callback,
|
||||||
_referrer: v8::Local<v8::Module>,
|
);
|
||||||
) -> Option<v8::Local<'static, v8::Module>> {
|
|
||||||
let isolate_: &mut v8::Isolate = context.as_mut();
|
|
||||||
let module_ = {
|
|
||||||
let mut escapable_scope = v8::EscapableHandleScope::new(isolate_);
|
|
||||||
let origin = mock_script_origin(isolate_, "module.js");
|
|
||||||
let source = v8::script_compiler::Source::new(specifier, &origin);
|
|
||||||
let module = v8::script_compiler::compile_module(
|
|
||||||
isolate_,
|
|
||||||
source,
|
|
||||||
v8::script_compiler::CompileOptions::NoCompileOptions,
|
|
||||||
v8::script_compiler::NoCacheReason::NoReason,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
escapable_scope.escape(cast(module))
|
|
||||||
};
|
|
||||||
Some(cast(module_))
|
|
||||||
}
|
|
||||||
let result = module.instantiate_module(context, resolve_callback);
|
|
||||||
assert!(result.unwrap());
|
assert!(result.unwrap());
|
||||||
assert_eq!(v8::ModuleStatus::Instantiated, module.get_status());
|
assert_eq!(v8::ModuleStatus::Instantiated, module.get_status());
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue