mirah 0.0.9-java → 0.0.10-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 +40 -0
- data/Rakefile +3 -2
- data/javalib/mirah-bootstrap.jar +0 -0
- data/lib/mirah/ast.rb +22 -12
- data/lib/mirah/ast/flow.rb +28 -14
- data/lib/mirah/ast/intrinsics.rb +20 -17
- data/lib/mirah/ast/method.rb +9 -3
- data/lib/mirah/ast/scope.rb +3 -3
- data/lib/mirah/ast/structure.rb +16 -13
- data/lib/mirah/commands/base.rb +6 -2
- data/lib/mirah/jvm/compiler/java_source.rb +4 -4
- data/lib/mirah/jvm/source_generator/builder.rb +6 -0
- data/lib/mirah/jvm/types/intrinsics.rb +8 -3
- data/lib/mirah/transform/helper.rb +1 -1
- data/lib/mirah/typer/simple.rb +1 -1
- data/lib/mirah/util/argument_processor.rb +2 -2
- data/lib/mirah/util/process_errors.rb +2 -1
- data/lib/mirah/version.rb +1 -1
- data/test/core/test_ast.rb +4 -6
- data/test/core/test_commands.rb +80 -0
- data/test/core/test_compilation.rb +2 -6
- data/test/core/test_env.rb +1 -3
- data/test/core/test_macros.rb +15 -3
- data/test/core/test_typer.rb +17 -4
- data/test/jvm/bytecode_test_helper.rb +6 -7
- data/test/jvm/javac_test_helper.rb +0 -7
- data/test/jvm/test_annotations.rb +58 -0
- data/test/jvm/test_blocks.rb +62 -0
- data/test/jvm/test_jvm_compiler.rb +40 -188
- data/test/jvm/test_macros.rb +13 -0
- data/test/jvm/test_rescue.rb +152 -0
- data/test/plugins/test_gwt.rb +1 -3
- data/test/test_helper.rb +19 -0
- metadata +13 -5
data/History.txt
CHANGED
@@ -1,3 +1,43 @@
|
|
1
|
+
=== 0.0.10 / 2011-11-20
|
2
|
+
|
3
|
+
f6035d0 set version to 0.0.10
|
4
|
+
3b06353 use test_helper in gwt test
|
5
|
+
4d29eeb turns out a number of things rely on MirahCommands being truthy on success
|
6
|
+
46e6719 fixes 156 for real, also do the ant lowercase thing
|
7
|
+
9e40121 don't exit on successful compile
|
8
|
+
1155765 move comment about class loader to line it refers to
|
9
|
+
985c70f add jvm_version option to Compile ant task w/ 1.6 default
|
10
|
+
e5a60b2 replace duby with mirah in lib/mirah/ast/flow.rb
|
11
|
+
5690e6f split rescue error tests to deal w/ caching expression value
|
12
|
+
1f77ed8 add some white space, use #empty? instead of size==0
|
13
|
+
677e4aa fixes #52 by raising an inference error when types arent compat
|
14
|
+
81be877 add assert_raise_java to get around the NativeException thing
|
15
|
+
d744f44 use assert_raise instead of begin;fail/rescue
|
16
|
+
05afc6e pull out rescue tests for jvm into separate file
|
17
|
+
7a933f3 raise an inference error when method has same name as macro. fixes #123
|
18
|
+
6517a90 clean up the Block#add_methods method a bit
|
19
|
+
0a826dd ensure that a block body is created even when the block is empty
|
20
|
+
d8b0641 change duby to mirah in Binding#binding_type
|
21
|
+
47883e9 change duby to mirah in StaticScope#binding_type
|
22
|
+
8f3fddf Fix whitespace.
|
23
|
+
74b6195 use turn for prettying up test output
|
24
|
+
23d0693 add license header to test_macros
|
25
|
+
143ac6c add a test_helper to put global test config in
|
26
|
+
6fe3241 fix #149 exit 1 when there are errors
|
27
|
+
31074c6 fix #146 by not reassigning self to Builtin
|
28
|
+
8fb471e s/duby/mirah/ in jvm types intrinsics
|
29
|
+
ff06791 s/qote/quote/
|
30
|
+
972a9f9 refactor void checking on method return into method
|
31
|
+
605c377 fix #148 in the simplest way possible
|
32
|
+
f1b5c19 fix inspect_children typo
|
33
|
+
4140fa7 use case statements instead of === & if elses in UnquotedValueAssign#node
|
34
|
+
b82bbeb in Node#inspect_children, replace if elses w/ a case statement
|
35
|
+
049a4cf clean up body inference a little
|
36
|
+
d9e92b4 Merge remote branch 'thomaslee/master' into thomaslee
|
37
|
+
0c72195 fix name of compilation test
|
38
|
+
cfbf4c5 bump versions to 0.0.10{.dev,-SNAPSHOT}
|
39
|
+
8c0ecec Fix test_empty_array.
|
40
|
+
|
1
41
|
=== 0.0.9 / 2011-09-12
|
2
42
|
|
3
43
|
a5963ef use self hosted classloader fixes #144
|
data/Rakefile
CHANGED
@@ -56,6 +56,7 @@ namespace :test do
|
|
56
56
|
|
57
57
|
desc "run the core tests"
|
58
58
|
Rake::TestTask.new :core do |t|
|
59
|
+
t.libs << 'test'
|
59
60
|
t.test_files = FileList["test/core/**/test*.rb"]
|
60
61
|
java.lang.System.set_property("jruby.duby.enabled", "true")
|
61
62
|
end
|
@@ -75,7 +76,7 @@ namespace :test do
|
|
75
76
|
namespace :jvm do
|
76
77
|
desc "run jvm tests compiling to bytecode"
|
77
78
|
Rake::TestTask.new :bytecode do |t|
|
78
|
-
t.libs << 'test/jvm'
|
79
|
+
t.libs << 'test' <<'test/jvm'
|
79
80
|
t.ruby_opts.concat ["-r", "bytecode_test_helper"]
|
80
81
|
t.test_files = FileList["test/jvm/**/test*.rb"]
|
81
82
|
java.lang.System.set_property("jruby.duby.enabled", "true")
|
@@ -83,7 +84,7 @@ namespace :test do
|
|
83
84
|
|
84
85
|
desc "run jvm tests compiling to java source, then bytecode"
|
85
86
|
Rake::TestTask.new :javac do |t|
|
86
|
-
t.libs << 'test/jvm'
|
87
|
+
t.libs << 'test' <<'test/jvm'
|
87
88
|
t.ruby_opts.concat ["-r", "javac_test_helper"]
|
88
89
|
t.test_files = FileList["test/jvm/**/test*.rb"]
|
89
90
|
java.lang.System.set_property("jruby.duby.enabled", "true")
|
data/javalib/mirah-bootstrap.jar
CHANGED
Binary file
|
data/lib/mirah/ast.rb
CHANGED
@@ -160,23 +160,33 @@ module Mirah
|
|
160
160
|
extra_indent = 0
|
161
161
|
if child
|
162
162
|
name = self.class.child_name(i)
|
163
|
+
|
164
|
+
wrong_parent = lambda do |child|
|
165
|
+
if Node === child && child.parent != self
|
166
|
+
"\n#{indent_str} (wrong parent)"
|
167
|
+
else
|
168
|
+
""
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
163
172
|
if Mirah::AST.verbose && name
|
164
173
|
str << "\n#{indent_str} #{name}:"
|
165
174
|
extra_indent = 1
|
166
175
|
end
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
176
|
+
|
177
|
+
case child
|
178
|
+
when ::Array
|
179
|
+
child.each do |ary_child|
|
180
|
+
|
181
|
+
str << wrong_parent[ary_child] if Mirah::AST.verbose
|
182
|
+
|
172
183
|
str << "\n#{ary_child.inspect(indent + extra_indent + 1)}"
|
173
|
-
|
174
|
-
|
184
|
+
end
|
185
|
+
when ::Hash, ::String
|
175
186
|
str << "\n#{indent_str} #{child.inspect}"
|
176
187
|
else
|
177
|
-
if Mirah::AST.verbose
|
178
|
-
|
179
|
-
end
|
188
|
+
str << wrong_parent[child] if Mirah::AST.verbose
|
189
|
+
|
180
190
|
begin
|
181
191
|
str << "\n#{child.inspect(indent + extra_indent + 1)}"
|
182
192
|
rescue ArgumentError => ex
|
@@ -358,8 +368,8 @@ module Mirah
|
|
358
368
|
end
|
359
369
|
|
360
370
|
module Binding
|
361
|
-
def binding_type(
|
362
|
-
static_scope.binding_type(defining_class,
|
371
|
+
def binding_type(mirah=nil)
|
372
|
+
static_scope.binding_type(defining_class, mirah)
|
363
373
|
end
|
364
374
|
|
365
375
|
def binding_type=(type)
|
data/lib/mirah/ast/flow.rb
CHANGED
@@ -64,6 +64,7 @@ module Mirah
|
|
64
64
|
if expression
|
65
65
|
have_body_type = body.nil? || then_type
|
66
66
|
have_else_type = self.else.nil? || else_type
|
67
|
+
|
67
68
|
if have_body_type && have_else_type
|
68
69
|
if then_type && else_type
|
69
70
|
# both then and else inferred, ensure they're compatible
|
@@ -299,8 +300,8 @@ module Mirah
|
|
299
300
|
@inferred_type
|
300
301
|
end
|
301
302
|
|
302
|
-
def binding_type(
|
303
|
-
static_scope.parent.binding_type(defining_class,
|
303
|
+
def binding_type(mirah=nil)
|
304
|
+
static_scope.parent.binding_type(defining_class, mirah)
|
304
305
|
end
|
305
306
|
|
306
307
|
def binding_type=(type)
|
@@ -323,24 +324,37 @@ module Mirah
|
|
323
324
|
|
324
325
|
def infer(typer, expression)
|
325
326
|
unless resolved?
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
if
|
330
|
-
|
327
|
+
# TODO: generalize this s.t.
|
328
|
+
# the problem with deferred inference
|
329
|
+
# assuming expression == true is dealt with
|
330
|
+
@expression = expression if @expression == nil
|
331
|
+
expression = @expression
|
332
|
+
|
333
|
+
primary_type = if else_node
|
334
|
+
typer.infer(body, false) if body
|
335
|
+
typer.infer(else_node, expression)
|
331
336
|
elsif body
|
332
|
-
|
337
|
+
typer.infer(body, expression)
|
333
338
|
end
|
334
|
-
|
339
|
+
|
340
|
+
clause_types = clauses.map {|c| typer.infer(c, expression)}
|
341
|
+
types = []
|
342
|
+
types << primary_type if primary_type
|
343
|
+
types += clause_types
|
335
344
|
if types.any? {|t| t.nil?}
|
336
345
|
typer.defer(self)
|
337
346
|
else
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
347
|
+
if !expression || clause_types.all?{ |t| primary_type.compatible? t}
|
348
|
+
resolved!
|
349
|
+
types.each do |type|
|
350
|
+
@inferred_type ||= type unless type.unreachable?
|
351
|
+
end
|
352
|
+
@inferred_type ||= primary_type
|
353
|
+
else
|
354
|
+
clause, clause_type = clauses.zip(clause_types).find{ |clause, t| !primary_type.compatible? t }
|
355
|
+
|
356
|
+
raise Mirah::Typer::InferenceError.new("rescue statement with incompatible result types #{primary_type} and #{clause_type}", clause)
|
342
357
|
end
|
343
|
-
@inferred_type ||= types[0]
|
344
358
|
end
|
345
359
|
end
|
346
360
|
@inferred_type
|
data/lib/mirah/ast/intrinsics.rb
CHANGED
@@ -51,19 +51,19 @@ module Mirah::AST
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.__extracted
|
54
|
-
Thread.current[:'Mirah::AST::
|
54
|
+
Thread.current[:'Mirah::AST::Unquote.extracted']
|
55
55
|
end
|
56
56
|
|
57
57
|
def self.__extracted=(value)
|
58
|
-
Thread.current[:'Mirah::AST::
|
58
|
+
Thread.current[:'Mirah::AST::Unquote.extracted'] = value
|
59
59
|
end
|
60
60
|
|
61
61
|
def self.__injected
|
62
|
-
Thread.current[:'Mirah::AST::
|
62
|
+
Thread.current[:'Mirah::AST::Unquote.injected']
|
63
63
|
end
|
64
64
|
|
65
65
|
def self.__injected=(value)
|
66
|
-
Thread.current[:'Mirah::AST::
|
66
|
+
Thread.current[:'Mirah::AST::Unquote.injected'] = value
|
67
67
|
end
|
68
68
|
|
69
69
|
def self.extract_values
|
@@ -212,27 +212,30 @@ module Mirah::AST
|
|
212
212
|
else
|
213
213
|
name_node = self.name_node
|
214
214
|
end
|
215
|
+
|
215
216
|
klass = LocalAssignment
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
217
|
+
name = case name_node
|
218
|
+
when Field
|
219
|
+
# TODO support AttrAssign
|
220
|
+
klass = FieldAssignment
|
221
|
+
name_node.name
|
222
|
+
when Named
|
223
|
+
name_node.name
|
224
|
+
when String
|
225
|
+
name_node.literal
|
226
|
+
else
|
227
|
+
raise "Bad unquote value"
|
228
|
+
end
|
229
|
+
|
229
230
|
if name[0] == ?@
|
230
231
|
name = name[1, name.length]
|
231
232
|
klass = FieldAssignment
|
232
233
|
end
|
234
|
+
|
233
235
|
n = klass.new(nil, position, name)
|
234
236
|
n << value
|
235
237
|
n.validate_children
|
238
|
+
|
236
239
|
if scope
|
237
240
|
scope.children.clear
|
238
241
|
scope << n
|
data/lib/mirah/ast/method.rb
CHANGED
@@ -255,6 +255,7 @@ module Mirah::AST
|
|
255
255
|
end
|
256
256
|
signature[:return] = @return_type.type_reference(typer)
|
257
257
|
end
|
258
|
+
|
258
259
|
if @exceptions
|
259
260
|
signature[:throws] = @exceptions.map {|e| e.type_reference(typer)}
|
260
261
|
end
|
@@ -264,11 +265,16 @@ module Mirah::AST
|
|
264
265
|
inferred_type = body ? typer.infer(body, body_is_expression) : typer.no_type
|
265
266
|
|
266
267
|
if inferred_type && arguments.inferred_type.all?
|
267
|
-
actual_type = if forced_type
|
268
|
-
inferred_type
|
269
|
-
else
|
268
|
+
actual_type = if forced_type
|
270
269
|
forced_type
|
270
|
+
else
|
271
|
+
inferred_type
|
272
|
+
end
|
273
|
+
|
274
|
+
if actual_type.kind_of? Mirah::AST::InlineCode
|
275
|
+
raise Mirah::Typer::InferenceError.new("Method %s has the same signature as macro of the same name." % name,self)
|
271
276
|
end
|
277
|
+
|
272
278
|
if actual_type.unreachable?
|
273
279
|
actual_type = typer.no_type
|
274
280
|
end
|
data/lib/mirah/ast/scope.rb
CHANGED
@@ -156,12 +156,12 @@ module Mirah
|
|
156
156
|
@self_node
|
157
157
|
end
|
158
158
|
|
159
|
-
def binding_type(defining_class=nil,
|
159
|
+
def binding_type(defining_class=nil, mirah=nil)
|
160
160
|
@binding_type ||= begin
|
161
161
|
if parent
|
162
|
-
parent.binding_type(defining_class,
|
162
|
+
parent.binding_type(defining_class, mirah)
|
163
163
|
else
|
164
|
-
name = "#{defining_class.name}$#{
|
164
|
+
name = "#{defining_class.name}$#{mirah.tmp}"
|
165
165
|
factory = Mirah::AST.type_factory
|
166
166
|
if factory
|
167
167
|
factory.declare_type(@scope_node, name)
|
data/lib/mirah/ast/structure.rb
CHANGED
@@ -26,14 +26,14 @@ module Mirah::AST
|
|
26
26
|
unless @inferred_type
|
27
27
|
@typer ||= typer
|
28
28
|
@self_type ||= typer.self_type
|
29
|
-
|
29
|
+
|
30
|
+
if children.empty?
|
30
31
|
@inferred_type = typer.no_type
|
31
32
|
else
|
32
|
-
|
33
|
-
|
34
|
-
child_is_expression = (i == last && expression)
|
35
|
-
@inferred_type = typer.infer(child, child_is_expression)
|
33
|
+
children[0..-2].each do |child|
|
34
|
+
typer.infer(child, false)
|
36
35
|
end
|
36
|
+
@inferred_type = typer.infer(children.last, expression)
|
37
37
|
end
|
38
38
|
|
39
39
|
if @inferred_type
|
@@ -175,16 +175,19 @@ module Mirah::AST
|
|
175
175
|
end
|
176
176
|
|
177
177
|
def add_methods(klass, binding, typer)
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
178
|
+
method_definitions = body.select{ |node| node.kind_of? MethodDefinition }
|
179
|
+
|
180
|
+
if method_definitions.empty?
|
181
|
+
build_method(klass, binding, typer)
|
182
|
+
else
|
183
|
+
# TODO warn if there are non method definition nodes
|
184
|
+
# they won't be used at all currently--so it'd be nice to note that.
|
185
|
+
method_definitions.each do |node|
|
182
186
|
node.static_scope = static_scope
|
183
187
|
node.binding_type = binding
|
184
188
|
klass.append_node(node)
|
185
189
|
end
|
186
190
|
end
|
187
|
-
build_method(klass, binding, typer) unless found_def
|
188
191
|
end
|
189
192
|
|
190
193
|
def build_method(klass, binding, typer)
|
@@ -338,13 +341,13 @@ module Mirah::AST
|
|
338
341
|
case node
|
339
342
|
when String
|
340
343
|
java.lang.String.new(node.literal)
|
344
|
+
when Fixnum
|
345
|
+
java.lang.Integer.new(node.literal)
|
341
346
|
when Array
|
342
347
|
node.children.map {|node| annotation_value(node, typer)}
|
343
348
|
else
|
344
349
|
# TODO Support other types
|
345
|
-
|
346
|
-
desc = BiteScript::Signature.class_id(ref)
|
347
|
-
BiteScript::ASM::Type.getType(desc)
|
350
|
+
raise "Unsupported Annotation Value Type"
|
348
351
|
end
|
349
352
|
end
|
350
353
|
end
|
data/lib/mirah/commands/base.rb
CHANGED
@@ -34,8 +34,8 @@ module Mirah
|
|
34
34
|
def execute_base
|
35
35
|
# because MirahCommand is a JRuby Java class, SystemExit bubbles through and makes noise
|
36
36
|
# so we use a catch/throw to early exit instead
|
37
|
-
# see process_errors.rb
|
38
|
-
catch(:exit) do
|
37
|
+
# see util/process_errors.rb
|
38
|
+
status = catch(:exit) do
|
39
39
|
begin
|
40
40
|
argument_processor.process
|
41
41
|
yield
|
@@ -46,8 +46,12 @@ module Mirah
|
|
46
46
|
rescue Mirah::MirahError => ex
|
47
47
|
Mirah.print_error(ex.message, ex.position)
|
48
48
|
puts ex.backtrace if state.verbose
|
49
|
+
throw :exit, 1
|
49
50
|
end
|
51
|
+
0
|
50
52
|
end
|
53
|
+
exit status if status > 0
|
54
|
+
true
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
@@ -75,7 +75,7 @@ module Mirah
|
|
75
75
|
|
76
76
|
prepare_binding(node) do
|
77
77
|
declare_locals(node.static_scope)
|
78
|
-
unless
|
78
|
+
unless method.returns_void?
|
79
79
|
self.return(ImplicitReturn.new(node.body))
|
80
80
|
else
|
81
81
|
node.body.compile(self, false) if node.body
|
@@ -87,7 +87,7 @@ module Mirah
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
def annotate(node, annotations)
|
92
92
|
node.annotate(annotations)
|
93
93
|
end
|
@@ -95,7 +95,7 @@ module Mirah
|
|
95
95
|
def define_optarg_chain(name, arg, return_type,
|
96
96
|
args_for_opt, arg_types_for_opt)
|
97
97
|
# declare all args so they get their values
|
98
|
-
@method.print "return " unless
|
98
|
+
@method.print "return " unless method.returns_void?
|
99
99
|
@method.print "this." unless @static
|
100
100
|
@method.print "#{name}("
|
101
101
|
@method.print args_for_opt.map(&:name).join(', ')
|
@@ -164,7 +164,7 @@ module Mirah
|
|
164
164
|
end
|
165
165
|
|
166
166
|
def return(node)
|
167
|
-
if
|
167
|
+
if method.returns_void?
|
168
168
|
@method.puts 'return;'
|
169
169
|
return
|
170
170
|
end
|
@@ -157,6 +157,8 @@ module Mirah
|
|
157
157
|
|
158
158
|
def annotation_value(value)
|
159
159
|
case value
|
160
|
+
when Java::JavaLang::Integer
|
161
|
+
value.to_s
|
160
162
|
when Java::JavaLang::String, String
|
161
163
|
value.to_s.inspect
|
162
164
|
when Array
|
@@ -394,6 +396,10 @@ module Mirah
|
|
394
396
|
dedent
|
395
397
|
puts "}"
|
396
398
|
end
|
399
|
+
|
400
|
+
def returns_void?
|
401
|
+
type.nil? || type.void?
|
402
|
+
end
|
397
403
|
|
398
404
|
def declare_local(type, name, initialize=true)
|
399
405
|
unless @locals[name]
|