Package org.apache.xalan.xsltc.compiler.util

Examples of org.apache.xalan.xsltc.compiler.util.MethodGenerator


             NodeSortRecordGenerator sortRecord,
             ConstantPoolGen cpg,
             String className)
    {
  final InstructionList il = new InstructionList();
  final MethodGenerator init =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        null, null, "<init>", className,
        il, cpg);

  // Call the constructor in the NodeSortRecord superclass
  il.append(ALOAD_0);
  il.append(new INVOKESPECIAL(cpg.addMethodref(NODE_SORT_RECORD,
                 "<init>", "()V")));

  final int initLocale =  cpg.addMethodref("java/util/Locale",
             "<init>",
             "(Ljava/lang/String;"+
             "Ljava/lang/String;)V");
 
  final int getCollator = cpg.addMethodref(COLLATOR_CLASS,
             "getInstance",
             "(Ljava/util/Locale;)"+
             COLLATOR_SIG);

  final int setStrength = cpg.addMethodref(COLLATOR_CLASS,
             "setStrength", "(I)V");

  final int levels = sortObjects.size();

  /*
  final int levelsField = cpg.addFieldref(className, "_levels", "I");
  il.append(new PUSH(cpg, levels));
  il.append(new PUTSTATIC(levelsField));
  */

  // Compile code that initializes the locale
  String language = null;
  String country = null;
  Sort sort = (Sort)sortObjects.elementAt(0);

  for (int level = 0; level < levels; level++) {
      if (language == null && sort._lang != null) {
    language = sort._lang;
      }
      if (country == null && sort._country != null) {
    country = sort._country;
      }
  }

  final int collator =
      cpg.addFieldref(className, "_collator", COLLATOR_SIG);
  final int locale =
      cpg.addFieldref(className, "_locale", LOCALE_SIG);

  if (language != null) {
      // Create new Locale object on stack
      il.append(new NEW(cpg.addClass("java/util/Locale")));
      il.append(DUP);
      il.append(DUP);
      il.append(new PUSH(cpg, language));
      il.append(new PUSH(cpg, (country != null ? country : EMPTYSTRING)));
      il.append(new INVOKESPECIAL(initLocale));
      il.append(ALOAD_0);
      il.append(SWAP);
      il.append(new PUTFIELD(locale));
     
      // Use that Locale object to get the required Collator object
      il.append(new INVOKESTATIC(getCollator));
      il.append(ALOAD_0);
      il.append(SWAP);
      il.append(new PUTFIELD(collator));
  }

  il.append(ALOAD_0);
  il.append(new GETFIELD(collator));
  il.append(new ICONST(Collator.TERTIARY));
  il.append(new INVOKEVIRTUAL(setStrength));

  il.append(RETURN);

  init.stripAttributes(true);
  init.setMaxLocals();
  init.setMaxStack();

  return init.getMethod();
    }
View Full Code Here


     * Compiles a constructor for the class <tt>_className</tt> that
     * inherits from {Any,Single,Multiple}NodeCounter. This constructor
     * simply calls the same constructor in the super class.
     */
    private void compileConstructor(ClassGenerator classGen) {
  MethodGenerator cons;
  final InstructionList il = new InstructionList();
  final ConstantPoolGen cpg = classGen.getConstantPool();

  cons = new MethodGenerator(ACC_PUBLIC,
           org.apache.bcel.generic.Type.VOID,
           new org.apache.bcel.generic.Type[] {
               Util.getJCRefType(TRANSLET_INTF_SIG),
               Util.getJCRefType(DOM_INTF_SIG),
               Util.getJCRefType(NODE_ITERATOR_SIG)
           },
           new String[] {
               "dom",
               "translet",
               "iterator"
           },
           "<init>", _className, il, cpg);

  il.append(ALOAD_0);     // this
  il.append(ALOAD_1);     // translet
  il.append(ALOAD_2);     // DOM
  il.append(new ALOAD(3));// iterator

  int index = cpg.addMethodref(ClassNames[_level],
             "<init>",
             "(" + TRANSLET_INTF_SIG
             + DOM_INTF_SIG
             + NODE_ITERATOR_SIG
             + ")V");
  il.append(new INVOKESPECIAL(index));
  il.append(RETURN);
 
  cons.stripAttributes(true);
  cons.setMaxLocals();
  cons.setMaxStack();
  classGen.addMethod(cons.getMethod());
    }
