1 /* 2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package build.tools.jdwpgen; 27 28 import java.util.*; 29 import java.io.*; 30 31 class OutNode extends AbstractTypeListNode { 32 33 String cmdName; 34 set(String kind, List<Node> components, int lineno)35 void set(String kind, List<Node> components, int lineno) { 36 super.set(kind, components, lineno); 37 components.add(0, new NameNode("Out")); 38 } 39 constrain(Context ctx)40 void constrain(Context ctx) { 41 super.constrain(ctx.commandWritingSubcontext()); 42 CommandNode cmd = (CommandNode)parent; 43 cmdName = cmd.name; 44 } 45 genProcessMethod(PrintWriter writer, int depth)46 void genProcessMethod(PrintWriter writer, int depth) { 47 writer.println(); 48 indent(writer, depth); 49 writer.print( 50 "static " + cmdName + " process(VirtualMachineImpl vm"); 51 for (Node node : components) { 52 TypeNode tn = (TypeNode)node; 53 writer.println(", "); 54 indent(writer, depth+5); 55 writer.print(tn.javaParam()); 56 } 57 writer.println(")"); 58 indent(writer, depth+6); 59 writer.println("throws JDWPException {"); 60 indent(writer, depth+1); 61 writer.print("PacketStream ps = enqueueCommand(vm"); 62 for (Node node : components) { 63 TypeNode tn = (TypeNode)node; 64 writer.print(", "); 65 writer.print(tn.name()); 66 } 67 writer.println(");"); 68 indent(writer, depth+1); 69 writer.println("return waitForReply(vm, ps);"); 70 indent(writer, depth); 71 writer.println("}"); 72 } 73 genEnqueueMethod(PrintWriter writer, int depth)74 void genEnqueueMethod(PrintWriter writer, int depth) { 75 writer.println(); 76 indent(writer, depth); 77 writer.print( 78 "static PacketStream enqueueCommand(VirtualMachineImpl vm"); 79 for (Node node : components) { 80 TypeNode tn = (TypeNode)node; 81 writer.println(", "); 82 indent(writer, depth+5); 83 writer.print(tn.javaParam()); 84 } 85 writer.println(") {"); 86 indent(writer, depth+1); 87 writer.println( 88 "PacketStream ps = new PacketStream(vm, COMMAND_SET, COMMAND);"); 89 if (Main.genDebug) { 90 indent(writer, depth+1); 91 writer.println( 92 "if ((vm.traceFlags & VirtualMachineImpl.TRACE_SENDS) != 0) {"); 93 indent(writer, depth+2); 94 writer.print( 95 "vm.printTrace(\"Sending Command(id=\" + ps.pkt.id + \") "); 96 writer.print(parent.context.whereJava); 97 writer.println( 98 "\"+(ps.pkt.flags!=0?\", FLAGS=\" + ps.pkt.flags:\"\"));"); 99 indent(writer, depth+1); 100 writer.println("}"); 101 } 102 genJavaWrites(writer, depth+1); 103 indent(writer, depth+1); 104 writer.println("ps.send();"); 105 indent(writer, depth+1); 106 writer.println("return ps;"); 107 indent(writer, depth); 108 writer.println("}"); 109 } 110 genWaitMethod(PrintWriter writer, int depth)111 void genWaitMethod(PrintWriter writer, int depth) { 112 writer.println(); 113 indent(writer, depth); 114 writer.println( 115 "static " + cmdName + " waitForReply(VirtualMachineImpl vm, " + 116 "PacketStream ps)"); 117 indent(writer, depth+6); 118 writer.println("throws JDWPException {"); 119 indent(writer, depth+1); 120 writer.println("ps.waitForReply();"); 121 indent(writer, depth+1); 122 writer.println("return new " + cmdName + "(vm, ps);"); 123 indent(writer, depth); 124 writer.println("}"); 125 } 126 genJava(PrintWriter writer, int depth)127 void genJava(PrintWriter writer, int depth) { 128 genJavaPreDef(writer, depth); 129 super.genJava(writer, depth); 130 genProcessMethod(writer, depth); 131 genEnqueueMethod(writer, depth); 132 genWaitMethod(writer, depth); 133 } 134 } 135