@@ -98,6 +98,18 @@ fn AssertGCPointerAlignment(bits: u64) {
98
98
#[ inline( always) ]
99
99
fn AssertGCPointerAlignment ( bits : u64 ) { }
100
100
101
+ #[ cfg( target_pointer_width = "64" ) ]
102
+ #[ inline( always) ]
103
+ fn IsValidUserModePointer ( bits : u64 ) -> bool {
104
+ bits & 0xFFFF_0000_0000_0000 == 0
105
+ }
106
+
107
+ #[ cfg( target_pointer_width = "32" ) ]
108
+ #[ inline( always) ]
109
+ fn IsValidUserModePointer ( _: u64 ) -> bool {
110
+ true
111
+ }
112
+
101
113
#[ inline( always) ]
102
114
pub fn Int32Value ( i : i32 ) -> JSVal {
103
115
BuildJSVal ( ValueTag :: INT32 , i as u32 as u64 )
@@ -115,9 +127,11 @@ pub fn NullValue() -> JSVal {
115
127
116
128
#[ inline( always) ]
117
129
pub fn DoubleValue ( f : f64 ) -> JSVal {
118
- let bits: u64 = f. to_bits ( ) ;
119
- assert ! ( bits <= ValueShiftedTag :: MAX_DOUBLE as u64 ) ;
120
- JSVal { asBits_ : bits }
130
+ let val = JSVal {
131
+ asBits_ : f. to_bits ( ) ,
132
+ } ;
133
+ assert ! ( val. is_double( ) ) ;
134
+ val
121
135
}
122
136
123
137
#[ inline( always) ]
@@ -174,8 +188,7 @@ pub fn ObjectOrNullValue(o: *mut JSObject) -> JSVal {
174
188
#[ inline( always) ]
175
189
pub fn PrivateValue ( o : * const c_void ) -> JSVal {
176
190
let ptrBits = o as usize as u64 ;
177
- #[ cfg( target_pointer_width = "64" ) ]
178
- assert_eq ! ( ptrBits & 0xFFFF000000000000 , 0 ) ;
191
+ assert ! ( IsValidUserModePointer ( ptrBits) ) ;
179
192
JSVal { asBits_ : ptrBits }
180
193
}
181
194
@@ -222,11 +235,18 @@ impl JSVal {
222
235
self . toTag ( ) == ValueTag :: INT32 as u64
223
236
}
224
237
238
+ #[ cfg( target_pointer_width = "64" ) ]
225
239
#[ inline( always) ]
226
240
pub fn is_double ( & self ) -> bool {
227
241
self . asBits ( ) <= ValueShiftedTag :: MAX_DOUBLE as u64
228
242
}
229
243
244
+ #[ cfg( target_pointer_width = "32" ) ]
245
+ #[ inline( always) ]
246
+ pub fn is_double ( & self ) -> bool {
247
+ ( self . asBits ( ) >> JSVAL_TAG_SHIFT ) as u32 <= JSVAL_TAG_CLEAR
248
+ }
249
+
230
250
#[ cfg( target_pointer_width = "64" ) ]
231
251
#[ inline( always) ]
232
252
pub fn is_number ( & self ) -> bool {
@@ -401,11 +421,14 @@ impl JSVal {
401
421
self . payload ( ) != 0
402
422
}
403
423
424
+ #[ inline( always) ]
425
+ pub fn is_private ( & self ) -> bool {
426
+ self . is_double ( ) && IsValidUserModePointer ( self . asBits ( ) )
427
+ }
428
+
404
429
#[ inline( always) ]
405
430
pub fn to_private ( & self ) -> * const c_void {
406
- assert ! ( self . is_double( ) ) ;
407
- #[ cfg( target_pointer_width = "64" ) ]
408
- assert_eq ! ( self . asBits( ) & 0xFFFF000000000000 , 0 ) ;
431
+ assert ! ( self . is_private( ) ) ;
409
432
self . asBits ( ) as usize as * const c_void
410
433
}
411
434
0 commit comments