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