ruby2c 1.0.0.6
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.
- data.tar.gz.sig +1 -0
- data/.autotest +21 -0
- data/History.txt +173 -0
- data/Manifest.txt +35 -0
- data/README.txt +76 -0
- data/Rakefile +21 -0
- data/demo/char.rb +13 -0
- data/demo/factorial.rb +11 -0
- data/demo/hello.rb +11 -0
- data/demo/misc.rb +25 -0
- data/demo/newarray.rb +11 -0
- data/demo/strcat.rb +12 -0
- data/lib/crewriter.rb +199 -0
- data/lib/function_table.rb +45 -0
- data/lib/function_type.rb +46 -0
- data/lib/handle.rb +14 -0
- data/lib/r2cenvironment.rb +59 -0
- data/lib/rewriter.rb +35 -0
- data/lib/ruby_to_ansi_c.rb +673 -0
- data/lib/ruby_to_ruby_c.rb +382 -0
- data/lib/type.rb +148 -0
- data/lib/type_checker.rb +920 -0
- data/lib/typed_sexp.rb +88 -0
- data/test/r2ctestcase.rb +1196 -0
- data/test/test_crewriter.rb +328 -0
- data/test/test_extras.rb +68 -0
- data/test/test_function_table.rb +90 -0
- data/test/test_function_type.rb +125 -0
- data/test/test_handle.rb +39 -0
- data/test/test_r2cenvironment.rb +191 -0
- data/test/test_rewriter.rb +16 -0
- data/test/test_ruby_to_ansi_c.rb +487 -0
- data/test/test_ruby_to_ruby_c.rb +161 -0
- data/test/test_type.rb +193 -0
- data/test/test_type_checker.rb +805 -0
- data/test/test_typed_sexp.rb +138 -0
- metadata +164 -0
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
��D�H�_CVy��!��&���BD�^?R"��^��T��6�W��LY����>�dR�^c����|�#�`���{���S����Q�ɏ�~���a���i���W��(�q%[�n��J�i�@��>��v|%/>c����5a����w!A�x�zn���̦#��Ԯ3�!M�������oL�G �D�/MPԞ�r���n�0�.:��S���])>���,@Y`�U�:~�t���Ð��f#���@��љ*��
|
data/.autotest
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'autotest/restart'
|
4
|
+
|
5
|
+
Autotest.add_hook :initialize do |at|
|
6
|
+
l = %w(ruby_parser RubyInline sexp_processor minitest)
|
7
|
+
t = %w(ParseTree sexp_processor)
|
8
|
+
|
9
|
+
at.libs << ':' << l.map { |d| "../../#{d}/dev/lib" }.join(":")
|
10
|
+
at.libs << ':' << t.map { |d| "../../#{d}/dev/test" }.join(":")
|
11
|
+
|
12
|
+
at.extra_files << "../../ParseTree/dev/test/pt_testcase.rb"
|
13
|
+
|
14
|
+
at.add_mapping(/(pt_|r2c)testcase/) do |f, _|
|
15
|
+
at.files_matching(/\/test_.*rb$/)
|
16
|
+
end
|
17
|
+
|
18
|
+
at.extra_class_map["TestCRewriter"] = "test/test_crewriter.rb"
|
19
|
+
|
20
|
+
at.testlib = "minitest/autorun"
|
21
|
+
end
|
data/History.txt
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
=== 1.0.0.6 / 2009-06-23
|
2
|
+
|
3
|
+
1 major enhancement:
|
4
|
+
|
5
|
+
* Switched from ParseTree to ruby_parser for 1.9 compatibility. woo.
|
6
|
+
* All translate/process methods are gone since we can't reflect at runtime.
|
7
|
+
|
8
|
+
43 minor enhancements:
|
9
|
+
|
10
|
+
* Added IterRewriter for finding free variables in iter nodes.
|
11
|
+
* Added dxstr.
|
12
|
+
* Added lots of new and missing tests
|
13
|
+
* Added not, array, lit_long_negative, lit_range[23], lit_regexp{_n,_once}, lit_sym{,_splat}
|
14
|
+
* Added pct_w tests
|
15
|
+
* Added process_defx to ruby_to_ansi_c.rb
|
16
|
+
* Added test data for array_pct_W, array_pct_W_dstr, attrasgn_index_equals, attrasgn_index_equals_space, and attrset.
|
17
|
+
* Added tests for "and". PONG to eric
|
18
|
+
* Added to_ary and masgn for TypeChecker.
|
19
|
+
* Added xstr support.
|
20
|
+
* Added yield(*ary)
|
21
|
+
* Cleaned up rewriter.rb and made changes for pt_testcase.rb
|
22
|
+
* Cleaned up some free_vars processing code.
|
23
|
+
* Converted everything to new enhanced PTTC test scheme.
|
24
|
+
* Enhanced with_scope to allow for static arrays.
|
25
|
+
* Extended Environment to separately store both types and values.
|
26
|
+
* Extern methods to support rb_iterate, including #each and #each_with_index.
|
27
|
+
* Free var static declarations for C layers.
|
28
|
+
* Merged IterRewriter into CRewriter and make typed.
|
29
|
+
* Migrated as much out of rewriter as possible.
|
30
|
+
* Modernized via hoe.
|
31
|
+
* Moved to full PTTC + UnifiedRuby.
|
32
|
+
* Pulled dstr up from ZenObfuscator.
|
33
|
+
* Pulled up tests, process_args, with_scope, and process_scope from obfuscator
|
34
|
+
* Pushed unique.rb up to PT
|
35
|
+
* Removed Environment methods that pushed up to ruby_parser.
|
36
|
+
* Removed Sexp#sexp_type
|
37
|
+
* Removed accessor, accessor_equals since they don't exist in PTTC.
|
38
|
+
* Removed bin/*
|
39
|
+
* Removed dead test
|
40
|
+
* Removed redundant defn_lvar_boundary, but added call to lvar_def_boundary.
|
41
|
+
* Renamed blocks to extra_methods in ruby_to_ruby_c.
|
42
|
+
* Renamed environment.rb to r2cenvironment.rb (incl tests)
|
43
|
+
* Renamed iter_functions to extra_methods in crewriter.
|
44
|
+
* Reordered so RubyToRubyC was always after RubyToAnsiC.
|
45
|
+
* Some optimizations cleaning up Type#method_missing. Drops test time ~30%.
|
46
|
+
* Split rewriter.rb to crewriter.rb (and renamed class to CRewriter).
|
47
|
+
* Split up and deleted support.rb (and tests).
|
48
|
+
* Switched from makefile to rakefile.
|
49
|
+
* Switched to minitest
|
50
|
+
* Test or node.
|
51
|
+
* Track and trigger changes on pt_testcase.rb and r2ctestcase.rb
|
52
|
+
* Used Hoe#add_include_dirs to clean up rakefile.
|
53
|
+
|
54
|
+
* 12 bug fixes:
|
55
|
+
|
56
|
+
* Fix types in iter rewriting.
|
57
|
+
* Fix yield([42, 24])
|
58
|
+
* Fixed 1.9-isms.
|
59
|
+
* Fixed all rubygems loaders.
|
60
|
+
* Fixed dependencies on all tests.
|
61
|
+
* Fixed for new (incompatible?) Environment supplied by SexpProcessor
|
62
|
+
* Fixed incompatibility with new inline changes.
|
63
|
+
* Fixed requires on ruby_parser
|
64
|
+
* Fixed ruby2c to work with autotest.
|
65
|
+
* Fixed tests in r2ctestcase for all layers except the C layers.
|
66
|
+
* Fixed zentest dependency in rakefile
|
67
|
+
* Fixes for RAD, mostly renaming environment.rb to r2cenvironment.rb at this stage.
|
68
|
+
|
69
|
+
=== 1.0.0-beta-5 / 2006-05-12
|
70
|
+
|
71
|
+
* 6 minor enhancements:
|
72
|
+
|
73
|
+
* Split RubyToC to RubyToRubyC and RubyToAnsiC.
|
74
|
+
* Extended Environment to be more flexible for various situations.
|
75
|
+
* Removed propaganda (bloat) from release.
|
76
|
+
* Gemified and reorganized things. Support still needs splitting up.
|
77
|
+
* Flipped a lot of internal naming to use Unique.
|
78
|
+
* Added ruby_to_c_show (like parse_tree_show).
|
79
|
+
|
80
|
+
* 4(ish) bug fixes:
|
81
|
+
|
82
|
+
* Use ivars instead of cvars so inheritance won't bugger the translator.
|
83
|
+
* Corrected unsupported node lists in pipeline.
|
84
|
+
* Fixed bugs for splat args, iters, optional args, method name map.
|
85
|
+
* Fixed many other bugs.
|
86
|
+
|
87
|
+
=== 1.0.0-beta-4 / 2005-07-13
|
88
|
+
|
89
|
+
* 1 minor enhancements:
|
90
|
+
|
91
|
+
* Added gemspec (hastily).
|
92
|
+
|
93
|
+
* 2 bug fixes:
|
94
|
+
|
95
|
+
* Translates bool type to VALUE since we were using Qtrue/Qfalse.
|
96
|
+
* Fixed rubygems for non-gem systems.
|
97
|
+
|
98
|
+
=== 1.0.0-beta-3 / 2005-06-08
|
99
|
+
|
100
|
+
* 16 minor enhancements:
|
101
|
+
|
102
|
+
* Added ivar and iasgn support. Needs more work.
|
103
|
+
* Added limited support for self.
|
104
|
+
* Added pipeline tests for bools, call_arglist, call_attrasgn, fbody.
|
105
|
+
* Added process_not to RubyToC.
|
106
|
+
* Added support for float and symbol literals.
|
107
|
+
* Added support for gasgn, cvasgn, const (class consts, not classes).
|
108
|
+
* Improved error handling/reporting, esp in RubyToC.
|
109
|
+
* In TypeChecker.boostrap, pre-registered all base classes.
|
110
|
+
* Modified process_class test to include a class const.
|
111
|
+
* Processing :class now adds class constants to the local var scope.
|
112
|
+
* Processing :const checks both genv and env now.
|
113
|
+
* Rearchitected all tests into a pipeline test class.
|
114
|
+
* Rewrite attrasgn into regular calls.
|
115
|
+
* Rewrite fbody into a regular defn.
|
116
|
+
* Rewrote :array inside call to :arglist.
|
117
|
+
* Rewrote :or nodes in process_case to correctly be binary.
|
118
|
+
|
119
|
+
* 1 bug fix:
|
120
|
+
|
121
|
+
* Fixed a bug where single line while bodies were missing a semicolon.
|
122
|
+
|
123
|
+
=== 1.0.0-beta-2 / 2005-02-15
|
124
|
+
|
125
|
+
* 1 minor enhancement:
|
126
|
+
|
127
|
+
* Added post-condition while/until support and tests.
|
128
|
+
|
129
|
+
* 4 bug fixes:
|
130
|
+
|
131
|
+
* Fixed bug:1422: Escape newlines to prevent multi-line strings in C.
|
132
|
+
* Fixed bug:1429: Arrays of strings are not being properly.
|
133
|
+
* Fixed bug:1447/1448: Readme file's website and added ParseTree dependency.
|
134
|
+
|
135
|
+
=== 1.0.0-beta-1 / 2005-02-01
|
136
|
+
|
137
|
+
* 1 major enhancements:
|
138
|
+
|
139
|
+
* Hit 80% non-error conversion threshold for public beta release.
|
140
|
+
|
141
|
+
* 3 minor enhancements:
|
142
|
+
|
143
|
+
* (Mostly) Filled out functionality in Rewriter and TypeChecker.
|
144
|
+
* Flushed out what we don't do in RubyToC.
|
145
|
+
* Wrote a ton of rdoc
|
146
|
+
|
147
|
+
=== 1.0.0-a2 / 2004-12-31
|
148
|
+
|
149
|
+
* 7 major enhancements:
|
150
|
+
|
151
|
+
* Alpha 2 released to private group for critique.
|
152
|
+
* Refactored and split out ParseTree package.
|
153
|
+
* Gemified dependency on ParseTree.
|
154
|
+
* Added iter rewriting
|
155
|
+
* Added post type inference rewriting specific to C library.
|
156
|
+
* Massive increase to the base we can translate.
|
157
|
+
* We have stabilized the architecture but still have a ways to go.
|
158
|
+
|
159
|
+
* 2 minor enhancements:
|
160
|
+
|
161
|
+
* Added propaganda (presentations).
|
162
|
+
* Much better test coverage, now with ZenTest compliant naming.
|
163
|
+
|
164
|
+
* 2 bug fixes:
|
165
|
+
|
166
|
+
* Gem-proofed makefile.
|
167
|
+
* Tons of little fixes we didn't bother to track.
|
168
|
+
|
169
|
+
=== 1.0.0-a1 / 2004-09-24
|
170
|
+
|
171
|
+
* 1 major enhancement:
|
172
|
+
|
173
|
+
* Birthday! Alpha 1 released to private group for critique.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
.autotest
|
2
|
+
History.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
demo/char.rb
|
7
|
+
demo/factorial.rb
|
8
|
+
demo/hello.rb
|
9
|
+
demo/misc.rb
|
10
|
+
demo/newarray.rb
|
11
|
+
demo/strcat.rb
|
12
|
+
lib/crewriter.rb
|
13
|
+
lib/function_table.rb
|
14
|
+
lib/function_type.rb
|
15
|
+
lib/handle.rb
|
16
|
+
lib/r2cenvironment.rb
|
17
|
+
lib/rewriter.rb
|
18
|
+
lib/ruby_to_ansi_c.rb
|
19
|
+
lib/ruby_to_ruby_c.rb
|
20
|
+
lib/type.rb
|
21
|
+
lib/type_checker.rb
|
22
|
+
lib/typed_sexp.rb
|
23
|
+
test/r2ctestcase.rb
|
24
|
+
test/test_crewriter.rb
|
25
|
+
test/test_extras.rb
|
26
|
+
test/test_function_table.rb
|
27
|
+
test/test_function_type.rb
|
28
|
+
test/test_handle.rb
|
29
|
+
test/test_r2cenvironment.rb
|
30
|
+
test/test_rewriter.rb
|
31
|
+
test/test_ruby_to_ansi_c.rb
|
32
|
+
test/test_ruby_to_ruby_c.rb
|
33
|
+
test/test_type.rb
|
34
|
+
test/test_type_checker.rb
|
35
|
+
test/test_typed_sexp.rb
|
data/README.txt
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
= RubyToC
|
2
|
+
|
3
|
+
* http://rubyforge.org/projects/ruby2c/
|
4
|
+
* ryand-ruby@zenspider.com
|
5
|
+
* ruby2c@zenspider.com - mailing list
|
6
|
+
|
7
|
+
== DESCRIPTION:
|
8
|
+
|
9
|
+
ruby_to_c translates a static ruby subset to C. Hopefully it works.
|
10
|
+
|
11
|
+
NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE
|
12
|
+
|
13
|
+
THIS IS BETA SOFTWARE!
|
14
|
+
|
15
|
+
NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE ! NOTE
|
16
|
+
|
17
|
+
RubyToC has the following modules:
|
18
|
+
|
19
|
+
* Rewriter - massages the sexp into a more consistent form.
|
20
|
+
* TypeChecker - type inferencer for the above sexps.
|
21
|
+
* RubyToRubyC - converts a ruby (subset) sexp to ruby interals C.
|
22
|
+
* RubyToAnsiC - converts a ruby (subset) sexp to ANSI C.
|
23
|
+
|
24
|
+
and the following tools:
|
25
|
+
|
26
|
+
* translate.rb - Translates a given file to C.
|
27
|
+
|
28
|
+
== FEATURES/PROBLEMS:
|
29
|
+
|
30
|
+
* This is a preview release! BETA BETA BETA! Do NOT use this!
|
31
|
+
* Please contact me or Eric (drbrain of segment7 dot net) if you:
|
32
|
+
* have any feedback!
|
33
|
+
* have any changes!
|
34
|
+
* want to work on this!
|
35
|
+
|
36
|
+
== SYNOPSYS:
|
37
|
+
|
38
|
+
./translate.rb blah.rb > blah.c; gcc -c -I /rubylib/1.8/platform blah.c
|
39
|
+
|
40
|
+
== TODO:
|
41
|
+
|
42
|
+
* Numerous, but we are trying to get them in here... sorry...
|
43
|
+
* Want to move to a gem directory structure (lib/ test/ bin/ etc)
|
44
|
+
|
45
|
+
== REQUIREMENTS:
|
46
|
+
|
47
|
+
* ruby_parser - http://rubyforge.org/projects/parsetree/
|
48
|
+
|
49
|
+
== INSTALL:
|
50
|
+
|
51
|
+
* sudo gem install RubyToC
|
52
|
+
|
53
|
+
== LICENSE:
|
54
|
+
|
55
|
+
(The MIT License)
|
56
|
+
|
57
|
+
Copyright (c) 2001-2008 Ryan Davis, Zen Spider Software
|
58
|
+
|
59
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
60
|
+
a copy of this software and associated documentation files (the
|
61
|
+
"Software"), to deal in the Software without restriction, including
|
62
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
63
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
64
|
+
permit persons to whom the Software is furnished to do so, subject to
|
65
|
+
the following conditions:
|
66
|
+
|
67
|
+
The above copyright notice and this permission notice shall be
|
68
|
+
included in all copies or substantial portions of the Software.
|
69
|
+
|
70
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
71
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
72
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
73
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
74
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
75
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
76
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
Hoe.add_include_dirs("../../ParseTree/dev/test",
|
7
|
+
"../../ruby_parser/dev/lib",
|
8
|
+
"../../sexp_processor/dev/lib",
|
9
|
+
"../../sexp_processor/dev/test",
|
10
|
+
"lib")
|
11
|
+
|
12
|
+
Hoe.plugin :seattlerb
|
13
|
+
|
14
|
+
Hoe.spec "ruby2c" do
|
15
|
+
developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
|
16
|
+
developer 'Eric Hodel', 'drbrain@segment7.net'
|
17
|
+
|
18
|
+
extra_deps << "ruby_parser"
|
19
|
+
end
|
20
|
+
|
21
|
+
# vim: syntax=ruby
|
data/demo/char.rb
ADDED
data/demo/factorial.rb
ADDED
data/demo/hello.rb
ADDED
data/demo/misc.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
class Misc
|
3
|
+
def assert(cond, n)
|
4
|
+
if (!cond) then
|
5
|
+
puts("-- SymTab fatal error ")
|
6
|
+
case (n)
|
7
|
+
when 3
|
8
|
+
puts("-- too many nodes in graph")
|
9
|
+
when 4
|
10
|
+
puts("-- too many sets")
|
11
|
+
when 6
|
12
|
+
puts("-- too many symbols")
|
13
|
+
when 7
|
14
|
+
puts("-- too many character classes")
|
15
|
+
end
|
16
|
+
# puts("Stack Trace = #{caller.join "\n"}")
|
17
|
+
exit(n)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def main
|
22
|
+
assert(1 == 1, 3)
|
23
|
+
return 0
|
24
|
+
end
|
25
|
+
end
|
data/demo/newarray.rb
ADDED
data/demo/strcat.rb
ADDED
data/lib/crewriter.rb
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
begin require 'rubygems'; rescue LoadError; end
|
4
|
+
require 'type'
|
5
|
+
require 'sexp_processor'
|
6
|
+
require 'r2cenvironment'
|
7
|
+
|
8
|
+
##
|
9
|
+
# CRewriter (should probably move this out to its own file) does
|
10
|
+
# rewritings that are language specific to C.
|
11
|
+
|
12
|
+
class CRewriter < SexpProcessor
|
13
|
+
|
14
|
+
##
|
15
|
+
# REWRITES maps a function signature to a proc responsible for
|
16
|
+
# generating the appropriate sexp for that rewriting.
|
17
|
+
|
18
|
+
REWRITES = {
|
19
|
+
[Type.str, :+, Type.str] => proc { |l,n,r|
|
20
|
+
t(:call, nil, :strcat, r.unshift(r.shift, l), Type.str)
|
21
|
+
},
|
22
|
+
[Type.file, :puts, Type.str] => proc { |l,n,r|
|
23
|
+
t(:call, nil, :fputs, r.push(l))
|
24
|
+
},
|
25
|
+
}
|
26
|
+
|
27
|
+
attr_reader :env
|
28
|
+
attr_reader :extra_methods
|
29
|
+
|
30
|
+
def initialize # :nodoc:
|
31
|
+
super
|
32
|
+
self.auto_shift_type = true
|
33
|
+
self.expected = TypedSexp
|
34
|
+
@env = ::R2CEnvironment.new
|
35
|
+
@extra_methods = []
|
36
|
+
end
|
37
|
+
|
38
|
+
def free # REFACTOR: this is a violation of responsibility, should be in Env
|
39
|
+
parent = @env.env[0..-2]
|
40
|
+
bound_in_parent = parent.map { |h| h.keys }.flatten
|
41
|
+
|
42
|
+
env = @env.all
|
43
|
+
|
44
|
+
free = env.select { |k, (t, v)| bound_in_parent.include? k or not v }
|
45
|
+
vars = free.map { |k, (t, v)| [k, t] }
|
46
|
+
return vars
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Rewrites function calls by looking them up in the REWRITES map. If
|
51
|
+
# a match exists, it invokes the block passing in the lhs, rhs, and
|
52
|
+
# function name. If one does not exist, it simply repacks the sexp
|
53
|
+
# and sends it along.
|
54
|
+
|
55
|
+
def process_call(exp)
|
56
|
+
lhs = process exp.shift
|
57
|
+
name = exp.shift
|
58
|
+
rhs = process exp.shift
|
59
|
+
|
60
|
+
lhs_type = lhs.sexp_type rescue nil
|
61
|
+
type_signature = [lhs_type, name]
|
62
|
+
type_signature += rhs[1..-1].map { |sexp| sexp.sexp_type } unless rhs.nil?
|
63
|
+
|
64
|
+
result = if REWRITES.has_key? type_signature then
|
65
|
+
REWRITES[type_signature].call(lhs, name, rhs)
|
66
|
+
else
|
67
|
+
t(:call, lhs, name, rhs, exp.sexp_type)
|
68
|
+
end
|
69
|
+
|
70
|
+
return result
|
71
|
+
end
|
72
|
+
|
73
|
+
def process_class(exp)
|
74
|
+
klassname = exp.shift
|
75
|
+
superklassname = exp.shift
|
76
|
+
|
77
|
+
methods = []
|
78
|
+
|
79
|
+
until exp.empty? do
|
80
|
+
methods << process(exp.shift)
|
81
|
+
end
|
82
|
+
|
83
|
+
@extra_methods.reverse_each do |defx| methods.unshift defx end
|
84
|
+
@extra_methods.clear
|
85
|
+
|
86
|
+
result = t(:class, klassname, superklassname, Type.zclass)
|
87
|
+
result.push(*methods)
|
88
|
+
|
89
|
+
return result
|
90
|
+
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# TODO register statics
|
94
|
+
|
95
|
+
def process_iter(exp)
|
96
|
+
iter_method_name = Unique.next
|
97
|
+
|
98
|
+
value_var_name = Unique.next
|
99
|
+
value_var_type = Type.unknown
|
100
|
+
|
101
|
+
memo_var_name = Unique.next
|
102
|
+
|
103
|
+
call = process exp.shift
|
104
|
+
vars = process exp.shift
|
105
|
+
body = nil
|
106
|
+
|
107
|
+
free_vars = @env.scope do
|
108
|
+
body = process exp.shift
|
109
|
+
self.free.map { |name, type| [name, :"static_#{Unique.next}", type] }
|
110
|
+
end
|
111
|
+
|
112
|
+
var_names = var_names_in vars
|
113
|
+
|
114
|
+
frees = t(:array, Type.void)
|
115
|
+
statics = t(:array, Type.void)
|
116
|
+
defx_body_block = t(:block)
|
117
|
+
|
118
|
+
# set statics first so block vars can update statics
|
119
|
+
free_vars.each do |name, static_name, type| # free vars go on both sides
|
120
|
+
frees << t(:lvar, name, type)
|
121
|
+
statics << t(:lvar, static_name, type)
|
122
|
+
defx_body_block << t(:lasgn, name,
|
123
|
+
t(:lvar, static_name, type),
|
124
|
+
type)
|
125
|
+
end
|
126
|
+
|
127
|
+
if var_names.length == 1 then # expand block args to lasgn
|
128
|
+
value_var_type = var_names.first.last
|
129
|
+
|
130
|
+
defx_body_block << t(:lasgn, var_names.first.first,
|
131
|
+
t(:lvar, value_var_name, var_names.first.last),
|
132
|
+
var_names.first.last)
|
133
|
+
|
134
|
+
else # expand block args to masgn
|
135
|
+
value_var_type = Type.value
|
136
|
+
dyn_vars = t(:array)
|
137
|
+
|
138
|
+
var_names.each do |name, type|
|
139
|
+
dyn_vars << t(:lasgn, name, nil, type)
|
140
|
+
end
|
141
|
+
|
142
|
+
defx_body_block << t(:masgn,
|
143
|
+
dyn_vars,
|
144
|
+
t(:to_ary, t(:lvar, value_var_name, Type.value)))
|
145
|
+
end
|
146
|
+
|
147
|
+
defx_body_block << body
|
148
|
+
|
149
|
+
free_vars.each do |name, static_name, type|
|
150
|
+
defx_body_block << t(:lasgn, static_name, t(:lvar, name, type), type)
|
151
|
+
@extra_methods << t(:static, "static VALUE #{static_name};", Type.fucked)
|
152
|
+
end
|
153
|
+
|
154
|
+
defx_body_block << t(:return, t(:nil, Type.value))
|
155
|
+
|
156
|
+
defx = t(:defx,
|
157
|
+
iter_method_name,
|
158
|
+
t(:args,
|
159
|
+
t(value_var_name, value_var_type),
|
160
|
+
t(memo_var_name, Type.value)),
|
161
|
+
t(:scope, defx_body_block),
|
162
|
+
Type.void)
|
163
|
+
|
164
|
+
@extra_methods << defx
|
165
|
+
|
166
|
+
args = t(:args, frees, statics, Type.void)
|
167
|
+
|
168
|
+
return t(:iter, call, args, iter_method_name)
|
169
|
+
end
|
170
|
+
|
171
|
+
def process_lasgn(exp)
|
172
|
+
name = exp.shift
|
173
|
+
value = process(exp.shift)
|
174
|
+
|
175
|
+
@env.add name, exp.sexp_type
|
176
|
+
@env.set_val name, true
|
177
|
+
|
178
|
+
return t(:lasgn, name, value, exp.sexp_type)
|
179
|
+
end
|
180
|
+
|
181
|
+
def process_lvar(exp)
|
182
|
+
name = exp.shift
|
183
|
+
|
184
|
+
@env.add name, Type.value
|
185
|
+
@env.lookup name rescue @env.set_val name, false
|
186
|
+
|
187
|
+
return t(:lvar, name, exp.sexp_type)
|
188
|
+
end
|
189
|
+
|
190
|
+
def var_names_in(exp)
|
191
|
+
return [[exp.last, exp.sexp_type]] if exp.length == 2 and not Sexp === exp.last
|
192
|
+
|
193
|
+
var_names = []
|
194
|
+
exp.each_of_type :dasgn_curr do |sexp|
|
195
|
+
var_names << [sexp.sexp_body.first, sexp.sexp_type]
|
196
|
+
end
|
197
|
+
return var_names
|
198
|
+
end
|
199
|
+
end
|