mirah 0.1.2-java → 0.1.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +225 -0
  3. data/Rakefile +108 -315
  4. data/TODO.md +100 -0
  5. data/bin/bundler +16 -0
  6. data/bin/rake +16 -0
  7. data/dist/mirahc.jar +0 -0
  8. data/examples/appengine/Readme +0 -1
  9. data/examples/literals.mirah +17 -0
  10. data/examples/macros/string_each_char.mirah +1 -1
  11. data/lib/mirah.rb +11 -21
  12. data/lib/mirah/transform/transformer.rb +1 -2
  13. data/lib/mirah/util/class_loader.rb +1 -1
  14. data/lib/mirah/util/logging.rb +0 -63
  15. data/lib/mirah/util/process_errors.rb +1 -0
  16. data/lib/mirah/version.rb +1 -1
  17. data/{examples/simple_class.mirah~ → test/artifacts/jar_test.rb} +7 -11
  18. data/{lib/mirah/commands.rb → test/artifacts/jruby_test.rb} +8 -5
  19. data/test/core/typer_test.rb +29 -11
  20. data/test/core/util/argument_processor_test.rb +24 -23
  21. data/test/core/util/class_loader_test.rb +7 -4
  22. data/test/core/util/{compilation_state_test.rb → jvm_version_test.rb} +20 -16
  23. data/test/fixtures/org/foo/ImplicitClassRetAnno.java +4 -0
  24. data/test/fixtures/org/foo/IntAnno.java +9 -0
  25. data/test/jvm/annotations_test.rb +11 -11
  26. data/test/jvm/blocks_test.rb +16 -12
  27. data/test/jvm/constructors_test.rb +8 -8
  28. data/test/jvm/enumerable_test.rb +48 -24
  29. data/test/jvm/generics_test.rb +3 -7
  30. data/test/jvm/import_test.rb +14 -0
  31. data/test/jvm/interface_test.rb +9 -24
  32. data/test/jvm/jvm_commands_test.rb +22 -4
  33. data/test/jvm/jvm_compiler_test.rb +124 -79
  34. data/test/jvm/list_extensions_test.rb +1 -1
  35. data/test/jvm/macros_test.rb +67 -14
  36. data/test/jvm/main_method_test.rb +1 -1
  37. data/test/jvm/new_backend_test_helper.rb +100 -3
  38. data/{lib/mirah/jvm/types/bitescript_ext.rb → test/jvm/static_fields_test.rb} +22 -21
  39. data/test/mirrors/base_type_test.rb +4 -3
  40. data/test/mirrors/bytecode_mirror_test.rb +35 -15
  41. data/test/mirrors/generics_test.rb +14 -5
  42. data/test/mirrors/member_test.rb +2 -1
  43. data/test/mirrors/method_lookup_test.rb +18 -6
  44. data/test/mirrors/mirrors_test.rb +87 -20
  45. data/test/mirrors/simple_async_mirror_loader_test.rb +7 -3
  46. data/test/mirrors/simple_mirror_loader_test.rb +5 -5
  47. data/test/test_helper.rb +25 -1
  48. metadata +18 -78
  49. data/bin/mirahp +0 -27
  50. data/bin/mirahp.cmd +0 -16
  51. data/examples/Fib.class +0 -0
  52. data/javalib/mirah-bootstrap.jar +0 -0
  53. data/javalib/mirah-builtins.jar +0 -0
  54. data/javalib/mirah-compiler.jar +0 -0
  55. data/javalib/mirah-mirrors.jar +0 -0
  56. data/javalib/mirah-newast-transitional.jar +0 -0
  57. data/javalib/mirah-parser.jar +0 -0
  58. data/javalib/mirah-util.jar +0 -0
  59. data/lib/mirah/ast.rb +0 -43
  60. data/lib/mirah/ast/scope.rb +0 -262
  61. data/lib/mirah/commands/base.rb +0 -59
  62. data/lib/mirah/commands/compile.rb +0 -39
  63. data/lib/mirah/commands/parse.rb +0 -36
  64. data/lib/mirah/commands/run.rb +0 -78
  65. data/lib/mirah/generator.rb +0 -150
  66. data/lib/mirah/jvm/compiler.rb +0 -50
  67. data/lib/mirah/jvm/compiler/base.rb +0 -421
  68. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +0 -1194
  69. data/lib/mirah/jvm/method_lookup.rb +0 -307
  70. data/lib/mirah/jvm/types.rb +0 -45
  71. data/lib/mirah/jvm/types/array_type.rb +0 -60
  72. data/lib/mirah/jvm/types/ast_ext.rb +0 -31
  73. data/lib/mirah/jvm/types/basic_types.rb +0 -41
  74. data/lib/mirah/jvm/types/block_type.rb +0 -15
  75. data/lib/mirah/jvm/types/boolean.rb +0 -70
  76. data/lib/mirah/jvm/types/enumerable.rb +0 -80
  77. data/lib/mirah/jvm/types/extensions.rb +0 -110
  78. data/lib/mirah/jvm/types/factory.rb +0 -830
  79. data/lib/mirah/jvm/types/floats.rb +0 -99
  80. data/lib/mirah/jvm/types/generic_type.rb +0 -72
  81. data/lib/mirah/jvm/types/implicit_nil_type.rb +0 -29
  82. data/lib/mirah/jvm/types/integers.rb +0 -131
  83. data/lib/mirah/jvm/types/interface_definition.rb +0 -20
  84. data/lib/mirah/jvm/types/intrinsics.rb +0 -385
  85. data/lib/mirah/jvm/types/literals.rb +0 -89
  86. data/lib/mirah/jvm/types/meta_type.rb +0 -54
  87. data/lib/mirah/jvm/types/methods.rb +0 -946
  88. data/lib/mirah/jvm/types/null_type.rb +0 -39
  89. data/lib/mirah/jvm/types/number.rb +0 -184
  90. data/lib/mirah/jvm/types/primitive_type.rb +0 -76
  91. data/lib/mirah/jvm/types/source_mirror.rb +0 -274
  92. data/lib/mirah/jvm/types/type.rb +0 -311
  93. data/lib/mirah/jvm/types/type_definition.rb +0 -72
  94. data/lib/mirah/jvm/types/void_type.rb +0 -19
  95. data/lib/mirah/util/compilation_state.rb +0 -60
  96. data/test/core/commands_test.rb +0 -89
  97. data/test/core/generator_test.rb +0 -26
  98. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  99. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  100. data/test/jvm/bytecode_test_helper.rb +0 -193
  101. data/test/jvm/factory_test.rb +0 -28
  102. data/test/jvm/java_typer_test.rb +0 -283
