@@ -9,6 +9,7 @@ use jsapi::JSContext;
99use jsapi:: JSObject ;
1010use jsapi:: JSString ;
1111use jsapi:: JSValueType ;
12+ use jsapi:: JS :: BigInt ;
1213use jsapi:: JS :: Symbol ;
1314use jsapi:: JS :: TraceKind ;
1415use jsapi:: JS :: Value ;
@@ -36,6 +37,7 @@ enum ValueTag {
3637 UNDEFINED = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_UNDEFINED as u32 ) ,
3738 STRING = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_STRING as u32 ) ,
3839 SYMBOL = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_SYMBOL as u32 ) ,
40+ BIGINT = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_BIGINT as u32 ) ,
3941 BOOLEAN = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_BOOLEAN as u32 ) ,
4042 MAGIC = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_MAGIC as u32 ) ,
4143 NULL = JSVAL_TAG_MAX_DOUBLE | ( JSValueType :: JSVAL_TYPE_NULL as u32 ) ,
@@ -51,6 +53,7 @@ enum ValueTag {
5153 UNDEFINED = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_UNDEFINED as u32 ) ,
5254 STRING = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_STRING as u32 ) ,
5355 SYMBOL = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_SYMBOL as u32 ) ,
56+ BIGINT = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_BIGINT as u32 ) ,
5457 BOOLEAN = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_BOOLEAN as u32 ) ,
5558 MAGIC = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_MAGIC as u32 ) ,
5659 NULL = JSVAL_TAG_CLEAR as u32 | ( JSValueType :: JSVAL_TYPE_NULL as u32 ) ,
@@ -66,6 +69,7 @@ enum ValueShiftedTag {
6669 UNDEFINED = ( ValueTag :: UNDEFINED as u64 ) << JSVAL_TAG_SHIFT ,
6770 STRING = ( ValueTag :: STRING as u64 ) << JSVAL_TAG_SHIFT ,
6871 SYMBOL = ( ValueTag :: SYMBOL as u64 ) << JSVAL_TAG_SHIFT ,
72+ BIGINT = ( ValueTag :: BIGINT as u64 ) << JSVAL_TAG_SHIFT ,
6973 BOOLEAN = ( ValueTag :: BOOLEAN as u64 ) << JSVAL_TAG_SHIFT ,
7074 MAGIC = ( ValueTag :: MAGIC as u64 ) << JSVAL_TAG_SHIFT ,
7175 NULL = ( ValueTag :: NULL as u64 ) << JSVAL_TAG_SHIFT ,
@@ -191,6 +195,21 @@ pub fn SymbolValue(s: &Symbol) -> JSVal {
191195 BuildJSVal ( ValueTag :: SYMBOL , bits)
192196}
193197
198+ #[ cfg( target_pointer_width = "64" ) ]
199+ #[ inline( always) ]
200+ pub fn BigIntValue ( s : & BigInt ) -> JSVal {
201+ let bits = s as * const BigInt as usize as u64 ;
202+ assert ! ( ( bits >> JSVAL_TAG_SHIFT ) == 0 ) ;
203+ BuildJSVal ( ValueTag :: BIGINT , bits)
204+ }
205+
206+ #[ cfg( target_pointer_width = "32" ) ]
207+ #[ inline( always) ]
208+ pub fn BigIntValue ( s : & BigInt ) -> JSVal {
209+ let bits = s as * const BigInt as usize as u64 ;
210+ BuildJSVal ( ValueTag :: BIGINT , bits)
211+ }
212+
194213#[ inline( always) ]
195214pub fn PrivateValue ( o : * const c_void ) -> JSVal {
196215 let ptrBits = o as usize as u64 ;
@@ -363,6 +382,18 @@ impl JSVal {
363382 ( self . asBits ( ) >> 32 ) == ValueTag :: SYMBOL as u64
364383 }
365384
385+ #[ inline( always) ]
386+ #[ cfg( target_pointer_width = "64" ) ]
387+ pub fn is_bigint ( & self ) -> bool {
388+ ( self . asBits ( ) >> JSVAL_TAG_SHIFT ) == ValueTag :: BIGINT as u64
389+ }
390+
391+ #[ inline( always) ]
392+ #[ cfg( target_pointer_width = "32" ) ]
393+ pub fn is_bigint ( & self ) -> bool {
394+ ( self . asBits ( ) >> 32 ) == ValueTag :: BIGINT as u64
395+ }
396+
366397 #[ inline( always) ]
367398 #[ cfg( target_pointer_width = "64" ) ]
368399 pub fn is_gcthing ( & self ) -> bool {
@@ -459,6 +490,14 @@ impl JSVal {
459490 ptrBits as usize as * mut Symbol
460491 }
461492
493+ #[ inline( always) ]
494+ pub fn to_bigint ( & self ) -> * mut BigInt {
495+ assert ! ( self . is_bigint( ) ) ;
496+ let ptrBits = self . asBits ( ) & JSVAL_PAYLOAD_MASK ;
497+ assert ! ( ( ptrBits & 0x7 ) == 0 ) ;
498+ ptrBits as usize as * mut BigInt
499+ }
500+
462501 #[ inline( always) ]
463502 pub fn to_private ( & self ) -> * const c_void {
464503 assert ! ( self . is_double( ) ) ;
@@ -496,8 +535,10 @@ impl JSVal {
496535 TraceKind :: Object
497536 } else if self . is_string ( ) {
498537 TraceKind :: String
499- } else {
538+ } else if self . is_symbol ( ) {
500539 TraceKind :: Symbol
540+ } else {
541+ TraceKind :: BigInt
501542 }
502543 }
503544}
0 commit comments