mirah 0.1.0.pre-java → 0.1.1-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.
Files changed (92) hide show
  1. data/History.txt +736 -0
  2. data/README.md +71 -0
  3. data/Rakefile +227 -73
  4. data/examples/Fib.class +0 -0
  5. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +2 -3
  6. data/examples/simple_class.mirah +3 -3
  7. data/examples/{dynamic.mirah → simple_class.mirah~} +7 -12
  8. data/javalib/mirah-bootstrap.jar +0 -0
  9. data/javalib/mirah-builtins.jar +0 -0
  10. data/javalib/mirah-compiler.jar +0 -0
  11. data/javalib/mirah-parser.jar +0 -0
  12. data/javalib/mirah-util.jar +0 -0
  13. data/lib/mirah.rb +8 -1
  14. data/lib/mirah/ast.rb +1 -1
  15. data/lib/mirah/ast/scope.rb +16 -0
  16. data/lib/mirah/commands/base.rb +1 -3
  17. data/lib/mirah/compiler.rb +17 -3
  18. data/lib/mirah/errors.rb +10 -10
  19. data/lib/mirah/generator.rb +21 -9
  20. data/lib/mirah/jvm/compiler.rb +17 -0
  21. data/lib/mirah/jvm/compiler/base.rb +24 -5
  22. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +83 -20
  23. data/lib/mirah/jvm/method_lookup.rb +43 -22
  24. data/lib/mirah/jvm/types.rb +1 -2
  25. data/lib/mirah/jvm/types/array_type.rb +1 -6
  26. data/lib/mirah/jvm/types/ast_ext.rb +31 -0
  27. data/lib/mirah/jvm/types/basic_types.rb +1 -2
  28. data/lib/mirah/jvm/types/boolean.rb +11 -10
  29. data/lib/mirah/jvm/types/extensions.rb +14 -5
  30. data/lib/mirah/jvm/types/factory.rb +128 -43
  31. data/lib/mirah/jvm/types/floats.rb +8 -10
  32. data/lib/mirah/jvm/types/integers.rb +16 -9
  33. data/lib/mirah/jvm/types/intrinsics.rb +17 -69
  34. data/lib/mirah/jvm/types/meta_type.rb +5 -0
  35. data/lib/mirah/jvm/types/methods.rb +317 -151
  36. data/lib/mirah/jvm/types/methods.rb~ +973 -0
  37. data/lib/mirah/jvm/types/number.rb +29 -6
  38. data/lib/mirah/jvm/types/primitive_type.rb +35 -7
  39. data/lib/mirah/jvm/types/source_mirror.rb +11 -6
  40. data/lib/mirah/jvm/types/type.rb +52 -0
  41. data/lib/mirah/jvm/types/type_definition.rb +8 -2
  42. data/lib/mirah/transform/ast_ext.rb +9 -31
  43. data/lib/mirah/transform/transformer.rb +1 -1
  44. data/lib/mirah/typer.rb +2 -1
  45. data/lib/mirah/util/argument_processor.rb +10 -14
  46. data/lib/mirah/util/argument_processor.rb~ +146 -0
  47. data/lib/mirah/util/compilation_state.rb +15 -9
  48. data/lib/mirah/util/process_errors.rb +8 -2
  49. data/lib/mirah/version.rb +2 -2
  50. data/lib/mirah_task.rb +0 -7
  51. data/test/core/typer_test.rb +21 -13
  52. data/test/core/util/argument_processor_test.rb +19 -19
  53. data/test/core/util/class_loader_test.rb +19 -4
  54. data/test/core/util/compilation_state_test.rb +38 -0
  55. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  56. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  57. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  58. data/test/jvm/blocks_test.rb +50 -29
  59. data/test/jvm/bytecode_test_helper.rb +71 -57
  60. data/test/jvm/cast_test.rb +162 -0
  61. data/test/jvm/constructors_test.rb +48 -0
  62. data/test/jvm/enumerable_test.rb +136 -7
  63. data/test/jvm/example_test.rb +39 -0
  64. data/test/jvm/factory_test.rb +6 -0
  65. data/test/jvm/generics_test.rb +0 -5
  66. data/test/jvm/import_test.rb +81 -0
  67. data/test/jvm/interface_test.rb +113 -0
  68. data/test/jvm/java_typer_test.rb +57 -11
  69. data/test/jvm/jvm_commands_test.rb +24 -0
  70. data/test/jvm/jvm_compiler_test.rb +186 -370
  71. data/test/jvm/macros_test.rb +67 -6
  72. data/test/jvm/main_method_test.rb +1 -1
  73. data/test/jvm/mirror_compilation_test_helper.rb +24 -0
  74. data/test/jvm/new_backend_test_helper.rb +25 -0
  75. data/test/jvm/rescue_test.rb +153 -18
  76. data/test/jvm/string_test.rb +41 -0
  77. data/test/jvm/varargs_test.rb +65 -0
  78. data/test/mirrors/base_type_test.rb +96 -0
  79. data/test/mirrors/bytecode_mirror_test.rb +86 -0
  80. data/test/mirrors/generics_test.rb +776 -0
  81. data/test/mirrors/member_test.rb +69 -0
  82. data/test/mirrors/method_lookup_test.rb +574 -0
  83. data/test/mirrors/mirrors_test.rb +562 -0
  84. data/test/mirrors/simple_async_mirror_loader_test.rb +110 -0
  85. data/test/mirrors/simple_mirror_loader_test.rb +104 -0
  86. data/test/test_helper.rb +2 -1
  87. metadata +244 -217
  88. data/README.txt +0 -59
  89. data/javalib/dynalink-0.2.jar +0 -0
  90. data/lib/mirah/jvm/typer.rb +0 -177
  91. data/lib/mirah/jvm/types/dynamic_type.rb +0 -45
  92. data/lib/mirah/jvm/types/unreachable_type.rb +0 -27
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ Mirah
2
+ ================
3
+
4
+ [![Build Status](https://secure.travis-ci.org/mirah/mirah.png)](http://travis-ci.org/mirah/mirah)
5
+
6
+ * http://groups.google.com/group/mirah
7
+ * http://github.com/mirah/mirah/issues
8
+
9
+ DESCRIPTION
10
+ -----------------
11
+
12
+ Mirah is a customizable programming language featuring static types,
13
+ local type inference and a heavily Ruby-inspired syntax. Mirah
14
+ currently includes a typer/compiler backend for the JVM which can
15
+ output JVM bytecode.
16
+
17
+ FEATURES
18
+ -----------------
19
+
20
+ * Ruby-like syntax
21
+ * Compiles to .class
22
+ * Fast as Java
23
+ * No runtime library
24
+
25
+ SYNOPSIS
26
+ -----------------
27
+
28
+ mirah <script.mirah>
29
+ mirah -e "inline script"
30
+ mirahc <script.mirah>
31
+ mirahc -e "inline script" # produces DashE.class
32
+
33
+ REQUIREMENTS
34
+ -----------------
35
+
36
+ * JRuby 1.6.0 or higher.
37
+ * BiteScript 0.0.8 or higher
38
+
39
+ INSTALL
40
+ -----------------
41
+
42
+ RUBY
43
+ -----------------
44
+
45
+ If your gem and rake are not from from JRuby, prefix the commands with `jruby -S`
46
+
47
+ $ gem install mirah
48
+
49
+ ZIP
50
+ -----------------
51
+
52
+ You can also install Mirah from a zip file. Download the latest stable
53
+ release from https://github.com/mirah/mirah/downloads.
54
+ Extract it, and add `bin` to your `$PATH` to be able to use `mirah`, `mirahc`, etc.
55
+
56
+ SOURCE
57
+ -----------------
58
+
59
+ To build and install from source, you'll need jruby 1.7.0 or
60
+ higher. Then just follow these commands.
61
+
62
+ $ git clone http://github.com/mirah/mirah.git
63
+ $ cd mirah
64
+ $ bundle install
65
+ $ rake gem
66
+ $ gem install pkg/mirah-*.gem
67
+
68
+ For Java tools
69
+ -----------------
70
+
71
+ To build the Mirah jar from source run `rake jar` in the mirah directory.
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
1
+ # Copyright (c) 2010-2013 The Mirah project authors. All Rights Reserved.
2
2
  # All contributing project authors may be found in the NOTICE file.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,9 +29,17 @@ end
29
29
 
30
30
  bitescript_lib_dir = File.dirname Gem.find_files('bitescript').first
31
31
 
32
- task :gem => 'jar:bootstrap'
33
- task :bootstrap => ['javalib/mirah-bootstrap.jar', 'javalib/mirah-builtins.jar']
34
- task :default => :'test:jvm:bytecode'
32
+ task :gem => ['jar:bootstrap', "javalib/mirah-compiler.jar", "javalib/mirah-mirrors.jar"]
33
+ task :bootstrap => ['javalib/mirah-bootstrap.jar', 'javalib/mirah-builtins.jar', 'javalib/mirah-util.jar']
34
+
35
+
36
+ task :default => :bytecode_ci
37
+
38
+ desc "run bytecode backend ci"
39
+ task :bytecode_ci => [:'test:core', :'test:jvm:bytecode']
40
+ desc "run new backend ci"
41
+ task :new_ci => [:'test:core', :'test:jvm:new']
42
+
35
43
  def run_tests tests
36
44
  results = tests.map do |name|
37
45
  begin
@@ -50,7 +58,7 @@ end
50
58
 
51
59
  desc "run full test suite"
52
60
  task :test do
53
- run_tests [ 'test:core', 'test:plugins', 'test:jvm' ]
61
+ run_tests [ 'test:core', 'test:plugins', 'test:jvm', 'test:jvm:new' ]
54
62
  end
55
63
 
56
64
  namespace :test do
@@ -75,15 +83,49 @@ namespace :test do
75
83
  end
76
84
 
77
85
  namespace :jvm do
86
+ task :test_setup => [:clean_tmp_test_directory, :build_test_fixtures]
87
+
78
88
  desc "run jvm tests compiling to bytecode"
79
- Rake::TestTask.new :bytecode => :bootstrap do |t|
89
+ Rake::TestTask.new :bytecode => [:bootstrap, :test_setup] do |t|
80
90
  t.libs << 'test' <<'test/jvm'
81
91
  t.ruby_opts.concat ["-r", "bytecode_test_helper"]
82
92
  t.test_files = FileList["test/jvm/**/*test.rb"]
83
93
  end
94
+
95
+ desc "run jvm tests using the new self hosted backend"
96
+ task :new do
97
+ run_tests ["test:jvm:new_backend", "test:jvm:mirrors"]
98
+ end
99
+
100
+ Rake::TestTask.new :new_backend => [:bootstrap, "javalib/mirah-compiler.jar", :test_setup] do |t|
101
+ t.libs << 'test' << 'test/jvm'
102
+ t.ruby_opts.concat ["-r", "new_backend_test_helper"]
103
+ t.test_files = FileList["test/jvm/**/*test.rb"]
104
+ end
105
+
106
+ desc "run tests for mirror type system"
107
+ Rake::TestTask.new :mirrors => "javalib/mirah-mirrors.jar" do |t|
108
+ t.libs << 'test'
109
+ t.test_files = FileList["test/mirrors/**/*test.rb"]
110
+ end
111
+ Rake::TestTask.new :mirror_compilation => "javalib/mirah-mirrors.jar" do |t|
112
+ t.libs << 'test' << 'test/jvm'
113
+ t.ruby_opts.concat ["-r", "mirror_compilation_test_helper"]
114
+ t.test_files = FileList["test/jvm/**/*test.rb"]
115
+ end
84
116
  end
85
117
  end
86
118
 
119
+ task :clean_tmp_test_directory do
120
+ FileUtils.rm_rf "tmp_test"
121
+ FileUtils.mkdir_p "tmp_test"
122
+ end
123
+
124
+ task :build_test_fixtures do
125
+ ant.javac 'destdir' => "tmp_test", 'srcdir' => 'test/fixtures',
126
+ 'includeantruntime' => false, 'debug' => true, 'listfiles' => true
127
+ end
128
+
87
129
  task :init do
88
130
  mkdir_p 'dist'
89
131
  mkdir_p 'build'
@@ -91,42 +133,31 @@ end
91
133
 
92
134
  desc "clean up build artifacts"
93
135
  task :clean do
94
- ant.delete :quiet => true, :dir => 'build'
95
- ant.delete :quiet => true, :dir => 'dist'
96
- rm 'javalib/mirah-bootstrap.jar'
97
- rm 'javalib/mirah-builtins.jar'
136
+ ant.delete 'quiet' => true, 'dir' => 'build'
137
+ ant.delete 'quiet' => true, 'dir' => 'dist'
138
+ rm_f 'javalib/mirah-bootstrap.jar'
139
+ rm_f 'javalib/mirah-builtins.jar'
140
+ rm_f 'javalib/mirah-util.jar'
141
+ rm_rf 'tmp'
98
142
  end
99
143
 
100
- task :compile => [:init, :bootstrap] do
101
- require 'mirah'
102
- # build the Ruby sources
103
- puts "Compiling Ruby sources"
104
- JRuby::Compiler.compile_argv([
105
- '-t', 'build',
106
- '--javac',
107
- 'src/org/mirah/mirah_command.rb'
108
- ])
109
-
110
- # TODO compile ant stuff
111
-
112
- # compile invokedynamic stuff
113
- ant.javac :destdir => 'build', :srcdir => 'src',
114
- :includes => 'org/mirah/DynalangBootstrap.java',
115
- :classpath => 'javalib/dynalink-0.1.jar:javalib/jsr292-mock.jar',
116
- :includeantruntime => false
117
- end
144
+ task :compile => [:init, :bootstrap, :util, :jvm_backend]
145
+ task :util => 'javalib/mirah-util.jar'
146
+ task :jvm_backend => 'javalib/mirah-compiler.jar'
118
147
 
119
148
  desc "build basic jar for distribution"
120
149
  task :jar => :compile do
121
- ant.jar :jarfile => 'dist/mirah.jar' do
122
- fileset :dir => 'lib'
123
- fileset :dir => 'build'
124
- fileset :dir => '.', :includes => 'bin/*'
125
- fileset :dir => bitescript_lib_dir
126
- zipfileset :src => 'javalib/mirah-bootstrap.jar'
127
- zipfileset :src => 'javalib/mirah-builtins.jar'
150
+ ant.jar 'jarfile' => 'dist/mirah.jar' do
151
+ fileset 'dir' => 'lib'
152
+ fileset 'dir' => 'build'
153
+ fileset 'dir' => '.', 'includes' => 'bin/*'
154
+ fileset 'dir' => bitescript_lib_dir
155
+ zipfileset 'src' => 'javalib/mirah-bootstrap.jar'
156
+ zipfileset 'src' => 'javalib/mirah-builtins.jar'
157
+ zipfileset 'src' => 'javalib/mirah-util.jar'
158
+ zipfileset 'src' => 'javalib/mirah-compiler.jar'
128
159
  manifest do
129
- attribute :name => 'Main-Class', :value => 'org.mirah.MirahCommand'
160
+ attribute 'name' => 'Main-Class', 'value' => 'org.mirah.MirahCommand'
130
161
  end
131
162
  end
132
163
  end
@@ -134,13 +165,12 @@ end
134
165
  namespace :jar do
135
166
  desc "build self-contained, complete jar"
136
167
  task :complete => :jar do
137
- ant.jar :jarfile => 'dist/mirah-complete.jar' do
138
- zipfileset :src => 'dist/mirah.jar'
139
- zipfileset :src => 'javalib/jruby-complete.jar'
140
- zipfileset :src => 'javalib/mirah-parser.jar'
141
- zipfileset :src => 'javalib/dynalink-0.2.jar'
168
+ ant.jar 'jarfile' => 'dist/mirah-complete.jar' do
169
+ zipfileset 'src' => 'dist/mirah.jar'
170
+ zipfileset 'src' => 'javalib/jruby-complete.jar'
171
+ zipfileset 'src' => 'javalib/mirah-parser.jar'
142
172
  manifest do
143
- attribute :name => 'Main-Class', :value => 'org.mirah.MirahCommand'
173
+ attribute 'name' => 'Main-Class', 'value' => 'org.mirah.MirahCommand'
144
174
  end
145
175
  end
146
176
  end
@@ -160,7 +190,7 @@ task :zip => 'jar:complete' do
160
190
  cp Dir['{distbin/*.bat}'], "#{basedir}/bin/"
161
191
  cp_r 'examples', "#{basedir}/examples"
162
192
  rm_rf "#{basedir}/examples/wiki"
163
- cp 'README.txt', "#{basedir}"
193
+ cp 'README.md', "#{basedir}"
164
194
  cp 'NOTICE', "#{basedir}"
165
195
  cp 'LICENSE', "#{basedir}"
166
196
  cp 'History.txt', "#{basedir}"
@@ -184,64 +214,171 @@ end
184
214
  file 'javalib/mirah-bootstrap.jar' => ['javalib/mirah-newast-transitional.jar',
185
215
  'src/org/mirah/MirahClassLoader.java',
186
216
  'src/org/mirah/IsolatedResourceLoader.java',
187
- 'src/org/mirah/MirahLogFormatter.mirah'] +
217
+ 'src/org/mirah/MirahLogFormatter.mirah',
218
+ 'src/org/mirah/util/simple_diagnostics.mirah'] +
188
219
  Dir['src/org/mirah/{macros,typer}/*.mirah'] +
189
220
  Dir['src/org/mirah/typer/simple/*.mirah'] +
190
221
  Dir['src/org/mirah/macros/anno/*.java'] do
191
- rm_rf 'build/bootstrap'
192
- mkdir_p 'build/bootstrap'
222
+ build_dir = 'build/bootstrap'
223
+ rm_rf build_dir
224
+ mkdir_p build_dir
193
225
 
194
226
  # Compile annotations and class loader
195
- ant.javac :destdir => 'build/bootstrap', :srcdir => 'src',
196
- :includeantruntime => false, :debug => true, :listfiles => true
227
+ ant.javac 'destdir' => build_dir, 'srcdir' => 'src',
228
+ 'includeantruntime' => false, 'debug' => true, 'listfiles' => true
197
229
 
198
230
  # Compile the Typer and Macro compiler
199
231
  bootstrap_mirahc('src/org/mirah/macros', 'src/org/mirah/MirahLogFormatter.mirah', 'src/org/mirah/typer',
200
- :classpath => ['javalib/mirah-parser.jar', 'build/bootstrap'],
201
- :dest => 'build/bootstrap'
202
- # :options => ['-V']
203
- )
232
+ 'src/org/mirah/util/simple_diagnostics.mirah',
233
+ :classpath => ['javalib/mirah-parser.jar', 'build/bootstrap'],
234
+ :dest => build_dir
235
+ # :options => ['-V']
236
+ )
204
237
  add_quote_macro
