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
@@ -88,5 +88,8 @@ module Duby::JVM::Types
88
88
  unary_operator('+@', nil)
89
89
  end
90
90
 
91
+ def box(builder)
92
+ builder.invokestatic box_type, "valueOf", [box_type, math_type]
93
+ end
91
94
  end
92
95
  end
@@ -21,7 +21,7 @@ module Duby
21
21
  def parse(text)
22
22
  Duby::AST.type_factory = Duby::JVM::Types::TypeFactory.new
23
23
  ast = Duby::AST.parse_ruby(text)
24
- transformer = Duby::Transform::Transformer.new
24
+ transformer = Duby::Transform::Transformer.new(Duby::CompilationState.new)
25
25
  return ParseResult.new(
26
26
  transformer.transform(ast, nil), transformer.errors)
27
27
  end
@@ -9,7 +9,7 @@ Duby::AST.defmacro('def_edb') do |transformer, fcall, parent|
9
9
  compiler.pre_cmd = ["def #{name}", "_edbout = StringBuilder.new"]
10
10
  compiler.post_cmd = ["_edbout.toString", "end"]
11
11
  src = compiler.compile(IO.read(path))
12
- ast = Duby::AST.parse_ruby(src, "(edb)")
12
+ ast = Duby::AST.parse_ruby(src, path)
13
13
  transformer.transform(ast.body_node, parent)
14
14
  end
15
15
 
@@ -24,7 +24,16 @@ module Duby
24
24
  raise NoMethodError, "Method %s(%s) on %s not found" %
25
25
  [name, parameter_types.join(', '), target_type]
26
26
  end
27
- result = method.return_type if method
27
+ if method
28
+ result = method.return_type
29
+ elsif typer.last_chance && target_type.meta? &&
30
+ name == 'new' && parameter_types == []
31
+ unmeta = target_type.unmeta
32
+ if unmeta.respond_to?(:default_constructor)
33
+ result = unmeta.default_constructor
34
+ typer.last_chance = false if result
35
+ end
36
+ end
28
37
  end
29
38
 
30
39
  if result
@@ -11,14 +11,31 @@ module Duby
11
11
  @cause = cause
12
12
  end
13
13
  end
14
-
14
+
15
15
  class Transformer
16
- attr_reader :errors
17
- def initialize
16
+ begin
17
+ include Java::DubyLangCompiler.Compiler
18
+ rescue NameError
19
+ $CLASSPATH << File.dirname(__FILE__) + '/../../javalib/duby-bootstrap.jar'
20
+ include Java::DubyLangCompiler.Compiler
21
+ end
22
+
23
+ attr_reader :errors, :state
24
+ def initialize(state)
18
25
  @errors = []
19
26
  @tmp_count = 0
20
27
  @annotations = []
21
28
  @scopes = []
29
+ @extra_body = nil
30
+ @state = state
31
+ end
32
+
33
+ def destination
34
+ @state.destination
35
+ end
36
+
37
+ def verbose?
38
+ @state.verbose
22
39
  end
23
40
 
24
41
  def annotations
@@ -30,19 +47,34 @@ module Duby
30
47
  @annotations << annotation
31
48
  Duby::AST::Noop.new(annotation.parent, annotation.position)
32
49
  end
33
-
34
- def tmp
35
- "__xform_tmp_#{@tmp_count += 1}"
50
+
51
+ def tmp(format="__xform_tmp_%d")
52
+ format % [@tmp_count += 1]
36
53
  end
37
-
54
+
38
55
  def transform(node, parent)
39
56
  begin
40
57
  scope = node.getScope if node.respond_to? :getScope
41
58
  if scope
42
59
  @scopes << scope
43
60
  end
61
+ top = @extra_body.nil?
62
+ if top
63
+ @extra_body = Duby::AST::Body.new(nil, node.position)
64
+ end
44
65
  begin
45
- node.transform(self, parent)
66
+ result = node.transform(self, parent)
67
+ if top
68
+ body = result.body
69
+ if body.kind_of?(Duby::AST::Body) && @extra_body.empty?
70
+ @extra_body = body
71
+ else
72
+ result.body = @extra_body
73
+ body.parent = @extra_body
74
+ @extra_body.children.insert(0, body)
75
+ end
76
+ end
77
+ return result
46
78
  ensure
47
79
  if scope
48
80
  @scopes.pop
