|
Description
|
A DESCRIPTION OF THE FIX :
Bug Description : idlj generates wrong code for helper of union with multiple labels per branch
Subset of Releases affected : 1.4.2, 1.5.0, Mustang b65.
Platforms affected : all
Test case : See Test case section.
Diff baseline : Mustang b65
Diff :
--- j2se/src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/UnionGen.java.prev Mon Dec 12 10:30:26 2005
+++ j2se/src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/UnionGen.java Thu Jan 05 12:47:13 2006
@@ -565,116 +565,119 @@
public int helperType (int index, String indent, TCOffsets tcoffsets,
String name, SymtabEntry entry, PrintWriter stream)
{
TCOffsets innerOffsets = new TCOffsets ();
UnionEntry u = (UnionEntry)entry;
String discTypeCode = "_disTypeCode" + index;
String membersName = "_members" + index;
// Build discriminator tc
stream.println (indent + "org.omg.CORBA.TypeCode " + discTypeCode + ';');
index = ((JavaGenerator)u.type ().generator ()).type (index + 1, indent,
innerOffsets, discTypeCode, u.type (), stream);
tcoffsets.bumpCurrentOffset (innerOffsets.currentOffset ());
stream.println (indent + "org.omg.CORBA.UnionMember[] " + membersName +
" = new org.omg.CORBA.UnionMember [" + unionLabelSize(u) + "];");
String tcOfMembers = "_tcOf" + membersName;
String anyOfMembers = "_anyOf" + membersName;
stream.println (indent + "org.omg.CORBA.TypeCode " + tcOfMembers + ';');
stream.println (indent + "org.omg.CORBA.Any " + anyOfMembers + ';');
innerOffsets = new TCOffsets ();
innerOffsets.set (entry);
int offsetForUnion = innerOffsets.currentOffset ();
+ int labelIndex = 0;
for (int i = 0; i < u.branches ().size (); ++i) {
UnionBranch branch = (UnionBranch)u.branches ().elementAt (i);
TypedefEntry member = branch.typedef;
Vector labels = branch.labels;
String memberName = Util.stripLeadingUnderscores (member.name ());
if (labels.size() == 0) {
stream.println ();
stream.println (indent + "// Branch for " + memberName +
" (Default case)" );
SymtabEntry utype = Util.typeOf (u.type ());
stream.println (indent + anyOfMembers + " = org.omg.CORBA.ORB.init ().create_any ();");
// For default member, label is the zero octet (per CORBA spec.)
stream.println (indent + anyOfMembers + ".insert_octet ((byte)0); // default member label");
// Build typecode
innerOffsets.bumpCurrentOffset (4); // label value
index = ((JavaGenerator)member.generator ()).type (index, indent, innerOffsets, tcOfMembers, member, stream);
int offsetSoFar = innerOffsets.currentOffset ();
innerOffsets = new TCOffsets ();
innerOffsets.set (entry);
innerOffsets.bumpCurrentOffset (offsetSoFar - offsetForUnion);
// Build union member
- stream.println (indent + membersName + '[' + i + "] = new org.omg.CORBA.UnionMember (");
+ stream.println (indent + membersName + '[' + labelIndex + "] = new org.omg.CORBA.UnionMember (");
stream.println (indent + " \"" + memberName + "\",");
stream.println (indent + " " + anyOfMembers + ',');
stream.println (indent + " " + tcOfMembers + ',');
stream.println (indent + " null);");
+ ++labelIndex;
} else {
Enumeration enumeration = labels.elements() ;
while (enumeration.hasMoreElements()) {
Expression expr = (Expression)(enumeration.nextElement()) ;
String elem = Util.parseExpression( expr ) ;
stream.println ();
stream.println (indent + "// Branch for " + memberName +
" (case label " + elem + ")" );
SymtabEntry utype = Util.typeOf (u.type ());
// Build any
stream.println (indent + anyOfMembers + " = org.omg.CORBA.ORB.init ().create_any ();");
if (utype instanceof PrimitiveEntry)
stream.println (indent + anyOfMembers + ".insert_" +
Util.collapseName (utype.name ()) + " ((" + Util.javaName (utype) +
')' + elem + ");");
else { // it must be enum
String enumClass = Util.javaName (utype);
stream.println (indent + Util.helperName (utype, false) + ".insert (" +
anyOfMembers + ", " + enumClass + '.' + elem + ");"); // <d61056>
}
// Build typecode
innerOffsets.bumpCurrentOffset (4); // label value
index = ((JavaGenerator)member.generator ()).type (index, indent, innerOffsets, tcOfMembers, member, stream);
int offsetSoFar = innerOffsets.currentOffset ();
innerOffsets = new TCOffsets ();
innerOffsets.set (entry);
innerOffsets.bumpCurrentOffset (offsetSoFar - offsetForUnion);
// Build union member
- stream.println (indent + membersName + '[' + i + "] = new org.omg.CORBA.UnionMember (");
+ stream.println (indent + membersName + '[' + labelIndex + "] = new org.omg.CORBA.UnionMember (");
stream.println (indent + " \"" + memberName + "\",");
stream.println (indent + " " + anyOfMembers + ',');
stream.println (indent + " " + tcOfMembers + ',');
stream.println (indent + " null);");
+ ++labelIndex;
}
}
}
tcoffsets.bumpCurrentOffset (innerOffsets.currentOffset ());
// Build create_union_tc
stream.println (indent + name + " = org.omg.CORBA.ORB.init ().create_union_tc (" +
Util.helperName (u, true) + ".id (), \"" + entry.name () + "\", " +
discTypeCode + ", " + membersName + ");");
return index;
} // helperType
public int type (int index, String indent, TCOffsets tcoffsets, String name,
SymtabEntry entry, PrintWriter stream)
{
stream.println (indent + name + " = " + Util.helperName (entry, true) + ".type ();");
return index;
}
public void helperRead (String entryName, SymtabEntry entry, PrintWriter stream)
{
stream.println (" " + entryName + " value = new " + entryName + " ();");
read (0, " ", "value", entry, stream);
JUnit TESTCASE :
// tst/i.idl
union U switch(long) {
case 0: long x;
// a branch with multiple labels
case 1: case 3: long y;
default: long z;
};
// tst/Main.java
import junit.framework.TestCase;
public class Main extends TestCase {
public static void main(String[] args) {
junit.textui.TestRunner.run(Main.class);
}
public void test() {
// malformed *Helper for union with more than one label per branch
// throws NullPointerException while getting TypeCode
UHelper.type();
}
}
// test.cmd
@echo off
%JDK6_HOME%\bin\idlj -td tst tst/1.idl
%JDK6_HOME%\bin\javac -classpath %JUNIT_JAR% tst/*.java
%JDK6_HOME%\bin\java -classpath %JUNIT_JAR%;tst Main
Posted Date : 2006-01-07 04:15:31.0
|