a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * reserved comment block
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT REMOVE OR ALTER!
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright 2001-2004 The Apache Software Foundation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Licensed under the Apache License, Version 2.0 (the "License");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * you may not use this file except in compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You may obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * http://www.apache.org/licenses/LICENSE-2.0
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Unless required by applicable law or agreed to in writing, software
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * distributed under the License is distributed on an "AS IS" BASIS,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing permissions and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: ParameterRef.java,v 1.2.4.1 2005/09/02 11:05:08 pvedula Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.org.apache.xalan.internal.xsltc.compiler;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.bcel.internal.generic.CHECKCAST;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.bcel.internal.generic.GETFIELD;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.bcel.internal.generic.INVOKEINTERFACE;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.bcel.internal.generic.InstructionList;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.xalan.internal.xsltc.compiler.util.NodeSetType;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @author Jacek Ambroziak
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @author Santiago Pericas-Geertsen
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @author Morten Jorgensen
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @author Erwin Bolwidt <ejb@klomp.org>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfinal class ParameterRef extends VariableRefBase {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Name of param being referenced.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster QName _name = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public ParameterRef(Param param) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster super(param);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster _name = param._name;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public String toString() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return "parameter-ref("+_variable.getName()+'/'+_variable.getType()+')';
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final ConstantPoolGen cpg = classGen.getConstantPool();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final InstructionList il = methodGen.getInstructionList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * To fix bug 24518 related to setting parameters of the form
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * {namespaceuri}localName, which will get mapped to an instance
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * variable in the class.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final String name = BasisLibrary.mapQNameToJavaName (_name.toString());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster final String signature = _type.toSignature();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
if (_variable.isLocal()) {
if (classGen.isExternal()) {
Closure variableClosure = _closure;
while (variableClosure != null) {
if (variableClosure.inInnerClass()) break;
variableClosure = variableClosure.getParentClosure();
}
if (variableClosure != null) {
il.append(ALOAD_0);
il.append(new GETFIELD(
cpg.addFieldref(variableClosure.getInnerClassName(),
name, signature)));
}
else {
il.append(_variable.loadInstruction());
}
}
else {
il.append(_variable.loadInstruction());
}
}
else {
final String className = classGen.getClassName();
il.append(classGen.loadTranslet());
if (classGen.isExternal()) {
il.append(new CHECKCAST(cpg.addClass(className)));
}
il.append(new GETFIELD(cpg.addFieldref(className,name,signature)));
}
if (_variable.getType() instanceof NodeSetType) {
// The method cloneIterator() also does resetting
final int clone = cpg.addInterfaceMethodref(NODE_ITERATOR,
"cloneIterator",
"()" +
NODE_ITERATOR_SIG);
il.append(new INVOKEINTERFACE(clone, 1));
}
}
}