Skip to content

Commit

Permalink
Fix getVarAddress for VInlined
Browse files Browse the repository at this point in the history
  • Loading branch information
yuxiaomao committed Mar 29, 2024
1 parent b49c8e1 commit 3801401
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 21 deletions.
38 changes: 22 additions & 16 deletions hld/Eval.hx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package hld;
import hld.Value;
import format.hl.Data.HLType;

enum abstract NativeReg(Int) from Int {
var Eax = 0;
Expand Down Expand Up @@ -31,6 +30,7 @@ enum VarAddress {
AAddr( ptr : Pointer, t : HLType );
AMethod( v : Value, ptr : Pointer, t : HLType );
AEvaled( v : Value );
AInlined( fields : Array<{ name : String, addr : VarAddress }> );
}

class Eval {
Expand Down Expand Up @@ -594,36 +594,40 @@ class Eval {
return null;
return convertVal(api.readRegister(currentThread,t == HF64 || t == HF32 ? Xmm0 : Eax), t);
default:
getVarInlined(module.getGraph(funIndex).getLocalsRaw(codePos), name);
fetchAddr(getVarAddress(name));
}
}

function getVarInlined( localsRaw : Array<String>, name : String , ?prefix : String) : Value {
function getVarAddress( name : String, ?prefix : String, ?localsRaw : Array<String> ) : VarAddress {
var fullname = prefix == null ? name : prefix + "." + name;
var v = fetchAddr(getVarAddress(fullname));
if( v != null )
return v;
var a = getVarAddressRaw(fullname);
if( a != ANone )
return a;

if( localsRaw == null )
localsRaw = module.getGraph(funIndex).getLocalsRaw(codePos);

// Inlined constructor variables
var relatedLocals = [];
for( r in localsRaw ) {
var names = r.split(".");
if( names.length <= 1 || names[0] != name ) continue;
relatedLocals.push(names.slice(1).join("."));
}
if( relatedLocals.length == 0 )
return null;
return ANone;

var fnames = [];
for( r in relatedLocals ) {
var name = r.split(".")[0];
if( fnames.contains(name) ) continue;
fnames.push(name);
}
var fields = [for( n in fnames ) {name : n, v : getVarInlined(relatedLocals, n, fullname)}];
return { v: VInlined(fields), t : HDyn };
var fields = [for( n in fnames ) { name : n, addr : getVarAddress(n, fullname, relatedLocals) }];
return AInlined(fields);
}

function getVarAddress( name : String ) : VarAddress {
function getVarAddressRaw( name : String ) : VarAddress {
// locals
var loc = module.getGraph(funIndex).getLocal(name, codePos);
if( loc != null && !globalContext ) {
Expand Down Expand Up @@ -810,7 +814,7 @@ class Eval {
c
else
c + "(" + [for( v in values ) valueStr(v,maxStringRec)].join(", ") + ")";
case VInlined(fields):
case VInlined(_):
"inlined";
}
return str;
Expand Down Expand Up @@ -1138,11 +1142,6 @@ class Eval {
switch( v.v ) {
case VEnum(_,values,_) if( name.charCodeAt(0) == "$".code ):
return values[Std.parseInt(name.substr(1))];
case VInlined(fields):
for( f in fields )
if( f.name == name )
return f.v;
return null;
default:
}
var a = readFieldAddress(v, name);
Expand All @@ -1167,6 +1166,8 @@ class Eval {
return { v : VMethod(fval,v,p), t : t };
case AEvaled(v):
return v;
case AInlined(fields):
return { v : VInlined(fields.map(f -> { name : f.name, addr : f.addr })), t : HDyn };
}
}

Expand All @@ -1177,6 +1178,11 @@ class Eval {
case VArray(_, _, _, p): p;
case VString(_, p): p;
case VMap(_, _, _, _, p): p;
case VInlined(fields):
for( f in fields )
if( f.name == name )
return f.addr;
return ANone;
default:
return ANone;
}
Expand Down
2 changes: 1 addition & 1 deletion hld/Value.hx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ enum ValueRepr {
VType( t : HLType );
VEnum( c : String, values : Array<Value>, p : Pointer );
VBytes( length : Int, read : Int -> Int, p : Pointer );
VInlined( fields : Array<{ name : String, v : Value }> );
VInlined( fields : Array<{ name : String, addr : Eval.VarAddress }> );
}

enum FunRepr {
Expand Down
8 changes: 4 additions & 4 deletions src/HLAdapter.hx
Original file line number Diff line number Diff line change
Expand Up @@ -798,13 +798,13 @@ class HLAdapter extends DebugSession {
variablesReference : allocValue(VStack(stack)),
});
case VInlined(fields):
for( i in 0...fields.length )
for( f in fields )
try {
var value = fields[i].v;
vars.push(makeVar(fields[i].name, value));
var value = dbg.eval.readField(v, f.name);
vars.push(makeVar(f.name, value));
} catch( e : Dynamic ) {
vars.push({
name : fields[i].name,
name : f.name,
value : Std.string(e),
variablesReference : 0,
});
Expand Down

0 comments on commit 3801401

Please sign in to comment.