@@ -51,13 +83,13 @@ module Duby
51
83
  rescue Error => ex
52
84
  @errors << ex
53
85
  Duby::AST::ErrorNode.new(parent, ex)
54
- rescue Exception => ex
86
+ rescue Exception => ex
55
87
  error = Error.new(ex.message, node.position, ex)
56
88
  @errors << error
57
89
  Duby::AST::ErrorNode.new(parent, error)
58
90
  end
59
91
  end
60
-
92
+
61
93
  def captured?(node)
62
94
  depth = node.depth
63
95
  scope = @scopes[-1]
@@ -82,14 +114,28 @@ module Duby
82
114
  duby_node.parent = parent
83
115
  duby_node
84
116
  end
85
-
117
+
86
118
  def expand(fvcall, parent)
87
119
  result = yield self, fvcall, parent
88
- unless result.kind_of?(AST::Node)
120
+ unless AST::Node === result
89
121
  raise Error.new('Invalid macro result', fvcall.position)
90
122
  end
91
123
  result
92
124
  end
125
+
126
+ def append_node(node)
127
+ @extra_body << node
128
+ node
129
+ end
130
+
131
+ def define_class(position, name, &block)
132
+ append_node Duby::AST::ClassDefinition.new(nil, position, name, &block)
133
+ end
134
+
135
+ def define_closure(position, name, enclosing_type)
136
+ append_node(Duby::AST::ClosureDefinition.new(
137
+ nil, position, name, enclosing_type))
138
+ end
93
139
  end
94
140
  end
95
141
  TransformError = Transform::Error
@@ -104,10 +150,10 @@ module Duby
104
150
  java_import org.jrubyparser.parser.ParserConfiguration
105
151
  java_import org.jrubyparser.CompatVersion
106
152
  java_import java.io.StringReader
107
-
153
+
108
154
  def parse(src, filename='-', raise_errors=false, transformer=nil)
109
155
  ast = parse_ruby(src, filename)
110
- transformer ||= Transform::Transformer.new
156
+ transformer ||= Transform::Transformer.new(Duby::CompilationState.new)
111
157
  ast = transformer.transform(ast, nil)
112
158
  if raise_errors
113
159
  transformer.errors.each do |e|
@@ -117,7 +163,7 @@ module Duby
117
163
  ast
118
164
  end
119
165
  module_function :parse
120
-
166
+
121
167
  def parse_ruby(src, filename='-')
122
168
  raise ArgumentError if src.nil?
123
169
  parser = Parser.new
@@ -127,7 +173,7 @@ module Duby
127
173
  rescue => ex
128
174
  if ex.cause.respond_to? :position
129
175
  position = ex.cause.position
130
- puts "#{position.file}:#{position.start_line + 1}: #{ex.message}"
176
+ Duby.print_error(ex.cause.message, position)
131
177
  end
132
178
  raise ex
133
179
  end
@@ -141,7 +187,7 @@ module Duby
141
187
  set_args = JRubyAst::ListNode.new(position)
142
188
  set_args.add_all(args)
143
189
  set_args.add(value_node)
144
-
190
+
145
191
  first = JRubyAst::CallNode.new(position, receiver_node, name, args)
146
192
  second = JRubyAst::AttrAssignNode.new(position, receiver_node,
147
193
  "#{name}=", set_args)
@@ -157,7 +203,7 @@ module Duby
157
203
  end
158
204
  end
159
205
 
160
- # reload
206
+ # reload
161
207
  module JRubyAst
162
208
  class Node
163
209
  def transform(transformer, parent)
@@ -189,7 +235,7 @@ module Duby
189
235
 
190
236
  [:receiver_node, :args_node, :var_node, :head_node, :value_node, :iter_node, :body_node, :next_node, :condition, :then_body, :else_body].each do |mm|
191
237
  if self.respond_to?(mm)
192
- begin
238
+ begin
193
239
  s << "\n#{self.send(mm).inspect(indent+2)}" if self.send(mm)
194
240
  rescue
195
241
  s << "\n#{' '*(indent+2)}#{self.send(mm).inspect}" if self.send(mm)
@@ -208,7 +254,7 @@ module Duby
208
254
  end
209
255
  s
210
256
  end
211
-
257
+
212
258
  def signature(parent)
213
259
  nil
214
260
  end
@@ -216,7 +262,7 @@ module Duby
216
262
 
217
263
  class ListNode
218
264
  include Enumerable
