ruby2c 1.0.0.9 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +1 -0
- data/History.txt +78 -53
- data/README.txt +1 -1
- data/Rakefile +2 -0
- data/lib/crewriter.rb +35 -23
- data/lib/r2cenvironment.rb +3 -3
- data/lib/rewriter.rb +6 -2
- data/lib/ruby_to_ansi_c.rb +18 -18
- data/lib/ruby_to_ruby_c.rb +3 -3
- data/lib/type.rb +3 -3
- data/lib/type_checker.rb +101 -99
- data/lib/typed_sexp.rb +49 -25
- data/test/r2ctestcase.rb +321 -288
- data/test/test_crewriter.rb +127 -128
- data/test/test_extras.rb +4 -4
- data/test/test_function_table.rb +23 -23
- data/test/test_function_type.rb +39 -40
- data/test/test_handle.rb +2 -2
- data/test/test_r2cenvironment.rb +38 -38
- data/test/test_ruby_to_ansi_c.rb +58 -58
- data/test/test_ruby_to_ruby_c.rb +26 -26
- data/test/test_type.rb +38 -38
- data/test/test_type_checker.rb +165 -165
- data/test/test_typed_sexp.rb +62 -54
- data.tar.gz.sig +2 -1
- metadata +101 -153
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 48c5fa6b1d9d0ad39fe767091b224848115e582c4c5ede88513206abdcb826da
|
4
|
+
data.tar.gz: 698eddd47e434821160d610cf40ec9924eb0d7e70164cb94420e2eeff3ad86c9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5a8e9c38b1f1bd38e672400a540d5970fa44e0e369ad3549d0987333a7cae702b218a4d3b43a3de4d5dbb2c1dd30f71659e091080e45ef89982a4ff44428e5c6
|
7
|
+
data.tar.gz: 5475db786970e48b1b5fa1d61129a7c1147d7e29f5e3ed5d4716facdf43bace6f329899d6498ce15bc1d90b9fed05c5c79b1456ca293d4b4cb6121478648e55f
|
checksums.yaml.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
�<"3R������٤x�X=d�Y~��6d3�%o�M��iM ���D�k���F�#�Jպ���E�B�s&��1�M7�nU�=8����T�^u���RVZ����1W���8"���f�B���-�@=}�?R2���8KD�J��ۓ*5��ն���d���0��g�It��Q��0�QR|uH�
|
data/History.txt
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
=== 1.1.1 / 2022-12-03
|
2
|
+
|
3
|
+
* 2 bug fixes:
|
4
|
+
|
5
|
+
* Added support for 3.0 parser
|
6
|
+
* Used ParseTreeTestCase#TEST_SUFFIX to make this always work when new versions added.
|
7
|
+
|
8
|
+
=== 1.1.0 / 2019-09-24
|
9
|
+
|
10
|
+
* 4 minor enhancements:
|
11
|
+
|
12
|
+
* Pushed @@array_types and array_type? up to Sexp (in typed_sexp.rb).
|
13
|
+
* Pushed down @@array_types and #array_type? from Sexp to TypedSexp.
|
14
|
+
* Renamed Type to CType
|
15
|
+
* Renamed TypedSexp#sexp_type to c_type to resolve conflict/confusion w/ Sexp.
|
16
|
+
|
17
|
+
* 6 bug fixes:
|
18
|
+
|
19
|
+
* Fixed a test file randomization error (yay!) by requiring typed_sexp in rewriter.
|
20
|
+
* Fixed inspect/pretty_print to include line number for typed sexps, just like sexps.
|
21
|
+
* Fixed new ruby 2.5 warnings.
|
22
|
+
* Fixes for changes to sexp_processor, centered aroud maintaining c_type.
|
23
|
+
* Got working with ruby 2.5 parser.
|
24
|
+
* Removed obsolete attrset test
|
25
|
+
|
1
26
|
=== 1.0.0.9 / 2012-11-09
|
2
27
|
|
3
28
|
* 1 bug fix:
|
@@ -29,12 +54,12 @@
|
|
29
54
|
|
30
55
|
=== 1.0.0.6 / 2009-06-23
|
31
56
|
|
32
|
-
1 major enhancement:
|
57
|
+
* 1 major enhancement:
|
33
58
|
|
34
59
|
* Switched from ParseTree to ruby_parser for 1.9 compatibility. woo.
|
35
60
|
* All translate/process methods are gone since we can't reflect at runtime.
|
36
61
|
|
37
|
-
43 minor enhancements:
|
62
|
+
* 43 minor enhancements:
|
38
63
|
|
39
64
|
* Added IterRewriter for finding free variables in iter nodes.
|
40
65
|
* Added dxstr.
|
@@ -99,104 +124,104 @@
|
|
99
124
|
|
100
125
|
* 6 minor enhancements:
|
101
126
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
127
|
+
* Split RubyToC to RubyToRubyC and RubyToAnsiC.
|
128
|
+
* Extended Environment to be more flexible for various situations.
|
129
|
+
* Removed propaganda (bloat) from release.
|
130
|
+
* Gemified and reorganized things. Support still needs splitting up.
|
131
|
+
* Flipped a lot of internal naming to use Unique.
|
132
|
+
* Added ruby_to_c_show (like parse_tree_show).
|
108
133
|
|
109
|
-
* 4
|
134
|
+
* 4 bug fixes:
|
110
135
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
136
|
+
* Use ivars instead of cvars so inheritance won't bugger the translator.
|
137
|
+
* Corrected unsupported node lists in pipeline.
|
138
|
+
* Fixed bugs for splat args, iters, optional args, method name map.
|
139
|
+
* Fixed many other bugs.
|
115
140
|
|
116
141
|
=== 1.0.0-beta-4 / 2005-07-13
|
117
142
|
|
118
143
|
* 1 minor enhancements:
|
119
144
|
|
120
|
-
|
145
|
+
* Added gemspec (hastily).
|
121
146
|
|
122
147
|
* 2 bug fixes:
|
123
148
|
|
124
|
-
|
125
|
-
|
149
|
+
* Translates bool type to VALUE since we were using Qtrue/Qfalse.
|
150
|
+
* Fixed rubygems for non-gem systems.
|
126
151
|
|
127
152
|
=== 1.0.0-beta-3 / 2005-06-08
|
128
153
|
|
129
154
|
* 16 minor enhancements:
|
130
155
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
156
|
+
* Added ivar and iasgn support. Needs more work.
|
157
|
+
* Added limited support for self.
|
158
|
+
* Added pipeline tests for bools, call_arglist, call_attrasgn, fbody.
|
159
|
+
* Added process_not to RubyToC.
|
160
|
+
* Added support for float and symbol literals.
|
161
|
+
* Added support for gasgn, cvasgn, const (class consts, not classes).
|
162
|
+
* Improved error handling/reporting, esp in RubyToC.
|
163
|
+
* In TypeChecker.boostrap, pre-registered all base classes.
|
164
|
+
* Modified process_class test to include a class const.
|
165
|
+
* Processing :class now adds class constants to the local var scope.
|
166
|
+
* Processing :const checks both genv and env now.
|
167
|
+
* Rearchitected all tests into a pipeline test class.
|
168
|
+
* Rewrite attrasgn into regular calls.
|
169
|
+
* Rewrite fbody into a regular defn.
|
170
|
+
* Rewrote :array inside call to :arglist.
|
171
|
+
* Rewrote :or nodes in process_case to correctly be binary.
|
147
172
|
|
148
173
|
* 1 bug fix:
|
149
174
|
|
150
|
-
|
175
|
+
* Fixed a bug where single line while bodies were missing a semicolon.
|
151
176
|
|
152
177
|
=== 1.0.0-beta-2 / 2005-02-15
|
153
178
|
|
154
179
|
* 1 minor enhancement:
|
155
180
|
|
156
|
-
|
181
|
+
* Added post-condition while/until support and tests.
|
157
182
|
|
158
183
|
* 4 bug fixes:
|
159
184
|
|
160
|
-
|
161
|
-
|
162
|
-
|
185
|
+
* Fixed bug:1422: Escape newlines to prevent multi-line strings in C.
|
186
|
+
* Fixed bug:1429: Arrays of strings are not being properly.
|
187
|
+
* Fixed bug:1447/1448: Readme file's website and added ParseTree dependency.
|
163
188
|
|
164
189
|
=== 1.0.0-beta-1 / 2005-02-01
|
165
190
|
|
166
191
|
* 1 major enhancements:
|
167
192
|
|
168
|
-
|
193
|
+
* Hit 80% non-error conversion threshold for public beta release.
|
169
194
|
|
170
195
|
* 3 minor enhancements:
|
171
196
|
|
172
|
-
|
173
|
-
|
174
|
-
|
197
|
+
* (Mostly) Filled out functionality in Rewriter and TypeChecker.
|
198
|
+
* Flushed out what we don't do in RubyToC.
|
199
|
+
* Wrote a ton of rdoc
|
175
200
|
|
176
201
|
=== 1.0.0-a2 / 2004-12-31
|
177
202
|
|
178
203
|
* 7 major enhancements:
|
179
204
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
205
|
+
* Alpha 2 released to private group for critique.
|
206
|
+
* Refactored and split out ParseTree package.
|
207
|
+
* Gemified dependency on ParseTree.
|
208
|
+
* Added iter rewriting
|
209
|
+
* Added post type inference rewriting specific to C library.
|
210
|
+
* Massive increase to the base we can translate.
|
211
|
+
* We have stabilized the architecture but still have a ways to go.
|
187
212
|
|
188
213
|
* 2 minor enhancements:
|
189
214
|
|
190
|
-
|
191
|
-
|
215
|
+
* Added propaganda (presentations).
|
216
|
+
* Much better test coverage, now with ZenTest compliant naming.
|
192
217
|
|
193
218
|
* 2 bug fixes:
|
194
219
|
|
195
|
-
|
196
|
-
|
220
|
+
* Gem-proofed makefile.
|
221
|
+
* Tons of little fixes we didn't bother to track.
|
197
222
|
|
198
223
|
=== 1.0.0-a1 / 2004-09-24
|
199
224
|
|
200
225
|
* 1 major enhancement:
|
201
226
|
|
202
|
-
|
227
|
+
* Birthday! Alpha 1 released to private group for critique.
|
data/README.txt
CHANGED
data/Rakefile
CHANGED
data/lib/crewriter.rb
CHANGED
@@ -16,10 +16,10 @@ class CRewriter < SexpProcessor
|
|
16
16
|
# generating the appropriate sexp for that rewriting.
|
17
17
|
|
18
18
|
REWRITES = {
|
19
|
-
[
|
20
|
-
t(:call, nil, :strcat, r.unshift(r.shift, l),
|
19
|
+
[CType.str, :+, CType.str] => proc { |l,n,r|
|
20
|
+
t(:call, nil, :strcat, r.unshift(r.shift, l), CType.str)
|
21
21
|
},
|
22
|
-
[
|
22
|
+
[CType.file, :puts, CType.str] => proc { |l,n,r|
|
23
23
|
t(:call, nil, :fputs, r.push(l))
|
24
24
|
},
|
25
25
|
}
|
@@ -35,6 +35,18 @@ class CRewriter < SexpProcessor
|
|
35
35
|
@extra_methods = []
|
36
36
|
end
|
37
37
|
|
38
|
+
# def rewrite exp
|
39
|
+
# result = super
|
40
|
+
# result.c_type ||= exp.c_type if Sexp === exp and exp.c_type
|
41
|
+
# result
|
42
|
+
# end
|
43
|
+
|
44
|
+
def process exp, _src = nil, _timeout = nil
|
45
|
+
result = super(exp)
|
46
|
+
result.c_type ||= exp.c_type if Sexp === exp and exp.c_type
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
38
50
|
def free # REFACTOR: this is a violation of responsibility, should be in Env
|
39
51
|
parent = @env.env[0..-2]
|
40
52
|
bound_in_parent = parent.map { |h| h.keys }.flatten
|
@@ -57,14 +69,14 @@ class CRewriter < SexpProcessor
|
|
57
69
|
name = exp.shift
|
58
70
|
rhs = process exp.shift
|
59
71
|
|
60
|
-
lhs_type = lhs.
|
72
|
+
lhs_type = lhs.c_type rescue nil
|
61
73
|
type_signature = [lhs_type, name]
|
62
|
-
type_signature += rhs[1..-1].map { |sexp| sexp.
|
74
|
+
type_signature += rhs[1..-1].map { |sexp| sexp.c_type }.to_a unless rhs.nil?
|
63
75
|
|
64
76
|
result = if REWRITES.has_key? type_signature then
|
65
77
|
REWRITES[type_signature].call(lhs, name, rhs)
|
66
78
|
else
|
67
|
-
t(:call, lhs, name, rhs, exp.
|
79
|
+
t(:call, lhs, name, rhs, exp.c_type)
|
68
80
|
end
|
69
81
|
|
70
82
|
return result
|
@@ -83,7 +95,7 @@ class CRewriter < SexpProcessor
|
|
83
95
|
@extra_methods.reverse_each do |defx| methods.unshift defx end
|
84
96
|
@extra_methods.clear
|
85
97
|
|
86
|
-
result = t(:class, klassname, superklassname,
|
98
|
+
result = t(:class, klassname, superklassname, CType.zclass)
|
87
99
|
result.push(*methods)
|
88
100
|
|
89
101
|
return result
|
@@ -96,7 +108,7 @@ class CRewriter < SexpProcessor
|
|
96
108
|
iter_method_name = Unique.next
|
97
109
|
|
98
110
|
value_var_name = Unique.next
|
99
|
-
value_var_type =
|
111
|
+
value_var_type = CType.unknown
|
100
112
|
|
101
113
|
memo_var_name = Unique.next
|
102
114
|
|
@@ -111,8 +123,8 @@ class CRewriter < SexpProcessor
|
|
111
123
|
|
112
124
|
var_names = var_names_in vars
|
113
125
|
|
114
|
-
frees = t(:array,
|
115
|
-
statics = t(:array,
|
126
|
+
frees = t(:array, CType.void)
|
127
|
+
statics = t(:array, CType.void)
|
116
128
|
defx_body_block = t(:block)
|
117
129
|
|
118
130
|
# set statics first so block vars can update statics
|
@@ -132,7 +144,7 @@ class CRewriter < SexpProcessor
|
|
132
144
|
var_names.first.last)
|
133
145
|
|
134
146
|
else # expand block args to masgn
|
135
|
-
value_var_type =
|
147
|
+
value_var_type = CType.value
|
136
148
|
dyn_vars = t(:array)
|
137
149
|
|
138
150
|
var_names.each do |name, type|
|
@@ -141,29 +153,29 @@ class CRewriter < SexpProcessor
|
|
141
153
|
|
142
154
|
defx_body_block << t(:masgn,
|
143
155
|
dyn_vars,
|
144
|
-
t(:to_ary, t(:lvar, value_var_name,
|
156
|
+
t(:to_ary, t(:lvar, value_var_name, CType.value)))
|
145
157
|
end
|
146
158
|
|
147
159
|
defx_body_block << body
|
148
160
|
|
149
161
|
free_vars.each do |name, static_name, type|
|
150
162
|
defx_body_block << t(:lasgn, static_name, t(:lvar, name, type), type)
|
151
|
-
@extra_methods << t(:static, "static VALUE #{static_name};",
|
163
|
+
@extra_methods << t(:static, "static VALUE #{static_name};", CType.fucked)
|
152
164
|
end
|
153
165
|
|
154
|
-
defx_body_block << t(:return, t(:nil,
|
166
|
+
defx_body_block << t(:return, t(:nil, CType.value))
|
155
167
|
|
156
168
|
defx = t(:defx,
|
157
169
|
iter_method_name,
|
158
170
|
t(:args,
|
159
171
|
t(value_var_name, value_var_type),
|
160
|
-
t(memo_var_name,
|
172
|
+
t(memo_var_name, CType.value)),
|
161
173
|
t(:scope, defx_body_block),
|
162
|
-
|
174
|
+
CType.void)
|
163
175
|
|
164
176
|
@extra_methods << defx
|
165
177
|
|
166
|
-
args = t(:args, frees, statics,
|
178
|
+
args = t(:args, frees, statics, CType.void)
|
167
179
|
|
168
180
|
return t(:iter, call, args, iter_method_name)
|
169
181
|
end
|
@@ -172,27 +184,27 @@ class CRewriter < SexpProcessor
|
|
172
184
|
name = exp.shift
|
173
185
|
value = process(exp.shift)
|
174
186
|
|
175
|
-
@env.add name, exp.
|
187
|
+
@env.add name, exp.c_type
|
176
188
|
@env.set_val name, true
|
177
189
|
|
178
|
-
return t(:lasgn, name, value, exp.
|
190
|
+
return t(:lasgn, name, value, exp.c_type)
|
179
191
|
end
|
180
192
|
|
181
193
|
def process_lvar(exp)
|
182
194
|
name = exp.shift
|
183
195
|
|
184
|
-
@env.add name,
|
196
|
+
@env.add name, CType.value
|
185
197
|
@env.lookup name rescue @env.set_val name, false
|
186
198
|
|
187
|
-
return t(:lvar, name, exp.
|
199
|
+
return t(:lvar, name, exp.c_type)
|
188
200
|
end
|
189
201
|
|
190
202
|
def var_names_in(exp)
|
191
|
-
return [[exp.last, exp.
|
203
|
+
return [[exp.last, exp.c_type]] if exp.length == 2 and not Sexp === exp.last
|
192
204
|
|
193
205
|
var_names = []
|
194
206
|
exp.each_of_type :dasgn_curr do |sexp|
|
195
|
-
var_names << [sexp.sexp_body.first, sexp.
|
207
|
+
var_names << [sexp.sexp_body.first, sexp.c_type]
|
196
208
|
end
|
197
209
|
return var_names
|
198
210
|
end
|
data/lib/r2cenvironment.rb
CHANGED
@@ -10,8 +10,8 @@ class R2CEnvironment < RubyParserStuff::Environment
|
|
10
10
|
def add(id, type, depth = 0)
|
11
11
|
raise "Adding illegal identifier #{id.inspect}" unless
|
12
12
|
Symbol === id
|
13
|
-
raise ArgumentError, "type must be a valid Type instance" unless
|
14
|
-
|
13
|
+
raise ArgumentError, "type must be a valid Type instance: #{type.inspect}" unless
|
14
|
+
CType === type
|
15
15
|
|
16
16
|
@env[depth][id.to_s.sub(/^\*/, '').intern][TYPE] = type
|
17
17
|
end
|
@@ -31,7 +31,7 @@ class R2CEnvironment < RubyParserStuff::Environment
|
|
31
31
|
|
32
32
|
def lookup(name)
|
33
33
|
# HACK: if name is :self, cheat for now until we have full defn remapping
|
34
|
-
return
|
34
|
+
return CType.fucked if name == :self
|
35
35
|
|
36
36
|
return self._get(name)[TYPE]
|
37
37
|
end
|
data/lib/rewriter.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
|
2
1
|
begin require 'rubygems'; rescue LoadError; end
|
3
2
|
require 'sexp'
|
4
3
|
require 'sexp_processor'
|
5
4
|
require 'unique'
|
6
5
|
|
6
|
+
require 'typed_sexp' # ensure @@array_types is defined
|
7
|
+
|
7
8
|
class Sexp
|
8
9
|
# add arglist because we introduce the new array type in this file
|
9
10
|
@@array_types << :arglist
|
@@ -17,6 +18,10 @@ end
|
|
17
18
|
# what it does.
|
18
19
|
|
19
20
|
class Rewriter < SexpProcessor
|
21
|
+
def process exp, _src = nil, _timeout = nil
|
22
|
+
super(exp)
|
23
|
+
end
|
24
|
+
|
20
25
|
def rewrite_defn(exp)
|
21
26
|
case exp.last[0]
|
22
27
|
when :ivar then
|
@@ -31,4 +36,3 @@ class Rewriter < SexpProcessor
|
|
31
36
|
exp
|
32
37
|
end
|
33
38
|
end
|
34
|
-
|
data/lib/ruby_to_ansi_c.rb
CHANGED
@@ -20,7 +20,7 @@ require 'r2cenvironment'
|
|
20
20
|
|
21
21
|
class RubyToAnsiC < SexpProcessor
|
22
22
|
|
23
|
-
VERSION = '1.
|
23
|
+
VERSION = '1.1.1'
|
24
24
|
|
25
25
|
# TODO: remove me
|
26
26
|
def no(exp) # :nodoc:
|
@@ -133,6 +133,10 @@ typedef char * str;
|
|
133
133
|
@prototypes = []
|
134
134
|
end
|
135
135
|
|
136
|
+
def process exp, _src = nil, _timeout = nil
|
137
|
+
super(exp)
|
138
|
+
end
|
139
|
+
|
136
140
|
##
|
137
141
|
# Logical And. Nothing exciting here
|
138
142
|
|
@@ -160,7 +164,7 @@ typedef char * str;
|
|
160
164
|
until exp.empty? do
|
161
165
|
arg = exp.shift
|
162
166
|
name = arg.first.to_s.sub(/^\*/, '').intern
|
163
|
-
type = arg.
|
167
|
+
type = arg.c_type
|
164
168
|
@env.add name, type
|
165
169
|
args << "#{self.class.c_type(type)} #{name}"
|
166
170
|
end
|
@@ -212,10 +216,6 @@ typedef char * str;
|
|
212
216
|
receiver = exp.shift
|
213
217
|
name = exp.shift
|
214
218
|
|
215
|
-
receiver_type = Type.unknown
|
216
|
-
unless receiver.nil? then
|
217
|
-
receiver_type = receiver.sexp_type
|
218
|
-
end
|
219
219
|
receiver = process receiver
|
220
220
|
|
221
221
|
case name
|
@@ -304,7 +304,7 @@ typedef char * str;
|
|
304
304
|
|
305
305
|
def process_dasgn_curr(exp) # TODO: audit against obfuscator
|
306
306
|
var = exp.shift
|
307
|
-
@env.add var.to_sym, exp.
|
307
|
+
@env.add var.to_sym, exp.c_type
|
308
308
|
return var.to_s
|
309
309
|
end
|
310
310
|
|
@@ -323,7 +323,7 @@ typedef char * str;
|
|
323
323
|
name = name.to_s.sub(/(.*)\?$/, 'is_\1').intern
|
324
324
|
args = process exp.shift
|
325
325
|
body = process exp.shift
|
326
|
-
function_type = exp.
|
326
|
+
function_type = exp.c_type
|
327
327
|
|
328
328
|
ret_type = self.class.c_type function_type.list_type.return_type
|
329
329
|
|
@@ -351,7 +351,7 @@ typedef char * str;
|
|
351
351
|
|
352
352
|
def process_dvar(exp)
|
353
353
|
var = exp.shift
|
354
|
-
@env.add var.to_sym, exp.
|
354
|
+
@env.add var.to_sym, exp.c_type
|
355
355
|
return var.to_s
|
356
356
|
end
|
357
357
|
|
@@ -378,7 +378,7 @@ typedef char * str;
|
|
378
378
|
|
379
379
|
def process_gvar(exp)
|
380
380
|
name = exp.shift
|
381
|
-
type = exp.
|
381
|
+
type = exp.c_type
|
382
382
|
case name
|
383
383
|
when :$stderr then
|
384
384
|
"stderr"
|
@@ -486,21 +486,21 @@ typedef char * str;
|
|
486
486
|
arg_count = value.length - 1 if value.first == :array
|
487
487
|
args = value
|
488
488
|
|
489
|
-
exp_type = exp.
|
489
|
+
exp_type = exp.c_type
|
490
490
|
@env.add var.to_sym, exp_type
|
491
491
|
|
492
492
|
if exp_type.list? then
|
493
493
|
assert_type args, :array
|
494
494
|
|
495
|
-
raise "array must be of one type" unless args.
|
495
|
+
raise "array must be of one type" unless args.c_type == CType.homo
|
496
496
|
|
497
497
|
# HACK: until we figure out properly what to do w/ zarray
|
498
498
|
# before we know what its type is, we will default to long.
|
499
|
-
array_type = args.
|
499
|
+
array_type = args.c_types.empty? ? 'void *' : self.class.c_type(args.c_types.first)
|
500
500
|
|
501
501
|
args.shift # :arglist
|
502
502
|
# TODO: look into alloca
|
503
|
-
out << "#{var} = (#{array_type}) malloc(sizeof(#{array_type}) * #{
|
503
|
+
out << "#{var} = (#{array_type}) malloc(sizeof(#{array_type}) * #{arg_count});\n"
|
504
504
|
args.each_with_index do |o,i|
|
505
505
|
out << "#{var}[#{i}] = #{process o};\n"
|
506
506
|
end
|
@@ -522,11 +522,11 @@ typedef char * str;
|
|
522
522
|
# TODO what about floats and big numbers?
|
523
523
|
|
524
524
|
value = exp.shift
|
525
|
-
|
526
|
-
case
|
527
|
-
when
|
525
|
+
c_type = exp.c_type
|
526
|
+
case c_type
|
527
|
+
when CType.long, CType.float then
|
528
528
|
return value.to_s
|
529
|
-
when
|
529
|
+
when CType.symbol then
|
530
530
|
return value.to_s.inspect # HACK wrong! write test!
|
531
531
|
else
|
532
532
|
raise "Bug! no: Unknown literal #{value}:#{value.class}"
|
data/lib/ruby_to_ruby_c.rb
CHANGED
@@ -181,17 +181,17 @@ class RubyToRubyC < RubyToAnsiC
|
|
181
181
|
arg_count = value.length - 1 if value.first == :array
|
182
182
|
args = value
|
183
183
|
|
184
|
-
exp_type = exp.
|
184
|
+
exp_type = exp.c_type
|
185
185
|
@env.add var.to_sym, exp_type
|
186
186
|
|
187
187
|
if exp_type.list? then
|
188
188
|
assert_type args, :array
|
189
189
|
|
190
|
-
raise "array must be of one type" unless args.
|
190
|
+
raise "array must be of one type" unless args.c_type == CType.homo
|
191
191
|
|
192
192
|
args.shift # :arglist
|
193
193
|
# REFACTOR: this (here down) is the only diff w/ super
|
194
|
-
out << "#{var} = rb_ary_new2(#{
|
194
|
+
out << "#{var} = rb_ary_new2(#{arg_count});\n"
|
195
195
|
args.each_with_index do |o,i|
|
196
196
|
out << "rb_ary_store(#{var}, #{i}, #{process o});\n"
|
197
197
|
end
|
data/lib/type.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'handle'
|
3
3
|
require 'function_type'
|
4
4
|
|
5
|
-
class
|
5
|
+
class CType
|
6
6
|
|
7
7
|
# REFACTOR: nuke this
|
8
8
|
KNOWN_TYPES = {
|
@@ -40,7 +40,7 @@ class Type
|
|
40
40
|
# TODO: gross, maybe go back to the *args version from method_missing
|
41
41
|
return_type = arg_types
|
42
42
|
arg_types = lhs_type
|
43
|
-
lhs_type =
|
43
|
+
lhs_type = CType.unknown
|
44
44
|
end
|
45
45
|
|
46
46
|
self.new FunctionType.new(lhs_type, arg_types, return_type)
|
@@ -52,7 +52,7 @@ class Type
|
|
52
52
|
|
53
53
|
def self.method_missing(type, *args)
|
54
54
|
raise "Unknown type Type.#{type} (#{type.inspect})" unless
|
55
|
-
|
55
|
+
KNOWN_TYPES.has_key?(type)
|
56
56
|
|
57
57
|
if type.to_s =~ /(.*)_list$/ then
|
58
58
|
TYPES[type] = self.new($1.intern, true) unless TYPES.has_key?(type)
|