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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to