205
- cp Dir['src/org/mirah/macros/*.tpl'], 'build/bootstrap/org/mirah/macros'
238
+ cp Dir['src/org/mirah/macros/*.tpl'], "#{build_dir}/org/mirah/macros"
206
239
 
207
240
  # Build the jar
208
- ant.jar :jarfile => 'javalib/mirah-bootstrap.jar' do
209
- fileset :dir => 'build/bootstrap'
241
+ ant.jar 'jarfile' => 'javalib/mirah-bootstrap.jar' do
242
+ fileset 'dir' => build_dir
210
243
  end
244
+ end
211
245
 
212
- rm_rf 'build/bootstrap'
246
+
247
+ file 'javalib/mirah-util.jar' do
248
+ require 'mirah'
249
+ build_dir = 'build/util'
250
+ rm_rf build_dir
251
+ mkdir_p build_dir
252
+
253
+ # build the Ruby sources
254
+ puts "Compiling Ruby sources"
255
+ JRuby::Compiler.compile_argv([
256
+ '-t', build_dir,
257
+ '--javac',
258
+ 'src/org/mirah/mirah_command.rb'
259
+ ])
260
+
261
+ # compile ant stuff
262
+ ant_classpath = $CLASSPATH.grep(/ant/).map{|x| x.sub(/^file:/,'')}.join(File::PATH_SEPARATOR)
263
+ sh *%W(jruby -Ilib bin/mirahc --classpath #{ant_classpath}:#{build_dir} --dest #{build_dir} src/org/mirah/ant)
264
+
265
+ # compile invokedynamic stuff
266
+ ant.javac 'destdir' => build_dir, 'srcdir' => 'src',
267
+ 'includes' => 'org/mirah/DynalangBootstrap.java',
268
+ 'classpath' => 'javalib/dynalink-0.1.jar:javalib/jsr292-mock.jar',
269
+ 'includeantruntime' => false
270
+
271
+ # Build the jar
272
+ ant.jar 'jarfile' => 'javalib/mirah-util.jar' do
273
+ fileset 'dir' => build_dir
274
+ end
213
275
  end
214
276
 
277
+
215
278
  file 'javalib/mirah-builtins.jar' => ['javalib/mirah-bootstrap.jar'] + Dir['src/org/mirah/builtins/*.mirah'] do
216
279
  rm_f 'javalib/mirah-builtins.jar'
217
280
  rm_rf 'build/builtins'
218
281
  mkdir_p 'build/builtins'
219
282
  sh *%w(jruby -Ilib bin/mirahc --dest build/builtins src/org/mirah/builtins)
220
- ant.jar :jarfile => 'javalib/mirah-builtins.jar' do
221
- fileset :dir => 'build/builtins'
283
+ ant.jar 'jarfile' => 'javalib/mirah-builtins.jar' do
284
+ fileset 'dir' => 'build/builtins'
222
285
  end
223
286
  rm_rf 'build/builtins'
224
287
  end
225
288
 
226
- require 'bitescript'
227
- class Annotater < BiteScript::ASM::ClassWriter
228
- def initialize(filename, &block)
229
- cr = BiteScript::ASM::ClassReader.new(java.io.FileInputStream.new(filename))
230
- super(cr, 0)
231
- @block = block
232
- cr.accept(self, 0)
233
- f = java.io.FileOutputStream.new(filename)
234
- f.write(toByteArray)
235
- f.close
289
+ file 'javalib/mirah-compiler.jar' => ['javalib/mirah-builtins.jar'] + Dir['src/org/mirah/{util,jvm/types,jvm/compiler}/*.mirah'] do
290
+ rm_f 'javalib/mirah-compiler.jar'
291
+ rm_rf 'build/compiler'
292
+ mkdir_p 'build/compiler'
293
+ phase3_files = Dir['src/org/mirah/jvm/compiler/{class,interface,script}_compiler.mirah'] + ['src/org/mirah/jvm/compiler/backend.mirah']
294
+ phase2_files = Dir['src/org/mirah/jvm/compiler/{condition,method,string}_compiler.mirah']
295
+ phase1_files = Dir['src/org/mirah/jvm/compiler/*.mirah'] - phase2_files - phase3_files
296
+ sh *(%w(jruby -Ilib bin/mirahc --dest build/compiler ) +
297
+ %w(--classpath javalib/mirah-parser.jar:javalib/mirah-bootstrap.jar) +
298
+ %w(src/org/mirah/util src/org/mirah/jvm/types src/org/mirah/jvm/compiler/base_compiler.mirah))
299
+ sh *(%w(jruby -Ilib bin/mirahc --dest build/compiler ) +
300
+ %w(--classpath javalib/mirah-parser.jar:javalib/mirah-bootstrap.jar:build/compiler) +
301
+ %w(src/org/mirah/util/context.mirah) + phase1_files)
302
+ sh *(%w(jruby -Ilib bin/mirahc --dest build/compiler ) +
303
+ %w(--classpath javalib/mirah-parser.jar:javalib/mirah-bootstrap.jar:build/compiler) +
304
+ %w(src/org/mirah/util/context.mirah) + phase2_files)
305
+ sh *(%w(jruby -Ilib bin/mirahc --dest build/compiler ) +
306
+ %w(--classpath javalib/mirah-parser.jar:javalib/mirah-bootstrap.jar:build/compiler) +
307
+ %w(src/org/mirah/util/context.mirah) + phase3_files)
308
+ ant.jar 'jarfile' => 'javalib/mirah-compiler.jar' do
309
+ fileset 'dir' => 'build/compiler'
310
+ end
311
+ rm_rf 'build/compiler'
312
+ end
313
+
314
+ file 'javalib/mirah-mirrors.jar' => ['javalib/mirah-compiler.jar'] + Dir['src/org/mirah/jvm/mirrors/**/*.mirah','src/org/mirah/jvm/model/**/*.mirah'] do
315
+ rm_f 'javalib/mirah-mirrors.jar'
316
+ rm_rf 'build/mirrors'
317
+ mkdir_p 'build/mirrors'
318
+ sh *(%w(jruby -Ilib bin/mirahc -N --dest build/mirrors ) +
319
+ %w(--classpath javalib/mirah-parser.jar:javalib/mirah-bootstrap.jar:javalib/mirah-compiler.jar) +
320
+ %w(src/org/mirah/jvm/mirrors/ src/org/mirah/jvm/model/))
321
+ ant.jar 'jarfile' => 'javalib/mirah-mirrors.jar' do
322
+ fileset 'dir' => 'build/mirrors'
323
+ end
324
+ rm_rf 'build/mirrors'
325
+ end
326
+
327
+ def find_jruby_jar
328
+ require 'java'
329
+ java_import 'org.jruby.Ruby'
330
+ path = Ruby.java_class.resource('Ruby.class').toString
331
+ path =~ %r{^jar:file:(.+)!/org/jruby/Ruby.class}
332
+ $1
333
+ end
334
+
335
+ file 'javalib/mirahc.jar' => ['javalib/mirah-mirrors.jar',
336
+ 'src/org/mirah/tool/mirahc.mirah',
337
+ ] do
338
+ rm_f 'javalib/mirahc.jar'
339
+ rm_rf 'build/mirahc'
340
+ mkdir_p 'build/mirahc'
341
+ sh *(%w(jruby -Ilib bin/mirahc -N --dest build/mirahc ) +
342
+ %w(--classpath javalib/mirah-parser.jar:javalib/mirah-bootstrap.jar:javalib/mirah-compiler.jar:javalib/mirah-mirrors.jar) +
343
+ %w(src/org/mirah/tool/))
344
+ ant.jar :jarfile => 'javalib/mirahc.jar' do
345
+ fileset :dir => 'build/mirahc'
346
+ zipfileset :src => 'javalib/mirah-bootstrap.jar'
347
+ zipfileset :src => 'javalib/mirah-builtins.jar'
348
+ zipfileset :src => 'javalib/mirah-util.jar'
349
+ zipfileset :src => 'javalib/mirah-compiler.jar'
350
+ zipfileset :src => 'javalib/mirah-mirrors.jar'
351
+ zipfileset :src => find_jruby_jar, :includes => 'org/jruby/org/objectweb/**/*'
352
+ zipfileset :src => 'javalib/mirah-parser.jar'
353
+ manifest do
354
+ attribute :name => 'Main-Class', :value => 'org.mirah.tool.Mirahc'
355
+ end
236
356
  end
237
- def visitSource(*args); end
238
- def visit(*args)
239
- super
240
- @block.call(self)
357
+ end
358
+
359
+ if Float(JRUBY_VERSION[0..2]) >= 1.7
360
+ require 'bitescript'
361
+ class Annotater < BiteScript::ASM::ClassVisitor
362
+ def initialize(filename, &block)
363
+ cr = BiteScript::ASM::ClassReader.new(java.io.FileInputStream.new(filename))
364
+ cw = BiteScript::ASM::ClassWriter.new(0)
365
+ super(BiteScript::ASM::Opcodes::ASM4, cw)
366
+ @block = block
367
+ cr.accept(self, 0)
368
+ f = java.io.FileOutputStream.new(filename)
369
+ f.write(cw.toByteArray)
370
+ f.close
371
+ end
372
+ def visitSource(*args); end
373
+ def visit(version, access, name, sig, superclass, interfaces)
374
+ super
375
+ @block.call(self)
376
+ end
241
377
  end
242
378
  end
243
379
 
244
380
  def add_quote_macro
381
+ raise "Can't compile on JRuby less than 1.7" unless defined?(Annotater)
245
382
  Annotater.new('build/bootstrap/org/mirah/macros/QuoteMacro.class') do |klass|
246
383
  av = klass.visitAnnotation('Lorg/mirah/macros/anno/MacroDef;', true)
247
384
  av.visit("name", "quote")
@@ -252,6 +389,16 @@ def add_quote_macro
252
389
  args.visitEnd
253
390
  av.visitEnd
254
391
  end
392
+ Annotater.new('build/bootstrap/org/mirah/macros/CompilerQuoteMacro.class') do |klass|
393
+ av = klass.visitAnnotation('Lorg/mirah/macros/anno/MacroDef;', true)
394
+ av.visit("name", "quote")
395
+ args = av.visitAnnotation('arguments', 'Lorg/mirah/macros/anno/MacroArgs;')
396
+ req = args.visitArray('required')
397
+ req.visit(nil, 'mirah.lang.ast.Block')
398
+ req.visitEnd
399
+ args.visitEnd
400
+ av.visitEnd
401
+ end
255
402
  Annotater.new('build/bootstrap/org/mirah/macros/Macro.class') do |klass|
256
403
  av = klass.visitAnnotation('Lorg/mirah/macros/anno/Extensions;', false)
257
404
  macros = av.visitArray('macros')
@@ -259,6 +406,13 @@ def add_quote_macro
259
406
  macros.visitEnd
260
407
  av.visitEnd
261
408
  end
409
+ Annotater.new('build/bootstrap/org/mirah/macros/Compiler.class') do |klass|
410
+ av = klass.visitAnnotation('Lorg/mirah/macros/anno/Extensions;', false)
411
+ macros = av.visitArray('macros')
412
+ macros.visit(nil, 'org.mirah.macros.CompilerQuoteMacro')
413
+ macros.visitEnd
414
+ av.visitEnd
415
+ end
262
416
  end
263
417
 
264
418
  def bootstrap_mirahc(*paths)
@@ -271,7 +425,7 @@ def bootstrap_mirahc(*paths)
271
425
  if options[:classpath]
272
426
  args << '--classpath' << options[:classpath].map {|p| File.expand_path(p)}.join(File::PATH_SEPARATOR)
273
427
  end
274
- args << '-d' << File.expand_path(options[:dest])
428
+ args << '-d' << File.expand_path(options[:dest]) << '--jvm' << '1.5'
275
429
  jarfile = File.expand_path('javalib/mirah-newast-transitional.jar')
276
430
  Dir.chdir(options[:dir] || '.') do
277
431
  runjava(jarfile, 'compile', *(args + paths))