mirah 0.0.4-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 +15 -0
- data/README.txt +51 -0
- data/Rakefile +86 -0
- data/bin/duby +10 -0
- data/bin/dubyc +10 -0
- data/bin/dubyp +10 -0
- data/bin/jrubyp +36 -0
- data/bin/mirah +9 -0
- data/bin/mirah.cmd +1 -0
- data/bin/mirahc +9 -0
- data/bin/mirahc.cmd +1 -0
- data/bin/mirahp +9 -0
- data/bin/mirahp.cmd +1 -0
- data/examples/ant/example-build.xml +7 -0
- data/examples/appengine/Rakefile +19 -0
- data/examples/appengine/Readme +29 -0
- data/examples/appengine/src/org/mirah/MirahApp.mirah +57 -0
- data/examples/appengine/src/org/mirah/list.dhtml +15 -0
- data/examples/appengine/war/WEB-INF/lib/dubydatastore.jar +0 -0
- data/examples/bintrees.mirah +66 -0
- data/examples/construction.mirah +8 -0
- data/examples/dynamic.mirah +17 -0
- data/examples/edb.mirah +3 -0
- data/examples/fib.mirah +16 -0
- data/examples/fields.mirah +22 -0
- data/examples/fractal.mirah +55 -0
- data/examples/java_thing.mirah +13 -0
- data/examples/plugins/appengine/Rakefile +55 -0
- data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +375 -0
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +336 -0
- data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +113 -0
- data/examples/simple_class.mirah +12 -0
- data/examples/sort_closure.mirah +7 -0
- data/examples/swing.mirah +20 -0
- data/examples/tak.mirah +15 -0
- data/examples/test.edb +9 -0
- data/examples/wiki/Rakefile +18 -0
- data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +324 -0
- data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +42 -0
- data/examples/wiki/src/org/mirah/wiki/error.eduby.html +2 -0
- data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +69 -0
- data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +7 -0
- data/examples/wiki/src/org/mirah/wiki/view.eduby.html +15 -0
- 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 +21 -0
- 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 +61 -0
- data/examples/wiki/war/public/robots.txt +0 -0
- data/examples/wiki/war/public/stylesheets/main.css +156 -0
- data/examples/wiki/war/public/stylesheets/prettify.css +1 -0
- data/examples/wiki/war/public/stylesheets/sh_style.css +66 -0
- data/examples/wiki/war/public/stylesheets/source.css +21 -0
- 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 +421 -0
- data/examples/wiki/war/public/wmd/wmd-base.js +1799 -0
- data/examples/wiki/war/public/wmd/wmd-plus.js +311 -0
- data/examples/wiki/war/public/wmd/wmd.js +73 -0
- data/javalib/JRubyParser.jar +0 -0
- data/javalib/dynalang-invoke-0.1.jar +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/lib/duby.rb +2 -0
- data/lib/mirah.rb +338 -0
- data/lib/mirah/appengine_tasks.rb +146 -0
- data/lib/mirah/ast.rb +615 -0
- data/lib/mirah/ast/call.rb +307 -0
- data/lib/mirah/ast/class.rb +311 -0
- data/lib/mirah/ast/flow.rb +364 -0
- data/lib/mirah/ast/intrinsics.rb +470 -0
- data/lib/mirah/ast/literal.rb +154 -0
- data/lib/mirah/ast/local.rb +89 -0
- data/lib/mirah/ast/method.rb +360 -0
- data/lib/mirah/ast/scope.rb +208 -0
- data/lib/mirah/ast/structure.rb +226 -0
- data/lib/mirah/ast/type.rb +130 -0
- data/lib/mirah/compiler.rb +341 -0
- data/lib/mirah/env.rb +33 -0
- data/lib/mirah/jvm/base.rb +258 -0
- data/lib/mirah/jvm/compiler.rb +885 -0
- data/lib/mirah/jvm/method_lookup.rb +203 -0
- data/lib/mirah/jvm/source_compiler.rb +737 -0
- data/lib/mirah/jvm/source_generator/builder.rb +444 -0
- data/lib/mirah/jvm/source_generator/loops.rb +110 -0
- data/lib/mirah/jvm/source_generator/precompile.rb +188 -0
- data/lib/mirah/jvm/source_generator/typer.rb +11 -0
- data/lib/mirah/jvm/typer.rb +151 -0
- data/lib/mirah/jvm/types.rb +416 -0
- data/lib/mirah/jvm/types/basic_types.rb +33 -0
- data/lib/mirah/jvm/types/boolean.rb +17 -0
- data/lib/mirah/jvm/types/enumerable.rb +65 -0
- data/lib/mirah/jvm/types/extensions.rb +86 -0
- data/lib/mirah/jvm/types/factory.rb +186 -0
- data/lib/mirah/jvm/types/floats.rb +86 -0
- data/lib/mirah/jvm/types/integers.rb +171 -0
- data/lib/mirah/jvm/types/intrinsics.rb +376 -0
- data/lib/mirah/jvm/types/literals.rb +74 -0
- data/lib/mirah/jvm/types/methods.rb +614 -0
- data/lib/mirah/jvm/types/number.rb +143 -0
- data/lib/mirah/nbcompiler.rb +29 -0
- data/lib/mirah/plugin/edb.rb +29 -0
- data/lib/mirah/plugin/gwt.rb +173 -0
- data/lib/mirah/plugin/java.rb +55 -0
- data/lib/mirah/transform.rb +266 -0
- data/lib/mirah/transform2.rb +728 -0
- data/lib/mirah/typer.rb +407 -0
- data/lib/mirah_task.rb +107 -0
- data/test/test_ast.rb +359 -0
- data/test/test_compilation.rb +112 -0
- data/test/test_env.rb +42 -0
- data/test/test_gwt.rb +58 -0
- data/test/test_java_typer.rb +183 -0
- data/test/test_javac_compiler.rb +63 -0
- data/test/test_jvm_compiler.rb +2607 -0
- data/test/test_typer.rb +221 -0
- metadata +235 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
require 'mirah/ast'
|
|
2
|
+
|
|
3
|
+
module Duby::AST
|
|
4
|
+
class TempValue
|
|
5
|
+
def initialize(node, compiler=nil, value=nil)
|
|
6
|
+
if compiler.nil?
|
|
7
|
+
@tempname = node
|
|
8
|
+
else
|
|
9
|
+
@tempname = compiler.temp(node, value)
|
|
10
|
+
@tempvalue = value || node
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def compile(compiler, expression)
|
|
15
|
+
if expression
|
|
16
|
+
compiler.method.print @tempname
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def reload(compiler)
|
|
21
|
+
compiler.assign(@tempname, @tempvalue)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Node
|
|
26
|
+
def expr?(compiler)
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def precompile(compiler)
|
|
31
|
+
if expr?(compiler)
|
|
32
|
+
self
|
|
33
|
+
else
|
|
34
|
+
temp(compiler)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def temp(compiler, value=nil)
|
|
39
|
+
TempValue.new(self, compiler, value)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class Body
|
|
44
|
+
def expr?(compiler)
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class If
|
|
50
|
+
def expr?(compiler)
|
|
51
|
+
return false unless condition.predicate.expr?(compiler)
|
|
52
|
+
return false unless body.nil? || body.expr?(compiler)
|
|
53
|
+
return false unless self.else.nil? || self.else.expr?(compiler)
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
class Loop
|
|
59
|
+
def expr?(compiler)
|
|
60
|
+
false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def precompile(compiler)
|
|
64
|
+
compile(compiler, false)
|
|
65
|
+
temp(compiler, 'null')
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class Call
|
|
70
|
+
def method(compiler=nil)
|
|
71
|
+
@method ||= begin
|
|
72
|
+
arg_types = parameters.map {|p| p.inferred_type}
|
|
73
|
+
target.inferred_type.get_method(name, arg_types)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def expr?(compiler)
|
|
78
|
+
target.expr?(compiler) &&
|
|
79
|
+
parameters.all? {|p| p.expr?(compiler)} &&
|
|
80
|
+
!method.return_type.kind_of?(Duby::AST::InlineCode) &&
|
|
81
|
+
!method.return_type.void?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def precompile_target(compiler)
|
|
85
|
+
if method.return_type.void? && target.expr?(compiler)
|
|
86
|
+
TempValue.new(target, compiler)
|
|
87
|
+
else
|
|
88
|
+
target.precompile(compiler)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
class FunctionalCall
|
|
94
|
+
def method(compiler)
|
|
95
|
+
@method ||= begin
|
|
96
|
+
arg_types = parameters.map {|p| p.inferred_type}
|
|
97
|
+
@self_type.get_method(name, arg_types)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def expr?(compiler)
|
|
102
|
+
parameters.all? {|p| p.expr?(compiler)} &&
|
|
103
|
+
(cast? || !method(compiler).return_type.void?)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# TODO merge with FunctionalCall logic (almost identical)
|
|
108
|
+
class Super
|
|
109
|
+
def method(compiler)
|
|
110
|
+
@method ||= begin
|
|
111
|
+
arg_types = parameters.map {|p| p.inferred_type}
|
|
112
|
+
compiler.self_type.superclass.get_method(name, arg_types)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def expr?(compiler)
|
|
117
|
+
parameters.all? {|p| p.expr?(compiler)} &&
|
|
118
|
+
!method(compiler).return_type.void?
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
class EmtpyArray
|
|
123
|
+
def expr?(compiler)
|
|
124
|
+
size.expr?(compiler)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
class LocalAssignment
|
|
129
|
+
def expr?(compiler)
|
|
130
|
+
compiler.method.local?(name) && value.expr?(compiler)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def precompile(compiler)
|
|
134
|
+
if expr?(compiler)
|
|
135
|
+
self
|
|
136
|
+
else
|
|
137
|
+
compile(compiler, false)
|
|
138
|
+
TempValue.new(name)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
class ToString
|
|
144
|
+
def expr?(compiler)
|
|
145
|
+
body.expr?(compiler)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def temp(compiler, value=nil)
|
|
149
|
+
TempValue.new(body, compiler, value)
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
class StringConcat
|
|
154
|
+
def expr?(compiler)
|
|
155
|
+
children.all? {|x| x.expr?(compiler)}
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
class Return
|
|
160
|
+
def expr?(compiler)
|
|
161
|
+
false
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
class Raise
|
|
166
|
+
def expr?(compiler)
|
|
167
|
+
false
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
class Rescue
|
|
172
|
+
def expr?(compiler)
|
|
173
|
+
false
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
class Ensure
|
|
178
|
+
def expr?(compiler)
|
|
179
|
+
false
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
class FieldAssignment
|
|
184
|
+
def expr?(compiler)
|
|
185
|
+
false
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
require 'mirah/typer'
|
|
2
|
+
require 'mirah/jvm/types'
|
|
3
|
+
require 'mirah/jvm/types/factory'
|
|
4
|
+
|
|
5
|
+
module Duby
|
|
6
|
+
module Typer
|
|
7
|
+
class JVM < Simple
|
|
8
|
+
include Duby::JVM::Types
|
|
9
|
+
|
|
10
|
+
attr_reader :transformer
|
|
11
|
+
|
|
12
|
+
def initialize(transformer)
|
|
13
|
+
@factory = AST.type_factory
|
|
14
|
+
@transformer = transformer
|
|
15
|
+
unless @factory.kind_of? TypeFactory
|
|
16
|
+
raise "TypeFactory not installed"
|
|
17
|
+
end
|
|
18
|
+
@known_types = @factory.known_types
|
|
19
|
+
@known_types['dynamic'] = DynamicType.new
|
|
20
|
+
@errors = []
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def set_filename(scope, filename)
|
|
24
|
+
classname = Duby::Compiler::JVM.classname_from_filename(filename)
|
|
25
|
+
main_class = @factory.declare_type(scope, classname)
|
|
26
|
+
@known_types['self'] = main_class.meta
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def type_reference(scope, name, array=false, meta=false)
|
|
30
|
+
@factory.type(scope, name, array, meta)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def name
|
|
34
|
+
"JVM"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def type_definition(scope, name, superclass, interfaces)
|
|
38
|
+
imports = scope.static_scope.imports
|
|
39
|
+
name = imports[name] while imports.include?(name)
|
|
40
|
+
package = scope.static_scope.package
|
|
41
|
+
unless name =~ /\./ || package.empty?
|
|
42
|
+
name = "#{package}.#{name}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
@known_types[name]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def null_type
|
|
49
|
+
Null
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def no_type
|
|
53
|
+
Void
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def array_type
|
|
57
|
+
# TODO: allow other types for pre-1.2 profiles
|
|
58
|
+
type_reference(nil, "java.util.List")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def hash_type
|
|
62
|
+
# TODO: allow other types for pre-1.2 profiles
|
|
63
|
+
type_reference(nil, "java.util.Map")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def regexp_type
|
|
67
|
+
type_reference(nil, "java.util.regex.Pattern")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def known_type(scope, name)
|
|
71
|
+
@factory.known_type(scope, name)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def fixnum_type(value)
|
|
75
|
+
FixnumLiteral.new(value)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def float_type(value)
|
|
79
|
+
FloatLiteral.new(value)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def learn_method_type(target_type, name, parameter_types, type, exceptions)
|
|
83
|
+
static = target_type.meta?
|
|
84
|
+
if static
|
|
85
|
+
target_type.unmeta.declare_static_method(name, parameter_types, type, exceptions)
|
|
86
|
+
else
|
|
87
|
+
target_type.declare_method(name, parameter_types, type, exceptions)
|
|
88
|
+
end
|
|
89
|
+
super
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def infer_signature(method_def)
|
|
93
|
+
signature = method_def.signature
|
|
94
|
+
sig_args = signature.dup
|
|
95
|
+
return_type = sig_args.delete(:return)
|
|
96
|
+
exceptions = sig_args.delete(:throws)
|
|
97
|
+
args = method_def.arguments.args || []
|
|
98
|
+
static = method_def.kind_of? Duby::AST::StaticMethodDefinition
|
|
99
|
+
if sig_args.size != args.size
|
|
100
|
+
# If the superclass declares one method with the same name and
|
|
101
|
+
# same number of arguments, assume we're overriding it.
|
|
102
|
+
found = nil
|
|
103
|
+
ambiguous = false
|
|
104
|
+
classes = [self_type.superclass] + self_type.interfaces
|
|
105
|
+
while classes.size > 0
|
|
106
|
+
cls = classes.pop
|
|
107
|
+
if static
|
|
108
|
+
methods = cls.declared_class_methods
|
|
109
|
+
else
|
|
110
|
+
methods = cls.declared_instance_methods
|
|
111
|
+
end
|
|
112
|
+
methods.each do |method|
|
|
113
|
+
if method.name == method_def.name &&
|
|
114
|
+
method.argument_types.size == args.size
|
|
115
|
+
if found && found.argument_types != method.argument_types
|
|
116
|
+
ambiguous = true
|
|
117
|
+
else
|
|
118
|
+
found ||= method
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
classes << cls.superclass if cls.superclass
|
|
123
|
+
end
|
|
124
|
+
if found && !ambiguous
|
|
125
|
+
signature[:return] = found.return_type
|
|
126
|
+
signature[:throws] = found.exceptions
|
|
127
|
+
args.zip(found.argument_types) do |arg, type|
|
|
128
|
+
signature[arg.name.intern] = type
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
elsif signature[:return].nil? && !static
|
|
132
|
+
arg_types = args.map do |arg|
|
|
133
|
+
signature[arg.name.intern]
|
|
134
|
+
end
|
|
135
|
+
method = self_type.find_method(
|
|
136
|
+
self_type, method_def.name, arg_types, false)
|
|
137
|
+
interfaces = self_type.interfaces.dup
|
|
138
|
+
until method || interfaces.empty?
|
|
139
|
+
interface = interfaces.pop
|
|
140
|
+
method = interface.find_method(
|
|
141
|
+
interface, method_def.name, arg_types, false)
|
|
142
|
+
end
|
|
143
|
+
if method
|
|
144
|
+
signature[:return] = method.return_type
|
|
145
|
+
signature[:throws] = method.exceptions
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
require 'bitescript'
|
|
2
|
+
require 'mirah/ast'
|
|
3
|
+
require 'mirah/jvm/method_lookup'
|
|
4
|
+
require 'mirah/jvm/compiler'
|
|
5
|
+
require 'set'
|
|
6
|
+
|
|
7
|
+
module Duby
|
|
8
|
+
module JVM
|
|
9
|
+
module Types
|
|
10
|
+
class Type < AST::TypeReference
|
|
11
|
+
include Java::DubyLangCompiler::Class
|
|
12
|
+
include Duby::JVM::MethodLookup
|
|
13
|
+
|
|
14
|
+
attr_writer :inner_class
|
|
15
|
+
|
|
16
|
+
def log(message)
|
|
17
|
+
puts "* [JVM::Types] #{message}" if Duby::Compiler::JVM.verbose
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(mirror_or_name)
|
|
21
|
+
if mirror_or_name.kind_of?(BiteScript::ASM::ClassMirror)
|
|
22
|
+
@type = mirror_or_name
|
|
23
|
+
name = mirror_or_name.type.class_name
|
|
24
|
+
else
|
|
25
|
+
name = mirror_or_name.to_s
|
|
26
|
+
end
|
|
27
|
+
super(name, false, false)
|
|
28
|
+
raise ArgumentError, "Bad type #{mirror_or_name}" if name =~ /Java::/
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def full_name
|
|
32
|
+
desc = BiteScript::Signature.class_id(self)
|
|
33
|
+
BiteScript::ASM::Type.get_type(desc).class_name
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def jvm_type
|
|
37
|
+
@type
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def void?
|
|
41
|
+
false
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def meta?
|
|
45
|
+
false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def array?
|
|
49
|
+
false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def primitive?
|
|
53
|
+
false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def interface?
|
|
57
|
+
@type.interface?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def dynamic?
|
|
61
|
+
false
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def inner_class?
|
|
65
|
+
@inner_class
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def is_parent(other)
|
|
69
|
+
assignable_from?(other)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def compatible?(other)
|
|
73
|
+
assignable_from?(other)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def assignable_from?(other)
|
|
77
|
+
return false if other.nil?
|
|
78
|
+
return true if !primitive? && other == Null
|
|
79
|
+
return true if other == self
|
|
80
|
+
return true if other.error? || other.unreachable?
|
|
81
|
+
|
|
82
|
+
# TODO should we allow more here?
|
|
83
|
+
return interface? if other.block?
|
|
84
|
+
|
|
85
|
+
return true if jvm_type && (jvm_type == other.jvm_type)
|
|
86
|
+
|
|
87
|
+
assignable_from?(other.superclass) ||
|
|
88
|
+
other.interfaces.any? {|i| assignable_from?(i)}
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def iterable?
|
|
92
|
+
['java.lang.Iterable',
|
|
93
|
+
'java.util.Iterator',
|
|
94
|
+
'java.util.Enumeration'].any? {|n| AST.type(nil, n).assignable_from(self)}
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def component_type
|
|
98
|
+
AST.type(nil, 'java.lang.Object') if iterable?
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def meta
|
|
102
|
+
@meta ||= MetaType.new(self)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def unmeta
|
|
106
|
+
self
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def basic_type
|
|
110
|
+
self
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def array_type
|
|
114
|
+
@array_type ||= Duby::JVM::Types::ArrayType.new(self)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def prefix
|
|
118
|
+
'a'
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# is this a 64 bit type?
|
|
122
|
+
def wide?
|
|
123
|
+
false
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def inspect(indent=0)
|
|
127
|
+
"#{' ' * indent}#<#{self.class.name} #{name}>"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def newarray(method)
|
|
131
|
+
method.anewarray(self)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def superclass
|
|
135
|
+
raise "Incomplete type #{self}" unless jvm_type
|
|
136
|
+
AST.type(nil, jvm_type.superclass) if jvm_type.superclass
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def interfaces
|
|
140
|
+
raise "Incomplete type #{self} (#{self.class})" unless jvm_type
|
|
141
|
+
@interfaces ||= begin
|
|
142
|
+
interfaces = jvm_type.interfaces.map {|i| AST.type(nil, i)}.to_set
|
|
143
|
+
if superclass
|
|
144
|
+
interfaces |= superclass.interfaces
|
|
145
|
+
end
|
|
146
|
+
interfaces.to_a
|
|
147
|
+
end
|
|
148
|
+
@interfaces
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def astore(builder)
|
|
152
|
+
if primitive?
|
|
153
|
+
builder.send "#{name[0,1]}astore"
|
|
154
|
+
else
|
|
155
|
+
builder.aastore
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def aload(builder)
|
|
160
|
+
if primitive?
|
|
161
|
+
builder.send "#{name[0,1]}aload"
|
|
162
|
+
else
|
|
163
|
+
builder.aaload
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
class PrimitiveType < Type
|
|
169
|
+
def initialize(type, wrapper)
|
|
170
|
+
@wrapper = wrapper
|
|
171
|
+
super(type)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def primitive?
|
|
175
|
+
true
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def primitive_type
|
|
179
|
+
@wrapper::TYPE
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def newarray(method)
|
|
183
|
+
method.send "new#{name}array"
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def interfaces
|
|
187
|
+
[]
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def convertible_to?(type)
|
|
191
|
+
return true if type == self
|
|
192
|
+
widening_conversions = WIDENING_CONVERSIONS[self]
|
|
193
|
+
widening_conversions && widening_conversions.include?(type)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def superclass
|
|
197
|
+
nil
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
class MetaType < Type
|
|
202
|
+
attr_reader :unmeta
|
|
203
|
+
|
|
204
|
+
def initialize(unmeta)
|
|
205
|
+
@name = unmeta.name
|
|
206
|
+
@unmeta = unmeta
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def basic_type
|
|
210
|
+
@unmeta.basic_type
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def meta?
|
|
214
|
+
true
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def meta
|
|
218
|
+
self
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def superclass
|
|
222
|
+
@unmeta.superclass.meta if @unmeta.superclass
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def interfaces
|
|
226
|
+
[]
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def jvm_type
|
|
230
|
+
unmeta.jvm_type
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def inner_class?
|
|
234
|
+
basic_type.inner_class?
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
class NullType < Type
|
|
239
|
+
def initialize
|
|
240
|
+
super('java.lang.Object')
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def to_s
|
|
244
|
+
"Type(null)"
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def compatible?(other)
|
|
248
|
+
!other.primitive?
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
class VoidType < PrimitiveType
|
|
253
|
+
def initialize
|
|
254
|
+
super('void', Java::JavaLang::Void)
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def void?
|
|
258
|
+
true
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def return(builder)
|
|
262
|
+
builder.returnvoid
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
class ArrayType < Type
|
|
267
|
+
attr_reader :component_type
|
|
268
|
+
|
|
269
|
+
def initialize(component_type)
|
|
270
|
+
@component_type = component_type
|
|
271
|
+
if @component_type.jvm_type
|
|
272
|
+
#@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
|
|
273
|
+
else
|
|
274
|
+
# FIXME: THIS IS WRONG, but I don't know how to fix it
|
|
275
|
+
#@type = @component_type
|
|
276
|
+
end
|
|
277
|
+
@name = component_type.name
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def array?
|
|
281
|
+
true
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def iterable?
|
|
285
|
+
true
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def inner_class?
|
|
289
|
+
basic_type.inner_class?
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def basic_type
|
|
293
|
+
component_type.basic_type
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def superclass
|
|
297
|
+
Object
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def interfaces
|
|
301
|
+
[]
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def meta
|
|
305
|
+
@meta ||= ArrayMetaType.new(self)
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
class ArrayMetaType < MetaType; end
|
|
310
|
+
|
|
311
|
+
class DynamicType < Type
|
|
312
|
+
ObjectType = Type.new('java.lang.Object')
|
|
313
|
+
|
|
314
|
+
def initialize
|
|
315
|
+
# For naming, bytecode purposes, we are an Object
|
|
316
|
+
@name = "java.lang.Object"
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def basic_type
|
|
320
|
+
self
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def is_parent(other)
|
|
324
|
+
ObjectType.assignable_from?(other)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def assignable_from?(other)
|
|
328
|
+
ObjectType.assignable_from?(other)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def jvm_type
|
|
332
|
+
java.lang.Object
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def dynamic?
|
|
336
|
+
true
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
class TypeDefinition < Type
|
|
341
|
+
attr_accessor :node
|
|
342
|
+
|
|
343
|
+
def initialize(name, node)
|
|
344
|
+
raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
|
|
345
|
+
raise ArgumentError, "Bad name #{name}" if name.include? ?/
|
|
346
|
+
@name = name
|
|
347
|
+
@node = node
|
|
348
|
+
raise ArgumentError, "Bad type #{name}" if self.name =~ /Java::/
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def name
|
|
352
|
+
if @type
|
|
353
|
+
@type.name.tr('/', '.')
|
|
354
|
+
else
|
|
355
|
+
@name
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def superclass
|
|
360
|
+
(node && node.superclass) || Object
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def interfaces
|
|
364
|
+
if node
|
|
365
|
+
node.interfaces
|
|
366
|
+
else
|
|
367
|
+
[]
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def define(builder)
|
|
372
|
+
class_name = @name.tr('.', '/')
|
|
373
|
+
abstract = node && node.abstract
|
|
374
|
+
@type ||= builder.define_class(
|
|
375
|
+
class_name,
|
|
376
|
+
:visibility => :public,
|
|
377
|
+
:abstract => abstract,
|
|
378
|
+
:superclass => superclass,
|
|
379
|
+
:interfaces => interfaces)
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def meta
|
|
383
|
+
@meta ||= TypeDefMeta.new(self)
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
class InterfaceDefinition < TypeDefinition
|
|
388
|
+
def initialize(name, node)
|
|
389
|
+
super(name, node)
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
def define(builder)
|
|
393
|
+
class_name = @name.tr('.', '/')
|
|
394
|
+
@type ||= builder.public_interface(class_name, *interfaces)
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
def interface?
|
|
398
|
+
true
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
class TypeDefMeta < MetaType
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
require 'mirah/jvm/types/intrinsics'
|
|
409
|
+
require 'mirah/jvm/types/methods'
|
|
410
|
+
require 'mirah/jvm/types/number'
|
|
411
|
+
require 'mirah/jvm/types/integers'
|
|
412
|
+
require 'mirah/jvm/types/boolean'
|
|
413
|
+
require 'mirah/jvm/types/floats'
|
|
414
|
+
require 'mirah/jvm/types/basic_types'
|
|
415
|
+
require 'mirah/jvm/types/literals'
|
|
416
|
+
require 'mirah/jvm/types/extensions'
|