rubybreaker 0.0.1 → 0.0.2

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.
Files changed (122) hide show
  1. data/NEWS +48 -0
  2. data/README.md +56 -20
  3. data/Rakefile +9 -34
  4. data/TODO +10 -10
  5. data/VERSION +1 -0
  6. data/bin/gen_stub_rubylib +35 -36
  7. data/bin/rubybreaker +1 -4
  8. data/lib/rubybreaker/debug.rb +8 -4
  9. data/lib/rubybreaker/rubylib/core.rb +738 -571
  10. data/lib/rubybreaker/runtime/inspector.rb +16 -7
  11. data/lib/rubybreaker/runtime/monitor.rb +14 -18
  12. data/lib/rubybreaker/runtime/object_wrapper.rb +9 -3
  13. data/lib/rubybreaker/runtime/overrides.rb +51 -8
  14. data/lib/rubybreaker/runtime/pluggable.rb +1 -3
  15. data/lib/rubybreaker/runtime/type_placeholder.rb +2 -6
  16. data/lib/rubybreaker/runtime/type_system.rb +53 -17
  17. data/lib/rubybreaker/runtime/typesig_parser.rb +1 -0
  18. data/lib/rubybreaker/runtime/util.rb +18 -0
  19. data/lib/rubybreaker/runtime.rb +42 -15
  20. data/lib/rubybreaker/type/type_comparer.rb +10 -10
  21. data/lib/rubybreaker/type/type_grammar.treetop +30 -21
  22. data/lib/rubybreaker/type/type_unparser.rb +2 -2
  23. data/lib/rubybreaker/typing/subtyping.rb +21 -21
  24. data/lib/rubybreaker/util.rb +11 -1
  25. data/lib/rubybreaker.rb +75 -54
  26. data/test/integrated/tc_class_methods.rb +35 -0
  27. data/test/integrated/tc_inherit_broken.rb +29 -0
  28. data/test/integrated/tc_method_missing.rb +1 -1
  29. data/test/runtime/tc_obj_wrapper.rb +104 -4
  30. data/test/ts_integrated.rb +2 -0
  31. data/test/type/tc_comparer.rb +96 -96
  32. data/test/type/tc_parser.rb +18 -0
  33. data/test/type/tc_unparser.rb +16 -0
  34. data/test/typing/tc_typing.rb +20 -20
  35. data/webpage/footer.html +1 -1
  36. data/webpage/header.html +7 -7
  37. data/webpage/index.html +65 -28
  38. data/webpage/rdoc/RubyBreaker/Breakable.html +280 -0
  39. data/webpage/rdoc/RubyBreaker/Broken/BrokenEigen.html +304 -0
  40. data/webpage/rdoc/RubyBreaker/Broken.html +308 -0
  41. data/webpage/rdoc/RubyBreaker/Context.html +421 -0
  42. data/webpage/rdoc/RubyBreaker/Debug.html +411 -0
  43. data/webpage/rdoc/RubyBreaker/Errors/InternalError.html +263 -0
  44. data/webpage/rdoc/RubyBreaker/Errors/InvalidSubtypeCheck.html +263 -0
  45. data/webpage/rdoc/RubyBreaker/Errors/InvalidTypeConstruction.html +214 -0
  46. data/webpage/rdoc/RubyBreaker/Errors/SubtypeFailure.html +212 -0
  47. data/webpage/rdoc/RubyBreaker/Errors/TypeError.html +212 -0
  48. data/webpage/rdoc/RubyBreaker/Errors/UserError.html +264 -0
  49. data/webpage/rdoc/RubyBreaker/Errors.html +209 -0
  50. data/webpage/rdoc/RubyBreaker/Kernel.html +259 -0
  51. data/webpage/rdoc/RubyBreaker/Main.html +560 -0
  52. data/webpage/rdoc/RubyBreaker/ObjectPosition.html +334 -0
  53. data/webpage/rdoc/RubyBreaker/Position.html +463 -0
  54. data/webpage/rdoc/RubyBreaker/RubyTypeUtils.html +308 -0
  55. data/webpage/rdoc/RubyBreaker/Runtime/Inspector.html +380 -0
  56. data/webpage/rdoc/RubyBreaker/Runtime/MethodInfo.html +324 -0
  57. data/webpage/rdoc/RubyBreaker/Runtime/Monitor.html +354 -0
  58. data/webpage/rdoc/RubyBreaker/Runtime/MonitorInstaller.html +379 -0
  59. data/webpage/rdoc/RubyBreaker/Runtime/MonitorSwitch.html +382 -0
  60. data/webpage/rdoc/RubyBreaker/Runtime/MonitorUtils.html +400 -0
  61. data/webpage/rdoc/RubyBreaker/Runtime/ObjectWrapper.html +411 -0
  62. data/webpage/rdoc/RubyBreaker/Runtime/Pluggable.html +305 -0
  63. data/webpage/rdoc/RubyBreaker/Runtime/TypePlaceholder.html +280 -0
  64. data/webpage/rdoc/RubyBreaker/Runtime/TypeSigParser.html +283 -0
  65. data/webpage/rdoc/RubyBreaker/Runtime/TypeSystem.html +630 -0
  66. data/webpage/rdoc/RubyBreaker/Runtime.html +255 -0
  67. data/webpage/rdoc/RubyBreaker/TestCase.html +332 -0
  68. data/webpage/rdoc/RubyBreaker/TypeComparer.html +304 -0
  69. data/webpage/rdoc/RubyBreaker/TypeDefs/AnyType.html +260 -0
  70. data/webpage/rdoc/RubyBreaker/TypeDefs/BlockType.html +310 -0
  71. data/webpage/rdoc/RubyBreaker/TypeDefs/DuckType.html +320 -0
  72. data/webpage/rdoc/RubyBreaker/TypeDefs/FusionType.html +323 -0
  73. data/webpage/rdoc/RubyBreaker/TypeDefs/MethodListType.html +281 -0
  74. data/webpage/rdoc/RubyBreaker/TypeDefs/MethodType.html +282 -0
  75. data/webpage/rdoc/RubyBreaker/TypeDefs/NilType.html +260 -0
  76. data/webpage/rdoc/RubyBreaker/TypeDefs/NominalType.html +282 -0
  77. data/webpage/rdoc/RubyBreaker/TypeDefs/OptionalType.html +281 -0
  78. data/webpage/rdoc/RubyBreaker/TypeDefs/OrType.html +281 -0
  79. data/webpage/rdoc/RubyBreaker/TypeDefs/SelfType.html +329 -0
  80. data/webpage/rdoc/RubyBreaker/TypeDefs/Type.html +409 -0
  81. data/webpage/rdoc/RubyBreaker/TypeDefs/VarLengthType.html +282 -0
  82. data/webpage/rdoc/RubyBreaker/TypeDefs.html +212 -0
  83. data/webpage/rdoc/RubyBreaker/TypeUnparser.html +273 -0
  84. data/webpage/rdoc/RubyBreaker/Typing.html +305 -0
  85. data/webpage/rdoc/RubyBreaker/Utilities.html +294 -0
  86. data/webpage/rdoc/RubyBreaker.html +337 -0
  87. data/webpage/rdoc/created.rid +26 -0
  88. data/webpage/rdoc/images/add.png +0 -0
  89. data/webpage/rdoc/images/brick.png +0 -0
  90. data/webpage/rdoc/images/brick_link.png +0 -0
  91. data/webpage/rdoc/images/bug.png +0 -0
  92. data/webpage/rdoc/images/bullet_black.png +0 -0
  93. data/webpage/rdoc/images/bullet_toggle_minus.png +0 -0
  94. data/webpage/rdoc/images/bullet_toggle_plus.png +0 -0
  95. data/webpage/rdoc/images/date.png +0 -0
  96. data/webpage/rdoc/images/delete.png +0 -0
  97. data/webpage/rdoc/images/find.png +0 -0
  98. data/webpage/rdoc/images/loadingAnimation.gif +0 -0
  99. data/webpage/rdoc/images/macFFBgHack.png +0 -0
  100. data/webpage/rdoc/images/package.png +0 -0
  101. data/webpage/rdoc/images/page_green.png +0 -0
  102. data/webpage/rdoc/images/page_white_text.png +0 -0
  103. data/webpage/rdoc/images/page_white_width.png +0 -0
  104. data/webpage/rdoc/images/plugin.png +0 -0
  105. data/webpage/rdoc/images/ruby.png +0 -0
  106. data/webpage/rdoc/images/tag_blue.png +0 -0
  107. data/webpage/rdoc/images/tag_green.png +0 -0
  108. data/webpage/rdoc/images/transparent.png +0 -0
  109. data/webpage/rdoc/images/wrench.png +0 -0
  110. data/webpage/rdoc/images/wrench_orange.png +0 -0
  111. data/webpage/rdoc/images/zoom.png +0 -0
  112. data/webpage/rdoc/index.html +165 -0
  113. data/webpage/rdoc/js/darkfish.js +153 -0
  114. data/webpage/rdoc/js/jquery.js +18 -0
  115. data/webpage/rdoc/js/navigation.js +142 -0
  116. data/webpage/rdoc/js/search.js +94 -0
  117. data/webpage/rdoc/js/search_index.js +1 -0
  118. data/webpage/rdoc/js/searcher.js +228 -0
  119. data/webpage/rdoc/rdoc.css +543 -0
  120. data/webpage/rdoc/table_of_contents.html +376 -0
  121. data/webpage/rubybreaker.css +31 -31
  122. metadata +93 -6
