mirah 0.0.10-java → 0.0.11-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/History.txt +44 -0
  2. data/README.txt +12 -7
  3. data/Rakefile +13 -12
  4. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  5. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  6. data/examples/SortClosure.class +0 -0
  7. data/examples/macros/StringEachChar$Extension1.class +0 -0
  8. data/javalib/mirah-bootstrap.jar +0 -0
  9. data/lib/mirah/appengine_tasks.rb +8 -6
  10. data/lib/mirah/ast/flow.rb +3 -3
  11. data/lib/mirah/ast/structure.rb +23 -2
  12. data/lib/mirah/commands/base.rb +5 -2
  13. data/lib/mirah/commands/base.rb~ +57 -0
  14. data/lib/mirah/commands/run.rb +15 -8
  15. data/lib/mirah/jvm/compiler/java_source.rb +15 -11
  16. data/lib/mirah/jvm/method_lookup.rb~ +247 -0
  17. data/lib/mirah/jvm/types/bitescript_ext.rb +41 -0
  18. data/lib/mirah/jvm/types/boolean.rb +33 -0
  19. data/lib/mirah/jvm/types/factory.rb +43 -3
  20. data/lib/mirah/jvm/types/integers.rb +1 -14
  21. data/lib/mirah/jvm/types/intrinsics.rb +1 -14
  22. data/lib/mirah/jvm/types/source_mirror.rb +6 -3
  23. data/lib/mirah/parser.rb +2 -6
  24. data/lib/mirah/transform/transformer.rb +2 -0
  25. data/lib/mirah/util/argument_processor.rb +33 -12
  26. data/lib/mirah/util/class_loader.rb +7 -2
  27. data/lib/mirah/util/compilation_state.rb +8 -0
  28. data/lib/mirah/version.rb +1 -1
  29. data/lib/mirah/version.rb~ +18 -0
  30. data/test/core/{test_ast.rb → ast_test.rb} +5 -1
  31. data/test/core/{test_commands.rb → commands_test.rb} +29 -2
  32. data/test/core/{test_compilation.rb → compilation_test.rb} +2 -2
  33. data/test/core/{test_env.rb → env_test.rb} +2 -2
  34. data/test/core/{test_macros.rb → macros_test.rb} +2 -2
  35. data/test/core/{test_typer.rb → typer_test.rb} +1 -1
  36. data/test/core/util/argument_processor_test.rb +64 -0
  37. data/test/core/util/class_loader_test.rb +31 -0
  38. data/test/fixtures/my.properties +0 -0
  39. data/test/fixtures/org/foo/A.class +0 -0
  40. data/test/jvm/{test_annotations.rb → annotations_test.rb} +2 -2
  41. data/test/jvm/blocks_test.rb +262 -0
  42. data/test/jvm/bytecode_test_helper.rb +1 -33
  43. data/test/jvm/constructors_test.rb +110 -0
  44. data/test/jvm/{test_enumerable.rb → enumerable_test.rb} +2 -2
  45. data/test/jvm/factory_test.rb +22 -0
  46. data/test/jvm/{test_java_typer.rb → java_typer_test.rb} +1 -1
  47. data/test/jvm/jvm_compiler_test.rb +2162 -0
  48. data/test/jvm/{test_jvm_compiler.rb → jvm_compiler_test.rb~} +43 -220
  49. data/test/jvm/{test_macros.rb → macros_test.rb} +2 -2
  50. data/test/jvm/{test_main_method.rb → main_method_test.rb} +2 -2
  51. data/test/jvm/{test_rescue.rb → rescue_test.rb} +33 -2
  52. data/test/plugins/{test_gwt.rb → gwt_test.rb} +2 -2
  53. data/test/test_helper.rb +40 -0
  54. metadata +33 -33
  55. data/test/jvm/test_blocks.rb +0 -62
