You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mo...@apache.org on 2001/06/29 14:04:38 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler Choose.java ElementAvailableCall.java FunctionAvailableCall.java Parser.java When.java
morten 01/06/29 05:04:37
Modified: java/src/org/apache/xalan/xsltc/compiler Choose.java
ElementAvailableCall.java
FunctionAvailableCall.java Parser.java When.java
Log:
Fix for element-available() and function-available() calls. Ties these
calls to tables in the XSL parser and the symbol-table (the actual
implementation) instead of using redundant and not-up-to-date tables
in the classes that implement the X-avaiable() calls.
I also cleaned up the Choose call so that it now properly handles
all types of function calls in the xsl:when elements' test clause.
Revision Changes Path
1.3 +15 -6 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Choose.java
Index: Choose.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Choose.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Choose.java 2001/06/11 12:03:29 1.2
+++ Choose.java 2001/06/29 12:04:33 1.3
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Choose.java,v 1.2 2001/06/11 12:03:29 morten Exp $
+ * @(#)$Id: Choose.java,v 1.3 2001/06/29 12:04:33 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -149,13 +149,22 @@
InstructionHandle truec = il.getEnd();
- if (nextElement != null)
+ if (nextElement != null)
nextElement.setTarget(il.append(NOP));
test.translateDesynthesized(classGen, methodGen);
- if ((test instanceof FunctionCall) &&
- !(test instanceof ElementAvailableCall) &&
- !(test instanceof ContainsCall))
- test._falseList.add(il.append(new IFEQ(null)));
+
+ if (test instanceof FunctionCall) {
+ FunctionCall call = (FunctionCall)test;
+ try {
+ Type type = call.typeCheck(getParser().getSymbolTable());
+ if (type != Type.Boolean) {
+ test._falseList.add(il.append(new IFEQ(null)));
+ }
+ }
+ catch (TypeCheckError e) {
+ // handled later!
+ }
+ }
// remember end of condition
truec = il.getEnd();
1.2 +4 -37 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ElementAvailableCall.java
Index: ElementAvailableCall.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ElementAvailableCall.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ElementAvailableCall.java 2001/04/17 18:51:26 1.1
+++ ElementAvailableCall.java 2001/06/29 12:04:34 1.2
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: ElementAvailableCall.java,v 1.1 2001/04/17 18:51:26 sboag Exp $
+ * @(#)$Id: ElementAvailableCall.java,v 1.2 2001/06/29 12:04:34 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -70,31 +70,7 @@
import org.apache.xalan.xsltc.compiler.util.*;
final class ElementAvailableCall extends FunctionCall {
- static HashSet AvailableElements = new HashSet();
- static {
- // AvailableElements.add("apply-imports");
- AvailableElements.add("apply-templates");
- AvailableElements.add("attribute");
- AvailableElements.add("call-template");
- AvailableElements.add("choose");
- AvailableElements.add("comment");
- AvailableElements.add("copy");
- AvailableElements.add("copy-of");
- AvailableElements.add("element");
- // AvailableElements.add("fallback");
- AvailableElements.add("for-each");
- AvailableElements.add("preserve-space");
- AvailableElements.add("strip-space");
- AvailableElements.add("if");
- AvailableElements.add("message");
- AvailableElements.add("number");
- AvailableElements.add("processing-instruction");
- AvailableElements.add("text");
- AvailableElements.add("value-of");
- AvailableElements.add("variable");
- }
-
public ElementAvailableCall(QName fname, Vector arguments) {
super(fname, arguments);
}
@@ -113,19 +89,10 @@
* Returns the result that this function will return
*/
public boolean getResult() {
+ final Parser parser = getParser();
final LiteralExpr arg = (LiteralExpr)argument();
- final String namespace = arg.getNamespace();
- boolean result = false;
- if (namespace != null) {
- final String value = arg.getValue();
- final int colon = value.indexOf(':');
- final String name = colon >= 0
- ? value.substring(colon + 1)
- : value;
- result = namespace.equals(XSLT_URI) &&
- AvailableElements.contains(name);
- }
- return(result);
+ final QName qname = parser.getQName(arg.getValue());
+ return(parser.elementSupported(qname));
}
/**
1.3 +12 -50 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionAvailableCall.java
Index: FunctionAvailableCall.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionAvailableCall.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FunctionAvailableCall.java 2001/06/06 10:44:59 1.2
+++ FunctionAvailableCall.java 2001/06/29 12:04:34 1.3
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: FunctionAvailableCall.java,v 1.2 2001/06/06 10:44:59 morten Exp $
+ * @(#)$Id: FunctionAvailableCall.java,v 1.3 2001/06/29 12:04:34 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -70,47 +70,7 @@
import org.apache.xalan.xsltc.compiler.util.*;
final class FunctionAvailableCall extends FunctionCall {
- static HashSet AvailableFunctions = new HashSet();
- static {
- AvailableFunctions.add("boolean");
- AvailableFunctions.add("ceiling");
- AvailableFunctions.add("concat");
- AvailableFunctions.add("contains");
- AvailableFunctions.add("count");
- AvailableFunctions.add("current");
- AvailableFunctions.add("document");
- AvailableFunctions.add("element-available");
- AvailableFunctions.add("false");
- AvailableFunctions.add("floor");
- AvailableFunctions.add("format-number");
- AvailableFunctions.add("function-available");
- AvailableFunctions.add("generate-id");
- AvailableFunctions.add("id");
- AvailableFunctions.add("key");
- AvailableFunctions.add("lang");
- AvailableFunctions.add("last");
- AvailableFunctions.add("local-name");
- AvailableFunctions.add("name");
- AvailableFunctions.add("namespace-uri");
- AvailableFunctions.add("normalize-space");
- AvailableFunctions.add("not");
- AvailableFunctions.add("number");
- AvailableFunctions.add("position");
- AvailableFunctions.add("round");
- AvailableFunctions.add("starts-with");
- AvailableFunctions.add("string");
- AvailableFunctions.add("string-length");
- AvailableFunctions.add("substring");
- AvailableFunctions.add("substring-after");
- AvailableFunctions.add("substring-before");
- AvailableFunctions.add("sum");
- AvailableFunctions.add("system-property");
- AvailableFunctions.add("translate");
- AvailableFunctions.add("true");
- AvailableFunctions.add("unparsed-entity-uri");
- }
-
public FunctionAvailableCall(QName fname, Vector arguments) {
super(fname, arguments);
}
@@ -126,20 +86,22 @@
}
/**
+ * Returns the result that this function will return
+ */
+ public boolean getResult() {
+ final Parser parser = getParser();
+ final LiteralExpr arg = (LiteralExpr)argument();
+ return(parser.functionSupported(arg.getValue()));
+ }
+
+ /**
* Calls to 'function-available' are resolved at compile time since
* the namespaces declared in the stylsheet are not available at run
* time. Consequently, arguments to this function must be literals.
*/
public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
- final InstructionList il = methodGen.getInstructionList();
final ConstantPoolGen cpg = classGen.getConstantPool();
- final LiteralExpr arg = (LiteralExpr)argument();
- final String namespace = arg.getNamespace();
- boolean result = false;
-
- if (namespace == null) {
- result = AvailableFunctions.contains(arg.getValue());
- }
- il.append(new PUSH(cpg, result));
+ final boolean result = getResult();
+ methodGen.getInstructionList().append(new PUSH(cpg, result));
}
}
1.14 +35 -23 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Parser.java
Index: Parser.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Parser.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Parser.java 2001/06/17 12:23:30 1.13
+++ Parser.java 2001/06/29 12:04:35 1.14
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Parser.java,v 1.13 2001/06/17 12:23:30 curcuru Exp $
+ * @(#)$Id: Parser.java,v 1.14 2001/06/29 12:04:35 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -568,6 +568,14 @@
COMPILER_PACKAGE + '.' + className);
}
+ public boolean elementSupported(QName qname) {
+ return(_instructionClasses.get(qname) != null);
+ }
+
+ public boolean functionSupported(String fname) {
+ return(_symbolTable.lookupPrimop(fname) != null);
+ }
+
private void initExtClasses() {
initExtClass("output", "TransletOutput");
}
@@ -591,11 +599,8 @@
MethodType R_D = new MethodType(Type.Real, Type.NodeSet);
MethodType R_O = new MethodType(Type.Real, Type.Reference);
MethodType I_I = new MethodType(Type.Int, Type.Int);
- MethodType D_O = new MethodType(Type.NodeSet, Type.Reference);
- MethodType D_SS = new MethodType(Type.NodeSet,
- Type.String, Type.String);
- MethodType D_SD = new MethodType(Type.NodeSet,
- Type.String, Type.NodeSet);
+ MethodType D_O = new MethodType(Type.NodeSet, Type.Reference);
+ MethodType D_V = new MethodType(Type.NodeSet, Type.Void);
MethodType D_S = new MethodType(Type.NodeSet, Type.String);
MethodType D_D = new MethodType(Type.NodeSet, Type.NodeSet);
MethodType A_V = new MethodType(Type.Node, Type.Void);
@@ -612,22 +617,26 @@
MethodType I_II = new MethodType(Type.Int, Type.Int, Type.Int);
MethodType B_RR = new MethodType(Type.Boolean, Type.Real, Type.Real);
MethodType B_II = new MethodType(Type.Boolean, Type.Int, Type.Int);
- MethodType B_BB = new MethodType(Type.Boolean, Type.Boolean,
- Type.Boolean);
- MethodType B_SS = new MethodType(Type.Boolean, Type.String,
- Type.String);
- MethodType S_SS = new MethodType(Type.String, Type.String,
- Type.String);
- MethodType S_SD = new MethodType(Type.String, Type.String,
- Type.NodeSet);
- MethodType S_DS = new MethodType(Type.String, Type.Real, Type.String);
- MethodType S_DSS = new MethodType(Type.String, Type.Real, Type.String,
- Type.String);
- MethodType S_SR = new MethodType(Type.String, Type.String, Type.Real);
- MethodType S_SRR = new MethodType(Type.String, Type.String, Type.Real,
- Type.Real);
- MethodType S_SSS = new MethodType(Type.String, Type.String,
- Type.String, Type.String);
+ MethodType S_SS = new MethodType(Type.String, Type.String, Type.String);
+ MethodType S_DS = new MethodType(Type.String, Type.Real, Type.String);
+ MethodType S_SR = new MethodType(Type.String, Type.String, Type.Real);
+
+ MethodType D_SS =
+ new MethodType(Type.NodeSet, Type.String, Type.String);
+ MethodType D_SD =
+ new MethodType(Type.NodeSet, Type.String, Type.NodeSet);
+ MethodType B_BB =
+ new MethodType(Type.Boolean, Type.Boolean, Type.Boolean);
+ MethodType B_SS =
+ new MethodType(Type.Boolean, Type.String, Type.String);
+ MethodType S_SD =
+ new MethodType(Type.String, Type.String, Type.NodeSet);
+ MethodType S_DSS =
+ new MethodType(Type.String, Type.Real, Type.String, Type.String);
+ MethodType S_SRR =
+ new MethodType(Type.String, Type.String, Type.Real, Type.Real);
+ MethodType S_SSS =
+ new MethodType(Type.String, Type.String, Type.String, Type.String);
/*
* Standard functions: implemented but not in this table concat().
@@ -668,6 +677,10 @@
_symbolTable.addPrimop("id", D_S);
_symbolTable.addPrimop("id", D_D);
_symbolTable.addPrimop("namespace-uri", S_V);
+ _symbolTable.addPrimop("function-available", B_S);
+ _symbolTable.addPrimop("element-available", B_S);
+ _symbolTable.addPrimop("document", D_S);
+ _symbolTable.addPrimop("document", D_V);
// The following functions are implemented in the basis library
_symbolTable.addPrimop("count", I_D);
@@ -682,7 +695,6 @@
_symbolTable.addPrimop("substring-before", S_SS);
_symbolTable.addPrimop("normalize-space", S_V);
_symbolTable.addPrimop("normalize-space", S_S);
- _symbolTable.addPrimop("function-available", B_S);
_symbolTable.addPrimop("system-property", S_S);
// Operators +, -, *, /, % defined on real types.
1.6 +5 -2 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/When.java
Index: When.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/When.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- When.java 2001/06/11 12:03:35 1.5
+++ When.java 2001/06/29 12:04:35 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: When.java,v 1.5 2001/06/11 12:03:35 morten Exp $
+ * @(#)$Id: When.java,v 1.6 2001/06/29 12:04:35 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -96,7 +96,10 @@
if (_test instanceof ElementAvailableCall) {
ElementAvailableCall call = (ElementAvailableCall)_test;
_ignore = !call.getResult();
- return;
+ }
+ if (_test instanceof FunctionAvailableCall) {
+ FunctionAvailableCall call = (FunctionAvailableCall)_test;
+ _ignore = !call.getResult();
}
parseChildren(parser);
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org
Re: cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler
Choose.java ElementAvailableCall.java FunctionAvailableCall.java
Parser.java When.java
Posted by Tom Amiro <To...@Sun.COM>.
Good man!!!
Tom