rubybreaker 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS +3 -0
- data/README.md +1 -2
- data/Rakefile +1 -0
- data/TODO +0 -8
- data/TUTORIAL.md +33 -7
- data/VERSION +1 -1
- data/lib/rubybreaker.rb +12 -4
- data/lib/rubybreaker/debug/error.rb +1 -1
- data/lib/rubybreaker/runtime.rb +16 -12
- data/lib/rubybreaker/runtime/monitor.rb +116 -84
- data/lib/rubybreaker/runtime/pluggable.rb +8 -2
- data/lib/rubybreaker/runtime/type_system.rb +77 -10
- data/lib/rubybreaker/task.rb +6 -0
- data/lib/rubybreaker/util.rb +23 -0
- data/test/integrated/tc_checking.rb +71 -0
- data/test/integrated/tc_class_methods.rb +14 -4
- data/test/testtask/sample.rb +1 -0
- data/test/testtask/tc_testtask.rb +14 -2
- data/test/ts_integrated.rb +1 -0
- data/webpage/index.html +1 -2
- data/webpage/rdoc/Object.html +0 -2
- data/webpage/rdoc/Rake.html +0 -2
- data/webpage/rdoc/Rake/RubyBreakerTestTask.html +19 -5
- data/webpage/rdoc/RubyBreaker.html +35 -3
- data/webpage/rdoc/RubyBreaker/Breakable.html +1 -3
- data/webpage/rdoc/RubyBreaker/Broken.html +1 -3
- data/webpage/rdoc/RubyBreaker/Context.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/InternalError.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/InvalidSubtypeCheck.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/InvalidTypeConstruction.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/SubtypeFailure.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/TypeError.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/UserError.html +2 -4
- data/webpage/rdoc/RubyBreaker/ObjectPosition.html +0 -2
- data/webpage/rdoc/RubyBreaker/Position.html +0 -2
- data/webpage/rdoc/RubyBreaker/RDocSupport.html +0 -2
- data/webpage/rdoc/RubyBreaker/RubyTypeUtils.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime.html +39 -6
- data/webpage/rdoc/RubyBreaker/Runtime/Inspector.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime/MethodInfo.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime/Monitor.html +295 -28
- data/webpage/rdoc/RubyBreaker/Runtime/MonitorInstaller.html +30 -43
- data/webpage/rdoc/RubyBreaker/Runtime/MonitorSwitch.html +4 -6
- data/webpage/rdoc/RubyBreaker/Runtime/ObjectWrapper.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime/Pluggable.html +78 -18
- data/webpage/rdoc/RubyBreaker/Runtime/TypeSigParser.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime/TypeSigUnparser.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime/TypeSystem.html +172 -28
- data/webpage/rdoc/RubyBreaker/TypeComparer.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/AnyType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/BlockType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/DuckType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/FusionType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/MethodListType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/MethodType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/NilType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/NominalType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/OptionalType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/OrType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/SelfType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/Type.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeDefs/VarLengthType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeUnparser.html +0 -2
- data/webpage/rdoc/RubyBreaker/Typing.html +0 -2
- data/webpage/rdoc/RubyBreaker/Util.html +80 -4
- data/webpage/rdoc/Test.html +0 -2
- data/webpage/rdoc/Test/Unit.html +0 -2
- data/webpage/rdoc/created.rid +12 -12
- data/webpage/rdoc/index.html +0 -2
- data/webpage/rdoc/js/search_index.js +1 -1
- data/webpage/rdoc/table_of_contents.html +53 -34
- data/webpage/tutorial.html +36 -7
- metadata +8 -11
- data/webpage/rdoc/RubyBreaker/Runtime/MonitorUtils.html +0 -402
@@ -57,19 +57,7 @@
|
|
57
57
|
<div id="class-metadata">
|
58
58
|
|
59
59
|
|
60
|
-
|
61
|
-
<nav id="includes-section" class="section">
|
62
|
-
<h3 class="section-header">Included Modules</h3>
|
63
|
-
|
64
|
-
<ul class="link-list">
|
65
|
-
|
66
|
-
|
67
|
-
<li><a class="include" href="MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
68
|
-
|
69
|
-
|
70
|
-
</ul>
|
71
|
-
</nav>
|
72
|
-
|
60
|
+
|
73
61
|
<!-- Method Quickref -->
|
74
62
|
<nav id="method-list-section" class="section">
|
75
63
|
<h3 class="section-header">Methods</h3>
|
@@ -80,7 +68,7 @@
|
|
80
68
|
|
81
69
|
<li><a href="#method-c-is_module-3F">::is_module?</a>
|
82
70
|
|
83
|
-
<li><a href="#method-c-
|
71
|
+
<li><a href="#method-c-monkey_patch_meth">::monkey_patch_meth</a>
|
84
72
|
|
85
73
|
</ul>
|
86
74
|
</nav>
|
@@ -136,8 +124,6 @@
|
|
136
124
|
|
137
125
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
138
126
|
|
139
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
140
|
-
|
141
127
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
142
128
|
|
143
129
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -231,7 +217,7 @@
|
|
231
217
|
|
232
218
|
<div class="method-heading">
|
233
219
|
<span class="method-name">install_monitor</span><span
|
234
|
-
class="method-args">(mod)</span>
|
220
|
+
class="method-args">(monitor_type, mod)</span>
|
235
221
|
<span class="method-click-advice">click to toggle source</span>
|
236
222
|
</div>
|
237
223
|
|
@@ -243,8 +229,8 @@
|
|
243
229
|
|
244
230
|
|
245
231
|
<div class="method-source-code" id="install_monitor-source">
|
246
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
247
|
-
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">install_monitor</span>(<span class="ruby-identifier">mod</span>)
|
232
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 238</span>
|
233
|
+
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">install_monitor</span>(<span class="ruby-identifier">monitor_type</span>, <span class="ruby-identifier">mod</span>)
|
248
234
|
|
249
235
|
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"Installing module monitor for #{mod}"</span>)
|
250
236
|
|
@@ -254,7 +240,7 @@
|
|
254
240
|
<span class="ruby-keyword">return</span>
|
255
241
|
<span class="ruby-keyword">end</span>
|
256
242
|
|
257
|
-
<span class="ruby-constant">MONITOR_MAP</span>[<span class="ruby-identifier">mod</span>] = <span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">new</span>(<span class="ruby-
|
243
|
+
<span class="ruby-constant">MONITOR_MAP</span>[<span class="ruby-identifier">mod</span>] = <span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">DEFAULT_TYPE_SYSTEM</span>)
|
258
244
|
|
259
245
|
<span class="ruby-comment"># Create the type map if it does not exist already. Remember, this</span>
|
260
246
|
<span class="ruby-comment"># map could have been made by typesig().</span>
|
@@ -264,12 +250,15 @@
|
|
264
250
|
<span class="ruby-comment"># methods. Those are part of the owner's not this module.</span>
|
265
251
|
<span class="ruby-identifier">meths</span> = <span class="ruby-identifier">mod</span>.<span class="ruby-identifier">instance_methods</span>(<span class="ruby-keyword">false</span>)
|
266
252
|
|
267
|
-
<span class="ruby-comment"># See if any method is already
|
268
|
-
<span class="ruby-identifier">
|
269
|
-
<span class="ruby-identifier">
|
253
|
+
<span class="ruby-comment"># See if any method is already documented (explicitly typesig'ed)</span>
|
254
|
+
<span class="ruby-identifier">doc_mt_map</span> = <span class="ruby-constant">Inspector</span>.<span class="ruby-identifier">inspect_all</span>(<span class="ruby-identifier">mod</span>)
|
255
|
+
<span class="ruby-identifier">doc_meths</span> = <span class="ruby-identifier">doc_mt_map</span>.<span class="ruby-identifier">keys</span>
|
270
256
|
|
271
257
|
<span class="ruby-identifier">meths</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">m</span><span class="ruby-operator">|</span>
|
272
|
-
<span class="ruby-
|
258
|
+
<span class="ruby-comment"># Documented method will not be monkey-patched for "breaking"</span>
|
259
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">monitor_type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:break</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">doc_meths</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">m</span>)
|
260
|
+
<span class="ruby-keyword">self</span>.<span class="ruby-identifier">monkey_patch_meth</span>(<span class="ruby-identifier">monitor_type</span>, <span class="ruby-identifier">mod</span>, <span class="ruby-identifier">m</span>)
|
261
|
+
<span class="ruby-keyword">end</span>
|
273
262
|
<span class="ruby-keyword">end</span>
|
274
263
|
|
275
264
|
<span class="ruby-keyword">end</span></pre>
|
@@ -287,7 +276,7 @@
|
|
287
276
|
|
288
277
|
<div class="method-heading">
|
289
278
|
<span class="method-name">is_module?</span><span
|
290
|
-
class="method-args">(
|
279
|
+
class="method-args">(mod)</span>
|
291
280
|
<span class="method-click-advice">click to toggle source</span>
|
292
281
|
</div>
|
293
282
|
|
@@ -299,9 +288,9 @@
|
|
299
288
|
|
300
289
|
|
301
290
|
<div class="method-source-code" id="is_module-3F-source">
|
302
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
303
|
-
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">is_module?</span>(<span class="ruby-identifier">
|
304
|
-
<span class="ruby-keyword">return</span> <span class="ruby-identifier">
|
291
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 219</span>
|
292
|
+
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">is_module?</span>(<span class="ruby-identifier">mod</span>)
|
293
|
+
<span class="ruby-keyword">return</span> <span class="ruby-identifier">mod</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:class</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">mod</span>.<span class="ruby-identifier">kind_of?</span>(<span class="ruby-constant">Module</span>)
|
305
294
|
<span class="ruby-keyword">end</span></pre>
|
306
295
|
</div><!-- is_module-3F-source -->
|
307
296
|
|
@@ -313,11 +302,11 @@
|
|
313
302
|
</div><!-- is_module-3F-method -->
|
314
303
|
|
315
304
|
|
316
|
-
<div id="method-c-
|
305
|
+
<div id="method-c-monkey_patch_meth" class="method-detail ">
|
317
306
|
|
318
307
|
<div class="method-heading">
|
319
|
-
<span class="method-name">
|
320
|
-
class="method-args">(
|
308
|
+
<span class="method-name">monkey_patch_meth</span><span
|
309
|
+
class="method-args">(monitor_type, mod, meth_name)</span>
|
321
310
|
<span class="method-click-advice">click to toggle source</span>
|
322
311
|
</div>
|
323
312
|
|
@@ -329,28 +318,26 @@ monitor for the class</p>
|
|
329
318
|
|
330
319
|
|
331
320
|
|
332
|
-
<div class="method-source-code" id="
|
333
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
334
|
-
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">
|
335
|
-
<span class="ruby-identifier">alt_meth_name</span> = <span class="ruby-constant">
|
336
|
-
<span class="ruby-identifier">
|
321
|
+
<div class="method-source-code" id="monkey_patch_meth-source">
|
322
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 225</span>
|
323
|
+
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">monkey_patch_meth</span>(<span class="ruby-identifier">monitor_type</span>, <span class="ruby-identifier">mod</span>, <span class="ruby-identifier">meth_name</span>)
|
324
|
+
<span class="ruby-identifier">alt_meth_name</span> = <span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">get_alt_meth_name</span>(<span class="ruby-identifier">meth_name</span>)
|
325
|
+
<span class="ruby-identifier">mod</span>.<span class="ruby-identifier">module_eval</span>(<span class="ruby-node">"alias :\"#{alt_meth_name}\" :\"#{meth_name}\""</span>)
|
337
326
|
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"Adding alternate method for #{meth_name}"</span>)
|
338
|
-
<span class="ruby-identifier">
|
339
|
-
|
340
|
-
|
341
|
-
*args,
|
342
|
-
&blk)
|
327
|
+
<span class="ruby-identifier">route_call</span> = <span class="ruby-string">"RubyBreaker::Runtime::Monitor.route"</span>
|
328
|
+
<span class="ruby-identifier">mod</span>.<span class="ruby-identifier">module_eval</span> <span class="ruby-string">" def #{meth_name}(*args, &blk)
|
329
|
+
#{route_call}(:#{monitor_type}, self,"#{meth_name}",*args,&blk)
|
343
330
|
end
|
344
331
|
"</span>
|
345
332
|
<span class="ruby-keyword">end</span></pre>
|
346
|
-
</div><!--
|
333
|
+
</div><!-- monkey_patch_meth-source -->
|
347
334
|
|
348
335
|
</div>
|
349
336
|
|
350
337
|
|
351
338
|
|
352
339
|
|
353
|
-
</div><!--
|
340
|
+
</div><!-- monkey_patch_meth-method -->
|
354
341
|
|
355
342
|
|
356
343
|
</section><!-- public-class-method-details -->
|
@@ -132,8 +132,6 @@
|
|
132
132
|
|
133
133
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
134
134
|
|
135
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
136
|
-
|
137
135
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
138
136
|
|
139
137
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -261,7 +259,7 @@ otherwise, it WILL fall into an infinite loop.</p>
|
|
261
259
|
|
262
260
|
|
263
261
|
<div class="method-source-code" id="new-source">
|
264
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
262
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 187</span>
|
265
263
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(); <span class="ruby-ivar">@switch</span> = <span class="ruby-keyword">true</span> <span class="ruby-keyword">end</span></pre>
|
266
264
|
</div><!-- new-source -->
|
267
265
|
|
@@ -295,7 +293,7 @@ otherwise, it WILL fall into an infinite loop.</p>
|
|
295
293
|
|
296
294
|
|
297
295
|
<div class="method-source-code" id="set_to-source">
|
298
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
296
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 199</span>
|
299
297
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">set_to</span>(<span class="ruby-identifier">mode</span>); <span class="ruby-ivar">@switch</span> = <span class="ruby-identifier">mode</span>; <span class="ruby-keyword">end</span></pre>
|
300
298
|
</div><!-- set_to-source -->
|
301
299
|
|
@@ -323,7 +321,7 @@ otherwise, it WILL fall into an infinite loop.</p>
|
|
323
321
|
|
324
322
|
|
325
323
|
<div class="method-source-code" id="turn_off-source">
|
326
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
324
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 194</span>
|
327
325
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">turn_off</span>();
|
328
326
|
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-string">"Switch turned off"</span>)
|
329
327
|
<span class="ruby-ivar">@switch</span> = <span class="ruby-keyword">false</span>;
|
@@ -354,7 +352,7 @@ otherwise, it WILL fall into an infinite loop.</p>
|
|
354
352
|
|
355
353
|
|
356
354
|
<div class="method-source-code" id="turn_on-source">
|
357
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line
|
355
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/monitor.rb, line 189</span>
|
358
356
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">turn_on</span>();
|
359
357
|
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-string">"Switch turned on"</span>)
|
360
358
|
<span class="ruby-ivar">@switch</span> = <span class="ruby-keyword">true</span>;
|
@@ -134,8 +134,6 @@
|
|
134
134
|
|
135
135
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
136
136
|
|
137
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
138
|
-
|
139
137
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
140
138
|
|
141
139
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -64,9 +64,13 @@
|
|
64
64
|
|
65
65
|
<ul class="link-list">
|
66
66
|
|
67
|
-
<li><a href="#method-i-
|
67
|
+
<li><a href="#method-i-break_after_method_call">#break_after_method_call</a>
|
68
68
|
|
69
|
-
<li><a href="#method-i-
|
69
|
+
<li><a href="#method-i-break_before_method_call">#break_before_method_call</a>
|
70
|
+
|
71
|
+
<li><a href="#method-i-check_after_method_call">#check_after_method_call</a>
|
72
|
+
|
73
|
+
<li><a href="#method-i-check_before_method_call">#check_before_method_call</a>
|
70
74
|
|
71
75
|
</ul>
|
72
76
|
</nav>
|
@@ -122,8 +126,6 @@
|
|
122
126
|
|
123
127
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
124
128
|
|
125
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
126
|
-
|
127
129
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
128
130
|
|
129
131
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -218,10 +220,10 @@ href="../../RubyBreaker.html">RubyBreaker</a>.</p>
|
|
218
220
|
<h3 class="section-header">Public Instance Methods</h3>
|
219
221
|
|
220
222
|
|
221
|
-
<div id="method-i-
|
223
|
+
<div id="method-i-break_after_method_call" class="method-detail ">
|
222
224
|
|
223
225
|
<div class="method-heading">
|
224
|
-
<span class="method-name">
|
226
|
+
<span class="method-name">break_after_method_call</span><span
|
225
227
|
class="method-args">(obj, meth_info)</span>
|
226
228
|
<span class="method-click-advice">click to toggle source</span>
|
227
229
|
</div>
|
@@ -241,24 +243,24 @@ call information</p>
|
|
241
243
|
|
242
244
|
|
243
245
|
|
244
|
-
<div class="method-source-code" id="
|
245
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/pluggable.rb, line
|
246
|
-
<span class="ruby-keyword">def</span> <span class="ruby-identifier">
|
246
|
+
<div class="method-source-code" id="break_after_method_call-source">
|
247
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/pluggable.rb, line 55</span>
|
248
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">break_after_method_call</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
247
249
|
<span class="ruby-keyword">end</span></pre>
|
248
|
-
</div><!--
|
250
|
+
</div><!-- break_after_method_call-source -->
|
249
251
|
|
250
252
|
</div>
|
251
253
|
|
252
254
|
|
253
255
|
|
254
256
|
|
255
|
-
</div><!--
|
257
|
+
</div><!-- break_after_method_call-method -->
|
256
258
|
|
257
259
|
|
258
|
-
<div id="method-i-
|
260
|
+
<div id="method-i-break_before_method_call" class="method-detail ">
|
259
261
|
|
260
262
|
<div class="method-heading">
|
261
|
-
<span class="method-name">
|
263
|
+
<span class="method-name">break_before_method_call</span><span
|
262
264
|
class="method-args">(obj, meth_info)</span>
|
263
265
|
<span class="method-click-advice">click to toggle source</span>
|
264
266
|
</div>
|
@@ -278,18 +280,76 @@ call information</p>
|
|
278
280
|
|
279
281
|
|
280
282
|
|
281
|
-
<div class="method-source-code" id="
|
282
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/pluggable.rb, line
|
283
|
-
<span class="ruby-keyword">def</span> <span class="ruby-identifier">
|
283
|
+
<div class="method-source-code" id="break_before_method_call-source">
|
284
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/pluggable.rb, line 46</span>
|
285
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">break_before_method_call</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
286
|
+
<span class="ruby-keyword">end</span></pre>
|
287
|
+
</div><!-- break_before_method_call-source -->
|
288
|
+
|
289
|
+
</div>
|
290
|
+
|
291
|
+
|
292
|
+
|
293
|
+
|
294
|
+
</div><!-- break_before_method_call-method -->
|
295
|
+
|
296
|
+
|
297
|
+
<div id="method-i-check_after_method_call" class="method-detail ">
|
298
|
+
|
299
|
+
<div class="method-heading">
|
300
|
+
<span class="method-name">check_after_method_call</span><span
|
301
|
+
class="method-args">(obj, meth_info)</span>
|
302
|
+
<span class="method-click-advice">click to toggle source</span>
|
303
|
+
</div>
|
304
|
+
|
305
|
+
|
306
|
+
<div class="method-description">
|
307
|
+
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
|
312
|
+
<div class="method-source-code" id="check_after_method_call-source">
|
313
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/pluggable.rb, line 37</span>
|
314
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">check_after_method_call</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
315
|
+
<span class="ruby-keyword">end</span></pre>
|
316
|
+
</div><!-- check_after_method_call-source -->
|
317
|
+
|
318
|
+
</div>
|
319
|
+
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
</div><!-- check_after_method_call-method -->
|
324
|
+
|
325
|
+
|
326
|
+
<div id="method-i-check_before_method_call" class="method-detail ">
|
327
|
+
|
328
|
+
<div class="method-heading">
|
329
|
+
<span class="method-name">check_before_method_call</span><span
|
330
|
+
class="method-args">(obj, meth_info)</span>
|
331
|
+
<span class="method-click-advice">click to toggle source</span>
|
332
|
+
</div>
|
333
|
+
|
334
|
+
|
335
|
+
<div class="method-description">
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
|
340
|
+
|
341
|
+
<div class="method-source-code" id="check_before_method_call-source">
|
342
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/pluggable.rb, line 34</span>
|
343
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">check_before_method_call</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
284
344
|
<span class="ruby-keyword">end</span></pre>
|
285
|
-
</div><!--
|
345
|
+
</div><!-- check_before_method_call-source -->
|
286
346
|
|
287
347
|
</div>
|
288
348
|
|
289
349
|
|
290
350
|
|
291
351
|
|
292
|
-
</div><!--
|
352
|
+
</div><!-- check_before_method_call-method -->
|
293
353
|
|
294
354
|
|
295
355
|
</section><!-- public-instance-method-details -->
|
@@ -120,8 +120,6 @@
|
|
120
120
|
|
121
121
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
122
122
|
|
123
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
124
|
-
|
125
123
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
126
124
|
|
127
125
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -136,8 +136,6 @@
|
|
136
136
|
|
137
137
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
138
138
|
|
139
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
140
|
-
|
141
139
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
142
140
|
|
143
141
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -86,9 +86,13 @@
|
|
86
86
|
|
87
87
|
<ul class="link-list">
|
88
88
|
|
89
|
-
<li><a href="#method-i-
|
89
|
+
<li><a href="#method-i-break_after_method">#break_after_method</a>
|
90
90
|
|
91
|
-
<li><a href="#method-i-
|
91
|
+
<li><a href="#method-i-break_before_method">#break_before_method</a>
|
92
|
+
|
93
|
+
<li><a href="#method-i-check_after_method">#check_after_method</a>
|
94
|
+
|
95
|
+
<li><a href="#method-i-check_before_method">#check_before_method</a>
|
92
96
|
|
93
97
|
<li><a href="#method-i-is_object_wrapped-3F">#is_object_wrapped?</a>
|
94
98
|
|
@@ -96,6 +100,8 @@
|
|
96
100
|
|
97
101
|
<li><a href="#method-i-lub_helper">#lub_helper</a>
|
98
102
|
|
103
|
+
<li><a href="#method-i-type_error_msg_prefix">#type_error_msg_prefix</a>
|
104
|
+
|
99
105
|
</ul>
|
100
106
|
</nav>
|
101
107
|
|
@@ -150,8 +156,6 @@
|
|
150
156
|
|
151
157
|
<li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
|
152
158
|
|
153
|
-
<li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
|
154
|
-
|
155
159
|
<li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
|
156
160
|
|
157
161
|
<li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
|
@@ -244,10 +248,10 @@ be done.</p>
|
|
244
248
|
<h3 class="section-header">Public Instance Methods</h3>
|
245
249
|
|
246
250
|
|
247
|
-
<div id="method-i-
|
251
|
+
<div id="method-i-break_after_method" class="method-detail ">
|
248
252
|
|
249
253
|
<div class="method-heading">
|
250
|
-
<span class="method-name">
|
254
|
+
<span class="method-name">break_after_method</span><span
|
251
255
|
class="method-args">(obj, meth_info)</span>
|
252
256
|
<span class="method-click-advice">click to toggle source</span>
|
253
257
|
</div>
|
@@ -255,14 +259,14 @@ be done.</p>
|
|
255
259
|
|
256
260
|
<div class="method-description">
|
257
261
|
|
258
|
-
<p>This method occurs after every “monitored” method call
|
259
|
-
information.</p>
|
262
|
+
<p>This method occurs after every call to a “monitored” method call of a
|
263
|
+
module/class specified for “breaking”. It updates the type information.</p>
|
260
264
|
|
261
265
|
|
262
266
|
|
263
|
-
<div class="method-source-code" id="
|
264
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
265
|
-
<span class="ruby-keyword">def</span> <span class="ruby-identifier">
|
267
|
+
<div class="method-source-code" id="break_after_method-source">
|
268
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 301</span>
|
269
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">break_after_method</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
266
270
|
|
267
271
|
<span class="ruby-identifier">is_obj_mod</span> = (<span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Class</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Module</span>)
|
268
272
|
<span class="ruby-identifier">mod</span> = <span class="ruby-identifier">is_obj_mod</span> <span class="ruby-operator">?</span> <span class="ruby-constant">Runtime</span>.<span class="ruby-identifier">eigen_class</span>(<span class="ruby-identifier">obj</span>) <span class="ruby-operator">:</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span>
|
@@ -287,20 +291,20 @@ information.</p>
|
|
287
291
|
<span class="ruby-keyword">end</span>
|
288
292
|
|
289
293
|
<span class="ruby-keyword">end</span></pre>
|
290
|
-
</div><!--
|
294
|
+
</div><!-- break_after_method-source -->
|
291
295
|
|
292
296
|
</div>
|
293
297
|
|
294
298
|
|
295
299
|
|
296
300
|
|
297
|
-
</div><!--
|
301
|
+
</div><!-- break_after_method-method -->
|
298
302
|
|
299
303
|
|
300
|
-
<div id="method-i-
|
304
|
+
<div id="method-i-break_before_method" class="method-detail ">
|
301
305
|
|
302
306
|
<div class="method-heading">
|
303
|
-
<span class="method-name">
|
307
|
+
<span class="method-name">break_before_method</span><span
|
304
308
|
class="method-args">(obj, meth_info)</span>
|
305
309
|
<span class="method-click-advice">click to toggle source</span>
|
306
310
|
</div>
|
@@ -308,15 +312,18 @@ information.</p>
|
|
308
312
|
|
309
313
|
<div class="method-description">
|
310
314
|
|
311
|
-
<p>This method occurs before every “monitored” method
|
312
|
-
argument with the object
|
315
|
+
<p>This method occurs before every call to a “monitored” method in a
|
316
|
+
module/class specified for breaking. It wraps each argument with the object
|
317
|
+
wrapper so it can be tracked of the method calls.</p>
|
313
318
|
|
314
319
|
|
315
320
|
|
316
|
-
<div class="method-source-code" id="
|
317
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
318
|
-
<span class="ruby-keyword">def</span> <span class="ruby-identifier">
|
321
|
+
<div class="method-source-code" id="break_before_method-source">
|
322
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 238</span>
|
323
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">break_before_method</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
319
324
|
|
325
|
+
<span class="ruby-comment"># Use the eigen class if the object is a module/class and use the</span>
|
326
|
+
<span class="ruby-comment"># object's class otherwise.</span>
|
320
327
|
<span class="ruby-identifier">is_obj_mod</span> = (<span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Class</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Module</span>)
|
321
328
|
<span class="ruby-identifier">mod</span> = <span class="ruby-identifier">is_obj_mod</span> <span class="ruby-operator">?</span> <span class="ruby-constant">Runtime</span>.<span class="ruby-identifier">eigen_class</span>(<span class="ruby-identifier">obj</span>) <span class="ruby-operator">:</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span>
|
322
329
|
|
@@ -345,7 +352,7 @@ argument with the object wrapper.</p>
|
|
345
352
|
<span class="ruby-comment"># This means the method type has been created previously.</span>
|
346
353
|
<span class="ruby-keyword">unless</span> (<span class="ruby-identifier">blk</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">meth_type</span>.<span class="ruby-identifier">blk_type</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>) <span class="ruby-operator">&&</span>
|
347
354
|
(<span class="ruby-operator">!</span><span class="ruby-identifier">blk</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">blk</span>.<span class="ruby-identifier">arity</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">meth_type</span>.<span class="ruby-identifier">blk_type</span>.<span class="ruby-identifier">arg_types</span>.<span class="ruby-identifier">length</span>)
|
348
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Errors</span><span class="ruby-operator">::</span><span class="ruby-constant">TypeError</span>(<span class="ruby-string">"Block usage is inconsistent"</span>)
|
355
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Errors</span><span class="ruby-operator">::</span><span class="ruby-constant">TypeError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">"Block usage is inconsistent"</span>)
|
349
356
|
<span class="ruby-keyword">end</span>
|
350
357
|
<span class="ruby-keyword">else</span>
|
351
358
|
<span class="ruby-comment"># No method type has been created for this method yet. Create a</span>
|
@@ -354,7 +361,7 @@ argument with the object wrapper.</p>
|
|
354
361
|
<span class="ruby-comment">#</span>
|
355
362
|
<span class="ruby-comment"># First, use the orignal method's arity to find out # of</span>
|
356
363
|
<span class="ruby-comment"># arguments. </span>
|
357
|
-
<span class="ruby-identifier">meth_obj</span> = <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">method</span>(<span class="ruby-constant">
|
364
|
+
<span class="ruby-identifier">meth_obj</span> = <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">method</span>(<span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">get_alt_meth_name</span>(<span class="ruby-identifier">meth_name</span>))
|
358
365
|
<span class="ruby-identifier">arity</span> = <span class="ruby-identifier">meth_obj</span>.<span class="ruby-identifier">arity</span>
|
359
366
|
<span class="ruby-identifier">arg_types</span> = [<span class="ruby-keyword">nil</span>] * <span class="ruby-identifier">meth_obj</span>.<span class="ruby-identifier">arity</span>.<span class="ruby-identifier">abs</span>
|
360
367
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">blk</span>
|
@@ -372,14 +379,118 @@ argument with the object wrapper.</p>
|
|
372
379
|
<span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span> = <span class="ruby-identifier">args</span>
|
373
380
|
|
374
381
|
<span class="ruby-keyword">end</span></pre>
|
375
|
-
</div><!--
|
382
|
+
</div><!-- break_before_method-source -->
|
376
383
|
|
377
384
|
</div>
|
378
385
|
|
379
386
|
|
380
387
|
|
381
388
|
|
382
|
-
</div><!--
|
389
|
+
</div><!-- break_before_method-method -->
|
390
|
+
|
391
|
+
|
392
|
+
<div id="method-i-check_after_method" class="method-detail ">
|
393
|
+
|
394
|
+
<div class="method-heading">
|
395
|
+
<span class="method-name">check_after_method</span><span
|
396
|
+
class="method-args">(obj, meth_info)</span>
|
397
|
+
<span class="method-click-advice">click to toggle source</span>
|
398
|
+
</div>
|
399
|
+
|
400
|
+
|
401
|
+
<div class="method-description">
|
402
|
+
|
403
|
+
<p>This method is invoked after the original method is executed.</p>
|
404
|
+
|
405
|
+
|
406
|
+
|
407
|
+
<div class="method-source-code" id="check_after_method-source">
|
408
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 211</span>
|
409
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">check_after_method</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
410
|
+
<span class="ruby-identifier">is_obj_mod</span> = (<span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Class</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Module</span>)
|
411
|
+
<span class="ruby-identifier">mod</span> = <span class="ruby-identifier">is_obj_mod</span> <span class="ruby-operator">?</span> <span class="ruby-constant">Runtime</span>.<span class="ruby-identifier">eigen_class</span>(<span class="ruby-identifier">obj</span>) <span class="ruby-operator">:</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span>
|
412
|
+
|
413
|
+
<span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</span>]
|
414
|
+
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">meth_type_map</span>
|
415
|
+
|
416
|
+
<span class="ruby-comment"># Let's take things out of the MethodInfo object</span>
|
417
|
+
<span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
|
418
|
+
<span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
|
419
|
+
<span class="ruby-identifier">blk</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">blk</span>
|
420
|
+
<span class="ruby-identifier">ret</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
|
421
|
+
|
422
|
+
<span class="ruby-comment"># Get the registered method type for this method</span>
|
423
|
+
<span class="ruby-identifier">meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>]
|
424
|
+
|
425
|
+
<span class="ruby-identifier">ret_type</span> = <span class="ruby-constant">NominalType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">ret</span>.<span class="ruby-identifier">class</span>)
|
426
|
+
<span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">meth_type</span>.<span class="ruby-identifier">ret_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">ret_type</span>)
|
427
|
+
<span class="ruby-identifier">msg</span> = <span class="ruby-identifier">type_error_msg_prefix</span>(<span class="ruby-identifier">mod</span>, <span class="ruby-identifier">meth_name</span>) <span class="ruby-operator">+</span>
|
428
|
+
<span class="ruby-node">" return value does not have type #{ret_type.unparse()}."</span>
|
429
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Errors</span><span class="ruby-operator">::</span><span class="ruby-constant">TypeError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">msg</span>)
|
430
|
+
<span class="ruby-keyword">end</span>
|
431
|
+
<span class="ruby-keyword">end</span></pre>
|
432
|
+
</div><!-- check_after_method-source -->
|
433
|
+
|
434
|
+
</div>
|
435
|
+
|
436
|
+
|
437
|
+
|
438
|
+
|
439
|
+
</div><!-- check_after_method-method -->
|
440
|
+
|
441
|
+
|
442
|
+
<div id="method-i-check_before_method" class="method-detail ">
|
443
|
+
|
444
|
+
<div class="method-heading">
|
445
|
+
<span class="method-name">check_before_method</span><span
|
446
|
+
class="method-args">(obj, meth_info)</span>
|
447
|
+
<span class="method-click-advice">click to toggle source</span>
|
448
|
+
</div>
|
449
|
+
|
450
|
+
|
451
|
+
<div class="method-description">
|
452
|
+
|
453
|
+
<p>This method is invoked before the original method is executed.</p>
|
454
|
+
|
455
|
+
|
456
|
+
|
457
|
+
<div class="method-source-code" id="check_before_method-source">
|
458
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 182</span>
|
459
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">check_before_method</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
|
460
|
+
<span class="ruby-identifier">is_obj_mod</span> = (<span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Class</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Module</span>)
|
461
|
+
<span class="ruby-identifier">mod</span> = <span class="ruby-identifier">is_obj_mod</span> <span class="ruby-operator">?</span> <span class="ruby-constant">Runtime</span>.<span class="ruby-identifier">eigen_class</span>(<span class="ruby-identifier">obj</span>) <span class="ruby-operator">:</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span>
|
462
|
+
|
463
|
+
<span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</span>]
|
464
|
+
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">meth_type_map</span>
|
465
|
+
|
466
|
+
<span class="ruby-comment"># Let's take things out of the MethodInfo object</span>
|
467
|
+
<span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
|
468
|
+
<span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
|
469
|
+
<span class="ruby-identifier">blk</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">blk</span>
|
470
|
+
<span class="ruby-identifier">ret</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
|
471
|
+
|
472
|
+
<span class="ruby-comment"># Get the registered method type for this method</span>
|
473
|
+
<span class="ruby-identifier">meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>]
|
474
|
+
|
475
|
+
<span class="ruby-identifier">args</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">arg</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
|
476
|
+
<span class="ruby-identifier">arg_type</span> = <span class="ruby-constant">NominalType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">arg</span>.<span class="ruby-identifier">class</span>)
|
477
|
+
<span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">arg_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">meth_type</span>.<span class="ruby-identifier">arg_types</span>[<span class="ruby-identifier">i</span>])
|
478
|
+
<span class="ruby-identifier">msg</span> = <span class="ruby-identifier">type_error_msg_prefix</span>(<span class="ruby-identifier">mod</span>, <span class="ruby-identifier">meth_name</span>) <span class="ruby-operator">+</span>
|
479
|
+
<span class="ruby-node">"'s #{Util.ordinalize(i+1)} argument "</span> <span class="ruby-operator">+</span>
|
480
|
+
<span class="ruby-node">"does not have type #{arg_type.unparse()}."</span>
|
481
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Errors</span><span class="ruby-operator">::</span><span class="ruby-constant">TypeError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">msg</span>)
|
482
|
+
<span class="ruby-keyword">end</span>
|
483
|
+
<span class="ruby-keyword">end</span>
|
484
|
+
|
485
|
+
<span class="ruby-keyword">end</span></pre>
|
486
|
+
</div><!-- check_before_method-source -->
|
487
|
+
|
488
|
+
</div>
|
489
|
+
|
490
|
+
|
491
|
+
|
492
|
+
|
493
|
+
</div><!-- check_before_method-method -->
|
383
494
|
|
384
495
|
|
385
496
|
</section><!-- public-instance-method-details -->
|
@@ -404,7 +515,7 @@ argument with the object wrapper.</p>
|
|
404
515
|
|
405
516
|
|
406
517
|
<div class="method-source-code" id="is_object_wrapped-3F-source">
|
407
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
518
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 31</span>
|
408
519
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">is_object_wrapped?</span>(<span class="ruby-identifier">obj</span>)
|
409
520
|
<span class="ruby-keyword">return</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-constant">WRAPPED_INDICATOR</span>)
|
410
521
|
<span class="ruby-keyword">end</span></pre>
|
@@ -477,13 +588,13 @@ method list type.</p>
|
|
477
588
|
|
478
589
|
|
479
590
|
<div class="method-source-code" id="lub-source">
|
480
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
591
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 116</span>
|
481
592
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">lub</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_type_map</span>, <span class="ruby-identifier">meth_name</span>, <span class="ruby-identifier">retval</span>, *<span class="ruby-identifier">args</span>, &<span class="ruby-identifier">blk</span>)
|
482
593
|
|
483
594
|
<span class="ruby-identifier">exist_meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>.<span class="ruby-identifier">to_sym</span>]
|
484
595
|
|
485
596
|
<span class="ruby-comment"># Again, find the arity</span>
|
486
|
-
<span class="ruby-identifier">meth_obj</span> = <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">method</span>(<span class="ruby-constant">
|
597
|
+
<span class="ruby-identifier">meth_obj</span> = <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">method</span>(<span class="ruby-constant">Monitor</span>.<span class="ruby-identifier">get_alt_meth_name</span>(<span class="ruby-identifier">meth_name</span>))
|
487
598
|
<span class="ruby-identifier">arity</span> = <span class="ruby-identifier">meth_obj</span>.<span class="ruby-identifier">arity</span>
|
488
599
|
|
489
600
|
<span class="ruby-comment"># Construct the newly observed method type first</span>
|
@@ -531,6 +642,7 @@ method list type.</p>
|
|
531
642
|
<span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resolved</span>
|
532
643
|
<span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">types</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">new_meth_type</span>
|
533
644
|
<span class="ruby-keyword">end</span>
|
645
|
+
|
534
646
|
<span class="ruby-keyword">end</span></pre>
|
535
647
|
</div><!-- lub-source -->
|
536
648
|
|
@@ -561,7 +673,7 @@ false.</p>
|
|
561
673
|
|
562
674
|
|
563
675
|
<div class="method-source-code" id="lub_helper-source">
|
564
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
676
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 39</span>
|
565
677
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">lub_helper</span>(<span class="ruby-identifier">exist_meth_type</span>, <span class="ruby-identifier">new_meth_type</span>)
|
566
678
|
|
567
679
|
<span class="ruby-comment"># most restrictive for the given test cases. </span>
|
@@ -615,6 +727,38 @@ false.</p>
|
|
615
727
|
</div><!-- lub_helper-method -->
|
616
728
|
|
617
729
|
|
730
|
+
<div id="method-i-type_error_msg_prefix" class="method-detail ">
|
731
|
+
|
732
|
+
<div class="method-heading">
|
733
|
+
<span class="method-name">type_error_msg_prefix</span><span
|
734
|
+
class="method-args">(mod, meth_name)</span>
|
735
|
+
<span class="method-click-advice">click to toggle source</span>
|
736
|
+
</div>
|
737
|
+
|
738
|
+
|
739
|
+
<div class="method-description">
|
740
|
+
|
741
|
+
<p>This method creates the prefix for the type error message.</p>
|
742
|
+
|
743
|
+
|
744
|
+
|
745
|
+
<div class="method-source-code" id="type_error_msg_prefix-source">
|
746
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 173</span>
|
747
|
+
<span class="ruby-keyword">def</span> <span class="ruby-identifier">type_error_msg_prefix</span>(<span class="ruby-identifier">mod</span>, <span class="ruby-identifier">meth_name</span>)
|
748
|
+
<span class="ruby-identifier">result</span> = <span class="ruby-node">%r#<Class:(.+)>/</span>.<span class="ruby-identifier">match</span>(<span class="ruby-node">"#{mod}"</span>)
|
749
|
+
<span class="ruby-identifier">prefix</span> = <span class="ruby-identifier">result</span> <span class="ruby-operator">?</span> <span class="ruby-node">"#{result[1]}."</span> <span class="ruby-operator">:</span> <span class="ruby-node">"#{mod}#"</span>
|
750
|
+
<span class="ruby-keyword">return</span> <span class="ruby-node">"#{prefix}#{meth_name}"</span>
|
751
|
+
<span class="ruby-keyword">end</span></pre>
|
752
|
+
</div><!-- type_error_msg_prefix-source -->
|
753
|
+
|
754
|
+
</div>
|
755
|
+
|
756
|
+
|
757
|
+
|
758
|
+
|
759
|
+
</div><!-- type_error_msg_prefix-method -->
|
760
|
+
|
761
|
+
|
618
762
|
</section><!-- protected-instance-method-details -->
|
619
763
|
|
620
764
|
</section><!-- 5Buntitled-5D -->
|