//Scopes private ulong AddFieldScope(string name, string meta, bool executable) { _refCounter++; //_symbolTable.AddTable(_refCounter, GetCurrentReferenceId()); if (_current.Fields == null) { _current.Fields = new ScopeNode(name, _refCounter, meta, executable) { Host = _current }; _current = _current.Fields; Debug.PrintDbg(" => " + GetScopeString() + " exec? " + executable); return(_current.RefId); } _current = _current.Fields; while (_current.Next != null) { _current = _current.Next; } _current.Next = new ScopeNode(name, _refCounter, meta, executable) { Previous = _current, Host = _current.Host }; _current = _current.Next; Debug.PrintDbg(" => " + GetScopeString() + " exec? " + executable); return(_current.RefId); }
private void WalkthroughPrintRec(ScopeNode n, int tab) { _current = n; if (n == null) { return; } //print this object var pad = new string('\t', tab); Debug.PrintDbg($"{pad}{GetScopeString()}".PadLeft(tab)); Debug.PrintDbg(pad + n.Meta); if (_instructionBase.SelectFunction(n.RefId)) { var unit = _instructionBase.GetCurrentFunction(); unit.Rewind(); Debug.PrintDbg($"{pad}::{unit.GetArgumentList()}"); Debug.PrintDbg(DumpCurrentSymbols(tab)); var inst = unit.GetNextInstruction(); while (inst != null) { Debug.PrintDbg($"{pad}::{inst[0]} {inst[1]} {inst[2]}"); inst = unit.GetNextInstruction(); } } //print fields WalkthroughPrintRec(n.Fields, tab + 1); //Walk through neighbors WalkthroughPrintRec(n.Next, tab); LeaveScope(); }
public ProgramGraph() { _refCounter = 1; _current = null; _root = new ScopeNode("#ROOT#", ulong.MaxValue); _symbolTable = GlobalSymbolTable.GetInstance(); _methodTable = GlobalMethodTable.GetInstance(); _current = _root; ProgramInit = false; _instructionBase = new InstructionBase(); }
/// <summary> /// Stop tracking current scope and drop to previous /// </summary> /// <returns> /// True if there exists a scope below /// False if final scope is exited /// </returns> public bool LeaveScope() { if (_current?.Host == null) { return(false); } _instructionBase.Untrack(); _current = _current.Host; return(true); }
public bool ResolveSymbols() { if (_root.Fields == null) { return(true); } _current = _root.Fields; Rewind(); return(ResolveSymbolRec(_current)); }
/// <summary> /// Step forward in graph and return the refId to the current body /// </summary> /// <returns></returns> public ulong StepNext() { if (_viewAsm == null) { return(0); } if (_viewAsm.Fields != null) { _viewAsm = _viewAsm.Fields; } else if (_viewAsm.Next != null) { _viewAsm = _viewAsm.Next; } else if (_viewAsm.Host != null) { _viewAsm = _viewAsm.Host.Next; } return(_viewAsm.RefId); }
public ulong AddAssembly(string name) { ProgramInit = true; var preRef = _refCounter; _refCounter++; _symbolTable.AddTable(preRef, GetCurrentReferenceId()); //reset head to assembly level _current = _root; //create first assembly if needed if (_current.Fields == null) { _current.Fields = new ScopeNode(name, _refCounter); _current = _current.Fields; _current.Host = _root; //Debug.PrintDbg($"> Asm + {GetScopeString()}"); //_symbolTable.AddTable(_refCounter, preRef); return(_current.RefId); } while (_current.Next != null) { _current = _current.Next; } _current.Next = new ScopeNode(name, _refCounter); var tmp = _current; _current = _current.Next; _current.Previous = tmp; _current.Host = _root; //Debug.PrintDbg($"> Asm + {GetScopeString()}"); //_symbolTable.AddTable(_refCounter, preRef); return(_current.RefId); }
public bool NextAssembly() { if (_viewAsm == null) { _viewAsm = _root; } if (_viewAsm == _root) { _viewAsm = _viewAsm.Fields; } else { _viewAsm = _viewAsm.Next; } if (_viewAsm == null) { return(false); } return(true); }
/// <summary> /// Recursively solve the reference id of a symbol relative to a base point /// </summary> /// <returns></returns> private long ResolveSymbol(ScopeNode n, string sym) { return(-1); }
public void Rewind() { _current = _root; _viewAsm = _root; }
private bool ResolveSymbolRec(ScopeNode n) { return(true); }