santiagopg    2003/12/23 07:34:52

  Modified:    java/src/org/apache/xalan/xsltc/compiler FunctionCall.java
               java/src/org/apache/xalan/xsltc/compiler/util
                        BooleanType.java IntType.java RealType.java
                        ReferenceType.java StringType.java
               java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
  Log:
  Type conversions from internal to external Java types revisited: (1) Type.Int 
and Type.Real are now treated identically given that the former is an 
optimization for the latter (i.e. their use should be transparent to the user) 
(2) Better support Type.Reference, conversions to integral types are now 
supported. There are still some conversions that are supported by Xalan and not 
by XSLTC. We need to either revisit the conversion table for XSLTC or document 
the differences.
  
  Revision  Changes    Path
  1.34      +42 -34    
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java
  
  Index: FunctionCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionCall.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- FunctionCall.java 19 Dec 2003 15:26:48 -0000      1.33
  +++ FunctionCall.java 23 Dec 2003 15:34:51 -0000      1.34
  @@ -207,52 +207,61 @@
            final Class nodeClass     = Class.forName("org.w3c.dom.Node");
            final Class nodeListClass = Class.forName("org.w3c.dom.NodeList");
   
  -         // Possible conversions between internal and Java types
  -         _internal2Java.put(Type.Boolean, new JavaType(Object.class,2));
  -         _internal2Java.put(Type.Boolean, new JavaType(Boolean.class,1));
  -         _internal2Java.put(Type.Boolean, new JavaType(Boolean.TYPE,0));
  +         // -- Internal to Java --------------------------------------------
  +            
  +            // Type.Boolean -> { boolean(0), Boolean(1), Object(2) }
  +         _internal2Java.put(Type.Boolean, new JavaType(Boolean.TYPE, 0));
  +         _internal2Java.put(Type.Boolean, new JavaType(Boolean.class, 1));
  +         _internal2Java.put(Type.Boolean, new JavaType(Object.class, 2));
   
  -         _internal2Java.put(Type.Int, new JavaType(Object.class, 8));
  -         _internal2Java.put(Type.Int, new JavaType(Character.TYPE, 7));
  -         _internal2Java.put(Type.Int, new JavaType(Byte.TYPE, 6));
  -         _internal2Java.put(Type.Int, new JavaType(Short.TYPE, 5));
  -         _internal2Java.put(Type.Int, new JavaType(Integer.TYPE, 0));
  -         _internal2Java.put(Type.Int, new JavaType(Integer.class, 1));
  -         _internal2Java.put(Type.Int, new JavaType(Long.TYPE, 2));
  -         _internal2Java.put(Type.Int, new JavaType(Float.TYPE, 3));
  -         _internal2Java.put(Type.Int, new JavaType(Double.TYPE, 4));
  -
  -         _internal2Java.put(Type.Real, new JavaType(Object.class, 8));
  -         _internal2Java.put(Type.Real, new JavaType(Character.TYPE, 7)); 
  -         _internal2Java.put(Type.Real, new JavaType(Byte.TYPE, 6));
  -         _internal2Java.put(Type.Real, new JavaType(Short.TYPE, 5));
  -         _internal2Java.put(Type.Real, new JavaType(Integer.TYPE, 4));
  -         _internal2Java.put(Type.Real, new JavaType(Long.TYPE, 3));
  -         _internal2Java.put(Type.Real, new JavaType(Float.TYPE, 2));
  -         _internal2Java.put(Type.Real, new JavaType(Double.class, 1));
  +            // Type.Real -> { double(0), Double(1), float(2), long(3), 
