mirah 0.0.7-java → 0.0.8-java

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 (182) hide show
  1. data/History.txt +181 -0
  2. data/README.txt +6 -10
  3. data/Rakefile +86 -9
  4. data/bin/mirah +2 -0
  5. data/bin/mirahc +2 -0
  6. data/bin/mirahp +2 -0
  7. data/{bin/dubyp → examples/interfaces.mirah} +16 -9
  8. data/examples/macros/square.mirah +12 -0
  9. data/examples/macros/square_int.mirah +12 -0
  10. data/examples/macros/string-each-char.mirah +14 -0
  11. data/examples/maven/README.txt +2 -0
  12. data/examples/maven/pom.xml +23 -0
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +9 -0
  14. data/examples/rosettacode/100-doors.mirah +44 -0
  15. data/examples/rosettacode/99-bottles-of-beer.mirah +13 -0
  16. data/examples/rosettacode/README.txt +9 -0
  17. data/examples/rosettacode/boolean-values.mirah +29 -0
  18. data/examples/rosettacode/comments.mirah +2 -0
  19. data/examples/rosettacode/copy-a-string.mirah +10 -0
  20. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +40 -0
  21. data/examples/rosettacode/create-a-file.mirah +6 -0
  22. data/examples/rosettacode/empty-string.mirah +9 -0
  23. data/examples/rosettacode/factorial.mirah +10 -0
  24. data/examples/rosettacode/fibonacci.mirah +21 -0
  25. data/examples/rosettacode/file-size.mirah +5 -0
  26. data/examples/rosettacode/fizz-buzz.mirah +21 -0
  27. data/examples/rosettacode/flatten-a-list.mirah +24 -0
  28. data/examples/rosettacode/guess-the-number.mirah +21 -0
  29. data/examples/rosettacode/is-string-numeric.mirah +127 -0
  30. data/examples/rosettacode/palindrome.mirah +14 -0
  31. data/examples/rosettacode/repeat-a-string.mirah +9 -0
  32. data/examples/rosettacode/reverse-a-string.mirah +6 -0
  33. data/examples/rosettacode/rot-13.mirah +20 -0
  34. data/examples/rosettacode/user-input.mirah +4 -0
  35. data/examples/sort_closure.mirah +1 -1
  36. data/javalib/dynalink-0.2.jar +0 -0
  37. data/javalib/mirah-bootstrap.jar +0 -0
  38. data/lib/mirah.rb +7 -16
  39. data/lib/mirah/ast.rb +22 -92
  40. data/lib/mirah/ast/call.rb +41 -9
  41. data/lib/mirah/ast/class.rb +34 -6
  42. data/lib/mirah/ast/flow.rb +17 -5
  43. data/lib/mirah/ast/intrinsics.rb +50 -8
  44. data/lib/mirah/ast/literal.rb +7 -0
  45. data/lib/mirah/ast/local.rb +9 -1
  46. data/lib/mirah/ast/method.rb +21 -8
  47. data/lib/mirah/ast/scope.rb +1 -1
  48. data/lib/mirah/ast/structure.rb +81 -15
  49. data/lib/mirah/ast/type.rb +4 -0
  50. data/{bin/dubyc → lib/mirah/commands.rb} +4 -11
  51. data/lib/mirah/commands/base.rb +54 -0
  52. data/lib/mirah/commands/compile.rb +39 -0
  53. data/{examples/wiki/Rakefile → lib/mirah/commands/parse.rb} +18 -17
  54. data/lib/mirah/commands/run.rb +73 -0
  55. data/lib/mirah/compiler.rb +37 -417
  56. data/lib/mirah/compiler/call.rb +45 -0
  57. data/lib/mirah/compiler/class.rb +81 -0
  58. data/lib/mirah/compiler/flow.rb +109 -0
  59. data/lib/mirah/compiler/literal.rb +130 -0
  60. data/lib/mirah/compiler/local.rb +59 -0
  61. data/lib/mirah/compiler/method.rb +44 -0
  62. data/lib/mirah/compiler/structure.rb +65 -0
  63. data/lib/mirah/compiler/type.rb +27 -0
  64. data/lib/mirah/env.rb +4 -6
  65. data/lib/mirah/generator.rb +61 -0
  66. data/lib/mirah/jvm/compiler.rb +8 -867
  67. data/lib/mirah/jvm/compiler/base.rb +270 -0
  68. data/lib/mirah/jvm/compiler/java_source.rb +779 -0
  69. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +851 -0
  70. data/lib/mirah/jvm/method_lookup.rb +21 -2
  71. data/lib/mirah/jvm/source_generator/builder.rb +10 -13
  72. data/lib/mirah/jvm/source_generator/loops.rb +99 -93
  73. data/lib/mirah/jvm/source_generator/precompile.rb +3 -2
  74. data/lib/mirah/jvm/typer.rb +3 -3
  75. data/lib/mirah/jvm/types.rb +10 -426
  76. data/lib/mirah/jvm/types/array_type.rb +62 -0
  77. data/lib/mirah/jvm/types/basic_types.rb +1 -0
  78. data/lib/mirah/jvm/types/dynamic_type.rb +46 -0
  79. data/lib/mirah/jvm/types/factory.rb +23 -5
  80. data/lib/mirah/jvm/types/interface_definition.rb +20 -0
  81. data/lib/mirah/jvm/types/intrinsics.rb +15 -3
  82. data/lib/mirah/jvm/types/meta_type.rb +45 -0
  83. data/lib/mirah/jvm/types/methods.rb +12 -5
  84. data/lib/mirah/jvm/types/null_type.rb +27 -0
  85. data/lib/mirah/jvm/types/primitive_type.rb +38 -0
  86. data/lib/mirah/jvm/types/source_mirror.rb +266 -0
  87. data/lib/mirah/jvm/types/type.rb +173 -0
  88. data/lib/mirah/jvm/types/type_definition.rb +55 -0
  89. data/lib/mirah/jvm/types/unreachable_type.rb +27 -0
  90. data/lib/mirah/jvm/types/void_type.rb +19 -0
  91. data/lib/mirah/parser.rb +90 -0
  92. data/lib/mirah/plugin/gwt.rb +5 -5
  93. data/lib/mirah/plugin/java.rb +1 -1
  94. data/lib/mirah/transform.rb +4 -321
  95. data/lib/mirah/transform/ast_ext.rb +63 -0
  96. data/lib/mirah/transform/error.rb +13 -0
  97. data/lib/mirah/transform/helper.rb +761 -0
  98. data/lib/mirah/transform/transformer.rb +255 -0
  99. data/lib/mirah/typer.rb +2 -383
  100. data/{bin/duby → lib/mirah/typer/base.rb} +12 -10
  101. data/lib/mirah/typer/simple.rb +377 -0
  102. data/lib/mirah/util/argument_processor.rb +114 -0
  103. data/lib/mirah/util/class_loader.rb +37 -0
  104. data/lib/mirah/util/compilation_state.rb +51 -0
  105. data/lib/mirah/util/process_errors.rb +33 -0
  106. data/lib/mirah/version.rb +1 -1
  107. data/lib/mirah_task.rb +3 -2
  108. data/test/{test_ast.rb → core/test_ast.rb} +6 -0
  109. data/test/{test_compilation.rb → core/test_compilation.rb} +0 -0
  110. data/test/{test_env.rb → core/test_env.rb} +24 -25
  111. data/test/{test_macros.rb → core/test_macros.rb} +2 -4
  112. data/test/{test_typer.rb → core/test_typer.rb} +0 -3
  113. data/test/jvm/bytecode_test_helper.rb +181 -0
  114. data/test/{test_javac_compiler.rb → jvm/javac_test_helper.rb} +38 -22
  115. data/test/jvm/test_enumerable.rb +304 -0
  116. data/test/{test_java_typer.rb → jvm/test_java_typer.rb} +2 -4
  117. data/test/{test_jvm_compiler.rb → jvm/test_jvm_compiler.rb} +146 -443
  118. data/test/jvm/test_macros.rb +147 -0
  119. data/test/jvm/test_main_method.rb +15 -0
  120. data/test/{test_gwt.rb → plugins/test_gwt.rb} +0 -2
  121. metadata +103 -91
  122. data/bin/jrubyp +0 -52
  123. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +0 -339
  124. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +0 -42
  125. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +0 -2
  126. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +0 -69
  127. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +0 -7
  128. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +0 -15
  129. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  130. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  131. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  132. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  133. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  134. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  135. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  136. data/examples/wiki/war/app.yaml +0 -21
  137. data/examples/wiki/war/public/favicon.ico +0 -0
  138. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  139. data/examples/wiki/war/public/images/back.gif +0 -0
  140. data/examples/wiki/war/public/images/dir.gif +0 -0
  141. data/examples/wiki/war/public/images/file.gif +0 -0
  142. data/examples/wiki/war/public/javascripts/prettify.js +0 -61
  143. data/examples/wiki/war/public/robots.txt +0 -0
  144. data/examples/wiki/war/public/stylesheets/main.css +0 -156
  145. data/examples/wiki/war/public/stylesheets/prettify.css +0 -1
  146. data/examples/wiki/war/public/stylesheets/sh_style.css +0 -66
  147. data/examples/wiki/war/public/stylesheets/source.css +0 -21
  148. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  149. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  150. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  151. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  152. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  153. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  154. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  155. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  156. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  157. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  158. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  159. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  160. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  161. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  162. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  163. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  164. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  165. data/examples/wiki/war/public/wmd/showdown.js +0 -421
  166. data/examples/wiki/war/public/wmd/wmd-base.js +0 -1799
  167. data/examples/wiki/war/public/wmd/wmd-plus.js +0 -311
  168. data/examples/wiki/war/public/wmd/wmd.js +0 -73
  169. data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +0 -339
  170. data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +0 -42
  171. data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +0 -2
  172. data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +0 -69
  173. data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +0 -7
  174. data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +0 -15
  175. data/javalib/dynalink-0.1.jar +0 -0
  176. data/javalib/jsr292-mock.jar +0 -0
  177. data/lib/mirah/class_loader.rb +0 -35
  178. data/lib/mirah/compilation_state.rb +0 -28
  179. data/lib/mirah/impl.rb +0 -273
  180. data/lib/mirah/jvm/base.rb +0 -267
  181. data/lib/mirah/jvm/source_compiler.rb +0 -760
  182. data/lib/mirah/transform2.rb +0 -752
