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]