<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<FONT color="green">003</FONT>     * or more contributor license agreements. See the NOTICE file<a name="line.3"></a>
<FONT color="green">004</FONT>     * distributed with this work for additional information<a name="line.4"></a>
<FONT color="green">005</FONT>     * regarding copyright ownership. The ASF licenses this file<a name="line.5"></a>
<FONT color="green">006</FONT>     * to you under the Apache License, Version 2.0 (the  "License");<a name="line.6"></a>
<FONT color="green">007</FONT>     * you may not use this file except in compliance with the License.<a name="line.7"></a>
<FONT color="green">008</FONT>     * You may obtain a copy of the License at<a name="line.8"></a>
<FONT color="green">009</FONT>     *<a name="line.9"></a>
<FONT color="green">010</FONT>     *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<FONT color="green">013</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<FONT color="green">014</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<FONT color="green">015</FONT>     * See the License for the specific language governing permissions and<a name="line.15"></a>
<FONT color="green">016</FONT>     * limitations under the License.<a name="line.16"></a>
<FONT color="green">017</FONT>     */<a name="line.17"></a>
<FONT color="green">018</FONT>    /*<a name="line.18"></a>
<FONT color="green">019</FONT>     * $Id: ReferenceType.java 468649 2006-10-28 07:00:55Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    <a name="line.21"></a>
<FONT color="green">022</FONT>    package org.apache.xalan.xsltc.compiler.util;<a name="line.22"></a>
<FONT color="green">023</FONT>    <a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.bcel.generic.PUSH;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.bcel.generic.ALOAD;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.bcel.generic.ASTORE;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.bcel.generic.ConstantPoolGen;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.bcel.generic.IFEQ;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.bcel.generic.ILOAD;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.bcel.generic.INVOKEINTERFACE;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.bcel.generic.INVOKESTATIC;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.bcel.generic.Instruction;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.bcel.generic.InstructionList;<a name="line.33"></a>
<FONT color="green">034</FONT>    <a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.xalan.xsltc.compiler.Constants;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.xalan.xsltc.compiler.FlowList;<a name="line.36"></a>
<FONT color="green">037</FONT>    <a name="line.37"></a>
<FONT color="green">038</FONT>    import org.apache.xml.dtm.DTM;<a name="line.38"></a>
<FONT color="green">039</FONT>    <a name="line.39"></a>
<FONT color="green">040</FONT>    /**<a name="line.40"></a>
<FONT color="green">041</FONT>     * @author Jacek Ambroziak<a name="line.41"></a>
<FONT color="green">042</FONT>     * @author Santiago Pericas-Geertsen<a name="line.42"></a>
<FONT color="green">043</FONT>     * @author Erwin Bolwidt &lt;ejb@klomp.org&gt;<a name="line.43"></a>
<FONT color="green">044</FONT>     */<a name="line.44"></a>
<FONT color="green">045</FONT>    public final class ReferenceType extends Type {<a name="line.45"></a>
<FONT color="green">046</FONT>        protected ReferenceType() {}<a name="line.46"></a>
<FONT color="green">047</FONT>    <a name="line.47"></a>
<FONT color="green">048</FONT>        public String toString() {<a name="line.48"></a>
<FONT color="green">049</FONT>            return "reference";<a name="line.49"></a>
<FONT color="green">050</FONT>        }<a name="line.50"></a>
<FONT color="green">051</FONT>    <a name="line.51"></a>
<FONT color="green">052</FONT>        public boolean identicalTo(Type other) {<a name="line.52"></a>
<FONT color="green">053</FONT>            return this == other;<a name="line.53"></a>
<FONT color="green">054</FONT>        }<a name="line.54"></a>
<FONT color="green">055</FONT>    <a name="line.55"></a>
<FONT color="green">056</FONT>        public String toSignature() {<a name="line.56"></a>
<FONT color="green">057</FONT>            return "Ljava/lang/Object;";<a name="line.57"></a>
<FONT color="green">058</FONT>        }<a name="line.58"></a>
<FONT color="green">059</FONT>    <a name="line.59"></a>
<FONT color="green">060</FONT>        public org.apache.bcel.generic.Type toJCType() {<a name="line.60"></a>
<FONT color="green">061</FONT>            return org.apache.bcel.generic.Type.OBJECT;<a name="line.61"></a>
<FONT color="green">062</FONT>        }<a name="line.62"></a>
<FONT color="green">063</FONT>    <a name="line.63"></a>
<FONT color="green">064</FONT>        /**<a name="line.64"></a>
<FONT color="green">065</FONT>         * Translates a reference to an object of internal type &lt;code&gt;type&lt;/code&gt;.<a name="line.65"></a>
<FONT color="green">066</FONT>         * The translation to int is undefined since references<a name="line.66"></a>
<FONT color="green">067</FONT>         * are always converted to reals in arithmetic expressions.<a name="line.67"></a>
<FONT color="green">068</FONT>         *<a name="line.68"></a>
<FONT color="green">069</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.69"></a>
<FONT color="green">070</FONT>         */<a name="line.70"></a>
<FONT color="green">071</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.71"></a>
<FONT color="green">072</FONT>                                Type type) {<a name="line.72"></a>
<FONT color="green">073</FONT>            if (type == Type.String) {<a name="line.73"></a>
<FONT color="green">074</FONT>                translateTo(classGen, methodGen, (StringType) type);<a name="line.74"></a>
<FONT color="green">075</FONT>            }<a name="line.75"></a>
<FONT color="green">076</FONT>            else if (type == Type.Real) {<a name="line.76"></a>
<FONT color="green">077</FONT>                translateTo(classGen, methodGen, (RealType) type);<a name="line.77"></a>
<FONT color="green">078</FONT>            }<a name="line.78"></a>
<FONT color="green">079</FONT>            else if (type == Type.Boolean) {<a name="line.79"></a>
<FONT color="green">080</FONT>                translateTo(classGen, methodGen, (BooleanType) type);<a name="line.80"></a>
<FONT color="green">081</FONT>            }<a name="line.81"></a>
<FONT color="green">082</FONT>            else if (type == Type.NodeSet) {<a name="line.82"></a>
<FONT color="green">083</FONT>                translateTo(classGen, methodGen, (NodeSetType) type);<a name="line.83"></a>
<FONT color="green">084</FONT>            }<a name="line.84"></a>
<FONT color="green">085</FONT>            else if (type == Type.Node) {<a name="line.85"></a>
<FONT color="green">086</FONT>                translateTo(classGen, methodGen, (NodeType) type);<a name="line.86"></a>
<FONT color="green">087</FONT>            }<a name="line.87"></a>
<FONT color="green">088</FONT>            else if (type == Type.ResultTree) {<a name="line.88"></a>
<FONT color="green">089</FONT>                translateTo(classGen, methodGen, (ResultTreeType) type);<a name="line.89"></a>
<FONT color="green">090</FONT>            }<a name="line.90"></a>
<FONT color="green">091</FONT>            else if (type == Type.Object) {<a name="line.91"></a>
<FONT color="green">092</FONT>                translateTo(classGen, methodGen, (ObjectType) type);<a name="line.92"></a>
<FONT color="green">093</FONT>            }<a name="line.93"></a>
<FONT color="green">094</FONT>            else if (type == Type.Reference ) {<a name="line.94"></a>
<FONT color="green">095</FONT>            }       <a name="line.95"></a>
<FONT color="green">096</FONT>            else {<a name="line.96"></a>
<FONT color="green">097</FONT>                ErrorMsg err = new ErrorMsg(ErrorMsg.INTERNAL_ERR, type.toString());<a name="line.97"></a>
<FONT color="green">098</FONT>                classGen.getParser().reportError(Constants.FATAL, err);<a name="line.98"></a>
<FONT color="green">099</FONT>            }<a name="line.99"></a>
<FONT color="green">100</FONT>        }<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>        /**<a name="line.102"></a>
<FONT color="green">103</FONT>         * Translates reference into object of internal type &lt;code&gt;type&lt;/code&gt;.<a name="line.103"></a>
<FONT color="green">104</FONT>         *<a name="line.104"></a>
<FONT color="green">105</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.105"></a>
<FONT color="green">106</FONT>         */<a name="line.106"></a>
<FONT color="green">107</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.107"></a>
<FONT color="green">108</FONT>                                StringType type) {<a name="line.108"></a>
<FONT color="green">109</FONT>            final int current = methodGen.getLocalIndex("current");<a name="line.109"></a>
<FONT color="green">110</FONT>            ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.110"></a>
<FONT color="green">111</FONT>            InstructionList il = methodGen.getInstructionList();<a name="line.111"></a>
<FONT color="green">112</FONT>    <a name="line.112"></a>
<FONT color="green">113</FONT>            // If no current, conversion is a top-level<a name="line.113"></a>
<FONT color="green">114</FONT>            if (current &lt; 0) {<a name="line.114"></a>
<FONT color="green">115</FONT>                il.append(new PUSH(cpg, DTM.ROOT_NODE));  // push root node<a name="line.115"></a>
<FONT color="green">116</FONT>            }<a name="line.116"></a>
<FONT color="green">117</FONT>            else {<a name="line.117"></a>
<FONT color="green">118</FONT>                il.append(new ILOAD(current));<a name="line.118"></a>
<FONT color="green">119</FONT>            }<a name="line.119"></a>
<FONT color="green">120</FONT>            il.append(methodGen.loadDOM());<a name="line.120"></a>
<FONT color="green">121</FONT>            final int stringF = cpg.addMethodref(BASIS_LIBRARY_CLASS,<a name="line.121"></a>
<FONT color="green">122</FONT>                                                 "stringF",<a name="line.122"></a>
<FONT color="green">123</FONT>                                                 "("<a name="line.123"></a>
<FONT color="green">124</FONT>                                                 + OBJECT_SIG<a name="line.124"></a>
<FONT color="green">125</FONT>                                                 + NODE_SIG<a name="line.125"></a>
<FONT color="green">126</FONT>                                                 + DOM_INTF_SIG<a name="line.126"></a>
<FONT color="green">127</FONT>                                                 + ")" + STRING_SIG);<a name="line.127"></a>
<FONT color="green">128</FONT>            il.append(new INVOKESTATIC(stringF));<a name="line.128"></a>
<FONT color="green">129</FONT>        }<a name="line.129"></a>
<FONT color="green">130</FONT>    <a name="line.130"></a>
<FONT color="green">131</FONT>        /**<a name="line.131"></a>
<FONT color="green">132</FONT>         * Translates a reference into an object of internal type &lt;code&gt;type&lt;/code&gt;.<a name="line.132"></a>
<FONT color="green">133</FONT>         *<a name="line.133"></a>
<FONT color="green">134</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.134"></a>
<FONT color="green">135</FONT>         */<a name="line.135"></a>
<FONT color="green">136</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.136"></a>
<FONT color="green">137</FONT>                                RealType type) {<a name="line.137"></a>
<FONT color="green">138</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.138"></a>
<FONT color="green">139</FONT>            final InstructionList il = methodGen.getInstructionList();<a name="line.139"></a>
<FONT color="green">140</FONT>    <a name="line.140"></a>
<FONT color="green">141</FONT>            il.append(methodGen.loadDOM());<a name="line.141"></a>
<FONT color="green">142</FONT>            int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "numberF",<a name="line.142"></a>
<FONT color="green">143</FONT>                                         "("<a name="line.143"></a>
<FONT color="green">144</FONT>                                         + OBJECT_SIG<a name="line.144"></a>
<FONT color="green">145</FONT>                                         + DOM_INTF_SIG<a name="line.145"></a>
<FONT color="green">146</FONT>                                         + ")D");<a name="line.146"></a>
<FONT color="green">147</FONT>            il.append(new INVOKESTATIC(index));<a name="line.147"></a>
<FONT color="green">148</FONT>        }<a name="line.148"></a>
<FONT color="green">149</FONT>    <a name="line.149"></a>
<FONT color="green">150</FONT>        /**<a name="line.150"></a>
<FONT color="green">151</FONT>         * Translates a reference to an object of internal type &lt;code&gt;type&lt;/code&gt;.<a name="line.151"></a>
<FONT color="green">152</FONT>         *<a name="line.152"></a>
<FONT color="green">153</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.153"></a>
<FONT color="green">154</FONT>         */<a name="line.154"></a>
<FONT color="green">155</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.155"></a>
<FONT color="green">156</FONT>                                BooleanType type) {<a name="line.156"></a>
<FONT color="green">157</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.157"></a>
<FONT color="green">158</FONT>            final InstructionList il = methodGen.getInstructionList();<a name="line.158"></a>
<FONT color="green">159</FONT>    <a name="line.159"></a>
<FONT color="green">160</FONT>            int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "booleanF",<a name="line.160"></a>
<FONT color="green">161</FONT>                                         "("<a name="line.161"></a>
<FONT color="green">162</FONT>                                         + OBJECT_SIG<a name="line.162"></a>
<FONT color="green">163</FONT>                                         + ")Z");<a name="line.163"></a>
<FONT color="green">164</FONT>            il.append(new INVOKESTATIC(index));<a name="line.164"></a>
<FONT color="green">165</FONT>        }<a name="line.165"></a>
<FONT color="green">166</FONT>    <a name="line.166"></a>
<FONT color="green">167</FONT>        /**<a name="line.167"></a>
<FONT color="green">168</FONT>         * Casts a reference into a NodeIterator.<a name="line.168"></a>
<FONT color="green">169</FONT>         *<a name="line.169"></a>
<FONT color="green">170</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.170"></a>
<FONT color="green">171</FONT>         */<a name="line.171"></a>
<FONT color="green">172</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.172"></a>
<FONT color="green">173</FONT>                                NodeSetType type) {<a name="line.173"></a>
<FONT color="green">174</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.174"></a>
<FONT color="green">175</FONT>            final InstructionList il = methodGen.getInstructionList();<a name="line.175"></a>
<FONT color="green">176</FONT>            int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "referenceToNodeSet",<a name="line.176"></a>
<FONT color="green">177</FONT>                                         "("<a name="line.177"></a>
<FONT color="green">178</FONT>                                         + OBJECT_SIG<a name="line.178"></a>
<FONT color="green">179</FONT>                                         + ")"<a name="line.179"></a>
<FONT color="green">180</FONT>                                         + NODE_ITERATOR_SIG);<a name="line.180"></a>
<FONT color="green">181</FONT>            il.append(new INVOKESTATIC(index));<a name="line.181"></a>
<FONT color="green">182</FONT>    <a name="line.182"></a>
<FONT color="green">183</FONT>            // Reset this iterator<a name="line.183"></a>
<FONT color="green">184</FONT>            index = cpg.addInterfaceMethodref(NODE_ITERATOR, RESET, RESET_SIG);<a name="line.184"></a>
<FONT color="green">185</FONT>            il.append(new INVOKEINTERFACE(index, 1));<a name="line.185"></a>
<FONT color="green">186</FONT>        }<a name="line.186"></a>
<FONT color="green">187</FONT>    <a name="line.187"></a>
<FONT color="green">188</FONT>        /**<a name="line.188"></a>
<FONT color="green">189</FONT>         * Casts a reference into a Node.<a name="line.189"></a>
<FONT color="green">190</FONT>         *<a name="line.190"></a>
<FONT color="green">191</FONT>         * @see org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.191"></a>
<FONT color="green">192</FONT>         */<a name="line.192"></a>
<FONT color="green">193</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.193"></a>
<FONT color="green">194</FONT>                                NodeType type) {<a name="line.194"></a>
<FONT color="green">195</FONT>            translateTo(classGen, methodGen, Type.NodeSet);<a name="line.195"></a>
<FONT color="green">196</FONT>            Type.NodeSet.translateTo(classGen, methodGen, type);<a name="line.196"></a>
<FONT color="green">197</FONT>        }<a name="line.197"></a>
<FONT color="green">198</FONT>    <a name="line.198"></a>
<FONT color="green">199</FONT>        /**<a name="line.199"></a>
<FONT color="green">200</FONT>         * Casts a reference into a ResultTree.<a name="line.200"></a>
<FONT color="green">201</FONT>         *<a name="line.201"></a>
<FONT color="green">202</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.202"></a>
<FONT color="green">203</FONT>         */<a name="line.203"></a>
<FONT color="green">204</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.204"></a>
<FONT color="green">205</FONT>                                ResultTreeType type) {<a name="line.205"></a>
<FONT color="green">206</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.206"></a>
<FONT color="green">207</FONT>            final InstructionList il = methodGen.getInstructionList();<a name="line.207"></a>
<FONT color="green">208</FONT>            int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "referenceToResultTree",<a name="line.208"></a>
<FONT color="green">209</FONT>                                         "(" + OBJECT_SIG + ")" + DOM_INTF_SIG);<a name="line.209"></a>
<FONT color="green">210</FONT>            il.append(new INVOKESTATIC(index));<a name="line.210"></a>
<FONT color="green">211</FONT>        }<a name="line.211"></a>
<FONT color="green">212</FONT>    <a name="line.212"></a>
<FONT color="green">213</FONT>        /**<a name="line.213"></a>
<FONT color="green">214</FONT>         * Subsume reference into ObjectType.<a name="line.214"></a>
<FONT color="green">215</FONT>         *<a name="line.215"></a>
<FONT color="green">216</FONT>         * @see     org.apache.xalan.xsltc.compiler.util.Type#translateTo<a name="line.216"></a>
<FONT color="green">217</FONT>         */<a name="line.217"></a>
<FONT color="green">218</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.218"></a>
<FONT color="green">219</FONT>                                ObjectType type) {<a name="line.219"></a>
<FONT color="green">220</FONT>            methodGen.getInstructionList().append(NOP);<a name="line.220"></a>
<FONT color="green">221</FONT>        }<a name="line.221"></a>
<FONT color="green">222</FONT>    <a name="line.222"></a>
<FONT color="green">223</FONT>        /**<a name="line.223"></a>
<FONT color="green">224</FONT>         * Translates a reference into the Java type denoted by &lt;code&gt;clazz&lt;/code&gt;.<a name="line.224"></a>
<FONT color="green">225</FONT>         */<a name="line.225"></a>
<FONT color="green">226</FONT>        public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.226"></a>
<FONT color="green">227</FONT>                                Class clazz) {<a name="line.227"></a>
<FONT color="green">228</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.228"></a>
<FONT color="green">229</FONT>            final InstructionList il = methodGen.getInstructionList();<a name="line.229"></a>
<FONT color="green">230</FONT>    <a name="line.230"></a>
<FONT color="green">231</FONT>            int referenceToLong = cpg.addMethodref(BASIS_LIBRARY_CLASS, <a name="line.231"></a>
<FONT color="green">232</FONT>                                                   "referenceToLong", <a name="line.232"></a>
<FONT color="green">233</FONT>                                                   "(" + OBJECT_SIG + ")J");<a name="line.233"></a>
<FONT color="green">234</FONT>            int referenceToDouble = cpg.addMethodref(BASIS_LIBRARY_CLASS, <a name="line.234"></a>
<FONT color="green">235</FONT>                                                     "referenceToDouble", <a name="line.235"></a>
<FONT color="green">236</FONT>                                                    "(" + OBJECT_SIG + ")D");      <a name="line.236"></a>
<FONT color="green">237</FONT>            int referenceToBoolean = cpg.addMethodref(BASIS_LIBRARY_CLASS, <a name="line.237"></a>
<FONT color="green">238</FONT>                                                      "referenceToBoolean", <a name="line.238"></a>
<FONT color="green">239</FONT>                                                     "(" + OBJECT_SIG + ")Z");<a name="line.239"></a>
<FONT color="green">240</FONT>            <a name="line.240"></a>
<FONT color="green">241</FONT>            if (clazz.getName().equals("java.lang.Object")) {<a name="line.241"></a>
<FONT color="green">242</FONT>                il.append(NOP);<a name="line.242"></a>
<FONT color="green">243</FONT>            }<a name="line.243"></a>
<FONT color="green">244</FONT>            else if (clazz == Double.TYPE) {<a name="line.244"></a>
<FONT color="green">245</FONT>                il.append(new INVOKESTATIC(referenceToDouble));<a name="line.245"></a>
<FONT color="green">246</FONT>            }<a name="line.246"></a>
<FONT color="green">247</FONT>            else if (clazz.getName().equals("java.lang.Double")) {<a name="line.247"></a>
<FONT color="green">248</FONT>                il.append(new INVOKESTATIC(referenceToDouble));<a name="line.248"></a>
<FONT color="green">249</FONT>                Type.Real.translateTo(classGen, methodGen, Type.Reference);<a name="line.249"></a>
<FONT color="green">250</FONT>            }<a name="line.250"></a>
<FONT color="green">251</FONT>            else if (clazz == Float.TYPE) {<a name="line.251"></a>
<FONT color="green">252</FONT>                il.append(new INVOKESTATIC(referenceToDouble));<a name="line.252"></a>
<FONT color="green">253</FONT>                il.append(D2F);<a name="line.253"></a>
<FONT color="green">254</FONT>            }<a name="line.254"></a>
<FONT color="green">255</FONT>            else if (clazz.getName().equals("java.lang.String")) {<a name="line.255"></a>
<FONT color="green">256</FONT>                int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "referenceToString",<a name="line.256"></a>
<FONT color="green">257</FONT>                                             "("<a name="line.257"></a>
<FONT color="green">258</FONT>                                             + OBJECT_SIG<a name="line.258"></a>
<FONT color="green">259</FONT>                                             + DOM_INTF_SIG<a name="line.259"></a>
<FONT color="green">260</FONT>                                             + ")"<a name="line.260"></a>
<FONT color="green">261</FONT>                                             + "Ljava/lang/String;");<a name="line.261"></a>
<FONT color="green">262</FONT>                il.append(methodGen.loadDOM());<a name="line.262"></a>
<FONT color="green">263</FONT>                il.append(new INVOKESTATIC(index));<a name="line.263"></a>
<FONT color="green">264</FONT>            }<a name="line.264"></a>
<FONT color="green">265</FONT>            else if (clazz.getName().equals("org.w3c.dom.Node")) {<a name="line.265"></a>
<FONT color="green">266</FONT>                int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "referenceToNode",<a name="line.266"></a>
<FONT color="green">267</FONT>                                             "("<a name="line.267"></a>
<FONT color="green">268</FONT>                                             + OBJECT_SIG<a name="line.268"></a>
<FONT color="green">269</FONT>                                             + DOM_INTF_SIG<a name="line.269"></a>
<FONT color="green">270</FONT>                                             + ")"<a name="line.270"></a>
<FONT color="green">271</FONT>                                             + "Lorg/w3c/dom/Node;");<a name="line.271"></a>
<FONT color="green">272</FONT>                il.append(methodGen.loadDOM());<a name="line.272"></a>
<FONT color="green">273</FONT>                il.append(new INVOKESTATIC(index));<a name="line.273"></a>
<FONT color="green">274</FONT>            }<a name="line.274"></a>
<FONT color="green">275</FONT>            else if (clazz.getName().equals("org.w3c.dom.NodeList")) {<a name="line.275"></a>
<FONT color="green">276</FONT>                int index = cpg.addMethodref(BASIS_LIBRARY_CLASS, "referenceToNodeList",<a name="line.276"></a>
<FONT color="green">277</FONT>                                             "("<a name="line.277"></a>
<FONT color="green">278</FONT>                                             + OBJECT_SIG<a name="line.278"></a>
<FONT color="green">279</FONT>                                             + DOM_INTF_SIG<a name="line.279"></a>
<FONT color="green">280</FONT>                                             + ")"<a name="line.280"></a>
<FONT color="green">281</FONT>                                             + "Lorg/w3c/dom/NodeList;");<a name="line.281"></a>
<FONT color="green">282</FONT>                il.append(methodGen.loadDOM());<a name="line.282"></a>
<FONT color="green">283</FONT>                il.append(new INVOKESTATIC(index));<a name="line.283"></a>
<FONT color="green">284</FONT>            }<a name="line.284"></a>
<FONT color="green">285</FONT>            else if (clazz.getName().equals("org.apache.xalan.xsltc.DOM")) {<a name="line.285"></a>
<FONT color="green">286</FONT>                translateTo(classGen, methodGen, Type.ResultTree);<a name="line.286"></a>
<FONT color="green">287</FONT>            }<a name="line.287"></a>
<FONT color="green">288</FONT>            else if (clazz == Long.TYPE) {<a name="line.288"></a>
<FONT color="green">289</FONT>                il.append(new INVOKESTATIC(referenceToLong));<a name="line.289"></a>
<FONT color="green">290</FONT>            }<a name="line.290"></a>
<FONT color="green">291</FONT>            else if (clazz == Integer.TYPE) {<a name="line.291"></a>
<FONT color="green">292</FONT>                il.append(new INVOKESTATIC(referenceToLong));<a name="line.292"></a>
<FONT color="green">293</FONT>                il.append(L2I);<a name="line.293"></a>
<FONT color="green">294</FONT>            }<a name="line.294"></a>
<FONT color="green">295</FONT>            else if (clazz == Short.TYPE) {<a name="line.295"></a>
<FONT color="green">296</FONT>                il.append(new INVOKESTATIC(referenceToLong));<a name="line.296"></a>
<FONT color="green">297</FONT>                il.append(L2I);<a name="line.297"></a>
<FONT color="green">298</FONT>                il.append(I2S);<a name="line.298"></a>
<FONT color="green">299</FONT>            }<a name="line.299"></a>
<FONT color="green">300</FONT>            else if (clazz == Byte.TYPE) {<a name="line.300"></a>
<FONT color="green">301</FONT>                il.append(new INVOKESTATIC(referenceToLong));<a name="line.301"></a>
<FONT color="green">302</FONT>                il.append(L2I);<a name="line.302"></a>
<FONT color="green">303</FONT>                il.append(I2B);<a name="line.303"></a>
<FONT color="green">304</FONT>            }<a name="line.304"></a>
<FONT color="green">305</FONT>            else if (clazz == Character.TYPE) {<a name="line.305"></a>
<FONT color="green">306</FONT>                il.append(new INVOKESTATIC(referenceToLong));<a name="line.306"></a>
<FONT color="green">307</FONT>                il.append(L2I);<a name="line.307"></a>
<FONT color="green">308</FONT>                il.append(I2C);<a name="line.308"></a>
<FONT color="green">309</FONT>            }<a name="line.309"></a>
<FONT color="green">310</FONT>            else if (clazz == java.lang.Boolean.TYPE) {<a name="line.310"></a>
<FONT color="green">311</FONT>                il.append(new INVOKESTATIC(referenceToBoolean));<a name="line.311"></a>
<FONT color="green">312</FONT>            }<a name="line.312"></a>
<FONT color="green">313</FONT>            else if (clazz.getName().equals("java.lang.Boolean")) {<a name="line.313"></a>
<FONT color="green">314</FONT>                il.append(new INVOKESTATIC(referenceToBoolean));<a name="line.314"></a>
<FONT color="green">315</FONT>                Type.Boolean.translateTo(classGen, methodGen, Type.Reference);<a name="line.315"></a>
<FONT color="green">316</FONT>            }<a name="line.316"></a>
<FONT color="green">317</FONT>            else {<a name="line.317"></a>
<FONT color="green">318</FONT>                ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,<a name="line.318"></a>
<FONT color="green">319</FONT>                                            toString(), clazz.getName());<a name="line.319"></a>
<FONT color="green">320</FONT>                classGen.getParser().reportError(Constants.FATAL, err);<a name="line.320"></a>
<FONT color="green">321</FONT>            }<a name="line.321"></a>
<FONT color="green">322</FONT>        }<a name="line.322"></a>
<FONT color="green">323</FONT>    <a name="line.323"></a>
<FONT color="green">324</FONT>        /**<a name="line.324"></a>
<FONT color="green">325</FONT>         * Translates an external Java type into a reference. Only conversion<a name="line.325"></a>
<FONT color="green">326</FONT>         * allowed is from java.lang.Object.<a name="line.326"></a>
<FONT color="green">327</FONT>         */<a name="line.327"></a>
<FONT color="green">328</FONT>        public void translateFrom(ClassGenerator classGen, MethodGenerator methodGen,<a name="line.328"></a>
<FONT color="green">329</FONT>                                  Class clazz) {<a name="line.329"></a>
<FONT color="green">330</FONT>            if (clazz.getName().equals("java.lang.Object")) {<a name="line.330"></a>
<FONT color="green">331</FONT>                methodGen.getInstructionList().append(NOP);<a name="line.331"></a>
<FONT color="green">332</FONT>            }<a name="line.332"></a>
<FONT color="green">333</FONT>            else {<a name="line.333"></a>
<FONT color="green">334</FONT>                ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,<a name="line.334"></a>
<FONT color="green">335</FONT>                                    toString(), clazz.getName());<a name="line.335"></a>
<FONT color="green">336</FONT>                classGen.getParser().reportError(Constants.FATAL, err);<a name="line.336"></a>
<FONT color="green">337</FONT>            }<a name="line.337"></a>
<FONT color="green">338</FONT>        }<a name="line.338"></a>
<FONT color="green">339</FONT>    <a name="line.339"></a>
<FONT color="green">340</FONT>        /**<a name="line.340"></a>
<FONT color="green">341</FONT>         * Expects a reference on the stack and translates it to a non-synthesized<a name="line.341"></a>
<FONT color="green">342</FONT>         * boolean. It does not push a 0 or a 1 but instead returns branchhandle<a name="line.342"></a>
<FONT color="green">343</FONT>         * list to be appended to the false list.<a name="line.343"></a>
<FONT color="green">344</FONT>         *<a name="line.344"></a>
<FONT color="green">345</FONT>         * @see org.apache.xalan.xsltc.compiler.util.Type#translateToDesynthesized<a name="line.345"></a>
<FONT color="green">346</FONT>         */<a name="line.346"></a>
<FONT color="green">347</FONT>        public FlowList translateToDesynthesized(ClassGenerator classGen,<a name="line.347"></a>
<FONT color="green">348</FONT>                                                 MethodGenerator methodGen,<a name="line.348"></a>
<FONT color="green">349</FONT>                                                 BooleanType type) {<a name="line.349"></a>
<FONT color="green">350</FONT>            InstructionList il = methodGen.getInstructionList();<a name="line.350"></a>
<FONT color="green">351</FONT>            translateTo(classGen, methodGen, type);<a name="line.351"></a>
<FONT color="green">352</FONT>            return new FlowList(il.append(new IFEQ(null)));<a name="line.352"></a>
<FONT color="green">353</FONT>        }<a name="line.353"></a>
<FONT color="green">354</FONT>    <a name="line.354"></a>
<FONT color="green">355</FONT>        /**<a name="line.355"></a>
<FONT color="green">356</FONT>         * Translates an object of this type to its boxed representation.<a name="line.356"></a>
<FONT color="green">357</FONT>         */<a name="line.357"></a>
<FONT color="green">358</FONT>        public void translateBox(ClassGenerator classGen,<a name="line.358"></a>
<FONT color="green">359</FONT>                                 MethodGenerator methodGen) {<a name="line.359"></a>
<FONT color="green">360</FONT>        }<a name="line.360"></a>
<FONT color="green">361</FONT>    <a name="line.361"></a>
<FONT color="green">362</FONT>        /**<a name="line.362"></a>
<FONT color="green">363</FONT>         * Translates an object of this type to its unboxed representation.<a name="line.363"></a>
<FONT color="green">364</FONT>         */<a name="line.364"></a>
<FONT color="green">365</FONT>        public void translateUnBox(ClassGenerator classGen,<a name="line.365"></a>
<FONT color="green">366</FONT>                                   MethodGenerator methodGen) {<a name="line.366"></a>
<FONT color="green">367</FONT>        }<a name="line.367"></a>
<FONT color="green">368</FONT>    <a name="line.368"></a>
<FONT color="green">369</FONT>    <a name="line.369"></a>
<FONT color="green">370</FONT>        public Instruction LOAD(int slot) {<a name="line.370"></a>
<FONT color="green">371</FONT>            return new ALOAD(slot);<a name="line.371"></a>
<FONT color="green">372</FONT>        }<a name="line.372"></a>
<FONT color="green">373</FONT>    <a name="line.373"></a>
<FONT color="green">374</FONT>        public Instruction STORE(int slot) {<a name="line.374"></a>
<FONT color="green">375</FONT>            return new ASTORE(slot);<a name="line.375"></a>
<FONT color="green">376</FONT>        }<a name="line.376"></a>
<FONT color="green">377</FONT>    }<a name="line.377"></a>
<FONT color="green">378</FONT>    <a name="line.378"></a>




























































</PRE>
</BODY>
</HTML>
