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.
Files changed (72) hide show
  1. data/History.txt +7 -0
  2. data/README.txt +18 -7
  3. data/Rakefile +72 -0
  4. data/examples/ant/example-build.xml +7 -0
  5. data/examples/appengine/Rakefile +8 -67
  6. data/examples/appengine/Readme +4 -3
  7. data/examples/appengine/lib/duby/appengine_tasks.rb +173 -0
  8. data/examples/appengine/lib/duby/plugin/datastore.rb +92 -31
  9. data/examples/appengine/lib/duby_task.rb +61 -0
  10. data/examples/appengine/src/com/ribrdb/DubyApp.duby +32 -6
  11. data/examples/appengine/src/com/ribrdb/list.dhtml +2 -2
  12. data/examples/appengine/{config.ru → src/config.ru} +0 -0
  13. data/examples/bintrees.duby +66 -0
  14. data/examples/dynamic.duby +17 -0
  15. data/examples/fib.duby +3 -11
  16. data/examples/fields.duby +3 -3
  17. data/examples/fractal.duby +1 -3
  18. data/examples/sort_closure.duby +7 -0
  19. data/examples/swing.duby +11 -11
  20. data/javalib/duby-bootstrap.jar +0 -0
  21. data/javalib/dynalang-invoke-0.1.jar +0 -0
  22. data/lib/duby.rb +168 -35
  23. data/lib/duby/ast.rb +224 -27
  24. data/lib/duby/ast/call.rb +85 -25
  25. data/lib/duby/ast/class.rb +112 -28
  26. data/lib/duby/ast/flow.rb +65 -44
  27. data/lib/duby/ast/intrinsics.rb +223 -21
  28. data/lib/duby/ast/literal.rb +67 -16
  29. data/lib/duby/ast/local.rb +36 -40
  30. data/lib/duby/ast/method.rb +83 -67
  31. data/lib/duby/ast/structure.rb +105 -23
  32. data/lib/duby/compiler.rb +83 -28
  33. data/lib/duby/env.rb +33 -0
  34. data/lib/duby/jvm/base.rb +210 -0
  35. data/lib/duby/jvm/compiler.rb +293 -219
  36. data/lib/duby/jvm/method_lookup.rb +77 -67
  37. data/lib/duby/jvm/source_compiler.rb +250 -157
  38. data/lib/duby/jvm/source_generator/builder.rb +53 -49
  39. data/lib/duby/jvm/source_generator/loops.rb +9 -9
  40. data/lib/duby/jvm/source_generator/precompile.rb +35 -25
  41. data/lib/duby/jvm/typer.rb +19 -10
  42. data/lib/duby/jvm/types.rb +127 -68
  43. data/lib/duby/jvm/types/basic_types.rb +26 -13
  44. data/lib/duby/jvm/types/enumerable.rb +6 -4
  45. data/lib/duby/jvm/types/factory.rb +49 -13
  46. data/lib/duby/jvm/types/floats.rb +16 -0
  47. data/lib/duby/jvm/types/integers.rb +63 -2
  48. data/lib/duby/jvm/types/intrinsics.rb +43 -21
  49. data/lib/duby/jvm/types/methods.rb +326 -86
  50. data/lib/duby/jvm/types/number.rb +3 -0
  51. data/lib/duby/nbcompiler.rb +1 -1
  52. data/lib/duby/plugin/edb.rb +1 -1
  53. data/lib/duby/plugin/java.rb +10 -1
  54. data/lib/duby/transform.rb +134 -46
  55. data/lib/duby/typer.rb +75 -50
  56. data/test/test_ast.rb +106 -106
  57. data/test/test_compilation.rb +46 -32
  58. data/test/test_env.rb +42 -0
  59. data/test/test_java_typer.rb +35 -51
  60. data/test/test_javac_compiler.rb +4 -1
  61. data/test/test_jvm_compiler.rb +564 -133
  62. data/test/test_typer.rb +68 -92
  63. metadata +37 -21
  64. data/examples/README +0 -16
  65. data/lib/duby/c/compiler.rb +0 -134
  66. data/lib/duby/old/compiler_old.rb +0 -845
  67. data/lib/duby/old/declaration.rb +0 -72
  68. data/lib/duby/old/mapper.rb +0 -72
  69. data/lib/duby/old/signature.rb +0 -52
  70. data/lib/duby/old/typer_old.rb +0 -163
  71. data/lib/duby/plugin/math.rb +0 -84
  72. data/test/test_math_plugin.rb +0 -87
@@ -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 = File.basename(filename, '.duby')
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
- @known_types[short] = type_reference(long)
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
@@ -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(java_type)
23
- orig_type = java_type
24
- if !(java_type.kind_of?(Java::JavaClass) ||
25
- java_type.class_builder?)
26
- java_type = java_type.java_class
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(java_type.name, false, false)
29
- raise ArgumentError, "Bad type #{orig_type}" if name =~ /Java::/
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
- begin
70
- jvm_type.assignable_from?(other.jvm_type)
71
- rescue
72
- assignable_from?(other.superclass) ||
73
- other.interfaces.any? {|i| assignable_from?(i)}
74
- end
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
- a, b = TYPE_ORDERING.index(self), TYPE_ORDERING.index(type)
173
- a && b && b > a
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(Java::JavaLang::Void, Java::JavaLang::Void)
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.class_builder?
269
- super(name)
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
- @type ||= builder.public_interface(@name, *interfaces)
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(Java::boolean, java.lang.Boolean)
3
- Byte = IntegerType.new(Java::byte, java.lang.Byte)
4
- Char = IntegerType.new(Java::char, java.lang.Character)
5
- Short = IntegerType.new(Java::short, java.lang.Short)
6
- Int = IntegerType.new(Java::int, java.lang.Integer)
7
- Long = LongType.new(Java::long, java.lang.Long)
8
- Float = FloatType.new(Java::float, java.lang.Float)
9
- Double = DoubleType.new(Java::double, java.lang.Double)
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
- Object = Type.new(Java::JavaLang.Object)
12
- String = StringType.new(Java::JavaLang.String)
13
- Iterable = IterableType.new(Java::JavaLang.Iterable)
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