data/History.txt CHANGED
@@ -1,3 +1,47 @@
1
+ === 0.0.11 Pre-Hackathon Edition / 2012-04-09
2
+
3
+ 235e887 set version to 0.0.11
4
+ d11f694 actually use the bootclasspath in the bootstrap_loader
5
+ 6f293d8 fix and test(barely) IsolatedResourceLoader
6
+ cff273c add tests for MirahClassLoader
7
+ 98adac4 add some comments on class loaders
8
+ e1ddf6a reorg run a little, ensure fail has non-zero exit
9
+ 6a7f2c4 add needed breaks in to args processor
10
+ 72c0031 clean up arg processor interface a bit
11
+ 886bc5f test that bootclasspath arg sets the bootclasspath
12
+ 141aceb add small test for args processor
13
+ b981088 removing an accidental X from annotations test
14
+ 4361a10 rename test classes to match their filenames
15
+ 7312718 use git bitescript by default
16
+ 2642a28 add tab to cli help for bootclasspath
17
+ 97cee78 Support specifying --bootclasspath
18
+ 6b05845 clean up build_string in java_source
19
+ ab5c6ac fixes #175. wrap string interp prior to calling method on it.
20
+ b5148ed Merge pull request #174 from nighthacker/master
21
+ 5bb1d2a fixed mistaken command line flags in synopsis
22
+ 96a9074 closures in closures fixes: 155
23
+ 77f110f move block tests into block_test
24
+ 6e6bfaf previous change was insufficiently argy.
25
+ 98acfef complain if blocks don't have the right number of arguments
26
+ 7076279 add zip install instructions
27
+ 2930ff3 Update README.txt. Fixes #163
28
+ 9a06b83 Merge pull request #166 from keithcelt/master
29
+ 737c01c Silence ant runtime errors on systems building with ant 1.8
30
+ f8e3edf Fixes 162 by requiring java.lang.System as a string
31
+ f7c5bee rename tests so test is suffix instead of prefix
32
+ 0caf3d0 pull bitescript exts out into their own file
33
+ d680a33 fixes #13. adding == & != on bools
34
+ 1a3da9f if no args & -v specified, exit with status 0
35
+ a044d7b Remove conflicting "Exception" import and move "System" import to class body. Fixes #159.
36
+ 0d0b350 move constructor tests into their own file
37
+ b351c13 don't raise errors on empty files
38
+ 84c2a83 have Mirah::Parser use the same code path as tests do
39
+ 56bee53 Tests. Fixes #157
40
+ 2fddffe Treat the expression as resolved if the primary_type is nil, as in `return`. #157
41
+ 1a5c40e Don't treat Ensure as an expression; it can never have a return type. #157
42
+ e04c70f bump versions to 0.0.11.dev
43
+
44
+
1
45
  === 0.0.10 / 2011-11-20
2
46
 
3
47
  f6035d0 set version to 0.0.10
data/README.txt CHANGED
@@ -23,8 +23,8 @@ mirah <script.mirah>
23
23
  mirah -e "inline script"
24
24
  mirahc <script.mirah>
25
25
  mirahc -e "inline script" # produces DashE.class
26
- mirahc -java <script.mirah>
27
- mirahc -java -e "inline script" # produces DashE.java
26
+ mirahc --java <script.mirah>
27
+ mirahc --java -e "inline script" # produces DashE.java
28
28
 
29
29
  == REQUIREMENTS:
30
30
 
@@ -33,10 +33,19 @@ mirahc -java -e "inline script" # produces DashE.java
33
33
 
34
34
  == INSTALL:
35
35
 
36
+ === RUBY:
36
37
  If your gem and rake are not from from JRuby, prefix the commands with jruby -S
37
38
 
38
39
  $ gem install mirah
39
40
 
41
+ === ZIP:
42
+
43
+ You can also install Mirah from a zip file. Download the latest stable
44
+ release from https://github.com/mirah/mirah/downloads.
45
+ Extract it, and add `bin` to your `$PATH` to be able to use `mirah`, `mirahc`, etc.
46
+
47
+ === SOURCE:
48
+
40
49
  To build and install from source,
41
50
 
42
51
  $ git clone http://github.com/mirah/mirah.git
@@ -47,8 +56,4 @@ $ gem install pkg/mirah-*.gem
47
56
 
48
57
  == For Java tools:
49
58
 
50
- To build the Mirah jars from source you should have a checkout of both jruby and
51
- bitescript in Mirah's parent directory. Run "ant jar-complete" in jruby, then in
52
- the mirah directory "../jruby/bin/jruby -S rake jar" to build the Mirah jar. Use
53
- "jar:complete" instead to produce a free-standing jar file with JRuby and the
54
- JRubyParser libraries included.
59
+ To build the Mirah jar from source run "rake jar" in the mirah directory.
data/Rakefile CHANGED
@@ -39,7 +39,7 @@ def run_tests tests
39
39
  rescue Exception
40
40
  end
41
41
  end
42
-
42
+
43
43
  tests.zip(results).each do |name, passed|
44
44
  unless passed
45
45
  puts "Errors in #{name}"
@@ -47,7 +47,7 @@ def run_tests tests
47
47
  end
48
48
  fail if results.any?{|passed|!passed}
49
49
  end
50
-
50
+
51
51
  desc "run full test suite"
52
52
  task :test do
