You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sa...@apache.org on 2002/11/26 17:00:35 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java

santiagopg    2002/11/26 08:00:35

  Modified:    java/src/org/apache/xalan/xsltc/compiler Constants.java
                        Sort.java
               java/src/org/apache/xalan/xsltc/dom NodeSortRecord.java
  Log:
  Changed the NodeSortRecord class to hold non-static references to
  instances of java.text.Collator and java.util.Locale. Updated the
  bytecode generation for NodeSortRecord subclasses to access the new
  variables correctly. When a stylesheet specifies a different language
  in xsl:sort, the protected references in NodeSortRecord will be
  updated by the subclass' constructor.
  
  Revision  Changes    Path
  1.29      +3 -1      xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Constants.java,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- Constants.java	8 Oct 2002 21:44:13 -0000	1.28
  +++ Constants.java	26 Nov 2002 16:00:34 -0000	1.29
  @@ -165,6 +165,8 @@
   	= "Lorg/apache/xalan/xsltc/dom/NodeSortRecord;";
       public static final String NODE_SORT_FACTORY_SIG
   	= "Lorg/apache/xalan/xsltc/dom/NodeSortRecordFactory;";
  +    public static final String LOCALE_SIG 
  +	= "Ljava/util/Locale;";
       public static final String STRING_VALUE_HANDLER
   	= "org.apache.xalan.xsltc.runtime.StringValueHandler";
       public static final String STRING_VALUE_HANDLER_SIG 
  
  
  
  1.17      +38 -69    xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Sort.java
  
  Index: Sort.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Sort.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Sort.java	26 Aug 2002 16:03:00 -0000	1.16
  +++ Sort.java	26 Nov 2002 16:00:34 -0000	1.17
  @@ -560,46 +560,38 @@
   	    }
   	}
   
  -	Method clinit = compileClassInit(sortObjects, sortRecord,
  +	Method init = compileInit(sortObjects, sortRecord,
   					 cpg, className);
   	Method extract = compileExtract(sortObjects, sortRecord,
   					cpg, className);
  -	sortRecord.addMethod(clinit);
  -	sortRecord.addEmptyConstructor(ACC_PUBLIC);
  +	sortRecord.addMethod(init);
   	sortRecord.addMethod(extract);
   
  -	// Overload NodeSortRecord.getCollator() only if needed
  -	for (int i = 0; i < sortObjects.size(); i++) {
  -	    if (((Sort)(sortObjects.elementAt(i)))._lang != null) {
  -		sortRecord.addMethod(compileGetCollator(sortObjects,
  -							sortRecord,
  -							cpg,
  -							className));
  -		i = sortObjects.size();
  -	    }
  -	}
  -	
   	xsltc.dumpClass(sortRecord.getJavaClass());
   	return className;
       }
   
       /**
  -     * Create a class constructor for the new class. All this constructor does
  -     * is to initialize a couple of tables that contain information on sort
  -     * order and sort type. These static tables cannot be in the parent class.
  +     * Create a constructor for the new class. Updates the reference to the 
  +     * collator in the super calls only when the stylesheet specifies a new
  +     * language in xsl:sort.
        */
  -    private static Method compileClassInit(Vector sortObjects,
  +    private static Method compileInit(Vector sortObjects,
   					   NodeSortRecordGenerator sortRecord,
   					   ConstantPoolGen cpg,
  -					   String className) {
  -	// Class initializer - void NodeSortRecord.<clinit>();
  +					   String className) 
  +    {
   	final InstructionList il = new InstructionList();
  -	final CompareGenerator classInit =
  -	    new CompareGenerator(ACC_PUBLIC | ACC_STATIC,
  -				 org.apache.bcel.generic.Type.VOID, 
  -				 new org.apache.bcel.generic.Type[] { },
  -				 new String[] { },
  -				 "<clinit>", className, il, cpg);
  +	final MethodGenerator init = 
  +	    new MethodGenerator(ACC_PUBLIC, 
  +				org.apache.bcel.generic.Type.VOID, 
  +				null, null, "<init>", className, 
  +				il, cpg);
  +
  +	// Call the constructor in the NodeSortRecord superclass
  +	il.append(ALOAD_0);
  +	il.append(new INVOKESPECIAL(cpg.addMethodref(NODE_SORT_RECORD,
  +						     "<init>", "()V")));
   
   	final int initLocale =  cpg.addMethodref("java/util/Locale",
   						 "<init>",
  @@ -628,41 +620,50 @@
   	Sort sort = (Sort)sortObjects.elementAt(0);
   
   	for (int level = 0; level < levels; level++) {
  -	    if (language == null && sort._lang != null)
  +	    if (language == null && sort._lang != null) {
   		language = sort._lang;
  -	    if (country == null && sort._country != null)
  +	    }
  +	    if (country == null && sort._country != null) {
   		country = sort._country;
  +	    }
   	}
   
  -	// Get index to private static reference in NodeSortRecrd
   	final int collator =
   	    cpg.addFieldref(className, "_collator", COLLATOR_SIG);
  +	final int locale =
  +	    cpg.addFieldref(className, "_locale", LOCALE_SIG);
   
   	if (language != null) {
   	    // Create new Locale object on stack
   	    il.append(new NEW(cpg.addClass("java/util/Locale")));
   	    il.append(DUP);
  +	    il.append(DUP);
   	    il.append(new PUSH(cpg, language));
   	    il.append(new PUSH(cpg, (country != null ? country : EMPTYSTRING)));
   	    il.append(new INVOKESPECIAL(initLocale));
  +	    il.append(ALOAD_0);
  +	    il.append(SWAP);
  +	    il.append(new PUTFIELD(locale));
   	    
   	    // Use that Locale object to get the required Collator object
   	    il.append(new INVOKESTATIC(getCollator));
  -	    il.append(new PUTSTATIC(collator));
  +	    il.append(ALOAD_0);
  +	    il.append(SWAP);
  +	    il.append(new PUTFIELD(collator));
   	}
   
  -	il.append(new GETSTATIC(collator));
  +	il.append(ALOAD_0);
  +	il.append(new GETFIELD(collator));
   	il.append(new ICONST(Collator.TERTIARY));
   	il.append(new INVOKEVIRTUAL(setStrength));
   
   	il.append(RETURN);
   
  -	classInit.stripAttributes(true);
  -	classInit.setMaxLocals();
  -	classInit.setMaxStack();
  -	classInit.removeNOPs();
  +	init.stripAttributes(true);
  +	init.setMaxLocals();
  +	init.setMaxStack();
   
  -	return classInit.getMethod();
  +	return init.getMethod();
       }
   
   
  @@ -732,37 +733,5 @@
   	extractMethod.removeNOPs();
   
   	return extractMethod.getMethod();
  -    }
  -
  -    /**
  -     * Compiles a method that overloads NodeSortRecord.getCollator()
  -     * This method is only compiled if the "lang" attribute is used.
  -     */
  -    private static Method compileGetCollator(Vector sortObjects,
  -					     NodeSortRecordGenerator sortRecord,
  -					     ConstantPoolGen cpg,
  -					     String className) {
  -	final InstructionList il = new InstructionList();
  -	// Collator NodeSortRecord.getCollator();
  -	final MethodGenerator getCollator =
  -	    new MethodGenerator(ACC_PUBLIC | ACC_FINAL,
  -				Util.getJCRefType(COLLATOR_SIG),
  -				new org.apache.bcel.generic.Type[] {},
  -				new String[] { },
  -				"getCollator", className, il, cpg);
  -
  -	// Get index to private static reference in NodeSortRecrd
  -	final int collator =
  -	    cpg.addFieldref(className, "collator", COLLATOR_SIG);
  -	// Feck the Collator object on the stack and return it
  -	il.append(new GETSTATIC(collator));
  -	il.append(ARETURN);
  -
  -	getCollator.stripAttributes(true);
  -	getCollator.setMaxLocals();
  -	getCollator.setMaxStack();
  -	getCollator.removeNOPs();
  -
  -	return getCollator.getMethod();
       }
   }
  
  
  
  1.9       +13 -2     xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecord.java
  
  Index: NodeSortRecord.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecord.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- NodeSortRecord.java	29 Nov 2001 09:49:35 -0000	1.8
  +++ NodeSortRecord.java	26 Nov 2002 16:00:35 -0000	1.9
  @@ -65,6 +65,7 @@
   package org.apache.xalan.xsltc.dom;
   
   import java.util.Vector;
  +import java.util.Locale;
   import java.text.Collator;
   import java.text.CollationKey;
   
  @@ -81,7 +82,17 @@
       public static int COMPARE_ASCENDING  = 0;
       public static int COMPARE_DESCENDING = 1;
   
  -    protected static Collator _collator = Collator.getInstance();
  +    /**
  +     * A reference to a locale. May be updated by subclass if the stylesheet
  +     * specifies a different language.
  +     */
  +    protected Locale _locale = Locale.getDefault();
  +
  +    /**
  +     * A reference to a collator. May be updated by subclass if the stylesheet
  +     * specifies a different language (will be updated iff _locale is updated).
  +     */
  +    protected Collator _collator = Collator.getInstance();
   
       protected int   _levels = 1;
       protected int[] _compareType;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org