mirah 0.1.2-java → 0.1.3-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.
- checksums.yaml +4 -4
- data/History.txt +225 -0
- data/Rakefile +108 -315
- data/TODO.md +100 -0
- data/bin/bundler +16 -0
- data/bin/rake +16 -0
- data/dist/mirahc.jar +0 -0
- data/examples/appengine/Readme +0 -1
- data/examples/literals.mirah +17 -0
- data/examples/macros/string_each_char.mirah +1 -1
- data/lib/mirah.rb +11 -21
- data/lib/mirah/transform/transformer.rb +1 -2
- data/lib/mirah/util/class_loader.rb +1 -1
- data/lib/mirah/util/logging.rb +0 -63
- data/lib/mirah/util/process_errors.rb +1 -0
- data/lib/mirah/version.rb +1 -1
- data/{examples/simple_class.mirah~ → test/artifacts/jar_test.rb} +7 -11
- data/{lib/mirah/commands.rb → test/artifacts/jruby_test.rb} +8 -5
- data/test/core/typer_test.rb +29 -11
- data/test/core/util/argument_processor_test.rb +24 -23
- data/test/core/util/class_loader_test.rb +7 -4
- data/test/core/util/{compilation_state_test.rb → jvm_version_test.rb} +20 -16
- data/test/fixtures/org/foo/ImplicitClassRetAnno.java +4 -0
- data/test/fixtures/org/foo/IntAnno.java +9 -0
- data/test/jvm/annotations_test.rb +11 -11
- data/test/jvm/blocks_test.rb +16 -12
- data/test/jvm/constructors_test.rb +8 -8
- data/test/jvm/enumerable_test.rb +48 -24
- data/test/jvm/generics_test.rb +3 -7
- data/test/jvm/import_test.rb +14 -0
- data/test/jvm/interface_test.rb +9 -24
- data/test/jvm/jvm_commands_test.rb +22 -4
- data/test/jvm/jvm_compiler_test.rb +124 -79
- data/test/jvm/list_extensions_test.rb +1 -1
- data/test/jvm/macros_test.rb +67 -14
- data/test/jvm/main_method_test.rb +1 -1
- data/test/jvm/new_backend_test_helper.rb +100 -3
- data/{lib/mirah/jvm/types/bitescript_ext.rb → test/jvm/static_fields_test.rb} +22 -21
- data/test/mirrors/base_type_test.rb +4 -3
- data/test/mirrors/bytecode_mirror_test.rb +35 -15
- data/test/mirrors/generics_test.rb +14 -5
- data/test/mirrors/member_test.rb +2 -1
- data/test/mirrors/method_lookup_test.rb +18 -6
- data/test/mirrors/mirrors_test.rb +87 -20
- data/test/mirrors/simple_async_mirror_loader_test.rb +7 -3
- data/test/mirrors/simple_mirror_loader_test.rb +5 -5
- data/test/test_helper.rb +25 -1
- metadata +18 -78
- data/bin/mirahp +0 -27
- data/bin/mirahp.cmd +0 -16
- data/examples/Fib.class +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-compiler.jar +0 -0
- data/javalib/mirah-mirrors.jar +0 -0
- data/javalib/mirah-newast-transitional.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/mirah/ast.rb +0 -43
- data/lib/mirah/ast/scope.rb +0 -262
- data/lib/mirah/commands/base.rb +0 -59
- data/lib/mirah/commands/compile.rb +0 -39
- data/lib/mirah/commands/parse.rb +0 -36
- data/lib/mirah/commands/run.rb +0 -78
- data/lib/mirah/generator.rb +0 -150
- data/lib/mirah/jvm/compiler.rb +0 -50
- data/lib/mirah/jvm/compiler/base.rb +0 -421
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +0 -1194
- data/lib/mirah/jvm/method_lookup.rb +0 -307
- data/lib/mirah/jvm/types.rb +0 -45
- data/lib/mirah/jvm/types/array_type.rb +0 -60
- data/lib/mirah/jvm/types/ast_ext.rb +0 -31
- data/lib/mirah/jvm/types/basic_types.rb +0 -41
- data/lib/mirah/jvm/types/block_type.rb +0 -15
- data/lib/mirah/jvm/types/boolean.rb +0 -70
- data/lib/mirah/jvm/types/enumerable.rb +0 -80
- data/lib/mirah/jvm/types/extensions.rb +0 -110
- data/lib/mirah/jvm/types/factory.rb +0 -830
- data/lib/mirah/jvm/types/floats.rb +0 -99
- data/lib/mirah/jvm/types/generic_type.rb +0 -72
- data/lib/mirah/jvm/types/implicit_nil_type.rb +0 -29
- data/lib/mirah/jvm/types/integers.rb +0 -131
- data/lib/mirah/jvm/types/interface_definition.rb +0 -20
- data/lib/mirah/jvm/types/intrinsics.rb +0 -385
- data/lib/mirah/jvm/types/literals.rb +0 -89
- data/lib/mirah/jvm/types/meta_type.rb +0 -54
- data/lib/mirah/jvm/types/methods.rb +0 -946
- data/lib/mirah/jvm/types/null_type.rb +0 -39
- data/lib/mirah/jvm/types/number.rb +0 -184
- data/lib/mirah/jvm/types/primitive_type.rb +0 -76
- data/lib/mirah/jvm/types/source_mirror.rb +0 -274
- data/lib/mirah/jvm/types/type.rb +0 -311
- data/lib/mirah/jvm/types/type_definition.rb +0 -72
- data/lib/mirah/jvm/types/void_type.rb +0 -19
- data/lib/mirah/util/compilation_state.rb +0 -60
- data/test/core/commands_test.rb +0 -89
- data/test/core/generator_test.rb +0 -26
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/jvm/bytecode_test_helper.rb +0 -193
- data/test/jvm/factory_test.rb +0 -28
- data/test/jvm/java_typer_test.rb +0 -283
|
@@ -1,89 +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/util/delegate'
|
|
17
|
-
|
|
18
|
-
module Mirah::JVM::Types
|
|
19
|
-
|
|
20
|
-
# Represents a literal number that can be represented
|
|
21
|
-
# in multiple types
|
|
22
|
-
class NarrowingType < Mirah::Util::DelegateClass(PrimitiveType)
|
|
23
|
-
def initialize(default_type, narrowed_type)
|
|
24
|
-
super(default_type)
|
|
25
|
-
@narrowed = default_type != narrowed_type && narrowed_type
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def hash
|
|
29
|
-
__getobj__.hash
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Changes this type to the smallest type that will hold
|
|
33
|
-
# its literal value.
|
|
34
|
-
def narrow!
|
|
35
|
-
if @narrowed
|
|
36
|
-
__setobj__(@narrowed)
|
|
37
|
-
true
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
class FixnumLiteral < NarrowingType
|
|
43
|
-
def self.range(type)
|
|
44
|
-
type::MIN_VALUE .. type::MAX_VALUE
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
BYTE_RANGE = range(java.lang.Byte)
|
|
48
|
-
SHORT_RANGE = range(java.lang.Short)
|
|
49
|
-
INT_RANGE = range(java.lang.Integer)
|
|
50
|
-
LONG_RANGE = range(java.lang.Long)
|
|
51
|
-
|
|
52
|
-
def initialize(literal)
|
|
53
|
-
default_type = case literal
|
|
54
|
-
when INT_RANGE
|
|
55
|
-
Int
|
|
56
|
-
else
|
|
57
|
-
Long
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# TODO chars?
|
|
61
|
-
# There's not really any way to tell if we should narrow to a char
|
|
62
|
-
# or a byte/short. I suppose we could try both, but that seems ugly.
|
|
63
|
-
# Maybe it's the right thing to do though?
|
|
64
|
-
narrowed_type = case literal
|
|
65
|
-
when BYTE_RANGE
|
|
66
|
-
Byte
|
|
67
|
-
when SHORT_RANGE
|
|
68
|
-
Short
|
|
69
|
-
when INT_RANGE
|
|
70
|
-
Int
|
|
71
|
-
else
|
|
72
|
-
Long
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
super(default_type, narrowed_type)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
class FloatLiteral < NarrowingType
|
|
80
|
-
FLOAT_RANGE = java.lang.Float::MIN_VALUE .. java.lang.Float::MAX_VALUE
|
|
81
|
-
NaN = java.lang.Float::NaN
|
|
82
|
-
POSITIVE_INFINITY = java.lang.Float::POSITIVE_INFINITY
|
|
83
|
-
NEGATIVE_INFINITY = java.lang.Float::NEGATIVE_INFINITY
|
|
84
|
-
|
|
85
|
-
def initialize(literal)
|
|
86
|
-
super(Double, Double)
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module Mirah
|
|
2
|
-
module JVM
|
|
3
|
-
module Types
|
|
4
|
-
class MetaType < Type
|
|
5
|
-
attr_reader :unmeta
|
|
6
|
-
|
|
7
|
-
def initialize(unmeta)
|
|
8
|
-
super(unmeta.type_system, unmeta.name)
|
|
9
|
-
@unmeta = unmeta
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def basic_type
|
|
13
|
-
@unmeta.basic_type
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def name
|
|
17
|
-
return @unmeta.name if @unmeta
|
|
18
|
-
super
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def meta?
|
|
22
|
-
true
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def meta
|
|
26
|
-
self
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def superclass
|
|
30
|
-
if @unmeta.superclass
|
|
31
|
-
@unmeta.superclass.meta
|
|
32
|
-
else
|
|
33
|
-
nil
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def interfaces(include_parent=true)
|
|
38
|
-
[]
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def jvm_type
|
|
42
|
-
unmeta.jvm_type
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def inner_class?
|
|
46
|
-
basic_type.inner_class?
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
class TypeDefMeta < MetaType
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
@@ -1,946 +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'
|
|
17
|
-
|
|
18
|
-
class Java::JavaMethod
|
|
19
|
-
def static?
|
|
20
|
-
java.lang.reflect.Modifier.static?(modifiers)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def abstract?
|
|
24
|
-
java.lang.reflect.Modifier.abstract?(modifiers)
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
class BiteScript::ASM::FieldMirror
|
|
29
|
-
def returnType
|
|
30
|
-
self.type
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
module Mirah::JVM::Types
|
|
35
|
-
AST ||= Mirah::AST
|
|
36
|
-
|
|
37
|
-
module ArgumentConversion
|
|
38
|
-
def convert_args(compiler, values, types=nil)
|
|
39
|
-
# TODO boxing/unboxing
|
|
40
|
-
types ||= argument_types
|
|
41
|
-
needs_to_build_varargs_array = false
|
|
42
|
-
|
|
43
|
-
if respond_to?(:varargs?) && varargs?
|
|
44
|
-
non_varargs_types = types[0..-2]
|
|
45
|
-
non_varargs_values = values.first non_varargs_types.size
|
|
46
|
-
|
|
47
|
-
varargs_values = values.to_a.last(values.size - non_varargs_values.size)
|
|
48
|
-
varargs_type = types.last
|
|
49
|
-
|
|
50
|
-
unless varargs_values.length == 1 &&
|
|
51
|
-
varargs_type.compatible?(compiler.inferred_type(varargs_values.first))
|
|
52
|
-
needs_to_build_varargs_array = true
|
|
53
|
-
values = non_varargs_values
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
values_and_types = values.zip(types)
|
|
58
|
-
|
|
59
|
-
values_and_types.each do |value, type|
|
|
60
|
-
compiler.visit(value, true)
|
|
61
|
-
in_type = compiler.inferred_type(value)
|
|
62
|
-
if in_type.primitive? && type != in_type
|
|
63
|
-
in_type.compile_widen(compiler.method, type)
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
if needs_to_build_varargs_array
|
|
68
|
-
compiler.visitVarargsArray(varargs_type, varargs_values)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
Type.send :include, ArgumentConversion
|
|
74
|
-
|
|
75
|
-
class Intrinsic
|
|
76
|
-
include ArgumentConversion
|
|
77
|
-
attr_reader :name, :argument_types, :return_type
|
|
78
|
-
|
|
79
|
-
def initialize(klass, name, args, type, kind=nil, &block)
|
|
80
|
-
raise ArgumentError, "Block required" unless block_given?
|
|
81
|
-
@class = klass
|
|
82
|
-
@name = name
|
|
83
|
-
@argument_types = args
|
|
84
|
-
@return_type = type
|
|
85
|
-
@block = block
|
|
86
|
-
@kind = kind
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def kind
|
|
90
|
-
Java::OrgMirahJvmTypes::MemberKind.const_get(@kind)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def accept(visitor, expression)
|
|
94
|
-
name = "visit_#{@kind.downcase}".sub(/_op$/,"")
|
|
95
|
-
visitor.send(name, self, expression)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def call(builder, ast, expression, *args)
|
|
99
|
-
@block.call(builder, ast, expression, *args)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def declaring_class
|
|
103
|
-
@class
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def constructor?
|
|
107
|
-
false
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def field?
|
|
111
|
-
false
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def abstract?
|
|
115
|
-
false
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def exceptions
|
|
119
|
-
[]
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def varargs?
|
|
123
|
-
false
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def isVararg
|
|
127
|
-
varargs?
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
class Macro
|
|
132
|
-
java_import 'org.mirah.typer.InlineCode'
|
|
133
|
-
java_import 'org.mirah.typer.NodeBuilder'
|
|
134
|
-
attr_reader :name, :argument_types, :return_type
|
|
135
|
-
|
|
136
|
-
def initialize(klass, name, args, &block)
|
|
137
|
-
raise ArgumentError, "Block required" unless block_given?
|
|
138
|
-
@class = klass
|
|
139
|
-
@name = name
|
|
140
|
-
@argument_types = args
|
|
141
|
-
raise ArgumentError unless args.all?
|
|
142
|
-
@return_type = InlineCode.new(block.to_java(NodeBuilder))
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def declaring_class
|
|
146
|
-
@class
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
class JavaCallable
|
|
151
|
-
include ArgumentConversion
|
|
152
|
-
|
|
153
|
-
attr_accessor :member
|
|
154
|
-
|
|
155
|
-
def initialize(types, member)
|
|
156
|
-
raise ArgumentError unless types.kind_of?(Mirah::Typer::TypeSystem)
|
|
157
|
-
@types = types
|
|
158
|
-
@member = member
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def name
|
|
162
|
-
@name ||= @member.name
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def field?
|
|
166
|
-
false
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def parameter_types
|
|
170
|
-
@member.parameter_types
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def synthetic?
|
|
174
|
-
@member.synthetic?
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
class JavaConstructor < JavaCallable
|
|
179
|
-
def argument_types
|
|
180
|
-
@argument_types ||= @member.argument_types.map do |arg|
|
|
181
|
-
if arg.kind_of?(Type) || arg.nil?
|
|
182
|
-
arg
|
|
183
|
-
else
|
|
184
|
-
@types.type(nil, arg)
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
def return_type
|
|
190
|
-
declaring_class
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
def exceptions
|
|
194
|
-
@member.exception_types.map do |exception|
|
|
195
|
-
if exception.kind_of?(Mirah::Typer::ResolvedType)
|
|
196
|
-
exception
|
|
197
|
-
else
|
|
198
|
-
@types.type(nil, exception.class_name)
|
|
199
|
-
end
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
def declaring_class
|
|
204
|
-
@types.type(nil, @member.declaring_class)
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
def type_parameters
|
|
208
|
-
@declaring_class and @declaring_class.jvm_type.type_parameters
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def call(compiler, ast, expression, parameters=nil, delegate=false)
|
|
212
|
-
target = compiler.inferred_type(ast.target)
|
|
213
|
-
unless delegate
|
|
214
|
-
compiler.method.new target
|
|
215
|
-
compiler.method.dup if expression
|
|
216
|
-
end
|
|
217
|
-
parameters ||= ast.parameters
|
|
218
|
-
convert_args(compiler, parameters)
|
|
219
|
-
compiler.method.invokespecial(
|
|
220
|
-
target,
|
|
221
|
-
"<init>",
|
|
222
|
-
[nil, *@member.argument_types])
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
def constructor?
|
|
226
|
-
true
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def varargs?
|
|
230
|
-
@member.varargs?
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
def isVararg
|
|
234
|
-
varargs?
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
def accept(visitor, expression)
|
|
238
|
-
visitor.visitConstructor(self, expression)
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
def kind
|
|
242
|
-
Java::OrgMirahJvmTypes::MemberKind::CONSTRUCTOR
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
class JavaMethod < JavaConstructor
|
|
247
|
-
def return_type
|
|
248
|
-
@return_type ||= begin
|
|
249
|
-
if void?
|
|
250
|
-
@types.type(nil, 'void')
|
|
251
|
-
else
|
|
252
|
-
@types.type(nil, @member.return_type)
|
|
253
|
-
end
|
|
254
|
-
end
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
def static?
|
|
258
|
-
@member.static?
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
def abstract?
|
|
262
|
-
@member.abstract?
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
def type_parameters
|
|
266
|
-
@member.type_parameters
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
def void?
|
|
270
|
-
return_type = @member.return_type
|
|
271
|
-
return true if return_type.nil?
|
|
272
|
-
if return_type.respond_to?(:descriptor) && return_type.descriptor == 'V'
|
|
273
|
-
return true
|
|
274
|
-
end
|
|
275
|
-
false
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
def constructor?
|
|
279
|
-
false
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
def accept(visitor, expression)
|
|
283
|
-
if self.static?
|
|
284
|
-
visitor.visitStaticMethodCall(self, expression)
|
|
285
|
-
else
|
|
286
|
-
visitor.visitMethodCall(self, expression)
|
|
287
|
-
end
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
def kind
|
|
291
|
-
if self.static?
|
|
292
|
-
Java::OrgMirahJvmTypes::MemberKind::STATIC_METHOD
|
|
293
|
-
else
|
|
294
|
-
Java::OrgMirahJvmTypes::MemberKind::METHOD
|
|
295
|
-
end
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
def call(compiler, ast, expression, parameters=nil)
|
|
299
|
-
target = compiler.inferred_type(ast.target)
|
|
300
|
-
compiler.visit(ast.target, true)
|
|
301
|
-
|
|
302
|
-
# if expression, void methods return the called object,
|
|
303
|
-
# for consistency and chaining
|
|
304
|
-
# TODO: inference phase needs to track that signature is
|
|
305
|
-
# void but actual type is callee
|
|
306
|
-
if expression && void?
|
|
307
|
-
compiler.method.dup
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
parameters ||= ast.parameters
|
|
311
|
-
convert_args(compiler, parameters)
|
|
312
|
-
if target.interface?
|
|
313
|
-
compiler.method.invokeinterface(
|
|
314
|
-
target,
|
|
315
|
-
name,
|
|
316
|
-
[@member.return_type, *@member.argument_types])
|
|
317
|
-
else
|
|
318
|
-
compiler.method.invokevirtual(
|
|
319
|
-
target,
|
|
320
|
-
name,
|
|
321
|
-
[@member.return_type, *@member.argument_types])
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
if expression && !void?
|
|
325
|
-
# Insert a cast if the inferred type and actual type differ. This is part of generics support.
|
|
326
|
-
inferred_return_type = compiler.inferred_type(ast)
|
|
327
|
-
if !inferred_return_type.assignableFrom(return_type)
|
|
328
|
-
compiler.method.checkcast(inferred_return_type)
|
|
329
|
-
end
|
|
330
|
-
end
|
|
331
|
-
|
|
332
|
-
unless expression || void?
|
|
333
|
-
return_type.pop(compiler.method)
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
def call_special(compiler, target, target_type, parameters, expression)
|
|
338
|
-
target_type ||= compiler.inferred_type(target)
|
|
339
|
-
compiler.visit(target, true)
|
|
340
|
-
|
|
341
|
-
# if expression, void methods return the called object,
|
|
342
|
-
# for consistency and chaining
|
|
343
|
-
# TODO: inference phase needs to track that signature is
|
|
344
|
-
# void but actual type is callee
|
|
345
|
-
if expression && void?
|
|
346
|
-
compiler.method.dup
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
convert_args(compiler, parameters)
|
|
350
|
-
if target_type.interface?
|
|
351
|
-
raise "interfaces should not receive call_special"
|
|
352
|
-
else
|
|
353
|
-
compiler.method.invokespecial(
|
|
354
|
-
target_type,
|
|
355
|
-
name,
|
|
356
|
-
[@member.return_type, *@member.argument_types])
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
unless expression || void?
|
|
360
|
-
return_type.pop(compiler.method)
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
class JavaStaticMethod < JavaMethod
|
|
366
|
-
def call(compiler, ast, expression, parameters=nil)
|
|
367
|
-
target = declaring_class
|
|
368
|
-
parameters ||= ast.parameters
|
|
369
|
-
convert_args(compiler, parameters)
|
|
370
|
-
compiler.method.invokestatic(
|
|
371
|
-
target,
|
|
372
|
-
name,
|
|
373
|
-
[@member.return_type, *@member.argument_types])
|
|
374
|
-
# if expression, void static methods return null, for consistency
|
|
375
|
-
# TODO: inference phase needs to track that signature is void
|
|
376
|
-
# but actual type is null object
|
|
377
|
-
compiler.method.aconst_null if expression && void?
|
|
378
|
-
return_type.pop(compiler.method) unless expression || void?
|
|
379
|
-
end
|
|
380
|
-
|
|
381
|
-
def accept(visitor, expression)
|
|
382
|
-
visitor.visitStaticMethodCall(self, expression)
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
def kind
|
|
386
|
-
Java::OrgMirahJvmTypes::MemberKind::STATIC_METHOD
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
class JavaFieldAccessor < JavaMethod
|
|
391
|
-
def field?
|
|
392
|
-
true
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
def return_type
|
|
396
|
-
@types.type(nil, @member.type)
|
|
397
|
-
end
|
|
398
|
-
|
|
399
|
-
def public?
|
|
400
|
-
@member.public?
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
def final?
|
|
404
|
-
@member.final?
|
|
405
|
-
end
|
|
406
|
-
end
|
|
407
|
-
|
|
408
|
-
class JavaFieldGetter < JavaFieldAccessor
|
|
409
|
-
def argument_types
|
|
410
|
-
[]
|
|
411
|
-
end
|
|
412
|
-
|
|
413
|
-
def call(compiler, ast, expression, parameters=nil)
|
|
414
|
-
target = compiler.inferred_type(ast.target)
|
|
415
|
-
|
|
416
|
-
# TODO: assert that no args are being passed, though that should have failed lookup
|
|
417
|
-
|
|
418
|
-
if expression
|
|
419
|
-
if @member.static?
|
|
420
|
-
compiler.method.getstatic(target, name, @member.type)
|
|
421
|
-
else
|
|
422
|
-
compiler.visit(ast.target, true)
|
|
423
|
-
compiler.method.getfield(target, name, @member.type)
|
|
424
|
-
end
|
|
425
|
-
end
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
def accept(visitor, expression)
|
|
429
|
-
if self.static?
|
|
430
|
-
visitor.visitStaticFieldAccess(self, expression)
|
|
431
|
-
else
|
|
432
|
-
visitor.visitFieldAccess(self, expression)
|
|
433
|
-
end
|
|
434
|
-
end
|
|
435
|
-
|
|
436
|
-
def kind
|
|
437
|
-
if self.static?
|
|
438
|
-
Java::OrgMirahJvmTypes::MemberKind::STATIC_FIELD_ACCESS
|
|
439
|
-
else
|
|
440
|
-
Java::OrgMirahJvmTypes::MemberKind::FIELD_ACCESS
|
|
441
|
-
end
|
|
442
|
-
end
|
|
443
|
-
end
|
|
444
|
-
|
|
445
|
-
class JavaFieldSetter < JavaFieldAccessor
|
|
446
|
-
def return_type
|
|
447
|
-
@types.type(nil, @member.type)
|
|
448
|
-
end
|
|
449
|
-
|
|
450
|
-
def argument_types
|
|
451
|
-
[@types.type(nil, @member.type)]
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
def call(compiler, ast, expression, parameters=nil)
|
|
455
|
-
target = compiler.inferred_type(ast.target)
|
|
456
|
-
|
|
457
|
-
# TODO: assert that no args are being passed, though that should have failed lookup
|
|
458
|
-
|
|
459
|
-
parameters ||= ast.parameters
|
|
460
|
-
if @member.static?
|
|
461
|
-
convert_args(compiler, parameters)
|
|
462
|
-
compiler.method.dup if expression
|
|
463
|
-
compiler.method.putstatic(target, name, @member.type)
|
|
464
|
-
else
|
|
465
|
-
compiler.visit(ast.target, true)
|
|
466
|
-
convert_args(compiler, parameters)
|
|
467
|
-
compiler.method.dup_x2 if expression
|
|
468
|
-
compiler.method.putfield(target, name, @member.type)
|
|
469
|
-
end
|
|
470
|
-
end
|
|
471
|
-
|
|
472
|
-
def accept(visitor, expression)
|
|
473
|
-
if self.static?
|
|
474
|
-
visitor.visitStaticFieldAssign(self, expression)
|
|
475
|
-
else
|
|
476
|
-
visitor.visitFieldAssign(self, expression)
|
|
477
|
-
end
|
|
478
|
-
end
|
|
479
|
-
|
|
480
|
-
def kind
|
|
481
|
-
if self.static?
|
|
482
|
-
Java::OrgMirahJvmTypes::MemberKind::STATIC_FIELD_ASSIGN
|
|
483
|
-
else
|
|
484
|
-
Java::OrgMirahJvmTypes::MemberKind::FIELD_ASSIGN
|
|
485
|
-
end
|
|
486
|
-
end
|
|
487
|
-
end
|
|
488
|
-
|
|
489
|
-
class MirahMember
|
|
490
|
-
attr_reader :name, :argument_types, :declaring_class, :return_type
|
|
491
|
-
attr_reader :exception_types
|
|
492
|
-
|
|
493
|
-
def initialize(klass, name, args, return_type, static, exceptions)
|
|
494
|
-
if return_type.name == 'void' || return_type.name == ':unreachable'
|
|
495
|
-
return_type = nil
|
|
496
|
-
end
|
|
497
|
-
@declaring_class = klass
|
|
498
|
-
@name = name
|
|
499
|
-
@argument_types = args
|
|
500
|
-
@return_type = return_type
|
|
501
|
-
@static = static
|
|
502
|
-
@exception_types = exceptions || []
|
|
503
|
-
end
|
|
504
|
-
|
|
505
|
-
def static?
|
|
506
|
-
@static
|
|
507
|
-
end
|
|
508
|
-
|
|
509
|
-
def abstract?
|
|
510
|
-
@declaring_class.interface?
|
|
511
|
-
end
|
|
512
|
-
|
|
513
|
-
def varargs?
|
|
514
|
-
false
|
|
515
|
-
end
|
|
516
|
-
|
|
517
|
-
def isVararg
|
|
518
|
-
varargs?
|
|
519
|
-
end
|
|
520
|
-
end
|
|
521
|
-
|
|
522
|
-
class Type
|
|
523
|
-
java_import "org.mirah.jvm.types.JVMMethod" rescue nil
|
|
524
|
-
|
|
525
|
-
def method_listeners
|
|
526
|
-
if meta?
|
|
527
|
-
unmeta.method_listeners
|
|
528
|
-
else
|
|
529
|
-
@method_listeners ||= {}
|
|
530
|
-
end
|
|
531
|
-
end
|
|
532
|
-
|
|
533
|
-
def method_updated(name)
|
|
534
|
-
listeners = method_listeners[name]
|
|
535
|
-
listeners.values.each do |l|
|
|
536
|
-
if l.kind_of?(Proc)
|
|
537
|
-
l.call(name)
|
|
538
|
-
else
|
|
539
|
-
l.method_updated(name)
|
|
540
|
-
end
|
|
541
|
-
end if listeners
|
|
542
|
-
end
|
|
543
|
-
|
|
544
|
-
def add_method_listener(name, listener=nil, &block)
|
|
545
|
-
listeners = method_listeners[name] ||= {}
|
|
546
|
-
if listener
|
|
547
|
-
unless listener.respond_to?(:method_updated) || listener.kind_of?(Proc)
|
|
548
|
-
raise "Invalid listener"
|
|
549
|
-
end
|
|
550
|
-
listeners[listener] = listener
|
|
551
|
-
else
|
|
552
|
-
listeners[block] = block
|
|
553
|
-
end
|
|
554
|
-
if !self.meta? && jvm_type && super_class_valid?
|
|
555
|
-
superclass.add_method_listener(name, self)
|
|
556
|
-
end
|
|
557
|
-
interfaces.each {|i| i.add_method_listener(name, self) unless i.isError}
|
|
558
|
-
end
|
|
559
|
-
|
|
560
|
-
# TODO take a scope and check visibility
|
|
561
|
-
def find_callable_macros(name)
|
|
562
|
-
macros = find_callable_macros2 name
|
|
563
|
-
macros.concat collect_up_interface_tree {|interface| interface.declared_macros(name) }
|
|
564
|
-
macros
|
|
565
|
-
end
|
|
566
|
-
|
|
567
|
-
def find_callable_macros2(name)
|
|
568
|
-
collect_up_inheritance_tree {|type| type.declared_macros name }
|
|
569
|
-
end
|
|
570
|
-
|
|
571
|
-
def find_callable_static_methods(name)
|
|
572
|
-
collect_up_inheritance_tree { |type| type.declared_class_methods(name) }
|
|
573
|
-
end
|
|
574
|
-
|
|
575
|
-
# TODO take a scope and check visibility
|
|
576
|
-
def find_callable_methods(name, include_interfaces=false, &proc)
|
|
577
|
-
if block_given?
|
|
578
|
-
add_method_listener(name) {proc.call(find_callable_methods(name))}
|
|
579
|
-
proc.call(find_callable_methods(name))
|
|
580
|
-
return
|
|
581
|
-
end
|
|
582
|
-
|
|
583
|
-
methods = find_callable_methods2 name
|
|
584
|
-
|
|
585
|
-
if self.interface? || include_interfaces # TODO || self.abstract?
|
|
586
|
-
methods.concat collect_up_interface_tree { |interface| interface.declared_instance_methods(name) }
|
|
587
|
-
end
|
|
588
|
-
methods
|
|
589
|
-
end
|
|
590
|
-
|
|
591
|
-
def find_callable_methods2(name)
|
|
592
|
-
collect_up_inheritance_tree { |type| type.declared_instance_methods(name) }
|
|
593
|
-
end
|
|
594
|
-
|
|
595
|
-
def get_method(name, args)
|
|
596
|
-
method = find_method(self, name, args, nil, meta?)
|
|
597
|
-
unless method
|
|
598
|
-
# Allow constant narrowing for assignment methods
|
|
599
|
-
if name =~ /=$/ && args[-1].respond_to?(:narrow!)
|
|
600
|
-
if args[-1].narrow!
|
|
601
|
-
method = find_method(self, name, args, meta?)
|
|
602
|
-
end
|
|
603
|
-
end
|
|
604
|
-
end
|
|
605
|
-
method
|
|
606
|
-
end
|
|
607
|
-
|
|
608
|
-
def constructor(*types)
|
|
609
|
-
begin
|
|
610
|
-
constructor = jvm_type.getConstructor(*bitescript_signatures(types))
|
|
611
|
-
return JavaConstructor.new(@type_system, constructor) if constructor
|
|
612
|
-
rescue => ex
|
|
613
|
-
log("#{ex.message}\n#{ex.backtrace.join("\n")}")
|
|
614
|
-
end
|
|
615
|
-
raise NameError, "No constructor #{name}(#{types.join ', '})"
|
|
616
|
-
end
|
|
617
|
-
|
|
618
|
-
def java_method(name, *types)
|
|
619
|
-
intrinsic = intrinsics[name][types]
|
|
620
|
-
return intrinsic if intrinsic
|
|
621
|
-
|
|
622
|
-
begin
|
|
623
|
-
method = jvm_type.getDeclaredMethod(name, *bitescript_signatures(types)) if jvm_type
|
|
624
|
-
|
|
625
|
-
if method.nil? && superclass
|
|
626
|
-
method = superclass.java_method(name, *types) rescue nil
|
|
627
|
-
end
|
|
628
|
-
|
|
629
|
-
if method.nil? && jvm_type && jvm_type.abstract?
|
|
630
|
-
interfaces.each do |interface|
|
|
631
|
-
method = interface.java_method(name, *types) rescue nil
|
|
632
|
-
break if method
|
|
633
|
-
end
|
|
634
|
-
end
|
|
635
|
-
|
|
636
|
-
return method if method.kind_of?(JavaCallable)
|
|
637
|
-
if method && method.static? == meta?
|
|
638
|
-
return wrap_jvm_method method
|
|
639
|
-
end
|
|
640
|
-
rescue => ex
|
|
641
|
-
log("#{ex.message}\n#{ex.backtrace.join("\n")}")
|
|
642
|
-
end
|
|
643
|
-
raise NameError, "No method #{self.name}.#{name}(#{types.join ', '})"
|
|
644
|
-
end
|
|
645
|
-
|
|
646
|
-
def declared_instance_methods(name=nil)
|
|
647
|
-
all_declared_jvm_methods(name).reject{ |method| method.static? && !method.synthetic? } +
|
|
648
|
-
(meta? ? unmeta : self).declared_intrinsics(name)
|
|
649
|
-
end
|
|
650
|
-
|
|
651
|
-
def declared_class_methods(name=nil)
|
|
652
|
-
all_declared_jvm_methods(name).select{ |method| method.static? && !method.synthetic? } +
|
|
653
|
-
meta.declared_intrinsics(name)
|
|
654
|
-
end
|
|
655
|
-
|
|
656
|
-
def declared_constructors
|
|
657
|
-
jvm_type.getConstructors.map do |method|
|
|
658
|
-
JavaConstructor.new(@type_system, method)
|
|
659
|
-
end
|
|
660
|
-
end
|
|
661
|
-
|
|
662
|
-
def field_getter(name)
|
|
663
|
-
field = jvm_field(name)
|
|
664
|
-
return nil unless field
|
|
665
|
-
|
|
666
|
-
JavaFieldGetter.new(@type_system, field)
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
def field_setter(name)
|
|
670
|
-
field = jvm_field(name)
|
|
671
|
-
return nil unless field
|
|
672
|
-
|
|
673
|
-
JavaFieldSetter.new(@type_system, field)
|
|
674
|
-
end
|
|
675
|
-
|
|
676
|
-
def inner_class_getter(name)
|
|
677
|
-
full_name = "#{self.name}$#{name}"
|
|
678
|
-
inner_class = @type_system.type(nil, full_name) rescue nil
|
|
679
|
-
return unless inner_class
|
|
680
|
-
|
|
681
|
-
inner_class.inner_class = true
|
|
682
|
-
macro = Macro.new(self, name, []) do |call, typer|
|
|
683
|
-
Mirah::AST::Constant.new(call.position, Mirah::AST::SimpleString.new(call.position, full_name))
|
|
684
|
-
end
|
|
685
|
-
intrinsics[name][[]] = macro
|
|
686
|
-
end
|
|
687
|
-
|
|
688
|
-
def getDeclaredFields
|
|
689
|
-
@member.getDeclaredFields.to_java(JVMMethod)
|
|
690
|
-
end
|
|
691
|
-
|
|
692
|
-
def getDeclaredField(name)
|
|
693
|
-
@member.getDeclaredField(name)
|
|
694
|
-
end
|
|
695
|
-
|
|
696
|
-
def hasStaticField(name)
|
|
697
|
-
f = getDeclaredField(name)
|
|
698
|
-
f && f.static?
|
|
699
|
-
end
|
|
700
|
-
|
|
701
|
-
protected
|
|
702
|
-
|
|
703
|
-
def find_interfaces
|
|
704
|
-
collect_up_inheritance_tree {|type| type.interfaces }
|
|
705
|
-
end
|
|
706
|
-
|
|
707
|
-
def collect_up_interface_tree &block
|
|
708
|
-
interfaces = find_interfaces
|
|
709
|
-
things = []
|
|
710
|
-
seen = {}
|
|
711
|
-
until interfaces.empty?
|
|
712
|
-
interface = interfaces.pop
|
|
713
|
-
next if seen[interface]
|
|
714
|
-
next if interface.isError
|
|
715
|
-
seen[interface] = true
|
|
716
|
-
interfaces.concat(interface.interfaces)
|
|
717
|
-
new_things = block.call interface
|
|
718
|
-
things.concat new_things if new_things
|
|
719
|
-
end
|
|
720
|
-
things
|
|
721
|
-
end
|
|
722
|
-
|
|
723
|
-
def collect_up_inheritance_tree(&block)
|
|
724
|
-
things = []
|
|
725
|
-
new_things = block.call(self)
|
|
726
|
-
things.concat new_things if new_things
|
|
727
|
-
if super_class_valid?
|
|
728
|
-
things.concat superclass.collect_up_inheritance_tree(&block)
|
|
729
|
-
end
|
|
730
|
-
things
|
|
731
|
-
end
|
|
732
|
-
|
|
733
|
-
private
|
|
734
|
-
|
|
735
|
-
def super_class_valid?
|
|
736
|
-
superclass && !superclass.error?
|
|
737
|
-
end
|
|
738
|
-
|
|
739
|
-
def all_declared_jvm_methods(name=nil)
|
|
740
|
-
return [] if !jvm_type || (meta? ? unmeta : self).array?
|
|
741
|
-
|
|
742
|
-
jvm_type.getDeclaredMethods(name).map { |method| wrap_jvm_method method }
|
|
743
|
-
end
|
|
744
|
-
|
|
745
|
-
def wrap_jvm_method method
|
|
746
|
-
if (method.static? && !method.synthetic?)
|
|
747
|
-
JavaStaticMethod.new(@type_system, method)
|
|
748
|
-
else
|
|
749
|
-
JavaMethod.new(@type_system, method)
|
|
750
|
-
end
|
|
751
|
-
end
|
|
752
|
-
|
|
753
|
-
def jvm_field(name)
|
|
754
|
-
return nil unless jvm_type
|
|
755
|
-
field = jvm_type.getField(name)
|
|
756
|
-
field ||= begin
|
|
757
|
-
ifaces = jvm_type.interfaces.map { |i| wrap_with_mirror i }
|
|
758
|
-
ifaces.map{|i| i.getField(name) }.compact.first
|
|
759
|
-
end
|
|
760
|
-
field ||= begin
|
|
761
|
-
mirror = wrap_with_mirror jvm_type.superclass
|
|
762
|
-
potential, mirror = [mirror.getField(name), wrap_with_mirror(mirror.superclass)] until potential || mirror.nil?
|
|
763
|
-
potential
|
|
764
|
-
end
|
|
765
|
-
field
|
|
766
|
-
end
|
|
767
|
-
|
|
768
|
-
def wrap_with_mirror type
|
|
769
|
-
return unless type
|
|
770
|
-
if type.respond_to?(:getField)
|
|
771
|
-
type
|
|
772
|
-
else
|
|
773
|
-
BiteScript::ASM::ClassMirror.for_name type.class_name
|
|
774
|
-
end
|
|
775
|
-
end
|
|
776
|
-
|
|
777
|
-
def bitescript_signatures types
|
|
778
|
-
types.map {|type| BiteScript::Signature.class_id(type)}
|
|
779
|
-
end
|
|
780
|
-
end
|
|
781
|
-
|
|
782
|
-
class TypeDefinition
|
|
783
|
-
java_import "org.mirah.jvm.types.JVMMethod" rescue nil
|
|
784
|
-
|
|
785
|
-
def java_method(name, *types)
|
|
786
|
-
method = first_matching instance_methods[name], types
|
|
787
|
-
return method if method
|
|
788
|
-
intrinsic = intrinsics[name][types]
|
|
789
|
-
return intrinsic if intrinsic
|
|
790
|
-
raise NameError, "No method #{self.name}.#{name}(#{types.join ', '})"
|
|
791
|
-
end
|
|
792
|
-
|
|
793
|
-
def java_static_method(name, *types)
|
|
794
|
-
method = first_matching static_methods[name], types
|
|
795
|
-
return method if method
|
|
796
|
-
intrinsic = meta.intrinsics[name][types]
|
|
797
|
-
return intrinsic if intrinsic
|
|
798
|
-
raise NameError, "No method #{self.name}.#{name}(#{types.join ', '})"
|
|
799
|
-
end
|
|
800
|
-
|
|
801
|
-
def constructor(*types)
|
|
802
|
-
constructor = first_matching constructors, types
|
|
803
|
-
return constructor if constructor
|
|
804
|
-
raise NameError, "No constructor #{name}(#{types.join ', '})"
|
|
805
|
-
end
|
|
806
|
-
|
|
807
|
-
def declared_instance_methods(name=nil)
|
|
808
|
-
declared_methods self, instance_methods, name
|
|
809
|
-
end
|
|
810
|
-
|
|
811
|
-
def declared_class_methods(name=nil)
|
|
812
|
-
declared_methods meta, static_methods, name
|
|
813
|
-
end
|
|
814
|
-
|
|
815
|
-
def constructors
|
|
816
|
-
if @constructors.nil?
|
|
817
|
-
@constructors = []
|
|
818
|
-
declare_method('initialize', [], self, [])
|
|
819
|
-
@have_default_constructor = true
|
|
820
|
-
end
|
|
821
|
-
@constructors
|
|
822
|
-
end
|
|
823
|
-
alias :declared_constructors :constructors
|
|
824
|
-
|
|
825
|
-
def instance_methods
|
|
826
|
-
@instance_methods ||= Hash.new {|h, k| h[k] = []}
|
|
827
|
-
end
|
|
828
|
-
|
|
829
|
-
def static_methods
|
|
830
|
-
@static_methods ||= Hash.new {|h, k| h[k] = []}
|
|
831
|
-
end
|
|
832
|
-
|
|
833
|
-
def getDeclaredFields
|
|
834
|
-
@fields.values.to_java(JVMMethod)
|
|
835
|
-
end
|
|
836
|
-
|
|
837
|
-
def getDeclaredField(name)
|
|
838
|
-
@fields[name]
|
|
839
|
-
end
|
|
840
|
-
|
|
841
|
-
def hasStaticField(name)
|
|
842
|
-
f = getDeclaredField(name)
|
|
843
|
-
f && f.static?
|
|
844
|
-
end
|
|
845
|
-
|
|
846
|
-
def declared_fields
|
|
847
|
-
@fields ||= {}
|
|
848
|
-
end
|
|
849
|
-
|
|
850
|
-
def declare_field(name, type, static)
|
|
851
|
-
if type.isError
|
|
852
|
-
declared_fields.delete(name)
|
|
853
|
-
return
|
|
854
|
-
end
|
|
855
|
-
declared_fields[name] ||= MirahMember.new(self, name, [], type, static, [])
|
|
856
|
-
end
|
|
857
|
-
|
|
858
|
-
def declare_method(name, arguments, type, exceptions)
|
|
859
|
-
raise "Bad args" unless arguments.all?
|
|
860
|
-
if type.isError
|
|
861
|
-
instance_methods.delete(name)
|
|
862
|
-
method_updated(name)
|
|
863
|
-
return
|
|
864
|
-
end
|
|
865
|
-
member = MirahMember.new(self, name, arguments, type, false, exceptions)
|
|
866
|
-
if name == 'initialize'
|
|
867
|
-
# The ordering is important here:
|
|
868
|
-
# The first call to constructors initializes @have_default_constructor.
|
|
869
|
-
if constructors.size == 1 && @have_default_constructor
|
|
870
|
-
constructors.clear
|
|
871
|
-
@have_default_constructor = false
|
|
872
|
-
elsif constructors.size > 1 && @have_default_constructor
|
|
873
|
-
raise "Invalid state: default constructor but #{constructors.size} constructors"
|
|
874
|
-
end
|
|
875
|
-
constructors << JavaConstructor.new(@type_system, member)
|
|
876
|
-
else
|
|
877
|
-
instance_methods[name] << JavaMethod.new(@type_system, member)
|
|
878
|
-
end
|
|
879
|
-
method_updated(name)
|
|
880
|
-
end
|
|
881
|
-
|
|
882
|
-
def declare_static_method(name, arguments, type, exceptions)
|
|
883
|
-
if type.isError
|
|
884
|
-
static_methods.delete(name)
|
|
885
|
-
else
|
|
886
|
-
member = MirahMember.new(self, name, arguments, type, true, exceptions)
|
|
887
|
-
static_methods[name] << JavaStaticMethod.new(@type_system, member)
|
|
888
|
-
end
|
|
889
|
-
method_updated(name)
|
|
890
|
-
end
|
|
891
|
-
|
|
892
|
-
def interface?
|
|
893
|
-
false
|
|
894
|
-
end
|
|
895
|
-
|
|
896
|
-
def field_getter(name)
|
|
897
|
-
nil
|
|
898
|
-
end
|
|
899
|
-
|
|
900
|
-
def field_setter(name)
|
|
901
|
-
nil
|
|
902
|
-
end
|
|
903
|
-
|
|
904
|
-
private
|
|
905
|
-
|
|
906
|
-
def declared_methods target, method_hash, name
|
|
907
|
-
# should the declared intrinsics be first here? nh
|
|
908
|
-
target.declared_intrinsics(name) +
|
|
909
|
-
if name.nil?
|
|
910
|
-
method_hash.values.flatten
|
|
911
|
-
else
|
|
912
|
-
method_hash[name]
|
|
913
|
-
end
|
|
914
|
-
end
|
|
915
|
-
|
|
916
|
-
def first_matching method_list, types
|
|
917
|
-
method_list.find {|m| m.argument_types == types}
|
|
918
|
-
end
|
|
919
|
-
end
|
|
920
|
-
|
|
921
|
-
class TypeDefMeta
|
|
922
|
-
def constructor(*args)
|
|
923
|
-
unmeta.constructor(*args)
|
|
924
|
-
end
|
|
925
|
-
|
|
926
|
-
def java_method(*args)
|
|
927
|
-
unmeta.java_static_method(*args)
|
|
928
|
-
end
|
|
929
|
-
|
|
930
|
-
def declared_class_methods(name=nil)
|
|
931
|
-
unmeta.declared_class_methods(name)
|
|
932
|
-
end
|
|
933
|
-
|
|
934
|
-
def declared_instance_methods(name=nil)
|
|
935
|
-
unmeta.declared_instance_methods(name)
|
|
936
|
-
end
|
|
937
|
-
|
|
938
|
-
def field_getter(name)
|
|
939
|
-
nil
|
|
940
|
-
end
|
|
941
|
-
|
|
942
|
-
def field_setter(name)
|
|
943
|
-
nil
|
|
944
|
-
end
|
|
945
|
-
end
|
|
946
|
-
end
|