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.
- data/History.txt +736 -0
- data/README.md +71 -0
- data/Rakefile +227 -73
- data/examples/Fib.class +0 -0
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +2 -3
- data/examples/simple_class.mirah +3 -3
- data/examples/{dynamic.mirah → simple_class.mirah~} +7 -12
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-compiler.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/mirah.rb +8 -1
- data/lib/mirah/ast.rb +1 -1
- data/lib/mirah/ast/scope.rb +16 -0
- data/lib/mirah/commands/base.rb +1 -3
- data/lib/mirah/compiler.rb +17 -3
- data/lib/mirah/errors.rb +10 -10
- data/lib/mirah/generator.rb +21 -9
- data/lib/mirah/jvm/compiler.rb +17 -0
- data/lib/mirah/jvm/compiler/base.rb +24 -5
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +83 -20
- data/lib/mirah/jvm/method_lookup.rb +43 -22
- data/lib/mirah/jvm/types.rb +1 -2
- data/lib/mirah/jvm/types/array_type.rb +1 -6
- data/lib/mirah/jvm/types/ast_ext.rb +31 -0
- data/lib/mirah/jvm/types/basic_types.rb +1 -2
- data/lib/mirah/jvm/types/boolean.rb +11 -10
- data/lib/mirah/jvm/types/extensions.rb +14 -5
- data/lib/mirah/jvm/types/factory.rb +128 -43
- data/lib/mirah/jvm/types/floats.rb +8 -10
- data/lib/mirah/jvm/types/integers.rb +16 -9
- data/lib/mirah/jvm/types/intrinsics.rb +17 -69
- data/lib/mirah/jvm/types/meta_type.rb +5 -0
- data/lib/mirah/jvm/types/methods.rb +317 -151
- data/lib/mirah/jvm/types/methods.rb~ +973 -0
- data/lib/mirah/jvm/types/number.rb +29 -6
- data/lib/mirah/jvm/types/primitive_type.rb +35 -7
- data/lib/mirah/jvm/types/source_mirror.rb +11 -6
- data/lib/mirah/jvm/types/type.rb +52 -0
- data/lib/mirah/jvm/types/type_definition.rb +8 -2
- data/lib/mirah/transform/ast_ext.rb +9 -31
- data/lib/mirah/transform/transformer.rb +1 -1
- data/lib/mirah/typer.rb +2 -1
- data/lib/mirah/util/argument_processor.rb +10 -14
- data/lib/mirah/util/argument_processor.rb~ +146 -0
- data/lib/mirah/util/compilation_state.rb +15 -9
- data/lib/mirah/util/process_errors.rb +8 -2
- data/lib/mirah/version.rb +2 -2
- data/lib/mirah_task.rb +0 -7
- data/test/core/typer_test.rb +21 -13
- data/test/core/util/argument_processor_test.rb +19 -19
- data/test/core/util/class_loader_test.rb +19 -4
- data/test/core/util/compilation_state_test.rb +38 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/blocks_test.rb +50 -29
- data/test/jvm/bytecode_test_helper.rb +71 -57
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +48 -0
- data/test/jvm/enumerable_test.rb +136 -7
- data/test/jvm/example_test.rb +39 -0
- data/test/jvm/factory_test.rb +6 -0
- data/test/jvm/generics_test.rb +0 -5
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +113 -0
- data/test/jvm/java_typer_test.rb +57 -11
- data/test/jvm/jvm_commands_test.rb +24 -0
- data/test/jvm/jvm_compiler_test.rb +186 -370
- data/test/jvm/macros_test.rb +67 -6
- data/test/jvm/main_method_test.rb +1 -1
- data/test/jvm/mirror_compilation_test_helper.rb +24 -0
- data/test/jvm/new_backend_test_helper.rb +25 -0
- data/test/jvm/rescue_test.rb +153 -18
- data/test/jvm/string_test.rb +41 -0
- data/test/jvm/varargs_test.rb +65 -0
- data/test/mirrors/base_type_test.rb +96 -0
- data/test/mirrors/bytecode_mirror_test.rb +86 -0
- data/test/mirrors/generics_test.rb +776 -0
- data/test/mirrors/member_test.rb +69 -0
- data/test/mirrors/method_lookup_test.rb +574 -0
- data/test/mirrors/mirrors_test.rb +562 -0
- data/test/mirrors/simple_async_mirror_loader_test.rb +110 -0
- data/test/mirrors/simple_mirror_loader_test.rb +104 -0
- data/test/test_helper.rb +2 -1
- metadata +244 -217
- data/README.txt +0 -59
- data/javalib/dynalink-0.2.jar +0 -0
- data/lib/mirah/jvm/typer.rb +0 -177
- data/lib/mirah/jvm/types/dynamic_type.rb +0 -45
- 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.
|
data/javalib/dynalink-0.2.jar
DELETED
|
Binary file
|
data/lib/mirah/jvm/typer.rb
DELETED
|
@@ -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
|