<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: Whitespace.java 468650 2006-10-28 07:03:30Z 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;<a name="line.22"></a>
<FONT color="green">023</FONT>    <a name="line.23"></a>
<FONT color="green">024</FONT>    import java.util.StringTokenizer;<a name="line.24"></a>
<FONT color="green">025</FONT>    import java.util.Vector;<a name="line.25"></a>
<FONT color="green">026</FONT>    <a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.bcel.generic.ALOAD;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.bcel.generic.BranchHandle;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.bcel.generic.ConstantPoolGen;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.apache.bcel.generic.IF_ICMPEQ;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.apache.bcel.generic.ILOAD;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.apache.bcel.generic.INVOKEINTERFACE;<a name="line.32"></a>
<FONT color="green">033</FONT>    import org.apache.bcel.generic.INVOKEVIRTUAL;<a name="line.33"></a>
<FONT color="green">034</FONT>    import org.apache.bcel.generic.InstructionHandle;<a name="line.34"></a>
<FONT color="green">035</FONT>    import org.apache.bcel.generic.InstructionList;<a name="line.35"></a>
<FONT color="green">036</FONT>    import org.apache.bcel.generic.PUSH;<a name="line.36"></a>
<FONT color="green">037</FONT>    import org.apache.xalan.xsltc.compiler.util.ClassGenerator;<a name="line.37"></a>
<FONT color="green">038</FONT>    import org.apache.xalan.xsltc.compiler.util.ErrorMsg;<a name="line.38"></a>
<FONT color="green">039</FONT>    import org.apache.xalan.xsltc.compiler.util.MethodGenerator;<a name="line.39"></a>
<FONT color="green">040</FONT>    import org.apache.xalan.xsltc.compiler.util.Type;<a name="line.40"></a>
<FONT color="green">041</FONT>    import org.apache.xalan.xsltc.compiler.util.TypeCheckError;<a name="line.41"></a>
<FONT color="green">042</FONT>    import org.apache.xalan.xsltc.compiler.util.Util;<a name="line.42"></a>
<FONT color="green">043</FONT>    <a name="line.43"></a>
<FONT color="green">044</FONT>    /**<a name="line.44"></a>
<FONT color="green">045</FONT>     * @author Morten Jorgensen<a name="line.45"></a>
<FONT color="green">046</FONT>     */<a name="line.46"></a>
<FONT color="green">047</FONT>    final class Whitespace extends TopLevelElement {<a name="line.47"></a>
<FONT color="green">048</FONT>        // Three possible actions for the translet:<a name="line.48"></a>
<FONT color="green">049</FONT>        public static final int USE_PREDICATE  = 0;<a name="line.49"></a>
<FONT color="green">050</FONT>        public static final int STRIP_SPACE    = 1;<a name="line.50"></a>
<FONT color="green">051</FONT>        public static final int PRESERVE_SPACE = 2;<a name="line.51"></a>
<FONT color="green">052</FONT>    <a name="line.52"></a>
<FONT color="green">053</FONT>        // The 3 different categories of strip/preserve rules (order important)<a name="line.53"></a>
<FONT color="green">054</FONT>        public static final int RULE_NONE      = 0; <a name="line.54"></a>
<FONT color="green">055</FONT>        public static final int RULE_ELEMENT   = 1; // priority 0<a name="line.55"></a>
<FONT color="green">056</FONT>        public static final int RULE_NAMESPACE = 2; // priority -1/4<a name="line.56"></a>
<FONT color="green">057</FONT>        public static final int RULE_ALL       = 3; // priority -1/2<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>        private String _elementList;<a name="line.59"></a>
<FONT color="green">060</FONT>        private int    _action;<a name="line.60"></a>
<FONT color="green">061</FONT>        private int    _importPrecedence;<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>         * Auxillary class for encapsulating a single strip/preserve rule<a name="line.64"></a>
<FONT color="green">065</FONT>         */<a name="line.65"></a>
<FONT color="green">066</FONT>        private final static class WhitespaceRule {<a name="line.66"></a>
<FONT color="green">067</FONT>            private final int _action;<a name="line.67"></a>
<FONT color="green">068</FONT>            private String _namespace; // Should be replaced by NS type (int)<a name="line.68"></a>
<FONT color="green">069</FONT>            private String _element;   // Should be replaced by node type (int)<a name="line.69"></a>
<FONT color="green">070</FONT>            private int    _type;<a name="line.70"></a>
<FONT color="green">071</FONT>            private int    _priority;<a name="line.71"></a>
<FONT color="green">072</FONT>            <a name="line.72"></a>
<FONT color="green">073</FONT>            /**<a name="line.73"></a>
<FONT color="green">074</FONT>             * Strip/preserve rule constructor<a name="line.74"></a>
<FONT color="green">075</FONT>             */<a name="line.75"></a>
<FONT color="green">076</FONT>            public WhitespaceRule(int action, String element, int precedence) {<a name="line.76"></a>
<FONT color="green">077</FONT>                // Determine the action (strip or preserve) for this rule<a name="line.77"></a>
<FONT color="green">078</FONT>                _action = action;<a name="line.78"></a>
<FONT color="green">079</FONT>    <a name="line.79"></a>
<FONT color="green">080</FONT>                // Get the namespace and element name for this rule<a name="line.80"></a>
<FONT color="green">081</FONT>                final int colon = element.lastIndexOf(':');<a name="line.81"></a>
<FONT color="green">082</FONT>                if (colon &gt;= 0) {<a name="line.82"></a>
<FONT color="green">083</FONT>                    _namespace = element.substring(0,colon);<a name="line.83"></a>
<FONT color="green">084</FONT>                    _element = element.substring(colon+1,element.length());<a name="line.84"></a>
<FONT color="green">085</FONT>                }<a name="line.85"></a>
<FONT color="green">086</FONT>                else {<a name="line.86"></a>
<FONT color="green">087</FONT>                    _namespace = Constants.EMPTYSTRING;<a name="line.87"></a>
<FONT color="green">088</FONT>                    _element = element;<a name="line.88"></a>
<FONT color="green">089</FONT>                }<a name="line.89"></a>
<FONT color="green">090</FONT>    <a name="line.90"></a>
<FONT color="green">091</FONT>                // Determine the initial priority for this rule<a name="line.91"></a>
<FONT color="green">092</FONT>                _priority = precedence &lt;&lt; 2;<a name="line.92"></a>
<FONT color="green">093</FONT>    <a name="line.93"></a>
<FONT color="green">094</FONT>                // Get the strip/preserve type; either "NS:EL", "NS:*" or "*"<a name="line.94"></a>
<FONT color="green">095</FONT>                if (_element.equals("*")) {<a name="line.95"></a>
<FONT color="green">096</FONT>                    if (_namespace == Constants.EMPTYSTRING) {<a name="line.96"></a>
<FONT color="green">097</FONT>                        _type = RULE_ALL;       // Strip/preserve _all_ elements<a name="line.97"></a>
<FONT color="green">098</FONT>                        _priority += 2;         // Lowest priority<a name="line.98"></a>
<FONT color="green">099</FONT>                    }<a name="line.99"></a>
<FONT color="green">100</FONT>                    else {<a name="line.100"></a>
<FONT color="green">101</FONT>                        _type = RULE_NAMESPACE; // Strip/reserve elements within NS<a name="line.101"></a>
<FONT color="green">102</FONT>                        _priority += 1;         // Medium priority<a name="line.102"></a>
<FONT color="green">103</FONT>                    }<a name="line.103"></a>
<FONT color="green">104</FONT>                }<a name="line.104"></a>
<FONT color="green">105</FONT>                else {<a name="line.105"></a>
<FONT color="green">106</FONT>                    _type = RULE_ELEMENT;       // Strip/preserve single element<a name="line.106"></a>
<FONT color="green">107</FONT>                }<a name="line.107"></a>
<FONT color="green">108</FONT>            }<a name="line.108"></a>
<FONT color="green">109</FONT>    <a name="line.109"></a>
<FONT color="green">110</FONT>            /**<a name="line.110"></a>
<FONT color="green">111</FONT>             * For sorting rules depending on priority<a name="line.111"></a>
<FONT color="green">112</FONT>             */<a name="line.112"></a>
<FONT color="green">113</FONT>            public int compareTo(WhitespaceRule other) {<a name="line.113"></a>
<FONT color="green">114</FONT>                return _priority &lt; other._priority<a name="line.114"></a>
<FONT color="green">115</FONT>                    ? -1<a name="line.115"></a>
<FONT color="green">116</FONT>                    : _priority &gt; other._priority ? 1 : 0;<a name="line.116"></a>
<FONT color="green">117</FONT>            }<a name="line.117"></a>
<FONT color="green">118</FONT>    <a name="line.118"></a>
<FONT color="green">119</FONT>            public int getAction() { return _action; }<a name="line.119"></a>
<FONT color="green">120</FONT>            public int getStrength() { return _type; }<a name="line.120"></a>
<FONT color="green">121</FONT>            public int getPriority() { return _priority; }<a name="line.121"></a>
<FONT color="green">122</FONT>            public String getElement() { return _element; }<a name="line.122"></a>
<FONT color="green">123</FONT>            public String getNamespace() { return _namespace; }<a name="line.123"></a>
<FONT color="green">124</FONT>        }<a name="line.124"></a>
<FONT color="green">125</FONT>    <a name="line.125"></a>
<FONT color="green">126</FONT>        /**<a name="line.126"></a>
<FONT color="green">127</FONT>         * Parse the attributes of the xsl:strip/preserve-space element.<a name="line.127"></a>
<FONT color="green">128</FONT>         * The element should have not contents (ignored if any).<a name="line.128"></a>
<FONT color="green">129</FONT>         */<a name="line.129"></a>
<FONT color="green">130</FONT>        public void parseContents(Parser parser) {<a name="line.130"></a>
<FONT color="green">131</FONT>            // Determine if this is an xsl:strip- or preserve-space element<a name="line.131"></a>
<FONT color="green">132</FONT>            _action = _qname.getLocalPart().endsWith("strip-space") <a name="line.132"></a>
<FONT color="green">133</FONT>                ? STRIP_SPACE : PRESERVE_SPACE;<a name="line.133"></a>
<FONT color="green">134</FONT>    <a name="line.134"></a>
<FONT color="green">135</FONT>            // Determine the import precedence<a name="line.135"></a>
<FONT color="green">136</FONT>            _importPrecedence = parser.getCurrentImportPrecedence();<a name="line.136"></a>
<FONT color="green">137</FONT>    <a name="line.137"></a>
<FONT color="green">138</FONT>            // Get the list of elements to strip/preserve<a name="line.138"></a>
<FONT color="green">139</FONT>            _elementList = getAttribute("elements");<a name="line.139"></a>
<FONT color="green">140</FONT>            if (_elementList == null || _elementList.length() == 0) {<a name="line.140"></a>
<FONT color="green">141</FONT>                reportError(this, parser, ErrorMsg.REQUIRED_ATTR_ERR, "elements");<a name="line.141"></a>
<FONT color="green">142</FONT>                return;<a name="line.142"></a>
<FONT color="green">143</FONT>            }<a name="line.143"></a>
<FONT color="green">144</FONT>    <a name="line.144"></a>
<FONT color="green">145</FONT>            final SymbolTable stable = parser.getSymbolTable();<a name="line.145"></a>
<FONT color="green">146</FONT>            StringTokenizer list = new StringTokenizer(_elementList);<a name="line.146"></a>
<FONT color="green">147</FONT>            StringBuffer elements = new StringBuffer(Constants.EMPTYSTRING);<a name="line.147"></a>
<FONT color="green">148</FONT>    <a name="line.148"></a>
<FONT color="green">149</FONT>            while (list.hasMoreElements()) {<a name="line.149"></a>
<FONT color="green">150</FONT>                String token = list.nextToken();<a name="line.150"></a>
<FONT color="green">151</FONT>                String prefix;<a name="line.151"></a>
<FONT color="green">152</FONT>                String namespace;<a name="line.152"></a>
<FONT color="green">153</FONT>                int col = token.indexOf(':');<a name="line.153"></a>
<FONT color="green">154</FONT>    <a name="line.154"></a>
<FONT color="green">155</FONT>                if (col != -1) {<a name="line.155"></a>
<FONT color="green">156</FONT>                    namespace = lookupNamespace(token.substring(0,col));<a name="line.156"></a>
<FONT color="green">157</FONT>                    if (namespace != null) {<a name="line.157"></a>
<FONT color="green">158</FONT>                        elements.append(namespace+":"+<a name="line.158"></a>
<FONT color="green">159</FONT>                                        token.substring(col+1,token.length()));<a name="line.159"></a>
<FONT color="green">160</FONT>                    } else {<a name="line.160"></a>
<FONT color="green">161</FONT>                        elements.append(token);<a name="line.161"></a>
<FONT color="green">162</FONT>                    }<a name="line.162"></a>
<FONT color="green">163</FONT>                } else {<a name="line.163"></a>
<FONT color="green">164</FONT>                    elements.append(token);<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>                if (list.hasMoreElements())<a name="line.167"></a>
<FONT color="green">168</FONT>                    elements.append(" ");<a name="line.168"></a>
<FONT color="green">169</FONT>            }<a name="line.169"></a>
<FONT color="green">170</FONT>            _elementList = elements.toString();<a name="line.170"></a>
<FONT color="green">171</FONT>        }<a name="line.171"></a>
<FONT color="green">172</FONT>    <a name="line.172"></a>
<FONT color="green">173</FONT>    <a name="line.173"></a>
<FONT color="green">174</FONT>        /**<a name="line.174"></a>
<FONT color="green">175</FONT>         * De-tokenize the elements listed in the 'elements' attribute and<a name="line.175"></a>
<FONT color="green">176</FONT>         * instanciate a set of strip/preserve rules.<a name="line.176"></a>
<FONT color="green">177</FONT>         */<a name="line.177"></a>
<FONT color="green">178</FONT>        public Vector getRules() {<a name="line.178"></a>
<FONT color="green">179</FONT>            final Vector rules = new Vector();<a name="line.179"></a>
<FONT color="green">180</FONT>            // Go through each element and instanciate strip/preserve-object<a name="line.180"></a>
<FONT color="green">181</FONT>            final StringTokenizer list = new StringTokenizer(_elementList);<a name="line.181"></a>
<FONT color="green">182</FONT>            while (list.hasMoreElements()) {<a name="line.182"></a>
<FONT color="green">183</FONT>                rules.add(new WhitespaceRule(_action,<a name="line.183"></a>
<FONT color="green">184</FONT>                                             list.nextToken(),<a name="line.184"></a>
<FONT color="green">185</FONT>                                             _importPrecedence));<a name="line.185"></a>
<FONT color="green">186</FONT>            }<a name="line.186"></a>
<FONT color="green">187</FONT>            return rules;<a name="line.187"></a>
<FONT color="green">188</FONT>        }<a name="line.188"></a>
<FONT color="green">189</FONT>        <a name="line.189"></a>
<FONT color="green">190</FONT>        <a name="line.190"></a>
<FONT color="green">191</FONT>        /**<a name="line.191"></a>
<FONT color="green">192</FONT>         * Scans through the rules vector and looks for a rule of higher<a name="line.192"></a>
<FONT color="green">193</FONT>         * priority that contradicts the current rule.<a name="line.193"></a>
<FONT color="green">194</FONT>         */<a name="line.194"></a>
<FONT color="green">195</FONT>        private static WhitespaceRule findContradictingRule(Vector rules,<a name="line.195"></a>
<FONT color="green">196</FONT>                                                            WhitespaceRule rule) {<a name="line.196"></a>
<FONT color="green">197</FONT>            for (int i = 0; i &lt; rules.size(); i++) {<a name="line.197"></a>
<FONT color="green">198</FONT>                // Get the next rule in the prioritized list<a name="line.198"></a>
<FONT color="green">199</FONT>                WhitespaceRule currentRule = (WhitespaceRule)rules.elementAt(i);<a name="line.199"></a>
<FONT color="green">200</FONT>                // We only consider rules with higher priority<a name="line.200"></a>
<FONT color="green">201</FONT>                if (currentRule == rule) {<a name="line.201"></a>
<FONT color="green">202</FONT>                    return null;<a name="line.202"></a>
<FONT color="green">203</FONT>                }<a name="line.203"></a>
<FONT color="green">204</FONT>                <a name="line.204"></a>
<FONT color="green">205</FONT>                /*<a name="line.205"></a>
<FONT color="green">206</FONT>                 * See if there is a contradicting rule with higher priority.<a name="line.206"></a>
<FONT color="green">207</FONT>                 * If the rules has the same action then this rule is redundant,<a name="line.207"></a>
<FONT color="green">208</FONT>                 * if they have different action then this rule will never win.<a name="line.208"></a>
<FONT color="green">209</FONT>                 */<a name="line.209"></a>
<FONT color="green">210</FONT>                switch (currentRule.getStrength()) {<a name="line.210"></a>
<FONT color="green">211</FONT>                case RULE_ALL:<a name="line.211"></a>
<FONT color="green">212</FONT>                    return currentRule;<a name="line.212"></a>
<FONT color="green">213</FONT>                    <a name="line.213"></a>
<FONT color="green">214</FONT>                case RULE_ELEMENT:<a name="line.214"></a>
<FONT color="green">215</FONT>                    if (!rule.getElement().equals(currentRule.getElement())) {<a name="line.215"></a>
<FONT color="green">216</FONT>                        break;<a name="line.216"></a>
<FONT color="green">217</FONT>                    }<a name="line.217"></a>
<FONT color="green">218</FONT>                    // intentional fall-through<a name="line.218"></a>
<FONT color="green">219</FONT>                case RULE_NAMESPACE:<a name="line.219"></a>
<FONT color="green">220</FONT>                    if (rule.getNamespace().equals(currentRule.getNamespace())) {<a name="line.220"></a>
<FONT color="green">221</FONT>                        return currentRule;<a name="line.221"></a>
<FONT color="green">222</FONT>                    }<a name="line.222"></a>
<FONT color="green">223</FONT>                    break;<a name="line.223"></a>
<FONT color="green">224</FONT>                }<a name="line.224"></a>
<FONT color="green">225</FONT>            }<a name="line.225"></a>
<FONT color="green">226</FONT>            return null;<a name="line.226"></a>
<FONT color="green">227</FONT>        }<a name="line.227"></a>
<FONT color="green">228</FONT>    <a name="line.228"></a>
<FONT color="green">229</FONT>    <a name="line.229"></a>
<FONT color="green">230</FONT>        /**<a name="line.230"></a>
<FONT color="green">231</FONT>         * Orders a set or rules by priority, removes redundant rules and rules<a name="line.231"></a>
<FONT color="green">232</FONT>         * that are shadowed by stronger, contradicting rules.<a name="line.232"></a>
<FONT color="green">233</FONT>         */<a name="line.233"></a>
<FONT color="green">234</FONT>        private static int prioritizeRules(Vector rules) {<a name="line.234"></a>
<FONT color="green">235</FONT>            WhitespaceRule currentRule;<a name="line.235"></a>
<FONT color="green">236</FONT>            int defaultAction = PRESERVE_SPACE;<a name="line.236"></a>
<FONT color="green">237</FONT>    <a name="line.237"></a>
<FONT color="green">238</FONT>            // Sort all rules with regard to priority<a name="line.238"></a>
<FONT color="green">239</FONT>            quicksort(rules, 0, rules.size()-1);<a name="line.239"></a>
<FONT color="green">240</FONT>    <a name="line.240"></a>
<FONT color="green">241</FONT>            // Check if there are any "xsl:strip-space" elements at all.<a name="line.241"></a>
<FONT color="green">242</FONT>            // If there are no xsl:strip elements we can ignore all xsl:preserve<a name="line.242"></a>
<FONT color="green">243</FONT>            // elements and signal that all whitespaces should be preserved<a name="line.243"></a>
<FONT color="green">244</FONT>            boolean strip = false;<a name="line.244"></a>
<FONT color="green">245</FONT>            for (int i = 0; i &lt; rules.size(); i++) {<a name="line.245"></a>
<FONT color="green">246</FONT>                currentRule = (WhitespaceRule)rules.elementAt(i);<a name="line.246"></a>
<FONT color="green">247</FONT>                if (currentRule.getAction() == STRIP_SPACE) {<a name="line.247"></a>
<FONT color="green">248</FONT>                    strip = true;<a name="line.248"></a>
<FONT color="green">249</FONT>                }<a name="line.249"></a>
<FONT color="green">250</FONT>            }<a name="line.250"></a>
<FONT color="green">251</FONT>            // Return with default action: PRESERVE_SPACE<a name="line.251"></a>
<FONT color="green">252</FONT>            if (!strip) {<a name="line.252"></a>
<FONT color="green">253</FONT>                rules.removeAllElements();<a name="line.253"></a>
<FONT color="green">254</FONT>                return PRESERVE_SPACE;<a name="line.254"></a>
<FONT color="green">255</FONT>            }<a name="line.255"></a>
<FONT color="green">256</FONT>    <a name="line.256"></a>
<FONT color="green">257</FONT>            // Remove all rules that are contradicted by rules with higher priority<a name="line.257"></a>
<FONT color="green">258</FONT>            for (int idx = 0; idx &lt; rules.size(); ) {<a name="line.258"></a>
<FONT color="green">259</FONT>                currentRule = (WhitespaceRule)rules.elementAt(idx);<a name="line.259"></a>
<FONT color="green">260</FONT>            <a name="line.260"></a>
<FONT color="green">261</FONT>                // Remove this single rule if it has no purpose<a name="line.261"></a>
<FONT color="green">262</FONT>                if (findContradictingRule(rules,currentRule) != null) {<a name="line.262"></a>
<FONT color="green">263</FONT>                    rules.remove(idx);<a name="line.263"></a>
<FONT color="green">264</FONT>                }<a name="line.264"></a>
<FONT color="green">265</FONT>                else {<a name="line.265"></a>
<FONT color="green">266</FONT>                    // Remove all following rules if this one overrides all<a name="line.266"></a>
<FONT color="green">267</FONT>                    if (currentRule.getStrength() == RULE_ALL) {<a name="line.267"></a>
<FONT color="green">268</FONT>                        defaultAction = currentRule.getAction();<a name="line.268"></a>
<FONT color="green">269</FONT>                        for (int i = idx; i &lt; rules.size(); i++) {<a name="line.269"></a>
<FONT color="green">270</FONT>                            rules.removeElementAt(i);<a name="line.270"></a>
<FONT color="green">271</FONT>                        }<a name="line.271"></a>
<FONT color="green">272</FONT>                    }<a name="line.272"></a>
<FONT color="green">273</FONT>                    // Skip to next rule (there might not be any)...<a name="line.273"></a>
<FONT color="green">274</FONT>                    idx++;<a name="line.274"></a>
<FONT color="green">275</FONT>                }<a name="line.275"></a>
<FONT color="green">276</FONT>            }<a name="line.276"></a>
<FONT color="green">277</FONT>    <a name="line.277"></a>
<FONT color="green">278</FONT>            // The rules vector could be empty if first rule has strength RULE_ALL<a name="line.278"></a>
<FONT color="green">279</FONT>            if (rules.size() == 0) {<a name="line.279"></a>
<FONT color="green">280</FONT>                return defaultAction;<a name="line.280"></a>
<FONT color="green">281</FONT>            }<a name="line.281"></a>
<FONT color="green">282</FONT>    <a name="line.282"></a>
<FONT color="green">283</FONT>            // Now work backwards and strip away all rules that have the same<a name="line.283"></a>
<FONT color="green">284</FONT>            // action as the default rule (no reason the check them at the end).<a name="line.284"></a>
<FONT color="green">285</FONT>            do {<a name="line.285"></a>
<FONT color="green">286</FONT>                currentRule = (WhitespaceRule)rules.lastElement();<a name="line.286"></a>
<FONT color="green">287</FONT>                if (currentRule.getAction() == defaultAction) {<a name="line.287"></a>
<FONT color="green">288</FONT>                    rules.removeElementAt(rules.size() - 1);<a name="line.288"></a>
<FONT color="green">289</FONT>                }<a name="line.289"></a>
<FONT color="green">290</FONT>                else {<a name="line.290"></a>
<FONT color="green">291</FONT>                    break;<a name="line.291"></a>
<FONT color="green">292</FONT>                }<a name="line.292"></a>
<FONT color="green">293</FONT>            } while (rules.size() &gt; 0);<a name="line.293"></a>
<FONT color="green">294</FONT>            <a name="line.294"></a>
<FONT color="green">295</FONT>            // Signal that whitespace detection predicate must be used.<a name="line.295"></a>
<FONT color="green">296</FONT>            return defaultAction;<a name="line.296"></a>
<FONT color="green">297</FONT>        }<a name="line.297"></a>
<FONT color="green">298</FONT>    <a name="line.298"></a>
<FONT color="green">299</FONT>        public static void compileStripSpace(BranchHandle strip[], <a name="line.299"></a>
<FONT color="green">300</FONT>                                             int sCount,<a name="line.300"></a>
<FONT color="green">301</FONT>                                             InstructionList il) {<a name="line.301"></a>
<FONT color="green">302</FONT>            final InstructionHandle target = il.append(ICONST_1);<a name="line.302"></a>
<FONT color="green">303</FONT>            il.append(IRETURN);<a name="line.303"></a>
<FONT color="green">304</FONT>            for (int i = 0; i &lt; sCount; i++) {<a name="line.304"></a>
<FONT color="green">305</FONT>                strip[i].setTarget(target);<a name="line.305"></a>
<FONT color="green">306</FONT>            }<a name="line.306"></a>
<FONT color="green">307</FONT>        }<a name="line.307"></a>
<FONT color="green">308</FONT>    <a name="line.308"></a>
<FONT color="green">309</FONT>        public static void compilePreserveSpace(BranchHandle preserve[], <a name="line.309"></a>
<FONT color="green">310</FONT>                                                int pCount,<a name="line.310"></a>
<FONT color="green">311</FONT>                                                InstructionList il) {<a name="line.311"></a>
<FONT color="green">312</FONT>            final InstructionHandle target = il.append(ICONST_0);<a name="line.312"></a>
<FONT color="green">313</FONT>            il.append(IRETURN);<a name="line.313"></a>
<FONT color="green">314</FONT>            for (int i = 0; i &lt; pCount; i++) {<a name="line.314"></a>
<FONT color="green">315</FONT>                preserve[i].setTarget(target);<a name="line.315"></a>
<FONT color="green">316</FONT>            }<a name="line.316"></a>
<FONT color="green">317</FONT>        }<a name="line.317"></a>
<FONT color="green">318</FONT>    <a name="line.318"></a>
<FONT color="green">319</FONT>        /*<a name="line.319"></a>
<FONT color="green">320</FONT>        private static void compileDebug(ClassGenerator classGen,<a name="line.320"></a>
<FONT color="green">321</FONT>                                         InstructionList il) {<a name="line.321"></a>
<FONT color="green">322</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.322"></a>
<FONT color="green">323</FONT>            final int prt = cpg.addMethodref("java/lang/System/out",<a name="line.323"></a>
<FONT color="green">324</FONT>                                             "println",<a name="line.324"></a>
<FONT color="green">325</FONT>                                             "(Ljava/lang/String;)V");<a name="line.325"></a>
<FONT color="green">326</FONT>            il.append(DUP);<a name="line.326"></a>
<FONT color="green">327</FONT>            il.append(new INVOKESTATIC(prt));<a name="line.327"></a>
<FONT color="green">328</FONT>        }<a name="line.328"></a>
<FONT color="green">329</FONT>        */<a name="line.329"></a>
<FONT color="green">330</FONT>    <a name="line.330"></a>
<FONT color="green">331</FONT>        /**<a name="line.331"></a>
<FONT color="green">332</FONT>         * Compiles the predicate method<a name="line.332"></a>
<FONT color="green">333</FONT>         */<a name="line.333"></a>
<FONT color="green">334</FONT>        private static void compilePredicate(Vector rules,<a name="line.334"></a>
<FONT color="green">335</FONT>                                             int defaultAction,<a name="line.335"></a>
<FONT color="green">336</FONT>                                             ClassGenerator classGen) {<a name="line.336"></a>
<FONT color="green">337</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.337"></a>
<FONT color="green">338</FONT>            final InstructionList il = new InstructionList();<a name="line.338"></a>
<FONT color="green">339</FONT>            final XSLTC xsltc = classGen.getParser().getXSLTC();<a name="line.339"></a>
<FONT color="green">340</FONT>    <a name="line.340"></a>
<FONT color="green">341</FONT>            // private boolean Translet.stripSpace(int type) - cannot be static<a name="line.341"></a>
<FONT color="green">342</FONT>            final MethodGenerator stripSpace =<a name="line.342"></a>
<FONT color="green">343</FONT>                new MethodGenerator(ACC_PUBLIC | ACC_FINAL ,<a name="line.343"></a>
<FONT color="green">344</FONT>                            org.apache.bcel.generic.Type.BOOLEAN, <a name="line.344"></a>
<FONT color="green">345</FONT>                            new org.apache.bcel.generic.Type[] {<a name="line.345"></a>
<FONT color="green">346</FONT>                                Util.getJCRefType(DOM_INTF_SIG),<a name="line.346"></a>
<FONT color="green">347</FONT>                                org.apache.bcel.generic.Type.INT,<a name="line.347"></a>
<FONT color="green">348</FONT>                                org.apache.bcel.generic.Type.INT<a name="line.348"></a>
<FONT color="green">349</FONT>                            },<a name="line.349"></a>
<FONT color="green">350</FONT>                            new String[] { "dom","node","type" },<a name="line.350"></a>
<FONT color="green">351</FONT>                            "stripSpace",classGen.getClassName(),il,cpg);<a name="line.351"></a>
<FONT color="green">352</FONT>    <a name="line.352"></a>
<FONT color="green">353</FONT>            classGen.addInterface("org/apache/xalan/xsltc/StripFilter");<a name="line.353"></a>
<FONT color="green">354</FONT>    <a name="line.354"></a>
<FONT color="green">355</FONT>            final int paramDom = stripSpace.getLocalIndex("dom");<a name="line.355"></a>
<FONT color="green">356</FONT>            final int paramCurrent = stripSpace.getLocalIndex("node");<a name="line.356"></a>
<FONT color="green">357</FONT>            final int paramType = stripSpace.getLocalIndex("type");<a name="line.357"></a>
<FONT color="green">358</FONT>    <a name="line.358"></a>
<FONT color="green">359</FONT>            BranchHandle strip[] = new BranchHandle[rules.size()];<a name="line.359"></a>
<FONT color="green">360</FONT>            BranchHandle preserve[] = new BranchHandle[rules.size()];<a name="line.360"></a>
<FONT color="green">361</FONT>            int sCount = 0;<a name="line.361"></a>
<FONT color="green">362</FONT>            int pCount = 0;<a name="line.362"></a>
<FONT color="green">363</FONT>    <a name="line.363"></a>
<FONT color="green">364</FONT>            // Traverse all strip/preserve rules<a name="line.364"></a>
<FONT color="green">365</FONT>            for (int i = 0; i&lt;rules.size(); i++) {<a name="line.365"></a>
<FONT color="green">366</FONT>                // Get the next rule in the prioritised list<a name="line.366"></a>
<FONT color="green">367</FONT>                WhitespaceRule rule = (WhitespaceRule)rules.elementAt(i);<a name="line.367"></a>
<FONT color="green">368</FONT>    <a name="line.368"></a>
<FONT color="green">369</FONT>                // Returns the namespace for a node in the DOM<a name="line.369"></a>
<FONT color="green">370</FONT>                final int gns = cpg.addInterfaceMethodref(DOM_INTF,<a name="line.370"></a>
<FONT color="green">371</FONT>                                                          "getNamespaceName",<a name="line.371"></a>
<FONT color="green">372</FONT>                                                          "(I)Ljava/lang/String;");<a name="line.372"></a>
<FONT color="green">373</FONT>    <a name="line.373"></a>
<FONT color="green">374</FONT>                final int strcmp = cpg.addMethodref("java/lang/String",<a name="line.374"></a>
<FONT color="green">375</FONT>                                                    "compareTo",<a name="line.375"></a>
<FONT color="green">376</FONT>                                                    "(Ljava/lang/String;)I");<a name="line.376"></a>
<FONT color="green">377</FONT>    <a name="line.377"></a>
<FONT color="green">378</FONT>                // Handle elements="ns:*" type rule<a name="line.378"></a>
<FONT color="green">379</FONT>                if (rule.getStrength() == RULE_NAMESPACE) {<a name="line.379"></a>
<FONT color="green">380</FONT>                    il.append(new ALOAD(paramDom));<a name="line.380"></a>
<FONT color="green">381</FONT>                    il.append(new ILOAD(paramCurrent));<a name="line.381"></a>
<FONT color="green">382</FONT>                    il.append(new INVOKEINTERFACE(gns,2));<a name="line.382"></a>
<FONT color="green">383</FONT>                    il.append(new PUSH(cpg, rule.getNamespace()));<a name="line.383"></a>
<FONT color="green">384</FONT>                    il.append(new INVOKEVIRTUAL(strcmp));<a name="line.384"></a>
<FONT color="green">385</FONT>                    il.append(ICONST_0);<a name="line.385"></a>
<FONT color="green">386</FONT>    <a name="line.386"></a>
<FONT color="green">387</FONT>                    if (rule.getAction() == STRIP_SPACE) {<a name="line.387"></a>
<FONT color="green">388</FONT>                        strip[sCount++] = il.append(new IF_ICMPEQ(null));<a name="line.388"></a>
<FONT color="green">389</FONT>                    }<a name="line.389"></a>
<FONT color="green">390</FONT>                    else {<a name="line.390"></a>
<FONT color="green">391</FONT>                        preserve[pCount++] = il.append(new IF_ICMPEQ(null));<a name="line.391"></a>
<FONT color="green">392</FONT>                    }<a name="line.392"></a>
<FONT color="green">393</FONT>                }<a name="line.393"></a>
<FONT color="green">394</FONT>                // Handle elements="ns:el" type rule<a name="line.394"></a>
<FONT color="green">395</FONT>                else if (rule.getStrength() == RULE_ELEMENT) {<a name="line.395"></a>
<FONT color="green">396</FONT>                    // Create the QName for the element<a name="line.396"></a>
<FONT color="green">397</FONT>                    final Parser parser = classGen.getParser();<a name="line.397"></a>
<FONT color="green">398</FONT>                    QName qname;<a name="line.398"></a>
<FONT color="green">399</FONT>                    if (rule.getNamespace() != Constants.EMPTYSTRING )<a name="line.399"></a>
<FONT color="green">400</FONT>                        qname = parser.getQName(rule.getNamespace(), null,<a name="line.400"></a>
<FONT color="green">401</FONT>                                                rule.getElement());<a name="line.401"></a>
<FONT color="green">402</FONT>                    else<a name="line.402"></a>
<FONT color="green">403</FONT>                        qname = parser.getQName(rule.getElement());<a name="line.403"></a>
<FONT color="green">404</FONT>    <a name="line.404"></a>
<FONT color="green">405</FONT>                    // Register the element.<a name="line.405"></a>
<FONT color="green">406</FONT>                    final int elementType = xsltc.registerElement(qname);<a name="line.406"></a>
<FONT color="green">407</FONT>                    il.append(new ILOAD(paramType));<a name="line.407"></a>
<FONT color="green">408</FONT>                    il.append(new PUSH(cpg, elementType));<a name="line.408"></a>
<FONT color="green">409</FONT>    <a name="line.409"></a>
<FONT color="green">410</FONT>                    // Compare current node type with wanted element type<a name="line.410"></a>
<FONT color="green">411</FONT>                    if (rule.getAction() == STRIP_SPACE)<a name="line.411"></a>
<FONT color="green">412</FONT>                        strip[sCount++] = il.append(new IF_ICMPEQ(null));<a name="line.412"></a>
<FONT color="green">413</FONT>                    else<a name="line.413"></a>
<FONT color="green">414</FONT>                        preserve[pCount++] = il.append(new IF_ICMPEQ(null));<a name="line.414"></a>
<FONT color="green">415</FONT>                }<a name="line.415"></a>
<FONT color="green">416</FONT>            }<a name="line.416"></a>
<FONT color="green">417</FONT>    <a name="line.417"></a>
<FONT color="green">418</FONT>            if (defaultAction == STRIP_SPACE) {<a name="line.418"></a>
<FONT color="green">419</FONT>                compileStripSpace(strip, sCount, il);<a name="line.419"></a>
<FONT color="green">420</FONT>                compilePreserveSpace(preserve, pCount, il);<a name="line.420"></a>
<FONT color="green">421</FONT>            }<a name="line.421"></a>
<FONT color="green">422</FONT>            else {<a name="line.422"></a>
<FONT color="green">423</FONT>                compilePreserveSpace(preserve, pCount, il);<a name="line.423"></a>
<FONT color="green">424</FONT>                compileStripSpace(strip, sCount, il);<a name="line.424"></a>
<FONT color="green">425</FONT>            }<a name="line.425"></a>
<FONT color="green">426</FONT>    <a name="line.426"></a>
<FONT color="green">427</FONT>            classGen.addMethod(stripSpace);<a name="line.427"></a>
<FONT color="green">428</FONT>        }<a name="line.428"></a>
<FONT color="green">429</FONT>    <a name="line.429"></a>
<FONT color="green">430</FONT>        /**<a name="line.430"></a>
<FONT color="green">431</FONT>         * Compiles the predicate method<a name="line.431"></a>
<FONT color="green">432</FONT>         */<a name="line.432"></a>
<FONT color="green">433</FONT>        private static void compileDefault(int defaultAction,<a name="line.433"></a>
<FONT color="green">434</FONT>                                           ClassGenerator classGen) {<a name="line.434"></a>
<FONT color="green">435</FONT>            final ConstantPoolGen cpg = classGen.getConstantPool();<a name="line.435"></a>
<FONT color="green">436</FONT>            final InstructionList il = new InstructionList();<a name="line.436"></a>
<FONT color="green">437</FONT>            final XSLTC xsltc = classGen.getParser().getXSLTC();<a name="line.437"></a>
<FONT color="green">438</FONT>    <a name="line.438"></a>
<FONT color="green">439</FONT>            // private boolean Translet.stripSpace(int type) - cannot be static<a name="line.439"></a>
<FONT color="green">440</FONT>            final MethodGenerator stripSpace =<a name="line.440"></a>
<FONT color="green">441</FONT>                new MethodGenerator(ACC_PUBLIC | ACC_FINAL ,<a name="line.441"></a>
<FONT color="green">442</FONT>                            org.apache.bcel.generic.Type.BOOLEAN, <a name="line.442"></a>
<FONT color="green">443</FONT>                            new org.apache.bcel.generic.Type[] {<a name="line.443"></a>
<FONT color="green">444</FONT>                                Util.getJCRefType(DOM_INTF_SIG),<a name="line.444"></a>
<FONT color="green">445</FONT>                                org.apache.bcel.generic.Type.INT,<a name="line.445"></a>
<FONT color="green">446</FONT>                                org.apache.bcel.generic.Type.INT<a name="line.446"></a>
<FONT color="green">447</FONT>                            },<a name="line.447"></a>
<FONT color="green">448</FONT>                            new String[] { "dom","node","type" },<a name="line.448"></a>
<FONT color="green">449</FONT>                            "stripSpace",classGen.getClassName(),il,cpg);<a name="line.449"></a>
<FONT color="green">450</FONT>    <a name="line.450"></a>
<FONT color="green">451</FONT>            classGen.addInterface("org/apache/xalan/xsltc/StripFilter");<a name="line.451"></a>
<FONT color="green">452</FONT>    <a name="line.452"></a>
<FONT color="green">453</FONT>            if (defaultAction == STRIP_SPACE)<a name="line.453"></a>
<FONT color="green">454</FONT>                il.append(ICONST_1);<a name="line.454"></a>
<FONT color="green">455</FONT>            else<a name="line.455"></a>
<FONT color="green">456</FONT>                il.append(ICONST_0);<a name="line.456"></a>
<FONT color="green">457</FONT>            il.append(IRETURN);<a name="line.457"></a>
<FONT color="green">458</FONT>    <a name="line.458"></a>
<FONT color="green">459</FONT>            classGen.addMethod(stripSpace);<a name="line.459"></a>
<FONT color="green">460</FONT>        }<a name="line.460"></a>
<FONT color="green">461</FONT>    <a name="line.461"></a>
<FONT color="green">462</FONT>    <a name="line.462"></a>
<FONT color="green">463</FONT>        /**<a name="line.463"></a>
<FONT color="green">464</FONT>         * Takes a vector of WhitespaceRule objects and generates a predicate<a name="line.464"></a>
<FONT color="green">465</FONT>         * method. This method returns the translets default action for handling<a name="line.465"></a>
<FONT color="green">466</FONT>         * whitespace text-nodes:<a name="line.466"></a>
<FONT color="green">467</FONT>         *    - USE_PREDICATE  (run the method generated by this method)<a name="line.467"></a>
<FONT color="green">468</FONT>         *    - STRIP_SPACE    (always strip whitespace text-nodes)<a name="line.468"></a>
<FONT color="green">469</FONT>         *    - PRESERVE_SPACE (always preserve whitespace text-nodes)<a name="line.469"></a>
<FONT color="green">470</FONT>         */<a name="line.470"></a>
<FONT color="green">471</FONT>        public static int translateRules(Vector rules,<a name="line.471"></a>
<FONT color="green">472</FONT>                                         ClassGenerator classGen) {<a name="line.472"></a>
<FONT color="green">473</FONT>            // Get the core rules in prioritized order<a name="line.473"></a>
<FONT color="green">474</FONT>            final int defaultAction = prioritizeRules(rules);<a name="line.474"></a>
<FONT color="green">475</FONT>            // The rules vector may be empty after prioritising<a name="line.475"></a>
<FONT color="green">476</FONT>            if (rules.size() == 0) {<a name="line.476"></a>
<FONT color="green">477</FONT>                compileDefault(defaultAction,classGen);<a name="line.477"></a>
<FONT color="green">478</FONT>                return defaultAction;<a name="line.478"></a>
<FONT color="green">479</FONT>            }<a name="line.479"></a>
<FONT color="green">480</FONT>            // Now - create a predicate method and sequence through rules...<a name="line.480"></a>
<FONT color="green">481</FONT>            compilePredicate(rules, defaultAction, classGen);<a name="line.481"></a>
<FONT color="green">482</FONT>            // Return with the translets required action (<a name="line.482"></a>
<FONT color="green">483</FONT>            return USE_PREDICATE;<a name="line.483"></a>
<FONT color="green">484</FONT>        }<a name="line.484"></a>
<FONT color="green">485</FONT>    <a name="line.485"></a>
<FONT color="green">486</FONT>        /**<a name="line.486"></a>
<FONT color="green">487</FONT>         * Sorts a range of rules with regard to PRIORITY only<a name="line.487"></a>
<FONT color="green">488</FONT>         */<a name="line.488"></a>
<FONT color="green">489</FONT>        private static void quicksort(Vector rules, int p, int r) {<a name="line.489"></a>
<FONT color="green">490</FONT>            while (p &lt; r) {<a name="line.490"></a>
<FONT color="green">491</FONT>                final int q = partition(rules, p, r);<a name="line.491"></a>
<FONT color="green">492</FONT>                quicksort(rules, p, q);<a name="line.492"></a>
<FONT color="green">493</FONT>                p = q + 1;<a name="line.493"></a>
<FONT color="green">494</FONT>            }<a name="line.494"></a>
<FONT color="green">495</FONT>        }<a name="line.495"></a>
<FONT color="green">496</FONT>        <a name="line.496"></a>
<FONT color="green">497</FONT>        /**<a name="line.497"></a>
<FONT color="green">498</FONT>         * Used with quicksort method above<a name="line.498"></a>
<FONT color="green">499</FONT>         */<a name="line.499"></a>
<FONT color="green">500</FONT>        private static int partition(Vector rules, int p, int r) {<a name="line.500"></a>
<FONT color="green">501</FONT>            final WhitespaceRule x = (WhitespaceRule)rules.elementAt((p+r) &gt;&gt;&gt; 1);<a name="line.501"></a>
<FONT color="green">502</FONT>            int i = p - 1, j = r + 1;<a name="line.502"></a>
<FONT color="green">503</FONT>            while (true) {<a name="line.503"></a>
<FONT color="green">504</FONT>                while (x.compareTo((WhitespaceRule)rules.elementAt(--j)) &lt; 0) {<a name="line.504"></a>
<FONT color="green">505</FONT>                }<a name="line.505"></a>
<FONT color="green">506</FONT>                while (x.compareTo((WhitespaceRule)rules.elementAt(++i)) &gt; 0) {<a name="line.506"></a>
<FONT color="green">507</FONT>                }<a name="line.507"></a>
<FONT color="green">508</FONT>                if (i &lt; j) {<a name="line.508"></a>
<FONT color="green">509</FONT>                    final WhitespaceRule tmp = (WhitespaceRule)rules.elementAt(i);<a name="line.509"></a>
<FONT color="green">510</FONT>                    rules.setElementAt(rules.elementAt(j), i);<a name="line.510"></a>
<FONT color="green">511</FONT>                    rules.setElementAt(tmp, j);<a name="line.511"></a>
<FONT color="green">512</FONT>                }<a name="line.512"></a>
<FONT color="green">513</FONT>                else {<a name="line.513"></a>
<FONT color="green">514</FONT>                    return j;<a name="line.514"></a>
<FONT color="green">515</FONT>                }<a name="line.515"></a>
<FONT color="green">516</FONT>            }<a name="line.516"></a>
<FONT color="green">517</FONT>        }<a name="line.517"></a>
<FONT color="green">518</FONT>        <a name="line.518"></a>
<FONT color="green">519</FONT>        /**<a name="line.519"></a>
<FONT color="green">520</FONT>         * Type-check contents/attributes - nothing to do...<a name="line.520"></a>
<FONT color="green">521</FONT>         */<a name="line.521"></a>
<FONT color="green">522</FONT>        public Type typeCheck(SymbolTable stable) throws TypeCheckError {<a name="line.522"></a>
<FONT color="green">523</FONT>            return Type.Void; // We don't return anything.<a name="line.523"></a>
<FONT color="green">524</FONT>        }<a name="line.524"></a>
<FONT color="green">525</FONT>    <a name="line.525"></a>
<FONT color="green">526</FONT>        /**<a name="line.526"></a>
<FONT color="green">527</FONT>         * This method should not produce any code<a name="line.527"></a>
<FONT color="green">528</FONT>         */<a name="line.528"></a>
<FONT color="green">529</FONT>        public void translate(ClassGenerator classGen, MethodGenerator methodGen) {<a name="line.529"></a>
<FONT color="green">530</FONT>        }<a name="line.530"></a>
<FONT color="green">531</FONT>    }<a name="line.531"></a>




























































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