コード例 #1
0
ファイル: OrExpression.cs プロジェクト: bartwe/plukc
        public override void Generate(Generator generator)
        {
            base.Generate(generator);
            left.Generate(generator);
            generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);

            TypeReference leftType = left.TypeReference;

            if (call == null)
            {
                JumpToken skip = generator.Assembler.CreateJumpToken();
                generator.Assembler.JumpIfTrue(skip);
                right.Generate(generator);
                leftType.GenerateConversion(this, generator, right.TypeReference);
                generator.Assembler.SetDestination(skip);
            }
            else
            {
                call.Generate(generator);
            }
        }
コード例 #2
0
        public override void Generate(Generator generator)
        {
            base.Generate(generator);

            string signature;

            signature  = setter ? "set:" : "get:";
            signature += parent.TypeReference.TypeName.Data;
            foreach (Expression param in parameters)
            {
                signature += ":" + param.TypeReference.TypeName.Data;
            }
            if ((signature == "get:pluk.base.Array<pluk.base.Bool>:pluk.base.Int"))
            {
                parent.Generate(generator);
                generator.Assembler.PushValue();
                parameters[0].Generate(generator);
                generator.Assembler.ArrayFetchByte();
                generator.Assembler.SetTypePart(boolType.RuntimeStruct);
            }
            else if ((signature == "set:pluk.base.Array<pluk.base.Bool>:pluk.base.Int:pluk.base.Bool"))
            {
                parent.Generate(generator);
                generator.Assembler.PushValue();
                parameters[0].Generate(generator);
                generator.Assembler.PushValue();
                parameters[1].Generate(generator);
                generator.Assembler.ArrayStoreByte();
            }
            else if ((signature == "get:pluk.base.Array<pluk.base.Byte>:pluk.base.Int"))
            {
                parent.Generate(generator);
                generator.Assembler.PushValue();
                parameters[0].Generate(generator);
                generator.Assembler.ArrayFetchByte();
                generator.Assembler.SetTypePart(byteType.RuntimeStruct);
            }
            else if ((signature == "set:pluk.base.Array<pluk.base.Byte>:pluk.base.Int:pluk.base.Byte"))
            {
                parent.Generate(generator);
                generator.Assembler.PushValue();
                parameters[0].Generate(generator);
                generator.Assembler.PushValue();
                parameters[1].Generate(generator);
                generator.Assembler.ArrayStoreByte();
            }
            else if ((signature == "get:pluk.base.Array<pluk.base.Int>:pluk.base.Int"))
            {
                parent.Generate(generator);
                generator.Assembler.PushValue();
                parameters[0].Generate(generator);
                generator.Assembler.ArrayFetchInt();
                generator.Assembler.SetTypePart(intType.RuntimeStruct);
            }
            else if ((signature == "set:pluk.base.Array<pluk.base.Int>:pluk.base.Int:pluk.base.Int"))
            {
                parent.Generate(generator);
                generator.Assembler.PushValue();
                parameters[0].Generate(generator);
                generator.Assembler.PushValue();
                parameters[1].Generate(generator);
                generator.Assembler.ArrayStoreInt();
            }
            else
            {
                call.Generate(generator);
            }
        }
コード例 #3
0
        public override void Generate(Generator generator)
        {
            base.Generate(generator);
            parent.Generate(generator);

            if (call != null)
            {
                call.Generate(generator);
            }
            else
            {
                generator.Symbols.Source(generator.Assembler.Region.CurrentLocation, this);
                TypeReference parentType = parent.TypeReference;
//                if (parentType.IsNullable)
//                {
//                    generator.Assembler.CrashIfNull();
//                    parentType = ((NullableTypeReference)parentType).Parent;
//                }

                generator.Assembler.PushValue();

                argument.Generate(generator);

                string signature = parentType.TypeName.Data + ":" + name + ":" + argument.TypeReference.TypeName.Data;

                if ((signature == "pluk.base.Int:OperatorEquals:pluk.base.Int") ||
                    (signature == "pluk.base.Bool:OperatorEquals:pluk.base.Bool") ||
                    (signature == "pluk.base.Byte:OperatorEquals:pluk.base.Byte")
                    )
                {
                    generator.Assembler.IntegerEquals();
                    generator.Assembler.SetTypePart(boolType.RuntimeStruct);
                }
                else if ((signature == "pluk.base.Int:OperatorNotEquals:pluk.base.Int") ||
                         (signature == "pluk.base.Bool:OperatorNotEquals:pluk.base.Bool") ||
                         (signature == "pluk.base.Byte:OperatorNotEquals:pluk.base.Byte")
                         )
                {
                    generator.Assembler.IntegerNotEquals();
                    generator.Assembler.SetTypePart(boolType.RuntimeStruct);
                }
                else if ((signature == "pluk.base.Int:OperatorGreaterThan:pluk.base.Int") ||
                         (signature == "pluk.base.Byte:OperatorGreaterThan:pluk.base.Byte")
                         )
                {
                    generator.Assembler.IntegerGreaterThan();
                    generator.Assembler.SetTypePart(boolType.RuntimeStruct);
                }
                else if ((signature == "pluk.base.Int:OperatorLessThan:pluk.base.Int") ||
                         (signature == "pluk.base.Byte:OperatorLessThan:pluk.base.Byte")
                         )
                {
                    generator.Assembler.IntegerLessThan();
                    generator.Assembler.SetTypePart(boolType.RuntimeStruct);
                }
                else if ((signature == "pluk.base.Int:OperatorGreaterEquals:pluk.base.Int") ||
                         (signature == "pluk.base.Byte:OperatorGreaterEquals:pluk.base.Byte")
                         )
                {
                    generator.Assembler.IntegerGreaterEquals();
                    generator.Assembler.SetTypePart(boolType.RuntimeStruct);
                }
                else if ((signature == "pluk.base.Int:OperatorLessEquals:pluk.base.Int") ||
                         (signature == "pluk.base.Byte:OperatorLessEquals:pluk.base.Byte")
                         )
                {
                    generator.Assembler.IntegerLessEquals();
                    generator.Assembler.SetTypePart(boolType.RuntimeStruct);
                }
                else if (signature == "pluk.base.Int:OperatorAdd:pluk.base.Int")
                {
                    generator.Assembler.IntegerAdd();
                    generator.CheckOverflow(this);
                }
                else if (signature == "pluk.base.Int:OperatorSubtract:pluk.base.Int")
                {
                    generator.Assembler.IntegerSubtract();
                    generator.CheckOverflow(this);
                }
                else if (signature == "pluk.base.Int:OperatorLeft:pluk.base.Int")
                {
                    generator.Assembler.IntegerLeft();
                }
                else if (signature == "pluk.base.Int:OperatorRight:pluk.base.Int")
                {
                    generator.Assembler.IntegerRight();
                }
                else if (signature == "pluk.base.Int:OperatorMultiply:pluk.base.Int")
                {
                    generator.Assembler.IntegerMultiply();
                    generator.CheckOverflow(this);
                }
                else if (signature == "pluk.base.Int:OperatorDivide:pluk.base.Int")
                {
                    generator.Assembler.IntegerDivide();
                }
                else if (signature == "pluk.base.Int:OperatorModulo:pluk.base.Int")
                {
                    generator.Assembler.IntegerModulo();
                }
                else
                {
                    Require.NotCalled();
                }
            }
        }