Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plain data objects #493

Merged
merged 19 commits into from May 14, 2020
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 10 additions & 1 deletion crates/neon-runtime/src/napi/array.rs
@@ -1,5 +1,14 @@
//! Facilities for working with Array `napi_value`s.

use raw::{Local, Env};

use nodejs_sys as napi;

pub unsafe extern "C" fn new(_out: &mut Local, _env: Env, _length: u32) { unimplemented!() }

pub unsafe extern "C" fn len(_array: Local) -> u32 { unimplemented!() }
/// Gets the length of a `napi_value` containing a JavaScript Array.
pub unsafe extern "C" fn len(env: Env, array: Local) -> u32 {
let mut len = 0;
assert_eq!(napi::napi_get_array_length(env, array, &mut len as *mut _), napi::napi_status::napi_ok);
dherman marked this conversation as resolved.
Show resolved Hide resolved
len
}
64 changes: 57 additions & 7 deletions crates/neon-runtime/src/napi/object.rs
Expand Up @@ -4,17 +4,58 @@ use nodejs_sys as napi;

use raw::{Env, Local};

pub unsafe extern "C" fn new(_out: &mut Local) { unimplemented!() }
pub unsafe extern "C" fn new(out: &mut Local, env: Env) {
napi::napi_create_object(env, out as *mut _);
}

pub unsafe extern "C" fn get_own_property_names(out: &mut Local, env: Env, object: Local) -> bool {
let status = napi::napi_get_property_names(env, object, out as *mut _);

pub unsafe extern "C" fn get_own_property_names(_out: &mut Local, _object: Local) -> bool { unimplemented!() }
status == napi::napi_status::napi_ok
}

// Unused.
pub unsafe extern "C" fn get_isolate(_obj: Local) -> Env { unimplemented!() }

pub unsafe extern "C" fn get_index(_out: &mut Local, _object: Local, _index: u32) -> bool { unimplemented!() }
pub unsafe extern "C" fn get_index(out: &mut Local, env: Env, object: Local, index: u32) -> bool {
let status = napi::napi_get_element(env, object, index, out as *mut _);

status == napi::napi_status::napi_ok
}

pub unsafe extern "C" fn set_index(out: &mut bool, env: Env, object: Local, index: u32, val: Local) -> bool {
let status = napi::napi_set_element(env, object, index, val);
*out = status == napi::napi_status::napi_ok;
goto-bus-stop marked this conversation as resolved.
Show resolved Hide resolved

pub unsafe extern "C" fn set_index(_out: &mut bool, _object: Local, _index: u32, _val: Local) -> bool { unimplemented!() }
*out
}

pub unsafe extern "C" fn get_string(_out: &mut Local, _object: Local, _key: *const u8, _len: i32) -> bool { unimplemented!() }
pub unsafe extern "C" fn get_string(env: Env, out: &mut Local, object: Local, key: *const u8, len: i32) -> bool {
let mut key_val = MaybeUninit::uninit();

// Not using `crate::string::new()` because it requires a _reference_ to a Local,
// while we only have uninitialized memory.
if napi::napi_create_string_utf8(
env,
key as *const i8,
len as usize,
key_val.as_mut_ptr(),
) != napi::napi_status::napi_ok {
return false;
}

// Not using napi_get_named_property() because the `key` may not be null terminated.
if napi::napi_get_property(
env,
object,
key_val.assume_init(),
out as *mut _,
) != napi::napi_status::napi_ok {
return false;
}

true
}

