ffi-yajl 0.0.2-universal-java → 0.0.3-universal-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/Rakefile +20 -4
- data/ext/ffi_yajl/ext/encoder/encoder.c +81 -55
- data/lib/ffi_yajl/ext.rb +4 -4
- data/lib/ffi_yajl/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: daf6de7794be628881f188aedebb67c615815e37
|
4
|
+
data.tar.gz: 6e97fbc2c9949ad9cda706001f91284ac5bb9a71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b54009176b09579945529773a556f0a81830586bcd54c012f6fbf6dd8b6b36bb13587178b1bcf0291e168b5390e2a937b47bcb938d9a783dd672739238c22cf
|
7
|
+
data.tar.gz: d7ea87b526f45207613503615900929be5b2fedb90a3582f3461d3e67e82e78fe9b3880bbb39475eebdddf0303a44c029581ee2235de164e8cbe3c3aba410646
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
## TODO
|
5
5
|
|
6
|
-
-
|
6
|
+
- fix int conversion issue in chef specs in c extension
|
7
7
|
|
8
8
|
## BUILD NOTES
|
9
9
|
|
@@ -13,4 +13,3 @@
|
|
13
13
|
## KNOWN BUGS
|
14
14
|
|
15
15
|
- 'rake compile' broken on mac, only tested to work on linux (ubuntu)
|
16
|
-
- C Extension segfaults on ruby 1.8.7, so the ffi mode is forced for RUBY_VERSION < 1.9
|
data/Rakefile
CHANGED
@@ -9,14 +9,30 @@ end
|
|
9
9
|
|
10
10
|
require 'ffi_yajl/version'
|
11
11
|
|
12
|
-
desc "Run all specs
|
13
|
-
|
14
|
-
|
12
|
+
desc "Run all specs against both extensions"
|
13
|
+
task :spec do
|
14
|
+
Rake::Task["spec:ffi"].invoke
|
15
|
+
Rake::Task["spec:ext"].invoke
|
16
|
+
end
|
17
|
+
|
18
|
+
namespace :spec do
|
19
|
+
desc "Run all specs against ffi extension"
|
20
|
+
RSpec::Core::RakeTask.new(:ffi) do |t|
|
21
|
+
ENV['FORCE_FFI_YAJL'] = "ffi"
|
22
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
23
|
+
end
|
24
|
+
if !defined?(RUBY_ENGINE) || RUBY_ENGINE !~ /jruby/
|
25
|
+
desc "Run all specs again c extension"
|
26
|
+
RSpec::Core::RakeTask.new(:ext) do |t|
|
27
|
+
ENV['FORCE_FFI_YAJL'] = "ext"
|
28
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
29
|
+
end
|
30
|
+
end
|
15
31
|
end
|
16
32
|
|
17
33
|
desc "Build it and ship it"
|
18
34
|
task :ship => [:clean, :gem] do
|
19
|
-
sh("git tag #{
|
35
|
+
sh("git tag #{FFI_Yajl::VERSION}")
|
20
36
|
sh("git push --tags")
|
21
37
|
Dir[File.expand_path("../pkg/*.gem", __FILE__)].reverse.each do |built_gem|
|
22
38
|
sh("gem push #{built_gem}")
|
@@ -2,16 +2,12 @@
|
|
2
2
|
#include <yajl/yajl_gen.h>
|
3
3
|
|
4
4
|
static VALUE mFFI_Yajl, mExt, mEncoder, mEncoder2, cEncodeError;
|
5
|
+
static VALUE cYajl_Gen;
|
5
6
|
|
6
7
|
/* FIXME: the json gem does a whole bunch of indirection around monkeypatching... not sure if we need to as well... */
|
7
8
|
|
8
9
|
#define CHECK_STATUS(call) \
|
9
|
-
if ((status = (call)) != yajl_gen_status_ok) { rb_funcall(mEncoder2, rb_intern("raise_error_for_status"), 1, status); }
|
10
|
-
|
11
|
-
typedef struct {
|
12
|
-
VALUE json_opts;
|
13
|
-
int processing_key;
|
14
|
-
} ffi_state_t;
|
10
|
+
if ((status = (call)) != yajl_gen_status_ok) { rb_funcall(mEncoder2, rb_intern("raise_error_for_status"), 1, INT2FIX(status)); }
|
15
11
|
|
16
12
|
static VALUE mEncoder_do_yajl_encode(VALUE self, VALUE obj, VALUE yajl_gen_opts) {
|
17
13
|
ID sym_ffi_yajl = rb_intern("ffi_yajl");
|
@@ -21,9 +17,10 @@ static VALUE mEncoder_do_yajl_encode(VALUE self, VALUE obj, VALUE yajl_gen_opts)
|
|
21
17
|
yajl_gen yajl_gen;
|
22
18
|
const unsigned char *buf;
|
23
19
|
size_t len;
|
24
|
-
|
20
|
+
VALUE state;
|
25
21
|
VALUE ret;
|
26
22
|
VALUE indent_string;
|
23
|
+
VALUE rb_yajl_gen;
|
27
24
|
|
28
25
|
yajl_gen = yajl_gen_alloc(NULL);
|
29
26
|
|
@@ -41,9 +38,13 @@ static VALUE mEncoder_do_yajl_encode(VALUE self, VALUE obj, VALUE yajl_gen_opts)
|
|
41
38
|
yajl_gen_config(yajl_gen, yajl_gen_indent_string, " ");
|
42
39
|
}
|
43
40
|
|
44
|
-
state
|
41
|
+
state = rb_hash_new();
|
42
|
+
|
43
|
+
rb_hash_aset(state, rb_str_new2("processing_key"), Qfalse);
|
45
44
|
|
46
|
-
|
45
|
+
rb_yajl_gen = Data_Wrap_Struct(cYajl_Gen, NULL, NULL, yajl_gen);
|
46
|
+
|
47
|
+
rb_funcall(obj, sym_ffi_yajl, 2, rb_yajl_gen, state);
|
47
48
|
|
48
49
|
yajl_gen_get_buf(yajl_gen, &buf, &len);
|
49
50
|
|
@@ -54,177 +55,201 @@ static VALUE mEncoder_do_yajl_encode(VALUE self, VALUE obj, VALUE yajl_gen_opts)
|
|
54
55
|
return ret;
|
55
56
|
}
|
56
57
|
|
57
|
-
typedef struct {
|
58
|
-
VALUE yajl_gen;
|
59
|
-
ffi_state_t *state;
|
60
|
-
} ffs_extra_t;
|
61
|
-
|
62
58
|
int rb_cHash_ffi_yajl_callback(VALUE key, VALUE val, VALUE extra) {
|
63
|
-
ffs_extra_t *extra_p = (ffs_extra_t *)extra;
|
64
59
|
ID sym_ffi_yajl = rb_intern("ffi_yajl");
|
60
|
+
VALUE state = rb_hash_aref(extra, rb_str_new2("state"));
|
61
|
+
VALUE rb_yajl_gen = rb_hash_aref(extra, rb_str_new2("yajl_gen"));
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
|
64
|
+
rb_hash_aset(state, rb_str_new2("processing_key"), Qtrue);
|
65
|
+
rb_funcall(key, sym_ffi_yajl, 2, rb_yajl_gen, state);
|
66
|
+
rb_hash_aset(state, rb_str_new2("processing_key"), Qfalse);
|
67
|
+
|
68
|
+
rb_funcall(val, sym_ffi_yajl, 2, rb_yajl_gen, state);
|
70
69
|
|
71
70
|
return 0;
|
72
71
|
}
|
73
72
|
|
74
|
-
static VALUE rb_cHash_ffi_yajl(VALUE self, VALUE
|
73
|
+
static VALUE rb_cHash_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
75
74
|
yajl_gen_status status;
|
76
|
-
|
75
|
+
VALUE extra;
|
76
|
+
struct yajl_gen_t *yajl_gen;
|
77
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
78
|
+
|
79
|
+
extra = rb_hash_new(); /* FIXME: reduce garbage */
|
80
|
+
|
81
|
+
rb_hash_aset(extra, rb_str_new2("yajl_gen"), rb_yajl_gen);
|
77
82
|
|
78
|
-
extra
|
79
|
-
extra.state = (ffi_state_t *)state;
|
83
|
+
rb_hash_aset(extra, rb_str_new2("state"), state);
|
80
84
|
|
81
85
|
CHECK_STATUS(
|
82
|
-
yajl_gen_map_open(
|
86
|
+
yajl_gen_map_open(yajl_gen)
|
83
87
|
);
|
84
|
-
rb_hash_foreach(self, rb_cHash_ffi_yajl_callback,
|
88
|
+
rb_hash_foreach(self, rb_cHash_ffi_yajl_callback, extra);
|
85
89
|
CHECK_STATUS(
|
86
|
-
yajl_gen_map_close(
|
90
|
+
yajl_gen_map_close(yajl_gen)
|
87
91
|
);
|
88
92
|
|
89
93
|
return Qnil;
|
90
94
|
}
|
91
95
|
|
92
|
-
static VALUE rb_cArray_ffi_yajl(VALUE self, VALUE
|
96
|
+
static VALUE rb_cArray_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
93
97
|
yajl_gen_status status;
|
94
98
|
ID sym_ffi_yajl = rb_intern("ffi_yajl");
|
95
99
|
long i;
|
96
100
|
VALUE val;
|
101
|
+
struct yajl_gen_t *yajl_gen;
|
102
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
97
103
|
|
98
104
|
CHECK_STATUS(
|
99
|
-
yajl_gen_array_open(
|
105
|
+
yajl_gen_array_open(yajl_gen)
|
100
106
|
);
|
101
107
|
for(i=0; i<RARRAY_LEN(self); i++) {
|
102
108
|
val = rb_ary_entry(self, i);
|
103
|
-
rb_funcall(val, sym_ffi_yajl, 2,
|
109
|
+
rb_funcall(val, sym_ffi_yajl, 2, rb_yajl_gen, state);
|
104
110
|
}
|
105
111
|
CHECK_STATUS(
|
106
|
-
yajl_gen_array_close(
|
112
|
+
yajl_gen_array_close(yajl_gen)
|
107
113
|
);
|
108
114
|
|
109
115
|
return Qnil;
|
110
116
|
}
|
111
117
|
|
112
|
-
static VALUE rb_cNilClass_ffi_yajl(VALUE self, VALUE
|
118
|
+
static VALUE rb_cNilClass_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
113
119
|
yajl_gen_status status;
|
120
|
+
struct yajl_gen_t *yajl_gen;
|
121
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
114
122
|
CHECK_STATUS(
|
115
|
-
yajl_gen_null(
|
123
|
+
yajl_gen_null(yajl_gen)
|
116
124
|
);
|
117
125
|
return Qnil;
|
118
126
|
}
|
119
127
|
|
120
|
-
static VALUE rb_cTrueClass_ffi_yajl(VALUE self, VALUE
|
128
|
+
static VALUE rb_cTrueClass_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
121
129
|
yajl_gen_status status;
|
130
|
+
struct yajl_gen_t *yajl_gen;
|
131
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
122
132
|
CHECK_STATUS(
|
123
|
-
yajl_gen_bool(
|
133
|
+
yajl_gen_bool(yajl_gen, 1)
|
124
134
|
);
|
125
135
|
return Qnil;
|
126
136
|
}
|
127
137
|
|
128
|
-
static VALUE rb_cFalseClass_ffi_yajl(VALUE self, VALUE
|
138
|
+
static VALUE rb_cFalseClass_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
129
139
|
yajl_gen_status status;
|
140
|
+
struct yajl_gen_t *yajl_gen;
|
141
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
130
142
|
CHECK_STATUS(
|
131
|
-
yajl_gen_bool(
|
143
|
+
yajl_gen_bool(yajl_gen, 0)
|
132
144
|
);
|
133
145
|
return Qnil;
|
134
146
|
}
|
135
147
|
|
136
|
-
static VALUE rb_cFixnum_ffi_yajl(VALUE self, VALUE
|
148
|
+
static VALUE rb_cFixnum_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
137
149
|
yajl_gen_status status;
|
138
150
|
ID sym_to_s = rb_intern("to_s");
|
139
151
|
VALUE str = rb_funcall(self, sym_to_s, 0);
|
140
152
|
char *cptr = RSTRING_PTR(str);
|
141
153
|
int len = RSTRING_LEN(str);
|
154
|
+
struct yajl_gen_t *yajl_gen;
|
155
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
142
156
|
|
143
157
|
if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) {
|
144
158
|
rb_raise(cEncodeError, "'%s' is an invalid number", cptr);
|
145
159
|
}
|
146
|
-
if ( ((
|
160
|
+
if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
|
147
161
|
CHECK_STATUS(
|
148
|
-
yajl_gen_string(
|
162
|
+
yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
|
149
163
|
);
|
150
164
|
} else {
|
151
165
|
CHECK_STATUS(
|
152
|
-
yajl_gen_integer(
|
166
|
+
yajl_gen_integer(yajl_gen, NUM2INT(self))
|
153
167
|
);
|
154
168
|
}
|
155
169
|
return Qnil;
|
156
170
|
}
|
157
171
|
|
158
|
-
static VALUE rb_cBignum_ffi_yajl(VALUE self, VALUE
|
172
|
+
static VALUE rb_cBignum_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
159
173
|
yajl_gen_status status;
|
160
174
|
ID sym_to_s = rb_intern("to_s");
|
161
175
|
VALUE str = rb_funcall(self, sym_to_s, 0);
|
162
176
|
char *cptr = RSTRING_PTR(str);
|
163
177
|
int len = RSTRING_LEN(str);
|
178
|
+
struct yajl_gen_t *yajl_gen;
|
179
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
164
180
|
if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) {
|
165
181
|
rb_raise(cEncodeError, "'%s' is an invalid number", cptr);
|
166
182
|
}
|
167
|
-
if ( ((
|
183
|
+
if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
|
168
184
|
CHECK_STATUS(
|
169
|
-
yajl_gen_string(
|
185
|
+
yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
|
170
186
|
);
|
171
187
|
} else {
|
172
188
|
CHECK_STATUS(
|
173
|
-
yajl_gen_number(
|
189
|
+
yajl_gen_number(yajl_gen, cptr, len)
|
174
190
|
);
|
175
191
|
}
|
176
192
|
return Qnil;
|
177
193
|
}
|
178
194
|
|
179
|
-
static VALUE rb_cFloat_ffi_yajl(VALUE self, VALUE
|
195
|
+
static VALUE rb_cFloat_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
180
196
|
yajl_gen_status status;
|
181
197
|
ID sym_to_s = rb_intern("to_s");
|
182
198
|
VALUE str = rb_funcall(self, sym_to_s, 0);
|
183
199
|
char *cptr = RSTRING_PTR(str);
|
184
200
|
int len = RSTRING_LEN(str);
|
201
|
+
struct yajl_gen_t *yajl_gen;
|
202
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
185
203
|
if (memcmp(cptr, "NaN", 3) == 0 || memcmp(cptr, "Infinity", 8) == 0 || memcmp(cptr, "-Infinity", 9) == 0) {
|
186
204
|
rb_raise(cEncodeError, "'%s' is an invalid number", cptr);
|
187
205
|
}
|
188
|
-
if ( ((
|
206
|
+
if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) {
|
189
207
|
CHECK_STATUS(
|
190
|
-
yajl_gen_string(
|
208
|
+
yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
|
191
209
|
);
|
192
210
|
} else {
|
193
211
|
CHECK_STATUS(
|
194
|
-
yajl_gen_number(
|
212
|
+
yajl_gen_number(yajl_gen, cptr, len)
|
195
213
|
);
|
196
214
|
}
|
197
215
|
return Qnil;
|
198
216
|
}
|
199
217
|
|
200
|
-
static VALUE rb_cString_ffi_yajl(VALUE self, VALUE
|
218
|
+
static VALUE rb_cString_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
201
219
|
yajl_gen_status status;
|
220
|
+
struct yajl_gen_t *yajl_gen;
|
221
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
202
222
|
CHECK_STATUS(
|
203
|
-
yajl_gen_string(
|
223
|
+
yajl_gen_string(yajl_gen, (unsigned char *)RSTRING_PTR(self), RSTRING_LEN(self))
|
204
224
|
);
|
205
225
|
return Qnil;
|
206
226
|
}
|
207
227
|
|
208
|
-
static VALUE rb_cSymbol_ffi_yajl(VALUE self, VALUE
|
228
|
+
static VALUE rb_cSymbol_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
209
229
|
yajl_gen_status status;
|
210
230
|
ID sym_to_s = rb_intern("to_s");
|
211
231
|
VALUE str = rb_funcall(self, sym_to_s, 0);
|
212
232
|
char *cptr = RSTRING_PTR(str);
|
213
233
|
int len = RSTRING_LEN(str);
|
234
|
+
struct yajl_gen_t *yajl_gen;
|
235
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
214
236
|
CHECK_STATUS(
|
215
|
-
yajl_gen_string(
|
237
|
+
yajl_gen_string(yajl_gen, (unsigned char *)cptr, len)
|
216
238
|
);
|
217
239
|
return Qnil;
|
218
240
|
}
|
219
241
|
|
220
|
-
static VALUE rb_cObject_ffi_yajl(VALUE self, VALUE
|
242
|
+
static VALUE rb_cObject_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
|
221
243
|
yajl_gen_status status;
|
222
244
|
ID sym_to_json = rb_intern("to_json");
|
223
245
|
VALUE str;
|
246
|
+
VALUE json_opts = rb_hash_aref(state, rb_str_new2("json_opts"));
|
247
|
+
struct yajl_gen_t *yajl_gen;
|
248
|
+
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
|
224
249
|
|
225
|
-
str = rb_funcall(self, sym_to_json, 1,
|
250
|
+
str = rb_funcall(self, sym_to_json, 1, json_opts);
|
226
251
|
CHECK_STATUS(
|
227
|
-
yajl_gen_number(
|
252
|
+
yajl_gen_number(yajl_gen, (char *)RSTRING_PTR(str), RSTRING_LEN(str))
|
228
253
|
);
|
229
254
|
return Qnil;
|
230
255
|
}
|
@@ -235,6 +260,7 @@ void Init_encoder() {
|
|
235
260
|
cEncodeError = rb_define_class_under(mFFI_Yajl, "EncodeError", rb_eStandardError);
|
236
261
|
mExt = rb_define_module_under(mFFI_Yajl, "Ext");
|
237
262
|
mEncoder = rb_define_module_under(mExt, "Encoder");
|
263
|
+
cYajl_Gen = rb_define_class_under(mEncoder, "YajlGen", rb_cObject);
|
238
264
|
rb_define_method(mEncoder, "do_yajl_encode", mEncoder_do_yajl_encode, 2);
|
239
265
|
|
240
266
|
rb_define_method(rb_cHash, "ffi_yajl", rb_cHash_ffi_yajl, 2);
|
data/lib/ffi_yajl/ext.rb
CHANGED
@@ -3,10 +3,10 @@ require 'rubygems'
|
|
3
3
|
require 'ffi_yajl/encoder'
|
4
4
|
require 'ffi_yajl/parser'
|
5
5
|
|
6
|
-
unless RUBY_VERSION.to_f >= 1.9
|
7
|
-
# segfaults on ruby 1.8 and this is an exceedingly low priority to fix, use ffi instead
|
8
|
-
raise NotImplementedError, "The C-extension is disabled on Ruby 1.8"
|
9
|
-
end
|
6
|
+
#unless RUBY_VERSION.to_f >= 1.9
|
7
|
+
# # segfaults on ruby 1.8 and this is an exceedingly low priority to fix, use ffi instead
|
8
|
+
# raise NotImplementedError, "The C-extension is disabled on Ruby 1.8"
|
9
|
+
#end
|
10
10
|
|
11
11
|
module FFI_Yajl
|
12
12
|
class Parser
|
data/lib/ffi_yajl/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-yajl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: universal-java
|
6
6
|
authors:
|
7
7
|
- Lamont Granquist
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|