rubybreaker 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS +6 -0
- data/VERSION +1 -1
- data/bin/rubybreaker +3 -3
- data/lib/rubybreaker.rb +15 -11
- data/lib/rubybreaker/doc/rdoc.rb +1 -1
- data/lib/rubybreaker/runtime/monitor.rb +8 -6
- data/lib/rubybreaker/runtime/object_wrapper.rb +38 -16
- data/lib/rubybreaker/runtime/overrides.rb +42 -30
- data/lib/rubybreaker/runtime/type_system.rb +45 -14
- data/lib/rubybreaker/type/type_unparser.rb +4 -8
- data/lib/rubybreaker/typing/subtyping.rb +1 -0
- data/test/integrated/tc_original_behavior.rb +38 -0
- data/test/integrated/tc_simple1.rb +20 -0
- data/test/integrated/tc_simple_algorithms.rb +135 -0
- data/test/runtime/tc_obj_wrapper.rb +3 -3
- data/test/ts_integrated.rb +1 -0
- data/test/type/tc_parser.rb +24 -0
- data/webpage/rdoc/Object.html +0 -2
- data/webpage/rdoc/Rake.html +0 -2
- data/webpage/rdoc/Rake/RubyBreakerTestTask.html +0 -2
- data/webpage/rdoc/RubyBreaker.html +1 -3
- data/webpage/rdoc/RubyBreaker/Breakable.html +0 -2
- data/webpage/rdoc/RubyBreaker/Broken.html +0 -2
- data/webpage/rdoc/RubyBreaker/Context.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/ArgumentTypeError.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/ArityError.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/ReturnTypeError.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/TypeError.html +0 -2
- data/webpage/rdoc/RubyBreaker/Errors/UserError.html +0 -2
- data/webpage/rdoc/RubyBreaker/ObjectPosition.html +0 -2
- data/webpage/rdoc/RubyBreaker/Position.html +0 -2
- data/webpage/rdoc/RubyBreaker/RubyTypeUtils.html +0 -2
- data/webpage/rdoc/RubyBreaker/Runtime.html +7 -3
- 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 +12 -13
- data/webpage/rdoc/RubyBreaker/Runtime/MonitorInstaller.html +6 -7
- data/webpage/rdoc/RubyBreaker/Runtime/MonitorSwitch.html +4 -6
- data/webpage/rdoc/RubyBreaker/Runtime/ObjectWrapper.html +21 -19
- data/webpage/rdoc/RubyBreaker/Runtime/Pluggable.html +0 -2
- 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 +52 -23
- 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 +2 -4
- data/webpage/rdoc/RubyBreaker/TypeDefs/VarLengthType.html +0 -2
- data/webpage/rdoc/RubyBreaker/TypeUnparser.html +1 -3
- data/webpage/rdoc/RubyBreaker/Typing.html +1 -3
- data/webpage/rdoc/RubyBreaker/Util.html +0 -2
- data/webpage/rdoc/Test.html +0 -2
- data/webpage/rdoc/Test/Unit.html +0 -2
- data/webpage/rdoc/created.rid +10 -10
- data/webpage/rdoc/index.html +0 -2
- data/webpage/rdoc/js/search_index.js +1 -1
- data/webpage/rdoc/table_of_contents.html +31 -38
- metadata +3 -3
- data/webpage/rdoc/RubyBreaker/RDocSupport.html +0 -328
@@ -146,8 +146,6 @@
|
|
146
146
|
|
147
147
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
148
148
|
|
149
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
150
|
-
|
151
149
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
152
150
|
|
153
151
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -271,22 +269,22 @@ module/class specified for “breaking”. It updates the type information.</p>
|
|
271
269
|
|
272
270
|
|
273
271
|
<div class="method-source-code" id="break_after_method-source">
|
274
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
272
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 386</span>
|
275
273
|
<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>)
|
276
274
|
|
277
275
|
<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>)
|
278
276
|
<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>
|
279
277
|
|
280
|
-
<span class="ruby-comment"># Take things out</span>
|
278
|
+
<span class="ruby-comment"># Take things out of the method info object</span>
|
281
279
|
<span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
|
282
280
|
<span class="ruby-identifier">retval</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
|
283
281
|
<span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
|
284
282
|
<span class="ruby-identifier">blk</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">blk</span>
|
285
283
|
|
286
|
-
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"
|
284
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"break_after_method #{mod}##{meth_name} started"</span>)
|
287
285
|
|
288
286
|
<span class="ruby-comment"># Compute the least upper bound</span>
|
289
|
-
<span class="ruby-identifier">lub</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</span>]
|
287
|
+
<span class="ruby-identifier">lub</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</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>)
|
290
288
|
|
291
289
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">obj</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">retval</span>
|
292
290
|
<span class="ruby-comment"># It is possible that the method receiver is a wrapped object if</span>
|
@@ -296,6 +294,8 @@ module/class specified for “breaking”. It updates the type information.</p>
|
|
296
294
|
<span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span> = <span class="ruby-identifier">obj</span>
|
297
295
|
<span class="ruby-keyword">end</span>
|
298
296
|
|
297
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"break_after_method #{mod}##{meth_name} ended"</span>)
|
298
|
+
|
299
299
|
<span class="ruby-keyword">end</span></pre>
|
300
300
|
</div><!-- break_after_method-source -->
|
301
301
|
|
@@ -325,7 +325,7 @@ wrapper so it can be tracked of the method calls.</p>
|
|
325
325
|
|
326
326
|
|
327
327
|
<div class="method-source-code" id="break_before_method-source">
|
328
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
328
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 314</span>
|
329
329
|
<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>)
|
330
330
|
|
331
331
|
<span class="ruby-comment"># Use the eigen class if the object is a module/class and use the</span>
|
@@ -333,30 +333,37 @@ wrapper so it can be tracked of the method calls.</p>
|
|
333
333
|
<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>)
|
334
334
|
<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>
|
335
335
|
|
336
|
-
<span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</span>]
|
337
|
-
|
338
336
|
<span class="ruby-comment"># Let's take things out of the MethodInfo object</span>
|
339
337
|
<span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
|
340
338
|
<span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
|
341
339
|
<span class="ruby-identifier">blk</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">blk</span>
|
342
340
|
<span class="ruby-identifier">ret</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
|
343
341
|
|
342
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"break_before_method #{mod}##{meth_name} started"</span>)
|
343
|
+
|
344
344
|
<span class="ruby-identifier">args</span> = <span class="ruby-identifier">args</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">arg</span><span class="ruby-operator">|</span>
|
345
345
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">arg</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">arg</span>.<span class="ruby-identifier">kind_of?</span>(<span class="ruby-constant">TrueClass</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">arg</span>.<span class="ruby-identifier">kind_of?</span>(<span class="ruby-constant">FalseClass</span>)
|
346
346
|
<span class="ruby-comment"># XXX: would overrides resolve this issue?</span>
|
347
347
|
<span class="ruby-identifier">arg</span>
|
348
|
+
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">arg</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-constant">WRAPPED_INDICATOR</span>)
|
349
|
+
<span class="ruby-comment"># Don't need to wrap an object that is already wrapped</span>
|
350
|
+
<span class="ruby-identifier">arg</span>
|
348
351
|
<span class="ruby-keyword">else</span>
|
349
352
|
<span class="ruby-constant">ObjectWrapper</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">arg</span>)
|
350
353
|
<span class="ruby-keyword">end</span>
|
351
354
|
<span class="ruby-keyword">end</span>
|
352
355
|
|
353
|
-
<span class="ruby-
|
354
|
-
|
356
|
+
<span class="ruby-comment"># Using this module object, retrieve the method type map which</span>
|
357
|
+
<span class="ruby-comment"># maps method names to method types.</span>
|
358
|
+
<span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</span>]
|
359
|
+
|
360
|
+
<span class="ruby-comment"># Using the method name, get the type of this method from the map.</span>
|
355
361
|
<span class="ruby-identifier">meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>]
|
356
362
|
|
357
363
|
<span class="ruby-keyword">if</span> <span class="ruby-identifier">meth_type</span>
|
358
364
|
<span class="ruby-comment"># This means the method type has been created previously.</span>
|
359
|
-
<span class="ruby-keyword">unless</span>
|
365
|
+
<span class="ruby-keyword">unless</span> <span class="ruby-operator">!</span><span class="ruby-identifier">meth_type</span>.<span class="ruby-identifier">instance_of?</span>(<span class="ruby-constant">MethodType</span>) <span class="ruby-operator">||</span>
|
366
|
+
(<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>
|
360
367
|
(<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>)
|
361
368
|
<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>)
|
362
369
|
<span class="ruby-keyword">end</span>
|
@@ -384,6 +391,8 @@ wrapper so it can be tracked of the method calls.</p>
|
|
384
391
|
|
385
392
|
<span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span> = <span class="ruby-identifier">args</span>
|
386
393
|
|
394
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"break_before_method #{mod}##{meth_name} ended"</span>)
|
395
|
+
|
387
396
|
<span class="ruby-keyword">end</span></pre>
|
388
397
|
</div><!-- break_before_method-source -->
|
389
398
|
|
@@ -411,18 +420,21 @@ wrapper so it can be tracked of the method calls.</p>
|
|
411
420
|
|
412
421
|
|
413
422
|
<div class="method-source-code" id="check_after_method-source">
|
414
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
423
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 284</span>
|
415
424
|
<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>)
|
416
425
|
<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>)
|
417
426
|
<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>
|
418
427
|
|
428
|
+
<span class="ruby-comment"># Get the method type map for the module/class from the global map.</span>
|
419
429
|
<span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">TYPE_MAP</span>[<span class="ruby-identifier">mod</span>]
|
420
|
-
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">meth_type_map</span>
|
430
|
+
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">meth_type_map</span>
|
421
431
|
|
422
432
|
<span class="ruby-comment"># Let's take things out of the MethodInfo object</span>
|
423
433
|
<span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
|
424
434
|
<span class="ruby-identifier">ret</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
|
425
435
|
|
436
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"check_after_method #{mod}##{meth_name} started"</span>)
|
437
|
+
|
426
438
|
<span class="ruby-comment"># Get the registered method type for this method</span>
|
427
439
|
<span class="ruby-identifier">meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>]
|
428
440
|
|
@@ -432,6 +444,8 @@ wrapper so it can be tracked of the method calls.</p>
|
|
432
444
|
<span class="ruby-node">" return value does not have type #{ret_type.unparse()}."</span>
|
433
445
|
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Errors</span><span class="ruby-operator">::</span><span class="ruby-constant">ReturnTypeError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">msg</span>)
|
434
446
|
<span class="ruby-keyword">end</span>
|
447
|
+
|
448
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"check_after_method #{mod}##{meth_name} started"</span>)
|
435
449
|
<span class="ruby-keyword">end</span></pre>
|
436
450
|
</div><!-- check_after_method-source -->
|
437
451
|
|
@@ -459,7 +473,7 @@ wrapper so it can be tracked of the method calls.</p>
|
|
459
473
|
|
460
474
|
|
461
475
|
<div class="method-source-code" id="check_before_method-source">
|
462
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
476
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 216</span>
|
463
477
|
<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>)
|
464
478
|
<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>)
|
465
479
|
<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>
|
@@ -472,6 +486,8 @@ wrapper so it can be tracked of the method calls.</p>
|
|
472
486
|
<span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
|
473
487
|
<span class="ruby-comment"># blk = meth_info.blk</span>
|
474
488
|
|
489
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"check_before_method #{mod}##{meth_name} started"</span>)
|
490
|
+
|
475
491
|
<span class="ruby-comment"># Get the registered method type for this method</span>
|
476
492
|
<span class="ruby-identifier">meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>]
|
477
493
|
|
@@ -522,6 +538,7 @@ wrapper so it can be tracked of the method calls.</p>
|
|
522
538
|
<span class="ruby-keyword">end</span>
|
523
539
|
<span class="ruby-keyword">end</span>
|
524
540
|
|
541
|
+
<span class="ruby-constant">RubyBreaker</span>.<span class="ruby-identifier">log</span>(<span class="ruby-node">"check_before_method #{mod}##{meth_name} ended"</span>)
|
525
542
|
<span class="ruby-keyword">end</span></pre>
|
526
543
|
</div><!-- check_before_method-source -->
|
527
544
|
|
@@ -555,7 +572,7 @@ wrapper so it can be tracked of the method calls.</p>
|
|
555
572
|
|
556
573
|
|
557
574
|
<div class="method-source-code" id="arity_check-source">
|
558
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
575
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 194</span>
|
559
576
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">arity_check</span>(<span class="ruby-identifier">num_of_args</span>, <span class="ruby-identifier">meth_type</span>)
|
560
577
|
<span class="ruby-identifier">arg_types</span> = <span class="ruby-identifier">meth_type</span>.<span class="ruby-identifier">arg_types</span>
|
561
578
|
|
@@ -673,7 +690,7 @@ method list type.</p>
|
|
673
690
|
|
674
691
|
|
675
692
|
<div class="method-source-code" id="lub-source">
|
676
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
693
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 128</span>
|
677
694
|
<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>)
|
678
695
|
|
679
696
|
<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>]
|
@@ -764,21 +781,31 @@ false.</p>
|
|
764
781
|
<span class="ruby-comment"># most restrictive for the given test cases. </span>
|
765
782
|
<span class="ruby-identifier">arg_types</span> = []
|
766
783
|
|
784
|
+
<span class="ruby-comment"># Resolve the argument types first.</span>
|
767
785
|
<span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">arg_types</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">exist_arg_type</span>, <span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
|
768
786
|
<span class="ruby-identifier">arg_type</span> = <span class="ruby-keyword">nil</span>
|
769
787
|
<span class="ruby-identifier">new_arg_type</span> = <span class="ruby-identifier">new_meth_type</span>.<span class="ruby-identifier">arg_types</span>[<span class="ruby-identifier">i</span>]
|
770
788
|
<span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">exist_arg_type</span>
|
771
|
-
<span class="ruby-comment"># nil means there hasn't been any type observed</span>
|
789
|
+
<span class="ruby-comment"># nil means there hasn't been any type observed so use the new</span>
|
790
|
+
<span class="ruby-comment"># argument type as "resolved".</span>
|
772
791
|
<span class="ruby-identifier">arg_type</span> = <span class="ruby-identifier">new_arg_type</span>
|
773
792
|
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">new_arg_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">exist_arg_type</span>)
|
793
|
+
<span class="ruby-comment"># Pick the subtype argument since we are resolving in</span>
|
794
|
+
<span class="ruby-comment"># contra-variance</span>
|
795
|
+
<span class="ruby-identifier">arg_type</span> = <span class="ruby-identifier">new_arg_type</span>
|
796
|
+
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">exist_arg_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">new_arg_type</span>)
|
797
|
+
<span class="ruby-comment"># Pick the subtype argument since we are resolving in</span>
|
798
|
+
<span class="ruby-comment"># contra-variance</span>
|
774
799
|
<span class="ruby-identifier">arg_type</span> = <span class="ruby-identifier">exist_arg_type</span>
|
775
|
-
<span class="ruby-keyword">
|
776
|
-
<span class="ruby-comment"># No subtype relation between them, so OR them
|
800
|
+
<span class="ruby-keyword">else</span>
|
801
|
+
<span class="ruby-comment"># No subtype relation between them, so OR them.</span>
|
777
802
|
<span class="ruby-identifier">arg_type</span> = <span class="ruby-constant">OrType</span>.<span class="ruby-identifier">new</span>([<span class="ruby-identifier">new_arg_type</span>, <span class="ruby-identifier">exist_arg_type</span>])
|
778
803
|
<span class="ruby-keyword">end</span>
|
779
804
|
<span class="ruby-identifier">arg_types</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">arg_type</span>
|
780
805
|
<span class="ruby-keyword">end</span>
|
781
806
|
|
807
|
+
<span class="ruby-comment"># Now, resolve the return type</span>
|
808
|
+
|
782
809
|
<span class="ruby-identifier">new_ret_type</span> = <span class="ruby-identifier">new_meth_type</span>.<span class="ruby-identifier">ret_type</span>
|
783
810
|
<span class="ruby-identifier">exist_ret_type</span> = <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">ret_type</span>
|
784
811
|
|
@@ -786,10 +813,12 @@ false.</p>
|
|
786
813
|
<span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">new_ret_type</span>
|
787
814
|
<span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">true</span>
|
788
815
|
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">exist_ret_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">new_ret_type</span>)
|
789
|
-
<span class="ruby-
|
816
|
+
<span class="ruby-comment"># Co-variance</span>
|
817
|
+
<span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">new_ret_type</span>
|
790
818
|
<span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">true</span>
|
791
819
|
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">new_ret_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">exist_ret_type</span>)
|
792
|
-
<span class="ruby-
|
820
|
+
<span class="ruby-comment"># Co-variance</span>
|
821
|
+
<span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">exist_ret_type</span>
|
793
822
|
<span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">true</span>
|
794
823
|
<span class="ruby-keyword">else</span>
|
795
824
|
<span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">false</span>
|
@@ -828,7 +857,7 @@ false.</p>
|
|
828
857
|
|
829
858
|
|
830
859
|
<div class="method-source-code" id="type_error_msg_prefix-source">
|
831
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line
|
860
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 185</span>
|
832
861
|
<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>)
|
833
862
|
<span class="ruby-comment"># Match eigen class and returns a prefix that is a class method</span>
|
834
863
|
<span class="ruby-comment"># using dot (.) instead of double colons (::).</span>
|
@@ -120,8 +120,6 @@
|
|
120
120
|
|
121
121
|
<li><a href="../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
122
122
|
|
123
|
-
<li><a href="../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
124
|
-
|
125
123
|
<li><a href="../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
126
124
|
|
127
125
|
<li><a href="../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -98,8 +98,6 @@
|
|
98
98
|
|
99
99
|
<li><a href="../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
100
100
|
|
101
|
-
<li><a href="../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
102
|
-
|
103
101
|
<li><a href="../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
104
102
|
|
105
103
|
<li><a href="../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -116,8 +116,6 @@
|
|
116
116
|
|
117
117
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
118
118
|
|
119
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
120
|
-
|
121
119
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
122
120
|
|
123
121
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -116,8 +116,6 @@
|
|
116
116
|
|
117
117
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
118
118
|
|
119
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
120
|
-
|
121
119
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
122
120
|
|
123
121
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -118,8 +118,6 @@
|
|
118
118
|
|
119
119
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
120
120
|
|
121
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
122
|
-
|
123
121
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
124
122
|
|
125
123
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -123,8 +123,6 @@
|
|
123
123
|
|
124
124
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
125
125
|
|
126
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
127
|
-
|
128
126
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
129
127
|
|
130
128
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -354,7 +352,7 @@ href="../Typing.html#method-c-subtype_rel-3F">RubyBreaker::Typing.subtype_rel?</
|
|
354
352
|
|
355
353
|
|
356
354
|
<div class="method-source-code" id="subtype_of-3F-source">
|
357
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/typing/subtyping.rb, line
|
355
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/typing/subtyping.rb, line 480</span>
|
358
356
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">rhs</span>)
|
359
357
|
<span class="ruby-keyword">return</span> <span class="ruby-constant">Typing</span>.<span class="ruby-identifier">subtype_rel?</span>(<span class="ruby-keyword">self</span>,<span class="ruby-identifier">rhs</span>)
|
360
358
|
<span class="ruby-keyword">end</span></pre>
|
@@ -385,7 +383,7 @@ href="../TypeUnparser.html#method-c-unparse">RubyBreaker::TypeUnparser.unparse</
|
|
385
383
|
|
386
384
|
|
387
385
|
<div class="method-source-code" id="unparse-source">
|
388
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/type/type_unparser.rb, line
|
386
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/type/type_unparser.rb, line 176</span>
|
389
387
|
<span class="ruby-keyword">def</span> <span class="ruby-identifier">unparse</span>(<span class="ruby-identifier">opts</span>={})
|
390
388
|
<span class="ruby-constant">TypeUnparser</span>.<span class="ruby-identifier">unparse</span>(<span class="ruby-keyword">self</span>, <span class="ruby-identifier">opts</span>)
|
391
389
|
<span class="ruby-keyword">end</span></pre>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -120,8 +120,6 @@
|
|
120
120
|
|
121
121
|
<li><a href="../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
122
122
|
|
123
|
-
<li><a href="../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
124
|
-
|
125
123
|
<li><a href="../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
126
124
|
|
127
125
|
<li><a href="../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -248,7 +246,7 @@ according to the specified options.</p>
|
|
248
246
|
|
249
247
|
|
250
248
|
<div class="method-source-code" id="unparse-source">
|
251
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/type/type_unparser.rb, line
|
249
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/type/type_unparser.rb, line 164</span>
|
252
250
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">unparse</span>(<span class="ruby-identifier">t</span>, <span class="ruby-identifier">opts</span>={})
|
253
251
|
<span class="ruby-identifier">str</span> = <span class="ruby-string">""</span>
|
254
252
|
<span class="ruby-identifier">pp</span> = <span class="ruby-constant">PrettyPrint</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">str</span>)
|
@@ -120,8 +120,6 @@
|
|
120
120
|
|
121
121
|
<li><a href="../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
122
122
|
|
123
|
-
<li><a href="../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
124
|
-
|
125
123
|
<li><a href="../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
126
124
|
|
127
125
|
<li><a href="../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
@@ -252,7 +250,7 @@ href="TypeDefs.html">TypeDefs</a></em> module for more detail.</p>
|
|
252
250
|
|
253
251
|
|
254
252
|
<div class="method-source-code" id="subtype_rel-3F-source">
|
255
|
-
<pre><span class="ruby-comment"># File lib/rubybreaker/typing/subtyping.rb, line
|
253
|
+
<pre><span class="ruby-comment"># File lib/rubybreaker/typing/subtyping.rb, line 441</span>
|
256
254
|
<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">subtype_rel?</span>(<span class="ruby-identifier">lhs</span>, <span class="ruby-identifier">rhs</span>)
|
257
255
|
|
258
256
|
<span class="ruby-comment"># Don't even bother if they are same object or syntactically</span>
|
@@ -114,8 +114,6 @@
|
|
114
114
|
|
115
115
|
<li><a href="../RubyBreaker/Position.html">RubyBreaker::Position</a>
|
116
116
|
|
117
|
-
<li><a href="../RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
118
|
-
|
119
117
|
<li><a href="../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
120
118
|
|
121
119
|
<li><a href="../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|
data/webpage/rdoc/Test.html
CHANGED
@@ -97,8 +97,6 @@
|
|
97
97
|
|
98
98
|
<li><a href="./RubyBreaker/Position.html">RubyBreaker::Position</a>
|
99
99
|
|
100
|
-
<li><a href="./RubyBreaker/RDocSupport.html">RubyBreaker::RDocSupport</a>
|
101
|
-
|
102
100
|
<li><a href="./RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
|
103
101
|
|
104
102
|
<li><a href="./RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
|