This file is indexed.

/usr/share/doc/libcobertura-java/api/src-html/net/sourceforge/cobertura/instrument/FirstPassMethodInstrumenter.html is in libcobertura-java-doc 1.9.4.1+dfsg-4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Cobertura - http://cobertura.sourceforge.net/<a name="line.2"></a>
<span class="sourceLineNo">003</span> *<a name="line.3"></a>
<span class="sourceLineNo">004</span> * Copyright (C) 2005 Mark Doliner<a name="line.4"></a>
<span class="sourceLineNo">005</span> * Copyright (C) 2006 Jiri Mares<a name="line.5"></a>
<span class="sourceLineNo">006</span> *<a name="line.6"></a>
<span class="sourceLineNo">007</span> * Cobertura is free software; you can redistribute it and/or modify<a name="line.7"></a>
<span class="sourceLineNo">008</span> * it under the terms of the GNU General Public License as published<a name="line.8"></a>
<span class="sourceLineNo">009</span> * by the Free Software Foundation; either version 2 of the License,<a name="line.9"></a>
<span class="sourceLineNo">010</span> * or (at your option) any later version.<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Cobertura is distributed in the hope that it will be useful, but<a name="line.12"></a>
<span class="sourceLineNo">013</span> * WITHOUT ANY WARRANTY; without even the implied warranty of<a name="line.13"></a>
<span class="sourceLineNo">014</span> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<a name="line.14"></a>
<span class="sourceLineNo">015</span> * General Public License for more details.<a name="line.15"></a>
<span class="sourceLineNo">016</span> *<a name="line.16"></a>
<span class="sourceLineNo">017</span> * You should have received a copy of the GNU General Public License<a name="line.17"></a>
<span class="sourceLineNo">018</span> * along with Cobertura; if not, write to the Free Software<a name="line.18"></a>
<span class="sourceLineNo">019</span> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307<a name="line.19"></a>
<span class="sourceLineNo">020</span> * USA<a name="line.20"></a>
<span class="sourceLineNo">021</span> */<a name="line.21"></a>
<span class="sourceLineNo">022</span><a name="line.22"></a>
<span class="sourceLineNo">023</span>package net.sourceforge.cobertura.instrument;<a name="line.23"></a>
<span class="sourceLineNo">024</span><a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.Collection;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.Map;<a name="line.27"></a>
<span class="sourceLineNo">028</span><a name="line.28"></a>
<span class="sourceLineNo">029</span>import net.sourceforge.cobertura.coveragedata.ClassData;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import net.sourceforge.cobertura.util.RegexUtil;<a name="line.30"></a>
<span class="sourceLineNo">031</span><a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.objectweb.asm.Label;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.objectweb.asm.MethodAdapter;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.objectweb.asm.MethodVisitor;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.objectweb.asm.Opcodes;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.objectweb.asm.tree.MethodNode;<a name="line.36"></a>
<span class="sourceLineNo">037</span><a name="line.37"></a>
<span class="sourceLineNo">038</span>public class FirstPassMethodInstrumenter extends MethodAdapter implements Opcodes<a name="line.38"></a>
<span class="sourceLineNo">039</span>{<a name="line.39"></a>
<span class="sourceLineNo">040</span><a name="line.40"></a>
<span class="sourceLineNo">041</span>        private final String ownerClass;<a name="line.41"></a>
<span class="sourceLineNo">042</span><a name="line.42"></a>
<span class="sourceLineNo">043</span>        private String myName;<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span>        private String myDescriptor;<a name="line.45"></a>
<span class="sourceLineNo">046</span><a name="line.46"></a>
<span class="sourceLineNo">047</span>        private int myAccess;<a name="line.47"></a>
<span class="sourceLineNo">048</span>   <a name="line.48"></a>
<span class="sourceLineNo">049</span>        private Collection ignoreRegexs;<a name="line.49"></a>
<span class="sourceLineNo">050</span>   <a name="line.50"></a>
<span class="sourceLineNo">051</span>        private Collection ignoreBranchesRegexs;<a name="line.51"></a>
<span class="sourceLineNo">052</span><a name="line.52"></a>
<span class="sourceLineNo">053</span>        private ClassData classData;<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>        private int currentLine;<a name="line.55"></a>
<span class="sourceLineNo">056</span>   <a name="line.56"></a>
<span class="sourceLineNo">057</span>        private int currentJump;<a name="line.57"></a>
<span class="sourceLineNo">058</span>   <a name="line.58"></a>
<span class="sourceLineNo">059</span>        private int currentSwitch;<a name="line.59"></a>
<span class="sourceLineNo">060</span>        <a name="line.60"></a>
<span class="sourceLineNo">061</span>        private Map jumpTargetLabels;<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>        private Map switchTargetLabels;<a name="line.63"></a>
<span class="sourceLineNo">064</span>   <a name="line.64"></a>
<span class="sourceLineNo">065</span>        private Map lineLabels;<a name="line.65"></a>
<span class="sourceLineNo">066</span>   <a name="line.66"></a>
<span class="sourceLineNo">067</span>        private MethodVisitor writerMethodVisitor;<a name="line.67"></a>
<span class="sourceLineNo">068</span>   <a name="line.68"></a>
<span class="sourceLineNo">069</span>        private MethodNode methodNode;<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>        public FirstPassMethodInstrumenter(ClassData classData, final MethodVisitor mv,<a name="line.71"></a>
<span class="sourceLineNo">072</span>                        final String owner, final int access, final String name, final String desc, <a name="line.72"></a>
<span class="sourceLineNo">073</span>                        final String signature, final String[] exceptions, final Collection ignoreRegexs,<a name="line.73"></a>
<span class="sourceLineNo">074</span>                        final Collection ignoreBranchesRegexs)<a name="line.74"></a>
<span class="sourceLineNo">075</span>        {<a name="line.75"></a>
<span class="sourceLineNo">076</span>                super(new MethodNode(access, name, desc, signature, exceptions));<a name="line.76"></a>
<span class="sourceLineNo">077</span>                writerMethodVisitor = mv;<a name="line.77"></a>
<span class="sourceLineNo">078</span>                this.ownerClass = owner;<a name="line.78"></a>
<span class="sourceLineNo">079</span>                this.methodNode = (MethodNode) this.mv;<a name="line.79"></a>
<span class="sourceLineNo">080</span>                this.classData = classData;<a name="line.80"></a>
<span class="sourceLineNo">081</span>                this.myAccess = access;<a name="line.81"></a>
<span class="sourceLineNo">082</span>                this.myName = name;<a name="line.82"></a>
<span class="sourceLineNo">083</span>                this.myDescriptor = desc;<a name="line.83"></a>
<span class="sourceLineNo">084</span>                this.ignoreRegexs = ignoreRegexs;<a name="line.84"></a>
<span class="sourceLineNo">085</span>                this.ignoreBranchesRegexs = ignoreBranchesRegexs;<a name="line.85"></a>
<span class="sourceLineNo">086</span>                this.jumpTargetLabels = new HashMap();<a name="line.86"></a>
<span class="sourceLineNo">087</span>                this.switchTargetLabels = new HashMap();<a name="line.87"></a>
<span class="sourceLineNo">088</span>                this.lineLabels = new HashMap();<a name="line.88"></a>
<span class="sourceLineNo">089</span>                this.currentLine = 0;<a name="line.89"></a>
<span class="sourceLineNo">090</span>        }<a name="line.90"></a>
<span class="sourceLineNo">091</span><a name="line.91"></a>
<span class="sourceLineNo">092</span>        public void visitEnd() {<a name="line.92"></a>
<span class="sourceLineNo">093</span>                super.visitEnd();<a name="line.93"></a>
<span class="sourceLineNo">094</span><a name="line.94"></a>
<span class="sourceLineNo">095</span>                methodNode.accept(lineLabels.isEmpty() ? writerMethodVisitor : new SecondPassMethodInstrumenter(this)); //when there is no line number info -&gt; no instrumentation<a name="line.95"></a>
<span class="sourceLineNo">096</span>        }<a name="line.96"></a>
<span class="sourceLineNo">097</span><a name="line.97"></a>
<span class="sourceLineNo">098</span>        public void visitJumpInsn(int opcode, Label label)<a name="line.98"></a>
<span class="sourceLineNo">099</span>        {<a name="line.99"></a>
<span class="sourceLineNo">100</span>                // Ignore any jump instructions in the "class init" method.<a name="line.100"></a>
<span class="sourceLineNo">101</span>                // When initializing static variables, the JVM first checks<a name="line.101"></a>
<span class="sourceLineNo">102</span>                // that the variable is null before attempting to set it.<a name="line.102"></a>
<span class="sourceLineNo">103</span>                // This check contains an IFNONNULL jump instruction which<a name="line.103"></a>
<span class="sourceLineNo">104</span>                // would confuse people if it showed up in the reports.<a name="line.104"></a>
<span class="sourceLineNo">105</span>                if ((opcode != GOTO) &amp;&amp; (opcode != JSR) &amp;&amp; (currentLine != 0)<a name="line.105"></a>
<span class="sourceLineNo">106</span>                                &amp;&amp; (!this.myName.equals("&lt;clinit&gt;")))<a name="line.106"></a>
<span class="sourceLineNo">107</span>                {<a name="line.107"></a>
<span class="sourceLineNo">108</span>                        classData.addLineJump(currentLine, currentJump);<a name="line.108"></a>
<span class="sourceLineNo">109</span>                        jumpTargetLabels.put(label, new JumpHolder(currentLine, currentJump++));<a name="line.109"></a>
<span class="sourceLineNo">110</span>                }<a name="line.110"></a>
<span class="sourceLineNo">111</span>                <a name="line.111"></a>
<span class="sourceLineNo">112</span>                super.visitJumpInsn(opcode, label);<a name="line.112"></a>
<span class="sourceLineNo">113</span>        }<a name="line.113"></a>
<span class="sourceLineNo">114</span><a name="line.114"></a>
<span class="sourceLineNo">115</span>        public void visitLineNumber(int line, Label start)<a name="line.115"></a>
<span class="sourceLineNo">116</span>        {<a name="line.116"></a>
<span class="sourceLineNo">117</span>                // Record initial information about this line of code<a name="line.117"></a>
<span class="sourceLineNo">118</span>                currentLine = line;<a name="line.118"></a>
<span class="sourceLineNo">119</span>                classData.addLine(currentLine, myName, myDescriptor);<a name="line.119"></a>
<span class="sourceLineNo">120</span>                currentJump = 0;<a name="line.120"></a>
<span class="sourceLineNo">121</span>                currentSwitch = 0;<a name="line.121"></a>
<span class="sourceLineNo">122</span>      <a name="line.122"></a>
<span class="sourceLineNo">123</span>                lineLabels.put(start, new Integer(line));<a name="line.123"></a>
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span>                //removed because the MethodNode doesn't reproduce visitLineNumber where they are but at the end of the file :-(( <a name="line.125"></a>
<span class="sourceLineNo">126</span>                //therefore we don't need them<a name="line.126"></a>
<span class="sourceLineNo">127</span>                //We can directly instrument the visit line number here, but it is better to leave all instrumentation in the second pass<a name="line.127"></a>
<span class="sourceLineNo">128</span>                //therefore we just collects what label is the line ...<a name="line.128"></a>
<span class="sourceLineNo">129</span>                //super.visitLineNumber(line, start);<a name="line.129"></a>
<span class="sourceLineNo">130</span>        }<a name="line.130"></a>
<span class="sourceLineNo">131</span><a name="line.131"></a>
<span class="sourceLineNo">132</span>        public void visitMethodInsn(int opcode, String owner, String name,<a name="line.132"></a>
<span class="sourceLineNo">133</span>                        String desc)<a name="line.133"></a>
<span class="sourceLineNo">134</span>        {<a name="line.134"></a>
<span class="sourceLineNo">135</span>                super.visitMethodInsn(opcode, owner, name, desc);<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>                // If any of the ignore patterns match this line<a name="line.137"></a>
<span class="sourceLineNo">138</span>                // then remove it from our data<a name="line.138"></a>
<span class="sourceLineNo">139</span>                if (RegexUtil.matches(ignoreRegexs, owner)) <a name="line.139"></a>
<span class="sourceLineNo">140</span>                {<a name="line.140"></a>
<span class="sourceLineNo">141</span>                        classData.removeLine(currentLine);<a name="line.141"></a>
<span class="sourceLineNo">142</span>                }<a name="line.142"></a>
<span class="sourceLineNo">143</span>        }<a name="line.143"></a>
<span class="sourceLineNo">144</span><a name="line.144"></a>
<span class="sourceLineNo">145</span>        public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)<a name="line.145"></a>
<span class="sourceLineNo">146</span>        {<a name="line.146"></a>
<span class="sourceLineNo">147</span>                super.visitLookupSwitchInsn(dflt, keys, labels);<a name="line.147"></a>
<span class="sourceLineNo">148</span>      <a name="line.148"></a>
<span class="sourceLineNo">149</span>                if (currentLine != 0)<a name="line.149"></a>
<span class="sourceLineNo">150</span>                {<a name="line.150"></a>
<span class="sourceLineNo">151</span>                        switchTargetLabels.put(dflt, new SwitchHolder(currentLine, currentSwitch, -1)); <a name="line.151"></a>
<span class="sourceLineNo">152</span>                        for (int i = labels.length -1; i &gt;=0; i--)<a name="line.152"></a>
<span class="sourceLineNo">153</span>                                switchTargetLabels.put(labels[i], new SwitchHolder(currentLine, currentSwitch, i));<a name="line.153"></a>
<span class="sourceLineNo">154</span>                        classData.addLineSwitch(currentLine, currentSwitch++, keys);<a name="line.154"></a>
<span class="sourceLineNo">155</span>                }<a name="line.155"></a>
<span class="sourceLineNo">156</span>        }<a name="line.156"></a>
<span class="sourceLineNo">157</span><a name="line.157"></a>
<span class="sourceLineNo">158</span>        public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels)<a name="line.158"></a>
<span class="sourceLineNo">159</span>        {<a name="line.159"></a>
<span class="sourceLineNo">160</span>                super.visitTableSwitchInsn(min, max, dflt, labels);<a name="line.160"></a>
<span class="sourceLineNo">161</span>      <a name="line.161"></a>
<span class="sourceLineNo">162</span>                if (currentLine != 0)<a name="line.162"></a>
<span class="sourceLineNo">163</span>                {<a name="line.163"></a>
<span class="sourceLineNo">164</span>                        switchTargetLabels.put(dflt, new SwitchHolder(currentLine, currentSwitch, -1)); <a name="line.164"></a>
<span class="sourceLineNo">165</span>                        for (int i = labels.length -1; i &gt;=0; i--)<a name="line.165"></a>
<span class="sourceLineNo">166</span>                                switchTargetLabels.put(labels[i], new SwitchHolder(currentLine, currentSwitch, i));<a name="line.166"></a>
<span class="sourceLineNo">167</span>                        classData.addLineSwitch(currentLine, currentSwitch++, min, max);<a name="line.167"></a>
<span class="sourceLineNo">168</span>                }<a name="line.168"></a>
<span class="sourceLineNo">169</span>        }<a name="line.169"></a>
<span class="sourceLineNo">170</span><a name="line.170"></a>
<span class="sourceLineNo">171</span>        protected void removeLine(int lineNumber) <a name="line.171"></a>
<span class="sourceLineNo">172</span>        {<a name="line.172"></a>
<span class="sourceLineNo">173</span>                classData.removeLine(lineNumber);<a name="line.173"></a>
<span class="sourceLineNo">174</span>        }<a name="line.174"></a>
<span class="sourceLineNo">175</span>   <a name="line.175"></a>
<span class="sourceLineNo">176</span>        protected MethodVisitor getWriterMethodVisitor() <a name="line.176"></a>
<span class="sourceLineNo">177</span>        {<a name="line.177"></a>
<span class="sourceLineNo">178</span>                return writerMethodVisitor;<a name="line.178"></a>
<span class="sourceLineNo">179</span>        }<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
<span class="sourceLineNo">181</span>        protected Collection getIgnoreRegexs() <a name="line.181"></a>
<span class="sourceLineNo">182</span>        {<a name="line.182"></a>
<span class="sourceLineNo">183</span>                return ignoreRegexs;<a name="line.183"></a>
<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
<span class="sourceLineNo">185</span><a name="line.185"></a>
<span class="sourceLineNo">186</span>        protected Map getJumpTargetLabels() <a name="line.186"></a>
<span class="sourceLineNo">187</span>        {<a name="line.187"></a>
<span class="sourceLineNo">188</span>                return jumpTargetLabels;<a name="line.188"></a>
<span class="sourceLineNo">189</span>        }<a name="line.189"></a>
<span class="sourceLineNo">190</span><a name="line.190"></a>
<span class="sourceLineNo">191</span>        protected Map getSwitchTargetLabels() <a name="line.191"></a>
<span class="sourceLineNo">192</span>        {<a name="line.192"></a>
<span class="sourceLineNo">193</span>                return switchTargetLabels;<a name="line.193"></a>
<span class="sourceLineNo">194</span>        }<a name="line.194"></a>
<span class="sourceLineNo">195</span><a name="line.195"></a>
<span class="sourceLineNo">196</span>        protected int getMyAccess() <a name="line.196"></a>
<span class="sourceLineNo">197</span>        {<a name="line.197"></a>
<span class="sourceLineNo">198</span>                return myAccess;<a name="line.198"></a>
<span class="sourceLineNo">199</span>        }<a name="line.199"></a>
<span class="sourceLineNo">200</span><a name="line.200"></a>
<span class="sourceLineNo">201</span>        protected String getMyDescriptor() <a name="line.201"></a>
<span class="sourceLineNo">202</span>        {<a name="line.202"></a>
<span class="sourceLineNo">203</span>                return myDescriptor;<a name="line.203"></a>
<span class="sourceLineNo">204</span>        }<a name="line.204"></a>
<span class="sourceLineNo">205</span><a name="line.205"></a>
<span class="sourceLineNo">206</span>        protected String getMyName() <a name="line.206"></a>
<span class="sourceLineNo">207</span>        {<a name="line.207"></a>
<span class="sourceLineNo">208</span>                return myName;<a name="line.208"></a>
<span class="sourceLineNo">209</span>        }<a name="line.209"></a>
<span class="sourceLineNo">210</span><a name="line.210"></a>
<span class="sourceLineNo">211</span>        protected String getOwnerClass() <a name="line.211"></a>
<span class="sourceLineNo">212</span>        {<a name="line.212"></a>
<span class="sourceLineNo">213</span>                return ownerClass;<a name="line.213"></a>
<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span>        protected Map getLineLabels() <a name="line.216"></a>
<span class="sourceLineNo">217</span>        {<a name="line.217"></a>
<span class="sourceLineNo">218</span>                return lineLabels;<a name="line.218"></a>
<span class="sourceLineNo">219</span>        }<a name="line.219"></a>
<span class="sourceLineNo">220</span><a name="line.220"></a>
<span class="sourceLineNo">221</span>}<a name="line.221"></a>




























































</pre>
</div>
</body>
</html>