@@ -1,99 +0,0 @@
1
- # Copyright (c) 2010-2013 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
- module Mirah::JVM::Types
17
- class FloatType < Number
18
- def prefix
19
- 'f'
20
- end
21
-
22
- def math_type
23
- @type_system.type(nil, 'float')
24
- end
25
-
26
- def suffix
27
- 'g'
28
- end
29
-
30
- def init_value(builder)
31
- builder.fconst_0
32
- end
33
-
34
- def literal(builder, value)
35
- case value
36
- when 0.0
37
- builder.fconst_0
38
- when 1.0
39
- builder.fconst_1
40
- when 2.0
41
- builder.fconst_2
42
- else
43
- builder.ldc_float(value)
44
- end
45
- end
46
-
47
- def compile_widen(builder, type)
48
- case type.name
49
- when 'float'
50
- # Do nothing
51
- when 'double'
52
- builder.f2d
53
- when wrapper_name, 'java.lang.Object'
54
- builder.invokestatic @wrapper, "valueOf", [@wrapper, builder.send(name)]
55
- else
56
- raise ArgumentError, "Invalid widening conversion from float to #{type}"
57
- end
58
- end
59
- end
60
-
61
- class DoubleType < FloatType
62
- def prefix
63
- 'd'
64
- end
65
-
66
- def math_type
67
- @type_system.type(nil, 'double')
68
- end
69
-
70
- def wide?
71
- true
72
- end
73
-
74
- def init_value(builder)
75
- builder.dconst_0
76
- end
77
-
78
- def literal(builder, value)
79
- case value
80
- when 0.0
81
- builder.dconst_0
82
- when 1.0
83
- builder.dconst_1
84
- else
85
- builder.ldc_double(value)
86
- end
87
- end
88
-
89
- def compile_widen(builder, type)
90
- case type.name
91
- when 'double'
92
- when wrapper_name, 'java.lang.Object'
93
- builder.invokestatic @wrapper, "valueOf", [@wrapper, builder.send(name)]
94
- else
95
- raise ArgumentError, "Invalid widening conversion from double to #{type}"
96
- end
97
- end
98
- end
99
- end
@@ -1,72 +0,0 @@
1
- module Mirah
2
- module JVM
3
- module Types
4
- class GenericType < Type
5
- java_import 'java.util.HashMap'
6
- java_import 'org.mirah.typer.GenericType'
7
- include GenericType
8
-
9
- attr_reader :ungeneric
10
-
11
- def initialize(ungeneric)
12
- super(ungeneric.type_system, ungeneric.name)
13
- @ungeneric = ungeneric
14
- end
15
-
16
- def basic_type
17
- @ungeneric.basic_type
18
- end
19
-
20
- def generic?
21
- true
22
- end
23
-
24
- def generic
25
- self
26
- end
27
-
28
- def ungeneric
29
- @ungeneric
30
- end
31
-
32
- def superclass
33
- @ungeneric.superclass.generic if @ungeneric.superclass
34
- end
35
-
36
- def declared_macros(name=nil)
37
- @ungeneric.declared_macros(name)
38
- end
39
-
40
- def interfaces(include_parent=true)
41
- ungeneric.interfaces
42
- end
43
-
44
- def jvm_type
45
- @ungeneric.jvm_type
46
- end
47
-
48
- def inner_class?
49
- basic_type.inner_class?
50
- end
51
-
52
- def type_parameter_map
53
- unless @type_parameter_map
54
- @type_parameter_map = HashMap.new
55
- end
56
- @type_parameter_map
57
- end
58
-
59
- def assignable_from?(other)
60
- @ungeneric.assignable_from?(other)
61
- end
62
-
63
- def inspect(indent=0)
64
- "#{' ' * indent}#<#{self.class.name.split(/::/)[-1]} #{name} #{type_parameter_map}>"
65
- end
66
- end
67
-
68
- class TypeDefGeneric < GenericType
69
- end
70
- end
71
- end
72
- end
@@ -1,29 +0,0 @@
1
- module Mirah
2
- module JVM
3
- module Types
4
- class ImplicitNilType < Type
5
- def initialize(types)
6
- super(types, types.get_mirror('java.lang.Object'))
7
- end
8
-
9
- def to_s
10
- "Type(implicit_nil)"
11
- end
12
-
13
- def widen(other)
14
- other
15
- end
16
-
17
- def compatible?(other)
18
- true
19
- end
20
-
21
- def assignable_from?(other)
22
- true
23
- end
24
-
25
- def matchesAnything; true; end
26
- end
27
- end
28
- end
29
- end
@@ -1,131 +0,0 @@
1
- # Copyright (c) 2010-2013 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/bitescript_ext'
17
-
18
- module Mirah::JVM::Types
19
- class IntegerType < Number
20
- def literal(builder, value)
21
- builder.push_int(value)
22
- end
23
-
24
- def init_value(builder)
25
- builder.iconst_0
26
- end
27
-
28
- def load(builder, index)
29
- builder.iload(index)
30
- end
31
-
32
- def compile_widen(builder, type)
33
- case type.name
34
- when 'byte', 'short', 'int'
35
- # do nothing
36
- when 'long'
37
- builder.i2l
38
- when 'float'
39
- builder.i2f
40
- when 'double'
41
- builder.i2d
42
- when wrapper_name, 'java.lang.Object'
43
- builder.invokestatic @wrapper, "valueOf", [@wrapper, builder.send(name)]
44
- else
45
- raise ArgumentError, "Invalid widening conversion from #{name} to #{type}"
46
- end
47
- end
48
-
49
- def prefix
50
- 'i'
51
- end
52
-
53
- def math_type
54
- @type_system.type(nil, 'int')
55
- end
56
-
57
- def jump_if(builder, op, label)
58
- builder.send "if_icmp#{op}", label
59
- end
60
-
61
- def add_intrinsics
62
- super
63
- math_operator('<<', 'shl')
64
- math_operator('>>', 'shr')
65
- math_operator('>>>', 'ushr')
66
- math_operator('|', 'or')
67
- math_operator('&', 'and')
68
- math_operator('^', 'xor')
69
- unary_operator('~', 'not')
70
- end
71
- end
72
-
73
- class CharacterType < IntegerType
74
- def compile_widen(builder, type)
75
- case type.name
76
- when 'char'
77
- # do nothing
78
- else
79
- super
80
- end
81
- end
82
- end
83
-
84
- class LongType < Number
85
- def prefix
86
- 'l'
87
- end
88
-
89
- def math_type
90
- @type_system.type(nil, 'long')
91
- end
92
-
93
- def literal(builder, value)
94
- builder.ldc_long(value)
95
- end
96
-
97
- def init_value(builder)
98
- builder.lconst_0
99
- end
100
-
101
- def wide?
102
- true
103
- end
104
-
105
- def compile_widen(builder, type)
106
- case type.name
107
- when 'long'
108
- # do nothing
109
- when 'float'
110
- builder.l2f
111
- when 'double'
112
- builder.l2d
113
- when wrapper_name, 'java.lang.Object'
114
- builder.invokestatic @wrapper, "valueOf", [@wrapper, builder.send(name)]
115
- else
116
- raise ArgumentError, "Invalid widening conversion from Int to #{type}"
117
- end
118
- end
119
-
120
- def add_intrinsics
121
- super
122
- math_operator('<<', 'shl')
123
- math_operator('>>', 'shr')
124
- math_operator('>>>', 'ushr')
125
- math_operator('|', 'or')
126
- math_operator('&', 'and')
127
- math_operator('^', 'xor')
128
- unary_operator('~', 'not')
129
- end
130
- end
131
- end
@@ -1,20 +0,0 @@
1
- module Mirah
2
- module JVM
3
- module Types
4
- class InterfaceDefinition < TypeDefinition
5
- def initialize(types, scope, name, node)
6
- super(types, scope, name, node)
7
- end
8
-
9
- def define(builder)
10
- class_name = @name.tr('.', '/')
11
- @type ||= builder.public_interface(class_name, *interfaces)
12
- end
13
-
14
- def interface?
15
- true
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,385 +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 'bitescript'
17
- require 'mirah/jvm/types/bitescript_ext'
18
-
19
- module Mirah::JVM::Types
20
- class Type
21
- java_import 'org.mirah.macros.anno.MacroDef'
22
-
23
- def load(builder, index)
24
- builder.send "#{prefix}load", index
25
- end
26
-
27
- def store(builder, index)
28
- builder.send "#{prefix}store", index
29
- end
30
-
31
- def return(builder)
32
- builder.send "#{prefix}return"
33
- end
34
-
35
- def init_value(builder)
36
- builder.aconst_null
37
- end
38
-
39
- def intrinsics
40
- @intrinsics ||= begin
41
- @intrinsics = Hash.new {|h, k| h[k] = {}}
42
- add_intrinsics
43
- @intrinsics
44
- end
45
- end
46
-
47
- def macros
48
- @macros ||= Hash.new {|h, k| h[k] = {}}
49
- end
50
-
51
- def add_method(name, args, method_or_type=nil, kind=nil, &block)
52
- if block_given?
53
- method_or_type = Intrinsic.new(self, name, args,
54
- method_or_type, kind, &block)
55
- end
56
- intrinsics[name][args] = method_or_type
57
- end
58
-
59
- def add_compiled_macro(klass)
60
- name, arg_types, is_static = read_macrodef_annotation(klass)
61
- if arg_types.nil?
62
- return
63
- elsif is_static && !self.meta?
64
- self.meta.add_compiled_macro(klass)
65
- return
66
- end
67
-
68
- log "Adding macro #{self.name}.#{name}(#{arg_types.map{|t| t.full_name}.join(', ')})"
69
- # TODO separate static and instance macros
70
- macro = Macro.new(self, name, arg_types) do |call, typer|
71
- #TODO scope
72
- # We probably need to set the scope on all the parameters, plus the
73
- # arguments and body of any block params. Also make sure scope is copied
74
- # when cloned.
75
- scope = typer.scoper.get_scope(call)
76
- # call.parameters.each do |arg|
77
- # arg.scope = scope
78
- # end
79
-
80
- begin
81
- expander = klass.constructors[0].newInstance(typer.macro_compiler, call)
82
- ast = expander.expand
83
- # rescue
84
- # puts "Unable to expand macro #{name.inspect} from #{klass} with #{call}"
85
- end
86
- if ast
87
- body = Mirah::AST::NodeList.new(ast.position.to_java(Mirah::AST::Position))
88
- # TODO scope
89
- # static_scope = typer.scoper.add_scope(body)
90
- # static_scope.parent = typer.scoper.get_scope(call)
91
- body.add(ast)
92
- # if call.target
93
- # static_scope.self_type = call.target.inferred_type!
94
- # static_scope.self_node = call.target
95
- # else
96
- # static_scope.self_type = scope.self_type
97
- # end
98
-
99
- body
100
- else
101
- Mirah::AST::Noop.new
102
- end
103
- end
104
- macros[name][arg_types] = macro
105
- end
106
-
107
- def declared_macros(name=nil)
108
- result = []
109
- each_name = lambda do |name, hash|
110
- hash.each do |args, macro|
111
- result << macro
112
- end
113
- end
114
- if name
115
- each_name.call(name, self.macros[name])
116
- else
117
- self.macros.each &each_name
118
- end
119
- result
120
- end
121
-
122
- def macro(name, types)
123
- macro = macros[name][types]
124
- return macro if macro
125
- macro = superclass.macro(name, types) if (superclass && !superclass.isError)
126
- return macro if macro
127
- interfaces.each do |interface|
128
- macro = interface.macro(name, types) unless interface.isError
129
- return macro if macro
130
- end
131
- nil
132
- end
133
-
134
- def declared_intrinsics(name=nil)
135
- methods = []
136
- all_intrinsics = if name.nil?
137
- intrinsics
138
- else
139
- [[name, intrinsics[name]]]
140
- end
141
- all_intrinsics.each do |name, group|
142
- group.each do |args, method|
143
- methods << method
144
- end
145
- end
146
- interfaces.each do |interface|
147
- methods.concat(interface.declared_intrinsics(name)) unless interface.isError
148
- end
149
- methods
150
- end
151
-
152
- def load_extensions(klass=nil)
153
- mirror = nil
154
- if klass
155
- mirror = @type_system.mirror_class(klass)
156
- elsif jvm_type
157
- mirror = jvm_type
158
- end
159
- if mirror
160
- extensions = mirror.getDeclaredAnnotation('org.mirah.macros.anno.Extensions')
161
- return self if extensions.nil?
162
- macros = extensions['macros']
163
- return self if macros.nil?
164
- macros.each do |macro_class|
165
- klass = begin
166
- JRuby.runtime.jruby_class_loader.loadClass(macro_class)
167
- rescue java.lang.NoClassDefFoundError => ex
168
- raise ex
169
- end
170
- add_compiled_macro(klass)
171
- end
172
- end
173
- self
174
- end
175
-
176
- def read_macrodef_annotation(klass)
177
- macro = klass.getAnnotation(MacroDef.java_class)
178
- if macro.nil?
179
- error("Unable to load macro #{klass.name}: no MacroDef annotation")
180
- return
181
- end
182
- macro_name = macro.name
183
- # TODO optional, rest args
184
- args = macro.arguments.required.map do |typename|
185
- type = @type_system.get_type(typename)
186
- raise "Unable to find class #{typename}" unless type
187
- type
188
- end
189
- [macro_name, args, macro.is_static]
190
- end
191
-
192
- def add_intrinsics
193
- boolean = @type_system.type(nil, 'boolean')
194
- object_type = @type_system.type(nil, 'java.lang.Object')
195
- class_type = @type_system.type(nil, 'java.lang.Class')
196
-
197
- add_method('nil?', [], boolean, 'IS_NULL') do |compiler, call, expression|
198
- if expression
199
- compiler.visit(call.target, true)
200
- compiler.method.op_to_bool do |target|
201
- compiler.method.ifnull(target)
202
- end
203
- end
204
- end
205
-
206
- add_method('==', [object_type], boolean, 'COMPARISON_OP') do |compiler, call, expression|
207
- # Should this call Object.equals for consistency with Ruby?
208
- if expression
209
- compiler.visit(call.target, true)
210
- compiler.visit(call.parameters(0), true)
211
- compiler.method.op_to_bool do |target|
212
- compiler.method.if_acmpeq(target)
213
- end
214
- end
215
- end
216
-
217
- add_method('!=', [object_type], boolean, 'COMPARISON_OP') do |compiler, call, expression|
218
- # Should this call Object.equals for consistency with Ruby?
219
- if expression
220
- compiler.visit(call.target, true)
221
- compiler.visit(call.parameters(0), true)
222
- compiler.method.op_to_bool do |target|
223
- compiler.method.if_acmpne(target)
224
- end
225
- end
226
- end
227
-
228
- add_method('kind_of?', [object_type.meta], boolean, "INSTANCEOF") do |compiler, call, expression|
229
- compiler.visit(call.target, expression)
230
- if expression
231
- klass = compiler.inferred_type(call.parameters(0))
232
- compiler.method.instanceof(klass.unmeta)
233
- end
234
- end
235
-
236
- # add_macro('kind_of?', class_type) do |transformer, call|
237
- # klass, object = call.parameters(0), call.target
238
- # Mirah::AST::Call.new(call.parent, call.position, 'isInstance') do |call2|
239
- # klass.parent = object.parent = call2
240
- # [
241
- # klass,
242
- # [object]
243
- # ]
244
- # end
245
- # end
246
- #
247
- end
248
- end
249
-
250
- class ArrayType
251
- begin
252
- java_import 'org.mirah.builtins.ArrayExtensions'
253
- java_import 'org.mirah.builtins.EnumerableExtensions'
254
- rescue NameError
255
- ArrayExtensions = nil
256
- EnumerableExtensions = nil
257
- end
258
-
259
- def add_intrinsics
260
- super
261
- load_extensions(EnumerableExtensions.java_class) if EnumerableExtensions
262
- load_extensions(ArrayExtensions.java_class) if ArrayExtensions
263
- int_type = @type_system.type(nil, 'int')
264
- add_method(
265
- '[]', [int_type], component_type, "ARRAY_ACCESS") do |compiler, call, expression|
266
- if expression
267
- compiler.visit(call.target, true)
268
- compiler.visit(call.parameters(0), true)
269
- component_type.aload(compiler.method)
270
- end
271
- end
272
-
273
- add_method('[]=',
274
- [int_type, component_type],
275
- component_type, "ARRAY_ASSIGN") do |compiler, call, expression|
276
- compiler.visit(call.target, true)
277
- convert_args(compiler, call.parameters, [@type_system.type(nil, 'int'), component_type])
278
- component_type.astore(compiler.method)
279
- if expression
280
- compiler.visit(call.parameters(1), true)
281
- end
282
- end
283
-
284
- add_method('length', [], int_type, "ARRAY_LENGTH") do |compiler, call, expression|
285
- compiler.visit(call.target, true)
286
- compiler.method.arraylength
287
- end
288
- end
289
- end
290
-
291
- class MetaType
292
- def add_intrinsics
293
- add_method('class', [], @type_system.type(nil, 'java.lang.Class'), "CLASS_LITERAL") do |compiler, call, expression|
294
- if expression
295
- compiler.method.ldc_class(unmeta)
296
- end
297
- end
298
- add_method('[]', [], unmeta.array_type.meta) do |compiler, call, expression|
299
- compiler.method.ldc_class(unmeta.array_type.meta)
300
- end
301
- end
302
- end
303
-
304
- class ArrayMetaType
305
- def add_intrinsics
306
- super
307
- load_extensions(@type_system.type(nil, 'org.mirah.builtins.ArrayMetaExtensions'))
308
- # add_macro('cast', @type_system.type(nil, 'java.lang.Object')) do |transformer, call|
309
- # call.cast = true
310
- # call.resolve_if(nil) { unmeta }
311
- # call
312
- # end
313
- end
314
- end
315
-
316
- class StringType < Type
317
- def add_intrinsics
318
- super
319
- string_type = @type_system.type(nil, 'java.lang.String')
320
- bool_type = @type_system.type(nil, 'boolean')
321
- int_type = @type_system.type(nil, 'int')
322
- long_type = @type_system.type(nil, 'long')
323
- char_type = @type_system.type(nil, 'char')
324
- float_type = @type_system.type(nil, 'float')
325
- double_type = @type_system.type(nil, 'double')
326
- add_method('[]', [int_type], char_type) do |compiler, call, expression|
327
- if expression
328
- compiler.visit(call.target, true)
329
- compiler.visit(call.parameters(0), true)
330
- compiler.method.invokevirtual string_type, "charAt", [char_type, int_type]
331
- end
332
- end
333
- add_method('[]', [int_type, int_type], string_type) do |compiler, call, expression|
334
- if expression
335
- compiler.visit(call.target, true)
336
- compiler.visit(call.parameters(0), true)
337
- compiler.method.dup
338
- compiler.visit(call.parameters[1], true)
339
- compiler.method.iadd
340
- compiler.method.invokevirtual string_type, "substring", [string_type, int_type, int_type]
341
- end
342
- end
343
- end
344
- end
345
-
346
- class IterableType < Type
347
- def add_intrinsics
348
- super
349
- return
350
- add_enumerable_macros
351
- add_macro('each', @type_system.block_type) do |transformer, call|
352
- Mirah::AST::Loop.new(call.parent,
353
- call.position, true, false) do |forloop|
354
- it = transformer.tmp
355
-
356
- assignment = transformer.eval("#{it} = foo.iterator")
357
- assignment.value.target = call.target
358
- call.target.parent = assignment.value
359
- forloop.init << assignment
360
-
361
- var = call.block.args.args[0]
362
- if var
363
- forloop.pre << transformer.eval(
364
- "#{var.name} = #{it}.next", '', forloop, it)
365
- else
366
- forloop.pre << transformer.eval("#{it}.next", '', forloop, it)
367
- end
368
- call.block.body.parent = forloop if call.block.body
369
- [
370
- Mirah::AST::Condition.new(forloop, call.position) do |c|
371
- [transformer.eval("#{it}.hasNext", '', forloop, it)]
372
- end,
373
- call.block.body
374
- ]
375
- end
376
- end
377
- end
378
- end
379
-
380
- class PrimitiveType
381
- # Primitives define their own intrinsics instead of getting the Object ones.
382
- def add_intrinsics
383
- end
384
- end
385
- end