mirah 0.0.7-java → 0.0.8-java

Sign up to get free protection for your applications and to get access to all the features.
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'