1use std::any::type_name;
4use std::convert::From;
5use std::convert::TryFrom;
6use std::error::Error;
7use std::fmt;
8use std::fmt::Display;
9use std::fmt::Formatter;
10use std::hash::Hash;
11use std::hash::Hasher;
12use std::mem::transmute;
13use std::ops::Deref;
14
15use crate::Local;
16use crate::support::Opaque;
17
18unsafe extern "C" {
19 fn v8__Data__EQ(this: *const Data, other: *const Data) -> bool;
20 fn v8__Data__IsBigInt(this: *const Data) -> bool;
21 fn v8__Data__IsBoolean(this: *const Data) -> bool;
22 fn v8__Data__IsContext(this: *const Data) -> bool;
23 fn v8__Data__IsFixedArray(this: *const Data) -> bool;
24 fn v8__Data__IsFunctionTemplate(this: *const Data) -> bool;
25 fn v8__Data__IsModule(this: *const Data) -> bool;
26 fn v8__Data__IsModuleRequest(this: *const Data) -> bool;
27 fn v8__Data__IsName(this: *const Data) -> bool;
28 fn v8__Data__IsNumber(this: *const Data) -> bool;
29 fn v8__Data__IsObjectTemplate(this: *const Data) -> bool;
30 fn v8__Data__IsPrimitive(this: *const Data) -> bool;
31 fn v8__Data__IsPrivate(this: *const Data) -> bool;
32 fn v8__Data__IsString(this: *const Data) -> bool;
33 fn v8__Data__IsSymbol(this: *const Data) -> bool;
34 fn v8__Data__IsValue(this: *const Data) -> bool;
35
36 fn v8__Value__SameValue(this: *const Value, other: *const Value) -> bool;
37 fn v8__Value__StrictEquals(this: *const Value, other: *const Value) -> bool;
38}
39
40impl Data {
41 #[inline(always)]
43 pub fn is_big_int(&self) -> bool {
44 unsafe { v8__Data__IsBigInt(self) }
45 }
46
47 #[inline(always)]
49 pub fn is_boolean(&self) -> bool {
50 unsafe { v8__Data__IsBoolean(self) }
51 }
52
53 #[inline(always)]
55 pub fn is_context(&self) -> bool {
56 unsafe { v8__Data__IsContext(self) }
57 }
58
59 #[inline(always)]
61 pub fn is_fixed_array(&self) -> bool {
62 unsafe { v8__Data__IsFixedArray(self) }
63 }
64
65 #[inline(always)]
67 pub fn is_function_template(&self) -> bool {
68 unsafe { v8__Data__IsFunctionTemplate(self) }
69 }
70
71 #[inline(always)]
73 pub fn is_module(&self) -> bool {
74 unsafe { v8__Data__IsModule(self) }
75 }
76
77 #[inline(always)]
79 pub fn is_module_request(&self) -> bool {
80 unsafe { v8__Data__IsModuleRequest(self) }
81 }
82
83 #[inline(always)]
85 pub fn is_name(&self) -> bool {
86 unsafe { v8__Data__IsName(self) }
87 }
88
89 #[inline(always)]
91 pub fn is_number(&self) -> bool {
92 unsafe { v8__Data__IsNumber(self) }
93 }
94
95 #[inline(always)]
97 pub fn is_object_template(&self) -> bool {
98 unsafe { v8__Data__IsObjectTemplate(self) }
99 }
100
101 #[inline(always)]
103 pub fn is_primitive(&self) -> bool {
104 unsafe { v8__Data__IsPrimitive(self) }
105 }
106
107 #[inline(always)]
109 pub fn is_private(&self) -> bool {
110 unsafe { v8__Data__IsPrivate(self) }
111 }
112
113 #[inline(always)]
115 pub fn is_string(&self) -> bool {
116 unsafe { v8__Data__IsString(self) }
117 }
118
119 #[inline(always)]
121 pub fn is_symbol(&self) -> bool {
122 unsafe { v8__Data__IsSymbol(self) }
123 }
124
125 #[inline(always)]
127 pub fn is_value(&self) -> bool {
128 unsafe { v8__Data__IsValue(self) }
129 }
130}
131
132macro_rules! impl_deref {
133 { $target:ident for $type:ident } => {
134 impl Deref for $type {
135 type Target = $target;
136 fn deref(&self) -> &Self::Target {
137 unsafe { &*(self as *const _ as *const Self::Target) }
138 }
139 }
140 };
141}
142
143macro_rules! impl_from {
144 { $source:ident for $type:ident } => {
145 impl<'s> From<Local<'s, $source>> for Local<'s, $type> {
146 fn from(l: Local<'s, $source>) -> Self {
147 unsafe { transmute(l) }
148 }
149 }
150 };
151}
152
153macro_rules! impl_try_from {
154 { $source:ident for $target:ident if $value:pat => $check:expr } => {
155 impl<'s> TryFrom<Local<'s, $source>> for Local<'s, $target> {
156 type Error = DataError;
157 fn try_from(l: Local<'s, $source>) -> Result<Self, Self::Error> {
158 #[allow(dead_code)]
160 fn cast<T>(l: Local<$source>) -> Local<T> {
161 unsafe { transmute::<Local<$source>, Local<T>>(l) }
162 }
163 match l {
164 $value if $check => Ok(unsafe {
165 transmute::<Local<'s, $source>, Local<'s, $target>>(l)
166 }),
167 _ => Err(DataError::bad_type::<$target, $source>())
168 }
169 }
170 }
171 };
172}
173
174macro_rules! impl_eq {
175 { for $type:ident } => {
176 impl Eq for $type {}
177 };
178}
179
180macro_rules! impl_hash {
181 { for $type:ident use $method:ident } => {
182 impl Hash for $type {
183 fn hash<H: Hasher>(&self, state: &mut H) {
184 self.$method().hash(state)
185 }
186 }
187 };
188}
189
190macro_rules! impl_partial_eq {
191 { $rhs:ident for $type:ident use identity } => {
192 impl<'s> PartialEq<$rhs> for $type {
193 fn eq(&self, other: &$rhs) -> bool {
194 let a = self as *const _ as *const Data;
195 let b = other as *const _ as *const Data;
196 unsafe { v8__Data__EQ(a, b) }
197 }
198 }
199 };
200 { $rhs:ident for $type:ident use strict_equals } => {
201 impl<'s> PartialEq<$rhs> for $type {
202 fn eq(&self, other: &$rhs) -> bool {
203 let a = self as *const _ as *const Value;
204 let b = other as *const _ as *const Value;
205 unsafe { v8__Value__StrictEquals(a, b) }
206 }
207 }
208 };
209
210 { $rhs:ident for $type:ident use same_value_zero } => {
211 impl<'s> PartialEq<$rhs> for $type {
212 fn eq(&self, other: &$rhs) -> bool {
213 let a = self as *const _ as *const Value;
214 let b = other as *const _ as *const Value;
215 unsafe {
216 v8__Value__SameValue(a, b) || {
217 let zero = &*Local::<Value>::from(Integer::zero());
218 v8__Value__StrictEquals(a, zero) && v8__Value__StrictEquals(b, zero)
219 }
220 }
221 }
222 }
223 };
224}
225
226#[derive(Clone, Copy, Debug)]
227pub enum DataError {
228 BadType {
229 actual: &'static str,
230 expected: &'static str,
231 },
232 NoData {
233 expected: &'static str,
234 },
235}
236
237impl DataError {
238 pub(crate) fn bad_type<E: 'static, A: 'static>() -> Self {
239 Self::BadType {
240 expected: type_name::<E>(),
241 actual: type_name::<A>(),
242 }
243 }
244
245 pub(crate) fn no_data<E: 'static>() -> Self {
246 Self::NoData {
247 expected: type_name::<E>(),
248 }
249 }
250}
251
252impl Display for DataError {
253 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
254 match self {
255 Self::BadType { expected, actual } => {
256 write!(f, "expected type `{expected}`, got `{actual}`")
257 }
258 Self::NoData { expected } => {
259 write!(f, "expected `Some({expected})`, found `None`")
260 }
261 }
262 }
263}
264
265impl Error for DataError {}
266
267#[repr(C)]
269#[derive(Debug)]
270pub struct Data(Opaque);
271
272impl_from! { AccessorSignature for Data }
273impl_from! { Context for Data }
274impl_from! { FixedArray for Data }
275impl_from! { Module for Data }
276impl_from! { ModuleRequest for Data }
277impl_from! { PrimitiveArray for Data }
278impl_from! { Private for Data }
279impl_from! { Signature for Data }
280impl_from! { Template for Data }
281impl_from! { FunctionTemplate for Data }
282impl_from! { ObjectTemplate for Data }
283impl_from! { UnboundModuleScript for Data }
284impl_from! { Value for Data }
285impl_from! { External for Data }
286impl_from! { Object for Data }
287impl_from! { Array for Data }
288impl_from! { ArrayBuffer for Data }
289impl_from! { ArrayBufferView for Data }
290impl_from! { DataView for Data }
291impl_from! { TypedArray for Data }
292impl_from! { BigInt64Array for Data }
293impl_from! { BigUint64Array for Data }
294impl_from! { Float32Array for Data }
295impl_from! { Float64Array for Data }
296impl_from! { Int16Array for Data }
297impl_from! { Int32Array for Data }
298impl_from! { Int8Array for Data }
299impl_from! { Uint16Array for Data }
300impl_from! { Uint32Array for Data }
301impl_from! { Uint8Array for Data }
302impl_from! { Uint8ClampedArray for Data }
303impl_from! { BigIntObject for Data }
304impl_from! { BooleanObject for Data }
305impl_from! { Date for Data }
306impl_from! { Function for Data }
307impl_from! { Map for Data }
308impl_from! { NumberObject for Data }
309impl_from! { Promise for Data }
310impl_from! { PromiseResolver for Data }
311impl_from! { Proxy for Data }
312impl_from! { RegExp for Data }
313impl_from! { Set for Data }
314impl_from! { SharedArrayBuffer for Data }
315impl_from! { StringObject for Data }
316impl_from! { SymbolObject for Data }
317impl_from! { WasmMemoryObject for Data }
318impl_from! { WasmModuleObject for Data }
319impl_from! { Primitive for Data }
320impl_from! { BigInt for Data }
321impl_from! { Boolean for Data }
322impl_from! { Name for Data }
323impl_from! { String for Data }
324impl_from! { Symbol for Data }
325impl_from! { Number for Data }
326impl_from! { Integer for Data }
327impl_from! { Int32 for Data }
328impl_from! { Uint32 for Data }
329impl_partial_eq! { AccessorSignature for Data use identity }
330impl_partial_eq! { Context for Data use identity }
331impl_partial_eq! { FixedArray for Data use identity }
332impl_partial_eq! { Module for Data use identity }
333impl_partial_eq! { ModuleRequest for Data use identity }
334impl_partial_eq! { PrimitiveArray for Data use identity }
335impl_partial_eq! { Private for Data use identity }
336impl_partial_eq! { Signature for Data use identity }
337impl_partial_eq! { Template for Data use identity }
338impl_partial_eq! { FunctionTemplate for Data use identity }
339impl_partial_eq! { ObjectTemplate for Data use identity }
340impl_partial_eq! { UnboundModuleScript for Data use identity }
341impl_partial_eq! { External for Data use identity }
342impl_partial_eq! { Object for Data use identity }
343impl_partial_eq! { Array for Data use identity }
344impl_partial_eq! { ArrayBuffer for Data use identity }
345impl_partial_eq! { ArrayBufferView for Data use identity }
346impl_partial_eq! { DataView for Data use identity }
347impl_partial_eq! { TypedArray for Data use identity }
348impl_partial_eq! { BigInt64Array for Data use identity }
349impl_partial_eq! { BigUint64Array for Data use identity }
350impl_partial_eq! { Float32Array for Data use identity }
351impl_partial_eq! { Float64Array for Data use identity }
352impl_partial_eq! { Int16Array for Data use identity }
353impl_partial_eq! { Int32Array for Data use identity }
354impl_partial_eq! { Int8Array for Data use identity }
355impl_partial_eq! { Uint16Array for Data use identity }
356impl_partial_eq! { Uint32Array for Data use identity }
357impl_partial_eq! { Uint8Array for Data use identity }
358impl_partial_eq! { Uint8ClampedArray for Data use identity }
359impl_partial_eq! { BigIntObject for Data use identity }
360impl_partial_eq! { BooleanObject for Data use identity }
361impl_partial_eq! { Date for Data use identity }
362impl_partial_eq! { Function for Data use identity }
363impl_partial_eq! { Map for Data use identity }
364impl_partial_eq! { NumberObject for Data use identity }
365impl_partial_eq! { Promise for Data use identity }
366impl_partial_eq! { PromiseResolver for Data use identity }
367impl_partial_eq! { Proxy for Data use identity }
368impl_partial_eq! { RegExp for Data use identity }
369impl_partial_eq! { Set for Data use identity }
370impl_partial_eq! { SharedArrayBuffer for Data use identity }
371impl_partial_eq! { StringObject for Data use identity }
372impl_partial_eq! { SymbolObject for Data use identity }
373impl_partial_eq! { WasmMemoryObject for Data use identity }
374impl_partial_eq! { WasmModuleObject for Data use identity }
375impl_partial_eq! { Boolean for Data use identity }
376impl_partial_eq! { Symbol for Data use identity }
377
378#[repr(C)]
381#[derive(Debug)]
382pub struct AccessorSignature(Opaque);
383
384impl_deref! { Data for AccessorSignature }
385impl_eq! { for AccessorSignature }
386impl_partial_eq! { Data for AccessorSignature use identity }
387impl_partial_eq! { AccessorSignature for AccessorSignature use identity }
388
389#[repr(C)]
392#[derive(Debug)]
393pub struct Context(Opaque);
394
395impl_deref! { Data for Context }
396impl_try_from! { Data for Context if v => v.is_context() }
397impl_eq! { for Context }
398impl_partial_eq! { Data for Context use identity }
399impl_partial_eq! { Context for Context use identity }
400
401#[repr(C)]
403#[derive(Debug)]
404pub struct FixedArray(Opaque);
405
406impl_deref! { Data for FixedArray }
407impl_try_from! { Data for FixedArray if v => v.is_fixed_array() }
408impl_eq! { for FixedArray }
409impl_partial_eq! { Data for FixedArray use identity }
410impl_partial_eq! { FixedArray for FixedArray use identity }
411
412#[repr(C)]
414#[derive(Debug)]
415pub struct Message(Opaque);
416
417impl_eq! { for Message }
418impl_partial_eq! { Message for Message use identity }
419
420#[repr(C)]
422#[derive(Debug)]
423pub struct Module(Opaque);
424
425impl_deref! { Data for Module }
426impl_try_from! { Data for Module if v => v.is_module() }
427impl_eq! { for Module }
428impl_hash! { for Module use get_identity_hash }
429impl_partial_eq! { Data for Module use identity }
430impl_partial_eq! { Module for Module use identity }
431
432#[repr(C)]
433#[derive(Debug)]
434pub struct ModuleRequest(Opaque);
435
436impl_deref! { Data for ModuleRequest }
437impl_try_from! { Data for ModuleRequest if v => v.is_module_request() }
438impl_eq! { for ModuleRequest }
439impl_partial_eq! { Data for ModuleRequest use identity }
440impl_partial_eq! { ModuleRequest for ModuleRequest use identity }
441
442#[repr(C)]
448#[derive(Debug)]
449pub struct PrimitiveArray(Opaque);
450
451impl_deref! { Data for PrimitiveArray }
452impl_eq! { for PrimitiveArray }
453impl_partial_eq! { Data for PrimitiveArray use identity }
454impl_partial_eq! { PrimitiveArray for PrimitiveArray use identity }
455
456#[repr(C)]
460#[derive(Debug)]
461pub struct Private(Opaque);
462
463impl_deref! { Data for Private }
464impl_try_from! { Data for Private if v => v.is_private() }
465impl_eq! { for Private }
466impl_partial_eq! { Data for Private use identity }
467impl_partial_eq! { Private for Private use identity }
468
469#[repr(C)]
472#[derive(Debug)]
473pub struct Script(Opaque);
474
475impl_eq! { for Script }
476impl_partial_eq! { Script for Script use identity }
477
478#[repr(C)]
483#[derive(Debug)]
484pub struct ScriptOrModule(Opaque);
485
486impl_eq! { for ScriptOrModule }
487impl_partial_eq! { ScriptOrModule for ScriptOrModule use identity }
488
489#[repr(C)]
496#[derive(Debug)]
497pub struct Signature(Opaque);
498
499impl_deref! { Data for Signature }
500impl_eq! { for Signature }
501impl_partial_eq! { Data for Signature use identity }
502impl_partial_eq! { Signature for Signature use identity }
503
504#[repr(C)]
506#[derive(Debug)]
507pub struct StackFrame(Opaque);
508
509impl_eq! { for StackFrame }
510impl_partial_eq! { StackFrame for StackFrame use identity }
511
512#[repr(C)]
516#[derive(Debug)]
517pub struct StackTrace(Opaque);
518
519impl_eq! { for StackTrace }
520impl_partial_eq! { StackTrace for StackTrace use identity }
521
522#[repr(C)]
524#[derive(Debug)]
525pub struct Template(Opaque);
526
527impl_deref! { Data for Template }
528impl_try_from! { Data for Template if v => v.is_function_template() || v.is_object_template() }
529impl_from! { FunctionTemplate for Template }
530impl_from! { ObjectTemplate for Template }
531impl_eq! { for Template }
532impl_partial_eq! { Data for Template use identity }
533impl_partial_eq! { Template for Template use identity }
534impl_partial_eq! { FunctionTemplate for Template use identity }
535impl_partial_eq! { ObjectTemplate for Template use identity }
536
537#[repr(C)]
643#[derive(Debug)]
644pub struct FunctionTemplate(Opaque);
645
646impl_deref! { Template for FunctionTemplate }
647impl_try_from! { Data for FunctionTemplate if v => v.is_function_template() }
648impl_try_from! { Template for FunctionTemplate if v => v.is_function_template() }
649impl_eq! { for FunctionTemplate }
650impl_partial_eq! { Data for FunctionTemplate use identity }
651impl_partial_eq! { Template for FunctionTemplate use identity }
652impl_partial_eq! { FunctionTemplate for FunctionTemplate use identity }
653
654#[repr(C)]
659#[derive(Debug)]
660pub struct ObjectTemplate(Opaque);
661
662impl_deref! { Template for ObjectTemplate }
663impl_try_from! { Data for ObjectTemplate if v => v.is_object_template() }
664impl_try_from! { Template for ObjectTemplate if v => v.is_object_template() }
665impl_eq! { for ObjectTemplate }
666impl_partial_eq! { Data for ObjectTemplate use identity }
667impl_partial_eq! { Template for ObjectTemplate use identity }
668impl_partial_eq! { ObjectTemplate for ObjectTemplate use identity }
669
670#[repr(C)]
672#[derive(Debug)]
673pub struct UnboundModuleScript(Opaque);
674
675impl_deref! { Data for UnboundModuleScript }
676impl_eq! { for UnboundModuleScript }
677impl_partial_eq! { Data for UnboundModuleScript use identity }
678impl_partial_eq! { UnboundModuleScript for UnboundModuleScript use identity }
679
680#[repr(C)]
682#[derive(Debug)]
683pub struct UnboundScript(Opaque);
684
685impl_eq! { for UnboundScript }
686impl_partial_eq! { UnboundScript for UnboundScript use identity }
687
688#[repr(C)]
690#[derive(Debug, Clone, Copy)]
691pub struct Value(Opaque);
692
693impl_deref! { Data for Value }
694impl_try_from! { Data for Value if v => v.is_value() }
695impl_from! { External for Value }
696impl_from! { Object for Value }
697impl_from! { Array for Value }
698impl_from! { ArrayBuffer for Value }
699impl_from! { ArrayBufferView for Value }
700impl_from! { DataView for Value }
701impl_from! { TypedArray for Value }
702impl_from! { BigInt64Array for Value }
703impl_from! { BigUint64Array for Value }
704impl_from! { Float32Array for Value }
705impl_from! { Float64Array for Value }
706impl_from! { Int16Array for Value }
707impl_from! { Int32Array for Value }
708impl_from! { Int8Array for Value }
709impl_from! { Uint16Array for Value }
710impl_from! { Uint32Array for Value }
711impl_from! { Uint8Array for Value }
712impl_from! { Uint8ClampedArray for Value }
713impl_from! { BigIntObject for Value }
714impl_from! { BooleanObject for Value }
715impl_from! { Date for Value }
716impl_from! { Function for Value }
717impl_from! { Map for Value }
718impl_from! { NumberObject for Value }
719impl_from! { Promise for Value }
720impl_from! { PromiseResolver for Value }
721impl_from! { Proxy for Value }
722impl_from! { RegExp for Value }
723impl_from! { Set for Value }
724impl_from! { SharedArrayBuffer for Value }
725impl_from! { StringObject for Value }
726impl_from! { SymbolObject for Value }
727impl_from! { WasmMemoryObject for Value }
728impl_from! { WasmModuleObject for Value }
729impl_from! { Primitive for Value }
730impl_from! { BigInt for Value }
731impl_from! { Boolean for Value }
732impl_from! { Name for Value }
733impl_from! { String for Value }
734impl_from! { Symbol for Value }
735impl_from! { Number for Value }
736impl_from! { Integer for Value }
737impl_from! { Int32 for Value }
738impl_from! { Uint32 for Value }
739impl_eq! { for Value }
740impl_hash! { for Value use get_hash }
741impl_partial_eq! { Value for Value use same_value_zero }
742impl_partial_eq! { External for Value use identity }
743impl_partial_eq! { Object for Value use identity }
744impl_partial_eq! { Array for Value use identity }
745impl_partial_eq! { ArrayBuffer for Value use identity }
746impl_partial_eq! { ArrayBufferView for Value use identity }
747impl_partial_eq! { DataView for Value use identity }
748impl_partial_eq! { TypedArray for Value use identity }
749impl_partial_eq! { BigInt64Array for Value use identity }
750impl_partial_eq! { BigUint64Array for Value use identity }
751impl_partial_eq! { Float32Array for Value use identity }
752impl_partial_eq! { Float64Array for Value use identity }
753impl_partial_eq! { Int16Array for Value use identity }
754impl_partial_eq! { Int32Array for Value use identity }
755impl_partial_eq! { Int8Array for Value use identity }
756impl_partial_eq! { Uint16Array for Value use identity }
757impl_partial_eq! { Uint32Array for Value use identity }
758impl_partial_eq! { Uint8Array for Value use identity }
759impl_partial_eq! { Uint8ClampedArray for Value use identity }
760impl_partial_eq! { BigIntObject for Value use identity }
761impl_partial_eq! { BooleanObject for Value use identity }
762impl_partial_eq! { Date for Value use identity }
763impl_partial_eq! { Function for Value use identity }
764impl_partial_eq! { Map for Value use identity }
765impl_partial_eq! { NumberObject for Value use identity }
766impl_partial_eq! { Promise for Value use identity }
767impl_partial_eq! { PromiseResolver for Value use identity }
768impl_partial_eq! { Proxy for Value use identity }
769impl_partial_eq! { RegExp for Value use identity }
770impl_partial_eq! { Set for Value use identity }
771impl_partial_eq! { SharedArrayBuffer for Value use identity }
772impl_partial_eq! { StringObject for Value use identity }
773impl_partial_eq! { SymbolObject for Value use identity }
774impl_partial_eq! { WasmMemoryObject for Value use identity }
775impl_partial_eq! { WasmModuleObject for Value use identity }
776impl_partial_eq! { Primitive for Value use same_value_zero }
777impl_partial_eq! { BigInt for Value use same_value_zero }
778impl_partial_eq! { Boolean for Value use identity }
779impl_partial_eq! { Name for Value use same_value_zero }
780impl_partial_eq! { String for Value use same_value_zero }
781impl_partial_eq! { Symbol for Value use identity }
782impl_partial_eq! { Number for Value use same_value_zero }
783impl_partial_eq! { Integer for Value use same_value_zero }
784impl_partial_eq! { Int32 for Value use same_value_zero }
785impl_partial_eq! { Uint32 for Value use same_value_zero }
786
787#[repr(C)]
790#[derive(Debug)]
791pub struct External(Opaque);
792
793impl_deref! { Value for External }
794impl_try_from! { Data for External if v => v.is_value() && cast::<Value>(v).is_external() }
795impl_try_from! { Value for External if v => v.is_external() }
796impl_eq! { for External }
797impl_hash! { for External use get_hash }
798impl_partial_eq! { Data for External use identity }
799impl_partial_eq! { Value for External use identity }
800impl_partial_eq! { External for External use identity }
801
802#[repr(C)]
804#[derive(Debug)]
805pub struct Object(Opaque);
806
807impl_deref! { Value for Object }
808impl_try_from! { Data for Object if v => v.is_value() && cast::<Value>(v).is_object() }
809impl_try_from! { Value for Object if v => v.is_object() }
810impl_from! { Array for Object }
811impl_from! { ArrayBuffer for Object }
812impl_from! { ArrayBufferView for Object }
813impl_from! { DataView for Object }
814impl_from! { TypedArray for Object }
815impl_from! { BigInt64Array for Object }
816impl_from! { BigUint64Array for Object }
817impl_from! { Float32Array for Object }
818impl_from! { Float64Array for Object }
819impl_from! { Int16Array for Object }
820impl_from! { Int32Array for Object }
821impl_from! { Int8Array for Object }
822impl_from! { Uint16Array for Object }
823impl_from! { Uint32Array for Object }
824impl_from! { Uint8Array for Object }
825impl_from! { Uint8ClampedArray for Object }
826impl_from! { BigIntObject for Object }
827impl_from! { BooleanObject for Object }
828impl_from! { Date for Object }
829impl_from! { Function for Object }
830impl_from! { Map for Object }
831impl_from! { NumberObject for Object }
832impl_from! { Promise for Object }
833impl_from! { PromiseResolver for Object }
834impl_from! { Proxy for Object }
835impl_from! { RegExp for Object }
836impl_from! { Set for Object }
837impl_from! { SharedArrayBuffer for Object }
838impl_from! { StringObject for Object }
839impl_from! { SymbolObject for Object }
840impl_from! { WasmMemoryObject for Object }
841impl_from! { WasmModuleObject for Object }
842impl_eq! { for Object }
843impl_hash! { for Object use get_identity_hash }
844impl_partial_eq! { Data for Object use identity }
845impl_partial_eq! { Value for Object use identity }
846impl_partial_eq! { Object for Object use identity }
847impl_partial_eq! { Array for Object use identity }
848impl_partial_eq! { ArrayBuffer for Object use identity }
849impl_partial_eq! { ArrayBufferView for Object use identity }
850impl_partial_eq! { DataView for Object use identity }
851impl_partial_eq! { TypedArray for Object use identity }
852impl_partial_eq! { BigInt64Array for Object use identity }
853impl_partial_eq! { BigUint64Array for Object use identity }
854impl_partial_eq! { Float32Array for Object use identity }
855impl_partial_eq! { Float64Array for Object use identity }
856impl_partial_eq! { Int16Array for Object use identity }
857impl_partial_eq! { Int32Array for Object use identity }
858impl_partial_eq! { Int8Array for Object use identity }
859impl_partial_eq! { Uint16Array for Object use identity }
860impl_partial_eq! { Uint32Array for Object use identity }
861impl_partial_eq! { Uint8Array for Object use identity }
862impl_partial_eq! { Uint8ClampedArray for Object use identity }
863impl_partial_eq! { BigIntObject for Object use identity }
864impl_partial_eq! { BooleanObject for Object use identity }
865impl_partial_eq! { Date for Object use identity }
866impl_partial_eq! { Function for Object use identity }
867impl_partial_eq! { Map for Object use identity }
868impl_partial_eq! { NumberObject for Object use identity }
869impl_partial_eq! { Promise for Object use identity }
870impl_partial_eq! { PromiseResolver for Object use identity }
871impl_partial_eq! { Proxy for Object use identity }
872impl_partial_eq! { RegExp for Object use identity }
873impl_partial_eq! { Set for Object use identity }
874impl_partial_eq! { SharedArrayBuffer for Object use identity }
875impl_partial_eq! { StringObject for Object use identity }
876impl_partial_eq! { SymbolObject for Object use identity }
877impl_partial_eq! { WasmMemoryObject for Object use identity }
878impl_partial_eq! { WasmModuleObject for Object use identity }
879
880#[repr(C)]
882#[derive(Debug)]
883pub struct Array(Opaque);
884
885impl_deref! { Object for Array }
886impl_try_from! { Data for Array if v => v.is_value() && cast::<Value>(v).is_array() }
887impl_try_from! { Value for Array if v => v.is_array() }
888impl_try_from! { Object for Array if v => v.is_array() }
889impl_eq! { for Array }
890impl_hash! { for Array use get_identity_hash }
891impl_partial_eq! { Data for Array use identity }
892impl_partial_eq! { Value for Array use identity }
893impl_partial_eq! { Object for Array use identity }
894impl_partial_eq! { Array for Array use identity }
895
896#[repr(C)]
898#[derive(Debug)]
899pub struct ArrayBuffer(Opaque);
900
901impl_deref! { Object for ArrayBuffer }
902impl_try_from! { Data for ArrayBuffer if v => v.is_value() && cast::<Value>(v).is_array_buffer() }
903impl_try_from! { Value for ArrayBuffer if v => v.is_array_buffer() }
904impl_try_from! { Object for ArrayBuffer if v => v.is_array_buffer() }
905impl_eq! { for ArrayBuffer }
906impl_hash! { for ArrayBuffer use get_identity_hash }
907impl_partial_eq! { Data for ArrayBuffer use identity }
908impl_partial_eq! { Value for ArrayBuffer use identity }
909impl_partial_eq! { Object for ArrayBuffer use identity }
910impl_partial_eq! { ArrayBuffer for ArrayBuffer use identity }
911
912#[repr(C)]
915#[derive(Debug)]
916pub struct ArrayBufferView(Opaque);
917
918impl_deref! { Object for ArrayBufferView }
919impl_try_from! { Data for ArrayBufferView if v => v.is_value() && cast::<Value>(v).is_array_buffer_view() }
920impl_try_from! { Value for ArrayBufferView if v => v.is_array_buffer_view() }
921impl_try_from! { Object for ArrayBufferView if v => v.is_array_buffer_view() }
922impl_from! { DataView for ArrayBufferView }
923impl_from! { TypedArray for ArrayBufferView }
924impl_from! { BigInt64Array for ArrayBufferView }
925impl_from! { BigUint64Array for ArrayBufferView }
926impl_from! { Float32Array for ArrayBufferView }
927impl_from! { Float64Array for ArrayBufferView }
928impl_from! { Int16Array for ArrayBufferView }
929impl_from! { Int32Array for ArrayBufferView }
930impl_from! { Int8Array for ArrayBufferView }
931impl_from! { Uint16Array for ArrayBufferView }
932impl_from! { Uint32Array for ArrayBufferView }
933impl_from! { Uint8Array for ArrayBufferView }
934impl_from! { Uint8ClampedArray for ArrayBufferView }
935impl_eq! { for ArrayBufferView }
936impl_hash! { for ArrayBufferView use get_identity_hash }
937impl_partial_eq! { Data for ArrayBufferView use identity }
938impl_partial_eq! { Value for ArrayBufferView use identity }
939impl_partial_eq! { Object for ArrayBufferView use identity }
940impl_partial_eq! { ArrayBufferView for ArrayBufferView use identity }
941impl_partial_eq! { DataView for ArrayBufferView use identity }
942impl_partial_eq! { TypedArray for ArrayBufferView use identity }
943impl_partial_eq! { BigInt64Array for ArrayBufferView use identity }
944impl_partial_eq! { BigUint64Array for ArrayBufferView use identity }
945impl_partial_eq! { Float32Array for ArrayBufferView use identity }
946impl_partial_eq! { Float64Array for ArrayBufferView use identity }
947impl_partial_eq! { Int16Array for ArrayBufferView use identity }
948impl_partial_eq! { Int32Array for ArrayBufferView use identity }
949impl_partial_eq! { Int8Array for ArrayBufferView use identity }
950impl_partial_eq! { Uint16Array for ArrayBufferView use identity }
951impl_partial_eq! { Uint32Array for ArrayBufferView use identity }
952impl_partial_eq! { Uint8Array for ArrayBufferView use identity }
953impl_partial_eq! { Uint8ClampedArray for ArrayBufferView use identity }
954
955#[repr(C)]
957#[derive(Debug)]
958pub struct DataView(Opaque);
959
960impl_deref! { ArrayBufferView for DataView }
961impl_try_from! { Data for DataView if v => v.is_value() && cast::<Value>(v).is_data_view() }
962impl_try_from! { Value for DataView if v => v.is_data_view() }
963impl_try_from! { Object for DataView if v => v.is_data_view() }
964impl_try_from! { ArrayBufferView for DataView if v => v.is_data_view() }
965impl_eq! { for DataView }
966impl_hash! { for DataView use get_identity_hash }
967impl_partial_eq! { Data for DataView use identity }
968impl_partial_eq! { Value for DataView use identity }
969impl_partial_eq! { Object for DataView use identity }
970impl_partial_eq! { ArrayBufferView for DataView use identity }
971impl_partial_eq! { DataView for DataView use identity }
972
973#[repr(C)]
976#[derive(Debug)]
977pub struct TypedArray(Opaque);
978
979impl_deref! { ArrayBufferView for TypedArray }
980impl_try_from! { Data for TypedArray if v => v.is_value() && cast::<Value>(v).is_typed_array() }
981impl_try_from! { Value for TypedArray if v => v.is_typed_array() }
982impl_try_from! { Object for TypedArray if v => v.is_typed_array() }
983impl_try_from! { ArrayBufferView for TypedArray if v => v.is_typed_array() }
984impl_from! { BigInt64Array for TypedArray }
985impl_from! { BigUint64Array for TypedArray }
986impl_from! { Float32Array for TypedArray }
987impl_from! { Float64Array for TypedArray }
988impl_from! { Int16Array for TypedArray }
989impl_from! { Int32Array for TypedArray }
990impl_from! { Int8Array for TypedArray }
991impl_from! { Uint16Array for TypedArray }
992impl_from! { Uint32Array for TypedArray }
993impl_from! { Uint8Array for TypedArray }
994impl_from! { Uint8ClampedArray for TypedArray }
995impl_eq! { for TypedArray }
996impl_hash! { for TypedArray use get_identity_hash }
997impl_partial_eq! { Data for TypedArray use identity }
998impl_partial_eq! { Value for TypedArray use identity }
999impl_partial_eq! { Object for TypedArray use identity }
1000impl_partial_eq! { ArrayBufferView for TypedArray use identity }
1001impl_partial_eq! { TypedArray for TypedArray use identity }
1002impl_partial_eq! { BigInt64Array for TypedArray use identity }
1003impl_partial_eq! { BigUint64Array for TypedArray use identity }
1004impl_partial_eq! { Float32Array for TypedArray use identity }
1005impl_partial_eq! { Float64Array for TypedArray use identity }
1006impl_partial_eq! { Int16Array for TypedArray use identity }
1007impl_partial_eq! { Int32Array for TypedArray use identity }
1008impl_partial_eq! { Int8Array for TypedArray use identity }
1009impl_partial_eq! { Uint16Array for TypedArray use identity }
1010impl_partial_eq! { Uint32Array for TypedArray use identity }
1011impl_partial_eq! { Uint8Array for TypedArray use identity }
1012impl_partial_eq! { Uint8ClampedArray for TypedArray use identity }
1013
1014#[repr(C)]
1016#[derive(Debug)]
1017pub struct BigInt64Array(Opaque);
1018
1019impl_deref! { TypedArray for BigInt64Array }
1020impl_try_from! { Data for BigInt64Array if v => v.is_value() && cast::<Value>(v).is_big_int64_array() }
1021impl_try_from! { Value for BigInt64Array if v => v.is_big_int64_array() }
1022impl_try_from! { Object for BigInt64Array if v => v.is_big_int64_array() }
1023impl_try_from! { ArrayBufferView for BigInt64Array if v => v.is_big_int64_array() }
1024impl_try_from! { TypedArray for BigInt64Array if v => v.is_big_int64_array() }
1025impl_eq! { for BigInt64Array }
1026impl_hash! { for BigInt64Array use get_identity_hash }
1027impl_partial_eq! { Data for BigInt64Array use identity }
1028impl_partial_eq! { Value for BigInt64Array use identity }
1029impl_partial_eq! { Object for BigInt64Array use identity }
1030impl_partial_eq! { ArrayBufferView for BigInt64Array use identity }
1031impl_partial_eq! { TypedArray for BigInt64Array use identity }
1032impl_partial_eq! { BigInt64Array for BigInt64Array use identity }
1033
1034#[repr(C)]
1036#[derive(Debug)]
1037pub struct BigUint64Array(Opaque);
1038
1039impl_deref! { TypedArray for BigUint64Array }
1040impl_try_from! { Data for BigUint64Array if v => v.is_value() && cast::<Value>(v).is_big_uint64_array() }
1041impl_try_from! { Value for BigUint64Array if v => v.is_big_uint64_array() }
1042impl_try_from! { Object for BigUint64Array if v => v.is_big_uint64_array() }
1043impl_try_from! { ArrayBufferView for BigUint64Array if v => v.is_big_uint64_array() }
1044impl_try_from! { TypedArray for BigUint64Array if v => v.is_big_uint64_array() }
1045impl_eq! { for BigUint64Array }
1046impl_hash! { for BigUint64Array use get_identity_hash }
1047impl_partial_eq! { Data for BigUint64Array use identity }
1048impl_partial_eq! { Value for BigUint64Array use identity }
1049impl_partial_eq! { Object for BigUint64Array use identity }
1050impl_partial_eq! { ArrayBufferView for BigUint64Array use identity }
1051impl_partial_eq! { TypedArray for BigUint64Array use identity }
1052impl_partial_eq! { BigUint64Array for BigUint64Array use identity }
1053
1054#[repr(C)]
1056#[derive(Debug)]
1057pub struct Float32Array(Opaque);
1058
1059impl_deref! { TypedArray for Float32Array }
1060impl_try_from! { Data for Float32Array if v => v.is_value() && cast::<Value>(v).is_float32_array() }
1061impl_try_from! { Value for Float32Array if v => v.is_float32_array() }
1062impl_try_from! { Object for Float32Array if v => v.is_float32_array() }
1063impl_try_from! { ArrayBufferView for Float32Array if v => v.is_float32_array() }
1064impl_try_from! { TypedArray for Float32Array if v => v.is_float32_array() }
1065impl_eq! { for Float32Array }
1066impl_hash! { for Float32Array use get_identity_hash }
1067impl_partial_eq! { Data for Float32Array use identity }
1068impl_partial_eq! { Value for Float32Array use identity }
1069impl_partial_eq! { Object for Float32Array use identity }
1070impl_partial_eq! { ArrayBufferView for Float32Array use identity }
1071impl_partial_eq! { TypedArray for Float32Array use identity }
1072impl_partial_eq! { Float32Array for Float32Array use identity }
1073
1074#[repr(C)]
1076#[derive(Debug)]
1077pub struct Float64Array(Opaque);
1078
1079impl_deref! { TypedArray for Float64Array }
1080impl_try_from! { Data for Float64Array if v => v.is_value() && cast::<Value>(v).is_float64_array() }
1081impl_try_from! { Value for Float64Array if v => v.is_float64_array() }
1082impl_try_from! { Object for Float64Array if v => v.is_float64_array() }
1083impl_try_from! { ArrayBufferView for Float64Array if v => v.is_float64_array() }
1084impl_try_from! { TypedArray for Float64Array if v => v.is_float64_array() }
1085impl_eq! { for Float64Array }
1086impl_hash! { for Float64Array use get_identity_hash }
1087impl_partial_eq! { Data for Float64Array use identity }
1088impl_partial_eq! { Value for Float64Array use identity }
1089impl_partial_eq! { Object for Float64Array use identity }
1090impl_partial_eq! { ArrayBufferView for Float64Array use identity }
1091impl_partial_eq! { TypedArray for Float64Array use identity }
1092impl_partial_eq! { Float64Array for Float64Array use identity }
1093
1094#[repr(C)]
1096#[derive(Debug)]
1097pub struct Int16Array(Opaque);
1098
1099impl_deref! { TypedArray for Int16Array }
1100impl_try_from! { Data for Int16Array if v => v.is_value() && cast::<Value>(v).is_int16_array() }
1101impl_try_from! { Value for Int16Array if v => v.is_int16_array() }
1102impl_try_from! { Object for Int16Array if v => v.is_int16_array() }
1103impl_try_from! { ArrayBufferView for Int16Array if v => v.is_int16_array() }
1104impl_try_from! { TypedArray for Int16Array if v => v.is_int16_array() }
1105impl_eq! { for Int16Array }
1106impl_hash! { for Int16Array use get_identity_hash }
1107impl_partial_eq! { Data for Int16Array use identity }
1108impl_partial_eq! { Value for Int16Array use identity }
1109impl_partial_eq! { Object for Int16Array use identity }
1110impl_partial_eq! { ArrayBufferView for Int16Array use identity }
1111impl_partial_eq! { TypedArray for Int16Array use identity }
1112impl_partial_eq! { Int16Array for Int16Array use identity }
1113
1114#[repr(C)]
1116#[derive(Debug)]
1117pub struct Int32Array(Opaque);
1118
1119impl_deref! { TypedArray for Int32Array }
1120impl_try_from! { Data for Int32Array if v => v.is_value() && cast::<Value>(v).is_int32_array() }
1121impl_try_from! { Value for Int32Array if v => v.is_int32_array() }
1122impl_try_from! { Object for Int32Array if v => v.is_int32_array() }
1123impl_try_from! { ArrayBufferView for Int32Array if v => v.is_int32_array() }
1124impl_try_from! { TypedArray for Int32Array if v => v.is_int32_array() }
1125impl_eq! { for Int32Array }
1126impl_hash! { for Int32Array use get_identity_hash }
1127impl_partial_eq! { Data for Int32Array use identity }
1128impl_partial_eq! { Value for Int32Array use identity }
1129impl_partial_eq! { Object for Int32Array use identity }
1130impl_partial_eq! { ArrayBufferView for Int32Array use identity }
1131impl_partial_eq! { TypedArray for Int32Array use identity }
1132impl_partial_eq! { Int32Array for Int32Array use identity }
1133
1134#[repr(C)]
1136#[derive(Debug)]
1137pub struct Int8Array(Opaque);
1138
1139impl_deref! { TypedArray for Int8Array }
1140impl_try_from! { Data for Int8Array if v => v.is_value() && cast::<Value>(v).is_int8_array() }
1141impl_try_from! { Value for Int8Array if v => v.is_int8_array() }
1142impl_try_from! { Object for Int8Array if v => v.is_int8_array() }
1143impl_try_from! { ArrayBufferView for Int8Array if v => v.is_int8_array() }
1144impl_try_from! { TypedArray for Int8Array if v => v.is_int8_array() }
1145impl_eq! { for Int8Array }
1146impl_hash! { for Int8Array use get_identity_hash }
1147impl_partial_eq! { Data for Int8Array use identity }
1148impl_partial_eq! { Value for Int8Array use identity }
1149impl_partial_eq! { Object for Int8Array use identity }
1150impl_partial_eq! { ArrayBufferView for Int8Array use identity }
1151impl_partial_eq! { TypedArray for Int8Array use identity }
1152impl_partial_eq! { Int8Array for Int8Array use identity }
1153
1154#[repr(C)]
1156#[derive(Debug)]
1157pub struct Uint16Array(Opaque);
1158
1159impl_deref! { TypedArray for Uint16Array }
1160impl_try_from! { Data for Uint16Array if v => v.is_value() && cast::<Value>(v).is_uint16_array() }
1161impl_try_from! { Value for Uint16Array if v => v.is_uint16_array() }
1162impl_try_from! { Object for Uint16Array if v => v.is_uint16_array() }
1163impl_try_from! { ArrayBufferView for Uint16Array if v => v.is_uint16_array() }
1164impl_try_from! { TypedArray for Uint16Array if v => v.is_uint16_array() }
1165impl_eq! { for Uint16Array }
1166impl_hash! { for Uint16Array use get_identity_hash }
1167impl_partial_eq! { Data for Uint16Array use identity }
1168impl_partial_eq! { Value for Uint16Array use identity }
1169impl_partial_eq! { Object for Uint16Array use identity }
1170impl_partial_eq! { ArrayBufferView for Uint16Array use identity }
1171impl_partial_eq! { TypedArray for Uint16Array use identity }
1172impl_partial_eq! { Uint16Array for Uint16Array use identity }
1173
1174#[repr(C)]
1176#[derive(Debug)]
1177pub struct Uint32Array(Opaque);
1178
1179impl_deref! { TypedArray for Uint32Array }
1180impl_try_from! { Data for Uint32Array if v => v.is_value() && cast::<Value>(v).is_uint32_array() }
1181impl_try_from! { Value for Uint32Array if v => v.is_uint32_array() }
1182impl_try_from! { Object for Uint32Array if v => v.is_uint32_array() }
1183impl_try_from! { ArrayBufferView for Uint32Array if v => v.is_uint32_array() }
1184impl_try_from! { TypedArray for Uint32Array if v => v.is_uint32_array() }
1185impl_eq! { for Uint32Array }
1186impl_hash! { for Uint32Array use get_identity_hash }
1187impl_partial_eq! { Data for Uint32Array use identity }
1188impl_partial_eq! { Value for Uint32Array use identity }
1189impl_partial_eq! { Object for Uint32Array use identity }
1190impl_partial_eq! { ArrayBufferView for Uint32Array use identity }
1191impl_partial_eq! { TypedArray for Uint32Array use identity }
1192impl_partial_eq! { Uint32Array for Uint32Array use identity }
1193
1194#[repr(C)]
1196#[derive(Debug)]
1197pub struct Uint8Array(Opaque);
1198
1199impl_deref! { TypedArray for Uint8Array }
1200impl_try_from! { Data for Uint8Array if v => v.is_value() && cast::<Value>(v).is_uint8_array() }
1201impl_try_from! { Value for Uint8Array if v => v.is_uint8_array() }
1202impl_try_from! { Object for Uint8Array if v => v.is_uint8_array() }
1203impl_try_from! { ArrayBufferView for Uint8Array if v => v.is_uint8_array() }
1204impl_try_from! { TypedArray for Uint8Array if v => v.is_uint8_array() }
1205impl_eq! { for Uint8Array }
1206impl_hash! { for Uint8Array use get_identity_hash }
1207impl_partial_eq! { Data for Uint8Array use identity }
1208impl_partial_eq! { Value for Uint8Array use identity }
1209impl_partial_eq! { Object for Uint8Array use identity }
1210impl_partial_eq! { ArrayBufferView for Uint8Array use identity }
1211impl_partial_eq! { TypedArray for Uint8Array use identity }
1212impl_partial_eq! { Uint8Array for Uint8Array use identity }
1213
1214#[repr(C)]
1216#[derive(Debug)]
1217pub struct Uint8ClampedArray(Opaque);
1218
1219impl_deref! { TypedArray for Uint8ClampedArray }
1220impl_try_from! { Data for Uint8ClampedArray if v => v.is_value() && cast::<Value>(v).is_uint8_clamped_array() }
1221impl_try_from! { Value for Uint8ClampedArray if v => v.is_uint8_clamped_array() }
1222impl_try_from! { Object for Uint8ClampedArray if v => v.is_uint8_clamped_array() }
1223impl_try_from! { ArrayBufferView for Uint8ClampedArray if v => v.is_uint8_clamped_array() }
1224impl_try_from! { TypedArray for Uint8ClampedArray if v => v.is_uint8_clamped_array() }
1225impl_eq! { for Uint8ClampedArray }
1226impl_hash! { for Uint8ClampedArray use get_identity_hash }
1227impl_partial_eq! { Data for Uint8ClampedArray use identity }
1228impl_partial_eq! { Value for Uint8ClampedArray use identity }
1229impl_partial_eq! { Object for Uint8ClampedArray use identity }
1230impl_partial_eq! { ArrayBufferView for Uint8ClampedArray use identity }
1231impl_partial_eq! { TypedArray for Uint8ClampedArray use identity }
1232impl_partial_eq! { Uint8ClampedArray for Uint8ClampedArray use identity }
1233
1234#[repr(C)]
1236#[derive(Debug)]
1237pub struct BigIntObject(Opaque);
1238
1239impl_deref! { Object for BigIntObject }
1240impl_try_from! { Data for BigIntObject if v => v.is_value() && cast::<Value>(v).is_big_int_object() }
1241impl_try_from! { Value for BigIntObject if v => v.is_big_int_object() }
1242impl_try_from! { Object for BigIntObject if v => v.is_big_int_object() }
1243impl_eq! { for BigIntObject }
1244impl_hash! { for BigIntObject use get_identity_hash }
1245impl_partial_eq! { Data for BigIntObject use identity }
1246impl_partial_eq! { Value for BigIntObject use identity }
1247impl_partial_eq! { Object for BigIntObject use identity }
1248impl_partial_eq! { BigIntObject for BigIntObject use identity }
1249
1250#[repr(C)]
1252#[derive(Debug)]
1253pub struct BooleanObject(Opaque);
1254
1255impl_deref! { Object for BooleanObject }
1256impl_try_from! { Data for BooleanObject if v => v.is_value() && cast::<Value>(v).is_boolean_object() }
1257impl_try_from! { Value for BooleanObject if v => v.is_boolean_object() }
1258impl_try_from! { Object for BooleanObject if v => v.is_boolean_object() }
1259impl_eq! { for BooleanObject }
1260impl_hash! { for BooleanObject use get_identity_hash }
1261impl_partial_eq! { Data for BooleanObject use identity }
1262impl_partial_eq! { Value for BooleanObject use identity }
1263impl_partial_eq! { Object for BooleanObject use identity }
1264impl_partial_eq! { BooleanObject for BooleanObject use identity }
1265
1266#[repr(C)]
1268#[derive(Debug)]
1269pub struct Date(Opaque);
1270
1271impl_deref! { Object for Date }
1272impl_try_from! { Data for Date if v => v.is_value() && cast::<Value>(v).is_date() }
1273impl_try_from! { Value for Date if v => v.is_date() }
1274impl_try_from! { Object for Date if v => v.is_date() }
1275impl_eq! { for Date }
1276impl_hash! { for Date use get_identity_hash }
1277impl_partial_eq! { Data for Date use identity }
1278impl_partial_eq! { Value for Date use identity }
1279impl_partial_eq! { Object for Date use identity }
1280impl_partial_eq! { Date for Date use identity }
1281
1282#[repr(C)]
1284#[derive(Debug)]
1285pub struct Function(Opaque);
1286
1287impl_deref! { Object for Function }
1288impl_try_from! { Data for Function if v => v.is_value() && cast::<Value>(v).is_function() }
1289impl_try_from! { Value for Function if v => v.is_function() }
1290impl_try_from! { Object for Function if v => v.is_function() }
1291impl_eq! { for Function }
1292impl_hash! { for Function use get_identity_hash }
1293impl_partial_eq! { Data for Function use identity }
1294impl_partial_eq! { Value for Function use identity }
1295impl_partial_eq! { Object for Function use identity }
1296impl_partial_eq! { Function for Function use identity }
1297
1298#[repr(C)]
1300#[derive(Debug)]
1301pub struct Map(Opaque);
1302
1303impl_deref! { Object for Map }
1304impl_try_from! { Data for Map if v => v.is_value() && cast::<Value>(v).is_map() }
1305impl_try_from! { Value for Map if v => v.is_map() }
1306impl_try_from! { Object for Map if v => v.is_map() }
1307impl_eq! { for Map }
1308impl_hash! { for Map use get_identity_hash }
1309impl_partial_eq! { Data for Map use identity }
1310impl_partial_eq! { Value for Map use identity }
1311impl_partial_eq! { Object for Map use identity }
1312impl_partial_eq! { Map for Map use identity }
1313
1314#[repr(C)]
1316#[derive(Debug)]
1317pub struct NumberObject(Opaque);
1318
1319impl_deref! { Object for NumberObject }
1320impl_try_from! { Data for NumberObject if v => v.is_value() && cast::<Value>(v).is_number_object() }
1321impl_try_from! { Value for NumberObject if v => v.is_number_object() }
1322impl_try_from! { Object for NumberObject if v => v.is_number_object() }
1323impl_eq! { for NumberObject }
1324impl_hash! { for NumberObject use get_identity_hash }
1325impl_partial_eq! { Data for NumberObject use identity }
1326impl_partial_eq! { Value for NumberObject use identity }
1327impl_partial_eq! { Object for NumberObject use identity }
1328impl_partial_eq! { NumberObject for NumberObject use identity }
1329
1330#[repr(C)]
1332#[derive(Debug)]
1333pub struct Promise(Opaque);
1334
1335impl_deref! { Object for Promise }
1336impl_try_from! { Data for Promise if v => v.is_value() && cast::<Value>(v).is_promise() }
1337impl_try_from! { Value for Promise if v => v.is_promise() }
1338impl_try_from! { Object for Promise if v => v.is_promise() }
1339impl_eq! { for Promise }
1340impl_hash! { for Promise use get_identity_hash }
1341impl_partial_eq! { Data for Promise use identity }
1342impl_partial_eq! { Value for Promise use identity }
1343impl_partial_eq! { Object for Promise use identity }
1344impl_partial_eq! { Promise for Promise use identity }
1345
1346#[repr(C)]
1347#[derive(Debug)]
1348pub struct PromiseResolver(Opaque);
1349
1350impl_deref! { Object for PromiseResolver }
1351impl_eq! { for PromiseResolver }
1352impl_hash! { for PromiseResolver use get_identity_hash }
1353impl_partial_eq! { Data for PromiseResolver use identity }
1354impl_partial_eq! { Value for PromiseResolver use identity }
1355impl_partial_eq! { Object for PromiseResolver use identity }
1356impl_partial_eq! { PromiseResolver for PromiseResolver use identity }
1357
1358#[repr(C)]
1361#[derive(Debug)]
1362pub struct Proxy(Opaque);
1363
1364impl_deref! { Object for Proxy }
1365impl_try_from! { Data for Proxy if v => v.is_value() && cast::<Value>(v).is_proxy() }
1366impl_try_from! { Value for Proxy if v => v.is_proxy() }
1367impl_try_from! { Object for Proxy if v => v.is_proxy() }
1368impl_eq! { for Proxy }
1369impl_hash! { for Proxy use get_identity_hash }
1370impl_partial_eq! { Data for Proxy use identity }
1371impl_partial_eq! { Value for Proxy use identity }
1372impl_partial_eq! { Object for Proxy use identity }
1373impl_partial_eq! { Proxy for Proxy use identity }
1374
1375#[repr(C)]
1377#[derive(Debug)]
1378pub struct RegExp(Opaque);
1379
1380impl_deref! { Object for RegExp }
1381impl_try_from! { Data for RegExp if v => v.is_value() && cast::<Value>(v).is_reg_exp() }
1382impl_try_from! { Value for RegExp if v => v.is_reg_exp() }
1383impl_try_from! { Object for RegExp if v => v.is_reg_exp() }
1384impl_eq! { for RegExp }
1385impl_hash! { for RegExp use get_identity_hash }
1386impl_partial_eq! { Data for RegExp use identity }
1387impl_partial_eq! { Value for RegExp use identity }
1388impl_partial_eq! { Object for RegExp use identity }
1389impl_partial_eq! { RegExp for RegExp use identity }
1390
1391#[repr(C)]
1393#[derive(Debug)]
1394pub struct Set(Opaque);
1395
1396impl_deref! { Object for Set }
1397impl_try_from! { Data for Set if v => v.is_value() && cast::<Value>(v).is_set() }
1398impl_try_from! { Value for Set if v => v.is_set() }
1399impl_try_from! { Object for Set if v => v.is_set() }
1400impl_eq! { for Set }
1401impl_hash! { for Set use get_identity_hash }
1402impl_partial_eq! { Data for Set use identity }
1403impl_partial_eq! { Value for Set use identity }
1404impl_partial_eq! { Object for Set use identity }
1405impl_partial_eq! { Set for Set use identity }
1406
1407#[repr(C)]
1409#[derive(Debug)]
1410pub struct SharedArrayBuffer(Opaque);
1411
1412impl_deref! { Object for SharedArrayBuffer }
1413impl_try_from! { Data for SharedArrayBuffer if v => v.is_value() && cast::<Value>(v).is_shared_array_buffer() }
1414impl_try_from! { Value for SharedArrayBuffer if v => v.is_shared_array_buffer() }
1415impl_try_from! { Object for SharedArrayBuffer if v => v.is_shared_array_buffer() }
1416impl_eq! { for SharedArrayBuffer }
1417impl_hash! { for SharedArrayBuffer use get_identity_hash }
1418impl_partial_eq! { Data for SharedArrayBuffer use identity }
1419impl_partial_eq! { Value for SharedArrayBuffer use identity }
1420impl_partial_eq! { Object for SharedArrayBuffer use identity }
1421impl_partial_eq! { SharedArrayBuffer for SharedArrayBuffer use identity }
1422
1423#[repr(C)]
1425#[derive(Debug)]
1426pub struct StringObject(Opaque);
1427
1428impl_deref! { Object for StringObject }
1429impl_try_from! { Data for StringObject if v => v.is_value() && cast::<Value>(v).is_string_object() }
1430impl_try_from! { Value for StringObject if v => v.is_string_object() }
1431impl_try_from! { Object for StringObject if v => v.is_string_object() }
1432impl_eq! { for StringObject }
1433impl_hash! { for StringObject use get_identity_hash }
1434impl_partial_eq! { Data for StringObject use identity }
1435impl_partial_eq! { Value for StringObject use identity }
1436impl_partial_eq! { Object for StringObject use identity }
1437impl_partial_eq! { StringObject for StringObject use identity }
1438
1439#[repr(C)]
1441#[derive(Debug)]
1442pub struct SymbolObject(Opaque);
1443
1444impl_deref! { Object for SymbolObject }
1445impl_try_from! { Data for SymbolObject if v => v.is_value() && cast::<Value>(v).is_symbol_object() }
1446impl_try_from! { Value for SymbolObject if v => v.is_symbol_object() }
1447impl_try_from! { Object for SymbolObject if v => v.is_symbol_object() }
1448impl_eq! { for SymbolObject }
1449impl_hash! { for SymbolObject use get_identity_hash }
1450impl_partial_eq! { Data for SymbolObject use identity }
1451impl_partial_eq! { Value for SymbolObject use identity }
1452impl_partial_eq! { Object for SymbolObject use identity }
1453impl_partial_eq! { SymbolObject for SymbolObject use identity }
1454
1455#[repr(C)]
1456#[derive(Debug)]
1457pub struct WasmMemoryObject(Opaque);
1458
1459impl_deref! { Object for WasmMemoryObject }
1460impl_try_from! { Data for WasmMemoryObject if v => v.is_value() && cast::<Value>(v).is_wasm_memory_object() }
1461impl_try_from! { Value for WasmMemoryObject if v => v.is_wasm_memory_object() }
1462impl_try_from! { Object for WasmMemoryObject if v => v.is_wasm_memory_object() }
1463impl_eq! { for WasmMemoryObject }
1464impl_hash! { for WasmMemoryObject use get_identity_hash }
1465impl_partial_eq! { Data for WasmMemoryObject use identity }
1466impl_partial_eq! { Value for WasmMemoryObject use identity }
1467impl_partial_eq! { Object for WasmMemoryObject use identity }
1468impl_partial_eq! { WasmMemoryObject for WasmMemoryObject use identity }
1469
1470#[repr(C)]
1471#[derive(Debug)]
1472pub struct WasmModuleObject(Opaque);
1473
1474impl_deref! { Object for WasmModuleObject }
1475impl_try_from! { Data for WasmModuleObject if v => v.is_value() && cast::<Value>(v).is_wasm_module_object() }
1476impl_try_from! { Value for WasmModuleObject if v => v.is_wasm_module_object() }
1477impl_try_from! { Object for WasmModuleObject if v => v.is_wasm_module_object() }
1478impl_eq! { for WasmModuleObject }
1479impl_hash! { for WasmModuleObject use get_identity_hash }
1480impl_partial_eq! { Data for WasmModuleObject use identity }
1481impl_partial_eq! { Value for WasmModuleObject use identity }
1482impl_partial_eq! { Object for WasmModuleObject use identity }
1483impl_partial_eq! { WasmModuleObject for WasmModuleObject use identity }
1484
1485#[repr(C)]
1487#[derive(Debug)]
1488pub struct Primitive(Opaque);
1489
1490impl_deref! { Value for Primitive }
1491impl_try_from! { Data for Primitive if v => v.is_primitive() }
1492impl_try_from! { Value for Primitive if v => v.is_primitive() }
1493impl_from! { BigInt for Primitive }
1494impl_from! { Boolean for Primitive }
1495impl_from! { Name for Primitive }
1496impl_from! { String for Primitive }
1497impl_from! { Symbol for Primitive }
1498impl_from! { Number for Primitive }
1499impl_from! { Integer for Primitive }
1500impl_from! { Int32 for Primitive }
1501impl_from! { Uint32 for Primitive }
1502impl_eq! { for Primitive }
1503impl_hash! { for Primitive use get_hash }
1504impl_partial_eq! { Value for Primitive use same_value_zero }
1505impl_partial_eq! { Primitive for Primitive use same_value_zero }
1506impl_partial_eq! { BigInt for Primitive use same_value_zero }
1507impl_partial_eq! { Boolean for Primitive use identity }
1508impl_partial_eq! { Name for Primitive use same_value_zero }
1509impl_partial_eq! { String for Primitive use same_value_zero }
1510impl_partial_eq! { Symbol for Primitive use identity }
1511impl_partial_eq! { Number for Primitive use same_value_zero }
1512impl_partial_eq! { Integer for Primitive use same_value_zero }
1513impl_partial_eq! { Int32 for Primitive use same_value_zero }
1514impl_partial_eq! { Uint32 for Primitive use same_value_zero }
1515
1516#[repr(C)]
1518#[derive(Debug)]
1519pub struct BigInt(Opaque);
1520
1521impl_deref! { Primitive for BigInt }
1522impl_try_from! { Data for BigInt if v => v.is_big_int() }
1523impl_try_from! { Value for BigInt if v => v.is_big_int() }
1524impl_try_from! { Primitive for BigInt if v => v.is_big_int() }
1525impl_eq! { for BigInt }
1526impl_hash! { for BigInt use get_hash }
1527impl_partial_eq! { Value for BigInt use same_value_zero }
1528impl_partial_eq! { Primitive for BigInt use same_value_zero }
1529impl_partial_eq! { BigInt for BigInt use strict_equals }
1530
1531#[repr(C)]
1534#[derive(Debug)]
1535pub struct Boolean(Opaque);
1536
1537impl_deref! { Primitive for Boolean }
1538impl_try_from! { Data for Boolean if v => v.is_boolean() }
1539impl_try_from! { Value for Boolean if v => v.is_boolean() }
1540impl_try_from! { Primitive for Boolean if v => v.is_boolean() }
1541impl_eq! { for Boolean }
1542impl_hash! { for Boolean use get_hash }
1543impl_partial_eq! { Data for Boolean use identity }
1544impl_partial_eq! { Value for Boolean use identity }
1545impl_partial_eq! { Primitive for Boolean use identity }
1546impl_partial_eq! { Boolean for Boolean use identity }
1547
1548#[repr(C)]
1550#[derive(Debug)]
1551pub struct Name(Opaque);
1552
1553impl_deref! { Primitive for Name }
1554impl_try_from! { Data for Name if v => v.is_name() }
1555impl_try_from! { Value for Name if v => v.is_name() }
1556impl_try_from! { Primitive for Name if v => v.is_name() }
1557impl_from! { String for Name }
1558impl_from! { Symbol for Name }
1559impl_eq! { for Name }
1560impl_hash! { for Name use get_identity_hash }
1561impl_partial_eq! { Value for Name use same_value_zero }
1562impl_partial_eq! { Primitive for Name use same_value_zero }
1563impl_partial_eq! { Name for Name use strict_equals }
1564impl_partial_eq! { String for Name use strict_equals }
1565impl_partial_eq! { Symbol for Name use identity }
1566
1567#[repr(C)]
1569#[derive(Debug)]
1570pub struct String(Opaque);
1571
1572impl_deref! { Name for String }
1573impl_try_from! { Data for String if v => v.is_string() }
1574impl_try_from! { Value for String if v => v.is_string() }
1575impl_try_from! { Primitive for String if v => v.is_string() }
1576impl_try_from! { Name for String if v => v.is_string() }
1577impl_eq! { for String }
1578impl_hash! { for String use get_identity_hash }
1579impl_partial_eq! { Value for String use same_value_zero }
1580impl_partial_eq! { Primitive for String use same_value_zero }
1581impl_partial_eq! { Name for String use strict_equals }
1582impl_partial_eq! { String for String use strict_equals }
1583
1584#[repr(C)]
1586#[derive(Debug)]
1587pub struct Symbol(Opaque);
1588
1589impl_deref! { Name for Symbol }
1590impl_try_from! { Data for Symbol if v => v.is_symbol() }
1591impl_try_from! { Value for Symbol if v => v.is_symbol() }
1592impl_try_from! { Primitive for Symbol if v => v.is_symbol() }
1593impl_try_from! { Name for Symbol if v => v.is_symbol() }
1594impl_eq! { for Symbol }
1595impl_hash! { for Symbol use get_identity_hash }
1596impl_partial_eq! { Data for Symbol use identity }
1597impl_partial_eq! { Value for Symbol use identity }
1598impl_partial_eq! { Primitive for Symbol use identity }
1599impl_partial_eq! { Name for Symbol use identity }
1600impl_partial_eq! { Symbol for Symbol use identity }
1601
1602#[repr(C)]
1604#[derive(Debug)]
1605pub struct Number(Opaque);
1606
1607impl_deref! { Primitive for Number }
1608impl_try_from! { Data for Number if v => v.is_number() }
1609impl_try_from! { Value for Number if v => v.is_number() }
1610impl_try_from! { Primitive for Number if v => v.is_number() }
1611impl_from! { Integer for Number }
1612impl_from! { Int32 for Number }
1613impl_from! { Uint32 for Number }
1614impl_eq! { for Number }
1615impl_hash! { for Number use get_hash }
1616impl_partial_eq! { Value for Number use same_value_zero }
1617impl_partial_eq! { Primitive for Number use same_value_zero }
1618impl_partial_eq! { Number for Number use same_value_zero }
1619impl_partial_eq! { Integer for Number use same_value_zero }
1620impl_partial_eq! { Int32 for Number use same_value_zero }
1621impl_partial_eq! { Uint32 for Number use same_value_zero }
1622
1623#[repr(C)]
1625#[derive(Debug)]
1626pub struct Integer(Opaque);
1627
1628impl_deref! { Number for Integer }
1629impl_try_from! { Data for Integer if v => v.is_number() && (cast::<Number>(v).is_int32() || cast::<Number>(v).is_uint32()) }
1630impl_try_from! { Value for Integer if v => v.is_int32() || v.is_uint32() }
1631impl_try_from! { Primitive for Integer if v => v.is_int32() || v.is_uint32() }
1632impl_try_from! { Number for Integer if v => v.is_int32() || v.is_uint32() }
1633impl_from! { Int32 for Integer }
1634impl_from! { Uint32 for Integer }
1635impl_eq! { for Integer }
1636impl_hash! { for Integer use get_hash }
1637impl_partial_eq! { Value for Integer use same_value_zero }
1638impl_partial_eq! { Primitive for Integer use same_value_zero }
1639impl_partial_eq! { Number for Integer use same_value_zero }
1640impl_partial_eq! { Integer for Integer use strict_equals }
1641impl_partial_eq! { Int32 for Integer use strict_equals }
1642impl_partial_eq! { Uint32 for Integer use strict_equals }
1643
1644#[repr(C)]
1646#[derive(Debug)]
1647pub struct Int32(Opaque);
1648
1649impl_deref! { Integer for Int32 }
1650impl_try_from! { Data for Int32 if v => v.is_number() && cast::<Number>(v).is_int32() }
1651impl_try_from! { Value for Int32 if v => v.is_int32() }
1652impl_try_from! { Primitive for Int32 if v => v.is_int32() }
1653impl_try_from! { Number for Int32 if v => v.is_int32() }
1654impl_try_from! { Integer for Int32 if v => v.is_int32() }
1655impl_eq! { for Int32 }
1656impl_hash! { for Int32 use get_hash }
1657impl_partial_eq! { Value for Int32 use same_value_zero }
1658impl_partial_eq! { Primitive for Int32 use same_value_zero }
1659impl_partial_eq! { Number for Int32 use same_value_zero }
1660impl_partial_eq! { Integer for Int32 use strict_equals }
1661impl_partial_eq! { Int32 for Int32 use strict_equals }
1662
1663#[repr(C)]
1665#[derive(Debug)]
1666pub struct Uint32(Opaque);
1667
1668impl_deref! { Integer for Uint32 }
1669impl_try_from! { Data for Uint32 if v => v.is_number() && cast::<Number>(v).is_uint32() }
1670impl_try_from! { Value for Uint32 if v => v.is_uint32() }
1671impl_try_from! { Primitive for Uint32 if v => v.is_uint32() }
1672impl_try_from! { Number for Uint32 if v => v.is_uint32() }
1673impl_try_from! { Integer for Uint32 if v => v.is_uint32() }
1674impl_eq! { for Uint32 }
1675impl_hash! { for Uint32 use get_hash }
1676impl_partial_eq! { Value for Uint32 use same_value_zero }
1677impl_partial_eq! { Primitive for Uint32 use same_value_zero }
1678impl_partial_eq! { Number for Uint32 use same_value_zero }
1679impl_partial_eq! { Integer for Uint32 use strict_equals }
1680impl_partial_eq! { Uint32 for Uint32 use strict_equals }