mirror of
https://github.com/denoland/rusty_v8.git
synced 2024-11-25 15:29:43 -05:00
Add v8::Map bindings (#872)
Support v8::Map operations (`new`, `clear`, `get`, `set`, `has`, and `delete`).
This commit is contained in:
parent
a4db61ae50
commit
2180716923
3 changed files with 161 additions and 9 deletions
|
@ -1240,8 +1240,40 @@ const v8::External* v8__External__New(v8::Isolate* isolate, void* value) {
|
||||||
|
|
||||||
void* v8__External__Value(const v8::External& self) { return self.Value(); }
|
void* v8__External__Value(const v8::External& self) { return self.Value(); }
|
||||||
|
|
||||||
|
const v8::Map* v8__Map__New(v8::Isolate* isolate) {
|
||||||
|
return local_to_ptr(v8::Map::New(isolate));
|
||||||
|
}
|
||||||
|
|
||||||
size_t v8__Map__Size(const v8::Map& self) { return self.Size(); }
|
size_t v8__Map__Size(const v8::Map& self) { return self.Size(); }
|
||||||
|
|
||||||
|
void v8__Map__Clear(const v8::Map& self) {
|
||||||
|
return ptr_to_local(&self)->Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
const v8::Value* v8__Map__Get(const v8::Map& self, const v8::Context& context,
|
||||||
|
const v8::Value& key) {
|
||||||
|
return maybe_local_to_ptr(
|
||||||
|
ptr_to_local(&self)->Get(ptr_to_local(&context), ptr_to_local(&key)));
|
||||||
|
}
|
||||||
|
|
||||||
|
v8::Map* v8__Map__Set(const v8::Map& self, const v8::Context& context,
|
||||||
|
const v8::Value& key, const v8::Value& value) {
|
||||||
|
return maybe_local_to_ptr(ptr_to_local(&self)->Set(
|
||||||
|
ptr_to_local(&context), ptr_to_local(&key), ptr_to_local(&value)));
|
||||||
|
}
|
||||||
|
|
||||||
|
MaybeBool v8__Map__Has(const v8::Map& self, const v8::Context& context,
|
||||||
|
const v8::Value& key) {
|
||||||
|
return maybe_to_maybe_bool(
|
||||||
|
ptr_to_local(&self)->Has(ptr_to_local(&context), ptr_to_local(&key)));
|
||||||
|
}
|
||||||
|
|
||||||
|
MaybeBool v8__Map__Delete(const v8::Map& self, const v8::Context& context,
|
||||||
|
const v8::Value& key) {
|
||||||
|
return maybe_to_maybe_bool(
|
||||||
|
ptr_to_local(&self)->Delete(ptr_to_local(&context), ptr_to_local(&key)));
|
||||||
|
}
|
||||||
|
|
||||||
const v8::Array* v8__Map__As__Array(const v8::Map& self) {
|
const v8::Array* v8__Map__As__Array(const v8::Map& self) {
|
||||||
return local_to_ptr(self.AsArray());
|
return local_to_ptr(self.AsArray());
|
||||||
}
|
}
|
||||||
|
@ -2437,8 +2469,8 @@ void v8__WasmStreaming__Abort(WasmStreamingSharedPtr* self,
|
||||||
self->inner->Abort(ptr_to_maybe_local(exception));
|
self->inner->Abort(ptr_to_maybe_local(exception));
|
||||||
}
|
}
|
||||||
|
|
||||||
void v8__WasmStreaming__SetUrl(WasmStreamingSharedPtr* self,
|
void v8__WasmStreaming__SetUrl(WasmStreamingSharedPtr* self, const char* url,
|
||||||
const char* url, size_t len) {
|
size_t len) {
|
||||||
self->inner->SetUrl(url, len);
|
self->inner->SetUrl(url, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2478,7 +2510,8 @@ void v8__HeapProfiler__TakeHeapSnapshot(v8::Isolate* isolate,
|
||||||
|
|
||||||
// This is necessary for v8__internal__GetIsolateFromHeapObject() to be
|
// This is necessary for v8__internal__GetIsolateFromHeapObject() to be
|
||||||
// reliable enough for our purposes.
|
// reliable enough for our purposes.
|
||||||
#if UINTPTR_MAX == 0xffffffffffffffff && !(defined V8_SHARED_RO_HEAP or defined V8_COMPRESS_POINTERS)
|
#if UINTPTR_MAX == 0xffffffffffffffff && \
|
||||||
|
!(defined V8_SHARED_RO_HEAP or defined V8_COMPRESS_POINTERS)
|
||||||
#error V8 must be built with either the 'v8_enable_pointer_compression' or \
|
#error V8 must be built with either the 'v8_enable_pointer_compression' or \
|
||||||
'v8_enable_shared_ro_heap' feature enabled.
|
'v8_enable_shared_ro_heap' feature enabled.
|
||||||
#endif
|
#endif
|
||||||
|
@ -2782,18 +2815,20 @@ bool v8__ValueDeserializer__ReadRawBytes(v8::ValueDeserializer* self,
|
||||||
// v8::CompiledWasmModule
|
// v8::CompiledWasmModule
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
const v8::WasmModuleObject* v8__WasmModuleObject__FromCompiledModule(v8::Isolate* isolate,
|
const v8::WasmModuleObject* v8__WasmModuleObject__FromCompiledModule(
|
||||||
const v8::CompiledWasmModule* compiled_module) {
|
v8::Isolate* isolate, const v8::CompiledWasmModule* compiled_module) {
|
||||||
return maybe_local_to_ptr(v8::WasmModuleObject::FromCompiledModule(isolate, *compiled_module));
|
return maybe_local_to_ptr(
|
||||||
|
v8::WasmModuleObject::FromCompiledModule(isolate, *compiled_module));
|
||||||
}
|
}
|
||||||
|
|
||||||
v8::CompiledWasmModule* v8__WasmModuleObject__GetCompiledModule(const v8::WasmModuleObject* self) {
|
v8::CompiledWasmModule* v8__WasmModuleObject__GetCompiledModule(
|
||||||
|
const v8::WasmModuleObject* self) {
|
||||||
v8::CompiledWasmModule cwm = ptr_to_local(self)->GetCompiledModule();
|
v8::CompiledWasmModule cwm = ptr_to_local(self)->GetCompiledModule();
|
||||||
return new v8::CompiledWasmModule(std::move(cwm));
|
return new v8::CompiledWasmModule(std::move(cwm));
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t* v8__CompiledWasmModule__GetWireBytesRef(v8::CompiledWasmModule* self,
|
const uint8_t* v8__CompiledWasmModule__GetWireBytesRef(
|
||||||
size_t* length) {
|
v8::CompiledWasmModule* self, size_t* length) {
|
||||||
v8::MemorySpan<const uint8_t> span = self->GetWireBytesRef();
|
v8::MemorySpan<const uint8_t> span = self->GetWireBytesRef();
|
||||||
*length = span.size();
|
*length = span.size();
|
||||||
return span.data();
|
return span.data();
|
||||||
|
|
|
@ -148,6 +148,29 @@ extern "C" {
|
||||||
length: usize,
|
length: usize,
|
||||||
) -> *const Array;
|
) -> *const Array;
|
||||||
fn v8__Array__Length(array: *const Array) -> u32;
|
fn v8__Array__Length(array: *const Array) -> u32;
|
||||||
|
fn v8__Map__New(isolate: *mut Isolate) -> *const Map;
|
||||||
|
fn v8__Map__Clear(this: *const Map);
|
||||||
|
fn v8__Map__Get(
|
||||||
|
this: *const Map,
|
||||||
|
context: *const Context,
|
||||||
|
key: *const Value,
|
||||||
|
) -> *const Value;
|
||||||
|
fn v8__Map__Set(
|
||||||
|
this: *const Map,
|
||||||
|
context: *const Context,
|
||||||
|
key: *const Value,
|
||||||
|
value: *const Value,
|
||||||
|
) -> *const Map;
|
||||||
|
fn v8__Map__Has(
|
||||||
|
this: *const Map,
|
||||||
|
context: *const Context,
|
||||||
|
key: *const Value,
|
||||||
|
) -> MaybeBool;
|
||||||
|
fn v8__Map__Delete(
|
||||||
|
this: *const Map,
|
||||||
|
context: *const Context,
|
||||||
|
key: *const Value,
|
||||||
|
) -> MaybeBool;
|
||||||
fn v8__Map__Size(map: *const Map) -> usize;
|
fn v8__Map__Size(map: *const Map) -> usize;
|
||||||
fn v8__Map__As__Array(this: *const Map) -> *const Array;
|
fn v8__Map__As__Array(this: *const Map) -> *const Array;
|
||||||
}
|
}
|
||||||
|
@ -586,9 +609,59 @@ impl Array {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Map {
|
impl Map {
|
||||||
|
pub fn new<'s>(scope: &mut HandleScope<'s>) -> Local<'s, Map> {
|
||||||
|
unsafe { scope.cast_local(|sd| v8__Map__New(sd.get_isolate_ptr())) }
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn size(&self) -> usize {
|
pub fn size(&self) -> usize {
|
||||||
unsafe { v8__Map__Size(self) }
|
unsafe { v8__Map__Size(self) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clear(&self) {
|
||||||
|
unsafe { v8__Map__Clear(self) }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get<'s>(
|
||||||
|
&self,
|
||||||
|
scope: &mut HandleScope<'s>,
|
||||||
|
key: Local<Value>,
|
||||||
|
) -> Option<Local<'s, Value>> {
|
||||||
|
unsafe {
|
||||||
|
scope.cast_local(|sd| v8__Map__Get(self, sd.get_current_context(), &*key))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set<'s>(
|
||||||
|
&self,
|
||||||
|
scope: &mut HandleScope<'s>,
|
||||||
|
key: Local<Value>,
|
||||||
|
value: Local<Value>,
|
||||||
|
) -> Option<Local<'s, Map>> {
|
||||||
|
unsafe {
|
||||||
|
scope.cast_local(|sd| {
|
||||||
|
v8__Map__Set(self, sd.get_current_context(), &*key, &*value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn has(
|
||||||
|
&self,
|
||||||
|
scope: &mut HandleScope,
|
||||||
|
key: Local<Value>,
|
||||||
|
) -> Option<bool> {
|
||||||
|
unsafe { v8__Map__Has(self, &*scope.get_current_context(), &*key) }.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn delete(
|
||||||
|
&self,
|
||||||
|
scope: &mut HandleScope,
|
||||||
|
key: Local<Value>,
|
||||||
|
) -> Option<bool> {
|
||||||
|
unsafe { v8__Map__Delete(self, &*scope.get_current_context(), &*key) }
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an array of length size() * 2, where index N is the Nth key and
|
/// Returns an array of length size() * 2, where index N is the Nth key and
|
||||||
/// index N + 1 is the Nth value.
|
/// index N + 1 is the Nth value.
|
||||||
pub fn as_array<'s>(&self, scope: &mut HandleScope<'s>) -> Local<'s, Array> {
|
pub fn as_array<'s>(&self, scope: &mut HandleScope<'s>) -> Local<'s, Array> {
|
||||||
|
|
|
@ -1556,6 +1556,50 @@ fn object() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn map() {
|
||||||
|
let _setup_guard = setup();
|
||||||
|
let isolate = &mut v8::Isolate::new(Default::default());
|
||||||
|
{
|
||||||
|
let scope = &mut v8::HandleScope::new(isolate);
|
||||||
|
let context = v8::Context::new(scope);
|
||||||
|
let scope = &mut v8::ContextScope::new(scope, context);
|
||||||
|
|
||||||
|
let map = v8::Map::new(scope);
|
||||||
|
assert_eq!(map.size(), 0);
|
||||||
|
|
||||||
|
let undefined = v8::undefined(scope).into();
|
||||||
|
|
||||||
|
{
|
||||||
|
let key = v8::Object::new(scope).into();
|
||||||
|
let value = v8::Integer::new(scope, 1337).into();
|
||||||
|
assert_eq!(map.has(scope, key), Some(false));
|
||||||
|
assert_eq!(map.get(scope, key), Some(undefined));
|
||||||
|
assert_eq!(map.set(scope, key, value), Some(map));
|
||||||
|
|
||||||
|
assert_eq!(map.has(scope, key), Some(true));
|
||||||
|
assert_eq!(map.size(), 1);
|
||||||
|
assert_eq!(map.get(scope, key), Some(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
map.clear();
|
||||||
|
assert_eq!(map.size(), 0);
|
||||||
|
|
||||||
|
{
|
||||||
|
let key = v8::String::new(scope, "key").unwrap().into();
|
||||||
|
let value = v8::Integer::new(scope, 42).into();
|
||||||
|
|
||||||
|
assert_eq!(map.delete(scope, key), Some(false));
|
||||||
|
|
||||||
|
map.set(scope, key, value);
|
||||||
|
assert_eq!(map.size(), 1);
|
||||||
|
|
||||||
|
assert_eq!(map.delete(scope, key), Some(true));
|
||||||
|
assert_eq!(map.size(), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn array() {
|
fn array() {
|
||||||
let _setup_guard = setup();
|
let _setup_guard = setup();
|
||||||
|
|
Loading…
Reference in a new issue