Exemple #1
0
 internal override void CompileBy(FunctionCompiler compiler, bool isLastOperator)
 {
     if (LeftOperand.Type == ExpressionType.Ident)
     {
         var leftOperand = (Identifier)LeftOperand;
         RightOperand.CompileBy(compiler, false);
         if (!isLastOperator)
         {
             compiler.Emitter.Emit(OpCode.Dup);
         }
         compiler.Emitter.Emit(OpCode.StLocal, leftOperand.Value);
     }
     else
     {
         Contract.Assert(LeftOperand.Type == ExpressionType.Member);
         var leftOperand = (MemberOperator)LeftOperand;
         leftOperand.BaseValue.CompileBy(compiler, false);
         leftOperand.CompilePropertyBy(compiler);
         RightOperand.CompileBy(compiler, false);
         compiler.Emitter.Emit(isLastOperator ? OpCode.StMember : OpCode.StMemberDup);
     }
 }
Exemple #2
0
 internal void CompileEqualityBy(FunctionCompiler compiler, OpCode strictOp, OpCode convOp, bool isLastOperator)
 {
     if (!LeftOperand.CanBeObject && !RightOperand.CanBeObject)
     {
         LeftOperand.CompileBy(compiler, false);
         RightOperand.CompileBy(compiler, false);
         compiler.Emitter.Emit(strictOp);
     }
     else
     {
         var endLabel   = compiler.Emitter.DefineLabel();
         var falseLabel = compiler.Emitter.DefineLabel();
         LeftOperand.CompileBy(compiler, false);
         RightOperand.CompileBy(compiler, false);
         compiler.Emitter.Emit(OpCode.Dup2);
         compiler.Emitter.Emit(strictOp);
         compiler.Emitter.Emit(OpCode.GotoIfFalse, falseLabel);
         compiler.Emitter.Emit(OpCode.Pop2);
         compiler.Emitter.Emit(OpCode.LdBoolean, true);
         compiler.Emitter.Emit(OpCode.Goto, endLabel);
         compiler.Emitter.MarkLabel(falseLabel);
         // В вершине стека лежит правый операнд
         if (RightOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
         compiler.Emitter.Emit(OpCode.Swap);
         if (LeftOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
         compiler.Emitter.Emit(convOp);
         compiler.Emitter.MarkLabel(endLabel);
     }
     if (isLastOperator)
     {
         compiler.Emitter.Emit(OpCode.Pop);
     }
 }
Exemple #3
0
 internal void CompileBy(
     FunctionCompiler compiler,
     OpCode op,
     bool isLeftAssociative,
     bool needCastToPrimitive,
     bool isLastOperator)
 {
     if (isLeftAssociative)
     {
         LeftOperand.CompileBy(compiler, false);
         if (needCastToPrimitive && LeftOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
         RightOperand.CompileBy(compiler, false);
         if (needCastToPrimitive && RightOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
     }
     else
     {
         RightOperand.CompileBy(compiler, false);
         if (needCastToPrimitive && RightOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
         LeftOperand.CompileBy(compiler, false);
         if (needCastToPrimitive && LeftOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
     }
     compiler.Emitter.Emit(op);
     if (isLastOperator)
     {
         compiler.Emitter.Emit(OpCode.Pop);
     }
 }
 protected void CompileAssignBy(FunctionCompiler compiler, OpCode op, bool isLastOperator)
 {
     if (LeftOperand.Type == ExpressionType.Ident)
     {
         var leftOperand = (Identifier)LeftOperand;
         compiler.Emitter.Emit(OpCode.LdLocal, leftOperand.Value);
         compiler.Emitter.Emit(OpCode.CastToPrimitive);
         RightOperand.CompileBy(compiler, false);
         if (RightOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
         compiler.Emitter.Emit(op);
         if (!isLastOperator)
         {
             compiler.Emitter.Emit(OpCode.Dup);
         }
         compiler.Emitter.Emit(OpCode.StLocal, leftOperand.Value);
     }
     else
     {
         Contract.Assert(LeftOperand.Type == ExpressionType.Member);
         var leftOperand = (MemberOperator)LeftOperand;
         leftOperand.BaseValue.CompileBy(compiler, false);
         leftOperand.CompilePropertyBy(compiler);
         compiler.Emitter.Emit(OpCode.MakeRef);
         compiler.Emitter.Emit(OpCode.Dup);
         compiler.Emitter.Emit(OpCode.LdMemberByRef);
         compiler.Emitter.Emit(OpCode.CastToPrimitive);
         RightOperand.CompileBy(compiler, false);
         if (RightOperand.CanBeObject)
         {
             compiler.Emitter.Emit(OpCode.CastToPrimitive);
         }
         compiler.Emitter.Emit(op);
         compiler.Emitter.Emit(isLastOperator ? OpCode.StMemberByRef : OpCode.StMemberByRefDup);
     }
 }