int(4),
  +            //                short(5), byte(6), char(7), Object(8) }
            _internal2Java.put(Type.Real, new JavaType(Double.TYPE, 0));
  -
  -         _internal2Java.put(Type.String, new JavaType(Object.class, 1));
  +         _internal2Java.put(Type.Real, new JavaType(Double.class, 1));
  +         _internal2Java.put(Type.Real, new JavaType(Float.TYPE, 2));
  +         _internal2Java.put(Type.Real, new JavaType(Long.TYPE, 3));
  +         _internal2Java.put(Type.Real, new JavaType(Integer.TYPE, 4));
  +         _internal2Java.put(Type.Real, new JavaType(Short.TYPE, 5));
  +         _internal2Java.put(Type.Real, new JavaType(Byte.TYPE, 6));
  +         _internal2Java.put(Type.Real, new JavaType(Character.TYPE, 7)); 
  +         _internal2Java.put(Type.Real, new JavaType(Object.class, 8));
  +            
  +            // Type.Int must be the same as Type.Real
  +         _internal2Java.put(Type.Int, new JavaType(Double.TYPE, 0));
  +         _internal2Java.put(Type.Int, new JavaType(Double.class, 1));
  +         _internal2Java.put(Type.Int, new JavaType(Float.TYPE, 2));
  +         _internal2Java.put(Type.Int, new JavaType(Long.TYPE, 3));
  +         _internal2Java.put(Type.Int, new JavaType(Integer.TYPE, 4));
  +         _internal2Java.put(Type.Int, new JavaType(Short.TYPE, 5));
  +         _internal2Java.put(Type.Int, new JavaType(Byte.TYPE, 6));
  +         _internal2Java.put(Type.Int, new JavaType(Character.TYPE, 7)); 
  +         _internal2Java.put(Type.Int, new JavaType(Object.class, 8));
  +            
  +            // Type.String -> { String(0), Object(1) }
            _internal2Java.put(Type.String, new JavaType(String.class, 0)); 
  +         _internal2Java.put(Type.String, new JavaType(Object.class, 1));
   
  +            // Type.NodeSet -> { NodeList(0), Node(1), Object(2), String(3), 
int(10) }
  +         _internal2Java.put(Type.NodeSet, new JavaType(nodeListClass, 0)); 
  +         _internal2Java.put(Type.NodeSet, new JavaType(nodeClass, 1)); 
  +         _internal2Java.put(Type.NodeSet, new JavaType(Object.class, 2));
  +         _internal2Java.put(Type.NodeSet, new JavaType(String.class, 3)); 
  +         _internal2Java.put(Type.NodeSet, new JavaType(Integer.TYPE, 10));
  +
  +            // Type.Node -> { Node(0), NodeList(1), Object(2), String(3) }
            _internal2Java.put(Type.Node, new JavaType(nodeClass, 0));  
            _internal2Java.put(Type.Node, new JavaType(nodeListClass, 1));
            _internal2Java.put(Type.Node, new JavaType(Object.class, 2));
            _internal2Java.put(Type.Node, new JavaType(String.class, 3));
   
  -         _internal2Java.put(Type.NodeSet, new JavaType(Integer.TYPE, 10));
  -         _internal2Java.put(Type.NodeSet, new JavaType(String.class, 3)); 
  -         _internal2Java.put(Type.NodeSet, new JavaType(Object.class, 2));
  -         _internal2Java.put(Type.NodeSet, new JavaType(nodeClass, 1)); 
  -         _internal2Java.put(Type.NodeSet, new JavaType(nodeListClass,0)); 
  -
  -         _internal2Java.put(Type.ResultTree, new JavaType(nodeClass, 1)); 
  +            // Type.ResultTree -> { NodeList(0), Node(1), Object(2), 
