|
@@ -86,6 +86,7 @@ class Memory {
|
|
|
|
|
|
var sortByCount : Bool;
|
|
var sortByCount : Bool;
|
|
var displayFields : FieldsMode = Full;
|
|
var displayFields : FieldsMode = Full;
|
|
|
|
+ var displayProgress = true;
|
|
|
|
|
|
var code : format.hl.Data;
|
|
var code : format.hl.Data;
|
|
var pages : Array<Page>;
|
|
var pages : Array<Page>;
|
|
@@ -335,7 +336,7 @@ class Memory {
|
|
var missingTypes = 0;
|
|
var missingTypes = 0;
|
|
for( b in blocks ) {
|
|
for( b in blocks ) {
|
|
progress++;
|
|
progress++;
|
|
- if( progress % 1000 == 0 )
|
|
|
|
|
|
+ if( displayProgress && progress % 1000 == 0 )
|
|
Sys.print((Std.int((progress / blocks.length) * 1000.0) / 10) + "% \r");
|
|
Sys.print((Std.int((progress / blocks.length) * 1000.0) / 10) + "% \r");
|
|
if( b.page.kind == PDynamic ) {
|
|
if( b.page.kind == PDynamic ) {
|
|
goto(b);
|
|
goto(b);
|
|
@@ -555,7 +556,7 @@ class Memory {
|
|
|
|
|
|
for( b in blocks ) {
|
|
for( b in blocks ) {
|
|
progress++;
|
|
progress++;
|
|
- if( progress % 10000 == 0 )
|
|
|
|
|
|
+ if( displayProgress && progress % 10000 == 0 )
|
|
Sys.print((Std.int(progress * 1000.0 / blocks.length) / 10) + "% \r");
|
|
Sys.print((Std.int(progress * 1000.0 / blocks.length) / 10) + "% \r");
|
|
|
|
|
|
if( !b.page.memHasPtr() )
|
|
if( !b.page.memHasPtr() )
|
|
@@ -652,16 +653,22 @@ class Memory {
|
|
var lt = resolveType(tstr);
|
|
var lt = resolveType(tstr);
|
|
if( lt == null ) return;
|
|
if( lt == null ) return;
|
|
|
|
|
|
|
|
+ inline function isVirtualField(t) { t >>>= 24; return t == 1 || t == 2; }
|
|
|
|
+
|
|
var ctx = new Stats(this);
|
|
var ctx = new Stats(this);
|
|
for( b in blocks )
|
|
for( b in blocks )
|
|
if( b.type != null && b.type.match(lt) ) {
|
|
if( b.type != null && b.type.match(lt) ) {
|
|
var tl = [];
|
|
var tl = [];
|
|
var owner = b.owner;
|
|
var owner = b.owner;
|
|
|
|
+ // skip first virtual field
|
|
|
|
+ if( lt.t != HDynObj && owner != null && owner.type != null && owner.type.t.match(HVirtual(_)) && isVirtualField(owner.makeTID(b,true)) )
|
|
|
|
+ owner = owner.owner;
|
|
|
|
+
|
|
if( owner != null ) {
|
|
if( owner != null ) {
|
|
tl.push(owner.makeTID(b,displayFields == Full));
|
|
tl.push(owner.makeTID(b,displayFields == Full));
|
|
var k : Int = up;
|
|
var k : Int = up;
|
|
while( owner.owner != null && k-- > 0 && owner.owner != all ) {
|
|
while( owner.owner != null && k-- > 0 && owner.owner != all ) {
|
|
- var tag = owner.makeTID(owner,displayFields != None);
|
|
|
|
|
|
+ var tag = owner.owner.makeTID(owner,displayFields != None);
|
|
owner = owner.owner;
|
|
owner = owner.owner;
|
|
// remove recursive sequence
|
|
// remove recursive sequence
|
|
for( i => tag2 in tl )
|
|
for( i => tag2 in tl )
|
|
@@ -678,6 +685,11 @@ class Memory {
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ // don't display virtual wrappers
|
|
|
|
+ if( displayFields != None && owner.type != null && isVirtualField(tag) && owner.type.t.match(HVirtual(_)) ) {
|
|
|
|
+ tag = -1;
|
|
|
|
+ k++;
|
|
|
|
+ }
|
|
if( tag != -1 )
|
|
if( tag != -1 )
|
|
tl.unshift(tag);
|
|
tl.unshift(tag);
|
|
}
|
|
}
|
|
@@ -815,6 +827,10 @@ class Memory {
|
|
m.loadBytecode(arg);
|
|
m.loadBytecode(arg);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
+ if( arg == "--args" ) {
|
|
|
|
+ m.displayProgress = false;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
memory = arg;
|
|
memory = arg;
|
|
m.loadMemory(arg);
|
|
m.loadMemory(arg);
|
|
}
|
|
}
|
|
@@ -830,7 +846,7 @@ class Memory {
|
|
var stdin = Sys.stdin();
|
|
var stdin = Sys.stdin();
|
|
while( true ) {
|
|
while( true ) {
|
|
Sys.print("> ");
|
|
Sys.print("> ");
|
|
- var args = parseArgs(stdin.readLine());
|
|
|
|
|
|
+ var args = parseArgs(args.length > 0 ? args.shift() : stdin.readLine());
|
|
var cmd = args.shift();
|
|
var cmd = args.shift();
|
|
switch( cmd ) {
|
|
switch( cmd ) {
|
|
case "exit", "quit", "q":
|
|
case "exit", "quit", "q":
|