From 51bd3cd450e0e5663504e3a12ad32b37479c8246 Mon Sep 17 00:00:00 2001 From: Edward Shaw Date: Mon, 5 Sep 2016 03:42:47 +0100 Subject: [PATCH 1/4] Take module version from node headers. If module abi version isn't specified in env, take it from the included node headers. --- crates/neon-sys/src/module.rs | 3 +++ crates/neon-sys/src/neon.cc | 4 ++++ src/lib.rs | 4 +++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/neon-sys/src/module.rs b/crates/neon-sys/src/module.rs index 3a5227811..ca4aac220 100644 --- a/crates/neon-sys/src/module.rs +++ b/crates/neon-sys/src/module.rs @@ -6,4 +6,7 @@ extern "system" { #[link_name = "NeonSys_Module_ExecKernel"] pub fn exec_kernel(kernel: *mut c_void, callback: extern fn(*mut c_void, *mut c_void, *mut c_void), exports: Local, scope: *mut c_void); + #[link_name = "NeonSys_Module_GetVersion"] + pub fn get_version() -> i32; + } diff --git a/crates/neon-sys/src/neon.cc b/crates/neon-sys/src/neon.cc index 025bc8783..766d3fcd6 100644 --- a/crates/neon-sys/src/neon.cc +++ b/crates/neon-sys/src/neon.cc @@ -250,6 +250,10 @@ extern "C" void NeonSys_Module_ExecKernel(void *kernel, NeonSys_ModuleScopeCallb callback(kernel, exports, scope); } +extern "C" uint32_t NeonSys_Module_GetVersion() { + return NODE_MODULE_VERSION; +} + extern "C" void NeonSys_Class_ConstructBaseCallback(const v8::FunctionCallbackInfo& info) { Nan::HandleScope scope; v8::Local wrapper = v8::Local::Cast(info.Data()); diff --git a/src/lib.rs b/src/lib.rs index a41d67c94..cdfe27bc2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -75,7 +75,9 @@ macro_rules! register_module { unsafe { // Set the ABI version, which is passed in by `neon build` as an env var. - __NODE_MODULE.version = env!("NEON_NODE_ABI").parse().unwrap(); + __NODE_MODULE.version = option_env!("NEON_NODE_ABI") + .map(|s| s.parse().unwrap()) + .unwrap_or_else(|| $crate::macro_internal::sys::module::get_version()); node_module_register(&mut __NODE_MODULE); } From 1d4c398c1fa05479a6be7659cf07e6732ea2c2a7 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 19 Oct 2016 15:06:10 +0200 Subject: [PATCH 2/4] Use the NODE_MODULE_VERSION const instead of the environment variable Signed-off-by: Nathan Sobo --- src/lib.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7296b279a..491a6561c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -75,11 +75,8 @@ macro_rules! register_module { } unsafe { - // Set the ABI version, which is passed in by `neon build` as an env var. - __NODE_MODULE.version = option_env!("NEON_NODE_ABI") - .map(|s| s.parse().unwrap()) - .unwrap_or_else(|| $crate::macro_internal::sys::module::get_version()); - + // Set the ABI version based on the NODE_MODULE_VERSION constant provided by the current node headers. + __NODE_MODULE.version = $crate::macro_internal::sys::module::get_version(); node_module_register(&mut __NODE_MODULE); } } From 97bc842e50ce85b5fa85c7f2f29541a327fe34da Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 19 Oct 2016 16:57:12 +0200 Subject: [PATCH 3/4] Use FunctionTemplate instead of Function for adding methods to a class Fixes rustbridge/neon#119, which was causing hard crashes on newer versions of node. Signed-off-by: Nathan Sobo --- crates/neon-sys/src/fun.rs | 3 +++ crates/neon-sys/src/neon.cc | 11 ++++++++++- crates/neon-sys/src/neon.h | 2 +- src/internal/js/class.rs | 4 ++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/neon-sys/src/fun.rs b/crates/neon-sys/src/fun.rs index d38ac8828..c0ab99b36 100644 --- a/crates/neon-sys/src/fun.rs +++ b/crates/neon-sys/src/fun.rs @@ -6,6 +6,9 @@ extern "system" { #[link_name = "NeonSys_Fun_New"] pub fn new(out: &mut Local, isolate: *mut c_void, callback: *mut c_void, kernel: *mut c_void) -> bool; + #[link_name = "NeonSys_Fun_Template_New"] + pub fn new_template(out: &mut Local, isolate: *mut c_void, callback: *mut c_void, kernel: *mut c_void) -> bool; + #[link_name = "NeonSys_Fun_ExecKernel"] pub fn exec_kernel(kernel: *mut c_void, callback: extern fn(*mut c_void, *mut c_void, *mut c_void), info: &FunctionCallbackInfo, scope: *mut c_void); diff --git a/crates/neon-sys/src/neon.cc b/crates/neon-sys/src/neon.cc index 766d3fcd6..f2233b3a4 100644 --- a/crates/neon-sys/src/neon.cc +++ b/crates/neon-sys/src/neon.cc @@ -355,7 +355,7 @@ extern "C" void NeonSys_Class_ThrowThisError(v8::Isolate *isolate, void *metadat Nan::ThrowTypeError(metadata->GetThisError().ToJsString(isolate, "this is not an object of the expected type.")); } -extern "C" bool NeonSys_Class_AddMethod(v8::Isolate *isolate, void *metadata_pointer, const char *name, uint32_t byte_length, v8::Local method) { +extern "C" bool NeonSys_Class_AddMethod(v8::Isolate *isolate, void *metadata_pointer, const char *name, uint32_t byte_length, v8::Local method) { neon::ClassMetadata *metadata = static_cast(metadata_pointer); v8::Local ft = metadata->GetTemplate(isolate); v8::Local pt = ft->PrototypeTemplate(); @@ -377,6 +377,15 @@ extern "C" void *NeonSys_Class_GetInstanceInternals(v8::Local obj) { return static_cast(obj->GetAlignedPointerFromInternalField(0))->GetInternals(); } +extern "C" bool NeonSys_Fun_Template_New(v8::Local *out, v8::Isolate *isolate, v8::FunctionCallback callback, void *kernel) { + v8::Local wrapper = v8::External::New(isolate, kernel); + if (wrapper.IsEmpty()) { + return false; + } + + v8::MaybeLocal maybe_result = v8::FunctionTemplate::New(isolate, callback, wrapper); + return maybe_result.ToLocal(out); +} extern "C" bool NeonSys_Fun_New(v8::Local *out, v8::Isolate *isolate, v8::FunctionCallback callback, void *kernel) { v8::Local wrapper = v8::External::New(isolate, kernel); diff --git a/crates/neon-sys/src/neon.h b/crates/neon-sys/src/neon.h index 16831d694..c304b7c00 100644 --- a/crates/neon-sys/src/neon.h +++ b/crates/neon-sys/src/neon.h @@ -115,7 +115,7 @@ extern "C" { bool NeonSys_Class_HasInstance(void *metadata, v8::Local v); bool NeonSys_Class_SetName(v8::Isolate *isolate, void *metadata, const char *name, uint32_t byte_length); void NeonSys_Class_ThrowThisError(v8::Isolate *isolate, void *metadata_pointer); - bool NeonSys_Class_AddMethod(v8::Isolate *isolate, void *metadata, const char *name, uint32_t byte_length, v8::Local method); + bool NeonSys_Class_AddMethod(v8::Isolate *isolate, void *metadata, const char *name, uint32_t byte_length, v8::Local method); void NeonSys_Class_MetadataToClass(v8::Local *out, v8::Isolate *isolate, void *metadata); void *NeonSys_Class_GetInstanceInternals(v8::Local obj); diff --git a/src/internal/js/class.rs b/src/internal/js/class.rs index 870b3e28b..b89a9d1f1 100644 --- a/src/internal/js/class.rs +++ b/src/internal/js/class.rs @@ -274,9 +274,9 @@ pub trait ClassInternal: Class { } for (name, method) in descriptor.methods { - let method: Handle = try!(build(|out| { + let method: Handle = try!(build(|out| { let (method_callback, method_kernel) = method.export(); - neon_sys::fun::new(out, isolate, method_callback, method_kernel) + neon_sys::fun::new_template(out, isolate, method_callback, method_kernel) })); if !neon_sys::class::add_method(isolate, metadata_pointer, name.as_ptr(), name.len() as u32, method.to_raw()) { return Err(Throw); From 40a91a0aa1bb3ac93ec26fc75d5bf2edf601fecf Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 25 Oct 2016 12:30:38 +0200 Subject: [PATCH 4/4] :art: --- crates/neon-sys/src/fun.rs | 2 +- crates/neon-sys/src/neon.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/neon-sys/src/fun.rs b/crates/neon-sys/src/fun.rs index c0ab99b36..b66ce4a93 100644 --- a/crates/neon-sys/src/fun.rs +++ b/crates/neon-sys/src/fun.rs @@ -6,7 +6,7 @@ extern "system" { #[link_name = "NeonSys_Fun_New"] pub fn new(out: &mut Local, isolate: *mut c_void, callback: *mut c_void, kernel: *mut c_void) -> bool; - #[link_name = "NeonSys_Fun_Template_New"] + #[link_name = "NeonSys_Fun_New_Template"] pub fn new_template(out: &mut Local, isolate: *mut c_void, callback: *mut c_void, kernel: *mut c_void) -> bool; #[link_name = "NeonSys_Fun_ExecKernel"] diff --git a/crates/neon-sys/src/neon.cc b/crates/neon-sys/src/neon.cc index f2233b3a4..731373ada 100644 --- a/crates/neon-sys/src/neon.cc +++ b/crates/neon-sys/src/neon.cc @@ -377,7 +377,7 @@ extern "C" void *NeonSys_Class_GetInstanceInternals(v8::Local obj) { return static_cast(obj->GetAlignedPointerFromInternalField(0))->GetInternals(); } -extern "C" bool NeonSys_Fun_Template_New(v8::Local *out, v8::Isolate *isolate, v8::FunctionCallback callback, void *kernel) { +extern "C" bool NeonSys_Fun_New_Template(v8::Local *out, v8::Isolate *isolate, v8::FunctionCallback callback, void *kernel) { v8::Local wrapper = v8::External::New(isolate, kernel); if (wrapper.IsEmpty()) { return false;