View Full Code Here

     */
    private void compileStaticInitializer(ClassGenerator classGen) {
        final ConstantPoolGen cpg = classGen.getConstantPool();
        final InstructionList il = new InstructionList();

        final MethodGenerator staticConst =
            new MethodGenerator(ACC_PUBLIC|ACC_STATIC,
                                org.apache.bcel.generic.Type.VOID,
                                null, null, "<clinit>",
                                _className, il, cpg);

        // Create fields of type char[] that will contain literal text from
        // the stylesheet.
        final int charDataFieldCount = getXSLTC().getCharacterDataCount();
        for (int i = 0; i < charDataFieldCount; i++) {
            addStaticField(classGen, STATIC_CHAR_DATA_FIELD_SIG,
                           STATIC_CHAR_DATA_FIELD+i);
        }

        // Grab all the literal text in the stylesheet and put it in a char[]
        final int charDataCount = getXSLTC().getCharacterDataCount();
        final int toCharArray = cpg.addMethodref(STRING, "toCharArray", "()[C");
        for (int i = 0; i < charDataCount; i++) {
            il.append(new PUSH(cpg, getXSLTC().getCharacterData(i)));
            il.append(new INVOKEVIRTUAL(toCharArray));
            il.append(new PUTSTATIC(cpg.addFieldref(_className,
                                               STATIC_CHAR_DATA_FIELD+i,
                                               STATIC_CHAR_DATA_FIELD_SIG)));
        }

        il.append(RETURN);

        staticConst.stripAttributes(true);
        staticConst.setMaxLocals();
        staticConst.setMaxStack();
        classGen.addMethod(staticConst.getMethod());
    }
View Full Code Here

    private void compileConstructor(ClassGenerator classGen, Output output) {

  final ConstantPoolGen cpg = classGen.getConstantPool();
  final InstructionList il = new InstructionList();

  final MethodGenerator constructor =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        null, null, "<init>",
        _className, il, cpg);

  // Call the constructor in the AbstractTranslet superclass
  il.append(classGen.loadTranslet());
  il.append(new INVOKESPECIAL(cpg.addMethodref(TRANSLET_CLASS,
                 "<init>", "()V")));

  // Put the names array into the translet - used for dom/translet mapping
  final Vector names = getXSLTC().getNamesIndex();
  il.append(classGen.loadTranslet());
  il.append(new PUSH(cpg, names.size()));
  il.append(new ANEWARRAY(cpg.addClass(STRING)));   

  for (int i = 0; i < names.size(); i++) {
      final String name = (String)names.elementAt(i);
      il.append(DUP);
      il.append(new PUSH(cpg, i));
      il.append(new PUSH(cpg, name));
      il.append(AASTORE);
  }
  il.append(new PUTFIELD(cpg.addFieldref(TRANSLET_CLASS,
                 NAMES_INDEX,
                 NAMES_INDEX_SIG)));

  // Put the namespace names array into the translet
  final Vector namespaces = getXSLTC().getNamespaceIndex();
  il.append(classGen.loadTranslet());
  il.append(new PUSH(cpg, namespaces.size()));
  il.append(new ANEWARRAY(cpg.addClass(STRING)));   

  for (int i = 0; i < namespaces.size(); i++) {
      final String ns = (String)namespaces.elementAt(i);
      il.append(DUP);
      il.append(new PUSH(cpg, i));
      il.append(new PUSH(cpg, ns));
      il.append(AASTORE);
  }
  il.append(new PUTFIELD(cpg.addFieldref(TRANSLET_CLASS,
                 NAMESPACE_INDEX,
                 NAMESPACE_INDEX_SIG)));

  if (_hasIdCall) {
      il.append(classGen.loadTranslet());
      il.append(new PUSH(cpg, Boolean.TRUE));
      il.append(new PUTFIELD(cpg.addFieldref(TRANSLET_CLASS,
                     HASIDCALL_INDEX,
                     HASIDCALL_INDEX_SIG)));
  }
 
  // Compile in code to set the output configuration from <xsl:output>
  if (output != null) {
      // Set all the output settings files in the translet
      output.translate(classGen, constructor);
  }

  // Compile default decimal formatting symbols.
  // This is an implicit, nameless xsl:decimal-format top-level element.
  if (_numberFormattingUsed)
      DecimalFormatting.translateDefaultDFS(classGen, constructor);

  il.append(RETURN);

  constructor.stripAttributes(true);
  constructor.setMaxLocals();
  constructor.setMaxStack();
  classGen.addMethod(constructor.getMethod());
    }
