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