duby 0.0.2-java → 0.0.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.
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
@@ -5,18 +5,40 @@ module Duby
5
5
  class << self
6
6
  attr_accessor :verbose
7
7
  end
8
-
8
+
9
9
  # The top of the AST class hierarchy, this represents an abstract AST node.
10
10
  # It provides accessors for _children_, an array of all child nodes,
11
11
  # _parent_, a reference to this node's parent (nil if none), and _newline_,
12
12
  # whether this node represents a new line.
13
13
  class Node
14
+ include Java::DubyLangCompiler.Node
15
+ include Enumerable
16
+
14
17
  attr_accessor :children
15
18
  attr_accessor :parent
16
19
  attr_accessor :position
17
20
  attr_accessor :newline
18
21
  attr_accessor :inferred_type
19
22
 
23
+ def self.child(name)
24
+ @children ||= []
25
+ index = @children.size
26
+ class_eval <<-EOF
27
+ def #{name}
28
+ @children[#{index}]
29
+ end
30
+
31
+ def #{name}=(node)
32
+ @children[#{index}] = _set_parent(node)
33
+ end
34
+ EOF
35
+ @children << name
36
+ end
37
+
38
+ def self.child_name(i)
39
+ @children[i] if @children
40
+ end
41
+
20
42
  def initialize(parent, position, children = [])
21
43
  @parent = parent
22
44
  @newline = false
@@ -45,16 +67,28 @@ module Duby
45
67
  def inspect(indent = 0)
46
68
  indent_str = ' ' * indent
47
69
  str = indent_str + to_s
48
- children.each do |child|
70
+ children.each_with_index do |child, i|
71
+ extra_indent = 0
49
72
  if child
73
+ name = self.class.child_name(i)
74
+ if Duby::AST.verbose && name
75
+ str << "\n#{indent_str} #{name}:"
76
+ extra_indent = 1
77
+ end
50
78
  if ::Array === child
51
79
  child.each {|ary_child|
52
- str << "\n#{ary_child.inspect(indent + 1)}"
80
+ if Duby::AST.verbose && Node === ary_child && ary_child.parent != self
81
+ str << "\n#{indent_str} (wrong parent)"
82
+ end
83
+ str << "\n#{ary_child.inspect(indent + extra_indent + 1)}"
53
84
  }
54
85
  elsif ::Hash === child
55
86
  str << "\n#{indent_str} #{child.inspect}"
56
87
  else
57
- str << "\n#{child.inspect(indent + 1)}"
88
+ if Duby::AST.verbose && Node === child && child.parent != self
89
+ str << "\n#{indent_str} (wrong parent)"
90
+ end
91
+ str << "\n#{child.inspect(indent + extra_indent + 1)}"
58
92
  end
59
93
  end
60
94
  end
@@ -71,7 +105,21 @@ module Duby
71
105
 
72
106
  def each(&b) children.each(&b) end
73
107
 
74
- def resolved!
108
+ def <<(node)
109
+ @children << _set_parent(node)
110
+ self
111
+ end
112
+
113
+ def insert(index, node)
114
+ node.parent = self
115
+ @children.insert(index, node)
116
+ end
117
+
118
+ def empty?
119
+ @children.empty?
120
+ end
121
+
122
+ def resolved!(typer=nil)
75
123
  log "#{to_s} resolved!"
76
124
  @resolved = true
77
125
  end
@@ -81,7 +129,7 @@ module Duby
81
129
  def resolve_if(typer)
82
130
  unless resolved?
83
131
  @inferred_type = yield
84
- @inferred_type ? resolved! : typer.defer(self)
132
+ @inferred_type ? resolved!(typer) : typer.defer(self)
85
133
  end
86
134
  @inferred_type
87
135
  end
@@ -89,8 +137,33 @@ module Duby
89
137
  def self.===(other)
90
138
  super || (other.kind_of?(NodeProxy) && (self === other.__getobj__))
91
139
  end
140
+
141
+ def _set_parent(node)
142
+ case node
143
+ when Node
144
+ node.parent = self
145
+ when ::Array
146
+ node.each {|x| x.parent = self if x}
147
+ end
148
+ node
149
+ end
150
+
151
+ def initialize_copy(other)
152
+ @parent = nil
153
+ @children = []
154
+ other.children.each do |child|
155
+ case child
156
+ when ::Array
157
+ self << child.map {|x| x.dup}
158
+ when nil
159
+ self << nil
160
+ else
161
+ self << child.dup
162
+ end
163
+ end
164
+ end
92
165
  end
93
-
166
+
94
167
  class ErrorNode < Node
95
168
  def initialize(parent, error)
96
169
  super(parent, error.position)
@@ -98,7 +171,7 @@ module Duby
98
171
  @inferred_type = TypeReference::ErrorType
99
172
  @resolved = true
100
173
  end
101
-
174
+
102
175
  def infer(typer)
103
176
  end
104
177
  end
@@ -134,10 +207,20 @@ module Duby
134
207
  @scope ||= begin
135
208
  scope = parent
136
209
  raise "No parent for #{self.class.name} at #{line_number}" if scope.nil?
137
- scope = scope.parent until scope.class.include?(Scope)
210
+ until scope.class.include?(Scope)
211
+ scope = scope.parent
212
+ end
138
213
  scope
139
214
  end
140
215
  end
216
+
217
+ def containing_scope
218
+ scope = self.scope.static_scope
219
+ while scope.parent && scope.parent.include?(name)
220
+ scope = scope.parent
221
+ end
222
+ scope
223
+ end
141
224
  end
142
225
 
143
226
  module ClassScoped
@@ -159,7 +242,109 @@ module Duby
159
242
  end
160
243
  end
161
244
 
162
- module Scope; end
245
+ class StaticScope
246
+ attr_reader :parent
247
+ attr_writer :self_type
248
+
249
+ def initialize(parent=nil)
250
+ @vars = {}
251
+ @parent = parent
252
+ @children = {}
253
+ end
254
+
255
+ def <<(name)
256
+ @vars[name] = true
257
+ end
258
+
259
+ def include?(name, include_parent=true)
260
+ @vars.include?(name) ||
261
+ (include_parent && parent && parent.include?(name))
262
+ end
263
+
264
+ def captured?(name)
265
+ if !include?(name, false)
266
+ return false
267
+ elsif parent && parent.include?(name)
268
+ return true
269
+ else
270
+ return children.any? {|child| child.include?(name, false)}
271
+ end
272
+ end
273
+
274
+ def children
275
+ @children.keys
276
+ end
277
+
278
+ def add_child(scope)
279
+ @children[scope] = true
280
+ end
281
+
282
+ def remove_child(scope)
283
+ @children.delete(scope)
284
+ end
285
+
286
+ def parent=(parent)
287
+ @parent.remove_child(self) if @parent
288
+ parent.add_child(self)
289
+ @parent = parent
290
+ end
291
+
292
+ def self_type
293
+ if @self_type.nil? && parent
294
+ @self_type = parent.self_type
295
+ end
296
+ @self_type
297
+ end
298
+
299
+ def binding_type(defining_class=nil, duby=nil)
300
+ @binding_type ||= begin
301
+ if parent
302
+ parent.binding_type(defining_class, duby)
303
+ else
304
+ name = "#{defining_class.name}$#{duby.tmp}"
305
+ factory = Duby::AST.type_factory
306
+ if factory
307
+ factory.declare_type(name)
308
+ else
309
+ Duby::AST::TypeReference.new(name, false, false)
310
+ end
311
+ end
312
+ end
313
+ end
314
+
315
+ def binding_type=(type)
316
+ if parent
317
+ parent.binding_type = type
318
+ else
319
+ @binding_type = type
320
+ end
321
+ end
322
+
323
+ def has_binding?
324
+ @binding_type != nil || (parent && parent.has_binding?)
325
+ end
326
+ end
327
+
328
+ module Scope
329
+ attr_writer :static_scope
330
+ def static_scope
331
+ @static_scope ||= StaticScope.new
332
+ end
333
+ end
334
+
335
+ module Binding
336
+ def binding_type(duby=nil)
337
+ static_scope.binding_type(defining_class, duby)
338
+ end
339
+
340
+ def binding_type=(type)
341
+ static_scope.binding_type = type
342
+ end
343
+
344
+ def has_binding?
345
+ static_scope.has_binding?
346
+ end
347
+ end
163
348
 
164
349
  class Colon2 < Node; end
165
350
 
@@ -186,10 +371,14 @@ module Duby
186
371
  class VoidType < Node; end
187
372
 
188
373
  class Annotation < Node
374
+ attr_reader :values
375
+ attr_accessor :runtime
376
+ alias runtime? runtime
377
+
189
378
  def initialize(parent, position, klass)
190
379
  super(parent, position)
191
380
  @class = klass
192
- @values = []
381
+ @values = {}
193
382
  end
194
383
 
195
384
  def name
@@ -201,7 +390,11 @@ module Duby
201
390
  end
202
391
 
203
392
  def []=(name, value)
204
- # TODO support annotation arguments
393
+ @values[name] = value
394
+ end
395
+
396
+ def [](name)
397
+ @values[name]
205
398
  end
206
399
  end
207
400
 
@@ -211,7 +404,7 @@ module Duby
211
404
  alias array? array
212
405
  attr_accessor :meta
213
406
  alias meta? meta
214
-
407
+
215
408
  def initialize(name, array = false, meta = false, position=nil)
216
409
  super(nil, position)
217
410
  @name = name
@@ -239,7 +432,7 @@ module Duby
239
432
  # default behavior now is to disallow any polymorphic types
240
433
  self == other
241
434
  end
242
-
435
+
243
436
  def compatible?(other)
244
437
  # default behavior is only exact match right now
245
438
  self == other ||
@@ -250,7 +443,7 @@ module Duby
250
443
  def iterable?
251
444
  array?
252
445
  end
253
-
446
+
254
447
  def component_type
255
448
  AST.type(name) if array?
256
449
  end
@@ -276,14 +469,18 @@ module Duby
276
469
  name == :error
277
470
  end
278
471
 
472
+ def null?
473
+ name == :null
474
+ end
475
+
279
476
  def unreachable?
280
477
  name == :unreachable
281
478
  end
282
-
479
+
283
480
  def block?
284
481
  name == :block
285
482
  end
286
-
483
+
287
484
  def primitive?
288
485
  true
289
486
  end
@@ -305,15 +502,15 @@ module Duby
305
502
  @interfaces = interfaces
306
503
  end
307
504
  end
308
-
505
+
309
506
  def self.type_factory
310
507
  Thread.current[:ast_type_factory]
311
508
  end
312
-
509
+
313
510
  def self.type_factory=(factory)
314
511
  Thread.current[:ast_type_factory] = factory
315
512
  end
316
-
513
+
317
514
  # Shortcut method to construct type references
318
515
  def self.type(typesym, array = false, meta = false)
319
516
  factory = type_factory
@@ -323,7 +520,7 @@ module Duby
323
520
  TypeReference.new(typesym, array, meta)
324
521
  end
325
522
  end
326
-
523
+
327
524
  def self.no_type
328
525
  factory = type_factory
329
526
  if factory
@@ -332,7 +529,7 @@ module Duby
332
529
  TypeReference::NoType
333
530
  end
334
531
  end
335
-
532
+
336
533
  def self.error_type
337
534
  TypeReference::ErrorType
338
535
  end
@@ -340,7 +537,7 @@ module Duby
340
537
  def self.unreachable_type
341
538
  TypeReference::UnreachableType
342
539
  end
343
-
540
+
344
541
  def self.block_type
345
542
  TypeReference::BlockType
346
543
  end
@@ -351,7 +548,7 @@ module Duby
351
548
  factory.fixnum(parent, position, literal)
352
549
  else
353
550
  Fixnum.new(parent, position, literal)
354
- end
551
+ end
355
552
  end
356
553
 
357
554
  def self.float(parent, position, literal)
@@ -360,15 +557,15 @@ module Duby
360
557
  factory.float(parent, position, literal)
361
558
  else
362
559
  Float.new(parent, position, literal)
363
- end
560
+ end
364
561
  end
365
-
562
+
366
563
  def self.defmacro(name, &block)
367
564
  @macros ||= {}
368
565
  raise "Conflicting macros for #{name}" if @macros[name]
369
566
  @macros[name] = block
370
567
  end
371
-
568
+
372
569
  def self.macro(name)
373
570
  @macros[name]
374
571
  end
@@ -6,13 +6,25 @@ module Duby::AST
6
6
  node.parent = parent
7
7
  __setobj__(node)
8
8
  end
9
+
10
+ def dup
11
+ new = super
12
+ new.__setobj__(__getobj__.dup)
13
+ new.proxy = new
14
+ new
15
+ end
9
16
  end
10
17
 
11
18
  class FunctionalCall < Node
19
+ include Java::DubyLangCompiler.Call
12
20
  include Named
13
- attr_accessor :parameters, :block, :cast, :inlined, :proxy
21
+ include Scoped
22
+ attr_accessor :cast, :inlined, :proxy
14
23
  alias cast? cast
15
24
 
25
+ child :parameters
26
+ child :block
27
+
16
28
  def self.new(*args, &block)
17
29
  real_node = super
18
30
  real_node.proxy = NodeProxy.new(real_node)
@@ -20,30 +32,47 @@ module Duby::AST
20
32
 
21
33
  def initialize(parent, line_number, name, &kids)
22
34
  super(parent, line_number, &kids)
23
- @parameters, @block = children
24
35
  @name = name
25
36
  @cast = false
26
37
  end
27
-
38
+
39
+ def arguments
40
+ @arguments ||= begin
41
+ args = java.util.ArrayList.new(parameters.size)
42
+ parameters.each do |param|
43
+ args.add(param)
44
+ end
45
+ args
46
+ end
47
+ end
48
+
49
+ def target
50
+ nil
51
+ end
52
+
28
53
  def infer(typer)
29
- @self_type ||= typer.self_type
54
+ @self_type ||= scope.defining_class
30
55
 
31
56
  unless @inferred_type
32
57
  receiver_type = @self_type
33
58
  should_defer = false
34
-
59
+
35
60
  parameter_types = parameters.map do |param|
36
61
  typer.infer(param) || should_defer = true
37
62
  end
38
-
39
- parameter_types << Duby::AST.block_type if @block
40
-
63
+
64
+ parameter_types << Duby::AST.block_type if block
65
+
41
66
  unless should_defer
42
- if parameters.size == 1 && typer.known_types[name]
67
+ if parameters.size == 1 && typer.known_type(name)
43
68
  # cast operation
44
69
  resolved!
45
70
  self.cast = true
46
- @inferred_type = typer.known_types[name]
71
+ @inferred_type = typer.known_type(name)
72
+ elsif parameters.size == 0 && scope.static_scope.include?(name)
73
+ @inlined = Local.new(parent, position, name)
74
+ proxy.__inline__(@inlined)
75
+ return proxy.infer(typer)
47
76
  else
48
77
  @inferred_type = typer.method_type(receiver_type, name,
49
78
  parameter_types)
@@ -54,17 +83,30 @@ module Duby::AST
54
83
  end
55
84
  end
56
85
  end
57
-
58
- @inferred_type ? resolved! : typer.defer(proxy)
86
+
87
+ if @inferred_type
88
+ if block
89
+ method = receiver_type.get_method(name, parameter_types)
90
+ block.prepare(typer, method)
91
+ end
92
+ resolved!
93
+ else
94
+ typer.defer(proxy)
95
+ end
59
96
  end
60
-
97
+
61
98
  @inferred_type
62
99
  end
63
100
  end
64
-
101
+
65
102
  class Call < Node
103
+ include Java::DubyLangCompiler.Call
66
104
  include Named
67
- attr_accessor :target, :parameters, :block, :inlined, :proxy
105
+ attr_accessor :inlined, :proxy
106
+
107
+ child :target
108
+ child :parameters
109
+ child :block
68
110
 
69
111
  def self.new(*args, &block)
70
112
  real_node = super
@@ -72,11 +114,20 @@ module Duby::AST
72
114
  end
73
115
 
74
116
  def initialize(parent, line_number, name, &kids)
75
- super(parent, line_number, children, &kids)
76
- @target, @parameters, @block = children
117
+ super(parent, line_number, &kids)
77
118
  @name = name
78
119
  end
79
120
 
121
+ def arguments
122
+ @arguments ||= begin
123
+ args = java.util.ArrayList.new(parameters.size)
124
+ parameters.each do |param|
125
+ args.add(param)
126
+ end
127
+ args
128
+ end
129
+ end
130
+
80
131
  def infer(typer)
81
132
  unless @inferred_type
82
133
  receiver_type = typer.infer(target)
@@ -85,7 +136,7 @@ module Duby::AST
85
136
  typer.infer(param) || should_defer = true
86
137
  end
87
138
 
88
- parameter_types << Duby::AST.block_type if @block
139
+ parameter_types << Duby::AST.block_type if block
89
140
 
90
141
  unless should_defer
91
142
  @inferred_type = typer.method_type(receiver_type, name,
@@ -96,22 +147,31 @@ module Duby::AST
96
147
  return proxy.infer(typer)
97
148
  end
98
149
  end
99
-
100
- @inferred_type ? resolved! : typer.defer(proxy)
150
+
151
+ if @inferred_type
152
+ if block && !receiver_type.error?
153
+ method = receiver_type.get_method(name, parameter_types)
154
+ block.prepare(typer, method)
155
+ end
156
+ resolved!
157
+ else
158
+ typer.defer(proxy)
159
+ end
101
160
  end
102
-
161
+
103
162
  @inferred_type
104
163
  end
105
164
  end
106
165
 
107
166
  class Super < Node
108
167
  include Named
109
- attr_accessor :parameters, :method, :cast
168
+ attr_accessor :method, :cast
110
169
  alias :cast? :cast
111
170
 
171
+ child :parameters
172
+
112
173
  def initialize(parent, line_number)
113
174
  super(parent, line_number)
114
- @parameters = children[0]
115
175
  @call_parent = parent
116
176
  @call_parent = (@call_parent = @call_parent.parent) until MethodDefinition === @call_parent
117
177
  @cast = false
@@ -123,9 +183,9 @@ module Duby::AST
123
183
 
124
184
  def infer(typer)
125
185
  @self_type ||= typer.self_type.superclass
126
-
186
+
127
187
  unless @inferred_type
128
- receiver_type = @call_parent.defining_class
188
+ receiver_type = @call_parent.defining_class.superclass
129
189
  should_defer = receiver_type.nil?
130
190
  parameter_types = parameters.map do |param|
131
191
  typer.infer(param) || should_defer = true