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); } }
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); } }
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(); } } }