Skip to content

Commit c820e73

Browse files
committed
WIP segfault
1 parent cf09d26 commit c820e73

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
lines changed

core/isolate.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,16 @@ impl Isolate {
217217
referrer: *const c_char,
218218
id: deno_dyn_import_id,
219219
) {
220+
let isolate = unsafe { Isolate::from_raw_ptr(user_data) };
221+
println!(
222+
"isolate.config.dyn_import {}",
223+
isolate.config.dyn_import.is_some()
224+
);
225+
220226
let specifier = unsafe { CStr::from_ptr(specifier).to_str().unwrap() };
221227
let referrer = unsafe { CStr::from_ptr(referrer).to_str().unwrap() };
222-
debug!("dyn_import specifier {} referrer {} ", specifier, referrer);
228+
println!("dyn_import specifier {} referrer {} ", specifier, referrer);
223229

224-
let isolate = unsafe { Isolate::from_raw_ptr(user_data) };
225230
if let Some(ref f) = isolate.config.dyn_import {
226231
let inner = f(specifier, referrer);
227232
let fut = DynImport { inner, id };
@@ -511,7 +516,7 @@ impl Future for Isolate {
511516

512517
loop {
513518
// If there are any pending dyn_import futures, do those first.
514-
if !self.pending_dyn_imports.is_empty(){
519+
if !self.pending_dyn_imports.is_empty() {
515520
match self.pending_dyn_imports.poll() {
516521
Err(()) => panic!("unexpected dyn_import error"),
517522
Ok(Ready(None)) => break,
@@ -921,16 +926,16 @@ pub mod tests {
921926
let mod_b2 = mod_b.clone();
922927

923928
let mut config = Config::default();
924-
config.dyn_import(move |specifier, referrer| {
929+
config.dyn_import(move |_specifier, referrer| {
925930
count_.fetch_add(1, Ordering::Relaxed);
926-
assert_eq!(specifier, "foo.js");
931+
// assert_eq!(specifier, "foo.js");
927932
assert_eq!(referrer, "dyn_import3.js");
928933
let mod_id = mod_b2.lock().unwrap();
929-
println!("dyn_import callback mod_id = {}", *mod_id);
930934
Box::new(futures::future::ok(*mod_id))
931935
});
932936

933937
let mut isolate = Isolate::new(StartupData::None, config);
938+
934939
// Instantiate mod_b
935940
{
936941
let mut mod_id = mod_b.lock().unwrap();
@@ -947,9 +952,14 @@ pub mod tests {
947952
"dyn_import3.js",
948953
r#"
949954
(async () => {
950-
let mod = await import("foo.js");
955+
let mod = await import("foo1.js");
956+
if (mod.b() !== 'b') {
957+
throw Error("bad1");
958+
}
959+
// And again!
960+
mod = await import("foo2.js");
951961
if (mod.b() !== 'b') {
952-
throw Error("bad");
962+
throw Error("bad2");
953963
}
954964
})();
955965
"#,

core/libdeno/binding.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,8 @@ v8::MaybeLocal<v8::Promise> HostImportModuleDynamicallyCallback(
515515
auto* isolate = context->GetIsolate();
516516
DenoIsolate* d = DenoIsolate::FromIsolate(isolate);
517517
v8::Isolate::Scope isolate_scope(isolate);
518+
v8::Context::Scope context_scope(context);
519+
v8::EscapableHandleScope handle_scope(isolate);
518520

519521
v8::String::Utf8Value specifier_str(isolate, specifier);
520522

@@ -536,9 +538,15 @@ v8::MaybeLocal<v8::Promise> HostImportModuleDynamicallyCallback(
536538
std::make_tuple(import_id),
537539
std::make_tuple(d->isolate_, resolver));
538540

539-
d->dyn_import_cb_(d->user_data_, *specifier_str, *referrer_name_str,
540-
import_id);
541-
return resolver->GetPromise();
541+
printf("BEFORE dyn_import_cb_ %s \n", *specifier_str);
542+
{
543+
// deno::UserDataScope user_data_scope(d, d->user_data_);
544+
d->dyn_import_cb_(d->user_data_, *specifier_str, *referrer_name_str,
545+
import_id);
546+
}
547+
printf("AFTER dyn_import_cb_ %s \n", *specifier_str);
548+
auto promise = resolver->GetPromise();
549+
return handle_scope.Escape(promise);
542550
}
543551

544552
void DenoIsolate::AddIsolate(v8::Isolate* isolate) {

core/libdeno/modules.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,17 @@ void deno_mod_evaluate(Deno* d_, void* user_data, deno_mod id) {
153153

154154
void deno_dyn_import(Deno* d_, deno_dyn_import_id import_id, deno_mod mod_id) {
155155
auto* d = unwrap(d_);
156+
// deno::UserDataScope user_data_scope(d, user_data);
157+
156158
auto* isolate = d->isolate_;
157159
v8::Isolate::Scope isolate_scope(isolate);
158160
v8::Locker locker(isolate);
159161
v8::HandleScope handle_scope(isolate);
160162
auto context = d->context_.Get(d->isolate_);
161163
v8::Context::Scope context_scope(context);
162164

165+
v8::TryCatch try_catch(isolate);
166+
163167
auto it = d->dyn_import_map_.find(import_id);
164168
if (it == d->dyn_import_map_.end()) {
165169
CHECK(false); // TODO(ry) error on bad import_id.
@@ -184,6 +188,10 @@ void deno_dyn_import(Deno* d_, deno_dyn_import_id import_id, deno_mod mod_id) {
184188

185189
persistent_promise->Reset();
186190
d->dyn_import_map_.erase(it);
191+
192+
if (try_catch.HasCaught()) {
193+
HandleException(context, try_catch.Exception());
194+
}
187195
}
188196

189197
} // extern "C"

0 commit comments

Comments
 (0)