ffi-yajl 0.0.2-universal-java → 0.0.3-universal-java
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 +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
|