yajl-ruby 0.7.8 → 0.7.9
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of yajl-ruby might be problematic. Click here for more details.
- data/.gitignore +2 -1
- data/.rspec +2 -0
- data/CHANGELOG.md +12 -2
- data/Gemfile +7 -0
- data/Gemfile.lock +28 -0
- data/MIT-LICENSE +1 -1
- data/Rakefile +5 -37
- data/VERSION.yml +2 -2
- data/benchmark/encode.rb +2 -1
- data/benchmark/encode_json_and_marshal.rb +2 -1
- data/benchmark/encode_json_and_yaml.rb +2 -1
- data/benchmark/http.rb +1 -0
- data/benchmark/parse.rb +2 -1
- data/benchmark/parse_json_and_marshal.rb +2 -1
- data/benchmark/parse_json_and_yaml.rb +2 -1
- data/benchmark/parse_stream.rb +2 -1
- data/examples/encoding/chunked_encoding.rb +1 -0
- data/examples/encoding/one_shot.rb +1 -0
- data/examples/encoding/to_an_io.rb +1 -0
- data/examples/http/twitter_search_api.rb +1 -0
- data/examples/http/twitter_stream_api.rb +1 -0
- data/examples/parsing/from_file.rb +1 -0
- data/examples/parsing/from_stdin.rb +1 -0
- data/examples/parsing/from_string.rb +1 -0
- data/ext/{api → yajl/api}/yajl_common.h +5 -1
- data/ext/{api → yajl/api}/yajl_gen.h +1 -1
- data/ext/{api → yajl/api}/yajl_parse.h +3 -3
- data/ext/yajl/api/yajl_version.h +23 -0
- data/ext/yajl/extconf.rb +8 -0
- data/ext/{yajl.c → yajl/yajl.c} +0 -0
- data/ext/{yajl_alloc.c → yajl/yajl_alloc.c} +0 -0
- data/ext/{yajl_alloc.h → yajl/yajl_alloc.h} +0 -0
- data/ext/{yajl_buf.c → yajl/yajl_buf.c} +0 -0
- data/ext/{yajl_buf.h → yajl/yajl_buf.h} +0 -0
- data/ext/{yajl_bytestack.h → yajl/yajl_bytestack.h} +0 -0
- data/ext/{yajl_encode.c → yajl/yajl_encode.c} +0 -0
- data/ext/{yajl_encode.h → yajl/yajl_encode.h} +0 -0
- data/ext/{yajl_ext.c → yajl/yajl_ext.c} +27 -13
- data/ext/{yajl_ext.h → yajl/yajl_ext.h} +2 -1
- data/ext/{yajl_gen.c → yajl/yajl_gen.c} +2 -2
- data/ext/{yajl_lex.c → yajl/yajl_lex.c} +4 -3
- data/ext/{yajl_lex.h → yajl/yajl_lex.h} +0 -0
- data/ext/{yajl_parser.c → yajl/yajl_parser.c} +0 -0
- data/ext/{yajl_parser.h → yajl/yajl_parser.h} +0 -0
- data/ext/yajl/yajl_version.c +7 -0
- data/lib/yajl.rb +2 -17
- data/spec/parsing/chunked_spec.rb +0 -1
- data/spec/spec_helper.rb +2 -1
- data/tasks/compile.rake +37 -0
- data/tasks/jeweler.rake +17 -0
- data/tasks/rspec.rake +16 -0
- data/yajl-ruby.gemspec +183 -171
- metadata +90 -41
- data/ext/extconf.rb +0 -9
- data/spec/spec.opts +0 -2
data/.gitignore
CHANGED
data/.rspec
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.7.9 (January 11th, 2011)
|
4
|
+
* moved to rspec2
|
5
|
+
* fixed some compilation warnings on 1.9.3
|
6
|
+
* brought over latest from Yajl upstream
|
7
|
+
* finally removed the deprecated Yajl::Stream methods
|
8
|
+
* moved to rake-compiler
|
9
|
+
* moved to Bundler for development
|
10
|
+
* fix memory corruption bug when using :pretty => true and a custom indent string
|
11
|
+
* fixed memory leak when exceptions were being raised during a parse
|
12
|
+
|
3
13
|
## 0.7.8 (September 27th, 2010)
|
4
|
-
* bugfix due to improper usage of rb_define_method
|
5
|
-
* bugfix to make sure json gem compability API doesn't break ActiveSupport#to_json
|
6
14
|
* fix a bug in chunked http response regex (thanks to http://github.com/kevn for catching this)
|
15
|
+
* Make sure json compability doesn't break ActiveSupport#to_json
|
16
|
+
* fix improper usage of rb_define_method
|
7
17
|
|
8
18
|
## 0.7.7 (July 12th, 2010)
|
9
19
|
* full string encoding support for 1.9, respecting Encoding.default_internal
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.2)
|
5
|
+
git (1.2.5)
|
6
|
+
jeweler (1.5.2)
|
7
|
+
bundler (~> 1.0.0)
|
8
|
+
git (>= 1.2.5)
|
9
|
+
rake
|
10
|
+
rake (0.8.7)
|
11
|
+
rake-compiler (0.7.5)
|
12
|
+
rake
|
13
|
+
rspec (2.3.0)
|
14
|
+
rspec-core (~> 2.3.0)
|
15
|
+
rspec-expectations (~> 2.3.0)
|
16
|
+
rspec-mocks (~> 2.3.0)
|
17
|
+
rspec-core (2.3.1)
|
18
|
+
rspec-expectations (2.3.0)
|
19
|
+
diff-lcs (~> 1.1.2)
|
20
|
+
rspec-mocks (2.3.0)
|
21
|
+
|
22
|
+
PLATFORMS
|
23
|
+
ruby
|
24
|
+
|
25
|
+
DEPENDENCIES
|
26
|
+
jeweler
|
27
|
+
rake-compiler (>= 0.7.5)
|
28
|
+
rspec
|
data/MIT-LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2008-
|
1
|
+
Copyright (c) 2008-2011 Brian Lopez - http://github.com/brianmario
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -1,40 +1,8 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
|
3
|
-
|
4
|
-
Jeweler::Tasks.new do |gem|
|
5
|
-
gem.name = "yajl-ruby"
|
6
|
-
gem.summary = "Ruby C bindings to the excellent Yajl JSON stream-based parser library."
|
7
|
-
gem.email = "seniorlopez@gmail.com"
|
8
|
-
gem.homepage = "http://github.com/brianmario/yajl-ruby"
|
9
|
-
gem.authors = ["Brian Lopez", "Lloyd Hilaiel"]
|
10
|
-
gem.require_paths = ["lib", "ext"]
|
11
|
-
gem.extra_rdoc_files = `git ls-files *.rdoc`.split("\n") << 'ext/yajl.c'
|
12
|
-
gem.files = `git ls-files`.split("\n")
|
13
|
-
gem.extensions = ["ext/extconf.rb"]
|
14
|
-
gem.files.include %w(lib/jeweler/templates/.document lib/jeweler/templates/.gitignore)
|
15
|
-
gem.rubyforge_project = "yajl-ruby"
|
16
|
-
end
|
17
|
-
rescue LoadError
|
18
|
-
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler -s http://gems.github.com"
|
19
|
-
end
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup
|
20
4
|
|
21
|
-
|
22
|
-
require 'rake'
|
23
|
-
require 'spec/rake/spectask'
|
5
|
+
require 'rake'
|
24
6
|
|
25
|
-
|
26
|
-
|
27
|
-
t.spec_files = FileList['spec/']
|
28
|
-
t.rcov = true
|
29
|
-
t.rcov_opts = lambda do
|
30
|
-
IO.readlines("spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
31
|
-
end
|
32
|
-
end
|
33
|
-
Spec::Rake::SpecTask.new('spec') do |t|
|
34
|
-
t.spec_files = FileList['spec/']
|
35
|
-
t.libs << 'ext'
|
36
|
-
t.spec_opts << '--options' << 'spec/spec.opts'
|
37
|
-
end
|
38
|
-
rescue LoadError
|
39
|
-
puts "RSpec, or one of its dependencies, is not available. Install it with: sudo gem install rspec"
|
40
|
-
end
|
7
|
+
# Load custom tasks
|
8
|
+
Dir['tasks/*.rake'].sort.each { |f| load f }
|
data/VERSION.yml
CHANGED
data/benchmark/encode.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
require 'stringio'
|
8
9
|
begin
|
9
10
|
require 'json'
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
require 'stringio'
|
8
9
|
begin
|
9
10
|
require 'json'
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
begin
|
8
9
|
require 'json'
|
9
10
|
rescue LoadError
|
data/benchmark/http.rb
CHANGED
data/benchmark/parse.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
begin
|
8
9
|
require 'json'
|
9
10
|
rescue LoadError
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
begin
|
8
9
|
require 'json'
|
9
10
|
rescue LoadError
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
begin
|
8
9
|
require 'json'
|
9
10
|
rescue LoadError
|
data/benchmark/parse_stream.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/..')
|
3
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
4
|
|
4
5
|
require 'rubygems'
|
5
6
|
require 'benchmark'
|
6
|
-
require '
|
7
|
+
require 'yajl'
|
7
8
|
begin
|
8
9
|
require 'json'
|
9
10
|
rescue LoadError
|
@@ -49,7 +49,11 @@ extern "C" {
|
|
49
49
|
# define YAJL_API __declspec(dllimport)
|
50
50
|
# endif
|
51
51
|
#else
|
52
|
-
#
|
52
|
+
# if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
|
53
|
+
# define YAJL_API __attribute__ ((visibility("default")))
|
54
|
+
# else
|
55
|
+
# define YAJL_API
|
56
|
+
# endif
|
53
57
|
#endif
|
54
58
|
|
55
59
|
/** pointer to a malloc function, supporting client overriding memory
|
@@ -134,7 +134,7 @@ extern "C" {
|
|
134
134
|
const unsigned char * str,
|
135
135
|
unsigned int len);
|
136
136
|
YAJL_API yajl_gen_status yajl_gen_null(yajl_gen hand);
|
137
|
-
YAJL_API yajl_gen_status yajl_gen_bool(yajl_gen hand, int boolean);
|
137
|
+
YAJL_API yajl_gen_status yajl_gen_bool(yajl_gen hand, int boolean);
|
138
138
|
YAJL_API yajl_gen_status yajl_gen_map_open(yajl_gen hand);
|
139
139
|
YAJL_API yajl_gen_status yajl_gen_map_close(yajl_gen hand);
|
140
140
|
YAJL_API yajl_gen_status yajl_gen_array_open(yajl_gen hand);
|
@@ -131,12 +131,12 @@ extern "C" {
|
|
131
131
|
const yajl_parser_config * config,
|
132
132
|
const yajl_alloc_funcs * allocFuncs,
|
133
133
|
void * ctx);
|
134
|
-
|
134
|
+
|
135
135
|
/** allow resetting of the lexer without the need to realloc a new parser */
|
136
136
|
void yajl_reset_parser(yajl_handle hand);
|
137
137
|
|
138
|
-
/** free a parser handle */
|
139
|
-
void
|
138
|
+
/** free a parser handle */
|
139
|
+
YAJL_API void yajl_free(yajl_handle handle);
|
140
140
|
|
141
141
|
/** Parse some json!
|
142
142
|
* \param hand - a handle to the json parser allocated with yajl_alloc
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#ifndef YAJL_VERSION_H_
|
2
|
+
#define YAJL_VERSION_H_
|
3
|
+
|
4
|
+
#include "api/yajl_common.h"
|
5
|
+
|
6
|
+
#define YAJL_MAJOR 1
|
7
|
+
#define YAJL_MINOR 0
|
8
|
+
#define YAJL_MICRO 11
|
9
|
+
|
10
|
+
#define YAJL_VERSION ((YAJL_MAJOR * 10000) + (YAJL_MINOR * 100) + YAJL_MICRO)
|
11
|
+
|
12
|
+
#ifdef __cplusplus
|
13
|
+
extern "C" {
|
14
|
+
#endif
|
15
|
+
|
16
|
+
extern int YAJL_API yajl_version(void);
|
17
|
+
|
18
|
+
#ifdef __cplusplus
|
19
|
+
}
|
20
|
+
#endif
|
21
|
+
|
22
|
+
#endif /* YAJL_VERSION_H_ */
|
23
|
+
|
data/ext/yajl/extconf.rb
ADDED
data/ext/{yajl.c → yajl/yajl.c}
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (c) 2008-
|
2
|
+
* Copyright (c) 2008-2011 Brian Lopez - http://github.com/brianmario
|
3
3
|
*
|
4
4
|
* Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
* a copy of this software and associated documentation files (the
|
@@ -24,9 +24,9 @@
|
|
24
24
|
#include "yajl_ext.h"
|
25
25
|
|
26
26
|
#define YAJL_RB_TO_JSON \
|
27
|
-
VALUE rb_encoder;
|
27
|
+
VALUE rb_encoder, cls; \
|
28
28
|
rb_scan_args(argc, argv, "01", &rb_encoder); \
|
29
|
-
|
29
|
+
cls = rb_obj_class(rb_encoder); \
|
30
30
|
if (rb_encoder == Qnil || cls != cEncoder) { \
|
31
31
|
rb_encoder = rb_yajl_encoder_new(0, NULL, cEncoder); \
|
32
32
|
} \
|
@@ -95,6 +95,9 @@ inline void yajl_set_static_value(void * ctx, VALUE val) {
|
|
95
95
|
static void yajl_encoder_wrapper_free(void * wrapper) {
|
96
96
|
yajl_encoder_wrapper * w = wrapper;
|
97
97
|
if (w) {
|
98
|
+
if (w->indentString) {
|
99
|
+
free(w->indentString);
|
100
|
+
}
|
98
101
|
yajl_gen_free(w->encoder);
|
99
102
|
free(w);
|
100
103
|
}
|
@@ -116,6 +119,7 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
|
|
116
119
|
const unsigned char * buffer;
|
117
120
|
const char * cptr;
|
118
121
|
unsigned int len;
|
122
|
+
VALUE keys, entry, keyStr;
|
119
123
|
|
120
124
|
if (io != Qnil || w->on_progress_callback != Qnil) {
|
121
125
|
status = yajl_gen_get_buf(w->encoder, &buffer, &len);
|
@@ -135,8 +139,7 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
|
|
135
139
|
status = yajl_gen_map_open(w->encoder);
|
136
140
|
|
137
141
|
/* TODO: itterate through keys in the hash */
|
138
|
-
|
139
|
-
VALUE entry, keyStr;
|
142
|
+
keys = rb_funcall(obj, intern_keys, 0);
|
140
143
|
for(idx=0; idx<RARRAY_LEN(keys); idx++) {
|
141
144
|
entry = rb_ary_entry(keys, idx);
|
142
145
|
keyStr = rb_funcall(entry, intern_to_s, 0); /* key must be a string */
|
@@ -220,8 +223,9 @@ void yajl_parse_chunk(const unsigned char * chunk, unsigned int len, yajl_handle
|
|
220
223
|
|
221
224
|
if (stat != yajl_status_ok && stat != yajl_status_insufficient_data) {
|
222
225
|
unsigned char * str = yajl_get_error(parser, 1, chunk, len);
|
223
|
-
|
226
|
+
VALUE errobj = rb_exc_new2(cParseError, (const char*) str);
|
224
227
|
yajl_free_error(parser, str);
|
228
|
+
rb_exc_raise(errobj);
|
225
229
|
}
|
226
230
|
}
|
227
231
|
|
@@ -269,10 +273,13 @@ static int yajl_found_string(void * ctx, const unsigned char * stringVal, unsign
|
|
269
273
|
|
270
274
|
static int yajl_found_hash_key(void * ctx, const unsigned char * stringVal, unsigned int stringLen) {
|
271
275
|
yajl_parser_wrapper * wrapper;
|
272
|
-
GetParser((VALUE)ctx, wrapper);
|
273
276
|
VALUE keyStr;
|
274
277
|
#ifdef HAVE_RUBY_ENCODING_H
|
275
|
-
rb_encoding *default_internal_enc
|
278
|
+
rb_encoding *default_internal_enc;
|
279
|
+
#endif
|
280
|
+
GetParser((VALUE)ctx, wrapper);
|
281
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
282
|
+
default_internal_enc = rb_default_internal_encoding();
|
276
283
|
#endif
|
277
284
|
|
278
285
|
if (wrapper->symbolizeKeys) {
|
@@ -488,7 +495,6 @@ static VALUE rb_yajl_parser_parse_chunk(VALUE self, VALUE chunk) {
|
|
488
495
|
GetParser(self, wrapper);
|
489
496
|
if (NIL_P(chunk)) {
|
490
497
|
rb_raise(cParseError, "Can't parse a nil string.");
|
491
|
-
return Qnil;
|
492
498
|
}
|
493
499
|
|
494
500
|
if (wrapper->parse_complete_callback != Qnil) {
|
@@ -526,6 +532,7 @@ static VALUE rb_yajl_parser_set_complete_cb(VALUE self, VALUE callback) {
|
|
526
532
|
* The JSON stream created is written to the IO in chunks, as it's being created.
|
527
533
|
*/
|
528
534
|
|
535
|
+
static unsigned char * defaultIndentString = (unsigned char *)" ";
|
529
536
|
/*
|
530
537
|
* Document-method: new
|
531
538
|
*
|
@@ -545,7 +552,7 @@ static VALUE rb_yajl_encoder_new(int argc, VALUE * argv, VALUE klass) {
|
|
545
552
|
yajl_encoder_wrapper * wrapper;
|
546
553
|
yajl_gen_config cfg;
|
547
554
|
VALUE opts, obj, indent;
|
548
|
-
|
555
|
+
unsigned char *indentString = NULL, *actualIndent = NULL;
|
549
556
|
int beautify = 0;
|
550
557
|
|
551
558
|
/* Scan off config vars */
|
@@ -560,13 +567,20 @@ static VALUE rb_yajl_encoder_new(int argc, VALUE * argv, VALUE klass) {
|
|
560
567
|
indent = rb_str_export_to_enc(indent, utf8Encoding);
|
561
568
|
#endif
|
562
569
|
Check_Type(indent, T_STRING);
|
563
|
-
indentString =
|
570
|
+
indentString = (unsigned char*)malloc(RSTRING_LEN(indent)+1);
|
571
|
+
memcpy(indentString, RSTRING_PTR(indent), RSTRING_LEN(indent));
|
572
|
+
indentString[RSTRING_LEN(indent)] = '\0';
|
573
|
+
actualIndent = indentString;
|
564
574
|
}
|
565
575
|
}
|
566
576
|
}
|
567
|
-
|
577
|
+
if (!indentString) {
|
578
|
+
indentString = defaultIndentString;
|
579
|
+
}
|
580
|
+
cfg = (yajl_gen_config){beautify, (const char *)indentString};
|
568
581
|
|
569
582
|
obj = Data_Make_Struct(klass, yajl_encoder_wrapper, yajl_encoder_wrapper_mark, yajl_encoder_wrapper_free, wrapper);
|
583
|
+
wrapper->indentString = actualIndent;
|
570
584
|
wrapper->encoder = yajl_gen_alloc(&cfg, NULL);
|
571
585
|
wrapper->on_progress_callback = Qnil;
|
572
586
|
if (opts != Qnil && rb_funcall(opts, intern_has_key, 1, sym_terminator) == Qtrue) {
|
@@ -836,7 +850,7 @@ static VALUE rb_yajl_encoder_enable_json_gem_ext(VALUE klass) {
|
|
836
850
|
|
837
851
|
|
838
852
|
/* Ruby Extension initializer */
|
839
|
-
void
|
853
|
+
void Init_yajl() {
|
840
854
|
mYajl = rb_define_module("Yajl");
|
841
855
|
|
842
856
|
cParseError = rb_define_class_under(mYajl, "ParseError", rb_eStandardError);
|