@@ -0,0 +1,630 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>class RubyBreaker::Runtime::TypeSystem - RDoc Documentation</title>
8
+
9
+ <link type="text/css" media="screen" href="../../rdoc.css" rel="stylesheet">
10
+
11
+ <script type="text/javascript">
12
+ var rdoc_rel_prefix = "../../";
13
+ </script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="../../js/jquery.js"></script>
16
+ <script type="text/javascript" charset="utf-8" src="../../js/navigation.js"></script>
17
+ <script type="text/javascript" charset="utf-8" src="../../js/search_index.js"></script>
18
+ <script type="text/javascript" charset="utf-8" src="../../js/search.js"></script>
19
+ <script type="text/javascript" charset="utf-8" src="../../js/searcher.js"></script>
20
+ <script type="text/javascript" charset="utf-8" src="../../js/darkfish.js"></script>
21
+
22
+
23
+ <body id="top" class="class">
24
+ <nav id="metadata">
25
+ <nav id="home-section" class="section">
26
+ <h3 class="section-header">
27
+ <a href="../../index.html">Home</a>
28
+ <a href="../../table_of_contents.html#classes">Classes</a>
29
+ <a href="../../table_of_contents.html#methods">Methods</a>
30
+ </h3>
31
+ </nav>
32
+
33
+
34
+ <nav id="search-section" class="section project-section" class="initially-hidden">
35
+ <form action="#" method="get" accept-charset="utf-8">
36
+ <h3 class="section-header">
37
+ <input type="text" name="search" placeholder="Search" id="search-field"
38
+ title="Type to search, Up and Down to navigate, Enter to load">
39
+ </h3>
40
+ </form>
41
+
42
+ <ul id="search-results" class="initially-hidden"></ul>
43
+ </nav>
44
+
45
+
46
+ <div id="file-metadata">
47
+ <nav id="file-list-section" class="section">
48
+ <h3 class="section-header">Defined In</h3>
49
+ <ul>
50
+ <li>lib/rubybreaker/runtime/type_system.rb
51
+ </ul>
52
+ </nav>
53
+
54
+
55
+ </div>
56
+
57
+ <div id="class-metadata">
58
+
59
+ <nav id="parent-class-section" class="section">
60
+ <h3 class="section-header">Parent</h3>
61
+
62
+ <p class="link">Object
63
+
64
+ </nav>
65
+
66
+ <!-- Included Modules -->
67
+ <nav id="includes-section" class="section">
68
+ <h3 class="section-header">Included Modules</h3>
69
+
70
+ <ul class="link-list">
71
+
72
+
73
+ <li><a class="include" href="Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
74
+
75
+
76
+
77
+ <li><a class="include" href="../TypeDefs.html">RubyBreaker::TypeDefs</a>
78
+
79
+
80
+ </ul>
81
+ </nav>
82
+
83
+ <!-- Method Quickref -->
84
+ <nav id="method-list-section" class="section">
85
+ <h3 class="section-header">Methods</h3>
86
+
87
+ <ul class="link-list">
88
+
89
+ <li><a href="#method-i-after_method">#after_method</a>
90
+
91
+ <li><a href="#method-i-before_method">#before_method</a>
92
+
93
+ <li><a href="#method-i-is_object_wrapped-3F">#is_object_wrapped?</a>
94
+
95
+ <li><a href="#method-i-lub">#lub</a>
96
+
97
+ <li><a href="#method-i-lub_helper">#lub_helper</a>
98
+
99
+ </ul>
100
+ </nav>
101
+
102
+ </div>
103
+
104
+ <div id="project-metadata">
105
+
106
+ <nav id="classindex-section" class="section project-section">
107
+ <h3 class="section-header">Class and Module Index</h3>
108
+
109
+ <ul class="link-list">
110
+
111
+ <li><a href="../../RubyBreaker.html">RubyBreaker</a>
112
+
113
+ <li><a href="../../RubyBreaker/Breakable.html">RubyBreaker::Breakable</a>
114
+
115
+ <li><a href="../../RubyBreaker/Broken.html">RubyBreaker::Broken</a>
116
+
117
+ <li><a href="../../RubyBreaker/Broken/BrokenEigen.html">RubyBreaker::Broken::BrokenEigen</a>
118
+
119
+ <li><a href="../../RubyBreaker/Context.html">RubyBreaker::Context</a>
120
+
121
+ <li><a href="../../RubyBreaker/Debug.html">RubyBreaker::Debug</a>
122
+
123
+ <li><a href="../../RubyBreaker/Errors.html">RubyBreaker::Errors</a>
124
+
125
+ <li><a href="../../RubyBreaker/Errors/InternalError.html">RubyBreaker::Errors::InternalError</a>
126
+
127
+ <li><a href="../../RubyBreaker/Errors/InvalidSubtypeCheck.html">RubyBreaker::Errors::InvalidSubtypeCheck</a>
128
+
129
+ <li><a href="../../RubyBreaker/Errors/InvalidTypeConstruction.html">RubyBreaker::Errors::InvalidTypeConstruction</a>
130
+
131
+ <li><a href="../../RubyBreaker/Errors/SubtypeFailure.html">RubyBreaker::Errors::SubtypeFailure</a>
132
+
133
+ <li><a href="../../RubyBreaker/Errors/TypeError.html">RubyBreaker::Errors::TypeError</a>
134
+
135
+ <li><a href="../../RubyBreaker/Errors/UserError.html">RubyBreaker::Errors::UserError</a>
136
+
137
+ <li><a href="../../RubyBreaker/Kernel.html">RubyBreaker::Kernel</a>
138
+
139
+ <li><a href="../../RubyBreaker/Main.html">RubyBreaker::Main</a>
140
+
141
+ <li><a href="../../RubyBreaker/ObjectPosition.html">RubyBreaker::ObjectPosition</a>
142
+
143
+ <li><a href="../../RubyBreaker/Position.html">RubyBreaker::Position</a>
144
+
145
+ <li><a href="../../RubyBreaker/RubyTypeUtils.html">RubyBreaker::RubyTypeUtils</a>
146
+
147
+ <li><a href="../../RubyBreaker/Runtime.html">RubyBreaker::Runtime</a>
148
+
149
+ <li><a href="../../RubyBreaker/Runtime/Inspector.html">RubyBreaker::Runtime::Inspector</a>
150
+
151
+ <li><a href="../../RubyBreaker/Runtime/MethodInfo.html">RubyBreaker::Runtime::MethodInfo</a>
152
+
153
+ <li><a href="../../RubyBreaker/Runtime/Monitor.html">RubyBreaker::Runtime::Monitor</a>
154
+
155
+ <li><a href="../../RubyBreaker/Runtime/MonitorInstaller.html">RubyBreaker::Runtime::MonitorInstaller</a>
156
+
157
+ <li><a href="../../RubyBreaker/Runtime/MonitorSwitch.html">RubyBreaker::Runtime::MonitorSwitch</a>
158
+
159
+ <li><a href="../../RubyBreaker/Runtime/MonitorUtils.html">RubyBreaker::Runtime::MonitorUtils</a>
160
+
161
+ <li><a href="../../RubyBreaker/Runtime/ObjectWrapper.html">RubyBreaker::Runtime::ObjectWrapper</a>
162
+
163
+ <li><a href="../../RubyBreaker/Runtime/Pluggable.html">RubyBreaker::Runtime::Pluggable</a>
164
+
165
+ <li><a href="../../RubyBreaker/Runtime/TypePlaceholder.html">RubyBreaker::Runtime::TypePlaceholder</a>
166
+
167
+ <li><a href="../../RubyBreaker/Runtime/TypeSigParser.html">RubyBreaker::Runtime::TypeSigParser</a>
168
+
169
+ <li><a href="../../RubyBreaker/Runtime/TypeSystem.html">RubyBreaker::Runtime::TypeSystem</a>
170
+
171
+ <li><a href="../../RubyBreaker/TestCase.html">RubyBreaker::TestCase</a>
172
+
173
+ <li><a href="../../RubyBreaker/TypeComparer.html">RubyBreaker::TypeComparer</a>
174
+
175
+ <li><a href="../../RubyBreaker/TypeDefs.html">RubyBreaker::TypeDefs</a>
176
+
177
+ <li><a href="../../RubyBreaker/TypeDefs/AnyType.html">RubyBreaker::TypeDefs::AnyType</a>
178
+
179
+ <li><a href="../../RubyBreaker/TypeDefs/BlockType.html">RubyBreaker::TypeDefs::BlockType</a>
180
+
181
+ <li><a href="../../RubyBreaker/TypeDefs/DuckType.html">RubyBreaker::TypeDefs::DuckType</a>
182
+
183
+ <li><a href="../../RubyBreaker/TypeDefs/FusionType.html">RubyBreaker::TypeDefs::FusionType</a>
184
+
185
+ <li><a href="../../RubyBreaker/TypeDefs/MethodListType.html">RubyBreaker::TypeDefs::MethodListType</a>
186
+
187
+ <li><a href="../../RubyBreaker/TypeDefs/MethodType.html">RubyBreaker::TypeDefs::MethodType</a>
188
+
189
+ <li><a href="../../RubyBreaker/TypeDefs/NilType.html">RubyBreaker::TypeDefs::NilType</a>
190
+
191
+ <li><a href="../../RubyBreaker/TypeDefs/NominalType.html">RubyBreaker::TypeDefs::NominalType</a>
192
+
193
+ <li><a href="../../RubyBreaker/TypeDefs/OptionalType.html">RubyBreaker::TypeDefs::OptionalType</a>
194
+
195
+ <li><a href="../../RubyBreaker/TypeDefs/OrType.html">RubyBreaker::TypeDefs::OrType</a>
196
+
197
+ <li><a href="../../RubyBreaker/TypeDefs/SelfType.html">RubyBreaker::TypeDefs::SelfType</a>
198
+
199
+ <li><a href="../../RubyBreaker/TypeDefs/Type.html">RubyBreaker::TypeDefs::Type</a>
200
+
201
+ <li><a href="../../RubyBreaker/TypeDefs/VarLengthType.html">RubyBreaker::TypeDefs::VarLengthType</a>
202
+
203
+ <li><a href="../../RubyBreaker/TypeUnparser.html">RubyBreaker::TypeUnparser</a>
204
+
205
+ <li><a href="../../RubyBreaker/Typing.html">RubyBreaker::Typing</a>
206
+
207
+ <li><a href="../../RubyBreaker/Utilities.html">RubyBreaker::Utilities</a>
208
+
209
+ </ul>
210
+ </nav>
211
+
212
+ </div>
213
+ </nav>
214
+
215
+ <div id="documentation">
216
+ <h1 class="class">class RubyBreaker::Runtime::TypeSystem</h1>
217
+
218
+ <div id="description" class="description">
219
+
220
+ <p>This is the default type system for <a
221
+ href="../../RubyBreaker.html">RubyBreaker</a>. It can be overridden by a
222
+ user specified type system. See <code>pluggable.rb</code> for how this can
223
+ be done.</p>
224
+
225
+ </div><!-- description -->
226
+
227
+
228
+
229
+
230
+ <section id="5Buntitled-5D" class="documentation-section">
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+ <!-- Methods -->
240
+
241
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
242
+ <h3 class="section-header">Public Instance Methods</h3>
243
+
244
+
245
+ <div id="method-i-after_method" class="method-detail ">
246
+
247
+ <div class="method-heading">
248
+ <span class="method-name">after_method</span><span
249
+ class="method-args">(obj, meth_info)</span>
250
+ <span class="method-click-advice">click to toggle source</span>
251
+ </div>
252
+
253
+
254
+ <div class="method-description">
255
+
256
+ <p>This method occurs after every “monitored” method call. It updates the type
257
+ information.</p>
258
+
259
+
260
+
261
+ <div class="method-source-code" id="after_method-source">
262
+ <pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 233</span>
263
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">after_method</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
264
+
265
+ <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>)
266
+ <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>
267
+
268
+ <span class="ruby-comment"># Take things out</span>
269
+ <span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
270
+ <span class="ruby-identifier">retval</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
271
+ <span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
272
+ <span class="ruby-identifier">blk</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">blk</span>
273
+
274
+ <span class="ruby-constant">Debug</span>.<span class="ruby-identifier">msg</span>(<span class="ruby-node">&quot;In module monitor_after #{meth_name}&quot;</span>)
275
+
276
+ <span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">Breakable</span><span class="ruby-operator">::</span><span class="ruby-constant">TYPE_PLACEHOLDER_MAP</span>[<span class="ruby-identifier">mod</span>].<span class="ruby-identifier">meth_type_map</span>
277
+
278
+ <span class="ruby-comment"># Compute the least upper bound</span>
279
+ <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>,&amp;<span class="ruby-identifier">blk</span>)
280
+
281
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">obj</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">retval</span>
282
+ <span class="ruby-comment"># It is possible that the method receiver is a wrapped object if</span>
283
+ <span class="ruby-comment"># it is an argument to a method in the current call stack. So this</span>
284
+ <span class="ruby-comment"># check is to return the wrapped object and not the stripped off</span>
285
+ <span class="ruby-comment"># version. (Remember, == is overridden for the wrapped object.)</span>
286
+ <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span> = <span class="ruby-identifier">obj</span>
287
+ <span class="ruby-keyword">end</span>
288
+
289
+ <span class="ruby-keyword">end</span></pre>
290
+ </div><!-- after_method-source -->
291
+
292
+ </div>
293
+
294
+
295
+
296
+
297
+ </div><!-- after_method-method -->
298
+
299
+
300
+ <div id="method-i-before_method" class="method-detail ">
301
+
302
+ <div class="method-heading">
303
+ <span class="method-name">before_method</span><span
304
+ class="method-args">(obj, meth_info)</span>
305
+ <span class="method-click-advice">click to toggle source</span>
306
+ </div>
307
+
308
+
309
+ <div class="method-description">
310
+
311
+ <p>This method occurs before every “monitored” method call. It wraps each
312
+ argument with the object wrapper.</p>
313
+
314
+
315
+
316
+ <div class="method-source-code" id="before_method-source">
317
+ <pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 173</span>
318
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">before_method</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">meth_info</span>)
319
+
320
+ <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
+ <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
+
323
+ <span class="ruby-identifier">meth_type_map</span> = <span class="ruby-constant">Breakable</span><span class="ruby-operator">::</span><span class="ruby-constant">TYPE_PLACEHOLDER_MAP</span>[<span class="ruby-identifier">mod</span>].<span class="ruby-identifier">meth_type_map</span>
324
+
325
+ <span class="ruby-comment"># Let's take things out of the MethodInfo object</span>
326
+ <span class="ruby-identifier">meth_name</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">meth_name</span>
327
+ <span class="ruby-identifier">args</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span>
328
+ <span class="ruby-identifier">blk</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">blk</span>
329
+ <span class="ruby-identifier">ret</span> = <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">ret</span>
330
+
331
+ <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>
332
+ <span class="ruby-keyword">if</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>)
333
+ <span class="ruby-comment"># XXX: would overrides resolve this issue?</span>
334
+ <span class="ruby-identifier">arg</span>
335
+ <span class="ruby-keyword">else</span>
336
+ <span class="ruby-constant">ObjectWrapper</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">arg</span>)
337
+ <span class="ruby-keyword">end</span>
338
+ <span class="ruby-keyword">end</span>
339
+
340
+ <span class="ruby-constant">Debug</span>.<span class="ruby-identifier">msg</span>(<span class="ruby-node">&quot;In module monitor_before #{meth_name}&quot;</span>)
341
+
342
+ <span class="ruby-identifier">meth_type</span> = <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>]
343
+
344
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">meth_type</span>
345
+ <span class="ruby-comment"># This means the method type has been created previously.</span>
346
+ <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">&amp;&amp;</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">&amp;&amp;</span>
347
+ (<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">&quot;Block usage is inconsistent&quot;</span>)
349
+ <span class="ruby-keyword">end</span>
350
+ <span class="ruby-keyword">else</span>
351
+ <span class="ruby-comment"># No method type has been created for this method yet. Create a</span>
352
+ <span class="ruby-comment"># blank method type (where each argument type, block type, and</span>
353
+ <span class="ruby-comment"># return type are all nil).</span>
354
+ <span class="ruby-comment">#</span>
355
+ <span class="ruby-comment"># First, use the orignal method's arity to find out # of</span>
356
+ <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">MonitorUtils</span>.<span class="ruby-identifier">get_alt_meth_name</span>(<span class="ruby-identifier">meth_name</span>))
358
+ <span class="ruby-identifier">arity</span> = <span class="ruby-identifier">meth_obj</span>.<span class="ruby-identifier">arity</span>
359
+ <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
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">blk</span>
361
+ <span class="ruby-comment"># Do the same for the block too if there is one</span>
362
+ <span class="ruby-identifier">blk_arity</span> = <span class="ruby-identifier">blk</span>.<span class="ruby-identifier">arity</span>
363
+ <span class="ruby-identifier">blk_arg_types</span> = [<span class="ruby-keyword">nil</span>] * <span class="ruby-identifier">blk_artiy</span>.<span class="ruby-identifier">abs</span>
364
+ <span class="ruby-identifier">blk_type</span> = <span class="ruby-constant">BlockType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">blk_arg_types</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>)
365
+ <span class="ruby-keyword">else</span>
366
+ <span class="ruby-identifier">blk_type</span> = <span class="ruby-keyword">nil</span>
367
+ <span class="ruby-keyword">end</span>
368
+ <span class="ruby-identifier">meth_type</span> = <span class="ruby-constant">MethodType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">meth_name</span>, <span class="ruby-identifier">arg_types</span>, <span class="ruby-identifier">blk_type</span>, <span class="ruby-keyword">nil</span>)
369
+ <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>] = <span class="ruby-identifier">meth_type</span>
370
+ <span class="ruby-keyword">end</span>
371
+
372
+ <span class="ruby-identifier">meth_info</span>.<span class="ruby-identifier">args</span> = <span class="ruby-identifier">args</span>
373
+
374
+ <span class="ruby-keyword">end</span></pre>
375
+ </div><!-- before_method-source -->
376
+
377
+ </div>
378
+
379
+
380
+
381
+
382
+ </div><!-- before_method-method -->
383
+
384
+
385
+ </section><!-- public-instance-method-details -->
386
+
387
+ <section id="protected-instance-5Buntitled-5D-method-details" class="method-section section">
388
+ <h3 class="section-header">Protected Instance Methods</h3>
389
+
390
+
391
+ <div id="method-i-is_object_wrapped-3F" class="method-detail ">
392
+
393
+ <div class="method-heading">
394
+ <span class="method-name">is_object_wrapped?</span><span
395
+ class="method-args">(obj)</span>
396
+ <span class="method-click-advice">click to toggle source</span>
397
+ </div>
398
+
399
+
400
+ <div class="method-description">
401
+
402
+ <p>Check if the object is wrapped by a monitor</p>
403
+
404
+
405
+
406
+ <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 29</span>
408
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">is_object_wrapped?</span>(<span class="ruby-identifier">obj</span>)
409
+ <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
+ <span class="ruby-keyword">end</span></pre>
411
+ </div><!-- is_object_wrapped-3F-source -->
412
+
413
+ </div>
414
+
415
+
416
+
417
+
418
+ </div><!-- is_object_wrapped-3F-method -->
419
+
420
+
421
+ <div id="method-i-lub" class="method-detail ">
422
+
423
+ <div class="method-heading">
424
+ <span class="method-name">lub</span><span
425
+ class="method-args">(obj, meth_type_map, meth_name, retval, *args, &blk)</span>
426
+ <span class="method-click-advice">click to toggle source</span>
427
+ </div>
428
+
429
+
430
+ <div class="method-description">
431
+
432
+ <p>This method computes the least upper bound of the existing method type and
433
+ newly observed argument/block/return types. There are a few cases to
434
+ consider:</p>
435
+
436
+ <p>If the existing type is a method list type, the new observed type will be
437
+ either “consolidated” into one of the method types in the list or added to
438
+ the list.</p>
439
+
440
+ <p>If there is no compatibility between the existing method type and the
441
+ observed type, then the method type will be promoted to a method list type.
442
+ And the newly observed type will be added to the list.</p>
443
+
444
+ <p>For each method type,</p>
445
+
446
+ <p>It basically consolidates the existing type information for the invoked
447
+ method and the observed type.</p>
448
+
449
+ <p>For arguments, we look for most general type that can handle all types we
450
+ have seen. This means we find the super type of all types we have seen
451
+ (excluding unknown types).</p>
452
+
453
+ <p>For return, we look for most specific type that can handle both types.
454
+ Therefore, if two types have no subtype relation, we AND them. But we do
455
+ not allow AND types in the return type. We must turn the method type to a
456
+ method list type.</p>
457
+ <dl class="rdoc-list note-list"><dt>obj
458
+ <dd>
459
+ <p>the receive of the method call</p>
460
+ </dd><dt>meth_type_map
461
+ <dd>
462
+ <p>a hash object that maps method names to method types</p>
463
+ </dd><dt>meth_name
464
+ <dd>
465
+ <p>the name of the method being invoked</p>
466
+ </dd><dt>retval
467
+ <dd>
468
+ <p>the return value of the original method call</p>
469
+ </dd><dt>args
470
+ <dd>
471
+ <p>the arguments</p>
472
+ </dd><dt>blk
473
+ <dd>
474
+ <p>the block argument</p>
475
+ </dd></dl>
476
+
477
+
478
+
479
+ <div class="method-source-code" id="lub-source">
480
+ <pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 114</span>
481
+ <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>, &amp;<span class="ruby-identifier">blk</span>)
482
+
483
+ <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
+
485
+ <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">MonitorUtils</span>.<span class="ruby-identifier">get_alt_meth_name</span>(<span class="ruby-identifier">meth_name</span>))
487
+ <span class="ruby-identifier">arity</span> = <span class="ruby-identifier">meth_obj</span>.<span class="ruby-identifier">arity</span>
488
+
489
+ <span class="ruby-comment"># Construct the newly observed method type first</span>
490
+ <span class="ruby-identifier">new_meth_type</span> = <span class="ruby-constant">MethodType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">meth_name</span>,[])
491
+ <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">idx</span><span class="ruby-operator">|</span>
492
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">is_object_wrapped?</span>(<span class="ruby-identifier">arg</span>)
493
+ <span class="ruby-identifier">arg_type</span> = <span class="ruby-identifier">arg</span>.<span class="ruby-identifier">__rubybreaker_type</span>
494
+ <span class="ruby-keyword">else</span>
495
+ <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>)
496
+ <span class="ruby-keyword">end</span>
497
+ <span class="ruby-comment"># Check if the last argument should be a variable length argument</span>
498
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">arity</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">idx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">arity</span>.<span class="ruby-identifier">abs</span>)
499
+ <span class="ruby-identifier">new_meth_type</span>.<span class="ruby-identifier">arg_types</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">VarLengthType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">arg_type</span>)
500
+ <span class="ruby-keyword">break</span>
501
+ <span class="ruby-keyword">end</span>
502
+ <span class="ruby-identifier">new_meth_type</span>.<span class="ruby-identifier">arg_types</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">arg_type</span>
503
+ <span class="ruby-keyword">end</span>
504
+
505
+ <span class="ruby-keyword">if</span> (<span class="ruby-identifier">obj</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">retval</span>)
506
+ <span class="ruby-comment"># the return value is same as the message receiver. This means the</span>
507
+ <span class="ruby-comment"># return value has the self type.</span>
508
+ <span class="ruby-constant">SelfType</span>.<span class="ruby-identifier">set_self</span>(<span class="ruby-identifier">obj</span>.<span class="ruby-identifier">class</span>)
509
+ <span class="ruby-identifier">ret_type</span> = <span class="ruby-constant">SelfType</span>.<span class="ruby-identifier">new</span>()
510
+ <span class="ruby-keyword">else</span>
511
+ <span class="ruby-comment"># Otherwise, construct a nominal type.</span>
512
+ <span class="ruby-identifier">ret_type</span> = <span class="ruby-constant">NominalType</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">retval</span>.<span class="ruby-identifier">class</span>)
513
+ <span class="ruby-keyword">end</span>
514
+ <span class="ruby-identifier">new_meth_type</span>.<span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">ret_type</span>
515
+
516
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">false</span>
517
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">instance_of?</span>(<span class="ruby-constant">MethodListType</span>)
518
+ <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">types</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">meth_type</span><span class="ruby-operator">|</span>
519
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-identifier">lub_helper</span>(<span class="ruby-identifier">meth_type</span>, <span class="ruby-identifier">new_meth_type</span>)
520
+ <span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">resolved</span>
521
+ }
522
+ <span class="ruby-keyword">else</span>
523
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-identifier">lub_helper</span>(<span class="ruby-identifier">exist_meth_type</span>, <span class="ruby-identifier">new_meth_type</span>)
524
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resolved</span>
525
+ <span class="ruby-comment"># Could not resolve the types, so promote the method type to a</span>
526
+ <span class="ruby-comment"># method list type</span>
527
+ <span class="ruby-identifier">exist_meth_type</span> = <span class="ruby-constant">MethodListType</span>.<span class="ruby-identifier">new</span>([<span class="ruby-identifier">exist_meth_type</span>])
528
+ <span class="ruby-identifier">meth_type_map</span>[<span class="ruby-identifier">meth_name</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">exist_meth_type</span>
529
+ <span class="ruby-keyword">end</span>
530
+ <span class="ruby-keyword">end</span>
531
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resolved</span>
532
+ <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">types</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">new_meth_type</span>
533
+ <span class="ruby-keyword">end</span>
534
+ <span class="ruby-keyword">end</span></pre>
535
+ </div><!-- lub-source -->
536
+
537
+ </div>
538
+
539
+
540
+
541
+
542
+ </div><!-- lub-method -->
543
+
544
+
545
+ <div id="method-i-lub_helper" class="method-detail ">
546
+
547
+ <div class="method-heading">
548
+ <span class="method-name">lub_helper</span><span
549
+ class="method-args">(exist_meth_type, new_meth_type)</span>
550
+ <span class="method-click-advice">click to toggle source</span>
551
+ </div>
552
+
553
+
554
+ <div class="method-description">
555
+
556
+ <p>This method is a helper for computing the least upper bound. It handles the
557
+ case where existing method type is a method type (and not a method list
558
+ type). If there is no compatibility of the two types, then it returns
559
+ false.</p>
560
+
561
+
562
+
563
+ <div class="method-source-code" id="lub_helper-source">
564
+ <pre><span class="ruby-comment"># File lib/rubybreaker/runtime/type_system.rb, line 37</span>
565
+ <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
+
567
+ <span class="ruby-comment"># most restrictive for the given test cases. </span>
568
+ <span class="ruby-identifier">arg_types</span> = []
569
+
570
+ <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>
571
+ <span class="ruby-identifier">arg_type</span> = <span class="ruby-keyword">nil</span>
572
+ <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>]
573
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">exist_arg_type</span>
574
+ <span class="ruby-comment"># nil means there hasn't been any type observed</span>
575
+ <span class="ruby-identifier">arg_type</span> = <span class="ruby-identifier">new_arg_type</span>
576
+ <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>)
577
+ <span class="ruby-identifier">arg_type</span> = <span class="ruby-identifier">exist_arg_type</span>
578
+ <span class="ruby-keyword">elsif</span> <span class="ruby-operator">!</span><span class="ruby-identifier">exist_arg_type</span>.<span class="ruby-identifier">subtype_of?</span>(<span class="ruby-identifier">new_arg_type</span>)
579
+ <span class="ruby-comment"># No subtype relation between them, so OR them</span>
580
+ <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>])
581
+ <span class="ruby-keyword">end</span>
582
+ <span class="ruby-identifier">arg_types</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">arg_type</span>
583
+ <span class="ruby-keyword">end</span>
584
+
585
+ <span class="ruby-identifier">new_ret_type</span> = <span class="ruby-identifier">new_meth_type</span>.<span class="ruby-identifier">ret_type</span>
586
+ <span class="ruby-identifier">exist_ret_type</span> = <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">ret_type</span>
587
+
588
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">exist_ret_type</span>
589
+ <span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">new_ret_type</span>
590
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">true</span>
591
+ <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>)
592
+ <span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">exist_ret_type</span>
593
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">true</span>
594
+ <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>)
595
+ <span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">new_ret_type</span>
596
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">true</span>
597
+ <span class="ruby-keyword">else</span>
598
+ <span class="ruby-identifier">resolved</span> = <span class="ruby-keyword">false</span>
599
+ <span class="ruby-keyword">end</span>
600
+
601
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">resolved</span>
602
+ <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">arg_types</span> = <span class="ruby-identifier">arg_types</span>
603
+ <span class="ruby-identifier">exist_meth_type</span>.<span class="ruby-identifier">ret_type</span> = <span class="ruby-identifier">ret_type</span>
604
+ <span class="ruby-keyword">end</span>
605
+
606
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">resolved</span>
607
+ <span class="ruby-keyword">end</span></pre>
608
+ </div><!-- lub_helper-source -->
609
+
610
+ </div>
611
+
612
+
613
+
614
+
615
+ </div><!-- lub_helper-method -->
616
+
617
+
618
+ </section><!-- protected-instance-method-details -->
619
+
620
+ </section><!-- 5Buntitled-5D -->
621
+
622
+ </div><!-- documentation -->
623
+
624
+
625
+ <footer id="validator-badges">
626
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
627
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
628
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
629
+ </footer>
630
+