@@ -53,6 +53,7 @@ module Mirah
53
53
  end
54
54
 
55
55
  def find_jls(mapped_type, name, mapped_params, meta, constructor)
56
+ interfaces = []
56
57
  if constructor
57
58
  by_name = mapped_type.unmeta.declared_constructors
58
59
  elsif meta
@@ -61,9 +62,22 @@ module Mirah
61
62
  by_name = []
62
63
  cls = mapped_type
63
64
  while cls
64
- by_name += cls.declared_instance_methods(name)
65
+ if cls.full_name != 'error'
66
+ by_name += cls.declared_instance_methods(name)
67
+ interfaces.concat(cls.interfaces)
68
+ end
65
69
  cls = cls.superclass
66
70
  end
71
+ if mapped_type.interface? # TODO or abstract
72
+ seen = {}
73
+ until interfaces.empty?
74
+ interface = interfaces.pop
75
+ next if seen[interface]
76
+ seen[interface] = true
77
+ interfaces.concat(interface.interfaces)
78
+ by_name += interface.declared_instance_methods(name)
79
+ end
80
+ end
67
81
  end
68
82
  # filter by arity
69
83
  by_name_and_arity = by_name.select {|m| m.argument_types.size == mapped_params.size}
@@ -205,7 +219,12 @@ module Mirah
205
219
  end
