Sun, 05 Dec 2010 22:22:54 -0800
7004713: regression: cannot find symbol: variable delegate failed compile _Stub
Summary: Also reviewed by ken.cavanaugh@oracle.com
Reviewed-by: asaha
duke@1 | 1 | /* |
ohair@158 | 2 | * Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. |
duke@1 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
duke@1 | 4 | * |
duke@1 | 5 | * This code is free software; you can redistribute it and/or modify it |
duke@1 | 6 | * under the terms of the GNU General Public License version 2 only, as |
ohair@158 | 7 | * published by the Free Software Foundation. Oracle designates this |
duke@1 | 8 | * particular file as subject to the "Classpath" exception as provided |
ohair@158 | 9 | * by Oracle in the LICENSE file that accompanied this code. |
duke@1 | 10 | * |
duke@1 | 11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
duke@1 | 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
duke@1 | 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
duke@1 | 14 | * version 2 for more details (a copy is included in the LICENSE file that |
duke@1 | 15 | * accompanied this code). |
duke@1 | 16 | * |
duke@1 | 17 | * You should have received a copy of the GNU General Public License version |
duke@1 | 18 | * 2 along with this work; if not, write to the Free Software Foundation, |
duke@1 | 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
duke@1 | 20 | * |
ohair@158 | 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ohair@158 | 22 | * or visit www.oracle.com if you need additional information or have any |
ohair@158 | 23 | * questions. |
duke@1 | 24 | */ |
duke@1 | 25 | /* |
duke@1 | 26 | * COMPONENT_NAME: idl.toJava |
duke@1 | 27 | * |
duke@1 | 28 | * ORIGINS: 27 |
duke@1 | 29 | * |
duke@1 | 30 | * Licensed Materials - Property of IBM |
duke@1 | 31 | * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999 |
duke@1 | 32 | * RMI-IIOP v1.0 |
duke@1 | 33 | * |
duke@1 | 34 | */ |
duke@1 | 35 | |
duke@1 | 36 | package com.sun.tools.corba.se.idl.toJavaPortable; |
duke@1 | 37 | |
duke@1 | 38 | // NOTES: |
duke@1 | 39 | // -After demarshalling an IOR, think about how to deal with the exceptions. |
duke@1 | 40 | // -catching Exception throws a string which should be in a properties file. |
duke@1 | 41 | // -30jul1997<daz> Modified to write comment immediately preceding method signature. |
duke@1 | 42 | // -07May1998<ktp> Modified to support RMI Portable Stub |
duke@1 | 43 | // -26Aug1998<klr> Modified to pass helper instance to read_Value. |
duke@1 | 44 | // -F46082.51<daz> Remove -stateful feature; javaStatefulName() obsolete. |
duke@1 | 45 | // -D56554 <klr> Port bounded string checks from toJava to toJavaPortable |
duke@1 | 46 | // -D58549 <klr> bounded string checks on in/inout parms throw BAD_PARAM |
duke@1 | 47 | // -D57112<daz> Valuetype initializers map to ctor, regardless of name, and |
duke@1 | 48 | // "void _init(...)" methods now mapped correctly. |
duke@1 | 49 | // -D59297 <klr> pass context parm when Remarshalling |
duke@1 | 50 | // -D59560 <klr> call read/write_Context |
duke@1 | 51 | // -D60929 <klr> Update for RTF2.4 changes |
duke@1 | 52 | // -D61056 <klr> Use Util.helperName |
duke@1 | 53 | // -D61650<daz> Remove '\n' from generated strings; use println()'s. |
duke@1 | 54 | |
duke@1 | 55 | import java.io.PrintWriter; |
duke@1 | 56 | import java.util.Enumeration; |
duke@1 | 57 | import java.util.Hashtable; |
duke@1 | 58 | |
duke@1 | 59 | import com.sun.tools.corba.se.idl.EnumEntry; |
duke@1 | 60 | import com.sun.tools.corba.se.idl.ExceptionEntry; |
duke@1 | 61 | import com.sun.tools.corba.se.idl.InterfaceEntry; |
duke@1 | 62 | import com.sun.tools.corba.se.idl.MethodEntry; |
duke@1 | 63 | import com.sun.tools.corba.se.idl.ParameterEntry; |
duke@1 | 64 | import com.sun.tools.corba.se.idl.PrimitiveEntry; |
duke@1 | 65 | import com.sun.tools.corba.se.idl.StringEntry; |
duke@1 | 66 | import com.sun.tools.corba.se.idl.SymtabEntry; |
duke@1 | 67 | import com.sun.tools.corba.se.idl.SequenceEntry; |
duke@1 | 68 | import com.sun.tools.corba.se.idl.ValueEntry; |
duke@1 | 69 | import com.sun.tools.corba.se.idl.ValueBoxEntry; |
duke@1 | 70 | import com.sun.tools.corba.se.idl.InterfaceState; |
duke@1 | 71 | import com.sun.tools.corba.se.idl.TypedefEntry; |
duke@1 | 72 | import com.sun.tools.corba.se.idl.AttributeEntry; |
duke@1 | 73 | |
duke@1 | 74 | import com.sun.tools.corba.se.idl.constExpr.Expression; |
duke@1 | 75 | |
duke@1 | 76 | /** |
duke@1 | 77 | * |
duke@1 | 78 | **/ |
duke@1 | 79 | public class MethodGen implements com.sun.tools.corba.se.idl.MethodGen |
duke@1 | 80 | { |
duke@1 | 81 | private static final String ONE_INDENT = " "; |
duke@1 | 82 | private static final String TWO_INDENT = " "; |
duke@1 | 83 | private static final String THREE_INDENT = " "; |
duke@1 | 84 | private static final String FOUR_INDENT = " "; |
duke@1 | 85 | private static final String FIVE_INDENT = " "; |
duke@1 | 86 | // This is the length of _get_ and _set_ |
duke@1 | 87 | private static final int ATTRIBUTE_METHOD_PREFIX_LENGTH = 5; |
duke@1 | 88 | /** |
duke@1 | 89 | * Public zero-argument constructor. |
duke@1 | 90 | **/ |
duke@1 | 91 | public MethodGen () |
duke@1 | 92 | { |
duke@1 | 93 | } // ctor |
duke@1 | 94 | |
duke@1 | 95 | /** |
duke@1 | 96 | * Method generate() is not used in MethodGen. They are replaced by the |
duke@1 | 97 | * more granular interfaceMethod, stub, skeleton, dispatchSkeleton. |
duke@1 | 98 | **/ |
duke@1 | 99 | public void generate (Hashtable symbolTable, MethodEntry m, PrintWriter stream) |
duke@1 | 100 | { |
duke@1 | 101 | } // generate |
duke@1 | 102 | |
duke@1 | 103 | /** |
duke@1 | 104 | * |
duke@1 | 105 | **/ |
duke@1 | 106 | protected void interfaceMethod (Hashtable symbolTable, MethodEntry m, PrintWriter stream) |
duke@1 | 107 | { |
duke@1 | 108 | this.symbolTable = symbolTable; |
duke@1 | 109 | this.m = m; |
duke@1 | 110 | this.stream = stream; |
duke@1 | 111 | if (m.comment () != null) |
duke@1 | 112 | m.comment ().generate ("", stream); |
duke@1 | 113 | stream.print (" "); |
duke@1 | 114 | SymtabEntry container = (SymtabEntry)m.container (); |
duke@1 | 115 | boolean isAbstract = false; |
duke@1 | 116 | boolean valueContainer = false; |
duke@1 | 117 | if (container instanceof ValueEntry) |
duke@1 | 118 | { |
duke@1 | 119 | isAbstract = ((ValueEntry)container).isAbstract (); |
duke@1 | 120 | valueContainer = true; |
duke@1 | 121 | } |
duke@1 | 122 | if (valueContainer && !isAbstract) |
duke@1 | 123 | stream.print ("public "); |
duke@1 | 124 | writeMethodSignature (); |
duke@1 | 125 | if (valueContainer && !isAbstract) |
duke@1 | 126 | { |
duke@1 | 127 | stream.println (); |
duke@1 | 128 | stream.println (" {"); |
duke@1 | 129 | stream.println (" }"); |
duke@1 | 130 | stream.println (); |
duke@1 | 131 | } |
duke@1 | 132 | else |
duke@1 | 133 | stream.println (";"); |
duke@1 | 134 | } // interfaceMethod |
duke@1 | 135 | |
duke@1 | 136 | /** |
duke@1 | 137 | * |
duke@1 | 138 | **/ |
duke@1 | 139 | protected void stub (String className, boolean isAbstract, |
duke@1 | 140 | Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index) |
duke@1 | 141 | { |
duke@1 | 142 | localOptimization = |
duke@1 | 143 | ((Arguments)Compile.compiler.arguments).LocalOptimization; |
duke@1 | 144 | this.isAbstract = isAbstract; |
duke@1 | 145 | this.symbolTable = symbolTable; |
duke@1 | 146 | this.m = m; |
duke@1 | 147 | this.stream = stream; |
duke@1 | 148 | this.methodIndex = index; |
duke@1 | 149 | if (m.comment () != null) |
duke@1 | 150 | m.comment ().generate (" ", stream); |
duke@1 | 151 | stream.print (" public "); |
duke@1 | 152 | writeMethodSignature (); |
duke@1 | 153 | stream.println (); |
duke@1 | 154 | stream.println (" {"); |
duke@1 | 155 | writeStubBody ( className ); |
duke@1 | 156 | stream.println (" } // " + m.name ()); |
duke@1 | 157 | stream.println (); |
duke@1 | 158 | } // stub |
duke@1 | 159 | |
duke@1 | 160 | /** |
duke@1 | 161 | * |
duke@1 | 162 | **/ |
duke@1 | 163 | protected void localstub (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index, InterfaceEntry i) |
duke@1 | 164 | { |
duke@1 | 165 | this.symbolTable = symbolTable; |
duke@1 | 166 | this.m = m; |
duke@1 | 167 | this.stream = stream; |
duke@1 | 168 | this.methodIndex = index; |
duke@1 | 169 | if (m.comment () != null) |
duke@1 | 170 | m.comment ().generate (" ", stream); |
duke@1 | 171 | stream.print (" public "); |
duke@1 | 172 | writeMethodSignature (); |
duke@1 | 173 | stream.println (); |
duke@1 | 174 | stream.println (" {"); |
duke@1 | 175 | writeLocalStubBody (i); |
duke@1 | 176 | stream.println (" } // " + m.name ()); |
duke@1 | 177 | stream.println (); |
duke@1 | 178 | } // stub |
duke@1 | 179 | /** |
duke@1 | 180 | * |
duke@1 | 181 | **/ |
duke@1 | 182 | protected void skeleton (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index) |
duke@1 | 183 | { |
duke@1 | 184 | this.symbolTable = symbolTable; |
duke@1 | 185 | this.m = m; |
duke@1 | 186 | this.stream = stream; |
duke@1 | 187 | this.methodIndex = index; |
duke@1 | 188 | if (m.comment () != null) |
duke@1 | 189 | m.comment ().generate (" ", stream); |
duke@1 | 190 | stream.print (" public "); |
duke@1 | 191 | writeMethodSignature (); |
duke@1 | 192 | stream.println (); |
duke@1 | 193 | stream.println (" {"); |
duke@1 | 194 | writeSkeletonBody (); |
duke@1 | 195 | stream.println (" } // " + m.name ()); |
duke@1 | 196 | } // skeleton |
duke@1 | 197 | |
duke@1 | 198 | /** |
duke@1 | 199 | * |
duke@1 | 200 | **/ |
duke@1 | 201 | protected void dispatchSkeleton (Hashtable symbolTable, MethodEntry m, PrintWriter stream, int index) |
duke@1 | 202 | { |
duke@1 | 203 | this.symbolTable = symbolTable; |
duke@1 | 204 | this.m = m; |
duke@1 | 205 | this.stream = stream; |
duke@1 | 206 | this.methodIndex = index; |
duke@1 | 207 | if (m.comment () != null) |
duke@1 | 208 | m.comment ().generate (" ", stream); |
duke@1 | 209 | writeDispatchCall (); |
duke@1 | 210 | } // dispatchSkeleton |
duke@1 | 211 | |
duke@1 | 212 | // <d57112> |
duke@1 | 213 | /** |
duke@1 | 214 | * Determine whether method entry m is a valuetype initializer. |
duke@1 | 215 | * @return true if is m is valuetype initializer, false otherwise. |
duke@1 | 216 | **/ |
duke@1 | 217 | protected boolean isValueInitializer () |
duke@1 | 218 | { |
duke@1 | 219 | MethodEntry currentInit = null; |
duke@1 | 220 | if ((m.container () instanceof ValueEntry)) |
duke@1 | 221 | { |
duke@1 | 222 | Enumeration e = ((ValueEntry)m.container ()).initializers ().elements (); |
duke@1 | 223 | while (currentInit != m && e.hasMoreElements ()) |
duke@1 | 224 | currentInit = (MethodEntry)e.nextElement (); |
duke@1 | 225 | } |
duke@1 | 226 | return (currentInit == m) && (null != m); // True ==> yes, false ==> no. |
duke@1 | 227 | } // isValueInitializer |
duke@1 | 228 | |
duke@1 | 229 | /** |
duke@1 | 230 | * |
duke@1 | 231 | **/ |
duke@1 | 232 | protected void writeMethodSignature () |
duke@1 | 233 | { |
duke@1 | 234 | boolean isValueInitializer = isValueInitializer (); // <d57112> |
duke@1 | 235 | |
duke@1 | 236 | // Step 0. Print the return type and name. |
duke@1 | 237 | // A return type of null indicates the "void" return type. If m is a |
duke@1 | 238 | // Valuetype intitializer, it has name "init" and a null return type, |
duke@1 | 239 | // but it maps to a ctor. |
duke@1 | 240 | // <d57112> |
duke@1 | 241 | //if (m.type () == null) |
duke@1 | 242 | //{ |
duke@1 | 243 | // if (m.name ().compareTo ("init") != 0) |
duke@1 | 244 | // stream.print ("void"); |
duke@1 | 245 | //} |
duke@1 | 246 | if (m.type () == null) |
duke@1 | 247 | { |
duke@1 | 248 | if (!isValueInitializer) |
duke@1 | 249 | stream.print ("void"); |
duke@1 | 250 | } |
duke@1 | 251 | else |
duke@1 | 252 | { |
duke@1 | 253 | // <f46082.51> Remove -stateful feature; javaStatefulName() obsolete. |
duke@1 | 254 | //stream.print (Util.javaStatefulName (m.type ())); |
duke@1 | 255 | stream.print (Util.javaName (m.type ())); |
duke@1 | 256 | } |
duke@1 | 257 | // <d57112> Value initializers map to constructors. |
duke@1 | 258 | // If the value has an 'init' method with a return type, handle |
duke@1 | 259 | // the method like other regular methods |
duke@1 | 260 | //if (m.valueMethod () && m.name ().compareTo ("init") == 0 && |
duke@1 | 261 | // m.type () == null) |
duke@1 | 262 | if (isValueInitializer) |
duke@1 | 263 | stream.print (' ' + m.container ().name () + " ("); |
duke@1 | 264 | else |
duke@1 | 265 | stream.print (' ' + m.name () + " ("); |
duke@1 | 266 | |
duke@1 | 267 | // Step 1. Print the parameter list. |
duke@1 | 268 | boolean firstTime = true; |
duke@1 | 269 | Enumeration e = m.parameters ().elements (); |
duke@1 | 270 | while (e.hasMoreElements ()) |
duke@1 | 271 | { |
duke@1 | 272 | if (firstTime) |
duke@1 | 273 | firstTime = false; |
duke@1 | 274 | else |
duke@1 | 275 | stream.print (", "); |
duke@1 | 276 | ParameterEntry parm = (ParameterEntry)e.nextElement (); |
duke@1 | 277 | |
duke@1 | 278 | writeParmType (parm.type (), parm.passType ()); |
duke@1 | 279 | |
duke@1 | 280 | // Print parm name |
duke@1 | 281 | stream.print (' ' + parm.name ()); |
duke@1 | 282 | } |
duke@1 | 283 | |
duke@1 | 284 | // Step 2. Add the context parameter if necessary. |
duke@1 | 285 | if (m.contexts ().size () > 0) |
duke@1 | 286 | { |
duke@1 | 287 | if (!firstTime) |
duke@1 | 288 | stream.print (", "); |
duke@1 | 289 | stream.print ("org.omg.CORBA.Context $context"); |
duke@1 | 290 | } |
duke@1 | 291 | |
duke@1 | 292 | // Step 3. Print the throws clause (if necessary). |
duke@1 | 293 | if (m.exceptions ().size () > 0) |
duke@1 | 294 | { |
duke@1 | 295 | stream.print (") throws "); |
duke@1 | 296 | e = m.exceptions ().elements (); |
duke@1 | 297 | firstTime = true; |
duke@1 | 298 | while (e.hasMoreElements ()) |
duke@1 | 299 | { |
duke@1 | 300 | if (firstTime) |
duke@1 | 301 | firstTime = false; |
duke@1 | 302 | else |
duke@1 | 303 | stream.print (", "); |
duke@1 | 304 | stream.print (Util.javaName ((SymtabEntry)e.nextElement ())); |
duke@1 | 305 | } |
duke@1 | 306 | } |
duke@1 | 307 | else |
duke@1 | 308 | stream.print (')'); |
duke@1 | 309 | } // writeMethodSignature |
duke@1 | 310 | |
duke@1 | 311 | /** |
duke@1 | 312 | * |
duke@1 | 313 | **/ |
duke@1 | 314 | protected void writeParmType (SymtabEntry parm, int passType) |
duke@1 | 315 | { |
duke@1 | 316 | if (passType != ParameterEntry.In) |
duke@1 | 317 | { |
duke@1 | 318 | parm = Util.typeOf (parm); |
duke@1 | 319 | stream.print (Util.holderName (parm)); |
duke@1 | 320 | } |
duke@1 | 321 | else // passType is `in' |
duke@1 | 322 | // <f46082.51> Remove -stateful feature; javaStatefulName() obsolete. |
duke@1 | 323 | //stream.print (Util.javaStatefulName (parm)); |
duke@1 | 324 | stream.print (Util.javaName (parm)); |
duke@1 | 325 | } // writeParmType |
duke@1 | 326 | |
duke@1 | 327 | /** |
duke@1 | 328 | * |
duke@1 | 329 | **/ |
duke@1 | 330 | protected void writeDispatchCall () |
duke@1 | 331 | { |
duke@1 | 332 | String indent = " "; |
duke@1 | 333 | String fullMethodName = m.fullName (); |
duke@1 | 334 | if (m instanceof AttributeEntry) |
duke@1 | 335 | { |
duke@1 | 336 | // determine the index at which the attribute name starts in the full name |
duke@1 | 337 | int index = fullMethodName.lastIndexOf ('/') + 1; |
duke@1 | 338 | if (m.type () == null) // if it's a modifier |
duke@1 | 339 | fullMethodName = fullMethodName.substring (0, index) + "_set_" + m.name (); |
duke@1 | 340 | else |
duke@1 | 341 | fullMethodName = fullMethodName.substring (0, index) + "_get_" + m.name (); |
duke@1 | 342 | } |
duke@1 | 343 | stream.println (indent + "case " + methodIndex + ": // " + fullMethodName); |
duke@1 | 344 | stream.println (indent + "{"); |
duke@1 | 345 | indent = indent + " "; |
duke@1 | 346 | if (m.exceptions ().size () > 0) |
duke@1 | 347 | { |
duke@1 | 348 | stream.println (indent + "try {"); |
duke@1 | 349 | indent = indent + " "; |
duke@1 | 350 | } |
duke@1 | 351 | |
duke@1 | 352 | // Step 1 Read arguments from the input stream |
duke@1 | 353 | SymtabEntry mtype = Util.typeOf (m.type ()); |
duke@1 | 354 | Enumeration parms = m.parameters ().elements (); |
duke@1 | 355 | parms = m.parameters ().elements (); |
duke@1 | 356 | while (parms.hasMoreElements ()) |
duke@1 | 357 | { |
duke@1 | 358 | ParameterEntry parm = (ParameterEntry) parms.nextElement (); |
duke@1 | 359 | String name = parm.name (); |
duke@1 | 360 | String anyName = '_' + name; |
duke@1 | 361 | SymtabEntry type = parm.type (); |
duke@1 | 362 | int passType = parm.passType (); |
duke@1 | 363 | |
duke@1 | 364 | if (passType == ParameterEntry.In) |
duke@1 | 365 | Util.writeInitializer (indent, name, "", type, writeInputStreamRead ("in", type), stream); |
duke@1 | 366 | |
duke@1 | 367 | else // the parm is a holder |
duke@1 | 368 | { |
duke@1 | 369 | String holderName = Util.holderName (type); |
duke@1 | 370 | stream.println (indent + holderName + ' ' + name + " = new " + holderName + " ();"); |
duke@1 | 371 | if (passType == ParameterEntry.Inout) |
duke@1 | 372 | { |
duke@1 | 373 | if (type instanceof ValueBoxEntry) |
duke@1 | 374 | { |
duke@1 | 375 | ValueBoxEntry v = (ValueBoxEntry) type; |
duke@1 | 376 | TypedefEntry member = ((InterfaceState) v.state ().elementAt (0)).entry; |
duke@1 | 377 | SymtabEntry mType = member.type (); |
duke@1 | 378 | if (mType instanceof PrimitiveEntry) |
duke@1 | 379 | stream.println (indent + name + ".value = (" + writeInputStreamRead ("in", parm.type ()) + ").value;"); |
duke@1 | 380 | else |
duke@1 | 381 | stream.println (indent + name + ".value = " + writeInputStreamRead ("in", parm.type ()) + ";"); |
duke@1 | 382 | } |
duke@1 | 383 | else |
duke@1 | 384 | stream.println (indent + name + ".value = " + writeInputStreamRead ("in", parm.type ()) + ";"); |
duke@1 | 385 | } |
duke@1 | 386 | } |
duke@1 | 387 | } |
duke@1 | 388 | |
duke@1 | 389 | // Step 1a. Read the context parameter if necessary. <d59560> |
duke@1 | 390 | if (m.contexts ().size () > 0) |
duke@1 | 391 | { |
duke@1 | 392 | stream.println (indent + "org.omg.CORBA.Context $context = in.read_Context ();"); |
duke@1 | 393 | } |
duke@1 | 394 | |
duke@1 | 395 | // Step 2 Load return if necessary |
duke@1 | 396 | if (mtype != null) |
duke@1 | 397 | Util.writeInitializer (indent, "$result", "", mtype, stream); |
duke@1 | 398 | |
duke@1 | 399 | // Step 3 Call the method with the list of parameters |
duke@1 | 400 | writeMethodCall (indent); |
duke@1 | 401 | |
duke@1 | 402 | parms = m.parameters ().elements (); |
duke@1 | 403 | boolean firstTime = true; |
duke@1 | 404 | while (parms.hasMoreElements ()) |
duke@1 | 405 | { |
duke@1 | 406 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 407 | if (firstTime) |
duke@1 | 408 | firstTime = false; |
duke@1 | 409 | else |
duke@1 | 410 | stream.print (", "); |
duke@1 | 411 | stream.print (parm.name ()); |
duke@1 | 412 | } |
duke@1 | 413 | |
duke@1 | 414 | // Step 3a. Add the context parameter if necessary. <d59560> |
duke@1 | 415 | if (m.contexts ().size () > 0) |
duke@1 | 416 | { |
duke@1 | 417 | if (!firstTime) |
duke@1 | 418 | stream.print (", "); |
duke@1 | 419 | stream.print ("$context"); |
duke@1 | 420 | } |
duke@1 | 421 | |
duke@1 | 422 | stream.println (");"); |
duke@1 | 423 | |
duke@1 | 424 | //Step 3b. Create reply; |
duke@1 | 425 | writeCreateReply (indent); |
duke@1 | 426 | |
duke@1 | 427 | // Step 4 Write method's result to the output stream |
duke@1 | 428 | if (mtype != null) |
duke@1 | 429 | { |
duke@1 | 430 | writeOutputStreamWrite (indent, "out", "$result", mtype, stream); |
duke@1 | 431 | } |
duke@1 | 432 | |
duke@1 | 433 | // Step 5 Write inout/out value to the output stream |
duke@1 | 434 | parms = m.parameters ().elements (); |
duke@1 | 435 | while (parms.hasMoreElements ()) |
duke@1 | 436 | { |
duke@1 | 437 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 438 | int passType = parm.passType (); |
duke@1 | 439 | if (passType != ParameterEntry.In) |
duke@1 | 440 | { |
duke@1 | 441 | writeOutputStreamWrite (indent, "out", parm.name () + ".value", parm.type (), stream); |
duke@1 | 442 | } |
duke@1 | 443 | } |
duke@1 | 444 | |
duke@1 | 445 | // Step 6 Handle exception |
duke@1 | 446 | if (m.exceptions ().size () > 0) |
duke@1 | 447 | { |
duke@1 | 448 | Enumeration exceptions = m.exceptions ().elements (); |
duke@1 | 449 | while (exceptions.hasMoreElements ()) |
duke@1 | 450 | { |
duke@1 | 451 | indent = " "; |
duke@1 | 452 | ExceptionEntry exc = (ExceptionEntry) exceptions.nextElement (); |
duke@1 | 453 | String fullName = Util.javaQualifiedName (exc); |
duke@1 | 454 | stream.println (indent + "} catch (" + fullName + " $ex) {"); |
duke@1 | 455 | indent = indent + " "; |
duke@1 | 456 | stream.println (indent + "out = $rh.createExceptionReply ();"); |
duke@1 | 457 | stream.println (indent + Util.helperName (exc, true) + ".write (out, $ex);"); // <d61056> |
duke@1 | 458 | } |
duke@1 | 459 | |
duke@1 | 460 | indent = " "; |
duke@1 | 461 | stream.println (indent + "}"); |
duke@1 | 462 | } |
duke@1 | 463 | |
duke@1 | 464 | stream.println (" break;"); |
duke@1 | 465 | stream.println (" }"); |
duke@1 | 466 | stream.println (); |
duke@1 | 467 | } // writeDispatchCall |
duke@1 | 468 | |
duke@1 | 469 | /** |
duke@1 | 470 | * |
duke@1 | 471 | **/ |
duke@1 | 472 | protected void writeStubBody ( String className ) |
duke@1 | 473 | { |
duke@1 | 474 | // Step 1 Create a request |
duke@1 | 475 | String methodName = Util.stripLeadingUnderscores (m.name ()); |
duke@1 | 476 | if (m instanceof AttributeEntry) |
duke@1 | 477 | { |
duke@1 | 478 | if (m.type () == null) // if it's a modifier |
duke@1 | 479 | methodName = "_set_" + methodName; |
duke@1 | 480 | else |
duke@1 | 481 | methodName = "_get_" + methodName; |
duke@1 | 482 | } |
duke@1 | 483 | if( localOptimization && !isAbstract ) { |
duke@1 | 484 | stream.println (ONE_INDENT + "while(true) {" ); |
duke@1 | 485 | stream.println(TWO_INDENT + "if(!this._is_local()) {" ); |
duke@1 | 486 | } |
duke@1 | 487 | stream.println(THREE_INDENT + |
duke@1 | 488 | "org.omg.CORBA.portable.InputStream $in = null;"); |
duke@1 | 489 | stream.println(THREE_INDENT + "try {"); |
duke@1 | 490 | stream.println(FOUR_INDENT + "org.omg.CORBA.portable.OutputStream $out =" + |
duke@1 | 491 | " _request (\"" + methodName + "\", " + !m.oneway() + ");"); |
duke@1 | 492 | |
duke@1 | 493 | // Step 1.b. Check string bounds <d56554 - klr> |
duke@1 | 494 | // begin <d56554> in/inout string bounds check |
duke@1 | 495 | Enumeration parms = m.parameters ().elements (); |
duke@1 | 496 | while (parms.hasMoreElements ()) |
duke@1 | 497 | { |
duke@1 | 498 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 499 | SymtabEntry parmType = Util.typeOf (parm.type ()); |
duke@1 | 500 | if (parmType instanceof StringEntry) |
duke@1 | 501 | if ((parm.passType () == ParameterEntry.In) || |
duke@1 | 502 | (parm.passType () == ParameterEntry.Inout)) |
duke@1 | 503 | { |
duke@1 | 504 | StringEntry string = (StringEntry)parmType; |
duke@1 | 505 | if (string.maxSize () != null) |
duke@1 | 506 | { |
duke@1 | 507 | stream.print (THREE_INDENT + "if (" + parm.name ()); |
duke@1 | 508 | if (parm.passType () == ParameterEntry.Inout) |
duke@1 | 509 | stream.print (".value"); // get from holder |
duke@1 | 510 | stream.print (" == null || " + parm.name ()); |
duke@1 | 511 | if (parm.passType () == ParameterEntry.Inout) |
duke@1 | 512 | stream.print (".value"); // get from holder |
duke@1 | 513 | stream.println (".length () > (" + |
duke@1 | 514 | Util.parseExpression (string.maxSize ()) + "))"); |
duke@1 | 515 | stream.println (THREE_INDENT + |
duke@1 | 516 | "throw new org.omg.CORBA.BAD_PARAM (0," + |
duke@1 | 517 | " org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); |
duke@1 | 518 | } |
duke@1 | 519 | } |
duke@1 | 520 | } |
duke@1 | 521 | // end <d56554> in/inout string bounds check |
duke@1 | 522 | |
duke@1 | 523 | // Step 2 Load the parameters into the outputStream |
duke@1 | 524 | parms = m.parameters ().elements (); |
duke@1 | 525 | while (parms.hasMoreElements ()) |
duke@1 | 526 | { |
duke@1 | 527 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 528 | if (parm.passType () == ParameterEntry.In) |
duke@1 | 529 | writeOutputStreamWrite(FOUR_INDENT, "$out", parm.name (), parm.type (), |
duke@1 | 530 | stream); |
duke@1 | 531 | else if (parm.passType () == ParameterEntry.Inout) |
duke@1 | 532 | writeOutputStreamWrite(FOUR_INDENT, "$out", parm.name () + ".value", |
duke@1 | 533 | parm.type (), stream); |
duke@1 | 534 | } |
duke@1 | 535 | |
duke@1 | 536 | // Step 2a. Write the context parameter if necessary. <d59560> |
duke@1 | 537 | if (m.contexts ().size () > 0) |
duke@1 | 538 | { |
duke@1 | 539 | stream.println(FOUR_INDENT + "org.omg.CORBA.ContextList $contextList =" + |
duke@1 | 540 | "_orb ().create_context_list ();"); |
duke@1 | 541 | |
duke@1 | 542 | for (int cnt = 0; cnt < m.contexts ().size (); cnt++) |
duke@1 | 543 | { |
duke@1 | 544 | stream.println(FOUR_INDENT + |
duke@1 | 545 | "$contextList.add (\"" + m.contexts (). elementAt (cnt) + "\");"); |
duke@1 | 546 | } |
duke@1 | 547 | stream.println(FOUR_INDENT + |
duke@1 | 548 | "$out.write_Context ($context, $contextList);"); |
duke@1 | 549 | } |
duke@1 | 550 | |
duke@1 | 551 | // Step 3 Invoke the method with the output stream |
duke@1 | 552 | stream.println (FOUR_INDENT + "$in = _invoke ($out);"); |
duke@1 | 553 | |
duke@1 | 554 | SymtabEntry mtype = m.type (); |
duke@1 | 555 | if (mtype != null) |
duke@1 | 556 | Util.writeInitializer (FOUR_INDENT, "$result", "", mtype, |
duke@1 | 557 | writeInputStreamRead ("$in", mtype), stream); |
duke@1 | 558 | |
duke@1 | 559 | // Step 4 Read the inout/out values |
duke@1 | 560 | parms = m.parameters ().elements (); |
duke@1 | 561 | while (parms.hasMoreElements ()) |
duke@1 | 562 | { |
duke@1 | 563 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 564 | if (parm.passType () != ParameterEntry.In) |
duke@1 | 565 | { |
duke@1 | 566 | if (parm.type () instanceof ValueBoxEntry) |
duke@1 | 567 | { |
duke@1 | 568 | ValueBoxEntry v = (ValueBoxEntry) parm.type (); |
duke@1 | 569 | TypedefEntry member = |
duke@1 | 570 | ((InterfaceState) v.state ().elementAt (0)).entry; |
duke@1 | 571 | SymtabEntry mType = member.type (); |
duke@1 | 572 | if (mType instanceof PrimitiveEntry) |
duke@1 | 573 | stream.println(FOUR_INDENT + parm.name () + |
duke@1 | 574 | ".value = (" + writeInputStreamRead ("$in", parm.type ()) + |
duke@1 | 575 | ").value;"); |
duke@1 | 576 | else |
duke@1 | 577 | stream.println(FOUR_INDENT + parm.name () + |
duke@1 | 578 | ".value = " + writeInputStreamRead ("$in", parm.type ()) +";"); |
duke@1 | 579 | } |
duke@1 | 580 | else |
duke@1 | 581 | stream.println (FOUR_INDENT + parm.name () + ".value = " + |
duke@1 | 582 | writeInputStreamRead ("$in", parm.type ()) + ";"); |
duke@1 | 583 | } |
duke@1 | 584 | } |
duke@1 | 585 | // Step 4.b. Check string bounds <d56554 - klr> |
duke@1 | 586 | // begin <d56554> out/inout/return string bounds check |
duke@1 | 587 | parms = m.parameters ().elements (); |
duke@1 | 588 | while (parms.hasMoreElements ()) |
duke@1 | 589 | { |
duke@1 | 590 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 591 | SymtabEntry parmType = Util.typeOf (parm.type ()); |
duke@1 | 592 | if (parmType instanceof StringEntry) |
duke@1 | 593 | if ((parm.passType () == ParameterEntry.Out) || |
duke@1 | 594 | (parm.passType () == ParameterEntry.Inout)) |
duke@1 | 595 | { |
duke@1 | 596 | StringEntry string = (StringEntry)parmType; |
duke@1 | 597 | if (string.maxSize () != null) |
duke@1 | 598 | { |
duke@1 | 599 | stream.print (FOUR_INDENT + "if (" + parm.name () + |
duke@1 | 600 | ".value.length ()"); |
duke@1 | 601 | stream.println (" > (" + |
duke@1 | 602 | Util.parseExpression (string.maxSize ()) + "))"); |
duke@1 | 603 | stream.println (FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL(0,"+ |
duke@1 | 604 | "org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); |
duke@1 | 605 | } |
duke@1 | 606 | } |
duke@1 | 607 | } |
duke@1 | 608 | if (mtype instanceof StringEntry) |
duke@1 | 609 | { |
duke@1 | 610 | StringEntry string = (StringEntry)mtype; |
duke@1 | 611 | if (string.maxSize () != null) |
duke@1 | 612 | { |
duke@1 | 613 | stream.println(FOUR_INDENT + "if ($result.length () > (" + |
duke@1 | 614 | Util.parseExpression (string.maxSize ()) + "))"); |
duke@1 | 615 | stream.println (FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL (0," + |
duke@1 | 616 | " org.omg.CORBA.CompletionStatus.COMPLETED_NO);"); |
duke@1 | 617 | } |
duke@1 | 618 | } |
duke@1 | 619 | // end <d56554> out/inout/return string bounds check |
duke@1 | 620 | |
duke@1 | 621 | // Step 5 Handle return if necessary |
duke@1 | 622 | if (mtype != null) { |
duke@1 | 623 | stream.println(FOUR_INDENT + "return $result;"); |
duke@1 | 624 | } else { |
duke@1 | 625 | stream.println(FOUR_INDENT + "return;"); |
duke@1 | 626 | } |
duke@1 | 627 | |
duke@1 | 628 | // Step 6 Handle exceptions |
duke@1 | 629 | stream.println(THREE_INDENT + |
duke@1 | 630 | "} catch (org.omg.CORBA.portable.ApplicationException " + "$ex) {"); |
duke@1 | 631 | stream.println(FOUR_INDENT + "$in = $ex.getInputStream ();"); |
duke@1 | 632 | stream.println(FOUR_INDENT + "String _id = $ex.getId ();"); |
duke@1 | 633 | |
duke@1 | 634 | if (m.exceptions ().size () > 0) |
duke@1 | 635 | { |
duke@1 | 636 | Enumeration exceptions = m.exceptions ().elements (); |
duke@1 | 637 | boolean firstExc = true; |
duke@1 | 638 | while (exceptions.hasMoreElements ()) |
duke@1 | 639 | { |
duke@1 | 640 | ExceptionEntry exc = (ExceptionEntry)exceptions.nextElement (); |
duke@1 | 641 | if (firstExc) |
duke@1 | 642 | { |
duke@1 | 643 | stream.print(FOUR_INDENT + "if "); |
duke@1 | 644 | firstExc = false; |
duke@1 | 645 | } |
duke@1 | 646 | else |
duke@1 | 647 | stream.print(FOUR_INDENT + "else if "); |
duke@1 | 648 | |
duke@1 | 649 | stream.println( "(_id.equals (\"" + exc.repositoryID ().ID () + "\"))"); |
duke@1 | 650 | stream.println (FIVE_INDENT + "throw " + |
duke@1 | 651 | Util.helperName ((SymtabEntry)exc, false) + ".read ($in);"); |
duke@1 | 652 | } |
duke@1 | 653 | stream.println(FOUR_INDENT + "else"); |
duke@1 | 654 | stream.println(FIVE_INDENT + "throw new org.omg.CORBA.MARSHAL (_id);"); |
duke@1 | 655 | } |
duke@1 | 656 | else |
duke@1 | 657 | stream.println(FOUR_INDENT + "throw new org.omg.CORBA.MARSHAL (_id);"); |
duke@1 | 658 | |
duke@1 | 659 | stream.println(THREE_INDENT + |
duke@1 | 660 | "} catch (org.omg.CORBA.portable.RemarshalException $rm) {"); |
duke@1 | 661 | stream.print( FOUR_INDENT ); |
duke@1 | 662 | if (m.type () != null) // not a void method |
duke@1 | 663 | stream.print ("return "); |
duke@1 | 664 | stream.print (m.name () + " ("); |
duke@1 | 665 | { |
duke@1 | 666 | // write parm names |
duke@1 | 667 | boolean firstTime = true; |
duke@1 | 668 | Enumeration e = m.parameters ().elements (); |
duke@1 | 669 | while (e.hasMoreElements ()) |
duke@1 | 670 | { |
duke@1 | 671 | if (firstTime) |
duke@1 | 672 | firstTime = false; |
duke@1 | 673 | else |
duke@1 | 674 | stream.print (", "); |
duke@1 | 675 | ParameterEntry parm = (ParameterEntry)e.nextElement (); |
duke@1 | 676 | stream.print (parm.name ()); |
duke@1 | 677 | } |
duke@1 | 678 | // Step 2. Add the context parameter if necessary. <d59297> |
duke@1 | 679 | if (m.contexts ().size () > 0) |
duke@1 | 680 | { |
duke@1 | 681 | if (!firstTime) |
duke@1 | 682 | stream.print (", "); |
duke@1 | 683 | stream.print ("$context"); |
duke@1 | 684 | } |
duke@1 | 685 | } |
duke@1 | 686 | stream.println (TWO_INDENT + ");"); |
duke@1 | 687 | stream.println (THREE_INDENT + "} finally {"); |
duke@1 | 688 | stream.println (FOUR_INDENT + "_releaseReply ($in);"); |
duke@1 | 689 | stream.println (THREE_INDENT + "}"); |
duke@1 | 690 | if( localOptimization && !isAbstract ) { |
duke@1 | 691 | stream.println (TWO_INDENT + "}"); |
duke@1 | 692 | writeStubBodyForLocalInvocation( className, methodName ); |
duke@1 | 693 | } |
duke@1 | 694 | |
duke@1 | 695 | } // writeStubBody |
duke@1 | 696 | |
duke@1 | 697 | |
duke@1 | 698 | /** |
duke@1 | 699 | * This method writes the else part of the stub method invocation to |
duke@1 | 700 | * enable local invocation in case of collocation. |
duke@1 | 701 | * NOTE: This will only be invoked from writeStubBody. |
duke@1 | 702 | */ |
duke@1 | 703 | private void writeStubBodyForLocalInvocation( String className, |
duke@1 | 704 | String methodName ) |
duke@1 | 705 | { |
duke@1 | 706 | stream.println (TWO_INDENT + "else {" ); |
duke@1 | 707 | stream.println (THREE_INDENT + |
duke@1 | 708 | "org.omg.CORBA.portable.ServantObject _so ="); |
duke@1 | 709 | stream.println (FOUR_INDENT + "_servant_preinvoke(\"" + methodName + |
duke@1 | 710 | "\", _opsClass);" ); |
duke@1 | 711 | stream.println(THREE_INDENT + "if (_so == null ) {"); |
duke@1 | 712 | stream.println(FOUR_INDENT + "continue;" ); |
duke@1 | 713 | stream.println(THREE_INDENT + "}"); |
duke@1 | 714 | stream.println(THREE_INDENT + className + "Operations _self =" ); |
duke@1 | 715 | stream.println(FOUR_INDENT + "(" + className + "Operations) _so.servant;"); |
duke@1 | 716 | stream.println(THREE_INDENT + "try {" ); |
duke@1 | 717 | Enumeration parms = m.parameters ().elements (); |
duke@1 | 718 | if (m instanceof AttributeEntry) |
duke@1 | 719 | { |
duke@1 | 720 | // Local Method Name should drop _get_ or _set_ prefix for attribute |
duke@1 | 721 | // entry |
duke@1 | 722 | methodName = methodName.substring( ATTRIBUTE_METHOD_PREFIX_LENGTH ); |
duke@1 | 723 | } |
duke@1 | 724 | boolean voidReturnType = (this.m.type() == null); |
duke@1 | 725 | if ( !voidReturnType ) { |
duke@1 | 726 | stream.println (FOUR_INDENT + Util.javaName (this.m.type ()) + |
duke@1 | 727 | " $result;"); |
duke@1 | 728 | } |
duke@1 | 729 | if( !isValueInitializer() ) { |
duke@1 | 730 | if ( voidReturnType ) { |
duke@1 | 731 | stream.print(FOUR_INDENT + "_self." + methodName + "( " ); |
duke@1 | 732 | } else { |
duke@1 | 733 | stream.print(FOUR_INDENT + "$result = _self." + |
duke@1 | 734 | methodName + "( " ); |
duke@1 | 735 | } |
duke@1 | 736 | while (parms.hasMoreElements ()) { |
duke@1 | 737 | ParameterEntry param = (ParameterEntry)parms.nextElement (); |
duke@1 | 738 | if( parms.hasMoreElements( ) ) { |
duke@1 | 739 | stream.print( " " + param.name() + "," ); |
duke@1 | 740 | } else { |
duke@1 | 741 | stream.print( " " + param.name() ); |
duke@1 | 742 | } |
duke@1 | 743 | } |
duke@1 | 744 | stream.print( ");" ); |
duke@1 | 745 | stream.println( " " ); |
duke@1 | 746 | if( voidReturnType ) { |
duke@1 | 747 | stream.println(FOUR_INDENT + "return;" ); |
duke@1 | 748 | } else { |
duke@1 | 749 | stream.println(FOUR_INDENT + "return $result;" ); |
duke@1 | 750 | } |
duke@1 | 751 | } |
duke@1 | 752 | stream.println(" "); |
duke@1 | 753 | stream.println (THREE_INDENT + "}" ); |
duke@1 | 754 | stream.println (THREE_INDENT + "finally {" ); |
duke@1 | 755 | stream.println (FOUR_INDENT + "_servant_postinvoke(_so);" ); |
duke@1 | 756 | stream.println (THREE_INDENT + "}" ); |
duke@1 | 757 | stream.println (TWO_INDENT + "}" ); |
duke@1 | 758 | stream.println (ONE_INDENT + "}" ); |
duke@1 | 759 | } |
duke@1 | 760 | |
duke@1 | 761 | |
duke@1 | 762 | protected void writeLocalStubBody (InterfaceEntry i) |
duke@1 | 763 | { |
duke@1 | 764 | // Step 1 Create a request |
duke@1 | 765 | String methodName = Util.stripLeadingUnderscores (m.name ()); |
duke@1 | 766 | if (m instanceof AttributeEntry) |
duke@1 | 767 | { |
duke@1 | 768 | if (m.type () == null) // if it's a modifier |
duke@1 | 769 | methodName = "_set_" + methodName; |
duke@1 | 770 | else |
duke@1 | 771 | methodName = "_get_" + methodName; |
duke@1 | 772 | } |
duke@1 | 773 | //stream.println (" while(true) {"); |
duke@1 | 774 | stream.println (" org.omg.CORBA.portable.ServantObject $so = " + |
duke@1 | 775 | "_servant_preinvoke (\"" + methodName + "\", " + "_opsClass);"); |
duke@1 | 776 | //stream.println (" if ($so == null) {"); |
duke@1 | 777 | //stream.println (" continue;"); |
duke@1 | 778 | //stream.println (" }"); |
duke@1 | 779 | String opsName = i.name() + "Operations"; |
duke@1 | 780 | stream.println (" " + opsName + " $self = " + "(" + opsName + ") " + "$so.servant;"); |
duke@1 | 781 | stream.println (); |
duke@1 | 782 | stream.println (" try {"); |
duke@1 | 783 | stream.print (" "); |
duke@1 | 784 | if (m.type () != null) // not a void method |
duke@1 | 785 | stream.print ("return "); |
duke@1 | 786 | stream.print ("$self." + m.name () + " ("); |
duke@1 | 787 | { |
duke@1 | 788 | // write parm names |
duke@1 | 789 | boolean firstTime = true; |
duke@1 | 790 | Enumeration e = m.parameters ().elements (); |
duke@1 | 791 | while (e.hasMoreElements ()) |
duke@1 | 792 | { |
duke@1 | 793 | if (firstTime) |
duke@1 | 794 | firstTime = false; |
duke@1 | 795 | else |
duke@1 | 796 | stream.print (", "); |
duke@1 | 797 | ParameterEntry parm = (ParameterEntry)e.nextElement (); |
duke@1 | 798 | stream.print (parm.name ()); |
duke@1 | 799 | } |
duke@1 | 800 | // Step 2. Add the context parameter if necessary. <d59297> |
duke@1 | 801 | if (m.contexts ().size () > 0) |
duke@1 | 802 | { |
duke@1 | 803 | if (!firstTime) |
duke@1 | 804 | stream.print (", "); |
duke@1 | 805 | stream.print ("$context"); |
duke@1 | 806 | } |
duke@1 | 807 | } |
duke@1 | 808 | stream.println (");"); |
duke@1 | 809 | //stream.println (" } catch (org.omg.CORBA.portable.RemarshalException $rm) {"); |
duke@1 | 810 | //stream.println (" continue; "); |
duke@1 | 811 | stream.println (" } finally {"); |
duke@1 | 812 | stream.println (" _servant_postinvoke ($so);"); |
duke@1 | 813 | stream.println (" }"); |
duke@1 | 814 | //stream.println (" }"); |
duke@1 | 815 | |
duke@1 | 816 | } // writeLocalStubBody |
duke@1 | 817 | |
duke@1 | 818 | |
duke@1 | 819 | |
duke@1 | 820 | /** |
duke@1 | 821 | * |
duke@1 | 822 | **/ |
duke@1 | 823 | private void writeInsert (String indent, String target, String source, SymtabEntry type, PrintWriter stream) |
duke@1 | 824 | { |
duke@1 | 825 | String typeName = type.name (); |
duke@1 | 826 | if (type instanceof PrimitiveEntry) |
duke@1 | 827 | { |
duke@1 | 828 | // RJB does something have to be done with TC offsets? |
duke@1 | 829 | if (typeName.equals ("long long")) |
duke@1 | 830 | stream.println (indent + source + ".insert_longlong (" + target + ");"); |
duke@1 | 831 | else if (typeName.equals ("unsigned short")) |
duke@1 | 832 | stream.println (indent + source + ".insert_ushort (" + target + ");"); |
duke@1 | 833 | else if (typeName.equals ("unsigned long")) |
duke@1 | 834 | stream.println (indent + source + ".insert_ulong (" + target + ");"); |
duke@1 | 835 | else if (typeName.equals ("unsigned long long")) |
duke@1 | 836 | stream.println (indent + source + ".insert_ulonglong (" + target + ");"); |
duke@1 | 837 | else |
duke@1 | 838 | stream.println (indent + source + ".insert_" + typeName + " (" + target + ");"); |
duke@1 | 839 | } |
duke@1 | 840 | else if (type instanceof StringEntry) |
duke@1 | 841 | stream.println (indent + source + ".insert_" + typeName + " (" + target + ");"); |
duke@1 | 842 | else |
duke@1 | 843 | stream.println (indent + Util.helperName (type, true) + ".insert (" + source + ", " + target + ");"); // <d61056> |
duke@1 | 844 | } // writeInsert |
duke@1 | 845 | |
duke@1 | 846 | /** |
duke@1 | 847 | * |
duke@1 | 848 | **/ |
duke@1 | 849 | private void writeType (String indent, String name, SymtabEntry type, PrintWriter stream) |
duke@1 | 850 | { |
duke@1 | 851 | if (type instanceof PrimitiveEntry) |
duke@1 | 852 | { |
duke@1 | 853 | // RJB does something have to be done with TC offsets? |
duke@1 | 854 | if (type.name ().equals ("long long")) |
duke@1 | 855 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_longlong));"); |
duke@1 | 856 | else if (type.name ().equals ("unsigned short")) |
duke@1 | 857 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ushort));"); |
duke@1 | 858 | else if (type.name ().equals ("unsigned long")) |
duke@1 | 859 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ulong));"); |
duke@1 | 860 | else if (type.name ().equals ("unsigned long long")) |
duke@1 | 861 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_ulonglong));"); |
duke@1 | 862 | else |
duke@1 | 863 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().get_primitive_tc (org.omg.CORBA.TCKind.tk_" + type.name () + "));"); |
duke@1 | 864 | } |
duke@1 | 865 | else if (type instanceof StringEntry) |
duke@1 | 866 | { |
duke@1 | 867 | StringEntry s = (StringEntry)type; |
duke@1 | 868 | Expression e = s.maxSize (); |
duke@1 | 869 | if (e == null) |
duke@1 | 870 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().create_" + type.name () + "_tc (" + Util.parseExpression (e) + "));"); |
duke@1 | 871 | else |
duke@1 | 872 | stream.println (indent + name + " (org.omg.CORBA.ORB.init ().create_" + type.name () + "_tc (0));"); |
duke@1 | 873 | } |
duke@1 | 874 | else |
duke@1 | 875 | stream.println (indent + name + '(' + Util.helperName (type, true) + ".type ());"); // <d61056> |
duke@1 | 876 | } // writeType |
duke@1 | 877 | |
duke@1 | 878 | /** |
duke@1 | 879 | * |
duke@1 | 880 | **/ |
duke@1 | 881 | private void writeExtract (String indent, String target, String source, SymtabEntry type, PrintWriter stream) |
duke@1 | 882 | { |
duke@1 | 883 | if (type instanceof PrimitiveEntry) |
duke@1 | 884 | { |
duke@1 | 885 | if (type.name ().equals ("long long")) |
duke@1 | 886 | stream.println (indent + target + " = " + source + ".extract_longlong ();"); |
duke@1 | 887 | else if (type.name ().equals ("unsigned short")) |
duke@1 | 888 | stream.println (indent + target + " = " + source + ".extract_ushort ();"); |
duke@1 | 889 | else if (type.name ().equals ("unsigned long")) |
duke@1 | 890 | stream.println (indent + target + " = " + source + ".extract_ulong ();"); |
duke@1 | 891 | else if (type.name ().equals ("unsigned long long")) |
duke@1 | 892 | stream.println (indent + target + " = " + source + ".extract_ulonglong ();"); |
duke@1 | 893 | else |
duke@1 | 894 | stream.println (indent + target + " = " + source + ".extract_" + type.name () + " ();"); |
duke@1 | 895 | } |
duke@1 | 896 | else if (type instanceof StringEntry) |
duke@1 | 897 | stream.println (indent + target + " = " + source + ".extract_" + type.name () + " ();"); |
duke@1 | 898 | else |
duke@1 | 899 | stream.println (indent + target + " = " + Util.helperName (type, true) + ".extract (" + source + ");"); // <d61056> |
duke@1 | 900 | } // writeExtract |
duke@1 | 901 | |
duke@1 | 902 | /** |
duke@1 | 903 | * |
duke@1 | 904 | **/ |
duke@1 | 905 | private String writeExtract (String source, SymtabEntry type) |
duke@1 | 906 | { |
duke@1 | 907 | String extract; |
duke@1 | 908 | if (type instanceof PrimitiveEntry) |
duke@1 | 909 | { |
duke@1 | 910 | if (type.name ().equals ("long long")) |
duke@1 | 911 | extract = source + ".extract_longlong ()"; |
duke@1 | 912 | else if (type.name ().equals ("unsigned short")) |
duke@1 | 913 | extract = source + ".extract_ushort ()"; |
duke@1 | 914 | else if (type.name ().equals ("unsigned long")) |
duke@1 | 915 | extract = source + ".extract_ulong ()"; |
duke@1 | 916 | else if (type.name ().equals ("unsigned long long")) |
duke@1 | 917 | extract = source + ".extract_ulonglong ()"; |
duke@1 | 918 | else |
duke@1 | 919 | extract = source + ".extract_" + type.name () + " ()"; |
duke@1 | 920 | } |
duke@1 | 921 | else if (type instanceof StringEntry) |
duke@1 | 922 | extract = source + ".extract_" + type.name () + " ()"; |
duke@1 | 923 | else |
duke@1 | 924 | extract = Util.helperName (type, true) + ".extract (" + source + ')'; // <d61056> |
duke@1 | 925 | return extract; |
duke@1 | 926 | } // writeExtract |
duke@1 | 927 | |
duke@1 | 928 | /** |
duke@1 | 929 | * |
duke@1 | 930 | **/ |
duke@1 | 931 | private void writeSkeletonBody () |
duke@1 | 932 | { |
duke@1 | 933 | SymtabEntry mtype = Util.typeOf (m.type ()); |
duke@1 | 934 | |
duke@1 | 935 | // If there is a return value, increment the appropriate counter |
duke@1 | 936 | stream.print (" "); |
duke@1 | 937 | if (mtype != null) |
duke@1 | 938 | stream.print ("return "); |
duke@1 | 939 | stream.print ("_impl." + m.name () + '('); |
duke@1 | 940 | |
duke@1 | 941 | // Load the parameters |
duke@1 | 942 | Enumeration parms = m.parameters ().elements (); |
duke@1 | 943 | boolean first = true; |
duke@1 | 944 | while (parms.hasMoreElements ()) |
duke@1 | 945 | { |
duke@1 | 946 | ParameterEntry parm = (ParameterEntry)parms.nextElement (); |
duke@1 | 947 | if (first) |
duke@1 | 948 | first = false; |
duke@1 | 949 | else |
duke@1 | 950 | stream.print (", "); |
duke@1 | 951 | stream.print (parm.name ()); |
duke@1 | 952 | } |
duke@1 | 953 | if (m.contexts ().size () != 0) |
duke@1 | 954 | { |
duke@1 | 955 | if (!first) |
duke@1 | 956 | stream.print (", "); |
duke@1 | 957 | stream.print ("$context"); |
duke@1 | 958 | } |
duke@1 | 959 | |
duke@1 | 960 | stream.println (");"); |
duke@1 | 961 | } // writeSkeletonBody |
duke@1 | 962 | |
duke@1 | 963 | /** |
duke@1 | 964 | * |
duke@1 | 965 | **/ |
duke@1 | 966 | protected String passType (int passType) |
duke@1 | 967 | { |
duke@1 | 968 | String type; |
duke@1 | 969 | switch (passType) |
duke@1 | 970 | { |
duke@1 | 971 | case ParameterEntry.Inout: |
duke@1 | 972 | type = "org.omg.CORBA.ARG_INOUT.value"; |
duke@1 | 973 | break; |
duke@1 | 974 | case ParameterEntry.Out: |
duke@1 | 975 | type = "org.omg.CORBA.ARG_OUT.value"; |
duke@1 | 976 | break; |
duke@1 | 977 | case ParameterEntry.In: |
duke@1 | 978 | default: |
duke@1 | 979 | type = "org.omg.CORBA.ARG_IN.value"; |
duke@1 | 980 | break; |
duke@1 | 981 | } |
duke@1 | 982 | return type; |
duke@1 | 983 | } // passType |
duke@1 | 984 | |
duke@1 | 985 | /** |
duke@1 | 986 | * This is only used by AttributeGen. The java mapping says |
duke@1 | 987 | * the names should be getXXX and setXXX, but CORBA says they |
duke@1 | 988 | * should be _get_XXX and _set_XXX. this.name () will be |
duke@1 | 989 | * getXXX. realName is set by AttributeGen to _get_XXX. |
duke@1 | 990 | **/ |
duke@1 | 991 | protected void serverMethodName (String name) |
duke@1 | 992 | { |
duke@1 | 993 | realName = (name == null) ? "" : name; |
duke@1 | 994 | } // serverMethodName |
duke@1 | 995 | |
duke@1 | 996 | /** |
duke@1 | 997 | * |
duke@1 | 998 | **/ |
duke@1 | 999 | private void writeOutputStreamWrite (String indent, String oStream, String name, SymtabEntry type, PrintWriter stream) |
duke@1 | 1000 | { |
duke@1 | 1001 | String typeName = type.name (); |
duke@1 | 1002 | stream.print (indent); |
duke@1 | 1003 | if (type instanceof PrimitiveEntry) |
duke@1 | 1004 | { |
duke@1 | 1005 | if (typeName.equals ("long long")) |
duke@1 | 1006 | stream.println (oStream + ".write_longlong (" + name +");"); |
duke@1 | 1007 | else if (typeName.equals ("unsigned short")) |
duke@1 | 1008 | stream.println (oStream + ".write_ushort (" + name + ");"); |
duke@1 | 1009 | else if (typeName.equals ("unsigned long")) |
duke@1 | 1010 | stream.println (oStream + ".write_ulong (" + name + ");"); |
duke@1 | 1011 | else if (typeName.equals ("unsigned long long")) |
duke@1 | 1012 | stream.println (oStream + ".write_ulonglong (" + name + ");"); |
duke@1 | 1013 | else |
duke@1 | 1014 | stream.println (oStream + ".write_" + typeName + " (" + name + ");"); |
duke@1 | 1015 | } |
duke@1 | 1016 | else if (type instanceof StringEntry) |
duke@1 | 1017 | stream.println (oStream + ".write_" + typeName + " (" + name + ");"); |
duke@1 | 1018 | else if (type instanceof SequenceEntry) |
duke@1 | 1019 | stream.println (oStream + ".write_" + type.type().name() + " (" + name + ");"); |
duke@1 | 1020 | else if (type instanceof ValueBoxEntry) |
duke@1 | 1021 | { |
duke@1 | 1022 | ValueBoxEntry v = (ValueBoxEntry) type; |
duke@1 | 1023 | TypedefEntry member = ((InterfaceState) v.state ().elementAt (0)).entry; |
duke@1 | 1024 | SymtabEntry mType = member.type (); |
duke@1 | 1025 | |
duke@1 | 1026 | // if write value to the boxed holder indicated by the name ending with ".value" |
duke@1 | 1027 | if (mType instanceof PrimitiveEntry && name.endsWith (".value")) |
duke@1 | 1028 | stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " // <d61056> |
duke@1 | 1029 | + " new " + Util.javaQualifiedName (type) + " (" + name + "));"); //<d60929> |
duke@1 | 1030 | else |
duke@1 | 1031 | stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); //<d60929> // <d61056> |
duke@1 | 1032 | } |
duke@1 | 1033 | else if (type instanceof ValueEntry) |
duke@1 | 1034 | stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); //<d60929> // <d61056> |
duke@1 | 1035 | else |
duke@1 | 1036 | stream.println (Util.helperName (type, true) + ".write (" + oStream + ", " + name + ");"); // <d61056> |
duke@1 | 1037 | } // writeOutputStreamWrite |
duke@1 | 1038 | |
duke@1 | 1039 | /** |
duke@1 | 1040 | * |
duke@1 | 1041 | **/ |
duke@1 | 1042 | private String writeInputStreamRead (String source, SymtabEntry type) |
duke@1 | 1043 | { |
duke@1 | 1044 | String read = ""; |
duke@1 | 1045 | if (type instanceof PrimitiveEntry) |
duke@1 | 1046 | { |
duke@1 | 1047 | if (type.name ().equals ("long long")) |
duke@1 | 1048 | read = source + ".read_longlong ()"; |
duke@1 | 1049 | else if (type.name ().equals ("unsigned short")) |
duke@1 | 1050 | read = source + ".read_ushort ()"; |
duke@1 | 1051 | else if (type.name ().equals ("unsigned long")) |
duke@1 | 1052 | read = source + ".read_ulong ()"; |
duke@1 | 1053 | else if (type.name ().equals ("unsigned long long")) |
duke@1 | 1054 | read = source + ".read_ulonglong ()"; |
duke@1 | 1055 | else |
duke@1 | 1056 | read = source + ".read_" + type.name () + " ()"; |
duke@1 | 1057 | } |
duke@1 | 1058 | else if (type instanceof StringEntry) |
duke@1 | 1059 | read = source + ".read_" + type.name () + " ()"; |
duke@1 | 1060 | else |
duke@1 | 1061 | read = Util.helperName (type, true) + ".read (" + source + ')'; // <d61056> |
duke@1 | 1062 | return read; |
duke@1 | 1063 | } // writeInputStreamRead |
duke@1 | 1064 | |
duke@1 | 1065 | /** |
duke@1 | 1066 | * |
duke@1 | 1067 | **/ |
duke@1 | 1068 | protected void writeMethodCall (String indent) |
duke@1 | 1069 | { |
duke@1 | 1070 | SymtabEntry mtype = Util.typeOf (m.type ()); |
duke@1 | 1071 | if (mtype == null) |
duke@1 | 1072 | stream.print (indent + "this." + m.name () + " ("); |
duke@1 | 1073 | else |
duke@1 | 1074 | stream.print (indent + "$result = this." + m.name () + " ("); |
duke@1 | 1075 | } // writeMethodCall |
duke@1 | 1076 | |
duke@1 | 1077 | /** |
duke@1 | 1078 | * |
duke@1 | 1079 | **/ |
duke@1 | 1080 | protected void writeCreateReply(String indent){ |
duke@1 | 1081 | stream.println(indent + "out = $rh.createReply();"); |
duke@1 | 1082 | } |
duke@1 | 1083 | |
duke@1 | 1084 | protected int methodIndex = 0; |
duke@1 | 1085 | protected String realName = ""; |
duke@1 | 1086 | protected Hashtable symbolTable = null; |
duke@1 | 1087 | protected MethodEntry m = null; |
duke@1 | 1088 | protected PrintWriter stream = null; |
duke@1 | 1089 | protected boolean localOptimization = false; |
duke@1 | 1090 | protected boolean isAbstract = false; |
duke@1 | 1091 | } // class MethodGen |