pub unsafe extern "C" fn set_string(
env: Env,
Expand Down Expand Up @@ -51,6 +92,15 @@ pub unsafe extern "C" fn set_string(
true
}

pub unsafe extern "C" fn get(_out: &mut Local, _object: Local, _key: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn get(out: &mut Local, env: Env, object: Local, key: Local) -> bool {
let status = napi::napi_get_property(env, object, key, out as *mut _);

pub unsafe extern "C" fn set(_out: &mut bool, _object: Local, _key: Local, _val: Local) -> bool { unimplemented!() }
status == napi::napi_status::napi_ok
}

pub unsafe extern "C" fn set(out: &mut bool, env: Env, object: Local, key: Local, val: Local) -> bool {
let status = napi::napi_set_property(env, object, key, val);
*out = status == napi::napi_status::napi_ok;
goto-bus-stop marked this conversation as resolved.
Show resolved Hide resolved

*out
}
41 changes: 29 additions & 12 deletions crates/neon-runtime/src/napi/tag.rs
@@ -1,23 +1,40 @@
use raw::Local;
use raw::{Env, Local};

pub unsafe extern "C" fn is_undefined(_val: Local) -> bool { unimplemented!() }
use nodejs_sys as napi;

pub unsafe extern "C" fn is_null(_val: Local) -> bool { unimplemented!() }
unsafe fn is_type(env: Env, val: Local, expect: napi::napi_valuetype) -> bool {
let mut actual = napi::napi_valuetype::napi_undefined;
if napi::napi_typeof(env, val, &mut actual as *mut _) == napi::napi_status::napi_ok {
actual == expect
} else {
false
}
}

pub unsafe extern "C" fn is_number(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_undefined(_env: Env, _val: Local) -> bool { unimplemented!() }

pub unsafe extern "C" fn is_boolean(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_null(_env: Env, _val: Local) -> bool { unimplemented!() }

pub unsafe extern "C" fn is_string(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_number(env: Env, val: Local) -> bool {
is_type(env, val, napi::napi_valuetype::napi_number)
}

pub unsafe extern "C" fn is_object(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_boolean(env: Env, val: Local) -> bool {
is_type(env, val, napi::napi_valuetype::napi_boolean)
}

pub unsafe extern "C" fn is_array(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_string(env: Env, val: Local) -> bool {
is_type(env, val, napi::napi_valuetype::napi_string)
}

pub unsafe extern "C" fn is_function(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_object(_env: Env, _val: Local) -> bool { unimplemented!() }
goto-bus-stop marked this conversation as resolved.
Show resolved Hide resolved

pub unsafe extern "C" fn is_error(_val: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_array(_env: Env, _val: Local) -> bool { unimplemented!() }

pub unsafe extern "C" fn is_buffer(_obj: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_function(_env: Env, _val: Local) -> bool { unimplemented!() }

pub unsafe extern "C" fn is_arraybuffer(_obj: Local) -> bool { unimplemented!() }
pub unsafe extern "C" fn is_error(_env: Env, _val: Local) -> bool { unimplemented!() }

pub unsafe extern "C" fn is_buffer(_env: Env, _obj: Local) -> bool { unimplemented!() }

pub unsafe extern "C" fn is_arraybuffer(_env: Env, _obj: Local) -> bool { unimplemented!() }
29 changes: 15 additions & 14 deletions crates/neon-sys/native/src/neon.cc
Expand Up @@ -48,11 +48,11 @@ extern "C" void Neon_Call_Get(v8::FunctionCallbackInfo<v8::Value> *info, int32_t
*out = (*info)[i];
}

extern "C" void Neon_Object_New(v8::Local<v8::Object> *out) {
extern "C" void Neon_Object_New(v8::Local<v8::Object> *out, v8::Isolate *isolate) {
*out = Nan::New<v8::Object>();
}

extern "C" bool Neon_Object_GetOwnPropertyNames(v8::Local<v8::Array> *out, v8::Local<v8::Object> obj) {
extern "C" bool Neon_Object_GetOwnPropertyNames(v8::Local<v8::Array> *out, v8::Isolate *isolate, v8::Local<v8::Object> obj) {
Nan::MaybeLocal<v8::Array> maybe = Nan::GetOwnPropertyNames(obj);
return maybe.ToLocal(out);
}
Expand Down Expand Up @@ -139,6 +139,7 @@ extern "C" bool Neon_Object_Get(v8::Local<v8::Value> *out, v8::Local<v8::Object>
}

extern "C" bool Neon_Object_Set(bool *out, v8::Local<v8::Object> obj, v8::Local<v8::Value> key, v8::Local<v8::Value> val) {
// Only returns `Just(true)` or `Empty()`.
Nan::Maybe<bool> maybe = Nan::Set(obj, key, val);
if (maybe.IsJust()) {
*out = maybe.FromJust();
Expand All @@ -151,7 +152,7 @@ extern "C" void Neon_Array_New(v8::Local<v8::Array> *out, v8::Isolate *isolate,
*out = v8::Array::New(isolate, length);
}

extern "C" uint32_t Neon_Array_Length(v8::Local<v8::Array> array) {
extern "C" uint32_t Neon_Array_Length(v8::Isolate *isolate, v8::Local<v8::Array> array) {
return array->Length();
}

Expand Down Expand Up @@ -204,7 +205,7 @@ extern "C" size_t Neon_Buffer_Data(void **base_out, v8::Local<v8::Object> obj) {
return node::Buffer::Length(obj);
}

extern "C" bool Neon_Tag_IsBuffer(v8::Local<v8::Value> obj) {
extern "C" bool Neon_Tag_IsBuffer(v8::Isolate *isolate, v8::Local<v8::Value> obj) {
return node::Buffer::HasInstance(obj);
}

Expand All @@ -221,7 +222,7 @@ extern "C" size_t Neon_ArrayBuffer_Data(void **base_out, v8::Local<v8::ArrayBuff
}


extern "C" bool Neon_Tag_IsArrayBuffer(v8::Local<v8::Value> value) {
extern "C" bool Neon_Tag_IsArrayBuffer(v8::Isolate *isolate, v8::Local<v8::Value> value) {
return value->IsArrayBuffer();
}

Expand Down Expand Up @@ -446,39 +447,39 @@ extern "C" bool Neon_Fun_Construct(v8::Local<v8::Object> *out, v8::Isolate *isol
return maybe_result.ToLocal(out);
}

extern "C" bool Neon_Tag_IsUndefined(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsUndefined(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsUndefined();
}

extern "C" bool Neon_Tag_IsNull(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsNull(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsNull();
}

extern "C" bool Neon_Tag_IsNumber(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsNumber(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsNumber();
}

extern "C" bool Neon_Tag_IsBoolean(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsBoolean(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsBoolean();
}

extern "C" bool Neon_Tag_IsString(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsString(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsString();
}

extern "C" bool Neon_Tag_IsObject(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsObject(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsObject();
}

extern "C" bool Neon_Tag_IsArray(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsArray(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsArray();
}

extern "C" bool Neon_Tag_IsFunction(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsFunction(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsFunction();
}

extern "C" bool Neon_Tag_IsError(v8::Local<v8::Value> val) {
extern "C" bool Neon_Tag_IsError(v8::Isolate *isolate, v8::Local<v8::Value> val) {
return val->IsNativeError();
}

Expand Down
28 changes: 14 additions & 14 deletions crates/neon-sys/native/src/neon.h
Expand Up @@ -29,8 +29,8 @@ extern "C" {
bool Neon_Primitive_IsUint32(v8::Local<v8::Primitive> p);
bool Neon_Primitive_IsInt32(v8::Local<v8::Primitive> p);

void Neon_Object_New(v8::Local<v8::Object> *out);
bool Neon_Object_GetOwnPropertyNames(v8::Local<v8::Array> *out, v8::Local<v8::Object> obj);
void Neon_Object_New(v8::Local<v8::Object> *out, v8::Isolate *isolate);
bool Neon_Object_GetOwnPropertyNames(v8::Local<v8::Array> *out, v8::Isolate *isolate, v8::Local<v8::Object> obj);
void *Neon_Object_GetIsolate(v8::Local<v8::Object> obj);
bool Neon_Object_Get_Index(v8::Local<v8::Value> *out, v8::Local<v8::Object> object, uint32_t index);
bool Neon_Object_Set_Index(bool *out, v8::Local<v8::Object> object, uint32_t index, v8::Local<v8::Value> val);
Expand All @@ -40,7 +40,7 @@ extern "C" {
bool Neon_Object_Set(bool *out, v8::Local<v8::Object> obj, v8::Local<v8::Value> key, v8::Local<v8::Value> val);

void Neon_Array_New(v8::Local<v8::Array> *out, v8::Isolate *isolate, uint32_t length);
uint32_t Neon_Array_Length(v8::Local<v8::Array> array);
uint32_t Neon_Array_Length(v8::Isolate *isolate, v8::Local<v8::Array> array);

bool Neon_String_New(v8::Local<v8::String> *out, v8::Isolate *isolate, const uint8_t *data, int32_t len);
int32_t Neon_String_Utf8Length(v8::Local<v8::String> str);
Expand Down Expand Up @@ -109,17 +109,17 @@ extern "C" {

uint32_t Neon_Module_GetVersion();

bool Neon_Tag_IsUndefined(v8::Local<v8::Value> val);
bool Neon_Tag_IsNull(v8::Local<v8::Value> val);
bool Neon_Tag_IsBoolean(v8::Local<v8::Value> val);
bool Neon_Tag_IsNumber(v8::Local<v8::Value> val);
bool Neon_Tag_IsString(v8::Local<v8::Value> val);
bool Neon_Tag_IsObject(v8::Local<v8::Value> val);
bool Neon_Tag_IsArray(v8::Local<v8::Value> val);
bool Neon_Tag_IsFunction(v8::Local<v8::Value> val);
bool Neon_Tag_IsBuffer(v8::Local<v8::Value> obj);
bool Neon_Tag_IsArrayBuffer(v8::Local<v8::Value> obj);
bool Neon_Tag_IsError(v8::Local<v8::Value> val);
bool Neon_Tag_IsUndefined(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsNull(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsBoolean(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsNumber(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsString(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsObject(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsArray(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsFunction(v8::Isolate *isolate, v8::Local<v8::Value> val);
bool Neon_Tag_IsBuffer(v8::Isolate *isolate, v8::Local<v8::Value> obj);
bool Neon_Tag_IsArrayBuffer(v8::Isolate *isolate, v8::Local<v8::Value> obj);
bool Neon_Tag_IsError(v8::Isolate *isolate, v8::Local<v8::Value> val);

void Neon_Error_NewError(v8::Local<v8::Value> *out, v8::Local<v8::String> msg);
void Neon_Error_NewTypeError(v8::Local<v8::Value> *out, v8::Local<v8::String> msg);
Expand Down
28 changes: 14 additions & 14 deletions crates/neon-sys/src/lib.rs
Expand Up @@ -84,7 +84,7 @@ pub struct InheritedHandleScope;
extern "C" {

pub fn Neon_Array_New(out: &mut Local, isolate: Isolate, length: u32);
pub fn Neon_Array_Length(array: Local) -> u32;
pub fn Neon_Array_Length(isolate: Isolate, array: Local) -> u32;

pub fn Neon_ArrayBuffer_New(out: &mut Local, isolate: Isolate, size: u32) -> bool;
pub fn Neon_ArrayBuffer_Data<'a, 'b>(base_out: &'a mut *mut c_void, obj: Local) -> usize;
Expand Down Expand Up @@ -143,8 +143,8 @@ extern "C" {
pub fn Neon_Module_ExecCallback(callback: CCallback, exports: Local, vm: *mut c_void);
pub fn Neon_Module_GetVersion() -> i32;

pub fn Neon_Object_New(out: &mut Local);
pub fn Neon_Object_GetOwnPropertyNames(out: &mut Local, object: Local) -> bool;
pub fn Neon_Object_New(out: &mut Local, isolate: Isolate);
pub fn Neon_Object_GetOwnPropertyNames(out: &mut Local, isolate: Isolate, object: Local) -> bool;
pub fn Neon_Object_GetIsolate(obj: Local) -> Isolate;
pub fn Neon_Object_Get_Index(out: &mut Local, object: Local, index: u32) -> bool;
pub fn Neon_Object_Set_Index(out: &mut bool, object: Local, index: u32, val: Local) -> bool;
Expand Down Expand Up @@ -181,17 +181,17 @@ extern "C" {
pub fn Neon_String_Utf8Length(str: Local) -> isize;
pub fn Neon_String_Data(out: *mut u8, len: isize, str: Local) -> isize;

pub fn Neon_Tag_IsUndefined(val: Local) -> bool;
pub fn Neon_Tag_IsNull(val: Local) -> bool;
pub fn Neon_Tag_IsNumber(val: Local) -> bool;
pub fn Neon_Tag_IsBoolean(val: Local) -> bool;
pub fn Neon_Tag_IsString(val: Local) -> bool;
pub fn Neon_Tag_IsObject(val: Local) -> bool;
pub fn Neon_Tag_IsArray(val: Local) -> bool;
pub fn Neon_Tag_IsFunction(val: Local) -> bool;
pub fn Neon_Tag_IsError(val: Local) -> bool;
pub fn Neon_Tag_IsBuffer(obj: Local) -> bool;
pub fn Neon_Tag_IsArrayBuffer(obj: Local) -> bool;
pub fn Neon_Tag_IsUndefined(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsNull(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsNumber(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsBoolean(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsString(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsObject(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsArray(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsFunction(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsError(isolate: Isolate, val: Local) -> bool;
pub fn Neon_Tag_IsBuffer(isolate: Isolate, obj: Local) -> bool;
pub fn Neon_Tag_IsArrayBuffer(isolate: Isolate, obj: Local) -> bool;

pub fn Neon_Task_Schedule(task: *mut c_void,
perform: unsafe extern fn(*mut c_void) -> *mut c_void,
Expand Down