⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mode.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
    ilLoop.append(RETURN);	final InstructionHandle ihLoop = ilLoop.getStart();	// Compile default handling of elements (traverse children)	InstructionList ilRecurse =	    compileDefaultRecursion(classGen, methodGen, ihLoop);	InstructionHandle ihRecurse = ilRecurse.getStart();	// Compile default handling of text/attribute nodes (output text)	InstructionList ilText =	    compileDefaultText(classGen, methodGen, ihLoop);	InstructionHandle ihText = ilText.getStart();	// Distinguish attribute/element/namespace tests for further processing	final int[] types = new int[DTM.NTYPES + names.size()];	for (int i = 0; i < types.length; i++) {	    types[i] = i;	}	final boolean[] isAttribute = new boolean[types.length];	final boolean[] isNamespace = new boolean[types.length];	for (int i = 0; i < names.size(); i++) {	    final String name = (String)names.elementAt(i);	    isAttribute[i+DTM.NTYPES] = isAttributeName(name);	    isNamespace[i+DTM.NTYPES] = isNamespaceName(name);	}	// Compile all templates - regardless of pattern type	compileTemplateCalls(classGen, methodGen, ihLoop, min, max);	// Handle template with explicit "*" pattern	final TestSeq elemTest = _testSeq[DTM.ELEMENT_NODE];	InstructionHandle ihElem = ihRecurse;	if (elemTest != null) {	    ihElem = elemTest.compile(classGen, methodGen, ihLoop);	}	// Handle template with explicit "@*" pattern	final TestSeq attrTest = _testSeq[DTM.ATTRIBUTE_NODE];	InstructionHandle ihAttr = ihLoop;	if (attrTest != null) {	    ihAttr = attrTest.compile(classGen, methodGen, ihAttr);	}	// Do tests for id() and key() patterns first	InstructionList ilKey = null;	if (_idxTestSeq != null) {	    ilKey = _idxTestSeq.getInstructionList();	}	// If there is a match on node() we need to replace ihElem	// and ihText if the priority of node() is higher	if (_childNodeTestSeq != null) {	    // Compare priorities of node() and "*"	    double nodePrio = _childNodeTestSeq.getPriority();	    int    nodePos  = _childNodeTestSeq.getPosition();	    double elemPrio = (0 - Double.MAX_VALUE);	    int    elemPos  = Integer.MIN_VALUE;	    if (elemTest != null) {		elemPrio = elemTest.getPriority();		elemPos  = elemTest.getPosition();	    }	    if (elemPrio == Double.NaN || elemPrio < nodePrio || 		(elemPrio == nodePrio && elemPos < nodePos)) 	    {		ihElem = _childNodeTestSeq.compile(classGen, methodGen, ihLoop);	    }	    // Compare priorities of node() and text()	    final TestSeq textTest = _testSeq[DTM.TEXT_NODE];	    double textPrio = (0 - Double.MAX_VALUE);	    int    textPos  = Integer.MIN_VALUE;	    if (textTest != null) {		textPrio = textTest.getPriority();		textPos  = textTest.getPosition();	    }	    if (textPrio == Double.NaN || textPrio < nodePrio ||	        (textPrio == nodePrio && textPos < nodePos)) 	    {		ihText = _childNodeTestSeq.compile(classGen, methodGen, ihLoop);		_testSeq[DTM.TEXT_NODE] = _childNodeTestSeq;	    }	}	// Handle templates with "ns:*" pattern	InstructionHandle elemNamespaceHandle = ihElem;	InstructionList nsElem = compileNamespaces(classGen, methodGen,						   isNamespace, isAttribute,						   false, ihElem);	if (nsElem != null) elemNamespaceHandle = nsElem.getStart();	// Handle templates with "ns:@*" pattern	InstructionList nsAttr = compileNamespaces(classGen, methodGen,						   isNamespace, isAttribute,						   true, ihAttr);	InstructionHandle attrNamespaceHandle = ihAttr;	if (nsAttr != null) attrNamespaceHandle = nsAttr.getStart();	// Handle templates with "ns:elem" or "ns:@attr" pattern	final InstructionHandle[] targets = new InstructionHandle[types.length];	for (int i = DTM.NTYPES; i < targets.length; i++) {	    final TestSeq testSeq = _testSeq[i];	    // Jump straight to namespace tests ?	    if (isNamespace[i]) {		if (isAttribute[i])		    targets[i] = attrNamespaceHandle;		else		    targets[i] = elemNamespaceHandle;	    }	    // Test first, then jump to namespace tests	    else if (testSeq != null) {		if (isAttribute[i])		    targets[i] = testSeq.compile(classGen, methodGen,						 attrNamespaceHandle);		else		    targets[i] = testSeq.compile(classGen, methodGen,						 elemNamespaceHandle);	    }	    else {		targets[i] = ihLoop;	    }	}	// Handle pattern with match on root node - default: traverse children	targets[DTM.ROOT_NODE] = _rootPattern != null	    ? getTemplateInstructionHandle(_rootPattern.getTemplate())	    : ihRecurse;	// Handle pattern with match on root node - default: traverse children	targets[DTM.DOCUMENT_NODE] = _rootPattern != null	    ? getTemplateInstructionHandle(_rootPattern.getTemplate())	    : ihRecurse;    // %HZ%:  Was ihLoop in XSLTC_DTM branch		// Handle any pattern with match on text nodes - default: loop	targets[DTM.TEXT_NODE] = _testSeq[DTM.TEXT_NODE] != null	    ? _testSeq[DTM.TEXT_NODE].compile(classGen, methodGen, ihText)	    : ihText;	// This DOM-type is not in use - default: process next node	targets[DTM.NAMESPACE_NODE] = ihLoop;	// Match unknown element in DOM - default: check for namespace match	targets[DTM.ELEMENT_NODE] = elemNamespaceHandle;	// Match unknown attribute in DOM - default: check for namespace match	targets[DTM.ATTRIBUTE_NODE] = attrNamespaceHandle;	// Match on processing instruction - default: loop	InstructionHandle ihPI = ihLoop;	if (_childNodeTestSeq != null) ihPI = ihElem;	if (_testSeq[DTM.PROCESSING_INSTRUCTION_NODE] != null) {	    targets[DTM.PROCESSING_INSTRUCTION_NODE] =		_testSeq[DTM.PROCESSING_INSTRUCTION_NODE].		compile(classGen, methodGen, ihPI);	}	else {	    targets[DTM.PROCESSING_INSTRUCTION_NODE] = ihPI;	}		// Match on comments - default: process next node	InstructionHandle ihComment = ihLoop;	if (_childNodeTestSeq != null) ihComment = ihElem;	targets[DTM.COMMENT_NODE] = _testSeq[DTM.COMMENT_NODE] != null	    ? _testSeq[DTM.COMMENT_NODE].compile(classGen, methodGen, ihComment)	    : ihComment;	    	        // This DOM-type is not in use - default: process next node	targets[DTM.CDATA_SECTION_NODE] = ihLoop;	// This DOM-type is not in use - default: process next node	targets[DTM.DOCUMENT_FRAGMENT_NODE] = ihLoop;		// This DOM-type is not in use - default: process next node	targets[DTM.DOCUMENT_TYPE_NODE] = ihLoop;	// This DOM-type is not in use - default: process next node	targets[DTM.ENTITY_NODE] = ihLoop;	// This DOM-type is not in use - default: process next node	targets[DTM.ENTITY_REFERENCE_NODE] = ihLoop;		// This DOM-type is not in use - default: process next node	targets[DTM.NOTATION_NODE] = ihLoop;	// Now compile test sequences for various match patterns:	for (int i = DTM.NTYPES; i < targets.length; i++) {	    final TestSeq testSeq = _testSeq[i];	    // Jump straight to namespace tests ?	    if ((testSeq == null) || (isNamespace[i])) {		if (isAttribute[i])		    targets[i] = attrNamespaceHandle;		else		    targets[i] = elemNamespaceHandle;	    }	    // Match on node type	    else {		if (isAttribute[i])		    targets[i] = testSeq.compile(classGen, methodGen,						 attrNamespaceHandle);		else		    targets[i] = testSeq.compile(classGen, methodGen,						 elemNamespaceHandle);	    }	}	if (ilKey != null) body.insert(ilKey);	// Append first code in applyTemplates() - get type of current node	final int getType = cpg.addInterfaceMethodref(DOM_INTF,						      "getExpandedTypeID",                                                      "(I)I");	body.append(methodGen.loadDOM());	body.append(new ILOAD(_currentIndex));	body.append(new INVOKEINTERFACE(getType, 2));	// Append switch() statement - main dispatch loop in applyTemplates()	InstructionHandle disp = body.append(new SWITCH(types,targets,ihLoop));	// Append all the "case:" statements	appendTestSequences(body);	// Append the actual template code	appendTemplateCode(body);	// Append NS:* node tests (if any)	if (nsElem != null) body.append(nsElem);	// Append NS:@* node tests (if any)	if (nsAttr != null) body.append(nsAttr);	// Append default action for element and root nodes	body.append(ilRecurse);	// Append default action for text and attribute nodes	body.append(ilText);	// putting together constituent instruction lists	mainIL.append(body);	// fall through to ilLoop	mainIL.append(ilLoop);	peepHoleOptimization(methodGen);	methodGen.stripAttributes(true);		methodGen.setMaxLocals();	methodGen.setMaxStack();	methodGen.removeNOPs();	classGen.addMethod(methodGen.getMethod());	// Restore original (complete) set of templates for this transformation	_templates = oldTemplates;    }    /**      * Peephole optimization.      */    private void peepHoleOptimization(MethodGenerator methodGen) {        InstructionList il = methodGen.getInstructionList();        InstructionFinder find = new InstructionFinder(il);	InstructionHandle ih;	String pattern;	// LoadInstruction, POP => (removed)	// pattern = "LoadInstruction POP";        // changed to lower case - changing to all lower case although only the instruction with capital I         // is creating a problem in the Turkish locale        pattern = "loadinstruction pop";        	for (Iterator iter = find.search(pattern); iter.hasNext();) {	    InstructionHandle[] match = (InstructionHandle[]) iter.next();	    try {		if (!match[0].hasTargeters() && !match[1].hasTargeters()) {                    il.delete(match[0], match[1]);                }	    }	    catch (TargetLostException e) {                // TODO: move target down into the list            }	}        	// ILOAD_N, ILOAD_N, SWAP, ISTORE_N => ILOAD_N	// pattern = "ILOAD ILOAD SWAP ISTORE";        // changed to lower case - changing to all lower case although only the instruction with capital I         // is creating a problem in the Turkish locale        pattern = "iload iload swap istore";	for (Iterator iter = find.search(pattern); iter.hasNext();) {            InstructionHandle[] match = (InstructionHandle[]) iter.next();            try {                              com.sun.org.apache.bcel.internal.generic.ILOAD iload1 =                     (com.sun.org.apache.bcel.internal.generic.ILOAD) match[0].getInstruction();                com.sun.org.apache.bcel.internal.generic.ILOAD iload2 =                     (com.sun.org.apache.bcel.internal.generic.ILOAD) match[1].getInstruction();                com.sun.org.apache.bcel.internal.generic.ISTORE istore =                     (com.sun.org.apache.bcel.internal.generic.ISTORE) match[3].getInstruction();                                if (!match[1].hasTargeters() &&                    !match[2].hasTargeters() &&                    !match[3].hasTargeters() &&                    iload1.getIndex() == iload2.getIndex() &&                    iload2.getIndex() == istore.getIndex())                {                    il.delete(match[1], match[3]);                }            }            catch (TargetLostException e) {                // TODO: move target down into the list            }        }        // LoadInstruction_N, LoadInstruction_M, SWAP => LoadInstruction_M, LoadInstruction_N        // pattern = "LoadInstruction LoadInstruction SWAP";        // changed to lower case - changing to all lower case although only the instruction with capital I         // is creating a problem in the Turkish locale        pattern = "loadinstruction loadinstruction swap";	for (Iterator iter = find.search(pattern); iter.hasNext();) {            InstructionHandle[] match = (InstructionHandle[])iter.next();            try {                if (!match[0].hasTargeters() &&                    !match[1].hasTargeters() &&                    !match[2].hasTargeters())                 {                    Instruction load_m = match[1].getInstruction();                    il.insert(match[0], load_m);                    il.delete(match[1], match[2]);                }            }            catch (TargetLostException e) {                // TODO: move target down into the list            }        }                               // ALOAD_N ALOAD_N => ALOAD_N DUP	// pattern = "ALOAD ALOAD";        // changed to lower case - changing to all lower case although only the instruction with capital I         // is creating a problem in the Turkish locale        pattern = "aload aload";        for (Iterator iter = find.search(pattern); iter.hasNext();) {            InstructionHandle[] match = (InstructionHandle[])iter.next();            try {                if (!match[1].hasTargeters()) {                    com.sun.org.apache.bcel.internal.generic.ALOAD aload1 =                         (com.sun.org.apache.bcel.internal.generic.ALOAD) match[0].getInstruction();                    com.sun.org.apache.bcel.internal.generic.ALOAD aload2 =                         (com.sun.org.apache.bcel.internal.generic.ALOAD) match[1].getInstruction();                                        if (aload1.getIndex() == aload2.getIndex()) {                        il.insert(match[1], new DUP());                        il.delete(match[1]);                    }                }            }            catch (TargetLostException e) {                // TODO: move target down into the list            }        }    }    public InstructionHandle getTemplateInstructionHandle(Template template) {	return (InstructionHandle)_templateIHs.get(template);    }    /**     * Auxiliary method to determine if a qname is an attribute.     */    private static boolean isAttributeName(String qname) {	final int col = qname.lastIndexOf(':') + 1;	return (qname.charAt(col) == '@');    }    /**     * Auxiliary method to determine if a qname is a namespace      * qualified "*".     */    private static boolean isNamespaceName(String qname) {	final int col = qname.lastIndexOf(':');	return (col > -1 && qname.charAt(qname.length()-1) == '*');    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -