Skip to content

Commit a99eab8

Browse files
committed
Allow inspect haxe.io.Bytes/hl.Bytes as Array<Int/Float>
1 parent f1f12b6 commit a99eab8

File tree

2 files changed

+64
-11
lines changed

2 files changed

+64
-11
lines changed

hld/Eval.hx

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

hld/Value.hx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ enum Hint {
3737
HEscape; // v:s
3838
HNoEscape;
3939
HReadBytes(t : HLType, pos : String); // v:UI8(0), v:UI16(0), v:I32(0), v:I64(0), v:F32(0), v:F64(0)
40+
HArray(t : HLType, size : Null<String>, pos : Null<String>); // v:Array<T>, v:Array<T,size>, v:Array<T>[pos] (T=Int,Float,UI8,UI16,I32,I64,F32,F64)
4041
HEnumFlags(t : String); // v:EnumFlags<T>, v:haxe.EnumFlags<T>
4142
HEnumIndex(t : String); // v:EnumIndex<T>
4243
HCArray(t : String, size : Null<String>, pos : Null<String>); // v:CArray<T,size>, v:CArray<T>[pos]
@@ -81,6 +82,31 @@ enum Hint {
8182
return HReadBytes(HF32, s.substr(4, s.length - 5));
8283
if( StringTools.startsWith(s,"F64(") && StringTools.endsWith(s,")") )
8384
return HReadBytes(HF64, s.substr(4, s.length - 5));
85+
if( StringTools.startsWith(s, "Array<") ) {
86+
var typeStr : String = null;
87+
var size : String = null;
88+
var pos : String = null;
89+
if( StringTools.endsWith(s,">")) {
90+
var parts = s.substr(6, s.length - 7).split(",");
91+
typeStr = parts[0];
92+
size = parts.length > 1 ? parts[1] : null;
93+
}
94+
if( StringTools.endsWith(s,"]")) {
95+
var parts = s.substr(6, s.length - 7).split(">[");
96+
typeStr = parts[0];
97+
pos = parts[1];
98+
}
99+
var btype = switch(typeStr) {
100+
case "UI8": HUi8;
101+
case "UI16": HUi16;
102+
case "I32", "Int": HI32;
103+
case "I64": HI64;
104+
case "F32": HF32;
105+
case "F64", "Float": HF64;
106+
case null, _: return HNone;
107+
}
108+
return HArray(btype, size, pos);
109+
}
84110
if( StringTools.startsWith(s,"EnumFlags<") && StringTools.endsWith(s,">") )
85111
return HEnumFlags(s.substr(10, s.length - 11));
86112
if( StringTools.startsWith(s,"haxe.EnumFlags<") && StringTools.endsWith(s,">") )

0 commit comments

Comments
 (0)