public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var codeExpression = (CodeObjectReference)code;

      if (codeExpression.Modifiers.Count == 0)
      {
        var op = machine.CreateOperation<GetValueOperation>();
        op.Id = codeExpression.Id;        
      }
      else
      {
        foreach (var modifier in codeExpression.Modifiers)
        {
          var functionCall = modifier as CodeObjectFunctionCall;
          if (functionCall == null) continue;

          CodeDomCompiler.Compile(modifier, machine);

          var callOp = machine.CreateOperation<ObjectMemberOperation>();
          callOp.MemberName = codeExpression.Id;
        }
      }

      if (codeExpression.Next != null)
      {
        machine.CreateOperation<PushOperation>();
        CodeDomCompiler.Compile(codeExpression.Next, machine);
      }

      return machine;
   }
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            // CCCC(indexA)SSSSSS(indexC)
            var whileStatement = (CodeWhileStatement)code;

            int cCount = machine.CommandCount;

            CodeDomCompiler.Compile(whileStatement.Condition, machine);
            //Put AX (result of condition evaluation) to BBX
            var exch = machine.CreateOperation <RegisterOperation>();

            exch.Source      = MachineRegisters.AX;
            exch.Destination = MachineRegisters.BBX;
            //Jmp To Else
            var jmpToNext = machine.CreateOperation <JmpIfOperation>();
            int eCount    = machine.CommandCount;

            //Compile Statement
            CodeDomCompiler.Compile(whileStatement.Statement, machine);

            var jmpToCondition = machine.CreateOperation <JmpIfOperation>();

            jmpToCondition.Offset = cCount - machine.CommandCount + 1;

            jmpToNext.Offset = machine.CommandCount - eCount + 1;

            return(machine);
        }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      // CCCC(indexA)SSSSSS(indexC)
      var whileStatement = (CodeWhileStatement)code;

      int cCount = machine.CommandCount;

      CodeDomCompiler.Compile(whileStatement.Condition, machine);
      //Put AX (result of condition evaluation) to BBX
      var exch = machine.CreateOperation<RegisterOperation>();
      exch.Source = MachineRegisters.AX;
      exch.Destination = MachineRegisters.BBX;
      //Jmp To Else
      var jmpToNext = machine.CreateOperation<JmpIfOperation>();
      int eCount = machine.CommandCount;    
      
      //Compile Statement
      CodeDomCompiler.Compile(whileStatement.Statement, machine);

      var jmpToCondition = machine.CreateOperation<JmpIfOperation>();
      jmpToCondition.Offset = cCount - machine.CommandCount + 1;

      jmpToNext.Offset = machine.CommandCount - eCount + 1;
      
      return machine;
    }
Exemple #4
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            // CCCC(indexA)SSSSSS(indexB)EEEEEE(indexC)

            var ifStatement = (CodeIfStatement)code;

            CodeDomCompiler.Compile(ifStatement.Condition, machine);
            //Put AX (result of condition evaluation) to BBX
            var exch = machine.CreateOperation <RegisterOperation>();

            exch.Source      = MachineRegisters.AX;
            exch.Destination = MachineRegisters.BBX;
            //Jmp To Else
            var jmpToElse = machine.CreateOperation <JmpIfOperation>();
            int eCount    = machine.CommandCount;

            //Compile Statement
            CodeDomCompiler.Compile(ifStatement.Statement, machine);
            jmpToElse.Offset = machine.CommandCount - eCount + 1;

            //Compile Else if Any
            if (ifStatement.ElseStatement != null)
            {
                //Jmp To Next
                var jmpToNext = machine.CreateOperation <JmpOperation>();
                //Modify jmpToElse
                jmpToElse.Offset++;

                int sCount = machine.CommandCount;
                CodeDomCompiler.Compile(ifStatement.ElseStatement, machine);
                jmpToNext.Offset = machine.CommandCount - sCount + 1;
            }

            return(machine);
        }