206
220
 
207
221
  # object type is assignable
208
- return false unless target_type.assignable_from? in_type
222
+ compatible = if target_type.respond_to?(:compatible?)
223
+ target_type.compatible? in_type
224
+ else
225
+ target_type.assignable_from? in_type
226
+ end
227
+ return false unless compatible
209
228
  end
210
229
  return true
211
230
  end
@@ -151,27 +151,23 @@ module Mirah
151
151
 
152
152
  def annotate(annotations)
153
153
  annotations.each do |annotation|
154
- print "@#{annotation.name.gsub("$", ".")}("
155
- first = true
156
- annotation.values.each do |name, value|
157
- print ", " unless first
158
- first = false
159
- print "#{name}="
160
- print annotation_value(value)
161
- end
162
- puts ")"
154
+ puts annotation_value(annotation)
163
155
  end
164
156
  end
165
157
 
166
158
  def annotation_value(value)
167
159
  case value
168
- when Java::JavaLang::String
160
+ when Java::JavaLang::String, String
169
161
  value.to_s.inspect
170
162
  when Array
171
163
  values = value.map{|x|annotation_value(x)}.join(", ")
172
164
  "{#{values}}"
173
165
  when BiteScript::ASM::Type
174
166
  value.getClassName.gsub("$", ".")
