@@ -1362,6 +1362,56 @@ impl<'a> BinaryReader<'a> {
1362
1362
0x1d => visitor. visit_i31_get_s ( ) ,
1363
1363
0x1e => visitor. visit_i31_get_u ( ) ,
1364
1364
1365
+ 0x22 => visitor. visit_ref_get_desc ( self . read ( ) ?) ,
1366
+ 0x23 => visitor. visit_ref_cast_desc_non_null ( self . read ( ) ?) ,
1367
+ 0x24 => visitor. visit_ref_cast_desc_nullable ( self . read ( ) ?) ,
1368
+ 0x25 => {
1369
+ let pos = self . original_position ( ) ;
1370
+ let cast_flags = self . read_u8 ( ) ?;
1371
+ let relative_depth = self . read_var_u32 ( ) ?;
1372
+ let ( from_type_nullable, to_type_nullable) = match cast_flags {
1373
+ 0b00 => ( false , false ) ,
1374
+ 0b01 => ( true , false ) ,
1375
+ 0b10 => ( false , true ) ,
1376
+ 0b11 => ( true , true ) ,
1377
+ _ => bail ! ( pos, "invalid cast flags: {cast_flags:08b}" ) ,
1378
+ } ;
1379
+ let from_heap_type = self . read ( ) ?;
1380
+ let from_ref_type =
1381
+ RefType :: new ( from_type_nullable, from_heap_type) . ok_or_else ( || {
1382
+ format_err ! ( pos, "implementation error: type index too large" )
1383
+ } ) ?;
1384
+ let to_heap_type = self . read ( ) ?;
1385
+ let to_ref_type =
1386
+ RefType :: new ( to_type_nullable, to_heap_type) . ok_or_else ( || {
1387
+ format_err ! ( pos, "implementation error: type index too large" )
1388
+ } ) ?;
1389
+ visitor. visit_br_on_cast_desc ( relative_depth, from_ref_type, to_ref_type)
1390
+ }
1391
+ 0x26 => {
1392
+ let pos = self . original_position ( ) ;
1393
+ let cast_flags = self . read_u8 ( ) ?;
1394
+ let relative_depth = self . read_var_u32 ( ) ?;
1395
+ let ( from_type_nullable, to_type_nullable) = match cast_flags {
1396
+ 0 => ( false , false ) ,
1397
+ 1 => ( true , false ) ,
1398
+ 2 => ( false , true ) ,
1399
+ 3 => ( true , true ) ,
1400
+ _ => bail ! ( pos, "invalid cast flags: {cast_flags:08b}" ) ,
1401
+ } ;
1402
+ let from_heap_type = self . read ( ) ?;
1403
+ let from_ref_type =
1404
+ RefType :: new ( from_type_nullable, from_heap_type) . ok_or_else ( || {
1405
+ format_err ! ( pos, "implementation error: type index too large" )
1406
+ } ) ?;
1407
+ let to_heap_type = self . read ( ) ?;
1408
+ let to_ref_type =
1409
+ RefType :: new ( to_type_nullable, to_heap_type) . ok_or_else ( || {
1410
+ format_err ! ( pos, "implementation error: type index too large" )
1411
+ } ) ?;
1412
+ visitor. visit_br_on_cast_desc_fail ( relative_depth, from_ref_type, to_ref_type)
1413
+ }
1414
+
1365
1415
_ => bail ! ( pos, "unknown 0xfb subopcode: 0x{code:x}" ) ,
1366
1416
} )
1367
1417
}
0 commit comments