mirror of
https://github.com/denoland/rusty_v8.git
synced 2024-12-26 00:59:28 -05:00
Represent v8::Maybe<bool> in rust as Option<bool> (#73)
This commit is contained in:
parent
df691b6f38
commit
150c27e4c8
5 changed files with 47 additions and 18 deletions
|
@ -306,16 +306,16 @@ v8::Promise* v8__Promise__Resolver__GetPromise(v8::Promise::Resolver* self) {
|
||||||
return local_to_ptr(self->GetPromise());
|
return local_to_ptr(self->GetPromise());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool v8__Promise__Resolver__Resolve(v8::Promise::Resolver* self,
|
MaybeBool v8__Promise__Resolver__Resolve(v8::Promise::Resolver* self,
|
||||||
v8::Local<v8::Context> context,
|
v8::Local<v8::Context> context,
|
||||||
v8::Local<v8::Value> value) {
|
v8::Local<v8::Value> value) {
|
||||||
return maybe_to_value(self->Resolve(context, value), false);
|
return maybe_to_maybe_bool(self->Resolve(context, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool v8__Promise__Resolver__Reject(v8::Promise::Resolver* self,
|
MaybeBool v8__Promise__Resolver__Reject(v8::Promise::Resolver* self,
|
||||||
v8::Local<v8::Context> context,
|
v8::Local<v8::Context> context,
|
||||||
v8::Local<v8::Value> value) {
|
v8::Local<v8::Value> value) {
|
||||||
return maybe_to_value(self->Reject(context, value), false);
|
return maybe_to_maybe_bool(self->Reject(context, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
v8::Promise::PromiseState v8__Promise__State(v8::Promise* self) {
|
v8::Promise::PromiseState v8__Promise__State(v8::Promise* self) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::support::MaybeBool;
|
||||||
use crate::support::Opaque;
|
use crate::support::Opaque;
|
||||||
use crate::Context;
|
use crate::Context;
|
||||||
use crate::Function;
|
use crate::Function;
|
||||||
|
@ -14,12 +15,12 @@ extern "C" {
|
||||||
resolver: *mut PromiseResolver,
|
resolver: *mut PromiseResolver,
|
||||||
context: *mut Context,
|
context: *mut Context,
|
||||||
value: *mut Value,
|
value: *mut Value,
|
||||||
) -> bool;
|
) -> MaybeBool;
|
||||||
fn v8__Promise__Resolver__Reject(
|
fn v8__Promise__Resolver__Reject(
|
||||||
resolver: *mut PromiseResolver,
|
resolver: *mut PromiseResolver,
|
||||||
context: *mut Context,
|
context: *mut Context,
|
||||||
value: *mut Value,
|
value: *mut Value,
|
||||||
) -> bool;
|
) -> MaybeBool;
|
||||||
fn v8__Promise__State(promise: *mut Promise) -> PromiseState;
|
fn v8__Promise__State(promise: *mut Promise) -> PromiseState;
|
||||||
fn v8__Promise__HasHandler(promise: *mut Promise) -> bool;
|
fn v8__Promise__HasHandler(promise: *mut Promise) -> bool;
|
||||||
fn v8__Promise__Result(promise: *mut Promise) -> *mut Value;
|
fn v8__Promise__Result(promise: *mut Promise) -> *mut Value;
|
||||||
|
@ -157,9 +158,10 @@ impl PromiseResolver {
|
||||||
&mut self,
|
&mut self,
|
||||||
mut context: Local<'sc, Context>,
|
mut context: Local<'sc, Context>,
|
||||||
mut value: Local<'sc, Value>,
|
mut value: Local<'sc, Value>,
|
||||||
) -> bool {
|
) -> Option<bool> {
|
||||||
unsafe {
|
unsafe {
|
||||||
v8__Promise__Resolver__Resolve(&mut *self, &mut *context, &mut *value)
|
v8__Promise__Resolver__Resolve(&mut *self, &mut *context, &mut *value)
|
||||||
|
.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,9 +172,10 @@ impl PromiseResolver {
|
||||||
&mut self,
|
&mut self,
|
||||||
mut context: Local<'sc, Context>,
|
mut context: Local<'sc, Context>,
|
||||||
mut value: Local<'sc, Value>,
|
mut value: Local<'sc, Value>,
|
||||||
) -> bool {
|
) -> Option<bool> {
|
||||||
unsafe {
|
unsafe {
|
||||||
v8__Promise__Resolver__Reject(&mut *self, &mut *context, &mut *value)
|
v8__Promise__Resolver__Reject(&mut *self, &mut *context, &mut *value)
|
||||||
|
.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,19 @@ void construct_in_place(uninit_t<T>& buf, Args... args) {
|
||||||
new (&buf)
|
new (&buf)
|
||||||
construct_in_place_helper<T, Args...>(buf, std::forward<Args>(args)...);
|
construct_in_place_helper<T, Args...>(buf, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The C-ABI compatible equivalent of V8's Maybe<bool>.
|
||||||
|
enum class MaybeBool { JustFalse = 0, JustTrue = 1, Nothing = 2 };
|
||||||
|
|
||||||
|
inline static MaybeBool maybe_to_maybe_bool(v8::Maybe<bool> maybe) {
|
||||||
|
if (maybe.IsNothing()) {
|
||||||
|
return MaybeBool::Nothing;
|
||||||
|
} else if (maybe.FromJust()) {
|
||||||
|
return MaybeBool::JustTrue;
|
||||||
|
} else {
|
||||||
|
return MaybeBool::JustFalse;
|
||||||
|
}
|
||||||
|
}
|
||||||
} // namespace support
|
} // namespace support
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
@ -59,9 +72,4 @@ inline static v8::MaybeLocal<T> ptr_to_maybe_local(T* ptr) {
|
||||||
return *reinterpret_cast<v8::MaybeLocal<T>*>(&ptr);
|
return *reinterpret_cast<v8::MaybeLocal<T>*>(&ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
|
||||||
inline static T maybe_to_value(v8::Maybe<T> maybe, T default_value) {
|
|
||||||
return maybe.FromMaybe(default_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // SUPPORT_H_
|
#endif // SUPPORT_H_
|
||||||
|
|
|
@ -137,6 +137,24 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum MaybeBool {
|
||||||
|
JustFalse = 0,
|
||||||
|
JustTrue = 1,
|
||||||
|
Nothing = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Into<Option<bool>> for MaybeBool {
|
||||||
|
fn into(self) -> Option<bool> {
|
||||||
|
match self {
|
||||||
|
MaybeBool::JustFalse => Some(false),
|
||||||
|
MaybeBool::JustTrue => Some(true),
|
||||||
|
MaybeBool::Nothing => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct CxxVTable(pub *const Opaque);
|
pub struct CxxVTable(pub *const Opaque);
|
||||||
|
|
|
@ -432,7 +432,7 @@ fn promise_rejected() {
|
||||||
v8::String::new(scope, "test", v8::NewStringType::Normal).unwrap();
|
v8::String::new(scope, "test", v8::NewStringType::Normal).unwrap();
|
||||||
let value: Local<v8::Value> = cast(str);
|
let value: Local<v8::Value> = cast(str);
|
||||||
let rejected = resolver.reject(context, value);
|
let rejected = resolver.reject(context, value);
|
||||||
assert!(rejected);
|
assert!(rejected.unwrap());
|
||||||
assert_eq!(promise.state(), v8::PromiseState::Rejected);
|
assert_eq!(promise.state(), v8::PromiseState::Rejected);
|
||||||
let result = promise.result(scope);
|
let result = promise.result(scope);
|
||||||
let result_str: v8::Local<v8::String> = cast(result);
|
let result_str: v8::Local<v8::String> = cast(result);
|
||||||
|
|
Loading…
Reference in a new issue