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.
- 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'
|