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/nbcompiler.rb
CHANGED
@@ -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
|
data/lib/duby/plugin/edb.rb
CHANGED
@@ -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,
|
12
|
+
ast = Duby::AST.parse_ruby(src, path)
|
13
13
|
transformer.transform(ast.body_node, parent)
|
14
14
|
end
|
15
15
|
|
data/lib/duby/plugin/java.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/duby/transform.rb
CHANGED
@@ -11,14 +11,31 @@ module Duby
|
|
11
11
|
@cause = cause
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
class Transformer
|
16
|
-
|
17
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
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] =
|
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'] =
|
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
|
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
|
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
|
-
|
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
|
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
|
1052
|
+
LocalDeclaration.new(parent, position, name) {|local_decl| [value_node.type_reference(local_decl)]}
|
965
1053
|
else
|
966
|
-
LocalAssignment.new(parent, position, name
|
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)
|