219
-
265
+
220
266
  def each(&block)
221
267
  child_nodes.each(&block)
222
268
  end
@@ -232,7 +278,7 @@ module Duby
232
278
  pre
233
279
  end
234
280
  end
235
-
281
+
236
282
  def transform(transformer, parent)
237
283
  Arguments.new(parent, position) do |args_node|
238
284
  arg_list = args.child_nodes.map do |node|
@@ -311,7 +357,7 @@ module Duby
311
357
  Break.new(parent, position)
312
358
  end
313
359
  end
314
-
360
+
315
361
  class ClassNode
316
362
  def transform(transformer, parent)
317
363
  ClassDefinition.new(parent, position,
@@ -325,11 +371,30 @@ module Duby
325
371
  end
326
372
  end
327
373
 
374
+ class DStrNode
375
+ def transform(transformer, parent)
376
+ StringConcat.new(parent, position) do |p|
377
+ child_nodes.map{|n| n.transform(transformer, p)}
378
+ end
379
+ end
380
+ end
381
+
382
+ class EvStrNode
383
+ def transform(transformer, parent)
384
+ ToString.new(parent, position) do |p|
385
+ [body.transform(transformer, p)]
386
+ end
387
+ end
388
+ end
389
+
328
390
  class GlobalVarNode
329
391
  def transform(transformer, parent)
392
+ transformer.add_annotation(annotation(transformer, parent))
393
+ end
394
+
395
+ def annotation(transformer, parent)
330
396
  classname = name[1..-1]
331
397
  annotation = Annotation.new(parent, position, AST.type(classname))
332
- transformer.add_annotation(annotation)
333
398
  end
334
399
  end
335
400
 
@@ -362,7 +427,7 @@ module Duby
362
427
  actual_name = name[0..-2] + '_set'
363
428
  end
364
429
  end
365
-
430
+
366
431
  Call.new(parent, position, actual_name) do |call|
367
432
  [
368
433
  transformer.transform(receiver_node, call),
@@ -416,15 +481,15 @@ module Duby
416
481
  case value
417
482
  when HashNode
418
483
  values = value.list_node
419
- (0..(values.size / 2)).each do |i|
484
+ (0...(values.size / 2)).each do |i|
420
485
  name = values.get(2 * i).name
421
486
  value = values.get(2 * i + 1)
422
- annotation[name] = transformer.transform(value, annotation)
487
+ annotation[name] = annotation_value(value, annotation)
423
488
  end
424
489
  when nil
425
490
  # ignore an empty argument list
426
491
  else
427
- annotation['value'] = transformer.transform(value, annotation)
492
+ annotation['value'] = annotation_value(value, annotation)
428
493
  end
429
494
  annotation
430
495
  else
@@ -442,6 +507,20 @@ module Duby
442
507
  receiver = receiver.receiver_node while CallNode === receiver
443
508
  GlobalVarNode === receiver
444
509
  end
510
+
511
+ def annotation_value(value, annotation)
512
+ case value
513
+ when StrNode
514
+ java.lang.String.new(value.value)
515
+ when ArrayNode
516
+ value.child_nodes.map {|node| annotation_value(node, annotation)}
517
+ else
518
+ # TODO Support other types
519
+ ref = value.type_reference(annotation)
520
+ desc = BiteScript::Signature.class_id(ref)
521
+ BiteScript::ASM::Type.getType(desc)
522
+ end
523
+ end
445
524
  end
446
525
 
447
526
  class Colon2Node
@@ -532,7 +611,7 @@ module Duby
532
611
  end
533
612
  end
534
613
  end
535
-
614
+
536
615
  class FalseNode
537
616
  def transform(transformer, parent)
538
617
  Boolean.new(parent, position, false)
@@ -555,7 +634,7 @@ module Duby
555
634
  nil
556
635
  end
557
636
  end
558
-
637
+
559
638
  def transform(transformer, parent)
560
639
  @declaration ||= false
561
640
 
@@ -575,7 +654,7 @@ module Duby
575
654
  end
576
655
  end
577
656
  end
578
-
657
+
579
658
  def type_reference(parent)
580
659
  AST::type(name)
581
660
  end
@@ -790,10 +869,9 @@ module Duby
790
869
 
791
870
  class LocalAsgnNode
792
871
  def transform(transformer, parent)
793
- captured = transformer.captured?(self)
794
872
  case value_node
795
873
  when SymbolNode, ConstNode
796
- LocalDeclaration.new(parent, position, name, captured) {|local_decl| [value_node.type_reference(local_decl)]}
874
+ LocalDeclaration.new(parent, position, name) {|local_decl| [value_node.type_reference(local_decl)]}
797
875
  when JRubyAst::GlobalVarNode
798
876
  real_parent = parent
799
877
  real_parent = parent.parent if Body === real_parent
@@ -804,14 +882,19 @@ module Duby
804
882
  raise "Illegal global variable"
805
883
  end
806
884
  else
807
- LocalAssignment.new(parent, position, name, captured) {|local| [transformer.transform(value_node, local)]}
885
+ LocalAssignment.new(parent, position, name) {|local| [transformer.transform(value_node, local)]}
808
886
  end
809
887
  end
810
888
  end
811
889
 
812
890
  class LocalVarNode
813
891
  def transform(transformer, parent)
814
- Local.new(parent, position, name, transformer.captured?(self))
892
+ FunctionalCall.new(parent, position, name) do |call|
893
+ [
894
+ [],
895
+ nil
896
+ ]
897
+ end
815
898
  end
816
899
  end
817
900
 
@@ -850,6 +933,12 @@ module Duby
850
933
  end
851
934
  end
852
935
 
936
+ class RegexpNode
937
+ def transform(transformer, parent)
938
+ Regexp.new(parent, position, value.to_s)
939
+ end
940
+ end
941
+
853
942
  class ReturnNode
854
943
  def transform(transformer, parent)
855
944
  Return.new(parent, position) do |ret|
@@ -875,7 +964,7 @@ module Duby
875
964
  def transform(transformer, parent)
876
965
  String.new(parent, position, value)
877
966
  end
878
-
967
+
879
968
  def type_reference(parent)
880
969
  AST::type(value)
881
970
  end
@@ -886,13 +975,13 @@ module Duby
886
975
  AST::type(name)
887
976
  end
888
977
  end
889
-
978
+
890
979
  class TrueNode
891
980
  def transform(transformer, parent)
892
981
  Boolean.new(parent, position, true)
893
982
  end
894
983
  end
895
-
984
+
896
985
  class TypedArgumentNode
897
986
  def transform(transformer, parent)
898
987
  type_node.transform(transformer, parent)
@@ -921,7 +1010,7 @@ module Duby
921
1010
  end
922
1011
  end
923
1012
  end
924
-
1013
+
925
1014
  def type_reference(parent)
926
1015
  AST::type name
927
1016
  end
@@ -952,18 +1041,17 @@ module Duby
952
1041
  class DVarNode
953
1042
  def transform(transformer, parent)
954
1043
  # TODO does this need to be handled specially?
955
- Local.new(parent, position, name, transformer.captured?(self))
1044
+ Local.new(parent, position, name)
956
1045
  end
957
1046
  end
958
1047
 
959
1048
  class DAsgnNode
960
1049
  def transform(transformer, parent)
961
- captured = transformer.captured?(self)
962
1050
  case value_node
963
1051
  when SymbolNode, ConstNode
964
- LocalDeclaration.new(parent, position, name, captured) {|local_decl| [value_node.type_reference(local_decl)]}
1052
+ LocalDeclaration.new(parent, position, name) {|local_decl| [value_node.type_reference(local_decl)]}
965
1053
  else
966
- LocalAssignment.new(parent, position, name, captured) {|local| [transformer.transform(value_node, local)]}
1054
+ LocalAssignment.new(parent, position, name) {|local| [transformer.transform(value_node, local)]}
967
1055
  end
968
1056
  end
969
1057
  end
@@ -1003,7 +1091,7 @@ module Duby
1003
1091
  end
1004
1092
  end
1005
1093
  end
1006
-
1094
+
1007
1095
  class SuperNode
1008
1096
  def transform(transformer, parent)
1009
1097
  Super.new(parent, position) do
@@ -1011,13 +1099,13 @@ module Duby
1011
1099
  end
1012
1100
  end
1013
1101
  end
1014
-
1102
+
1015
1103
  class ZSuperNode
1016
1104
  def transform(transformer, parent)
1017
1105
  Super.new(parent, position)
1018
1106
  end
1019
1107
  end
1020
-
1108
+
1021
1109
  class SelfNode
1022
1110
  def transform(transformer, parent)
1023
1111
  Self.new(parent, position)