View Full Code Here

      DOCUMENT_PNAME, ITERATOR_PNAME, TRANSLET_OUTPUT_PNAME
  };

  final InstructionList il = new InstructionList();

  final MethodGenerator toplevel =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        argTypes, argNames,
        "topLevel", _className, il,
        classGen.getConstantPool());

  toplevel.addException("org.apache.xalan.xsltc.TransletException");

  // Define and initialize 'current' variable with the root node
  final LocalVariableGen current =
      toplevel.addLocalVariable("current",
            org.apache.bcel.generic.Type.INT,
            il.getEnd(), null);

  final int setFilter = cpg.addInterfaceMethodref(DOM_INTF,
             "setFilter",
             "(Lorg/apache/xalan/xsltc/StripFilter;)V");

  il.append(new PUSH(cpg, DTM.ROOT_NODE));
  il.append(new ISTORE(current.getIndex()));

  // Resolve any forward referenes and translate global variables/params
  _globals = resolveReferences(_globals);
  final int count = _globals.size();
  for (int i = 0; i < count; i++) {
      final VariableBase var = (VariableBase)_globals.elementAt(i);
      var.translate(classGen,toplevel);
  }

  // Compile code for other top-level elements
  Vector whitespaceRules = new Vector();
  while (elements.hasMoreElements()) {
      final Object element = elements.nextElement();
      // xsl:decimal-format
      if (element instanceof DecimalFormatting) {
    ((DecimalFormatting)element).translate(classGen,toplevel);
      }
      // xsl:strip/preserve-space
      else if (element instanceof Whitespace) {
    whitespaceRules.addAll(((Whitespace)element).getRules());
      }
  }

  // Translate all whitespace strip/preserve rules
  if (whitespaceRules.size() > 0) {
      Whitespace.translateRules(whitespaceRules,classGen);
  }

  if (classGen.containsMethod(STRIP_SPACE, STRIP_SPACE_PARAMS) != null) {
      il.append(toplevel.loadDOM());
      il.append(classGen.loadTranslet());
      il.append(new INVOKEINTERFACE(setFilter, 2));
  }

  il.append(RETURN);

  // Compute max locals + stack and add method to class
  toplevel.stripAttributes(true);
  toplevel.setMaxLocals();
  toplevel.setMaxStack();
  toplevel.removeNOPs();

  classGen.addMethod(toplevel.getMethod());
 
  return("("+DOM_INTF_SIG+NODE_ITERATOR_SIG+TRANSLET_OUTPUT_SIG+")V");
    }
View Full Code Here

      DOCUMENT_PNAME, ITERATOR_PNAME, TRANSLET_OUTPUT_PNAME, "current"
  };

  final InstructionList il = new InstructionList();

  final MethodGenerator buildKeys =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        argTypes, argNames,
        "buildKeys", _className, il,
        classGen.getConstantPool());

  buildKeys.addException("org.apache.xalan.xsltc.TransletException");
 
  final Enumeration elements = elements();
  // Compile code for other top-level elements
  while (elements.hasMoreElements()) {
      // xsl:key
      final Object element = elements.nextElement();
      if (element instanceof Key) {
    final Key key = (Key)element;
    key.translate(classGen, buildKeys);
    _keys.put(key.getName(),key);
      }
  }
 
  il.append(RETURN);
 
  // Compute max locals + stack and add method to class
  buildKeys.stripAttributes(true);
  buildKeys.setMaxLocals();
  buildKeys.setMaxStack();
  buildKeys.removeNOPs();

  classGen.addMethod(buildKeys.getMethod());
 
  return("("+DOM_INTF_SIG+NODE_ITERATOR_SIG+TRANSLET_OUTPUT_SIG+"I)V");
    }
