santiagopg    02/04/17 13:25:26

  Modified:    java/src/org/apache/xalan/xsltc/compiler Tag:
                        jaxp-ri-1_2_0-fcs-branch FunctionCall.java
                        Parser.java Stylesheet.java SyntaxTreeNode.java
                        XSLTC.java xpath.cup
  Log:
  Added support for extension function nodeset().
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.12.4.3  +29 -15    
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.12.4.2
  retrieving revision 1.12.4.3
  diff -u -r1.12.4.2 -r1.12.4.3
  --- FunctionCall.java 9 Apr 2002 18:52:26 -0000       1.12.4.2
  +++ FunctionCall.java 17 Apr 2002 20:25:26 -0000      1.12.4.3
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: FunctionCall.java,v 1.12.4.2 2002/04/09 18:52:26 tmiller Exp $
  + * @(#)$Id: FunctionCall.java,v 1.12.4.3 2002/04/17 20:25:26 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -86,10 +86,19 @@
       private final static Vector EMPTY_ARG_LIST = new Vector(0);
   
       // Valid namespaces for Java function-call extension
  -    protected final static String JAVA_EXT_PREFIX = TRANSLET_URI + "/java";
  +    protected final static String EXT_XSLTC = 
  +     TRANSLET_URI;
  +
  +    protected final static String JAVA_EXT_XSLTC = 
  +     EXT_XSLTC + "/java";
  +
  +    protected final static String EXT_XALAN =
  +     "http://xml.apache.org/xalan";;
  +
       protected final static String JAVA_EXT_XALAN =
        "http://xml.apache.org/xslt/java";;
   
  +
       // External Java function's class/method/signature
       private String     _className;
       private Method     _chosenMethod;
  @@ -197,7 +206,7 @@
        throws TypeCheckError
       {
        final int length = 
  -         uri.startsWith(JAVA_EXT_PREFIX) ? JAVA_EXT_PREFIX.length() + 1 :
  +         uri.startsWith(JAVA_EXT_XSLTC) ? JAVA_EXT_XSLTC.length() + 1 :
            uri.startsWith(JAVA_EXT_XALAN) ? JAVA_EXT_XALAN.length() + 1 : 0;
   
        if (length == 0) {
  @@ -218,8 +227,11 @@
        final String namespace = _fname.getNamespace();
        final String local = _fname.getLocalPart();
   
  -     // XPath functions have no namespace
  -     if (isStandard()) {
  +     if (isExtension()) {
  +         _fname = new QName(null, null, local);
  +         return typeCheckStandard(stable);
  +     }
  +     else if (isStandard()) {
            return typeCheckStandard(stable);
        }
        // Handle extension functions (they all have a namespace)
  @@ -264,8 +276,7 @@
        * thrown, then catch it and re-throw it with a new "this".
        */
       public Type typeCheckStandard(SymbolTable stable) throws TypeCheckError {
  -
  -     _fname.clearNamespace(); // HACK!!!
  +     _fname.clearNamespace();        // HACK!!!
   
        final int n = _arguments.size();
        final Vector argsType = typeCheckArgs(stable);
  @@ -388,8 +399,8 @@
        * Update true/false-lists.
        */
       public void translateDesynthesized(ClassGenerator classGen,
  -                                    MethodGenerator methodGen) {
  -
  +                                    MethodGenerator methodGen) 
  +    {
        Type type = Type.Boolean;
        if (_chosenMethodType != null)
            type = _chosenMethodType.resultType();
  @@ -414,7 +425,7 @@
        int index;
   
        // Translate calls to methods in the BasisLibrary
  -     if (isStandard()) {
  +     if (isStandard() || isExtension()) {
            for (int i = 0; i < n; i++) {
                final Expression exp = argument(i);
                exp.translate(classGen, methodGen);
  @@ -491,10 +502,13 @@
   
       public boolean isStandard() {
        final String namespace = _fname.getNamespace();
  -     if ((namespace == null) || (namespace.equals(Constants.EMPTYSTRING)))
  -         return true;
  -     else
  -         return false;
  +     return (namespace == null) || (namespace.equals(Constants.EMPTYSTRING));
  +    }
  +
  +    public boolean isExtension() {
  +     final String namespace = _fname.getNamespace();
  +     return (namespace != null) && (namespace.equals(EXT_XSLTC) 
  +         || namespace.equals(EXT_XALAN));
       }
   
       /**
  @@ -506,7 +520,7 @@
        Vector result = null;
        final String namespace = _fname.getNamespace();
   
  -     if (namespace.startsWith(JAVA_EXT_PREFIX) ||
  +     if (namespace.startsWith(JAVA_EXT_XSLTC) ||
            namespace.startsWith(JAVA_EXT_XALAN)) {
            final int nArgs = _arguments.size();
            try {
  
  
  
  1.38.8.2  +5 -1      
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.38.8.1
  retrieving revision 1.38.8.2
  diff -u -r1.38.8.1 -r1.38.8.2
  --- Parser.java       3 Apr 2002 19:26:49 -0000       1.38.8.1
  +++ Parser.java       17 Apr 2002 20:25:26 -0000      1.38.8.2
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Parser.java,v 1.38.8.1 2002/04/03 19:26:49 tmiller Exp $
  + * @(#)$Id: Parser.java,v 1.38.8.2 2002/04/17 20:25:26 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -664,6 +664,7 @@
        MethodType B_V  = new MethodType(Type.Boolean, Type.Void);
        MethodType B_B  = new MethodType(Type.Boolean, Type.Boolean);
        MethodType B_S  = new MethodType(Type.Boolean, Type.String);
  +     MethodType D_T  = new MethodType(Type.NodeSet, Type.ResultTree);
        MethodType R_RR = new MethodType(Type.Real, Type.Real, Type.Real);
        MethodType I_II = new MethodType(Type.Int, Type.Int, Type.Int);
        MethodType B_RR = new MethodType(Type.Boolean, Type.Real, Type.Real);
  @@ -747,6 +748,9 @@
        _symbolTable.addPrimop("normalize-space", S_V);
        _symbolTable.addPrimop("normalize-space", S_S);
        _symbolTable.addPrimop("system-property", S_S);
  +
  +     // Extensions
  +     _symbolTable.addPrimop("nodeset", D_T);
   
        // Operators +, -, *, /, % defined on real types.
        _symbolTable.addPrimop("+", R_RR);      
  
  
  
  1.35.4.2  +11 -1     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Stylesheet.java
  
  Index: Stylesheet.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Stylesheet.java,v
  retrieving revision 1.35.4.1
  retrieving revision 1.35.4.2
  diff -u -r1.35.4.1 -r1.35.4.2
  --- Stylesheet.java   3 Apr 2002 19:26:49 -0000       1.35.4.1
  +++ Stylesheet.java   17 Apr 2002 20:25:26 -0000      1.35.4.2
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Stylesheet.java,v 1.35.4.1 2002/04/03 19:26:49 tmiller Exp $
  + * @(#)$Id: Stylesheet.java,v 1.35.4.2 2002/04/17 20:25:26 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -117,6 +117,7 @@
       private int _importPrecedence = 1;
       private Mode _defaultMode;
       private boolean _multiDocument = false;
  +    private boolean _callsNodeset = false;
   
       // All named key elements (needed by Key/IdPattern)
       private Hashtable _keys = new Hashtable();
  @@ -153,6 +154,15 @@
   
       public boolean isMultiDocument() {
        return _multiDocument;
  +    }
  +
  +    public void setCallsNodeset(boolean flag) {
  +     if (flag) setMultiDocument(flag);
  +     _callsNodeset = flag;
  +    }
  +
  +    public boolean callsNodeset() {
  +     return _callsNodeset;
       }
   
       public void numberFormattingUsed() {
  
  
  
  1.18.4.2  +40 -10    
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/SyntaxTreeNode.java
  
  Index: SyntaxTreeNode.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/SyntaxTreeNode.java,v
  retrieving revision 1.18.4.1
  retrieving revision 1.18.4.2
  diff -u -r1.18.4.1 -r1.18.4.2
  --- SyntaxTreeNode.java       3 Apr 2002 19:26:49 -0000       1.18.4.1
  +++ SyntaxTreeNode.java       17 Apr 2002 20:25:26 -0000      1.18.4.2
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: SyntaxTreeNode.java,v 1.18.4.1 2002/04/03 19:26:49 tmiller Exp $
  + * @(#)$Id: SyntaxTreeNode.java,v 1.18.4.2 2002/04/17 20:25:26 santiagopg 
Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -552,10 +552,11 @@
        * @param methodGen BCEL Java method generator
        */
       protected void compileResultTree(ClassGenerator classGen,
  -                                  MethodGenerator methodGen) {
  -
  +                                  MethodGenerator methodGen) 
  +    {
        final ConstantPoolGen cpg = classGen.getConstantPool();
        final InstructionList il = methodGen.getInstructionList();
  +     final Stylesheet stylesheet = classGen.getStylesheet();
   
        // Save the current handler base on the stack
        il.append(methodGen.loadHandler());
  @@ -600,13 +601,42 @@
            il.append(new NEW(cpg.addClass(DOM_ADAPTER_CLASS)));
            il.append(new DUP_X1());
            il.append(SWAP);
  -         // Give the DOM adapter an empty type mapping to start with.
  -         // Type mapping is expensive and will only be done when casting
  -         // a result tree fragment to a node-set.
  -         il.append(new ICONST(0));
  -         il.append(new ANEWARRAY(cpg.addClass(STRING)));
  -         il.append(DUP);
  -         il.append(new INVOKESPECIAL(index)); // leave DOMAdapter on stack
  +
  +         /*
  +          * Give the DOM adapter an empty type mapping if the nodeset
  +          * extension function is never called.
  +          */
  +         if (!stylesheet.callsNodeset()) {
  +             il.append(new ICONST(0));
  +             il.append(new ANEWARRAY(cpg.addClass(STRING)));
  +             il.append(DUP);
  +             il.append(new INVOKESPECIAL(index));
  +         }
  +         else {
  +             // Push name arrays on the stack
  +             il.append(ALOAD_0);
  +             il.append(new GETFIELD(cpg.addFieldref(TRANSLET_CLASS,
  +                                        NAMES_INDEX,
  +                                        NAMES_INDEX_SIG))); 
  +             il.append(ALOAD_0);
  +             il.append(new GETFIELD(cpg.addFieldref(TRANSLET_CLASS,
  +                                        NAMESPACE_INDEX,
  +                                        NAMESPACE_INDEX_SIG)));
  +
  +             // Initialized DOM adapter
  +             il.append(new INVOKESPECIAL(index));
  +
  +             // Add DOM adapter to MultiDOM class by calling addDOMAdapter()
  +             il.append(DUP);
  +             il.append(methodGen.loadDOM());
  +             il.append(new CHECKCAST(cpg.addClass(classGen.getDOMClass())));
  +             il.append(SWAP);
  +             index = cpg.addMethodref(MULTI_DOM_CLASS,
  +                                      "addDOMAdapter",
  +                                      "(" + DOM_ADAPTER_SIG + ")I");
  +             il.append(new INVOKEVIRTUAL(index));
  +             il.append(POP);         // ignore mask returned by addDOMAdapter
  +         }
        }
   
        // Restore old handler base from stack
  
  
  
  1.35.4.1  +16 -2     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/XSLTC.java
  
  Index: XSLTC.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/XSLTC.java,v
  retrieving revision 1.35
  retrieving revision 1.35.4.1
  diff -u -r1.35 -r1.35.4.1
  --- XSLTC.java        1 Feb 2002 20:07:09 -0000       1.35
  +++ XSLTC.java        17 Apr 2002 20:25:26 -0000      1.35.4.1
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: XSLTC.java,v 1.35 2002/02/01 20:07:09 tmiller Exp $
  + * @(#)$Id: XSLTC.java,v 1.35.4.1 2002/04/17 20:25:26 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -139,6 +139,7 @@
       private int     _outputType = FILE_OUTPUT; // by default
   
       private Vector  _classes;
  +    private boolean _callsNodeset = false;
       private boolean _multiDocument = false;
   
       /**
  @@ -317,6 +318,7 @@
            }
            // Generate the bytecodes and output the translet class(es)
            if ((!_parser.errorsFound()) && (_stylesheet != null)) {
  +             _stylesheet.setCallsNodeset(_callsNodeset);
                _stylesheet.setMultiDocument(_multiDocument);
                _stylesheet.translate();
            }
  @@ -435,7 +437,6 @@
        _parser.printWarnings();
       }
   
  -
       /**
        * This method is called by the XPathParser when it encounters a call
        * to the document() function. Affects the DOM used by the translet.
  @@ -446,6 +447,19 @@
   
       public boolean isMultiDocument() {
        return _multiDocument;
  +    }
  +
  +    /**
  +     * This method is called by the XPathParser when it encounters a call
  +     * to the nodeset() extension function. Implies multi document.
  +     */
  +    protected void setCallsNodeset(boolean flag) {
  +     if (flag) setMultiDocument(flag);
  +     _callsNodeset = flag;
  +    }
  +
  +    public boolean callsNodeset() {
  +     return _callsNodeset;
       }
   
       /**
  
  
  
  1.33.8.1  +10 -1     
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/xpath.cup
  
  Index: xpath.cup
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/xpath.cup,v
  retrieving revision 1.33
  retrieving revision 1.33.8.1
  diff -u -r1.33 -r1.33.8.1
  --- xpath.cup 10 Dec 2001 12:53:07 -0000      1.33
  +++ xpath.cup 17 Apr 2002 20:25:26 -0000      1.33.8.1
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: xpath.cup,v 1.33 2001/12/10 12:53:07 morten Exp $
  + * @(#)$Id: xpath.cup,v 1.33.8.1 2002/04/17 20:25:26 santiagopg Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -119,6 +119,10 @@
             _xsltc.setMultiDocument(flag);
       }
   
  +    public void setCallsNodeset(boolean flag) {
  +          _xsltc.setCallsNodeset(flag);
  +    }
  +
       public int findNodeType(int axis, Object test) {
   
        if (test == null) {  // *
  @@ -894,6 +898,11 @@
          }
             else if (fname == parser.getQName("namespace-uri")) {
               RESULT = new NamespaceUriCall(fname, argl);
  +       }
  +       // Special case for extension function nodeset()
  +          else if (fname.getLocalPart().equals("nodeset")) {
  +         parser.setCallsNodeset(true);  // implies MultiDOM
  +            RESULT = new FunctionCall(fname, argl);
          }
             else {
               RESULT = new FunctionCall(fname, argl);
  
  
  

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

Reply via email to