Пример #1
0
        public virtual void Insert(int addr, Bytecode opcode, string s)
        {
            //System.out.println("before insert of "+opcode+"("+s+"):"+ Arrays.toString(impl.instrs));
            EnsureCapacity(1 + Instruction.OperandSizeInBytes);
            int instrSize = 1 + Instruction.OperandSizeInBytes;

            // make room for opcode, opnd
            Array.Copy(impl.instrs, addr, impl.instrs, addr + instrSize, ip - addr);
            int save = ip;

            ip = addr;
            Emit1(null, opcode, s);
            ip = save + instrSize;
            //System.out.println("after  insert of "+opcode+"("+s+"):"+ Arrays.toString(impl.instrs));
            // adjust addresses for BR and BRF
            int a = addr + instrSize;

            while (a < ip)
            {
                Bytecode    op = (Bytecode)impl.instrs[a];
                Instruction I  = Instruction.instructions[(int)op];
                if (op == Bytecode.INSTR_BR || op == Bytecode.INSTR_BRF)
                {
                    int opnd = BytecodeDisassembler.GetShort(impl.instrs, a + 1);
                    WriteShort(impl.instrs, a + 1, (short)(opnd + instrSize));
                }
                a += I.nopnds * Instruction.OperandSizeInBytes + 1;
            }
            //System.out.println("after  insert of "+opcode+"("+s+"):"+ Arrays.toString(impl.instrs));
        }
Пример #2
0
        public virtual string Disassemble()
        {
            BytecodeDisassembler dis = new BytecodeDisassembler(this);

            using (StringWriter sw = new StringWriter())
            {
                sw.WriteLine(dis.Disassemble());
                sw.WriteLine("Strings:");
                sw.WriteLine(dis.GetStrings());
                sw.WriteLine("Bytecode to template map:");
                sw.WriteLine(dis.GetSourceMap());
                return(sw.ToString());
            }
        }
Пример #3
0
        public virtual string GetInstructions()
        {
            BytecodeDisassembler dis = new BytecodeDisassembler(this);

            return(dis.GetInstructions());
        }
Пример #4
0
        protected virtual void Trace(TemplateFrame frame, int ip)
        {
            Template self = frame.Template;
            StringBuilder tr = new StringBuilder();
            BytecodeDisassembler dis = new BytecodeDisassembler(self.impl);
            StringBuilder buf = new StringBuilder();
            dis.DisassembleInstruction(buf, ip);
            string name = self.impl.Name + ":";
            if (object.ReferenceEquals(self.impl.Name, Template.UnknownName))
                name = string.Empty;

            tr.Append(string.Format("{0,-40}", name + buf));
            tr.Append("\tstack=[");
            for (int i = 0; i <= sp; i++)
            {
                object o = operands[i];
                PrintForTrace(tr, frame, o);
            }

            tr.Append(" ], calls=");
            tr.Append(frame.GetEnclosingInstanceStackString());
            tr.Append(", sp=" + sp + ", nw=" + nwline);
            string s = tr.ToString();

            if (_debug)
                executeTrace.Add(s);

            if (trace)
                Console.WriteLine(s);
        }
Пример #5
0
 public virtual string GetInstructions()
 {
     BytecodeDisassembler dis = new BytecodeDisassembler(this);
     return dis.GetInstructions();
 }
Пример #6
0
 public virtual string Disassemble()
 {
     BytecodeDisassembler dis = new BytecodeDisassembler(this);
     using (StringWriter sw = new StringWriter())
     {
         sw.WriteLine(dis.Disassemble());
         sw.WriteLine("Strings:");
         sw.WriteLine(dis.GetStrings());
         sw.WriteLine("Bytecode to template map:");
         sw.WriteLine(dis.GetSourceMap());
         return sw.ToString();
     }
 }