View Full Code Here

  argNames[0] = DOCUMENT_PNAME;
  argNames[1] = ITERATOR_PNAME;
  argNames[2] = TRANSLET_OUTPUT_PNAME;

  final InstructionList il = new InstructionList();
  final MethodGenerator transf =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        argTypes, argNames,
        "transform",
        _className,
        il,
        classGen.getConstantPool());
  transf.addException("org.apache.xalan.xsltc.TransletException");

  // Define and initialize current with the root node
  final LocalVariableGen current =
      transf.addLocalVariable("current",
            org.apache.bcel.generic.Type.INT,
            il.getEnd(), null);
  final String applyTemplatesSig = classGen.getApplyTemplatesSig();
  final int applyTemplates = cpg.addMethodref(getClassName(),
                "applyTemplates",
                applyTemplatesSig);
  final int domField = cpg.addFieldref(getClassName(),
               DOM_FIELD,
               DOM_INTF_SIG);

  // push translet for PUTFIELD
  il.append(classGen.loadTranslet());
  // prepare appropriate DOM implementation
 
  if (isMultiDocument()) {
      il.append(new NEW(cpg.addClass(MULTI_DOM_CLASS)));
      il.append(DUP);
  }
 
  il.append(classGen.loadTranslet());
  il.append(transf.loadDOM());
  il.append(new INVOKEVIRTUAL(cpg.addMethodref(TRANSLET_CLASS,
                 "makeDOMAdapter",
                 "("+DOM_INTF_SIG+")"+
                 DOM_ADAPTER_SIG)));
  // DOMAdapter is on the stack

  if (isMultiDocument()) {
      final int init = cpg.addMethodref(MULTI_DOM_CLASS,
                "<init>",
                "("+DOM_INTF_SIG+")V");
      il.append(new INVOKESPECIAL(init));
      // MultiDOM is on the stack
  }
 
  //store to _dom variable
  il.append(new PUTFIELD(domField));

  // continue with globals initialization
  il.append(new PUSH(cpg, DTM.ROOT_NODE));
  il.append(new ISTORE(current.getIndex()));

  // Transfer the output settings to the output post-processor
  il.append(classGen.loadTranslet());
  il.append(transf.loadHandler());
  final int index = cpg.addMethodref(TRANSLET_CLASS,
             "transferOutputSettings",
             "("+OUTPUT_HANDLER_SIG+")V");
  il.append(new INVOKEVIRTUAL(index));

        // Compile buildKeys -- TODO: omit if not needed               
       
        final String keySig = compileBuildKeys(classGen);
        final int    keyIdx = cpg.addMethodref(getClassName(),
                                               "buildKeys", keySig);
        il.append(classGen.loadTranslet());     // The 'this' pointer
        il.append(classGen.loadTranslet());
        il.append(new GETFIELD(domField));      // The DOM reference
        il.append(transf.loadIterator());       // Not really used, but...
        il.append(transf.loadHandler());        // The output handler
        il.append(new PUSH(cpg, DTM.ROOT_NODE)); // Start with the root node
        il.append(new INVOKEVIRTUAL(keyIdx));


    // Look for top-level elements that need handling
  final Enumeration toplevel = elements();
  if ((_globals.size() > 0) || (toplevel.hasMoreElements())) {
      // Compile method for handling top-level elements
      final String topLevelSig = compileTopLevel(classGen, toplevel);
      // Get a reference to that method
      final int topLevelIdx = cpg.addMethodref(getClassName(),
                 "topLevel",
                 topLevelSig);
      // Push all parameters on the stack and call topLevel()
      il.append(classGen.loadTranslet()); // The 'this' pointer
      il.append(classGen.loadTranslet());
      il.append(new GETFIELD(domField))// The DOM reference
      il.append(transf.loadIterator());
      il.append(transf.loadHandler());    // The output handler
      il.append(new INVOKEVIRTUAL(topLevelIdx));
  }
 



  // start document
  il.append(transf.loadHandler());
  il.append(transf.startDocument());

  // push first arg for applyTemplates
  il.append(classGen.loadTranslet());
  // push translet for GETFIELD to get DOM arg
  il.append(classGen.loadTranslet());
  il.append(new GETFIELD(domField));
  // push remaining 2 args
  il.append(transf.loadIterator());
  il.append(transf.loadHandler());
  il.append(new INVOKEVIRTUAL(applyTemplates));
  // endDocument
  il.append(transf.loadHandler());
  il.append(transf.endDocument());

  il.append(RETURN);

  // Compute max locals + stack and add method to class
  transf.stripAttributes(true);
  transf.setMaxLocals();
  transf.setMaxStack();
  transf.removeNOPs();

  classGen.addMethod(transf.getMethod());
    }
