OutNode.java revision 9330:8b1f1c2a400f
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
26package build.tools.jdwpgen;
27
28import java.util.*;
29import java.io.*;
30
31class OutNode extends AbstractTypeListNode {
32
33    String cmdName;
34
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
40    void constrain(Context ctx) {
41        super.constrain(ctx.commandWritingSubcontext());
42        CommandNode cmd = (CommandNode)parent;
43        cmdName = cmd.name;
44    }
45
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
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
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
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