Exemple #5
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var codeExpression = (CodeObjectReference)code;

            if (codeExpression.Modifiers.Count == 0)
            {
                var op = machine.CreateOperation <GetValueOperation>();
                op.Id = codeExpression.Id;
            }
            else
            {
                foreach (var modifier in codeExpression.Modifiers)
                {
                    var functionCall = modifier as CodeObjectFunctionCall;
                    if (functionCall == null)
                    {
                        continue;
                    }

                    CodeDomCompiler.Compile(modifier, machine);

                    var callOp = machine.CreateOperation <ObjectMemberOperation>();
                    callOp.MemberName = codeExpression.Id;
                }
            }

            if (codeExpression.Next != null)
            {
                machine.CreateOperation <PushOperation>();
                CodeDomCompiler.Compile(codeExpression.Next, machine);
            }

            return(machine);
        }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      // CCCC(indexA)SSSSSS(indexB)EEEEEE(indexC)
      
      var ifStatement = (CodeIfStatement)code;

      CodeDomCompiler.Compile(ifStatement.Condition, machine);
      //Put AX (result of condition evaluation) to BBX
      var exch = machine.CreateOperation<RegisterOperation>();
      exch.Source = MachineRegisters.AX;
      exch.Destination = MachineRegisters.BBX;
      //Jmp To Else
      var jmpToElse = machine.CreateOperation<JmpIfOperation>();
      int eCount = machine.CommandCount;    
      
      //Compile Statement
      CodeDomCompiler.Compile(ifStatement.Statement, machine);
      jmpToElse.Offset = machine.CommandCount - eCount + 1;     
      
      //Compile Else if Any
      if (ifStatement.ElseStatement != null)
      {
        //Jmp To Next
        var jmpToNext = machine.CreateOperation<JmpOperation>();
        //Modify jmpToElse
        jmpToElse.Offset++;

        int sCount = machine.CommandCount;
        CodeDomCompiler.Compile(ifStatement.ElseStatement, machine);
        jmpToNext.Offset = machine.CommandCount - sCount + 1;
      }

      return machine;
    }
Exemple #7
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var codeExpression = (CodeBinaryOperator)code;

            CodeDomCompiler.Compile(codeExpression.Right, machine);
            var op = machine.CreateOperation <PushOperation>();

            op.SourceObject = codeExpression.Right;

            CodeDomCompiler.Compile(codeExpression.Left, machine);
            op = machine.CreateOperation <PushOperation>();
            op.SourceObject = codeExpression.Left;

            Operation sop;

            switch (codeExpression.Type)
            {
            case OperatorType.Plus:
                sop = machine.CreateOperation <AddOperation>();
                break;

            case OperatorType.Minus:
                sop = machine.CreateOperation <SubOperation>();
                break;

            case OperatorType.Mul:
                sop = machine.CreateOperation <MulOperation>();
                break;

            case OperatorType.Mod:
                sop = machine.CreateOperation <ModOperation>();
                break;

            case OperatorType.Div:
                sop = machine.CreateOperation <DivOperation>();
                break;

            default:
                var gop = machine.CreateOperation <GenericOperation>();
                gop.Symbol = Mapping[codeExpression.Type];
                sop        = gop;
                break;
            }
            sop.SourceObject = codeExpression;

            var pop = machine.CreateOperation <PopOperation>();

            pop.SourceObject = codeExpression;

            return(machine);
        }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var op = machine.CreateOperation<ValueOperation>();
      op.Value = ((CodeValueReference)code).Value;
      op.SourceObject = code;

      return machine;
   }
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var op = machine.CreateOperation <ValueOperation>();

            op.Value        = ((CodeValueReference)code).Value;
            op.SourceObject = code;

            return(machine);
        }
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var ret = (CodeReturnStatement)code;

            CodeDomCompiler.Compile(ret.Expression, machine);
            machine.CreateOperation <RetOperation>();

            return(machine);
        }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var ret = (CodeReturnStatement)code;

      CodeDomCompiler.Compile(ret.Expression, machine);
      machine.CreateOperation<RetOperation>();

      return machine;
    }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var codeExpression = (CodeVariableReference)code;

      var op = machine.CreateOperation<GetValueOperation>();
      op.Id = codeExpression.Id;
      op.SourceObject = codeExpression;

      return machine;
    }
Exemple #13
0
        public void MachineExection()
        {
            IScriptContext context = new ScriptContext();

            //Example 0: Machine

            ExecutableMachine machine = ExecutableMachine.Create();
            SetValueOperation sv      = machine.CreateOperation <SetValueOperation>();

            sv.Id = "a";

            machine.AX = "Hello World";
            machine.CreateOperation <RetOperation>();
            machine.Execute(context);

            object rez = context.GetItem("a", true);

            Assert.Equal("Hello World", rez);
        }
Exemple #14
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var codeExpression = (CodeVariableReference)code;

            var op = machine.CreateOperation <GetValueOperation>();

            op.Id           = codeExpression.Id;
            op.SourceObject = codeExpression;

            return(machine);
        }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var codeExpression = (CodeAssignExpression)code;
      
      CodeDomCompiler.Compile(codeExpression.RightExpression, machine);

      var op = machine.CreateOperation<SetValueOperation>();
      op.Id = codeExpression.Id;
      op.SourceObject = code;

      return machine;
    }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var call = (CodeObjectFunctionCall)code;

      // AX = function name
      // BX = parameter count

      // stack is full of parameters

      foreach (var codeParameter in call.Parameters)
      {
        CodeDomCompiler.Compile(codeParameter, machine);
        var op = machine.CreateOperation<PushOperation>();
      }
      
      var countOp = machine.CreateOperation<RegisterOperation>();
      countOp.Destination = MachineRegisters.BX;
      countOp.Value = call.Parameters.Count;

      return machine;
   }