53
53
  run_tests [ 'test:core', 'test:plugins', 'test:jvm' ]
@@ -57,14 +57,14 @@ namespace :test do
57
57
  desc "run the core tests"
58
58
  Rake::TestTask.new :core do |t|
59
59
  t.libs << 'test'
60
- t.test_files = FileList["test/core/**/test*.rb"]
60
+ t.test_files = FileList["test/core/**/*test.rb"]
61
61
  java.lang.System.set_property("jruby.duby.enabled", "true")
62
62
  end
63
-
63
+
64
64
  desc "run tests for plugins"
65
65
  Rake::TestTask.new :plugins do |t|
66
66
  t.libs << 'test'
67
- t.test_files = FileList["test/plugins/**/test*.rb"]
67
+ t.test_files = FileList["test/plugins/**/*test.rb"]
68
68
  java.lang.System.set_property("jruby.duby.enabled", "true")
69
69
  end
70
70
 
@@ -72,24 +72,24 @@ namespace :test do
72
72
  task :jvm do
73
73
  run_tests ["test:jvm:bytecode", "test:jvm:javac"]
74
74
  end
75
-
75
+
76
76
  namespace :jvm do
77
77
  desc "run jvm tests compiling to bytecode"
78
78
  Rake::TestTask.new :bytecode do |t|
79
79
  t.libs << 'test' <<'test/jvm'
80
80
  t.ruby_opts.concat ["-r", "bytecode_test_helper"]
81
- t.test_files = FileList["test/jvm/**/test*.rb"]
81
+ t.test_files = FileList["test/jvm/**/*test.rb"]
82
82
  java.lang.System.set_property("jruby.duby.enabled", "true")
83
83
  end
84
-
84
+
85
85
  desc "run jvm tests compiling to java source, then bytecode"
86
86
  Rake::TestTask.new :javac do |t|
87
87
  t.libs << 'test' <<'test/jvm'
88
88
  t.ruby_opts.concat ["-r", "javac_test_helper"]
89
- t.test_files = FileList["test/jvm/**/test*.rb"]
89
+ t.test_files = FileList["test/jvm/**/*test.rb"]
90
90
  java.lang.System.set_property("jruby.duby.enabled", "true")
91
91
  end
92
-
92
+
93
93
  end
94
94
  end
95
95
 
@@ -132,11 +132,12 @@ task :compile => :init do
132
132
  'mirah'
133
133
  )
134
134
  end
135
-
135
+
136
136
  # compile invokedynamic stuff
137
137
  ant.javac :destdir => 'build', :srcdir => 'src',
138
138
  :includes => 'org/mirah/DynalangBootstrap.java',
139
- :classpath => 'javalib/dynalink-0.1.jar:javalib/jsr292-mock.jar'
139
+ :classpath => 'javalib/dynalink-0.1.jar:javalib/jsr292-mock.jar',
140
+ :includeantruntime => false
140
141
  end
141
142
 
142
143
  desc "build basic jar for distribution"
Binary file
Binary file
@@ -25,9 +25,10 @@ module AppEngine::Rake
25
25
  APIS = AppEngine::SDK::API_JAR
26
26
  TOOLS = AppEngine::SDK::TOOLS_JAR
27
27
 
28
- $CLASSPATH << SERVLET
29
- $CLASSPATH << APIS
30
- $CLASSPATH << TOOLS
28
+ CLASSPATH = []
29
+ CLASSPATH << SERVLET
30
+ CLASSPATH << APIS
31
+ CLASSPATH << TOOLS
31
32
 
32
33
  class AppEngineTask < Rake::Task
33
34
  def initialize(*args, &block)
@@ -38,14 +39,15 @@ module AppEngine::Rake
38
39
  def init(src, war)
39
40
  @src = src
40
41
  @war = war
41
- unless $CLASSPATH.include?(webinf_classes)
42
- $CLASSPATH << webinf_classes
42
+ unless CLASSPATH.include?(webinf_classes)
43
+ CLASSPATH << webinf_classes
43
44
  end
44
45
  webinf_lib_jars.each do |jar|
45
- $CLASSPATH << jar unless $CLASSPATH.include?(jar)
46
+ CLASSPATH << jar unless CLASSPATH.include?(jar)
46
47
  end
47
48
  Mirah.source_paths << src
48
49
  Mirah.dest_paths << webinf_classes
50
+ Mirah.compiler_options = ['--classpath', Mirah::Env.encode_paths(CLASSPATH)]
49
51
  directory(webinf_classes)
50
52
  directory(webinf_lib)
51
53
 