167
+ when Mirah::AST::Annotation
168
+ name = value.name.gsub("$", ".")
169
+ values = value.values.map {|n, v| "#{n}=#{annotation_value(v)}"}
170
+ "@#{name}(#{values.join ', '})"
175
171
  else
176
172
  raise "Unsupported annotation value #{value.inspect}"
177
173
  end
@@ -180,7 +176,7 @@ module Mirah
180
176
 
181
177
  class ClassBuilder
182
178
  include Helper
183
- include Mirah::Compiler::JVM::JVMLogger
179
+ include Mirah::JVM::Compiler::JVMBytecode::JVMLogger
184
180
  attr_reader :package, :name, :superclass, :filename, :class_name, :out
185
181
  attr_reader :interfaces, :abstract
186
182
  def initialize(builder, name, superclass, interfaces, abstract)
@@ -231,8 +227,8 @@ module Mirah
231
227
  end
232
228
 
233
229
  def finish_declaration
234
- raise if @stopped
235
230
  return if @declaration_finished
231
+ raise "Already stopped class #{class_name}" if @stopped
236
232
 
237
233
  @declaration_finished = true
238
234
  modifiers = "public#{' static' if @static}#{' abstract' if @abstract}"
@@ -345,10 +341,11 @@ module Mirah
345
341
  class MethodBuilder
346
342
  include Helper
347
343
 
348
- attr_accessor :name, :type, :out
344
+ attr_accessor :name, :type, :out, :klass
349
345
 
350
346
  def initialize(cls, options)
351
347
  @class = cls
348
+ @klass = cls
352
349
  @compiler = cls.compiler
353
350
  @out = Output.new
354
351
  @visibility = options[:visibility]
@@ -13,111 +13,117 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- class Mirah::Compiler::JavaSource < Mirah::Compiler::JVMCompilerBase
17
- class SimpleWhileLoop
18
- attr_reader :compiler, :loop
19
- def initialize(loop, compiler)
20
- @loop = loop
21
- @compiler = compiler
22
- end
16
+ module Mirah
17
+ module JVM
18
+ module Compiler
19
+ class JavaSource < Base
20
+ class SimpleWhileLoop
21
+ attr_reader :compiler, :loop
22
+ def initialize(loop, compiler)
23
+ @loop = loop
24
+ @compiler = compiler
25
+ end
23
26
 
24
- def break
25
- compiler.method.puts "break;"
26
- end
27
+ def break
28
+ compiler.method.puts "break;"
29
+ end
27
30
 
28
- def next
29
- compiler.method.puts "continue;"
30
- end
31
+ def next
32
+ compiler.method.puts "continue;"
33
+ end
31
34
 
32
- def redo
33
- raise "#{self.class.name} doesn't support redo"
34
- end
35
+ def redo
36
+ raise "#{self.class.name} doesn't support redo"
37
+ end
35
38
 
36
- def compile(expression)
37
- prepare
38
- @loop.init.compile(compiler, false) if @loop.init?
39
- @start.call
40
- compiler.method.block do
41
- @loop.pre.compile(compiler, false) if @loop.pre?
42
- compile_body
43
- @loop.post.compile(compiler, false) if @loop.post?
44
- end
45
- if @end_check
46
- @end_check.call
47
- compiler.method.puts ';'
48
- end
49
- if expression
50
- compiler.method.puts "#{compiler.lvalue}null;"
51
- end
52
- end
39
+ def compile(expression)
40
+ prepare
41
+ @loop.init.compile(compiler, false) if @loop.init?
42
+ @start.call
43
+ compiler.method.block do
44
+ @loop.pre.compile(compiler, false) if @loop.pre?
45
+ compile_body
46
+ @loop.post.compile(compiler, false) if @loop.post?
47
+ end
48
+ if @end_check
49
+ @end_check.call
50
+ compiler.method.puts ';'
51
+ end
52
+ if expression
53
+ compiler.method.puts "#{compiler.lvalue}null;"
54
+ end
55
+ end
53
56
 
