private Item CompileAssignOp(ByteCodeGenerator generator) { var lType = new TranslateNode { Child = node.Left }.GetType(generator, false, true); var rType = node.Right.GetType(generator, false, true); var type = lType.FindCommonType(rType); Item lhs; if (lType.Name == BuiltinTypes.String.Name) { var sb = BuiltinTypes.StringBuilder; AdditiveCompiler.MakeStringBuffer(generator, sb); lhs = new ExpressionCompiler(node.Left).Compile(generator); if (lhs.Width() > 0) { generator.Emit(OpCodeValue.dup_x1 + (byte)(3 * (lhs.Width() - 1))); } lhs.Load(); AdditiveCompiler.AppendStrings(generator, sb, node.Left); AdditiveCompiler.AppendStrings(generator, sb, node.Right.Child); AdditiveCompiler.BufferToString(generator, sb); } else { lhs = new ExpressionCompiler(node.Left).Compile(generator); lhs.Duplicate(); lhs.Coerce(type).Load(); new TranslationCompiler(node.Right, type).Compile(generator).Load(); if (node is AssignmentNode.AddAssignNode) { AdditiveCompiler.CompileAddition(generator, type); } else if (node is AssignmentNode.MinusAssignNode) { AdditiveCompiler.CompileSubtraction(generator, type); } else { throw new NotImplementedException(); } } return new AssignItem(generator, lhs); }
public ConditionCompiler(TranslateNode node) { this.node = node; }
public TranslationCompiler(TranslateNode node, Type type) { expression = node.Child; this.type = type; }
public TranslationCompiler(TranslateNode node) { expression = node.Child; }