@@ -344,7 +344,7 @@ module Mirah
344
344
  if types.any? {|t| t.nil?}
345
345
  typer.defer(self)
346
346
  else
347
- if !expression || clause_types.all?{ |t| primary_type.compatible? t}
347
+ if !expression || primary_type.nil? || clause_types.all?{ |t| primary_type.compatible? t}
348
348
  resolved!
349
349
  types.each do |type|
350
350
  @inferred_type ||= type unless type.unreachable?
@@ -373,9 +373,9 @@ module Mirah
373
373
  def infer(typer, expression)
374
374
  resolve_if(typer) do
375
375
  typer.infer(clause, false)
376
- typer.infer(body, true)
376
+ typer.infer(body, false)
377
377
  end
378
378
  end
379
379
  end
380
380
  end
381
- end
381
+ end
@@ -145,7 +145,7 @@ module Mirah::AST
145
145
  mirah = typer.transformer
146
146
  interface = method.argument_types[-1]
147
147
  outer_class = scope.defining_class
148
-
148
+
149
149
  binding = scope.binding_type(mirah)
150
150
 
151
151
  name = "#{outer_class.name}$#{mirah.tmp}"
@@ -157,6 +157,8 @@ module Mirah::AST
157
157
  mirah.eval("@binding = binding", '-', c, 'binding')
158
158
  end
159
159
 
160
+ @defining_class = klass.static_scope.self_type
161
+
160
162
  # TODO We need a special scope here that allows access to the
161
163
  # outer class.
162
164
  static_scope.self_type = typer.infer(klass, true)
@@ -174,6 +176,15 @@ module Mirah::AST
174
176
  typer.infer(instance, true)
175
177
  end
176
178
 
179
+ def defining_class
180
+ @defining_class
181
+ end
182
+
183
+ # TODO extract this & matching methods into a module
184
+ def binding_type(mirah=nil)
185
+ static_scope.binding_type(defining_class, mirah)
186
+ end
187
+
177
188
  def add_methods(klass, binding, typer)
178
189
  method_definitions = body.select{ |node| node.kind_of? MethodDefinition }
179
190
 
@@ -183,8 +194,10 @@ module Mirah::AST
183
194
  # TODO warn if there are non method definition nodes
184
195
  # they won't be used at all currently--so it'd be nice to note that.
185
196
  method_definitions.each do |node|
197
+
186
198
  node.static_scope = static_scope
187
199
  node.binding_type = binding
200
+ # node.children.each {|child| child.instance_variable_set '@scope', nil }
188
201
  klass.append_node(node)
189
202
  end
190
203
  end
@@ -206,8 +219,16 @@ module Mirah::AST
206
219
  next false
207
220
  end
208
221
 
209
- raise "Multiple abstract methods found within given interface [#{impl_methods.map(&:name).join(', ')}]; cannot use block" if impl_methods.size > 1
222
+ # It could also just define all the methods w/ the block as the implementation, assuming the args check out
223
+ # instead of it being an error.
224
+ if impl_methods.size > 1
225
+ raise Mirah::NodeError.new("Multiple abstract methods found within interface #{klass.interfaces.map(&:name).inspect} [#{impl_methods.map(&:name).join(', ')}]; cannot use block", self)
226
+ end
227
+
210
228
  impl_methods.each do |method|
