mirror of
https://github.com/denoland/rusty_v8.git
synced 2025-01-13 01:22:42 -05:00
add v8::PropertyCallbackInfo (#68)
This commit is contained in:
parent
9e30db08ce
commit
85229bdd8a
5 changed files with 78 additions and 11 deletions
|
@ -21,6 +21,9 @@ static_assert(sizeof(v8::PromiseRejectMessage) == sizeof(size_t) * 3,
|
||||||
|
|
||||||
static_assert(sizeof(v8::Locker) == sizeof(size_t) * 2, "Locker size mismatch");
|
static_assert(sizeof(v8::Locker) == sizeof(size_t) * 2, "Locker size mismatch");
|
||||||
|
|
||||||
|
static_assert(sizeof(v8::ReturnValue<v8::Value>) == sizeof(size_t) * 1,
|
||||||
|
"ReturnValue size mismatch");
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
void v8__V8__SetFlagsFromCommandLine(int* argc, char** argv) {
|
void v8__V8__SetFlagsFromCommandLine(int* argc, char** argv) {
|
||||||
|
@ -272,11 +275,10 @@ v8::Isolate* v8__FunctionCallbackInfo__GetIsolate(
|
||||||
return self->GetIsolate();
|
return self->GetIsolate();
|
||||||
}
|
}
|
||||||
|
|
||||||
v8::ReturnValue<v8::Value>* v8__FunctionCallbackInfo__GetReturnValue(
|
void v8__FunctionCallbackInfo__GetReturnValue(
|
||||||
v8::FunctionCallbackInfo<v8::Value>* self) {
|
v8::FunctionCallbackInfo<v8::Value>* self,
|
||||||
v8::ReturnValue<v8::Value>* rv =
|
v8::ReturnValue<v8::Value>* out) {
|
||||||
new v8::ReturnValue<v8::Value>(self->GetReturnValue());
|
*out = self->GetReturnValue();
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void v8__ReturnValue__Set(v8::ReturnValue<v8::Value>* self,
|
void v8__ReturnValue__Set(v8::ReturnValue<v8::Value>* self,
|
||||||
|
@ -395,6 +397,22 @@ v8::Value* v8__PromiseRejectMessage__GetValue(
|
||||||
return local_to_ptr(self.GetValue());
|
return local_to_ptr(self.GetValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v8::Isolate* v8__PropertyCallbackInfo__GetIsolate(
|
||||||
|
const v8::PropertyCallbackInfo<v8::Value>* self) {
|
||||||
|
return self->GetIsolate();
|
||||||
|
}
|
||||||
|
|
||||||
|
v8::Object* v8__PropertyCallbackInfo__This(
|
||||||
|
const v8::PropertyCallbackInfo<v8::Value>* self) {
|
||||||
|
return local_to_ptr(self->This());
|
||||||
|
}
|
||||||
|
|
||||||
|
void v8__PropertyCallbackInfo__GetReturnValue(
|
||||||
|
const v8::PropertyCallbackInfo<v8::Value>* self,
|
||||||
|
v8::ReturnValue<v8::Value>* out) {
|
||||||
|
*out = self->GetReturnValue();
|
||||||
|
}
|
||||||
|
|
||||||
v8::Platform* v8__platform__NewDefaultPlatform() {
|
v8::Platform* v8__platform__NewDefaultPlatform() {
|
||||||
// TODO: support optional arguments.
|
// TODO: support optional arguments.
|
||||||
return v8::platform::NewDefaultPlatform().release();
|
return v8::platform::NewDefaultPlatform().release();
|
||||||
|
|
|
@ -3,6 +3,7 @@ use crate::Context;
|
||||||
use crate::Isolate;
|
use crate::Isolate;
|
||||||
use crate::Local;
|
use crate::Local;
|
||||||
use crate::Value;
|
use crate::Value;
|
||||||
|
use std::mem::MaybeUninit;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn v8__Function__New(
|
fn v8__Function__New(
|
||||||
|
@ -32,7 +33,8 @@ extern "C" {
|
||||||
fn v8__FunctionCallbackInfo__Length(info: &FunctionCallbackInfo) -> int;
|
fn v8__FunctionCallbackInfo__Length(info: &FunctionCallbackInfo) -> int;
|
||||||
fn v8__FunctionCallbackInfo__GetReturnValue(
|
fn v8__FunctionCallbackInfo__GetReturnValue(
|
||||||
info: &FunctionCallbackInfo,
|
info: &FunctionCallbackInfo,
|
||||||
) -> *mut ReturnValue;
|
out: *mut ReturnValue,
|
||||||
|
);
|
||||||
|
|
||||||
fn v8__ReturnValue__Set(rv: *mut ReturnValue, value: *mut Value) -> ();
|
fn v8__ReturnValue__Set(rv: *mut ReturnValue, value: *mut Value) -> ();
|
||||||
fn v8__ReturnValue__Get(rv: *mut ReturnValue) -> *mut Value;
|
fn v8__ReturnValue__Get(rv: *mut ReturnValue) -> *mut Value;
|
||||||
|
@ -40,7 +42,7 @@ extern "C" {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct ReturnValue(Opaque);
|
pub struct ReturnValue([usize; 1]);
|
||||||
|
|
||||||
/// In V8 ReturnValue<> has a type parameter, but
|
/// In V8 ReturnValue<> has a type parameter, but
|
||||||
/// it turns out that in most of the APIs it's ReturnValue<Value>
|
/// it turns out that in most of the APIs it's ReturnValue<Value>
|
||||||
|
@ -76,8 +78,12 @@ pub struct FunctionCallbackInfo(Opaque);
|
||||||
impl FunctionCallbackInfo {
|
impl FunctionCallbackInfo {
|
||||||
/// The ReturnValue for the call.
|
/// The ReturnValue for the call.
|
||||||
#[allow(clippy::mut_from_ref)]
|
#[allow(clippy::mut_from_ref)]
|
||||||
pub fn get_return_value(&self) -> &mut ReturnValue {
|
pub fn get_return_value(&self) -> ReturnValue {
|
||||||
unsafe { &mut *v8__FunctionCallbackInfo__GetReturnValue(&*self) }
|
let mut rv = MaybeUninit::<ReturnValue>::uninit();
|
||||||
|
unsafe {
|
||||||
|
v8__FunctionCallbackInfo__GetReturnValue(&*self, rv.as_mut_ptr());
|
||||||
|
rv.assume_init()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The current Isolate.
|
/// The current Isolate.
|
||||||
|
|
|
@ -21,6 +21,7 @@ mod number;
|
||||||
mod object;
|
mod object;
|
||||||
mod primitives;
|
mod primitives;
|
||||||
mod promise;
|
mod promise;
|
||||||
|
mod property;
|
||||||
mod script;
|
mod script;
|
||||||
mod string;
|
mod string;
|
||||||
mod support;
|
mod support;
|
||||||
|
@ -37,7 +38,9 @@ pub mod V8;
|
||||||
|
|
||||||
pub use context::Context;
|
pub use context::Context;
|
||||||
pub use exception::*;
|
pub use exception::*;
|
||||||
pub use function::{Function, FunctionCallbackInfo, FunctionTemplate};
|
pub use function::{
|
||||||
|
Function, FunctionCallbackInfo, FunctionTemplate, ReturnValue,
|
||||||
|
};
|
||||||
pub use handle_scope::HandleScope;
|
pub use handle_scope::HandleScope;
|
||||||
pub use isolate::Isolate;
|
pub use isolate::Isolate;
|
||||||
pub use isolate::OwnedIsolate;
|
pub use isolate::OwnedIsolate;
|
||||||
|
@ -51,6 +54,7 @@ pub use promise::{
|
||||||
Promise, PromiseRejectEvent, PromiseRejectMessage, PromiseResolver,
|
Promise, PromiseRejectEvent, PromiseRejectMessage, PromiseResolver,
|
||||||
PromiseState,
|
PromiseState,
|
||||||
};
|
};
|
||||||
|
pub use property::PropertyCallbackInfo;
|
||||||
pub use script::{Script, ScriptOrigin};
|
pub use script::{Script, ScriptOrigin};
|
||||||
pub use string::NewStringType;
|
pub use string::NewStringType;
|
||||||
pub use string::String;
|
pub use string::String;
|
||||||
|
|
39
src/property.rs
Normal file
39
src/property.rs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
use crate::isolate::Isolate;
|
||||||
|
use crate::support::Opaque;
|
||||||
|
use crate::Local;
|
||||||
|
use crate::Object;
|
||||||
|
use crate::ReturnValue;
|
||||||
|
use std::mem::MaybeUninit;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
fn v8__PropertyCallbackInfo__GetIsolate(
|
||||||
|
info: &PropertyCallbackInfo,
|
||||||
|
) -> &mut Isolate;
|
||||||
|
fn v8__PropertyCallbackInfo__This(info: &PropertyCallbackInfo)
|
||||||
|
-> *mut Object;
|
||||||
|
fn v8__PropertyCallbackInfo__GetReturnValue(
|
||||||
|
info: &PropertyCallbackInfo,
|
||||||
|
out: *mut ReturnValue,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct PropertyCallbackInfo(Opaque);
|
||||||
|
|
||||||
|
impl PropertyCallbackInfo {
|
||||||
|
pub fn get_return_value(&self) -> ReturnValue {
|
||||||
|
let mut rv = MaybeUninit::<ReturnValue>::uninit();
|
||||||
|
unsafe {
|
||||||
|
v8__PropertyCallbackInfo__GetReturnValue(self, rv.as_mut_ptr());
|
||||||
|
rv.assume_init()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_isolate(&self) -> &Isolate {
|
||||||
|
unsafe { v8__PropertyCallbackInfo__GetIsolate(self) }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn this(&self) -> Local<Object> {
|
||||||
|
unsafe { Local::from_raw(v8__PropertyCallbackInfo__This(self)).unwrap() }
|
||||||
|
}
|
||||||
|
}
|
|
@ -483,7 +483,7 @@ extern "C" fn fn_callback(info: &FunctionCallbackInfo) {
|
||||||
context.enter();
|
context.enter();
|
||||||
let s = v8_str(&isolate, "Hello callback!");
|
let s = v8_str(&isolate, "Hello callback!");
|
||||||
let value: Local<v8::Value> = s.into();
|
let value: Local<v8::Value> = s.into();
|
||||||
let rv = info.get_return_value();
|
let rv = &mut info.get_return_value();
|
||||||
let rv_value = rv.get();
|
let rv_value = rv.get();
|
||||||
assert!(rv_value.is_undefined());
|
assert!(rv_value.is_undefined());
|
||||||
rv.set(value);
|
rv.set(value);
|
||||||
|
|
Loading…
Reference in a new issue