View Full Code Here

    private void compileConstructor(ClassGenerator classGen, Output output) {

  final ConstantPoolGen cpg = classGen.getConstantPool();
  final InstructionList il = new InstructionList();

  final MethodGenerator constructor =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        null, null, "<init>",
        _className, il, cpg);

  // Call the constructor in the AbstractTranslet superclass
  il.append(classGen.loadTranslet());
  il.append(new INVOKESPECIAL(cpg.addMethodref(TRANSLET_CLASS,
                 "<init>", "()V")));

  // Put the names array into the translet - used for dom/translet mapping
  final Vector names = getXSLTC().getNamesIndex();
  il.append(classGen.loadTranslet());
  il.append(new PUSH(cpg, names.size()));
  il.append(new ANEWARRAY(cpg.addClass(STRING)));   

  for (int i = 0; i < names.size(); i++) {
      final String name = (String)names.elementAt(i);
      il.append(DUP);
      il.append(new PUSH(cpg, i));
      il.append(new PUSH(cpg, name));
      il.append(AASTORE);
  }
  il.append(new PUTFIELD(cpg.addFieldref(TRANSLET_CLASS,
                 NAMES_INDEX,
                 NAMES_INDEX_SIG)));

  // Put the namespace names array into the translet
  final Vector namespaces = getXSLTC().getNamespaceIndex();
  il.append(classGen.loadTranslet());
  il.append(new PUSH(cpg, namespaces.size()));
  il.append(new ANEWARRAY(cpg.addClass(STRING)));   

  for (int i = 0; i < namespaces.size(); i++) {
      final String ns = (String)namespaces.elementAt(i);
      il.append(DUP);
      il.append(new PUSH(cpg, i));
      il.append(new PUSH(cpg, ns));
      il.append(AASTORE);
  }
  il.append(new PUTFIELD(cpg.addFieldref(TRANSLET_CLASS,
                 NAMESPACE_INDEX,
                 NAMESPACE_INDEX_SIG)));

  // Compile in code to set the output configuration from <xsl:output>
  if (output != null) {
      // Set all the output settings files in the translet
      output.translate(classGen, constructor);
  }

  // Compile default decimal formatting symbols.
  // This is an implicit, nameless xsl:decimal-format top-level element.
  if (_numberFormattingUsed)
      DecimalFormatting.translateDefaultDFS(classGen, constructor);

  il.append(RETURN);

  constructor.stripAttributes(true);
  constructor.setMaxLocals();
  constructor.setMaxStack();
  classGen.addMethod(constructor.getMethod());
    }
