src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/MethodGen.java

Sun, 05 Dec 2010 22:22:54 -0800

author
skoppar
date
Sun, 05 Dec 2010 22:22:54 -0800
changeset 236
33ca1bceec2d
parent 158
91006f157c46
child 748
6845b95cba6b
permissions
-rw-r--r--

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

mercurial