229
+ if args.args.length != method.argument_types.length
230
+ raise Mirah::NodeError.new("Block can't implement #{method.name}: wrong number of arguments. Expected #{method.argument_types.length}, but was #{args.args.length}", self)
231
+ end
211
232
  mdef = klass.define_method(position,
212
233
  method.name,
213
234
  method.return_type,
@@ -32,12 +32,15 @@ module Mirah
32
32
  attr_accessor :state, :args, :argument_processor
33
33
 
34
34
  def execute_base
35
+ argument_processor.process
36
+ if argument_processor.exit?
37
+ exit argument_processor.exit_status_code
38
+ end
35
39
  # because MirahCommand is a JRuby Java class, SystemExit bubbles through and makes noise
36
40
  # so we use a catch/throw to early exit instead
37
41
  # see util/process_errors.rb
38
42
  status = catch(:exit) do
39
43
  begin
40
- argument_processor.process
41
44
  yield
42
45
  rescue Mirah::InternalCompilerError => ice
43
46
  Mirah.print_error(ice.message, ice.position) if ice.node
@@ -55,4 +58,4 @@ module Mirah
55
58
  end
56
59
  end
57
60
  end
58
- end
61
+ end
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
+ # All contributing project authors may be found in the NOTICE file.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'mirah/jvm/types'
17
+ require 'mirah/util/compilation_state'
18
+ require 'mirah/util/argument_processor'
19
+ require 'mirah/errors'
20
+
21
+ module Mirah
22
+ module Commands
23
+ class Base
24
+ def initialize(args)
25
+ Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
26
+ @state = Mirah::Util::CompilationState.new
27
+ @state.command = command_name
28
+ @args = args
29
+ @argument_processor = Mirah::Util::ArgumentProcessor.new(@state, @args)
30
+ end
31
+
32
+ attr_accessor :state, :args, :argument_processor
33
+
34
+ def execute_base
35
+ # because MirahCommand is a JRuby Java class, SystemExit bubbles through and makes noise
36
+ # so we use a catch/throw to early exit instead
37
+ # see util/process_errors.rb
38
+ status = catch(:exit) do
39
+ begin
40
+ argument_processor.process
41
+ yield
42
+ rescue Mirah::InternalCompilerError => ice
43
+ Mirah.print_error(ice.message, ice.position) if ice.node
44
+ raise ice.cause if (ice.cause && state.verbose)
45
+ raise ice
46
+ rescue Mirah::MirahError => ex
47
+ Mirah.print_error(ex.message, ex.position)
48
+ puts ex.backtrace if state.verbose
49
+ throw :exit, 1
50
+ end
51
+ 0
52
+ end
53
+ exit status if status > 0
54
+ end
55
+ end
56
+ end
57
+ end
@@ -22,14 +22,10 @@ module Mirah
22
22
  def execute
23
23
  execute_base do
24
24
  main = nil
25
- class_map = {}
25
+
26
26
 
27
27
  # generate all bytes for all classes
28
- generator = Mirah::Generator.new(@state, @state.compiler_class, false, @state.verbose)
29
-
30
- generator.generate(args).each do |result|
31
- class_map[result.classname.gsub(/\//, '.')] = Mirah::Util::ClassLoader.binary_string result.bytes
32
- end
28
+ class_map = generate_class_map
33
29
 
34
30
  # load all classes
35
31
  main = load_classes_and_find_main(class_map)
@@ -44,6 +40,16 @@ module Mirah
44
40
  end
45
41
 
46
42
  private
43
+
44
+ def generate_class_map
45
+ generator = Mirah::Generator.new(@state, @state.compiler_class, false, @state.verbose)
46
+
47
+ class_map = {}
48
+ generator.generate(args).each do |result|
49
+ class_map[result.classname.gsub(/\//, '.')] = Mirah::Util::ClassLoader.binary_string result.bytes
50
+ end
51
+ class_map
52
+ end
47
53
 
48
54
  def load_classes_and_find_main(class_map)
49
55
  main = nil
@@ -65,9 +71,10 @@ module Mirah
65
71
  raise e
66
72
  end
67
73
  else
68
- puts "No main found" unless @state.version_printed || @state.help_printed
74
+ $stderr.puts "No main found"
75
+ exit 1
69
76
  end
70
77
  end
71
78
  end
72
79
  end
73
- end
80
+ end
@@ -609,7 +609,9 @@ module Mirah
609
609
  method.call(self, call, expression)
610
610
  return
611
611
  else
612
+ @method.print "(" if Mirah::AST::StringConcat === target
612
613
  target.compile(self, true)
614
+ @method.print ")" if Mirah::AST::StringConcat === target
613
615
  @method.print ".#{method.name}("
614
616
  end
615
617
 
@@ -700,20 +702,22 @@ module Mirah
700
702
  if expression
701
703
  nodes = precompile_nodes(orig_nodes)
702
704
  simple = nodes.equal?(orig_nodes)
703
- if !simple
705
+
706
+ unless simple
704
707
  @method.print(lvalue)
705
708
  end
706
- first = true
707
- unless nodes[0].kind_of?(Mirah::AST::String)
708
- @method.print '""'
709
- first = false
710
- end
711
- nodes.each do |node|
712
- @method.print ' + ' unless first
713
- first = false
709
+
710
+ @method.print '"" + ' unless nodes.first.kind_of?(Mirah::AST::String)
711
+
712
+ nodes.first.compile(self, true)
713
+
714
+ nodes[1..-1].each do |node|
715
+ @method.print ' + '
714
716
  node.compile(self, true)
715
717
  end
716
- @method.puts ';' unless simple
718
+ unless simple
719
+ @method.puts ';'
720
+ end
717
721
  else
718
722
  orig_nodes.each {|n| n.compile(self, false)}
719
723
  end
@@ -776,4 +780,4 @@ module Mirah
776
780
  end
777
781
  end
778
782
  end
779
- end
783
+ end