@@ -933,7 +933,8 @@ class Eval {
933933 case VString (s ,p ):
934934 switch ( [v .t , v .hint ] ) {
935935 case [HBytes , HReadBytes (t , pos )]:
936- readBytesStrAt (- 1 , i -> readByte (p .offset (i )), t , pos );
936+ var pos = toInt (eval (pos ));
937+ valueStr (readBytesAt (- 1 , i -> readByte (p .offset (i )), t , pos ));
937938 case [_ , HNoEscape ]:
938939 " \" " + s + " \" " ;
939940 default :
@@ -962,7 +963,8 @@ class Eval {
962963 case VBytes (length , read , _ ):
963964 switch ( v .hint ) {
964965 case HReadBytes (t , pos ):
965- readBytesStrAt (length , read , t , pos );
966+ var pos = toInt (eval (pos ));
967+ valueStr (readBytesAt (length , read , t , pos ));
966968 default :
967969 var blen = length < maxBytesLength ? length : maxBytesLength ;
968970 var bytes = haxe.io. Bytes .alloc (blen );
@@ -1008,21 +1010,20 @@ class Eval {
10081010 return str ;
10091011 }
10101012
1011- function readBytesStrAt ( length : Int , read : Int -> Int , t : HLType , pos : String ) : String {
1012- var pos = toInt (eval (pos ));
1013+ function readBytesAt ( length : Int , read : Int -> Int , t : HLType , pos : Int ) : Value {
10131014 var blen = align .typeSize (t );
10141015 if ( pos < 0 || (length >= 0 && pos > length - blen ) )
10151016 throw " Out of bound [0," + (length < 0 ? " ???" : " " + length ) + " ) for " + pos + " +" + (blen - 1 );
10161017 var bytes = haxe.io. Bytes .alloc (blen );
10171018 for ( i in 0 ... blen )
10181019 bytes .set (i , read (pos + i ));
10191020 return switch ( t ) {
1020- case HUi8 : " " + bytes .get (0 );
1021- case HUi16 : " " + bytes .getUInt16 (0 );
1022- case HI32 : " " + bytes .getInt32 (0 );
1023- case HI64 : " " + bytes .getInt64 (0 );
1024- case HF32 : " " + bytes .getFloat (0 );
1025- case HF64 : " " + bytes .getDouble (0 );
1021+ case HUi8 : { v : VInt ( bytes .get (0 )), t : t } ;
1022+ case HUi16 : { v : VInt ( bytes .getUInt16 (0 )), t : t } ;
1023+ case HI32 : { v : VInt ( bytes .getInt32 (0 )), t : t } ;
1024+ case HI64 : { v : VInt64 ( bytes .getInt64 (0 )), t : t } ;
1025+ case HF32 : { v : VFloat ( bytes .getFloat (0 )), t : t } ;
1026+ case HF64 : { v : VFloat ( bytes .getDouble (0 )), t : t } ;
10261027 default :
10271028 throw " assert" ;
10281029 }
@@ -1334,9 +1335,35 @@ class Eval {
13341335 } else if ( size != null ) {
13351336 var length = toInt (eval (size ));
13361337 if ( length < 0 )
1337- throw " assert: invalid CArray size " + length ;
1338+ throw " assert: invalid CArray size " + size ;
13381339 var varr = VArray (at , length , function (i ) return convertVal (p .offset (mproto .size * i ), at ), null );
13391340 return { v : varr , t : v .t };
1341+ } else {
1342+ throw " Missing CArray size or pos" ;
1343+ }
1344+ case [VBytes (length , read , _ ), _ , HArray (t , _ , pos )]:
1345+ // haxe.io.Bytes
1346+ var tsize = align .typeSize (t );
1347+ if ( pos != null ) {
1348+ var pos = toInt (eval (pos ));
1349+ return readBytesAt (length , read , t , pos * tsize );
1350+ } else {
1351+ var alen = Std .int (length / tsize );
1352+ var varr = VArray (t , alen , function (i ) return readBytesAt (length , read , t , i * tsize ), null );
1353+ return { v : varr , t : v .t };
1354+ }
1355+ case [VString (_ , p ), HBytes , HArray (t , size , pos )]:
1356+ // hl.Bytes
1357+ var tsize = align .typeSize (t );
1358+ if ( pos != null ) {
1359+ var pos = toInt (eval (pos ));
1360+ return readBytesAt (- 1 , i -> readByte (p .offset (i )), t , pos * tsize );
1361+ } else if ( size != null ) {
1362+ var length = toInt (eval (size ));
1363+ var varr = VArray (t , length , function (i ) return readBytesAt (- 1 , i -> readByte (p .offset (i )), t , i * tsize ), null );
1364+ return { v : varr , t : v .t };
1365+ } else {
1366+ throw " Missing Array size or pos" ;
13401367 }
13411368 default :
13421369 }
0 commit comments