54
- def compile_body
55
- loop.body.compile(compiler, false) if loop.body
56
- end
57
+ def compile_body
58
+ loop.body.compile(compiler, false) if loop.body
59
+ end
57
60
 
58
- def prepare
59
- predicate = loop.condition.predicate.precompile(compiler)
60
- negative = loop.negative ? '!' : ''
61
- check = lambda do
62
- compiler.method.print "while (#{negative}"
63
- predicate.compile(compiler, true)
64
- compiler.method.print ')'
65
- end
66
- if loop.check_first
67
- @start = check
68
- else
69
- @start = lambda {compiler.method.print 'do'}
70
- @end_check = check
71
- end
72
- end
73
- end
61
+ def prepare
62
+ predicate = loop.condition.predicate.precompile(compiler)
63
+ negative = loop.negative ? '!' : ''
64
+ check = lambda do
65
+ compiler.method.print "while (#{negative}"
66
+ predicate.compile(compiler, true)
67
+ compiler.method.print ')'
68
+ end
69
+ if loop.check_first
70
+ @start = check
71
+ else
72
+ @start = lambda {compiler.method.print 'do'}
73
+ @end_check = check
74
+ end
75
+ end
76
+ end
74
77
 
75
- module Redoable
76
- def compile_with_redo(block)
77
- @redo = compiler.method.tmp(JVMTypes::Boolean)
78
- compiler.method.puts "#{@inner}:"
79
- compiler.method.block "do" do
80
- compiler.method.puts "#{@redo} = false;"
81
- block.compile(compiler, false) if block
82
- end
83
- compiler.method.puts "while (#{@redo});"
84
- end
78
+ module Redoable
79
+ def compile_with_redo(block)
80
+ @redo = compiler.method.tmp(JVMTypes::Boolean)
81
+ compiler.method.puts "#{@inner}:"
82
+ compiler.method.block "do" do
83
+ compiler.method.puts "#{@redo} = false;"
84
+ block.compile(compiler, false) if block
85
+ end
86
+ compiler.method.puts "while (#{@redo});"
87
+ end
85
88
 
86
- def break
87
- compiler.method.puts "break #{@outer};"
88
- end
89
+ def break
90
+ compiler.method.puts "break #{@outer};"
91
+ end
89
92
 
90
- def next
91
- compiler.method.puts "break #{@inner};"
92
- end
93
+ def next
94
+ compiler.method.puts "break #{@inner};"
95
+ end
93
96
 
94
- def redo
95
- compiler.method.puts "#{@redo} = true;"
96
- compiler.method.puts "continue #{@inner};"
97
- end
98
- end
97
+ def redo
98
+ compiler.method.puts "#{@redo} = true;"
99
+ compiler.method.puts "continue #{@inner};"
100
+ end
101
+ end
99
102
 
100
- class ComplexWhileLoop < SimpleWhileLoop
101
- include Redoable
102
- def prepare
103
- super
104
- @outer = compiler.method.label
105
- @inner = compiler.method.label
106
- @complex_predicate = !loop.condition.predicate.expr?(compiler)
107
- super_start = @start
108
- @start = lambda do
109
- compiler.method.puts "#{@outer}:"
110
- super_start.call
111
- end
112
- end
103
+ class ComplexWhileLoop < SimpleWhileLoop
104
+ include Redoable
105
+ def prepare
106
+ super
107
+ @outer = compiler.method.label
108
+ @inner = compiler.method.label
109
+ @complex_predicate = !loop.condition.predicate.expr?(compiler)
110
+ super_start = @start
111
+ @start = lambda do
112
+ compiler.method.puts "#{@outer}:"
113
+ super_start.call
114
+ end
115
+ end
113
116
 