String(3), double(4) }
            _internal2Java.put(Type.ResultTree, new JavaType(nodeListClass, 0));
  +         _internal2Java.put(Type.ResultTree, new JavaType(nodeClass, 1)); 
            _internal2Java.put(Type.ResultTree, new JavaType(Object.class, 2));
            _internal2Java.put(Type.ResultTree, new JavaType(String.class, 3));
            _internal2Java.put(Type.ResultTree, new JavaType(Double.TYPE, 4));
   
  -         _internal2Java.put(Type.Reference, new JavaType(Object.class,0));
  +         _internal2Java.put(Type.Reference, new JavaType(Object.class, 0));
   
            // Possible conversions between Java and internal types
            _java2Internal.put(Boolean.TYPE, Type.Boolean); 
  @@ -603,7 +612,6 @@
        int bestMethodDistance  = Integer.MAX_VALUE;
        _type = null;                       // reset internal type 
        for (int j, i = 0; i < nMethods; i++) {
  -
            // Check if all paramteters to this method can be converted
            final Method method = (Method)methods.elementAt(i);
            final Class[] paramTypes = method.getParameterTypes();
  
  
  
  1.7       +2 -1      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/BooleanType.java
  
  Index: BooleanType.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/BooleanType.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- BooleanType.java  30 Jan 2003 18:46:09 -0000      1.6
  +++ BooleanType.java  23 Dec 2003 15:34:51 -0000      1.7
  @@ -191,6 +191,7 @@
        if (clazz == java.lang.Boolean.TYPE) {
            methodGen.getInstructionList().append(NOP);
        }
  +        // Is Boolean <: clazz? I.e. clazz in { Boolean, Object }
           else if (clazz.isAssignableFrom(java.lang.Boolean.class)) {
               translateTo(classGen, methodGen, Type.Reference);
           }
  
  
  
  1.7       +5 -4      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/IntType.java
  
  Index: IntType.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/IntType.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- IntType.java      30 Jan 2003 18:46:09 -0000      1.6
  +++ IntType.java      23 Dec 2003 15:34:51 -0000      1.7
  @@ -221,7 +221,6 @@
                                                     "<init>", "(I)V")));
       }
   
  -
       /**
        * Translates an integer into the Java type denoted by 
<code>clazz</code>. 
        * Expects an integer on the stack and pushes a number of the appropriate
  @@ -251,8 +250,10 @@
        else if (clazz == Double.TYPE) {
            il.append(I2D);
        }
  -        else if (clazz.isAssignableFrom(java.lang.Integer.class)) {
  -            translateTo(classGen, methodGen, Type.Reference);   
  +         // Is Double <: clazz? I.e. clazz in { Double, Number, Object }
  +       else if (clazz.isAssignableFrom(java.lang.Double.class)) {
  +           il.append(I2D);
  +           Type.Real.translateTo(classGen, methodGen, Type.Reference);
           }
        else {
            ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
  
  
  
  1.7       +2 -1      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/RealType.java
  
  Index: RealType.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/RealType.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- RealType.java     30 Jan 2003 18:46:09 -0000      1.6
  +++ RealType.java     23 Dec 2003 15:34:51 -0000      1.7
  @@ -273,6 +273,7 @@
        else if (clazz == Double.TYPE) {
            il.append(NOP);
        }
  +        // Is Double <: clazz? I.e. clazz in { Double, Number, Object }
           else if (clazz.isAssignableFrom(java.lang.Double.class)) {
               translateTo(classGen, methodGen, Type.Reference);
           }
  
  
  
  1.17      +57 -3     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/ReferenceType.java
  
  Index: ReferenceType.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/ReferenceType.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- ReferenceType.java        1 Apr 2003 21:12:39 -0000       1.16
  +++ ReferenceType.java        23 Dec 2003 15:34:51 -0000      1.17
  @@ -264,14 +264,39 @@
        final ConstantPoolGen cpg = classGen.getConstantPool();
        final InstructionList il = methodGen.getInstructionList();
   
  +        int referenceToLong = cpg.addMethodref(BASIS_LIBRARY_CLASS, 
  +                                               "referenceToLong", 
  +                                               "(" + OBJECT_SIG + ")J");
  +        int referenceToDouble = cpg.addMethodref(BASIS_LIBRARY_CLASS, 
  +                                                 "referenceToDouble", 
  +                                                "(" + OBJECT_SIG + ")D");    
  
  +        int referenceToBoolean = cpg.addMethodref(BASIS_LIBRARY_CLASS, 
  +                                                  "referenceToBoolean", 
  +                                                 "(" + OBJECT_SIG + ")Z");
  +        
        if (clazz.getName().equals("java.lang.Object")) {
            il.append(NOP);
        }
        else if (clazz == Double.TYPE) {
  -         translateTo(classGen, methodGen, Type.Real);
  +         il.append(new INVOKESTATIC(referenceToDouble));
  +     }
  +     else if (clazz.getName().equals("java.lang.Double")) {
  +         il.append(new INVOKESTATIC(referenceToDouble));
  +            Type.Real.translateTo(classGen, methodGen, Type.Reference);
  +     }
  +     else if (clazz == Float.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToDouble));
  +            il.append(D2F);
        }
        else if (clazz.getName().equals("java.lang.String")) {
  -         translateTo(classGen, methodGen, Type.String);
  +         int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, 
"referenceToString",
  +                                      "("
  +                                      + OBJECT_SIG
  +                                      + DOM_INTF_SIG
  +                                      + ")"
  +                                      + "Ljava/lang/String;");
  +         il.append(methodGen.loadDOM());
  +         il.append(new INVOKESTATIC(index));
        }
        else if (clazz.getName().equals("org.w3c.dom.Node")) {
            int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "referenceToNode",
  @@ -295,6 +320,35 @@
        }
        else if (clazz.getName().equals("org.apache.xalan.xsltc.DOM")) {
            translateTo(classGen, methodGen, Type.ResultTree);
  +     }
  +     else if (clazz == Long.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToLong));
  +        }
  +     else if (clazz == Integer.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToLong));
  +            il.append(L2I);
  +     }
  +        else if (clazz == Short.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToLong));
  +            il.append(L2I);
  +            il.append(I2S);
  +        }
  +        else if (clazz == Byte.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToLong));
  +            il.append(L2I);
  +            il.append(I2B);
  +        }
  +        else if (clazz == Character.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToLong));
  +            il.append(L2I);
  +            il.append(I2C);
  +        }
  +     else if (clazz == java.lang.Boolean.TYPE) {
  +         il.append(new INVOKESTATIC(referenceToBoolean));
  +     }
  +     else if (clazz.getName().equals("java.lang.Boolean")) {
  +         il.append(new INVOKESTATIC(referenceToBoolean));
  +            Type.Boolean.translateTo(classGen, methodGen, Type.Reference);
        }
        else {
            ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
  
  
  
  1.11      +2 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/StringType.java
  
  Index: StringType.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/util/StringType.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- StringType.java   17 Oct 2003 17:15:15 -0000      1.10
  +++ StringType.java   23 Dec 2003 15:34:51 -0000      1.11
  @@ -196,8 +196,8 @@
       public void translateTo(ClassGenerator classGen, MethodGenerator 
methodGen, 
                            Class clazz) 
       {
  +        // Is String <: clazz? I.e. clazz in { String, Object }
           if (clazz.isAssignableFrom(java.lang.String.class)) {
  -         // same internal representation
            methodGen.getInstructionList().append(NOP);
        }
        else {
  
  
  
  1.67      +71 -5     
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/BasisLibrary.java
  
  Index: BasisLibrary.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/BasisLibrary.java,v
  retrieving revision 1.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- BasisLibrary.java 19 Dec 2003 17:37:55 -0000      1.66
  +++ BasisLibrary.java 23 Dec 2003 15:34:51 -0000      1.67
  @@ -979,7 +979,7 @@
        }
        else {
            final String className = obj.getClass().getName();
  -         runTimeError(DATA_CONVERSION_ERR, "reference", className);
  +         runTimeError(DATA_CONVERSION_ERR, className, "node-set");
            return null;
        }
       }
  @@ -998,7 +998,8 @@
           }
        else {
            final String className = obj.getClass().getName();
  -         runTimeError(DATA_CONVERSION_ERR, "reference", className);
  +         runTimeError(DATA_CONVERSION_ERR, className, 
  +                "org.w3c.dom.NodeList");
            return null;
        }
       }
  @@ -1018,11 +1019,76 @@
           }
        else {
            final String className = obj.getClass().getName();
  -         runTimeError(DATA_CONVERSION_ERR, "reference", className);
  +         runTimeError(DATA_CONVERSION_ERR, className, "org.w3c.dom.Node");
            return null;
        }
       }
  -    
  +   
  +    /**
  +     * Utility function: used to convert reference to long.
  +     */
  +    public static long referenceToLong(Object obj) {
  +        if (obj instanceof Number) {
  +            return ((Number) obj).longValue();    // handles Integer and 
Double
  +        }
  +        else {
  +         final String className = obj.getClass().getName();
  +         runTimeError(DATA_CONVERSION_ERR, className, Long.TYPE);
  +         return 0;
  +        }
  +    }
  +            
  +    /**
  +     * Utility function: used to convert reference to double.
  +     */
  +    public static double referenceToDouble(Object obj) {
  +        if (obj instanceof Number) {
  +            return ((Number) obj).doubleValue();   // handles Integer and 
Double
  +        }
  +        else {
  +         final String className = obj.getClass().getName();
  +         runTimeError(DATA_CONVERSION_ERR, className, Double.TYPE);
  +         return 0;
  +        }
  +    }
  +
  +    /**
  +     * Utility function: used to convert reference to boolean.
  +     */
  +    public static boolean referenceToBoolean(Object obj) {
  +        if (obj instanceof Boolean) {
  +            return ((Boolean) obj).booleanValue();
  +        }
  +        else {
  +         final String className = obj.getClass().getName();
  +         runTimeError(DATA_CONVERSION_ERR, className, Boolean.TYPE);
  +         return false;
  +        }
  +    }
  +
  +    /**
  +     * Utility function: used to convert reference to String.
  +     */
  +    public static String referenceToString(Object obj, DOM dom) {
  +        if (obj instanceof String) {
  +            return (String) obj;
  +        }
  +        else if (obj instanceof DTMAxisIterator) {
  +         return dom.getStringValueX(((DTMAxisIterator)obj).reset().next());
  +     }
  +     else if (obj instanceof Node) {
  +         return dom.getStringValueX(((Node)obj).node);
  +     }
  +     else if (obj instanceof DOM) {
  +         return ((DOM) obj).getStringValue();
  +     }
  +        else {
  +         final String className = obj.getClass().getName();
  +         runTimeError(DATA_CONVERSION_ERR, className, String.class);
  +         return null;
  +        }
  +    }
  +
       /**
        * Utility function used to convert a w3c Node into an internal DOM 
iterator. 
        */
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to