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.txt DELETED
@@ -1,59 +0,0 @@
1
- = mirah
2
-
3
- * http://groups.google.com/group/mirah
4
- * http://github.com/mirah/mirah/issues
5
-
6
- == DESCRIPTION:
7
-
8
- Mirah is a customizable programming language featuring static types,
9
- local type inference and a heavily Ruby-inspired syntax. Mirah
10
- currently includes a typer/compiler backend for the JVM which can
11
- output either JVM bytecode or Java source files.
12
-
13
- == FEATURES:
14
-
15
- * Ruby-like syntax
16
- * Compiles to .class or .java
17
- * Fast as Java
18
- * No runtime library
19
-
20
- == SYNOPSIS:
21
-
22
- mirah <script.mirah>
23
- mirah -e "inline script"
24
- mirahc <script.mirah>
25
- mirahc -e "inline script" # produces DashE.class
26
- mirahc --java <script.mirah>
27
- mirahc --java -e "inline script" # produces DashE.java
28
-
29
- == REQUIREMENTS:
30
-
31
- * JRuby 1.6.0 or higher.
32
- * BiteScript 0.0.8 or higher
33
-
34
- == INSTALL:
35
-
36
- === RUBY:
37
- If your gem and rake are not from from JRuby, prefix the commands with jruby -S
38
-
39
- $ gem install mirah
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
-
49
- To build and install from source,
50
-
51
- $ git clone http://github.com/mirah/mirah.git
52
- $ cd mirah
53
- $ bundle install
54
- $ rake gem
55
- $ gem install pkg/mirah-*.gem
56
-
57
- == For Java tools:
58
-
59
- To build the Mirah jar from source run "rake jar" in the mirah directory.
Binary file
@@ -1,177 +0,0 @@
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/jvm/types/factory'
18
-
19
- module Mirah
20
- module JVM
21
- class Typer < Mirah::Typer::Simple
22
- include Mirah::JVM::Types
23
-
24
- attr_reader :transformer
25
-
26
- def initialize(transformer)
27
- @factory = AST.type_factory
28
- @transformer = transformer
29
- unless @factory.kind_of? TypeFactory
30
- raise "TypeFactory not installed"
31
- end
32
- @known_types = @factory.known_types
33
- @known_types['dynamic'] = DynamicType.new
34
- @errors = []
35
- self.scopes = transformer.scopes
36
- end
37
-
38
- def define_type(node, name, superclass, interfaces)
39
- scope = get_scope(node)
40
- @factory.define_type(scope, node)
41
- super(scope, name, superclass, interfaces)
42
- end
43
-
44
- def set_filename(scope, filename)
45
- classname = Mirah::JVM::Compiler::JVMBytecode.classname_from_filename(filename)
46
- main_class = @factory.declare_type(scope, classname)
47
- @known_types['self'] = main_class.meta
48
- end
49
-
50
- def type_reference(scope, name, array=false, meta=false)
51
- begin
52
- @factory.type(scope, name, array, meta)
53
- rescue NameError => ex
54
- known_types[name] = Mirah::AST.error_type
55
- raise Mirah::InferenceError.wrap(ex, nil)
56
- end
57
- end
58
-
59
- def name
60
- "JVM"
61
- end
62
-
63
- def type_definition(scope, name, superclass, interfaces)
64
- imports = scope.imports
65
- name = imports[name] while imports.include?(name)
66
- package = scope.package
67
- unless name =~ /\./ || package.empty?
68
- name = "#{package}.#{name}"
69
- end
70
-
71
- @known_types[name]
72
- end
73
-
74
- def null_type
75
- Null
76
- end
77
-
78
- def no_type
79
- Void
80
- end
81
-
82
- def array_type
83
- # TODO: allow other types for pre-1.2 profiles
84
- type_reference(nil, "java.util.List")
85
- end
86
-
87
- def hash_type
88
- # TODO: allow other types for pre-1.2 profiles
89
- type_reference(nil, "java.util.Map")
90
- end
91
-
92
- def regexp_type
93
- type_reference(nil, "java.util.regex.Pattern")
94
- end
95
-
96
- def known_type(scope, name)
97
- @factory.known_type(scope, name)
98
- end
99
-
100
- def fixnum_type(value)
101
- FixnumLiteral.new(value)
102
- end
103
-
104
- def float_type(value)
105
- FloatLiteral.new(value)
106
- end
107
-
108
- def learn_method_type(target_type, name, parameter_types, type, exceptions)
109
- static = target_type.meta?
110
- if static
111
- target_type.unmeta.declare_static_method(name, parameter_types, type, exceptions)
112
- else
113
- target_type.declare_method(name, parameter_types, type, exceptions)
114
- end
115
- super
116
- end
117
-
118
- def infer_signature(method_def)
119
- signature = method_def.signature
120
- sig_args = signature.dup
121
- return_type = sig_args.delete(:return)
122
- exceptions = sig_args.delete(:throws)
123
- args = method_def.arguments.args || []
124
- static = method_def.kind_of? Mirah::AST::StaticMethodDefinition
125
- if sig_args.size != args.size
126
- # If the superclass declares one method with the same name and
127
- # same number of arguments, assume we're overriding it.
128
- found = nil
129
- ambiguous = false
130
- classes = [self_type.superclass] + self_type.interfaces
131
- while classes.size > 0
132
- cls = classes.pop
133
- if static
134
- methods = cls.declared_class_methods
135
- else
136
- methods = cls.declared_instance_methods
137
- end
138
- methods.each do |method|
139
- if method.name == method_def.name &&
140
- method.argument_types.size == args.size
141
- if found && found.argument_types != method.argument_types
142
- ambiguous = true
143
- else
144
- found ||= method
145
- end
146
- end
147
- end
148
- classes << cls.superclass if cls.superclass
149
- end
150
- if found && !ambiguous
151
- signature[:return] = found.return_type
152
- signature[:throws] = found.exceptions
153
- args.zip(found.argument_types) do |arg, type|
154
- signature[arg.name.intern] = type
155
- end
156
- end
157
- elsif signature[:return].nil? && !static
158
- arg_types = args.map do |arg|
159
- signature[arg.name.intern]
160
- end
161
- method = self_type.find_method(
162
- self_type, method_def.name, arg_types, false)
163
- interfaces = self_type.interfaces.dup
164
- until method || interfaces.empty?
165
- interface = interfaces.pop
166
- method = interface.find_method(
167
- interface, method_def.name, arg_types, false)
168
- end
169
- if method
170
- signature[:return] = method.return_type
171
- signature[:throws] = method.exceptions
172
- end
173
- end
174
- end
175
- end
176
- end
177
- end
@@ -1,45 +0,0 @@
1
- module Mirah
2
- module JVM
3
- module Types
4
- class DynamicType < Type
5
- def initialize(types)
6
- # For naming, bytecode purposes, we are an Object
7
- super(types, "java.lang.Object")
8
- @object_type ||= types.type(nil, 'java.lang.Object')
9
- end
10
-
11
- def basic_type
12
- self
13
- end
14
-
15
- def is_parent(other)
16
- @object_type.assignable_from?(other)
17
- end
18
-
19
- def assignable_from?(other)
20
- @object_type.assignable_from?(other)
21
- end
22
-
23
- def jvm_type
24
- java.lang.Object
25
- end
26
-
27
- def full_name
28
- "dynamic"
29
- end
30
-
31
- def dynamic?
32
- true
33
- end
34
-
35
- def superclass
36
- @object_type.superclass
37
- end
38
-
39
- def interfaces(include_parent=true)
40
- @object_type.interfaces
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,27 +0,0 @@
1
- module Mirah
2
- module JVM
3
- module Types
4
- class UnreachableType < Type
5
- def initialize
6
- super('java.lang.Object')
7
- end
8
-
9
- def to_s
10
- "Type(null)"
11
- end
12
-
13
- def unreachable?
14
- true
15
- end
16
-
17
- def compatible?(other)
18
- true
19
- end
20
-
21
- def assignable_from?(other)
22
- true
23
- end
24
- end
25
- end
26
- end
27
- end