114
- def compile_body
115
- if @loop.redo?
116
- compile_with_redo(@loop.body)
117
- else
118
- compiler.method.puts "#{@inner}:"
119
- compiler.method.block do
120
- loop.body.compile(compiler, false) if loop.body
117
+ def compile_body
118
+ if @loop.redo?
119
+ compile_with_redo(@loop.body)
120
+ else
121
+ compiler.method.puts "#{@inner}:"
122
+ compiler.method.block do
123
+ loop.body.compile(compiler, false) if loop.body
124
+ end
125
+ end
126
+ end
121
127
  end
122
128
  end
123
129
  end
@@ -92,8 +92,9 @@ module Mirah::AST
92
92
  def expr?(compiler)
93
93
  target.expr?(compiler) &&
94
94
  parameters.all? {|p| p.expr?(compiler)} &&
95
- !method.return_type.kind_of?(Mirah::AST::InlineCode) &&
96
- !method.return_type.void?
95
+ cast || (
96
+ !method.return_type.kind_of?(Mirah::AST::InlineCode) &&
97
+ !method.return_type.void?)
97
98
  end
98
99
 
99
100
  def precompile_target(compiler)
@@ -18,8 +18,8 @@ require 'mirah/jvm/types'
18
18
  require 'mirah/jvm/types/factory'
19
19
 
20
20
  module Mirah
21
- module Typer
22
- class JVM < Simple
21
+ module JVM
22
+ class Typer < Mirah::Typer::Simple
23
23
  include Mirah::JVM::Types
24
24
 
25
25
  attr_reader :transformer
@@ -36,7 +36,7 @@ module Mirah
36
36
  end
37
37
 
38
38
  def set_filename(scope, filename)
39
- classname = Mirah::Compiler::JVM.classname_from_filename(filename)
39
+ classname = Mirah::JVM::Compiler::JVMBytecode.classname_from_filename(filename)
40
40
  main_class = @factory.declare_type(scope, classname)
41
41
  @known_types['self'] = main_class.meta
42
42
  end
@@ -18,432 +18,16 @@ require 'mirah/ast'
18
18
  require 'mirah/jvm/method_lookup'
19
19
  require 'mirah/jvm/compiler'
20
20
  require 'set'
