Java Solaris Communities Sun Store Join SDN My Profile Why Join?
 
Bug Database
Bug Detail
Quick Lists
Top 25 Bugs
Top 25 RFE's
Recently Closed Bugs
Printable Page Printable Page


Bug Database
Bug ID: 6369913
Votes 1
Synopsis idlj generates wrong code for helper of union with multiple labels per branch
Category idl:other
Reported Against
Release Fixed
State 11-Closed, Will Not Fix, bug
Priority: 3-Medium
Related Bugs
Submit Date 07-JAN-2006
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
Work Around
N/A
Evaluation
Contribution-forum:https://jdk-collaboration.dev.java.net/servlets/ProjectForumMessageView?forumID=1463&messageID=10782
Posted Date : 2006-01-07 04:28:35.0

The fix provided in the description is probably adequate.
Posted Date : 2006-08-12 05:44:53.0
Comments
  
  Include a link with my name & email   


PLEASE NOTE: JDK6 is formerly known as Project Mustang