mirah 0.0.6-java → 0.0.7-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/bin/duby CHANGED
File without changes
data/bin/dubyc CHANGED
File without changes
data/bin/dubyp CHANGED
File without changes
data/bin/jrubyp CHANGED
File without changes
data/bin/mirah CHANGED
File without changes
data/bin/mirahc CHANGED
File without changes
data/bin/mirahp CHANGED
File without changes
data/examples/fib.mirah CHANGED
@@ -13,7 +13,7 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- def fib(a:int)
16
+ def fib(a:int):int
17
17
  if a < 2
18
18
  a
19
19
  else
data/examples/tak.mirah CHANGED
@@ -13,7 +13,7 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- def tak(x:fixnum, y:fixnum, z:fixnum)
16
+ def tak(x:int, y:int, z:int):int
17
17
  unless y < x
18
18
  z
19
19
  else
File without changes
File without changes
@@ -277,7 +277,7 @@ module Mirah::AST
277
277
  Mirah::AST.type_factory = new_factory
278
278
  ast = build_ast(name, parent, transformer)
279
279
  classes = compile_ast(name, ast, transformer)
280
- loader = MirahClassLoader.new(
280
+ loader = Mirah::ClassLoader.new(
281
281
  JRuby.runtime.jruby_class_loader, classes)
282
282
  klass = loader.loadClass(name, true)
283
283
  if state.save_extensions
@@ -188,7 +188,10 @@ module Mirah::AST
188
188
  # find all methods which would not otherwise be on java.lang.Object
189
189
  impl_methods = find_methods(klass.interfaces).select do |m|
190
190
  begin
191
- obj_m = java.lang.Object.java_class.java_method m.name, *m.parameter_types
191
+ # Very cumbersome. Not sure how it got this way.
192
+ mirror = BiteScript::ASM::ClassMirror.for_name('java.lang.Object')
193
+ mtype = Mirah::JVM::Types::Type.new(mirror)
194
+ mtype.java_method m.name, *m.argument_types
192
195
  rescue NameError
193
196
  # not found on Object
194
197
  next true
@@ -0,0 +1,35 @@
1
+ # This is a custom classloader impl to allow loading classes with
2
+ # interdependencies by having findClass retrieve classes as needed from the
3
+ # collection of all classes generated by the target script.
4
+ module Mirah
5
+ class ClassLoader < java::security::SecureClassLoader
6
+ def initialize(parent, class_map)
7
+ super(parent)
8
+ @class_map = class_map
9
+ end
10
+
11
+ def findClass(name)
12
+ if @class_map[name]
13
+ bytes = @class_map[name].to_java_bytes
14
+ defineClass(name, bytes, 0, bytes.length)
15
+ else
16
+ raise java.lang.ClassNotFoundException.new(name)
17
+ end
18
+ end
19
+
20
+ def loadClass(name, resolve)
21
+ cls = findLoadedClass(name)
22
+ if cls == nil
23
+ if @class_map[name]
24
+ cls = findClass(name)
25
+ else
26
+ cls = super(name, false)
27
+ end
28
+ end
29
+
30
+ resolveClass(cls) if resolve
31
+
32
+ cls
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,28 @@
1
+ module Mirah
2
+ class CompilationState
3
+ def initialize
4
+ BiteScript.bytecode_version = BiteScript::JAVA1_5
5
+ @save_extensions = true
6
+ end
7
+
8
+ attr_accessor :verbose, :destination
9
+ attr_accessor :version_printed
10
+ attr_accessor :help_printed
11
+ attr_accessor :save_extensions
12
+
13
+ def set_jvm_version(ver_str)
14
+ case ver_str
15
+ when '1.4'
16
+ BiteScript.bytecode_version = BiteScript::JAVA1_4
17
+ when '1.5'
18
+ BiteScript.bytecode_version = BiteScript::JAVA1_5
19
+ when '1.6'
20
+ BiteScript.bytecode_version = BiteScript::JAVA1_6
21
+ when '1.7'
22
+ BiteScript.bytecode_version = BiteScript::JAVA1_7
23
+ else
24
+ $stderr.puts "invalid bytecode version specified: #{ver_str}"
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/mirah/impl.rb ADDED
@@ -0,0 +1,273 @@
1
+ module Mirah
2
+ class Impl
3
+ def initialize
4
+ Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
5
+ @running = false
6
+ end
7
+
8
+ def running?
9
+ @running
10
+ end
11
+
12
+ def run(*args)
13
+ main = nil
14
+ class_map = {}
15
+
16
+ # we're running!
17
+ @running = true
18
+
19
+ # generate all bytes for all classes
20
+ generate(args) do |outfile, builder|
21
+ bytes = builder.generate
22
+ name = builder.class_name.gsub(/\//, '.')
23
+ class_map[name] = bytes
24
+ end
25
+
26
+ # load all classes
27
+ dcl = Mirah::ClassLoader.new(JRuby.runtime.jruby_class_loader, class_map)
28
+ class_map.each do |name,|
29
+ cls = dcl.load_class(name)
30
+ # TODO: using first main; find correct one
31
+ main ||= cls.get_method("main", java::lang::String[].java_class) #rescue nil
32
+ end
33
+
34
+ # run the main method we found
35
+ if main
36
+ begin
37
+ main.invoke(nil, [args.to_java(:string)].to_java)
38
+ rescue java.lang.Exception => e
39
+ e = e.cause if e.cause
40
+ raise e
41
+ end
42
+ else
43
+ puts "No main found" unless @state.version_printed || @state.help_printed
44
+ end
45
+ rescue Mirah::InternalCompilerError => ice
46
+ Mirah.print_error(ice.message, ice.position) if ice.node
47
+ raise ice
48
+ rescue Mirah::MirahError => ex
49
+ Mirah.print_error(ex.message, ex.position)
50
+ puts ex.backtrace if @state.verbose
51
+ end
52
+
53
+ def compile(*args)
54
+ generate(args) do |filename, builder|
55
+ filename = "#{@state.destination}#{filename}"
56
+ FileUtils.mkdir_p(File.dirname(filename))
57
+ bytes = builder.generate
58
+ File.open(filename, 'wb') {|f| f.write(bytes)}
59
+ end
60
+ rescue Mirah::InternalCompilerError => ice
61
+ Mirah.print_error(ice.message, ice.position) if ice.position
62
+ puts "error on #{ice.node}(#{ice.node.object_id})"
63
+ raise ice
64
+ rescue Mirah::MirahError => ex
65
+ Mirah.print_error(ex.message, ex.position)
66
+ puts ex.backtrace if @state.verbose
67
+ end
68
+
69
+ def generate(args, &block)
70
+ process_flags!(args)
71
+
72
+ # collect all ASTs from all files
73
+ all_nodes = []
74
+ puts "Parsing..." unless running?
75
+ expand_files(args).each do |duby_file|
76
+ if duby_file == '-e'
77
+ @filename = '-e'
78
+ next
79
+ elsif @filename == '-e'
80
+ puts " <inline script>" unless running?
81
+ all_nodes << parse('-e', duby_file)
82
+ else
83
+ puts " #{duby_file}" unless running?
84
+ all_nodes << parse(duby_file)
85
+ end
86
+ @filename = nil
87
+ exit 1 if @error
88
+ end
89
+
90
+ # enter all ASTs into inference engine
91
+ puts "Inferring types..." unless running?
92
+ infer_asts(all_nodes)
93
+
94
+ # compile each AST in turn
95
+ puts "Compiling..." unless running?
96
+ all_nodes.each do |ast|
97
+ puts " #{ast.position.file}" unless running?
98
+ compile_ast(ast, &block)
99
+ end
100
+
101
+ puts "Done!" unless running?
102
+ end
103
+
104
+ def parse(*args)
105
+ process_flags!(args)
106
+ @filename = args.shift
107
+
108
+ if @filename
109
+ if @filename == '-e'
110
+ @filename = 'DashE'
111
+ src = args[0]
112
+ else
113
+ src = File.read(@filename)
114
+ end
115
+ else
116
+ print_help
117
+ exit(1)
118
+ end
119
+ begin
120
+ ast = Mirah::AST.parse_ruby(src, @filename)
121
+ # rescue org.jrubyparser.lexer.SyntaxException => ex
122
+ # Mirah.print_error(ex.message, ex.position)
123
+ # raise ex if @state.verbose
124
+ end
125
+ @transformer = Mirah::Transform::Transformer.new(@state)
126
+ Java::MirahImpl::Builtin.initialize_builtins(@transformer)
127
+ @transformer.filename = @filename
128
+ ast = @transformer.transform(ast, nil)
129
+ @transformer.errors.each do |ex|
130
+ Mirah.print_error(ex.message, ex.position)
131
+ raise ex.cause || ex if @state.verbose
132
+ end
133
+ @error = @transformer.errors.size > 0
134
+
135
+ ast
136
+ rescue Mirah::InternalCompilerError => ice
137
+ Mirah.print_error(ice.message, ice.position) if ice.node
138
+ raise ice
139
+ rescue Mirah::MirahError => ex
140
+ Mirah.print_error(ex.message, ex.position)
141
+ puts ex.backtrace if @state.verbose
142
+ end
143
+
144
+ def infer_asts(asts)
145
+ typer = Mirah::Typer::JVM.new(@transformer)
146
+ asts.each {|ast| typer.infer(ast, true) }
147
+ begin
148
+ typer.resolve(false)
149
+ ensure
150
+ puts asts.inspect if @state.verbose
151
+
152
+ failed = !typer.errors.empty?
153
+ if failed
154
+ puts "Inference Error:"
155
+ typer.errors.each do |ex|
156
+ if ex.node
157
+ Mirah.print_error(ex.message, ex.position)
158
+ else
159
+ puts ex.message
160
+ end
161
+ puts ex.backtrace if @state.verbose
162
+ end
163
+ exit 1
164
+ end
165
+ end
166
+ end
167
+
168
+ def compile_ast(ast, &block)
169
+ compiler = @compiler_class.new
170
+ ast.compile(compiler, false)
171
+ compiler.generate(&block)
172
+ end
173
+
174
+ def process_flags!(args)
175
+ @state ||= Mirah::CompilationState.new
176
+ while args.length > 0 && args[0] =~ /^-/
177
+ case args[0]
178
+ when '--classpath', '-c'
179
+ args.shift
180
+ Mirah::Env.decode_paths(args.shift, $CLASSPATH)
181
+ when '--cd'
182
+ args.shift
183
+ Dir.chdir(args.shift)
184
+ when '--dest', '-d'
185
+ args.shift
186
+ @state.destination = File.join(File.expand_path(args.shift), '')
187
+ when '-e'
188
+ break
189
+ when '--explicit-packages'
190
+ args.shift
191
+ Mirah::AST::Script.explicit_packages = true
192
+ when '--help', '-h'
193
+ print_help
194
+ args.clear
195
+ when '--java', '-j'
196
+ require 'mirah/jvm/source_compiler'
197
+ @compiler_class = Mirah::Compiler::JavaSource
198
+ args.shift
199
+ when '--jvm'
200
+ args.shift
201
+ @state.set_jvm_version(args.shift)
202
+ when '-I'
203
+ args.shift
204
+ $: << args.shift
205
+ when '--plugin', '-p'
206
+ args.shift
207
+ plugin = args.shift
208
+ require "mirah/plugin/#{plugin}"
209
+ when '--verbose', '-V'
210
+ Mirah::Typer.verbose = true
211
+ Mirah::AST.verbose = true
212
+ Mirah::Compiler::JVM.verbose = true
213
+ @state.verbose = true
214
+ args.shift
215
+ when '--version', '-v'
216
+ args.shift
217
+ print_version
218
+ when '--no-save-extensions'
219
+ args.shift
220
+ @state.save_extensions = false
221
+ else
222
+ puts "unrecognized flag: " + args[0]
223
+ print_help
224
+ args.clear
225
+ end
226
+ end
227
+ @state.destination ||= File.join(File.expand_path('.'), '')
228
+ @compiler_class ||= Mirah::Compiler::JVM
229
+ end
230
+
231
+ def print_help
232
+ puts "#{$0} [flags] <files or -e SCRIPT>
233
+ -c, --classpath PATH\tAdd PATH to the Java classpath for compilation
234
+ --cd DIR\t\tSwitch to the specified DIR befor compilation
235
+ -d, --dir DIR\t\tUse DIR as the base dir for compilation, packages
236
+ -e CODE\t\tCompile or run the inline script following -e
237
+ \t\t\t (the class will be named \"DashE\")
238
+ --explicit-packages\tRequire explicit 'package' lines in source
239
+ -h, --help\t\tPrint this help message
240
+ -I DIR\t\tAdd DIR to the Ruby load path before running
241
+ -j, --java\t\tOutput .java source (compile mode only)
242
+ --jvm VERSION\t\tEmit JVM bytecode targeting specified JVM
243
+ \t\t\t version (1.4, 1.5, 1.6, 1.7)
244
+ -p, --plugin PLUGIN\trequire 'mirah/plugin/PLUGIN' before running
245
+ -v, --version\t\tPrint the version of Mirah to the console
246
+ -V, --verbose\t\tVerbose logging"
247
+ @state.help_printed = true
248
+ end
249
+
250
+ def print_version
251
+ puts "Mirah v#{Mirah::VERSION}"
252
+ @state.version_printed = true
253
+ end
254
+
255
+ def expand_files(files)
256
+ expanded = []
257
+ files.each do |filename|
258
+ if File.directory?(filename)
259
+ Dir[File.join(filename, '*')].each do |child|
260
+ if File.directory?(child)
261
+ files << child
262
+ elsif child =~ /\.(duby|mirah)$/
263
+ expanded << child
264
+ end
265
+ end
266
+ else
267
+ expanded << filename
268
+ end
269
+ end
270
+ expanded
271
+ end
272
+ end
273
+ end
@@ -336,7 +336,7 @@ module Mirah
336
336
  class ArrayMetaType < MetaType; end
337
337
 
338
338
  class DynamicType < Type
339
- ObjectType = Type.new('java.lang.Object')
339
+ ObjectType = Type.new(BiteScript::ASM::ClassMirror.for_name('java.lang.Object'))
340
340
 
341
341
  def initialize
342
342
  # For naming, bytecode purposes, we are an Object
@@ -358,10 +358,22 @@ module Mirah
358
358
  def jvm_type
359
359
  java.lang.Object
360
360
  end
361
+
362
+ def full_name
363
+ "dynamic"
364
+ end
361
365
 
362
366
  def dynamic?
363
367
  true
364
368
  end
369
+
370
+ def superclass
371
+ ObjectType.superclass
372
+ end
373
+
374
+ def interfaces
375
+ ObjectType.interfaces
376
+ end
365
377
  end
366
378
 
367
379
  class TypeDefinition < Type
data/lib/mirah/version.rb CHANGED
@@ -14,5 +14,5 @@
14
14
  # limitations under the License.
15
15
 
16
16
  module Mirah
17
- VERSION = "0.0.6"
17
+ VERSION = "0.0.7"
18
18
  end
data/lib/mirah.rb CHANGED
@@ -22,6 +22,7 @@ require 'mirah/typer'
22
22
  require 'mirah/compiler'
23
23
  require 'mirah/env'
24
24
  require 'mirah/errors'
25
+ require 'mirah/class_loader'
25
26
  begin
26
27
  require 'bitescript'
27
28
  rescue LoadError
@@ -31,19 +32,21 @@ end
31
32
  require 'mirah/jvm/compiler'
32
33
  require 'mirah/jvm/typer'
33
34
  Dir[File.dirname(__FILE__) + "/mirah/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
35
+ require 'mirah/impl'
36
+ require 'mirah/compilation_state'
34
37
  require 'jruby'
35
38
 
36
39
  module Mirah
37
40
  def self.run(*args)
38
- MirahImpl.new.run(*args)
41
+ Impl.new.run(*args)
39
42
  end
40
43
 
41
44
  def self.compile(*args)
42
- MirahImpl.new.compile(*args)
45
+ Impl.new.compile(*args)
43
46
  end
44
47
 
45
48
  def self.parse(*args)
46
- MirahImpl.new.parse(*args)
49
+ Impl.new.parse(*args)
47
50
  end
48
51
 
49
52
  def self.plugins
@@ -85,323 +88,6 @@ module Mirah
85
88
  end
86
89
  end
87
90
  end
88
-
89
- class CompilationState
90
- def initialize
91
- BiteScript.bytecode_version = BiteScript::JAVA1_5
92
- @save_extensions = true
93
- end
94
-
95
- attr_accessor :verbose, :destination
96
- attr_accessor :version_printed
97
- attr_accessor :help_printed
98
- attr_accessor :save_extensions
99
-
100
- def set_jvm_version(ver_str)
101
- case ver_str
102
- when '1.4'
103
- BiteScript.bytecode_version = BiteScript::JAVA1_4
104
- when '1.5'
105
- BiteScript.bytecode_version = BiteScript::JAVA1_5
106
- when '1.6'
107
- BiteScript.bytecode_version = BiteScript::JAVA1_6
108
- when '1.7'
109
- BiteScript.bytecode_version = BiteScript::JAVA1_7
110
- else
111
- $stderr.puts "invalid bytecode version specified: #{ver_str}"
112
- end
113
- end
114
- end
115
- end
116
-
117
- # This is a custom classloader impl to allow loading classes with
118
- # interdependencies by having findClass retrieve classes as needed from the
119
- # collection of all classes generated by the target script.
120
- class MirahClassLoader < java::security::SecureClassLoader
121
- def initialize(parent, class_map)
122
- super(parent)
123
- @class_map = class_map
124
- end
125
-
126
- def findClass(name)
127
- if @class_map[name]
128
- bytes = @class_map[name].to_java_bytes
129
- defineClass(name, bytes, 0, bytes.length)
130
- else
131
- raise java.lang.ClassNotFoundException.new(name)
132
- end
133
- end
134
-
135
- def loadClass(name, resolve)
136
- cls = findLoadedClass(name)
137
- if cls == nil
138
- if @class_map[name]
139
- cls = findClass(name)
140
- else
141
- cls = super(name, false)
142
- end
143
- end
144
-
145
- resolveClass(cls) if resolve
146
-
147
- cls
148
- end
149
- end
150
-
151
- class MirahImpl
152
- def initialize
153
- Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
154
- end
155
-
156
- def run(*args)
157
- main = nil
158
- class_map = {}
159
-
160
- # generate all bytes for all classes
161
- generate(args) do |outfile, builder|
162
- bytes = builder.generate
163
- name = builder.class_name.gsub(/\//, '.')
164
- class_map[name] = bytes
165
- end
166
-
167
- # load all classes
168
- dcl = MirahClassLoader.new(JRuby.runtime.jruby_class_loader, class_map)
169
- class_map.each do |name,|
170
- cls = dcl.load_class(name)
171
- # TODO: using first main; find correct one
172
- main ||= cls.get_method("main", java::lang::String[].java_class) #rescue nil
173
- end
174
-
175
- # run the main method we found
176
- if main
177
- begin
178
- main.invoke(nil, [args.to_java(:string)].to_java)
179
- rescue java.lang.Exception => e
180
- e = e.cause if e.cause
181
- raise e
182
- end
183
- else
184
- puts "No main found" unless @state.version_printed || @state.help_printed
185
- end
186
- rescue Mirah::InternalCompilerError => ice
187
- Mirah.print_error(ice.message, ice.position) if ice.node
188
- raise ice
189
- rescue Mirah::MirahError => ex
190
- Mirah.print_error(ex.message, ex.position)
191
- puts ex.backtrace if @state.verbose
192
- end
193
-
194
- def compile(*args)
195
- generate(args) do |filename, builder|
196
- filename = "#{@state.destination}#{filename}"
197
- FileUtils.mkdir_p(File.dirname(filename))
198
- bytes = builder.generate
199
- File.open(filename, 'wb') {|f| f.write(bytes)}
200
- end
201
- rescue Mirah::InternalCompilerError => ice
202
- Mirah.print_error(ice.message, ice.position) if ice.position
203
- puts "error on #{ice.node}(#{ice.node.object_id})"
204
- raise ice
205
- rescue Mirah::MirahError => ex
206
- Mirah.print_error(ex.message, ex.position)
207
- puts ex.backtrace if @state.verbose
208
- end
209
-
210
- def generate(args, &block)
211
- process_flags!(args)
212
-
213
- # collect all ASTs from all files
214
- all_nodes = []
215
- expand_files(args).each do |duby_file|
216
- if duby_file == '-e'
217
- @filename = '-e'
218
- next
219
- elsif @filename == '-e'
220
- all_nodes << parse('-e', duby_file)
221
- else
222
- all_nodes << parse(duby_file)
223
- end
224
- @filename = nil
225
- exit 1 if @error
226
- end
227
-
228
- # enter all ASTs into inference engine
229
- infer_asts(all_nodes)
230
-
231
- # compile each AST in turn
232
- all_nodes.each do |ast|
233
- compile_ast(ast, &block)
234
- end
235
- end
236
-
237
- def parse(*args)
238
- process_flags!(args)
239
- @filename = args.shift
240
-
241
- if @filename
242
- if @filename == '-e'
243
- @filename = 'DashE'
244
- src = args[0]
245
- else
246
- src = File.read(@filename)
247
- end
248
- else
249
- print_help
250
- exit(1)
251
- end
252
- begin
253
- ast = Mirah::AST.parse_ruby(src, @filename)
254
- # rescue org.jrubyparser.lexer.SyntaxException => ex
255
- # Mirah.print_error(ex.message, ex.position)
256
- # raise ex if @state.verbose
257
- end
258
- @transformer = Mirah::Transform::Transformer.new(@state)
259
- Java::MirahImpl::Builtin.initialize_builtins(@transformer)
260
- @transformer.filename = @filename
261
- ast = @transformer.transform(ast, nil)
262
- @transformer.errors.each do |ex|
263
- Mirah.print_error(ex.message, ex.position)
264
- raise ex.cause || ex if @state.verbose
265
- end
266
- @error = @transformer.errors.size > 0
267
-
268
- ast
269
- rescue Mirah::InternalCompilerError => ice
270
- Mirah.print_error(ice.message, ice.position) if ice.node
271
- raise ice
272
- rescue Mirah::MirahError => ex
273
- Mirah.print_error(ex.message, ex.position)
274
- puts ex.backtrace if @state.verbose
275
- end
276
-
277
- def infer_asts(asts)
278
- typer = Mirah::Typer::JVM.new(@transformer)
279
- asts.each {|ast| typer.infer(ast, true) }
280
- begin
281
- typer.resolve(false)
282
- ensure
283
- puts asts.inspect if @state.verbose
284
-
285
- failed = !typer.errors.empty?
286
- if failed
287
- puts "Inference Error:"
288
- typer.errors.each do |ex|
289
- if ex.node
290
- Mirah.print_error(ex.message, ex.position)
291
- else
292
- puts ex.message
293
- end
294
- puts ex.backtrace if @state.verbose
295
- end
296
- exit 1
297
- end
298
- end
299
- end
300
-
301
- def compile_ast(ast, &block)
302
- compiler = @compiler_class.new
303
- ast.compile(compiler, false)
304
- compiler.generate(&block)
305
- end
306
-
307
- def process_flags!(args)
308
- @state ||= Mirah::CompilationState.new
309
- while args.length > 0 && args[0] =~ /^-/
310
- case args[0]
311
- when '--classpath', '-c'
312
- args.shift
313
- Mirah::Env.decode_paths(args.shift, $CLASSPATH)
314
- when '--cd'
315
- args.shift
316
- Dir.chdir(args.shift)
317
- when '--dest', '-d'
318
- args.shift
319
- @state.destination = File.join(File.expand_path(args.shift), '')
320
- when '-e'
321
- break
322
- when '--explicit-packages'
323
- args.shift
324
- Mirah::AST::Script.explicit_packages = true
325
- when '--help', '-h'
326
- print_help
327
- args.clear
328
- when '--java', '-j'
329
- require 'mirah/jvm/source_compiler'
330
- @compiler_class = Mirah::Compiler::JavaSource
331
- args.shift
332
- when '--jvm'
333
- args.shift
334
- @state.set_jvm_version(args.shift)
335
- when '-I'
336
- args.shift
337
- $: << args.shift
338
- when '--plugin', '-p'
339
- args.shift
340
- plugin = args.shift
341
- require "mirah/plugin/#{plugin}"
342
- when '--verbose', '-V'
343
- Mirah::Typer.verbose = true
344
- Mirah::AST.verbose = true
345
- Mirah::Compiler::JVM.verbose = true
346
- @state.verbose = true
347
- args.shift
348
- when '--version', '-v'
349
- args.shift
350
- print_version
351
- when '--no-save-extensions'
352
- args.shift
353
- @state.save_extensions = false
354
- else
355
- puts "unrecognized flag: " + args[0]
356
- print_help
357
- args.clear
358
- end
359
- end
360
- @state.destination ||= File.join(File.expand_path('.'), '')
361
- @compiler_class ||= Mirah::Compiler::JVM
362
- end
363
-
364
- def print_help
365
- puts "#{$0} [flags] <files or -e SCRIPT>
366
- -c, --classpath PATH\tAdd PATH to the Java classpath for compilation
367
- --cd DIR\t\tSwitch to the specified DIR befor compilation
368
- -d, --dir DIR\t\tUse DIR as the base dir for compilation, packages
369
- -e CODE\t\tCompile or run the inline script following -e
370
- \t\t\t (the class will be named \"DashE\")
371
- --explicit-packages\tRequire explicit 'package' lines in source
372
- -h, --help\t\tPrint this help message
373
- -I DIR\t\tAdd DIR to the Ruby load path before running
374
- -j, --java\t\tOutput .java source (compile mode only)
375
- --jvm VERSION\t\tEmit JVM bytecode targeting specified JVM
376
- \t\t\t version (1.4, 1.5, 1.6, 1.7)
377
- -p, --plugin PLUGIN\trequire 'mirah/plugin/PLUGIN' before running
378
- -v, --version\t\tPrint the version of Mirah to the console
379
- -V, --verbose\t\tVerbose logging"
380
- @state.help_printed = true
381
- end
382
-
383
- def print_version
384
- puts "Mirah v#{Mirah::VERSION}"
385
- @state.version_printed = true
386
- end
387
-
388
- def expand_files(files)
389
- expanded = []
390
- files.each do |filename|
391
- if File.directory?(filename)
392
- Dir[File.join(filename, '*')].each do |child|
393
- if File.directory?(child)
394
- files << child
395
- elsif child =~ /\.(duby|mirah)$/
396
- expanded << child
397
- end
398
- end
399
- else
400
- expanded << filename
401
- end
402
- end
403
- expanded
404
- end
405
91
  end
406
92
 
407
93
  if __FILE__ == $0
@@ -16,10 +16,7 @@
16
16
  $:.unshift File.join(File.dirname(__FILE__),'..','lib')
17
17
 
18
18
  require 'test/unit'
19
- require 'mirah/typer'
20
- require 'mirah/plugin/java'
21
- require 'mirah/jvm/compiler'
22
- require 'mirah/jvm/typer'
19
+ require 'mirah'
23
20
 
24
21
  class TestJavaTyper < Test::Unit::TestCase
25
22
  include Mirah
@@ -205,4 +202,12 @@ class TestJavaTyper < Test::Unit::TestCase
205
202
  ast = AST.parse("#{1 << 33}")
206
203
  assert_equal(AST.type(nil, 'long'), ast.infer(@typer, true))
207
204
  end
205
+
206
+ def test_dynamic_assignability
207
+ ast = AST.parse("a = 1; a = dynamic('foo')")
208
+ assert_equal :error, ast.infer(@typer, true).name
209
+
210
+ ast = AST.parse("a = Object.new; a = dynamic('foo')")
211
+ assert_equal 'java.lang.Object', ast.infer(@typer, true).name
212
+ end
208
213
  end
@@ -82,7 +82,7 @@ class TestJVMCompiler < Test::Unit::TestCase
82
82
  compiler = Compiler::JVM.new
83
83
  compiler.compile(ast)
84
84
  classes = {}
85
- loader = MirahClassLoader.new(JRuby.runtime.jruby_class_loader, classes)
85
+ loader = Mirah::ClassLoader.new(JRuby.runtime.jruby_class_loader, classes)
86
86
  compiler.generate do |name, builder|
87
87
  bytes = builder.generate
88
88
  FileUtils.mkdir_p(File.dirname(name))
@@ -2056,6 +2056,24 @@ class TestJVMCompiler < Test::Unit::TestCase
2056
2056
  end
2057
2057
  end
2058
2058
 
2059
+ def test_block_with_abstract_from_object
2060
+ # Comparator interface also defines equals(Object) as abstract,
2061
+ # but it can be inherited from Object. We test that here.
2062
+ cls, = compile(<<-EOF)
2063
+ import java.util.ArrayList
2064
+ import java.util.Collections
2065
+ list = ArrayList.new(["a", "ABC", "Cats", "b"])
2066
+ Collections.sort(list) do |a, b|
2067
+ String(a).compareToIgnoreCase(String(b))
2068
+ end
2069
+ list.each {|x| puts x}
2070
+ EOF
2071
+
2072
+ assert_output("a\nABC\nb\nCats\n") do
2073
+ cls.main(nil)
2074
+ end
2075
+ end
2076
+
2059
2077
  def test_each
2060
2078
  cls, = compile(<<-EOF)
2061
2079
  def foo
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mirah
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.0.7
6
6
  platform: java
7
7
  authors:
8
8
  - Charles Oliver Nutter
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-03-20 01:59:06.100000 -05:00
14
+ date: 2011-03-20 17:08:55.863000 -05:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
@@ -61,9 +61,12 @@ files:
61
61
  - lib/mirah_task.rb
62
62
  - lib/mirah/appengine_tasks.rb
63
63
  - lib/mirah/ast.rb
64
+ - lib/mirah/class_loader.rb
65
+ - lib/mirah/compilation_state.rb
64
66
  - lib/mirah/compiler.rb
65
67
  - lib/mirah/env.rb
66
68
  - lib/mirah/errors.rb
69
+ - lib/mirah/impl.rb
67
70
  - lib/mirah/transform.rb
68
71
  - lib/mirah/transform2.rb
69
72
  - lib/mirah/typer.rb
@@ -113,7 +116,6 @@ files:
113
116
  - test/test_typer.rb
114
117
  - examples/bintrees.mirah
115
118
  - examples/construction.mirah
116
- - examples/Dynamic.class
117
119
  - examples/dynamic.mirah
118
120
  - examples/edb.mirah
119
121
  - examples/fib.mirah
@@ -121,7 +123,6 @@ files:
121
123
  - examples/fractal.mirah
122
124
  - examples/java_thing.mirah
123
125
  - examples/simple_class.mirah
124
- - examples/SizeThing.class
125
126
  - examples/sort_closure.mirah
126
127
  - examples/swing.mirah
127
128
  - examples/tak.mirah
Binary file
Binary file