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.
- data/History.txt +181 -0
- data/README.txt +6 -10
- data/Rakefile +86 -9
- data/bin/mirah +2 -0
- data/bin/mirahc +2 -0
- data/bin/mirahp +2 -0
- data/{bin/dubyp → examples/interfaces.mirah} +16 -9
- data/examples/macros/square.mirah +12 -0
- data/examples/macros/square_int.mirah +12 -0
- data/examples/macros/string-each-char.mirah +14 -0
- data/examples/maven/README.txt +2 -0
- data/examples/maven/pom.xml +23 -0
- data/examples/maven/src/main/mirah/hello_mirah.mirah +9 -0
- data/examples/rosettacode/100-doors.mirah +44 -0
- data/examples/rosettacode/99-bottles-of-beer.mirah +13 -0
- data/examples/rosettacode/README.txt +9 -0
- data/examples/rosettacode/boolean-values.mirah +29 -0
- data/examples/rosettacode/comments.mirah +2 -0
- data/examples/rosettacode/copy-a-string.mirah +10 -0
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +40 -0
- data/examples/rosettacode/create-a-file.mirah +6 -0
- data/examples/rosettacode/empty-string.mirah +9 -0
- data/examples/rosettacode/factorial.mirah +10 -0
- data/examples/rosettacode/fibonacci.mirah +21 -0
- data/examples/rosettacode/file-size.mirah +5 -0
- data/examples/rosettacode/fizz-buzz.mirah +21 -0
- data/examples/rosettacode/flatten-a-list.mirah +24 -0
- data/examples/rosettacode/guess-the-number.mirah +21 -0
- data/examples/rosettacode/is-string-numeric.mirah +127 -0
- data/examples/rosettacode/palindrome.mirah +14 -0
- data/examples/rosettacode/repeat-a-string.mirah +9 -0
- data/examples/rosettacode/reverse-a-string.mirah +6 -0
- data/examples/rosettacode/rot-13.mirah +20 -0
- data/examples/rosettacode/user-input.mirah +4 -0
- data/examples/sort_closure.mirah +1 -1
- data/javalib/dynalink-0.2.jar +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/lib/mirah.rb +7 -16
- data/lib/mirah/ast.rb +22 -92
- data/lib/mirah/ast/call.rb +41 -9
- data/lib/mirah/ast/class.rb +34 -6
- data/lib/mirah/ast/flow.rb +17 -5
- data/lib/mirah/ast/intrinsics.rb +50 -8
- data/lib/mirah/ast/literal.rb +7 -0
- data/lib/mirah/ast/local.rb +9 -1
- data/lib/mirah/ast/method.rb +21 -8
- data/lib/mirah/ast/scope.rb +1 -1
- data/lib/mirah/ast/structure.rb +81 -15
- data/lib/mirah/ast/type.rb +4 -0
- data/{bin/dubyc → lib/mirah/commands.rb} +4 -11
- data/lib/mirah/commands/base.rb +54 -0
- data/lib/mirah/commands/compile.rb +39 -0
- data/{examples/wiki/Rakefile → lib/mirah/commands/parse.rb} +18 -17
- data/lib/mirah/commands/run.rb +73 -0
- data/lib/mirah/compiler.rb +37 -417
- data/lib/mirah/compiler/call.rb +45 -0
- data/lib/mirah/compiler/class.rb +81 -0
- data/lib/mirah/compiler/flow.rb +109 -0
- data/lib/mirah/compiler/literal.rb +130 -0
- data/lib/mirah/compiler/local.rb +59 -0
- data/lib/mirah/compiler/method.rb +44 -0
- data/lib/mirah/compiler/structure.rb +65 -0
- data/lib/mirah/compiler/type.rb +27 -0
- data/lib/mirah/env.rb +4 -6
- data/lib/mirah/generator.rb +61 -0
- data/lib/mirah/jvm/compiler.rb +8 -867
- data/lib/mirah/jvm/compiler/base.rb +270 -0
- data/lib/mirah/jvm/compiler/java_source.rb +779 -0
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +851 -0
- data/lib/mirah/jvm/method_lookup.rb +21 -2
- data/lib/mirah/jvm/source_generator/builder.rb +10 -13
- data/lib/mirah/jvm/source_generator/loops.rb +99 -93
- data/lib/mirah/jvm/source_generator/precompile.rb +3 -2
- data/lib/mirah/jvm/typer.rb +3 -3
- data/lib/mirah/jvm/types.rb +10 -426
- data/lib/mirah/jvm/types/array_type.rb +62 -0
- data/lib/mirah/jvm/types/basic_types.rb +1 -0
- data/lib/mirah/jvm/types/dynamic_type.rb +46 -0
- data/lib/mirah/jvm/types/factory.rb +23 -5
- data/lib/mirah/jvm/types/interface_definition.rb +20 -0
- data/lib/mirah/jvm/types/intrinsics.rb +15 -3
- data/lib/mirah/jvm/types/meta_type.rb +45 -0
- data/lib/mirah/jvm/types/methods.rb +12 -5
- data/lib/mirah/jvm/types/null_type.rb +27 -0
- data/lib/mirah/jvm/types/primitive_type.rb +38 -0
- data/lib/mirah/jvm/types/source_mirror.rb +266 -0
- data/lib/mirah/jvm/types/type.rb +173 -0
- data/lib/mirah/jvm/types/type_definition.rb +55 -0
- data/lib/mirah/jvm/types/unreachable_type.rb +27 -0
- data/lib/mirah/jvm/types/void_type.rb +19 -0
- data/lib/mirah/parser.rb +90 -0
- data/lib/mirah/plugin/gwt.rb +5 -5
- data/lib/mirah/plugin/java.rb +1 -1
- data/lib/mirah/transform.rb +4 -321
- data/lib/mirah/transform/ast_ext.rb +63 -0
- data/lib/mirah/transform/error.rb +13 -0
- data/lib/mirah/transform/helper.rb +761 -0
- data/lib/mirah/transform/transformer.rb +255 -0
- data/lib/mirah/typer.rb +2 -383
- data/{bin/duby → lib/mirah/typer/base.rb} +12 -10
- data/lib/mirah/typer/simple.rb +377 -0
- data/lib/mirah/util/argument_processor.rb +114 -0
- data/lib/mirah/util/class_loader.rb +37 -0
- data/lib/mirah/util/compilation_state.rb +51 -0
- data/lib/mirah/util/process_errors.rb +33 -0
- data/lib/mirah/version.rb +1 -1
- data/lib/mirah_task.rb +3 -2
- data/test/{test_ast.rb → core/test_ast.rb} +6 -0
- data/test/{test_compilation.rb → core/test_compilation.rb} +0 -0
- data/test/{test_env.rb → core/test_env.rb} +24 -25
- data/test/{test_macros.rb → core/test_macros.rb} +2 -4
- data/test/{test_typer.rb → core/test_typer.rb} +0 -3
- data/test/jvm/bytecode_test_helper.rb +181 -0
- data/test/{test_javac_compiler.rb → jvm/javac_test_helper.rb} +38 -22
- data/test/jvm/test_enumerable.rb +304 -0
- data/test/{test_java_typer.rb → jvm/test_java_typer.rb} +2 -4
- data/test/{test_jvm_compiler.rb → jvm/test_jvm_compiler.rb} +146 -443
- data/test/jvm/test_macros.rb +147 -0
- data/test/jvm/test_main_method.rb +15 -0
- data/test/{test_gwt.rb → plugins/test_gwt.rb} +0 -2
- metadata +103 -91
- data/bin/jrubyp +0 -52
- data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +0 -339
- data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +0 -42
- data/examples/wiki/src/org/mirah/wiki/error.eduby.html +0 -2
- data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +0 -69
- data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +0 -7
- data/examples/wiki/src/org/mirah/wiki/view.eduby.html +0 -15
- data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
- data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
- data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
- data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
- data/examples/wiki/war/app.yaml +0 -21
- data/examples/wiki/war/public/favicon.ico +0 -0
- data/examples/wiki/war/public/images/appengine_duby.png +0 -0
- data/examples/wiki/war/public/images/back.gif +0 -0
- data/examples/wiki/war/public/images/dir.gif +0 -0
- data/examples/wiki/war/public/images/file.gif +0 -0
- data/examples/wiki/war/public/javascripts/prettify.js +0 -61
- data/examples/wiki/war/public/robots.txt +0 -0
- data/examples/wiki/war/public/stylesheets/main.css +0 -156
- data/examples/wiki/war/public/stylesheets/prettify.css +0 -1
- data/examples/wiki/war/public/stylesheets/sh_style.css +0 -66
- data/examples/wiki/war/public/stylesheets/source.css +0 -21
- data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
- data/examples/wiki/war/public/wmd/images/bg.png +0 -0
- data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
- data/examples/wiki/war/public/wmd/images/bold.png +0 -0
- data/examples/wiki/war/public/wmd/images/code.png +0 -0
- data/examples/wiki/war/public/wmd/images/h1.png +0 -0
- data/examples/wiki/war/public/wmd/images/hr.png +0 -0
- data/examples/wiki/war/public/wmd/images/img.png +0 -0
- data/examples/wiki/war/public/wmd/images/italic.png +0 -0
- data/examples/wiki/war/public/wmd/images/link.png +0 -0
- data/examples/wiki/war/public/wmd/images/ol.png +0 -0
- data/examples/wiki/war/public/wmd/images/redo.png +0 -0
- data/examples/wiki/war/public/wmd/images/separator.png +0 -0
- data/examples/wiki/war/public/wmd/images/ul.png +0 -0
- data/examples/wiki/war/public/wmd/images/undo.png +0 -0
- data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
- data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
- data/examples/wiki/war/public/wmd/showdown.js +0 -421
- data/examples/wiki/war/public/wmd/wmd-base.js +0 -1799
- data/examples/wiki/war/public/wmd/wmd-plus.js +0 -311
- data/examples/wiki/war/public/wmd/wmd.js +0 -73
- data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +0 -339
- data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +0 -42
- data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +0 -2
- data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +0 -69
- data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +0 -7
- data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +0 -15
- data/javalib/dynalink-0.1.jar +0 -0
- data/javalib/jsr292-mock.jar +0 -0
- data/lib/mirah/class_loader.rb +0 -35
- data/lib/mirah/compilation_state.rb +0 -28
- data/lib/mirah/impl.rb +0 -273
- data/lib/mirah/jvm/base.rb +0 -267
- data/lib/mirah/jvm/source_compiler.rb +0 -760
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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::
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
def break
|
|
28
|
+
compiler.method.puts "break;"
|
|
29
|
+
end
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
def next
|
|
32
|
+
compiler.method.puts "continue;"
|
|
33
|
+
end
|
|
31
34
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
def redo
|
|
36
|
+
raise "#{self.class.name} doesn't support redo"
|
|
37
|
+
end
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
def compile_body
|
|
58
|
+
loop.body.compile(compiler, false) if loop.body
|
|
59
|
+
end
|
|
57
60
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
def break
|
|
90
|
+
compiler.method.puts "break #{@outer};"
|
|
91
|
+
end
|
|
89
92
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
+
def next
|
|
94
|
+
compiler.method.puts "break #{@inner};"
|
|
95
|
+
end
|
|
93
96
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
def redo
|
|
98
|
+
compiler.method.puts "#{@redo} = true;"
|
|
99
|
+
compiler.method.puts "continue #{@inner};"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
99
102
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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)
|
data/lib/mirah/jvm/typer.rb
CHANGED
|
@@ -18,8 +18,8 @@ require 'mirah/jvm/types'
|
|
|
18
18
|
require 'mirah/jvm/types/factory'
|
|
19
19
|
|
|
20
20
|
module Mirah
|
|
21
|
-
module
|
|
22
|
-
class
|
|
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::
|
|
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
|
data/lib/mirah/jvm/types.rb
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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'
|