Beispiel #1
0
        //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);
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
 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();
 }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        public bool ResolveSymbols()
        {
            if (_root.Fields == null)
            {
                return(true);
            }

            _current = _root.Fields;

            Rewind();

            return(ResolveSymbolRec(_current));
        }
Beispiel #6
0
        /// <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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 /// <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);
 }
Beispiel #10
0
 public void Rewind()
 {
     _current = _root;
     _viewAsm = _root;
 }
Beispiel #11
0
 private bool ResolveSymbolRec(ScopeNode n)
 {
     return(true);
 }