mirah 0.1.0.pre-java → 0.1.1-java

Sign up to get free protection for your applications and to get access to all the features.
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