001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: CompareGenerator.java 468649 2006-10-28 07:00:55Z minchau $
020 */
021
022 package org.apache.xalan.xsltc.compiler.util;
023
024 import org.apache.bcel.generic.ACONST_NULL;
025 import org.apache.bcel.generic.ALOAD;
026 import org.apache.bcel.generic.ASTORE;
027 import org.apache.bcel.generic.ConstantPoolGen;
028 import org.apache.bcel.generic.ILOAD;
029 import org.apache.bcel.generic.ISTORE;
030 import org.apache.bcel.generic.Instruction;
031 import org.apache.bcel.generic.InstructionList;
032 import org.apache.bcel.generic.LocalVariableGen;
033 import org.apache.bcel.generic.Type;
034 import org.apache.xalan.xsltc.compiler.Constants;
035
036 /**
037 * @author Jacek Ambroziak
038 * @author Santiago Pericas-Geertsen
039 */
040 public final class CompareGenerator extends MethodGenerator {
041
042 private static int DOM_INDEX = 1;
043 private static int CURRENT_INDEX = 2;
044 private static int LEVEL_INDEX = 3;
045 private static int TRANSLET_INDEX = 4;
046 private static int LAST_INDEX = 5;
047 private int ITERATOR_INDEX = 6;
048
049 private final Instruction _iloadCurrent;
050 private final Instruction _istoreCurrent;
051 private final Instruction _aloadDom;
052 private final Instruction _iloadLast;
053 private final Instruction _aloadIterator;
054 private final Instruction _astoreIterator;
055
056 public CompareGenerator(int access_flags, Type return_type,
057 Type[] arg_types, String[] arg_names,
058 String method_name, String class_name,
059 InstructionList il, ConstantPoolGen cp) {
060 super(access_flags, return_type, arg_types, arg_names, method_name,
061 class_name, il, cp);
062
063 _iloadCurrent = new ILOAD(CURRENT_INDEX);
064 _istoreCurrent = new ISTORE(CURRENT_INDEX);
065 _aloadDom = new ALOAD(DOM_INDEX);
066 _iloadLast = new ILOAD(LAST_INDEX);
067
068 LocalVariableGen iterator =
069 addLocalVariable("iterator",
070 Util.getJCRefType(Constants.NODE_ITERATOR_SIG),
071 null, null);
072 ITERATOR_INDEX = iterator.getIndex();
073 _aloadIterator = new ALOAD(ITERATOR_INDEX);
074 _astoreIterator = new ASTORE(ITERATOR_INDEX);
075 il.append(new ACONST_NULL());
076 il.append(storeIterator());
077 }
078
079 public Instruction loadLastNode() {
080 return _iloadLast;
081 }
082
083 public Instruction loadCurrentNode() {
084 return _iloadCurrent;
085 }
086
087 public Instruction storeCurrentNode() {
088 return _istoreCurrent;
089 }
090
091 public Instruction loadDOM() {
092 return _aloadDom;
093 }
094
095 public int getHandlerIndex() {
096 return INVALID_INDEX; // not available
097 }
098
099 public int getIteratorIndex() {
100 return INVALID_INDEX;
101 }
102
103 public Instruction storeIterator() {
104 return _astoreIterator;
105 }
106
107 public Instruction loadIterator() {
108 return _aloadIterator;
109 }
110
111 //??? may not be used anymore
112 public int getLocalIndex(String name) {
113 if (name.equals("current")) {
114 return CURRENT_INDEX;
115 }
116 return super.getLocalIndex(name);
117 }
118 }