View Full Code Here

      DOCUMENT_PNAME, ITERATOR_PNAME, TRANSLET_OUTPUT_PNAME
  };

  final InstructionList il = new InstructionList();

  final MethodGenerator toplevel =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        argTypes, argNames,
        "topLevel", _className, il,
        classGen.getConstantPool());

  toplevel.addException("org.apache.xalan.xsltc.TransletException");

  // Define and initialize 'current' variable with the root node
  final LocalVariableGen current =
      toplevel.addLocalVariable("current",
            org.apache.bcel.generic.Type.INT,
            il.getEnd(), null);

  final int setFilter = cpg.addInterfaceMethodref(DOM_INTF,
             "setFilter",
             "(Lorg/apache/xalan/xsltc/StripFilter;)V");

  il.append(new PUSH(cpg, DOM.ROOTNODE));
  il.append(new ISTORE(current.getIndex()));

  // Resolve any forward referenes and translate global variables/params
  _globals = resolveReferences(_globals);
  final int count = _globals.size();
  for (int i = 0; i < count; i++) {
      final VariableBase var = (VariableBase)_globals.elementAt(i);
      var.translate(classGen,toplevel);
  }

  // Compile code for other top-level elements
  Vector whitespaceRules = new Vector();
  while (elements.hasMoreElements()) {
      final Object element = elements.nextElement();
      // xsl:decimal-format
      if (element instanceof DecimalFormatting) {
    ((DecimalFormatting)element).translate(classGen,toplevel);
      }
      // xsl:strip/preserve-space
      else if (element instanceof Whitespace) {
    whitespaceRules.addAll(((Whitespace)element).getRules());
      }
  }

  // Translate all whitespace strip/preserve rules
  if (whitespaceRules.size() > 0) {
      Whitespace.translateRules(whitespaceRules,classGen);
  }

  if (classGen.containsMethod(STRIP_SPACE, STRIP_SPACE_PARAMS) != null) {
      il.append(toplevel.loadDOM());
      il.append(classGen.loadTranslet());
      il.append(new INVOKEINTERFACE(setFilter, 2));
  }

  il.append(RETURN);

  // Compute max locals + stack and add method to class
  toplevel.stripAttributes(true);
  toplevel.setMaxLocals();
  toplevel.setMaxStack();
  toplevel.removeNOPs();

  classGen.addMethod(toplevel.getMethod());
 
  return("("+DOM_INTF_SIG+NODE_ITERATOR_SIG+TRANSLET_OUTPUT_SIG+")V");
    }
View Full Code Here

      DOCUMENT_PNAME, ITERATOR_PNAME, TRANSLET_OUTPUT_PNAME, "current"
  };

  final InstructionList il = new InstructionList();

  final MethodGenerator buildKeys =
      new MethodGenerator(ACC_PUBLIC,
        org.apache.bcel.generic.Type.VOID,
        argTypes, argNames,
        "buildKeys", _className, il,
        classGen.getConstantPool());

  final int domField = cpg.addFieldref(getClassName(),
               DOM_FIELD,
               DOM_INTF_SIG);

  buildKeys.addException("org.apache.xalan.xsltc.TransletException");

  il.append(classGen.loadTranslet());
  il.append(new GETFIELD(domField))// The DOM reference
  il.append(new ASTORE(1));
 
  final Enumeration elements = elements();
  // Compile code for other top-level elements
  while (elements.hasMoreElements()) {
      // xsl:key
      final Object element = elements.nextElement();
      if (element instanceof Key) {
    final Key key = (Key)element;
    key.translate(classGen, buildKeys);
    _keys.put(key.getName(),key);
      }
  }
 
  il.append(RETURN);
 
  // Compute max locals + stack and add method to class
  buildKeys.stripAttributes(true);
  buildKeys.setMaxLocals();
  buildKeys.setMaxStack();
  buildKeys.removeNOPs();

  classGen.addMethod(buildKeys.getMethod());
 
  return("("+DOM_INTF_SIG+NODE_ITERATOR_SIG+TRANSLET_OUTPUT_SIG+"I)V");
    }
View Full Code Here

TOP

Related Classes of org.apache.xalan.xsltc.compiler.util.MethodGenerator

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.