duby 0.0.2-java → 0.0.3-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/README.txt +18 -7
- data/Rakefile +72 -0
- data/examples/ant/example-build.xml +7 -0
- data/examples/appengine/Rakefile +8 -67
- data/examples/appengine/Readme +4 -3
- data/examples/appengine/lib/duby/appengine_tasks.rb +173 -0
- data/examples/appengine/lib/duby/plugin/datastore.rb +92 -31
- data/examples/appengine/lib/duby_task.rb +61 -0
- data/examples/appengine/src/com/ribrdb/DubyApp.duby +32 -6
- data/examples/appengine/src/com/ribrdb/list.dhtml +2 -2
- data/examples/appengine/{config.ru → src/config.ru} +0 -0
- data/examples/bintrees.duby +66 -0
- data/examples/dynamic.duby +17 -0
- data/examples/fib.duby +3 -11
- data/examples/fields.duby +3 -3
- data/examples/fractal.duby +1 -3
- data/examples/sort_closure.duby +7 -0
- data/examples/swing.duby +11 -11
- data/javalib/duby-bootstrap.jar +0 -0
- data/javalib/dynalang-invoke-0.1.jar +0 -0
- data/lib/duby.rb +168 -35
- data/lib/duby/ast.rb +224 -27
- data/lib/duby/ast/call.rb +85 -25
- data/lib/duby/ast/class.rb +112 -28
- data/lib/duby/ast/flow.rb +65 -44
- data/lib/duby/ast/intrinsics.rb +223 -21
- data/lib/duby/ast/literal.rb +67 -16
- data/lib/duby/ast/local.rb +36 -40
- data/lib/duby/ast/method.rb +83 -67
- data/lib/duby/ast/structure.rb +105 -23
- data/lib/duby/compiler.rb +83 -28
- data/lib/duby/env.rb +33 -0
- data/lib/duby/jvm/base.rb +210 -0
- data/lib/duby/jvm/compiler.rb +293 -219
- data/lib/duby/jvm/method_lookup.rb +77 -67
- data/lib/duby/jvm/source_compiler.rb +250 -157
- data/lib/duby/jvm/source_generator/builder.rb +53 -49
- data/lib/duby/jvm/source_generator/loops.rb +9 -9
- data/lib/duby/jvm/source_generator/precompile.rb +35 -25
- data/lib/duby/jvm/typer.rb +19 -10
- data/lib/duby/jvm/types.rb +127 -68
- data/lib/duby/jvm/types/basic_types.rb +26 -13
- data/lib/duby/jvm/types/enumerable.rb +6 -4
- data/lib/duby/jvm/types/factory.rb +49 -13
- data/lib/duby/jvm/types/floats.rb +16 -0
- data/lib/duby/jvm/types/integers.rb +63 -2
- data/lib/duby/jvm/types/intrinsics.rb +43 -21
- data/lib/duby/jvm/types/methods.rb +326 -86
- data/lib/duby/jvm/types/number.rb +3 -0
- data/lib/duby/nbcompiler.rb +1 -1
- data/lib/duby/plugin/edb.rb +1 -1
- data/lib/duby/plugin/java.rb +10 -1
- data/lib/duby/transform.rb +134 -46
- data/lib/duby/typer.rb +75 -50
- data/test/test_ast.rb +106 -106
- data/test/test_compilation.rb +46 -32
- data/test/test_env.rb +42 -0
- data/test/test_java_typer.rb +35 -51
- data/test/test_javac_compiler.rb +4 -1
- data/test/test_jvm_compiler.rb +564 -133
- data/test/test_typer.rb +68 -92
- metadata +37 -21
- data/examples/README +0 -16
- data/lib/duby/c/compiler.rb +0 -134
- data/lib/duby/old/compiler_old.rb +0 -845
- data/lib/duby/old/declaration.rb +0 -72
- data/lib/duby/old/mapper.rb +0 -72
- data/lib/duby/old/signature.rb +0 -52
- data/lib/duby/old/typer_old.rb +0 -163
- data/lib/duby/plugin/math.rb +0 -84
- data/test/test_math_plugin.rb +0 -87
data/lib/duby/jvm/typer.rb
CHANGED
@@ -6,7 +6,7 @@ module Duby
|
|
6
6
|
module Typer
|
7
7
|
class JVM < Simple
|
8
8
|
include Duby::JVM::Types
|
9
|
-
|
9
|
+
|
10
10
|
attr_reader :transformer
|
11
11
|
|
12
12
|
def initialize(filename, transformer)
|
@@ -16,24 +16,25 @@ module Duby
|
|
16
16
|
raise "TypeFactory not installed"
|
17
17
|
end
|
18
18
|
@known_types = @factory.known_types
|
19
|
-
classname =
|
19
|
+
classname = Duby::Compiler::JVM.classname_from_filename(filename)
|
20
20
|
main_class = @factory.declare_type(classname)
|
21
21
|
@known_types['self'] = main_class.meta
|
22
|
+
@known_types['dynamic'] = DynamicType.new
|
22
23
|
@errors = []
|
23
24
|
end
|
24
|
-
|
25
|
+
|
25
26
|
def type_reference(name, array=false, meta=false)
|
26
27
|
@factory.type(name, array, meta)
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
def alias_types(short, long)
|
30
|
-
@
|
31
|
+
@factory.alias(short, long)
|
31
32
|
end
|
32
|
-
|
33
|
+
|
33
34
|
def name
|
34
35
|
"JVM"
|
35
36
|
end
|
36
|
-
|
37
|
+
|
37
38
|
def type_definition(name, superclass, interfaces)
|
38
39
|
@known_types[name]
|
39
40
|
end
|
@@ -41,7 +42,7 @@ module Duby
|
|
41
42
|
def null_type
|
42
43
|
Null
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
def no_type
|
46
47
|
Void
|
47
48
|
end
|
@@ -55,7 +56,15 @@ module Duby
|
|
55
56
|
# TODO: allow other types for pre-1.2 profiles
|
56
57
|
type_reference("java.util.Map")
|
57
58
|
end
|
58
|
-
|
59
|
+
|
60
|
+
def regexp_type
|
61
|
+
type_reference("java.util.regex.Pattern")
|
62
|
+
end
|
63
|
+
|
64
|
+
def known_type(name)
|
65
|
+
@factory.known_type(name)
|
66
|
+
end
|
67
|
+
|
59
68
|
def learn_method_type(target_type, name, parameter_types, type, exceptions)
|
60
69
|
static = target_type.meta?
|
61
70
|
unless target_type.unmeta.kind_of?(TypeDefinition)
|
@@ -68,7 +77,7 @@ module Duby
|
|
68
77
|
end
|
69
78
|
super
|
70
79
|
end
|
71
|
-
|
80
|
+
|
72
81
|
def infer_signature(method_def)
|
73
82
|
signature = method_def.signature
|
74
83
|
sig_args = signature.dup
|
data/lib/duby/jvm/types.rb
CHANGED
@@ -3,31 +3,27 @@ require 'duby/ast'
|
|
3
3
|
require 'duby/jvm/method_lookup'
|
4
4
|
require 'duby/jvm/compiler'
|
5
5
|
|
6
|
-
class Object
|
7
|
-
def class_builder?
|
8
|
-
self.class.name =~ /::ClassBuilder$/
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
6
|
module Duby
|
13
7
|
module JVM
|
14
8
|
module Types
|
15
9
|
class Type < AST::TypeReference
|
16
10
|
include Duby::JVM::MethodLookup
|
17
11
|
|
12
|
+
attr_writer :inner_class
|
13
|
+
|
18
14
|
def log(message)
|
19
15
|
puts "* [JVM::Types] #{message}" if Duby::Compiler::JVM.verbose
|
20
16
|
end
|
21
17
|
|
22
|
-
def initialize(
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
def initialize(mirror_or_name)
|
19
|
+
if mirror_or_name.kind_of?(BiteScript::ASM::ClassMirror)
|
20
|
+
@type = mirror_or_name
|
21
|
+
name = mirror_or_name.type.class_name
|
22
|
+
else
|
23
|
+
name = mirror_or_name.to_s
|
27
24
|
end
|
28
|
-
super(
|
29
|
-
raise ArgumentError, "Bad type #{
|
30
|
-
@type = java_type
|
25
|
+
super(name, false, false)
|
26
|
+
raise ArgumentError, "Bad type #{mirror_or_name}" if name =~ /Java::/
|
31
27
|
end
|
32
28
|
|
33
29
|
def jvm_type
|
@@ -53,25 +49,36 @@ module Duby
|
|
53
49
|
def interface?
|
54
50
|
@type.interface?
|
55
51
|
end
|
56
|
-
|
52
|
+
|
53
|
+
def dynamic?
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def inner_class?
|
58
|
+
@inner_class
|
59
|
+
end
|
60
|
+
|
57
61
|
def is_parent(other)
|
58
62
|
assignable_from?(other)
|
59
63
|
end
|
60
|
-
|
64
|
+
|
61
65
|
def compatible?(other)
|
62
66
|
assignable_from?(other)
|
63
67
|
end
|
64
|
-
|
68
|
+
|
65
69
|
def assignable_from?(other)
|
70
|
+
return false if other.nil?
|
66
71
|
return true if !primitive? && other == Null
|
67
72
|
return true if other == self
|
68
73
|
return true if other.error? || other.unreachable?
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
|
75
|
+
# TODO should we allow more here?
|
76
|
+
return interface? if other.block?
|
77
|
+
|
78
|
+
return true if jvm_type && (jvm_type == other.jvm_type)
|
79
|
+
|
80
|
+
assignable_from?(other.superclass) ||
|
81
|
+
other.interfaces.any? {|i| assignable_from?(i)}
|
75
82
|
end
|
76
83
|
|
77
84
|
def iterable?
|
@@ -79,7 +86,7 @@ module Duby
|
|
79
86
|
'java.util.Iterator',
|
80
87
|
'java.util.Enumeration'].any? {|n| AST.type(n).assignable_from(self)}
|
81
88
|
end
|
82
|
-
|
89
|
+
|
83
90
|
def component_type
|
84
91
|
AST.type('java.lang.Object') if iterable?
|
85
92
|
end
|
@@ -87,7 +94,7 @@ module Duby
|
|
87
94
|
def meta
|
88
95
|
@meta ||= MetaType.new(self)
|
89
96
|
end
|
90
|
-
|
97
|
+
|
91
98
|
def unmeta
|
92
99
|
self
|
93
100
|
end
|
@@ -97,13 +104,13 @@ module Duby
|
|
97
104
|
end
|
98
105
|
|
99
106
|
def array_type
|
100
|
-
@array_type ||= ArrayType.new(self)
|
107
|
+
@array_type ||= Duby::JVM::Types::ArrayType.new(self)
|
101
108
|
end
|
102
109
|
|
103
110
|
def prefix
|
104
111
|
'a'
|
105
112
|
end
|
106
|
-
|
113
|
+
|
107
114
|
# is this a 64 bit type?
|
108
115
|
def wide?
|
109
116
|
false
|
@@ -121,13 +128,14 @@ module Duby
|
|
121
128
|
raise "Incomplete type #{self}" unless jvm_type
|
122
129
|
AST.type(jvm_type.superclass) if jvm_type.superclass
|
123
130
|
end
|
124
|
-
|
131
|
+
|
125
132
|
def interfaces
|
133
|
+
raise "Incomplete type #{self} (#{self.class})" unless jvm_type
|
126
134
|
@interfaces ||= jvm_type.interfaces.map do |interface|
|
127
135
|
AST.type(interface)
|
128
136
|
end
|
129
137
|
end
|
130
|
-
|
138
|
+
|
131
139
|
def astore(builder)
|
132
140
|
if primitive?
|
133
141
|
builder.send "#{name[0,1]}astore"
|
@@ -135,7 +143,7 @@ module Duby
|
|
135
143
|
builder.aastore
|
136
144
|
end
|
137
145
|
end
|
138
|
-
|
146
|
+
|
139
147
|
def aload(builder)
|
140
148
|
if primitive?
|
141
149
|
builder.send "#{name[0,1]}aload"
|
@@ -162,18 +170,22 @@ module Duby
|
|
162
170
|
def newarray(method)
|
163
171
|
method.send "new#{name}array"
|
164
172
|
end
|
165
|
-
|
173
|
+
|
166
174
|
def interfaces
|
167
175
|
[]
|
168
176
|
end
|
169
|
-
|
177
|
+
|
170
178
|
def convertible_to?(type)
|
171
179
|
return true if type == self
|
172
|
-
|
173
|
-
|
180
|
+
widening_conversions = WIDENING_CONVERSIONS[self]
|
181
|
+
widening_conversions && widening_conversions.include?(type)
|
182
|
+
end
|
183
|
+
|
184
|
+
def superclass
|
185
|
+
nil
|
174
186
|
end
|
175
187
|
end
|
176
|
-
|
188
|
+
|
177
189
|
class MetaType < Type
|
178
190
|
attr_reader :unmeta
|
179
191
|
|
@@ -193,25 +205,33 @@ module Duby
|
|
193
205
|
def meta
|
194
206
|
self
|
195
207
|
end
|
196
|
-
|
208
|
+
|
197
209
|
def superclass
|
198
210
|
@unmeta.superclass.meta if @unmeta.superclass
|
199
211
|
end
|
200
|
-
|
212
|
+
|
201
213
|
def interfaces
|
202
214
|
[]
|
203
215
|
end
|
204
|
-
|
216
|
+
|
205
217
|
def jvm_type
|
206
218
|
unmeta.jvm_type
|
207
219
|
end
|
220
|
+
|
221
|
+
def inner_class?
|
222
|
+
basic_type.inner_class?
|
223
|
+
end
|
208
224
|
end
|
209
|
-
|
225
|
+
|
210
226
|
class NullType < Type
|
211
227
|
def initialize
|
212
|
-
super(java.lang.Object)
|
228
|
+
super('java.lang.Object')
|
213
229
|
end
|
214
|
-
|
230
|
+
|
231
|
+
def to_s
|
232
|
+
"Type(null)"
|
233
|
+
end
|
234
|
+
|
215
235
|
def compatible?(other)
|
216
236
|
!other.primitive?
|
217
237
|
end
|
@@ -219,14 +239,13 @@ module Duby
|
|
219
239
|
|
220
240
|
class VoidType < PrimitiveType
|
221
241
|
def initialize
|
222
|
-
super(
|
223
|
-
@name = "void"
|
242
|
+
super('void', Java::JavaLang::Void)
|
224
243
|
end
|
225
244
|
|
226
245
|
def void?
|
227
246
|
true
|
228
247
|
end
|
229
|
-
|
248
|
+
|
230
249
|
def return(builder)
|
231
250
|
builder.returnvoid
|
232
251
|
end
|
@@ -237,44 +256,79 @@ module Duby
|
|
237
256
|
|
238
257
|
def initialize(component_type)
|
239
258
|
@component_type = component_type
|
259
|
+
if @component_type.jvm_type
|
260
|
+
#@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
|
261
|
+
else
|
262
|
+
# FIXME: THIS IS WRONG, but I don't know how to fix it
|
263
|
+
#@type = @component_type
|
264
|
+
end
|
240
265
|
@name = component_type.name
|
241
266
|
end
|
242
267
|
|
243
|
-
def jvm_type
|
244
|
-
@component_type.jvm_type
|
245
|
-
end
|
246
|
-
|
247
268
|
def array?
|
248
269
|
true
|
249
270
|
end
|
250
|
-
|
271
|
+
|
251
272
|
def iterable?
|
252
273
|
true
|
253
274
|
end
|
254
|
-
|
275
|
+
|
276
|
+
def inner_class?
|
277
|
+
basic_type.inner_class?
|
278
|
+
end
|
279
|
+
|
255
280
|
def basic_type
|
256
281
|
component_type.basic_type
|
257
282
|
end
|
258
|
-
|
283
|
+
|
259
284
|
def superclass
|
260
285
|
Object
|
261
286
|
end
|
287
|
+
|
288
|
+
def interfaces
|
289
|
+
[]
|
290
|
+
end
|
262
291
|
end
|
263
|
-
|
292
|
+
|
293
|
+
class DynamicType < Type
|
294
|
+
ObjectType = Type.new('java.lang.Object')
|
295
|
+
|
296
|
+
def initialize
|
297
|
+
# For naming, bytecode purposes, we are an Object
|
298
|
+
@name = "java.lang.Object"
|
299
|
+
end
|
300
|
+
|
301
|
+
def basic_type
|
302
|
+
self
|
303
|
+
end
|
304
|
+
|
305
|
+
def is_parent(other)
|
306
|
+
ObjectType.assignable_from?(other)
|
307
|
+
end
|
308
|
+
|
309
|
+
def assignable_from?(other)
|
310
|
+
ObjectType.assignable_from?(other)
|
311
|
+
end
|
312
|
+
|
313
|
+
def jvm_type
|
314
|
+
java.lang.Object
|
315
|
+
end
|
316
|
+
|
317
|
+
def dynamic?
|
318
|
+
true
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
264
322
|
class TypeDefinition < Type
|
265
323
|
attr_accessor :node
|
266
|
-
|
324
|
+
|
267
325
|
def initialize(name, node)
|
268
|
-
if name.
|
269
|
-
|
270
|
-
else
|
271
|
-
raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
|
272
|
-
@name = name
|
273
|
-
end
|
326
|
+
raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
|
327
|
+
@name = name
|
274
328
|
@node = node
|
275
329
|
raise ArgumentError, "Bad type #{name}" if self.name =~ /Java::/
|
276
330
|
end
|
277
|
-
|
331
|
+
|
278
332
|
def name
|
279
333
|
if @type
|
280
334
|
@type.name
|
@@ -282,11 +336,11 @@ module Duby
|
|
282
336
|
@name
|
283
337
|
end
|
284
338
|
end
|
285
|
-
|
339
|
+
|
286
340
|
def superclass
|
287
341
|
(node && node.superclass) || Object
|
288
342
|
end
|
289
|
-
|
343
|
+
|
290
344
|
def interfaces
|
291
345
|
if node
|
292
346
|
node.interfaces
|
@@ -294,27 +348,32 @@ module Duby
|
|
294
348
|
[]
|
295
349
|
end
|
296
350
|
end
|
297
|
-
|
351
|
+
|
298
352
|
def define(builder)
|
299
353
|
class_name = @name.tr('.', '/')
|
300
354
|
@type ||= builder.public_class(class_name, superclass, *interfaces)
|
301
355
|
end
|
302
|
-
|
356
|
+
|
303
357
|
def meta
|
304
358
|
@meta ||= TypeDefMeta.new(self)
|
305
359
|
end
|
306
360
|
end
|
307
|
-
|
361
|
+
|
308
362
|
class InterfaceDefinition < TypeDefinition
|
309
363
|
def initialize(name, node)
|
310
364
|
super(name, node)
|
311
365
|
end
|
312
|
-
|
366
|
+
|
313
367
|
def define(builder)
|
314
|
-
|
368
|
+
class_name = @name.tr('.', '/')
|
369
|
+
@type ||= builder.public_interface(class_name, *interfaces)
|
370
|
+
end
|
371
|
+
|
372
|
+
def interface?
|
373
|
+
true
|
315
374
|
end
|
316
375
|
end
|
317
|
-
|
376
|
+
|
318
377
|
class TypeDefMeta < MetaType
|
319
378
|
end
|
320
379
|
end
|
@@ -1,19 +1,32 @@
|
|
1
1
|
module Duby::JVM::Types
|
2
|
-
Boolean = BooleanType.new(
|
3
|
-
Byte = IntegerType.new(
|
4
|
-
Char = IntegerType.new(
|
5
|
-
Short = IntegerType.new(
|
6
|
-
Int = IntegerType.new(
|
7
|
-
Long = LongType.new(
|
8
|
-
Float = FloatType.new(
|
9
|
-
Double = DoubleType.new(
|
2
|
+
Boolean = BooleanType.new('boolean', java.lang.Boolean)
|
3
|
+
Byte = IntegerType.new('byte', java.lang.Byte)
|
4
|
+
Char = IntegerType.new('char', java.lang.Character)
|
5
|
+
Short = IntegerType.new('short', java.lang.Short)
|
6
|
+
Int = IntegerType.new('int', java.lang.Integer)
|
7
|
+
Long = LongType.new('long', java.lang.Long)
|
8
|
+
Float = FloatType.new('float', java.lang.Float)
|
9
|
+
Double = DoubleType.new('double', java.lang.Double)
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
# TODO these shouldn't be constants. They should be loaded from
|
12
|
+
# the compilation class path.
|
13
|
+
Object = Type.new(BiteScript::ASM::ClassMirror.load('java.lang.Object'))
|
14
|
+
String = StringType.new(
|
15
|
+
BiteScript::ASM::ClassMirror.load('java.lang.String'))
|
16
|
+
Iterable = IterableType.new(
|
17
|
+
BiteScript::ASM::ClassMirror.load('java.lang.Iterable'))
|
14
18
|
|
15
19
|
Void = VoidType.new
|
16
20
|
Null = NullType.new
|
17
|
-
|
21
|
+
|
22
|
+
WIDENING_CONVERSIONS = {
|
23
|
+
Byte => [Byte, Short, Int, Long, Float, Double],
|
24
|
+
Short => [Short, Int, Long, Float, Double],
|
25
|
+
Char => [Char, Int, Long, Float, Double],
|
26
|
+
Int => [Int, Long, Float, Double],
|
27
|
+
Long => [Long, Float, Double],
|
28
|
+
Float => [Float, Double],
|
29
|
+
Double => [Double]
|
30
|
+
}
|
18
31
|
TYPE_ORDERING = [Byte, Short, Int, Long, Float, Double]
|
19
|
-
end
|
32
|
+
end
|