public Item Compile(ByteCodeGenerator generator) { //TODO var item = new ExpressionCompiler(node.Child.Child).Compile(generator); if (node is UnaryNode.PlusNode) { return item.Load(); } if (node is UnaryNode.MinusNode) { throw new NotImplementedException(); } if (node is UnaryNode.PreIncNode) { return CompilePreOp(generator, item); } if (node is UnaryNode.PreDecNode) { return CompilePreOp(generator, item); } if (node is UnaryNode.PostIncNode) { return CompilePostOp(generator, item); } if (node is UnaryNode.PostDecNode) { return CompilePostOp(generator, item); } throw new NotImplementedException(); }
public static void AppendStrings(ByteCodeGenerator generator, DefinedType sb, ExpressionNode node) { if (node is AdditiveNode) { var addNode = node as AdditiveNode; generator.Kill(); var addType = new AdditiveCompiler(addNode).Compile(generator).Type; generator.Revive(); if (addType.Name == BuiltinTypes.String.Name) { AppendStrings(generator, sb, addNode.LeftChild.Child); AppendStrings(generator, sb, addNode.RightChild.Child); return; } } var item = new ExpressionCompiler(node).Compile(generator); var appendMethod = sb.FindMethod(generator, "append", new List<Type> { item.Type }); if (appendMethod == null) throw new InvalidOperationException(); item.Load(); new MemberItem(generator, appendMethod, false).Invoke(); }
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); }