21
-
22
- module Mirah
23
- module JVM
24
- module Types
25
- class Type < AST::TypeReference
26
- include Java::DubyLangCompiler::Class
27
- include Mirah::JVM::MethodLookup
28
-
29
- attr_writer :inner_class
30
-
31
- def log(message)
32
- puts "* [JVM::Types] #{message}" if Mirah::Compiler::JVM.verbose
33
- end
34
-
35
- def initialize(mirror_or_name)
36
- if mirror_or_name.kind_of?(BiteScript::ASM::ClassMirror)
37
- @type = mirror_or_name
38
- name = mirror_or_name.type.class_name
39
- else
40
- name = mirror_or_name.to_s
41
- end
42
- super(name, false, false)
43
- raise ArgumentError, "Bad type #{mirror_or_name}" if name =~ /Java::/
44
- end
45
-
46
- def full_name
47
- desc = BiteScript::Signature.class_id(self)
48
- BiteScript::ASM::Type.get_type(desc).class_name
49
- end
50
-
51
- def jvm_type
52
- @type
53
- end
54
-
55
- def void?
56
- false
57
- end
58
-
59
- def meta?
60
- false
61
- end
62
-
63
- def array?
64
- false
65
- end
66
-
67
- def primitive?
68
- false
69
- end
70
-
71
- def interface?
72
- @type.interface?
73
- end
74
-
75
- def dynamic?
76
- false
77
- end
78
-
79
- def inner_class?
80
- @inner_class
81
- end
82
-
83
- def is_parent(other)
84
- assignable_from?(other)
85
- end
86
-
87
- def compatible?(other)
88
- assignable_from?(other)
89
- end
90
-
91
- def assignable_from?(other)
92
- return false if other.nil?
93
- return true if !primitive? && other == Null
94
- return true if other == self
95
- return true if other.error? || other.unreachable?
96
-
97
- # TODO should we allow more here?
98
- return interface? if other.block?
99
-
100
- return true if jvm_type && (jvm_type == other.jvm_type)
101
-
102
- assignable_from?(other.superclass) ||
103
- other.interfaces.any? {|i| assignable_from?(i)}
104
- end
105
-
106
- def iterable?
107
- ['java.lang.Iterable',
108
- 'java.util.Iterator',
109
- 'java.util.Enumeration'].any? {|n| AST.type(nil, n).assignable_from(self)}
110
- end
111
-
112
- def component_type
113
- AST.type(nil, 'java.lang.Object') if iterable?
114
- end
115
-
116
- def meta
117
- @meta ||= MetaType.new(self)
118
- end
119
-
120
- def unmeta
121
- self
122
- end
123
-
124
- def basic_type
125
- self
126
- end
127
-
128
- def array_type
129
- @array_type ||= Mirah::JVM::Types::ArrayType.new(self)
130
- end
131
-
132
- def prefix
133
- 'a'
134
- end
135
-
136
- # is this a 64 bit type?
137
- def wide?
138
- false
139
- end
140
-
141
- def inspect(indent=0)
142
- "#{' ' * indent}#<#{self.class.name} #{name}>"
143
- end
144
-
145
- def newarray(method)
146
- method.anewarray(self)
147
- end
148
-
149
- def pop(method)
150
- if wide?
151
- method.pop2
152
- else
153
- method.pop
154
- end
155
- end
156
-
157
- def superclass
158
- raise "Incomplete type #{self}" unless jvm_type
159
- AST.type(nil, jvm_type.superclass) if jvm_type.superclass
160
- end
161
-
162
- def interfaces
163
- raise "Incomplete type #{self} (#{self.class})" unless jvm_type
164
- @interfaces ||= begin
165
- interfaces = jvm_type.interfaces.map {|i| AST.type(nil, i)}.to_set
166
- if superclass
167
- interfaces |= superclass.interfaces
168
- end
169
- interfaces.to_a
170
- end
171
- @interfaces
172
- end
173
-
174
- def astore(builder)
175
- if primitive?
176
- builder.send "#{name[0,1]}astore"
177
- else
178
- builder.aastore
179
- end
180
- end
181
-
182
- def aload(builder)
183
- if primitive?
184
- builder.send "#{name[0,1]}aload"
185
- else
186
- builder.aaload
187
- end
188
- end
189
- end
190
-
191
- class PrimitiveType < Type
192
- def initialize(type, wrapper)
193
- @wrapper = wrapper
194
- super(type)
195
- end
196
-
197
- def primitive?
198
- true
199
- end
200
-
201
- def primitive_type
202
- @wrapper::TYPE
203
- end
204
-
205
- def newarray(method)
206
- method.send "new#{name}array"
207
- end
208
-
209
- def interfaces
210
- []
211
- end
212
-
213
- def convertible_to?(type)
214
- return true if type == self
215
- widening_conversions = WIDENING_CONVERSIONS[self]
216
- widening_conversions && widening_conversions.include?(type)
217
- end
218
-
219
- def superclass
220
- nil
221
- end
222
- end
223
-
224
- class MetaType < Type
225
- attr_reader :unmeta
226
-
227
- def initialize(unmeta)
228
- @name = unmeta.name
229
- @unmeta = unmeta
230
- end
231
-
232
- def basic_type
233
- @unmeta.basic_type
234
- end
235
-
236
- def meta?
237
- true
238
- end
239
-
240
- def meta
241
- self
242
- end
243
-
244
- def superclass
245
- @unmeta.superclass.meta if @unmeta.superclass
246
- end
247
-
248
- def interfaces
249
- []
250
- end
251
-
252
- def jvm_type
253
- unmeta.jvm_type
254
- end
255
-
256
- def inner_class?
257
- basic_type.inner_class?
258
- end
259
- end
260
-
261
- class NullType < Type
262
- def initialize
263
- super('java.lang.Object')
264
- end
265
-
266
- def to_s
267
- "Type(null)"
268
- end
269
-
270
- def compatible?(other)
271
- !other.primitive?
272
- end
273
-
274
- def assignable_from?(other)
275
- !other.primitive?
276
- end
277
- end
278
-
279
- class VoidType < PrimitiveType
280
- def initialize
281
- super('void', Java::JavaLang::Void)
282
- end
283
-
284
- def void?
285
- true
286
- end
287
-
288
- def return(builder)
289
- builder.returnvoid
290
- end
291
- end
292
-
293
- class ArrayType < Type
294
- attr_reader :component_type
295
-
296
- def initialize(component_type)
297
- @component_type = component_type
298
- if @component_type.jvm_type
299
- #@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
300
- else
301
- # FIXME: THIS IS WRONG, but I don't know how to fix it
302
- #@type = @component_type
303
- end
304
- @name = component_type.name
305
- end
306
-
307
- def array?
308
- true
309
- end
310
-
311
- def iterable?
312
- true
313
- end
314
-
315
- def inner_class?
316
- basic_type.inner_class?
317
- end
318
-
319
- def basic_type
320
- component_type.basic_type
321
- end
322
-
323
- def superclass
324
- Object
325
- end
326
-
327
- def interfaces
328
- []
329
- end
330
-
331
- def meta
332
- @meta ||= ArrayMetaType.new(self)
333
- end
334
- end
335
-
336
- class ArrayMetaType < MetaType; end
337
-
338
- class DynamicType < Type
339
- ObjectType = Type.new(BiteScript::ASM::ClassMirror.for_name('java.lang.Object'))
340
-
341
- def initialize
342
- # For naming, bytecode purposes, we are an Object
343
- @name = "java.lang.Object"
344
- end
345
-
346
- def basic_type
347
- self
348
- end
349
-
350
- def is_parent(other)
351
- ObjectType.assignable_from?(other)
352
- end
353
-
354
- def assignable_from?(other)
355
- ObjectType.assignable_from?(other)
356
- end
357
-
358
- def jvm_type
359
- java.lang.Object
360
- end
361
-
362
- def full_name
363
- "dynamic"
364
- end
365
-
366
- def dynamic?
367
- true
368
- end
369
-
370
- def superclass
371
- ObjectType.superclass
372
- end
373
-
374
- def interfaces
375
- ObjectType.interfaces
376
- end
377
- end
378
-
379
- class TypeDefinition < Type
380
- attr_accessor :node
381
-
382
- def initialize(name, node)
383
- raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
384
- raise ArgumentError, "Bad name #{name}" if name.include? ?/
385
- @name = name
386
- @node = node
387
- raise ArgumentError, "Bad type #{name}" if self.name =~ /Java::/
388
- end
389
-
390
- def name
391
- if @type
392
- @type.name.tr('/', '.')
393
- else
394
- @name
395
- end
396
- end
397
-
398
- def superclass
399
- (node && node.superclass) || Object
400
- end
401
-
402
- def interfaces
403
- if node
404
- node.interfaces
405
- else
406
- []
407
- end
408
- end
409
-
410
- def define(builder)
411
- class_name = @name.tr('.', '/')
412
- abstract = node && node.abstract
413
- @type ||= builder.define_class(
414
- class_name,
415
- :visibility => :public,
416
- :abstract => abstract,
417
- :superclass => superclass,
418
- :interfaces => interfaces)
419
- end
420
-
421
- def meta
422
- @meta ||= TypeDefMeta.new(self)
423
- end
424
- end
425
-
426
- class InterfaceDefinition < TypeDefinition
427
- def initialize(name, node)
428
- super(name, node)
429
- end
430
-
431
- def define(builder)
432
- class_name = @name.tr('.', '/')
433
- @type ||= builder.public_interface(class_name, *interfaces)
434
- end
435
-
436
- def interface?
437
- true
438
- end
439
- end
440
-
441
- class TypeDefMeta < MetaType
442
- end
443
- end
444
- end
445
- end
446
-
21
+ require 'mirah/jvm/types/type'
22
+ require 'mirah/jvm/types/primitive_type'
23
+ require 'mirah/jvm/types/meta_type'
24
+ require 'mirah/jvm/types/null_type'
25
+ require 'mirah/jvm/types/unreachable_type'
26
+ require 'mirah/jvm/types/void_type'
27
+ require 'mirah/jvm/types/array_type'
28
+ require 'mirah/jvm/types/dynamic_type'
29
+ require 'mirah/jvm/types/type_definition'
30
+ require 'mirah/jvm/types/interface_definition'
447
31
  require 'mirah/jvm/types/intrinsics'
448
32
  require 'mirah/jvm/types/methods'
449
33
  require 'mirah/jvm/types/number'