Exemple #17
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var codeExpression = (CodeAssignExpression)code;

            CodeDomCompiler.Compile(codeExpression.RightExpression, machine);

            var op = machine.CreateOperation <SetValueOperation>();

            op.Id           = codeExpression.Id;
            op.SourceObject = code;

            return(machine);
        }
Exemple #18
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var call = (CodeObjectFunctionCall)code;

            // AX = function name
            // BX = parameter count

            // stack is full of parameters

            foreach (var codeParameter in call.Parameters)
            {
                CodeDomCompiler.Compile(codeParameter, machine);
                var op = machine.CreateOperation <PushOperation>();
            }

            var countOp = machine.CreateOperation <RegisterOperation>();

            countOp.Destination = MachineRegisters.BX;
            countOp.Value       = call.Parameters.Count;

            return(machine);
        }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var codeExpression = (CodeBinaryOperator)code;

      CodeDomCompiler.Compile(codeExpression.Right, machine);
      var op = machine.CreateOperation<PushOperation>();
      op.SourceObject = codeExpression.Right;

      CodeDomCompiler.Compile(codeExpression.Left, machine);
      op = machine.CreateOperation<PushOperation>();
      op.SourceObject = codeExpression.Left;

      Operation sop;
      switch (codeExpression.Type)
      {
        case OperatorType.Plus:
          sop = machine.CreateOperation<AddOperation>();
          break;
        case OperatorType.Minus:
          sop = machine.CreateOperation<SubOperation>();
          break;
        case OperatorType.Mul:
          sop = machine.CreateOperation<MulOperation>();
          break;
        case OperatorType.Mod:
          sop = machine.CreateOperation<ModOperation>();
          break;
        case OperatorType.Div:
          sop = machine.CreateOperation<DivOperation>();
          break;
        default:
          var gop = machine.CreateOperation<GenericOperation>();
          gop.Symbol = Mapping[codeExpression.Type];
          sop = gop;
          break;
      }
      sop.SourceObject = codeExpression;

      var pop = machine.CreateOperation<PopOperation>();
      pop.SourceObject = codeExpression;

      return machine;
    }
    public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
    {
      var program = (CodeProgram)code;

      foreach (var statement in program.Statements)
        CodeDomCompiler.Compile(statement, machine);
      
      machine.CreateOperation<RetOperation>();

      //TODO: Functions
      //foreach (CodeObject function in program.Functions)
      //  Compile(function, machine);

      return machine;
    }
Exemple #21
0
        public ExecutableMachine Compile(CodeObject code, ExecutableMachine machine)
        {
            var program = (CodeProgram)code;

            foreach (var statement in program.Statements)
            {
                CodeDomCompiler.Compile(statement, machine);
            }

            machine.CreateOperation <RetOperation>();

            //TODO: Functions
            //foreach (CodeObject function in program.Functions)
            //  Compile(function, machine);

            return(machine);
        }
Exemple #22
0
        public void Benchmark()
        {
            IScriptContext context = new ScriptContext();

            //Example 0: Machine

            ExecutableMachine machine = ExecutableMachine.Create();

            int iterations = 2;// 10000000;

            //loops = 10000000
            ValueOperation op0 = machine.CreateOperation <ValueOperation>();

            op0.Value = iterations;
            SetValueOperation op1 = machine.CreateOperation <SetValueOperation>();

            op1.Id = "loops";

            // counter = 0
            ValueOperation op2 = machine.CreateOperation <ValueOperation>();

            op2.Value = 0;
            SetValueOperation op3 = machine.CreateOperation <SetValueOperation>();

            op3.Id = "counter";

            //while (loops > 0)
            RegisterOperation op4 = machine.CreateOperation <RegisterOperation>();

            op4.Destination = MachineRegisters.BX;
            op4.Value       = 0;
            GetValueOperation op5 = machine.CreateOperation <GetValueOperation>();

            op5.Id = "loops";
            CmpOperation   op6 = machine.CreateOperation <CmpOperation>();
            JmpIfOperation op7 = machine.CreateOperation <JmpIfOperation>();

            op7.Offset = 8;
            //loops = loops -1;
            GetValueOperation op8 = machine.CreateOperation <GetValueOperation>();

            op8.Id = "loops";
            DecOperation      op9  = machine.CreateOperation <DecOperation>();
            SetValueOperation op10 = machine.CreateOperation <SetValueOperation>();

            op10.Id = "loops";

            //counter = counter + 1;
            GetValueOperation op11 = machine.CreateOperation <GetValueOperation>();

            op11.Id = "counter";
            IncOperation      op12 = machine.CreateOperation <IncOperation>();
            SetValueOperation op13 = machine.CreateOperation <SetValueOperation>();

            op13.Id = "counter";

            JmpOperation op14 = machine.CreateOperation <JmpOperation>();

            op14.Offset = -10;

            machine.CreateOperation <RetOperation>();
            machine.Execute(context);

            object rez = context.GetItem("counter", true);

            Assert.Equal(iterations, rez);
        }