@@ -47,6 +47,7 @@ class Eval {
4747 var funIndex : Int ;
4848 var codePos : Int ;
4949 var ebp : Pointer ;
50+ var guidNames : Int64Map <String >;
5051
5152 public var maxArrLength : Int = 10 ;
5253 public var maxBytesLength : Int = 128 ;
@@ -83,6 +84,10 @@ class Eval {
8384 this .ebp = ebp ;
8485 }
8586
87+ public function onBeforeBreak () {
88+ this .guidNames = null ;
89+ }
90+
8691 public function eval ( expr : String ) : Value {
8792 if ( expr == null || expr == " " )
8893 return null ;
@@ -986,6 +991,16 @@ class Eval {
986991 c + " (" + [for ( v in values ) valueStr (v ,maxStringRec )].join (" , " ) + " )" ;
987992 case VInlined (_ ):
988993 " inlined" ;
994+ case VGuid (i , name ):
995+ switch ( v .hint ) {
996+ case HBin : Value .int64Str (i , 2 );
997+ case HHex : Value .int64Str (i , 16 );
998+ default :
999+ var str = Value .int64GuidStr (i );
1000+ if ( name != null )
1001+ str = ' $name ( $str )' ;
1002+ str ;
1003+ }
9891004 }
9901005 return str ;
9911006 }
@@ -1078,6 +1093,10 @@ class Eval {
10781093 VBool (m .getUI8 (0 ) != 0 );
10791094 case HPacked (t ):
10801095 return { v : VPointer (p ), t : t .v };
1096+ case HGUID :
1097+ var i64 = haxe. Int64 .make (readI32 (p .offset (4 )), readI32 (p ));
1098+ var name = getGuidName (i64 );
1099+ return { v : VGuid (i64 , name ), t : t };
10811100 default :
10821101 p = readPointer (p );
10831102 return valueCast (p , t );
@@ -1611,4 +1630,43 @@ class Eval {
16111630 return module .code .types [tid ];
16121631 }
16131632
1633+ function getGuidName ( i64 : haxe. Int64 ) : Null <String > {
1634+ if ( guidNames == null ) {
1635+ guidNames = new Int64Map ();
1636+ if ( jit .hlVersion >= 1.15 ) {
1637+ var pmap = readPointer (jit .threads .offset (jit .align .ptr * 3 + 8 ));
1638+ if ( ! pmap .isNull () ) {
1639+ var m = @:privateAccess makeMap (pmap , HI64 );
1640+ switch ( m ) {
1641+ case VMap (_ , nkeys , readKey , readValue , _ ):
1642+ for (n in 0 ... nkeys ) {
1643+ var k = readKey (n );
1644+ var v = readValue (n );
1645+ switch ( [k .v , v .v ] ) {
1646+ case [VInt64 (ki64 ), VString (vname , _ )]:
1647+ guidNames .set (ki64 , vname );
1648+ default :
1649+ }
1650+ }
1651+ default : throw " assert" ;
1652+ }
1653+ }
1654+ }
1655+ }
1656+ return guidNames .get (i64 );
1657+ }
1658+
1659+ }
1660+
1661+ // Map<Int64, V> does not work on JS, see https://github.com/HaxeFoundation/haxe/issues/9872
1662+ class Int64Map < T > extends haxe.ds. BalancedTree < haxe. Int64 , T > {
1663+ override function compare (k1 : haxe. Int64 , k2 : haxe. Int64 ): Int {
1664+ return if ( k1 == k2 ) {
1665+ 0 ;
1666+ } else if ( k1 > k2 ) {
1667+ 1 ;
1668+ } else {
1669+ - 1 ;
1670+ }
1671+ }
16141672}
0 commit comments