ruby2c 1.0.0.9 → 1.1.0
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +1 -1
- data/History.txt +71 -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 +2 -2
- data/lib/ruby_to_ansi_c.rb +14 -18
- data/lib/ruby_to_ruby_c.rb +3 -3
- data/lib/type.rb +3 -3
- data/lib/type_checker.rb +97 -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
- metadata +97 -150
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f6ae2f91c8e5c83ab77b02d6e779b83aa749f4fe8799c1f875859844c2d0f7a6
|
4
|
+
data.tar.gz: 145da4a50b73b15433695d7c1917412eb2da27ad8c954fc9c651ee71511a61e6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: af6b9e49cf2b1eb2cf456fde6faa184a2dca2fc0ed61232206aeea83cb8a2b2512aa30164b0dba5ea58005cb16c68516ec695b3b00fd950f695607147b1df0d5
|
7
|
+
data.tar.gz: ad870dab2e1d50291e9855a53fae299c20733c11871d5de3f38da1341b82ed7e64dfd76d0d1d5e9c0fa700f2e52fdf87cb853e219f4f80d3ed20d51487b18e3e
|
checksums.yaml.gz.sig
ADDED
data.tar.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
lܮv��`����͉��G�I!������@8s�y_��a��@EOu` �������=x�_!⏆�� ��7�!r{�M�
|
data/History.txt
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== 1.1.0 / 2019-09-24
|
2
|
+
|
3
|
+
* 4 minor enhancements:
|
4
|
+
|
5
|
+
* Pushed @@array_types and array_type? up to Sexp (in typed_sexp.rb).
|
6
|
+
* Pushed down @@array_types and #array_type? from Sexp to TypedSexp.
|
7
|
+
* Renamed Type to CType
|
8
|
+
* Renamed TypedSexp#sexp_type to c_type to resolve conflict/confusion w/ Sexp.
|
9
|
+
|
10
|
+
* 6 bug fixes:
|
11
|
+
|
12
|
+
* Fixed a test file randomization error (yay!) by requiring typed_sexp in rewriter.
|
13
|
+
* Fixed inspect/pretty_print to include line number for typed sexps, just like sexps.
|
14
|
+
* Fixed new ruby 2.5 warnings.
|
15
|
+
* Fixes for changes to sexp_processor, centered aroud maintaining c_type.
|
16
|
+
* Got working with ruby 2.5 parser.
|
17
|
+
* Removed obsolete attrset test
|
18
|
+
|
1
19
|
=== 1.0.0.9 / 2012-11-09
|
2
20
|
|
3
21
|
* 1 bug fix:
|
@@ -29,12 +47,12 @@
|
|
29
47
|
|
30
48
|
=== 1.0.0.6 / 2009-06-23
|
31
49
|
|
32
|
-
1 major enhancement:
|
50
|
+
* 1 major enhancement:
|
33
51
|
|
34
52
|
* Switched from ParseTree to ruby_parser for 1.9 compatibility. woo.
|
35
53
|
* All translate/process methods are gone since we can't reflect at runtime.
|
36
54
|
|
37
|
-
43 minor enhancements:
|
55
|
+
* 43 minor enhancements:
|
38
56
|
|
39
57
|
* Added IterRewriter for finding free variables in iter nodes.
|
40
58
|
* Added dxstr.
|
@@ -99,104 +117,104 @@
|
|
99
117
|
|
100
118
|
* 6 minor enhancements:
|
101
119
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
120
|
+
* Split RubyToC to RubyToRubyC and RubyToAnsiC.
|
121
|
+
* Extended Environment to be more flexible for various situations.
|
122
|
+
* Removed propaganda (bloat) from release.
|
123
|
+
* Gemified and reorganized things. Support still needs splitting up.
|
124
|
+
* Flipped a lot of internal naming to use Unique.
|
125
|
+
* Added ruby_to_c_show (like parse_tree_show).
|
108
126
|
|
109
|
-
* 4
|
127
|
+
* 4 bug fixes:
|
110
128
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
129
|
+
* Use ivars instead of cvars so inheritance won't bugger the translator.
|
130
|
+
* Corrected unsupported node lists in pipeline.
|
131
|
+
* Fixed bugs for splat args, iters, optional args, method name map.
|
132
|
+
* Fixed many other bugs.
|
115
133
|
|
116
134
|
=== 1.0.0-beta-4 / 2005-07-13
|
117
135
|
|
118
136
|
* 1 minor enhancements:
|
119
137
|
|
120
|
-
|
138
|
+
* Added gemspec (hastily).
|
121
139
|
|
122
140
|
* 2 bug fixes:
|
123
141
|
|
124
|
-
|
125
|
-
|
142
|
+
* Translates bool type to VALUE since we were using Qtrue/Qfalse.
|
143
|
+
* Fixed rubygems for non-gem systems.
|
126
144
|
|
127
145
|
=== 1.0.0-beta-3 / 2005-06-08
|
128
146
|
|
129
147
|
* 16 minor enhancements:
|
130
148
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
149
|
+
* Added ivar and iasgn support. Needs more work.
|
150
|
+
* Added limited support for self.
|
151
|
+
* Added pipeline tests for bools, call_arglist, call_attrasgn, fbody.
|
152
|
+
* Added process_not to RubyToC.
|
153
|
+
* Added support for float and symbol literals.
|
154
|
+
* Added support for gasgn, cvasgn, const (class consts, not classes).
|
155
|
+
* Improved error handling/reporting, esp in RubyToC.
|
156
|
+
* In TypeChecker.boostrap, pre-registered all base classes.
|
157
|
+
* Modified process_class test to include a class const.
|
158
|
+
* Processing :class now adds class constants to the local var scope.
|
159
|
+
* Processing :const checks both genv and env now.
|
160
|
+
* Rearchitected all tests into a pipeline test class.
|
161
|
+
* Rewrite attrasgn into regular calls.
|
162
|
+
* Rewrite fbody into a regular defn.
|
163
|
+
* Rewrote :array inside call to :arglist.
|
164
|
+
* Rewrote :or nodes in process_case to correctly be binary.
|
147
165
|
|
148
166
|
* 1 bug fix:
|
149
167
|
|
150
|
-
|
168
|
+
* Fixed a bug where single line while bodies were missing a semicolon.
|
151
169
|
|
152
170
|
=== 1.0.0-beta-2 / 2005-02-15
|
153
171
|
|
154
172
|
* 1 minor enhancement:
|
155
173
|
|
156
|
-
|
174
|
+
* Added post-condition while/until support and tests.
|
157
175
|
|
158
176
|
* 4 bug fixes:
|
159
177
|
|
160
|
-
|
161
|
-
|
162
|
-
|
178
|
+
* Fixed bug:1422: Escape newlines to prevent multi-line strings in C.
|
179
|
+
* Fixed bug:1429: Arrays of strings are not being properly.
|
180
|
+
* Fixed bug:1447/1448: Readme file's website and added ParseTree dependency.
|
163
181
|
|
164
182
|
=== 1.0.0-beta-1 / 2005-02-01
|
165
183
|
|
166
184
|
* 1 major enhancements:
|
167
185
|
|
168
|
-
|
186
|
+
* Hit 80% non-error conversion threshold for public beta release.
|
169
187
|
|
170
188
|
* 3 minor enhancements:
|
171
189
|
|
172
|
-
|
173
|
-
|
174
|
-
|
190
|
+
* (Mostly) Filled out functionality in Rewriter and TypeChecker.
|
191
|
+
* Flushed out what we don't do in RubyToC.
|
192
|
+
* Wrote a ton of rdoc
|
175
193
|
|
176
194
|
=== 1.0.0-a2 / 2004-12-31
|
177
195
|
|
178
196
|
* 7 major enhancements:
|
179
197
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
198
|
+
* Alpha 2 released to private group for critique.
|
199
|
+
* Refactored and split out ParseTree package.
|
200
|
+
* Gemified dependency on ParseTree.
|
201
|
+
* Added iter rewriting
|
202
|
+
* Added post type inference rewriting specific to C library.
|
203
|
+
* Massive increase to the base we can translate.
|
204
|
+
* We have stabilized the architecture but still have a ways to go.
|
187
205
|
|
188
206
|
* 2 minor enhancements:
|
189
207
|
|
190
|
-
|
191
|
-
|
208
|
+
* Added propaganda (presentations).
|
209
|
+
* Much better test coverage, now with ZenTest compliant naming.
|
192
210
|
|
193
211
|
* 2 bug fixes:
|
194
212
|
|
195
|
-
|
196
|
-
|
213
|
+
* Gem-proofed makefile.
|
214
|
+
* Tons of little fixes we didn't bother to track.
|
197
215
|
|
198
216
|
=== 1.0.0-a1 / 2004-09-24
|
199
217
|
|
200
218
|
* 1 major enhancement:
|
201
219
|
|
202
|
-
|
220
|
+
* 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
|
45
|
+
result = super
|
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
|
@@ -31,4 +32,3 @@ class Rewriter < SexpProcessor
|
|
31
32
|
exp
|
32
33
|
end
|
33
34
|
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.0'
|
24
24
|
|
25
25
|
# TODO: remove me
|
26
26
|
def no(exp) # :nodoc:
|
@@ -160,7 +160,7 @@ typedef char * str;
|
|
160
160
|
until exp.empty? do
|
161
161
|
arg = exp.shift
|
162
162
|
name = arg.first.to_s.sub(/^\*/, '').intern
|
163
|
-
type = arg.
|
163
|
+
type = arg.c_type
|
164
164
|
@env.add name, type
|
165
165
|
args << "#{self.class.c_type(type)} #{name}"
|
166
166
|
end
|
@@ -212,10 +212,6 @@ typedef char * str;
|
|
212
212
|
receiver = exp.shift
|
213
213
|
name = exp.shift
|
214
214
|
|
215
|
-
receiver_type = Type.unknown
|
216
|
-
unless receiver.nil? then
|
217
|
-
receiver_type = receiver.sexp_type
|
218
|
-
end
|
219
215
|
receiver = process receiver
|
220
216
|
|
221
217
|
case name
|
@@ -304,7 +300,7 @@ typedef char * str;
|
|
304
300
|
|
305
301
|
def process_dasgn_curr(exp) # TODO: audit against obfuscator
|
306
302
|
var = exp.shift
|
307
|
-
@env.add var.to_sym, exp.
|
303
|
+
@env.add var.to_sym, exp.c_type
|
308
304
|
return var.to_s
|
309
305
|
end
|
310
306
|
|
@@ -323,7 +319,7 @@ typedef char * str;
|
|
323
319
|
name = name.to_s.sub(/(.*)\?$/, 'is_\1').intern
|
324
320
|
args = process exp.shift
|
325
321
|
body = process exp.shift
|
326
|
-
function_type = exp.
|
322
|
+
function_type = exp.c_type
|
327
323
|
|
328
324
|
ret_type = self.class.c_type function_type.list_type.return_type
|
329
325
|
|
@@ -351,7 +347,7 @@ typedef char * str;
|
|
351
347
|
|
352
348
|
def process_dvar(exp)
|
353
349
|
var = exp.shift
|
354
|
-
@env.add var.to_sym, exp.
|
350
|
+
@env.add var.to_sym, exp.c_type
|
355
351
|
return var.to_s
|
356
352
|
end
|
357
353
|
|
@@ -378,7 +374,7 @@ typedef char * str;
|
|
378
374
|
|
379
375
|
def process_gvar(exp)
|
380
376
|
name = exp.shift
|
381
|
-
type = exp.
|
377
|
+
type = exp.c_type
|
382
378
|
case name
|
383
379
|
when :$stderr then
|
384
380
|
"stderr"
|
@@ -486,21 +482,21 @@ typedef char * str;
|
|
486
482
|
arg_count = value.length - 1 if value.first == :array
|
487
483
|
args = value
|
488
484
|
|
489
|
-
exp_type = exp.
|
485
|
+
exp_type = exp.c_type
|
490
486
|
@env.add var.to_sym, exp_type
|
491
487
|
|
492
488
|
if exp_type.list? then
|
493
489
|
assert_type args, :array
|
494
490
|
|
495
|
-
raise "array must be of one type" unless args.
|
491
|
+
raise "array must be of one type" unless args.c_type == CType.homo
|
496
492
|
|
497
493
|
# HACK: until we figure out properly what to do w/ zarray
|
498
494
|
# before we know what its type is, we will default to long.
|
499
|
-
array_type = args.
|
495
|
+
array_type = args.c_types.empty? ? 'void *' : self.class.c_type(args.c_types.first)
|
500
496
|
|
501
497
|
args.shift # :arglist
|
502
498
|
# TODO: look into alloca
|
503
|
-
out << "#{var} = (#{array_type}) malloc(sizeof(#{array_type}) * #{
|
499
|
+
out << "#{var} = (#{array_type}) malloc(sizeof(#{array_type}) * #{arg_count});\n"
|
504
500
|
args.each_with_index do |o,i|
|
505
501
|
out << "#{var}[#{i}] = #{process o};\n"
|
506
502
|
end
|
@@ -522,11 +518,11 @@ typedef char * str;
|
|
522
518
|
# TODO what about floats and big numbers?
|
523
519
|
|
524
520
|
value = exp.shift
|
525
|
-
|
526
|
-
case
|
527
|
-
when
|
521
|
+
c_type = exp.c_type
|
522
|
+
case c_type
|
523
|
+
when CType.long, CType.float then
|
528
524
|
return value.to_s
|
529
|
-
when
|
525
|
+
when CType.symbol then
|
530
526
|
return value.to_s.inspect # HACK wrong! write test!
|
531
527
|
else
|
532
528
|
raise "Bug! no: Unknown literal #{value}:#{value.class}"
|