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

📄 step.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		il.append(new INVOKEINTERFACE(iter, 3));		return;	    }	    SyntaxTreeNode parent = getParent();	    // Special case for '.'	    if (isAbbreviatedDot()) {		if (_type == Type.Node) {		    // Put context node on stack if using Type.Node		    il.append(methodGen.loadContextNode());		}		else {		    if (parent instanceof ParentLocationPath){			// Wrap the context node in a singleton iterator if not.			int init = cpg.addMethodref(SINGLETON_ITERATOR,						    "<init>",						    "("+NODE_SIG+")V");			il.append(new NEW(cpg.addClass(SINGLETON_ITERATOR)));			il.append(DUP);			il.append(methodGen.loadContextNode());			il.append(new INVOKESPECIAL(init));		    } else {			// DOM.getAxisIterator(int axis);			int git = cpg.addInterfaceMethodref(DOM_INTF,						"getAxisIterator",						"(I)"+NODE_ITERATOR_SIG);			il.append(methodGen.loadDOM());			il.append(new PUSH(cpg, _axis));			il.append(new INVOKEINTERFACE(git, 2));		    }		}		return;	    }	    // Special case for /foo/*/bar	    if ((parent instanceof ParentLocationPath) &&		(parent.getParent() instanceof ParentLocationPath)) {		if ((_nodeType == NodeTest.ELEMENT) && (!_hadPredicates)) {		    _nodeType = NodeTest.ANODE;		}	    }	    // "ELEMENT" or "*" or "@*" or ".." or "@attr" with a parent.	    switch (_nodeType) {	    case NodeTest.ATTRIBUTE:		_axis = Axis.ATTRIBUTE;	    case NodeTest.ANODE:		// DOM.getAxisIterator(int axis);		int git = cpg.addInterfaceMethodref(DOM_INTF,						    "getAxisIterator",						    "(I)"+NODE_ITERATOR_SIG);		il.append(methodGen.loadDOM());		il.append(new PUSH(cpg, _axis));		il.append(new INVOKEINTERFACE(git, 2));		break;	    default:		if (star > 1) {		    final String namespace;		    if (_axis == Axis.ATTRIBUTE)			namespace = name.substring(0,star-2);		    else			namespace = name.substring(0,star-1);		    final int nsType = xsltc.registerNamespace(namespace);		    final int ns = cpg.addInterfaceMethodref(DOM_INTF,						    "getNamespaceAxisIterator",						    "(II)"+NODE_ITERATOR_SIG);		    il.append(methodGen.loadDOM());		    il.append(new PUSH(cpg, _axis));		    il.append(new PUSH(cpg, nsType));		    il.append(new INVOKEINTERFACE(ns, 3));		    break;		}	    case NodeTest.ELEMENT:		// DOM.getTypedAxisIterator(int axis, int type);		final int ty = cpg.addInterfaceMethodref(DOM_INTF,						"getTypedAxisIterator",						"(II)"+NODE_ITERATOR_SIG);		// Get the typed iterator we're after		il.append(methodGen.loadDOM());		il.append(new PUSH(cpg, _axis));		il.append(new PUSH(cpg, _nodeType));		il.append(new INVOKEINTERFACE(ty, 3));		break;	    }	}    }    /**     * Translate a sequence of predicates. Each predicate is translated     * by constructing an instance of <code>CurrentNodeListIterator</code>     * which is initialized from another iterator (recursive call),     * a filter and a closure (call to translate on the predicate) and "this".      */    public void translatePredicates(ClassGenerator classGen,				    MethodGenerator methodGen) {	final ConstantPoolGen cpg = classGen.getConstantPool();	final InstructionList il = methodGen.getInstructionList();	int idx = 0;	if (_predicates.size() == 0) {	    translate(classGen, methodGen);	}	else {	    final Predicate predicate = (Predicate)_predicates.lastElement();	    _predicates.remove(predicate);	    // Special case for predicates that can use the NodeValueIterator	    // instead of an auxiliary class. Certain path/predicates pairs	    // are translated into a base path, on top of which we place a	    // node value iterator that tests for the desired value:	    //   foo[@attr = 'str']  ->  foo/@attr + test(value='str')	    //   foo[bar = 'str']    ->  foo/bar + test(value='str')	    //   foo/bar[. = 'str']  ->  foo/bar + test(value='str')	    if (predicate.isNodeValueTest()) {		Step step = predicate.getStep();		il.append(methodGen.loadDOM());		// If the predicate's Step is simply '.' we translate this Step		// and place the node test on top of the resulting iterator		if (step.isAbbreviatedDot()) {		    translate(classGen, methodGen);		    il.append(new ICONST(DOM.RETURN_CURRENT));		}		// Otherwise we create a parent location path with this Step and		// the predicates Step, and place the node test on top of that		else {		    ParentLocationPath path = new ParentLocationPath(this, step);                    _parent = step._parent = path;      // Force re-parenting                    		    try {			path.typeCheck(getParser().getSymbolTable());		    }		    catch (TypeCheckError e) { }		    path.translate(classGen, methodGen);		    il.append(new ICONST(DOM.RETURN_PARENT));		}		predicate.translate(classGen, methodGen);		idx = cpg.addInterfaceMethodref(DOM_INTF,						GET_NODE_VALUE_ITERATOR,						GET_NODE_VALUE_ITERATOR_SIG);		il.append(new INVOKEINTERFACE(idx, 5));	    }            	    // Handle '//*[n]' expression	    else if (predicate.isNthDescendant()) {		il.append(methodGen.loadDOM());		// il.append(new ICONST(NodeTest.ELEMENT));		il.append(new ICONST(predicate.getPosType()));		predicate.translate(classGen, methodGen);		il.append(new ICONST(0));		idx = cpg.addInterfaceMethodref(DOM_INTF,						"getNthDescendant",						"(IIZ)"+NODE_ITERATOR_SIG);		il.append(new INVOKEINTERFACE(idx, 4));	    }	    // Handle 'elem[n]' expression	    else if (predicate.isNthPositionFilter()) {		idx = cpg.addMethodref(NTH_ITERATOR_CLASS,				       "<init>",				       "("+NODE_ITERATOR_SIG+"I)V");                // Backwards branches are prohibited if an uninitialized object                // is on the stack by section 4.9.4 of the JVM Specification,                // 2nd Ed.  We don't know whether this code might contain                // backwards branches, so we mustn't create the new object until                // after we've created the suspect arguments to its constructor.                // Instead we calculate the values of the arguments to the                // constructor first, store them in temporary variables, create                // the object and reload the arguments from the temporaries to                // avoid the problem.		translatePredicates(classGen, methodGen); // recursive call                LocalVariableGen iteratorTemp                        = methodGen.addLocalVariable("step_tmp1",                                         Util.getJCRefType(NODE_ITERATOR_SIG),                                         il.getEnd(), null);                il.append(new ASTORE(iteratorTemp.getIndex()));		predicate.translate(classGen, methodGen);                LocalVariableGen predicateValueTemp                        = methodGen.addLocalVariable("step_tmp2",                                         Util.getJCRefType("I"),                                         il.getEnd(), null);                il.append(new ISTORE(predicateValueTemp.getIndex()));		il.append(new NEW(cpg.addClass(NTH_ITERATOR_CLASS)));		il.append(DUP);                il.append(new ALOAD(iteratorTemp.getIndex()));                il.append(new ILOAD(predicateValueTemp.getIndex()));		il.append(new INVOKESPECIAL(idx));	    }	    else {		idx = cpg.addMethodref(CURRENT_NODE_LIST_ITERATOR,				       "<init>",				       "("				       + NODE_ITERATOR_SIG				       + CURRENT_NODE_LIST_FILTER_SIG				       + NODE_SIG				       + TRANSLET_SIG				       + ")V");                // Backwards branches are prohibited if an uninitialized object                // is on the stack by section 4.9.4 of the JVM Specification,                // 2nd Ed.  We don't know whether this code might contain                // backwards branches, so we mustn't create the new object until                // after we've created the suspect arguments to its constructor.                // Instead we calculate the values of the arguments to the                // constructor first, store them in temporary variables, create                // the object and reload the arguments from the temporaries to                // avoid the problem.		translatePredicates(classGen, methodGen); // recursive call                LocalVariableGen iteratorTemp                        = methodGen.addLocalVariable("step_tmp1",                                         Util.getJCRefType(NODE_ITERATOR_SIG),                                         il.getEnd(), null);                il.append(new ASTORE(iteratorTemp.getIndex()));		predicate.translateFilter(classGen, methodGen);                LocalVariableGen filterTemp                        = methodGen.addLocalVariable("step_tmp2",                              Util.getJCRefType(CURRENT_NODE_LIST_FILTER_SIG),                              il.getEnd(), null);                il.append(new ASTORE(filterTemp.getIndex()));		// create new CurrentNodeListIterator		il.append(new NEW(cpg.addClass(CURRENT_NODE_LIST_ITERATOR)));		il.append(DUP);                il.append(new ALOAD(iteratorTemp.getIndex()));                il.append(new ALOAD(filterTemp.getIndex()));				il.append(methodGen.loadCurrentNode());		il.append(classGen.loadTranslet());		if (classGen.isExternal()) {		    final String className = classGen.getClassName();		    il.append(new CHECKCAST(cpg.addClass(className)));		}		il.append(new INVOKESPECIAL(idx));	    }	}    }    /**     * Returns a string representation of this step.     */    public String toString() {	final StringBuffer buffer = new StringBuffer("step(\"");        buffer.append(Axis.getNames(_axis)).append("\", ").append(_nodeType);	if (_predicates != null) {	    final int n = _predicates.size();	    for (int i = 0; i < n; i++) {		final Predicate pred = (Predicate)_predicates.elementAt(i);		buffer.append(", ").append(pred.toString());	    }	}	return buffer.append(')').toString();    }}

⌨️ 快捷键说明

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