yajl-ruby 0.6.3 → 0.6.4

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.

@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.4 (November 4th, 2009)
4
+ * All specs pass on Rubinius :)
5
+ * Fixed a bug in Yajl::Encoder which allowed direct, unescaped encoding of NaN, Infinity and -Infinity.
6
+ It will now properly throw a Yajl::EncodeError exception if either of these values are found unescaped.
7
+ * Update bundled Yajl library to 1.0.7
8
+ * Conditionally define RSTRING_* and RARRAY_* for older versions of ruby (1.8.5 is still the default on CentOS)
9
+ * Bugfix for JSON gem exception classes to more accurately match those of the actual JSON gem
10
+ * A few small speed optimizations
11
+ * Updated specs to not run bzip2 related examples if unable to load the bzip2 library
12
+ * Finally added UTF-8 checking specs
13
+ * Removed needless calls to ID2SYM all over the place
14
+ * Updated benchmark scripts to bring the GC into the picture a little more
15
+
3
16
  ## 0.6.3 (August 25th, 2009)
4
17
  * Fixed a bug in the JSON gem compatibility API where strings weren't being properly escaped
5
18
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  This gem is a C binding to the excellent YAJL JSON parsing and generation library.
4
4
 
5
- You can read more info at the projects website http://lloydforge.org/projects/yajl or check out it's codes at http://github.com/lloyd/yajl.
5
+ You can read more info at the projects website http://lloyd.github.com/yajl or check out it's codes at http://github.com/lloyd/yajl.
6
6
 
7
7
  == Features
8
8
 
@@ -19,11 +19,13 @@ You can read more info at the projects website http://lloydforge.org/projects/ya
19
19
 
20
20
  == How to install
21
21
 
22
- Install it like any other gem hosted at the Githubs like so:
22
+ First make sure you've got Gemcutter in your sources list:
23
23
 
24
- (more instructions here: http://gems.github.com)
24
+ gem sources -a http://gemcutter.org
25
25
 
26
- sudo gem install brianmario-yajl-ruby
26
+ Then go ahead and install it as usual:
27
+
28
+ sudo gem install yajl-ruby
27
29
 
28
30
  == Example of use
29
31
 
@@ -216,10 +218,10 @@ There are a lot more possibilities that I'd love to see other gems/plugins for s
216
218
 
217
219
  Some ideas are:
218
220
  * parsing logs in JSON format
219
- * a Rails plugin (http://github.com/technoweenie/yajl-rails)
221
+ * a Rails plugin - DONE! (http://github.com/technoweenie/yajl-rails)
220
222
  * builtin support in Rails 3?
221
- * Rack middleware (ideally the JSON body could be handed to the parser while it's still being received)
222
- * use with ohai (http://github.com/brianmario/ohai)
223
+ * Rack middleware (ideally the JSON body could be handed to the parser while it's still being received, this is apparently possible with Unicorn)
224
+ * use with ohai - DONE! (http://github.com/opscode/ohai/commit/f89baccc3b9ab587d23e0b6257f6fedffe223c02)
223
225
  * JSON API clients (http://github.com/brianmario/crack, http://github.com/brianmario/freckle-api)
224
226
  * Patch Marshal#load and Marshal#dump to use JSON? ;)
225
227
  * etc...
@@ -1,4 +1,4 @@
1
1
  ---
2
- :minor: 6
3
- :patch: 3
2
+ :patch: 4
4
3
  :major: 0
4
+ :minor: 6
@@ -12,9 +12,9 @@ json = File.new(filename, 'r')
12
12
  hash = Yajl::Parser.new.parse(json)
13
13
  json.close
14
14
 
15
- times = ARGV[1] ? ARGV[1].to_i : 1
15
+ times = ARGV[1] ? ARGV[1].to_i : 1000
16
16
  puts "Starting benchmark encoding #{filename} #{times} times\n\n"
17
- Benchmark.bm { |x|
17
+ Benchmark.bmbm { |x|
18
18
  io_encoder = Yajl::Encoder.new
19
19
  x.report {
20
20
  puts "Yajl::Encoder#encode (to an IO)"
@@ -30,7 +30,7 @@ Benchmark.bm { |x|
30
30
  }
31
31
  }
32
32
  x.report {
33
- puts "JSON's #to_json"
33
+ puts "JSON.generate"
34
34
  times.times {
35
35
  JSON.generate(hash)
36
36
  }
@@ -5,14 +5,14 @@ require 'yajl_ext'
5
5
  require 'stringio'
6
6
  require 'json'
7
7
 
8
- times = ARGV[0] ? ARGV[0].to_i : 1
8
+ times = ARGV[0] ? ARGV[0].to_i : 1000
9
9
  filename = 'benchmark/subjects/ohai.json'
10
10
  json = File.new(filename, 'r')
11
11
  hash = Yajl::Parser.new.parse(json)
12
12
  json.close
13
13
 
14
14
  puts "Starting benchmark encoding #{filename} #{times} times\n\n"
15
- Benchmark.bm { |x|
15
+ Benchmark.bmbm { |x|
16
16
  encoder = Yajl::Encoder.new
17
17
  x.report {
18
18
  puts "Yajl::Encoder#encode"
@@ -11,9 +11,9 @@ json = File.new(filename, 'r')
11
11
  hash = Yajl::Parser.new.parse(json)
12
12
  json.close
13
13
 
14
- times = ARGV[0] ? ARGV[0].to_i : 1
14
+ times = ARGV[0] ? ARGV[0].to_i : 1000
15
15
  puts "Starting benchmark encoding #{filename} into JSON #{times} times\n\n"
16
- Benchmark.bm { |x|
16
+ Benchmark.bmbm { |x|
17
17
  encoder = Yajl::Encoder.new
18
18
  x.report {
19
19
  puts "Yajl::Encoder#encode"
@@ -30,14 +30,13 @@ Benchmark.bm { |x|
30
30
  }
31
31
 
32
32
  # YAML Section
33
- filename = 'benchmark/subjects/contacts.yml'
33
+ filename = 'benchmark/subjects/ohai.yml'
34
34
  yml = File.new(filename, 'r')
35
35
  data = YAML.load_stream(yml)
36
36
  yml.close
37
37
 
38
- times = ARGV[0] ? ARGV[0].to_i : 1
39
38
  puts "Starting benchmark encoding #{filename} into YAML #{times} times\n\n"
40
- Benchmark.bm { |x|
39
+ Benchmark.bmbm { |x|
41
40
  x.report {
42
41
  puts "YAML.dump"
43
42
  times.times {
@@ -4,7 +4,7 @@ require 'benchmark'
4
4
  require 'yajl/http_stream'
5
5
  require 'yajl/gzip'
6
6
  require 'yajl/deflate'
7
- require 'yajl/bzip2'
7
+ require 'yajl/bzip2' unless defined?(Bzip2)
8
8
  require 'json'
9
9
  require 'uri'
10
10
  require 'net/http'
@@ -14,7 +14,7 @@ uri = URI.parse('http://search.twitter.com/search.json?q=github')
14
14
 
15
15
  times = ARGV[0] ? ARGV[0].to_i : 1
16
16
  puts "Starting benchmark parsing #{uri.to_s} #{times} times\n\n"
17
- Benchmark.bm { |x|
17
+ Benchmark.bmbm { |x|
18
18
  x.report {
19
19
  puts "Yajl::HttpStream.get"
20
20
  times.times {
@@ -5,17 +5,14 @@ require 'yajl_ext'
5
5
  require 'json'
6
6
  require 'activesupport'
7
7
 
8
- filename = ARGV[0] || 'benchmark/subjects/ohai.json'
8
+ filename = ARGV[0] || 'benchmark/subjects/twitter_search.json'
9
9
  json = File.new(filename, 'r')
10
10
 
11
- # warm up the filesystem
12
- json.read
13
- json.rewind
14
-
15
- times = ARGV[1] ? ARGV[1].to_i : 1
11
+ times = ARGV[1] ? ARGV[1].to_i : 1000
16
12
  puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
17
- Benchmark.bm { |x|
13
+ Benchmark.bmbm { |x|
18
14
  io_parser = Yajl::Parser.new
15
+ io_parser.on_parse_complete = lambda {|obj|} if times > 1
19
16
  x.report {
20
17
  puts "Yajl::Parser#parse (from an IO)"
21
18
  times.times {
@@ -24,6 +21,7 @@ Benchmark.bm { |x|
24
21
  }
25
22
  }
26
23
  string_parser = Yajl::Parser.new
24
+ string_parser.on_parse_complete = lambda {|obj|} if times > 1
27
25
  x.report {
28
26
  puts "Yajl::Parser#parse (from a String)"
29
27
  times.times {
@@ -10,22 +10,18 @@ marshal_filename = 'benchmark/subjects/ohai.marshal_dump'
10
10
  json = File.new(filename, 'r')
11
11
  marshal_file = File.new(marshal_filename, 'r')
12
12
 
13
- # warm up the filesystem
14
- json.read
15
- json.rewind
16
- marshal_file.read
17
- marshal_file.rewind
18
-
19
13
  hash = {}
20
14
 
21
- times = ARGV[0] ? ARGV[0].to_i : 1
15
+ times = ARGV[0] ? ARGV[0].to_i : 1000
22
16
  puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
23
- Benchmark.bm { |x|
17
+ Benchmark.bmbm { |x|
24
18
  x.report {
25
19
  puts "Yajl::Parser#parse"
20
+ yajl = Yajl::Parser.new
21
+ yajl.on_parse_complete = lambda {|obj|} if times > 1
26
22
  times.times {
27
23
  json.rewind
28
- hash = Yajl::Parser.new.parse(json)
24
+ hash = yajl.parse(json)
29
25
  }
30
26
  }
31
27
  x.report {
@@ -9,14 +9,11 @@ require 'yaml'
9
9
  filename = 'benchmark/subjects/ohai.json'
10
10
  json = File.new(filename, 'r')
11
11
 
12
- # warm up the filesystem
13
- json.read
14
- json.rewind
15
-
16
- times = ARGV[0] ? ARGV[0].to_i : 1
12
+ times = ARGV[0] ? ARGV[0].to_i : 1000
17
13
  puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
18
- Benchmark.bm { |x|
14
+ Benchmark.bmbm { |x|
19
15
  parser = Yajl::Parser.new
16
+ parser.on_parse_complete = lambda {|obj|} if times > 1
20
17
  x.report {
21
18
  puts "Yajl::Parser#parse"
22
19
  times.times {
@@ -35,16 +32,11 @@ Benchmark.bm { |x|
35
32
  json.close
36
33
 
37
34
  # YAML section
38
- filename = 'benchmark/subjects/contacts.yml'
35
+ filename = 'benchmark/subjects/ohai.yml'
39
36
  yaml = File.new(filename, 'r')
40
37
 
41
- # warm up the filesystem
42
- yaml.read
43
- yaml.rewind
44
-
45
- times = ARGV[0] ? ARGV[0].to_i : 1
46
38
  puts "Starting benchmark parsing #{File.size(filename)} bytes of YAML data #{times} times\n\n"
47
- Benchmark.bm { |x|
39
+ Benchmark.bmbm { |x|
48
40
  x.report {
49
41
  puts "YAML.load_stream"
50
42
  times.times {
@@ -3,22 +3,16 @@ require 'rubygems'
3
3
  require 'benchmark'
4
4
  require 'yajl_ext'
5
5
  require 'json'
6
- # require 'activesupport'
6
+ require 'activesupport'
7
7
 
8
8
  filename = 'benchmark/subjects/twitter_stream.json'
9
9
  json = File.new(filename, 'r')
10
10
 
11
- # warm up the filesystem
12
- json.read
13
- json.rewind
14
-
15
- times = ARGV[0] ? ARGV[0].to_i : 1
11
+ times = ARGV[0] ? ARGV[0].to_i : 100
16
12
  puts "Starting benchmark parsing JSON stream (#{File.size(filename)} bytes of JSON data with 430 JSON separate strings) #{times} times\n\n"
17
- Benchmark.bm { |x|
13
+ Benchmark.bmbm { |x|
18
14
  parser = Yajl::Parser.new
19
- parser.on_parse_complete = lambda { |obj|
20
- # no-op
21
- }
15
+ parser.on_parse_complete = lambda {|obj|}
22
16
  x.report {
23
17
  puts "Yajl::Parser#parse"
24
18
  times.times {
@@ -35,14 +29,14 @@ Benchmark.bm { |x|
35
29
  end
36
30
  }
37
31
  }
38
- # x.report {
39
- # puts "ActiveSupport::JSON.decode"
40
- # times.times {
41
- # json.rewind
42
- # while chunk = json.gets
43
- # ActiveSupport::JSON.decode(chunk)
44
- # end
45
- # }
46
- # }
32
+ x.report {
33
+ puts "ActiveSupport::JSON.decode"
34
+ times.times {
35
+ json.rewind
36
+ while chunk = json.gets
37
+ ActiveSupport::JSON.decode(chunk)
38
+ end
39
+ }
40
+ }
47
41
  }
48
42
  json.close
@@ -57,7 +57,10 @@ extern "C" {
57
57
  * state */
58
58
  yajl_gen_in_error_state,
59
59
  /** A complete JSON document has been generated */
60
- yajl_gen_generation_complete
60
+ yajl_gen_generation_complete,
61
+ /** yajl_gen_double was passed an invalid floating point value
62
+ * (infinity or NaN). */
63
+ yajl_gen_invalid_number
61
64
  } yajl_gen_status;
62
65
 
63
66
  /** an opaque handle to a generator */
@@ -90,6 +93,9 @@ extern "C" {
90
93
  void YAJL_API yajl_gen_free(yajl_gen handle);
91
94
 
92
95
  yajl_gen_status YAJL_API yajl_gen_integer(yajl_gen hand, long int number);
96
+ /** generate a floating point number. number may not be infinity or
97
+ * NaN, as these have no representation in JSON. In these cases the
98
+ * generator will return 'yajl_gen_invalid_number' */
93
99
  yajl_gen_status YAJL_API yajl_gen_double(yajl_gen hand, double number);
94
100
  yajl_gen_status YAJL_API yajl_gen_number(yajl_gen hand,
95
101
  const char * num,
@@ -1,11 +1,11 @@
1
1
  #include "yajl_ext.h"
2
2
 
3
- // Helpers for building objects
3
+ /* Helpers for building objects */
4
4
  inline void yajl_check_and_fire_callback(void * ctx) {
5
5
  struct yajl_parser_wrapper * wrapper;
6
6
  GetParser((VALUE)ctx, wrapper);
7
7
 
8
- // No need to do any of this if the callback isn't even setup
8
+ /* No need to do any of this if the callback isn't even setup */
9
9
  if (wrapper->parse_complete_callback != Qnil) {
10
10
  int len = RARRAY_LEN(wrapper->builderStack);
11
11
  if (len == 1 && wrapper->nestedArrayLevel == 0 && wrapper->nestedHashLevel == 0) {
@@ -98,15 +98,15 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
98
98
  case T_HASH:
99
99
  status = yajl_gen_map_open(w->encoder);
100
100
 
101
- // TODO: itterate through keys in the hash
101
+ /* TODO: itterate through keys in the hash */
102
102
  VALUE keys = rb_funcall(obj, intern_keys, 0);
103
103
  VALUE entry, keyStr;
104
104
  for(idx=0; idx<RARRAY_LEN(keys); idx++) {
105
105
  entry = rb_ary_entry(keys, idx);
106
- keyStr = rb_funcall(entry, intern_to_s, 0); // key must be a string
107
- // the key
106
+ keyStr = rb_funcall(entry, intern_to_s, 0); /* key must be a string */
107
+ /* the key */
108
108
  yajl_encode_part(w, keyStr, io);
109
- // the value
109
+ /* the value */
110
110
  yajl_encode_part(w, rb_hash_aref(obj, entry), io);
111
111
  }
112
112
 
@@ -133,6 +133,9 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
133
133
  case T_FLOAT:
134
134
  case T_BIGNUM:
135
135
  str = rb_funcall(obj, intern_to_s, 0);
136
+ if (strcmp(RSTRING_PTR(str), "NaN") == 0 || strcmp(RSTRING_PTR(str), "Infinity") == 0 || strcmp(RSTRING_PTR(str), "-Infinity") == 0) {
137
+ rb_raise(cEncodeError, "'%s' is an invalid number", RSTRING_PTR(str));
138
+ }
136
139
  status = yajl_gen_number(w->encoder, RSTRING_PTR(str), (unsigned int)RSTRING_LEN(str));
137
140
  break;
138
141
  case T_STRING:
@@ -141,7 +144,7 @@ void yajl_encode_part(void * wrapper, VALUE obj, VALUE io) {
141
144
  default:
142
145
  if (rb_respond_to(obj, intern_to_json)) {
143
146
  str = rb_funcall(obj, intern_to_json, 0);
144
- quote_strings = 0; // this lets us append on to the buffer without Yajl quoting it again
147
+ quote_strings = 0; /* this lets us append on to the buffer without Yajl quoting it again */
145
148
  } else {
146
149
  str = rb_funcall(obj, intern_to_s, 0);
147
150
  }
@@ -174,7 +177,7 @@ void yajl_parse_chunk(const unsigned char * chunk, unsigned int len, yajl_handle
174
177
  }
175
178
  }
176
179
 
177
- // YAJL Callbacks
180
+ /* YAJL Callbacks */
178
181
  static int yajl_found_null(void * ctx) {
179
182
  yajl_set_static_value(ctx, Qnil);
180
183
  yajl_check_and_fire_callback(ctx);
@@ -188,15 +191,19 @@ static int yajl_found_boolean(void * ctx, int boolean) {
188
191
  }
189
192
 
190
193
  static int yajl_found_number(void * ctx, const char * numberVal, unsigned int numberLen) {
191
- VALUE subString = rb_str_new(numberVal, numberLen);
192
- char * cSubString = RSTRING_PTR(subString);
194
+ char * cSubString = ALLOC_N(char, numberLen+1);
195
+ if (cSubString) {
196
+ memcpy(cSubString, numberVal, numberLen);
197
+ }
198
+ cSubString[numberLen] = '\0';
193
199
 
194
- if (strstr(cSubString, ".") != NULL || strstr(cSubString, "e") != NULL || strstr(cSubString, "E") != NULL) {
195
- yajl_set_static_value(ctx, rb_Float(subString));
200
+ if (strchr(cSubString, '.') != NULL || strchr(cSubString, 'e') != NULL || strchr(cSubString, 'E') != NULL) {
201
+ yajl_set_static_value(ctx, rb_float_new(atof(cSubString)));
196
202
  } else {
197
- yajl_set_static_value(ctx, rb_Integer(subString));
203
+ yajl_set_static_value(ctx, INT2FIX(atoi(cSubString)));
198
204
  }
199
205
  yajl_check_and_fire_callback(ctx);
206
+ free(cSubString);
200
207
  return 1;
201
208
  }
202
209
 
@@ -210,10 +217,9 @@ static int yajl_found_hash_key(void * ctx, const unsigned char * stringVal, unsi
210
217
  struct yajl_parser_wrapper * wrapper;
211
218
  GetParser((VALUE)ctx, wrapper);
212
219
  VALUE keyStr = rb_str_new((const char *)stringVal, stringLen);
213
-
220
+
214
221
  if (wrapper->symbolizeKeys) {
215
- ID key = rb_intern(RSTRING_PTR(keyStr));
216
- yajl_set_static_value(ctx, ID2SYM(key));
222
+ yajl_set_static_value(ctx, rb_funcall(keyStr, intern_to_sym, 0));
217
223
  } else {
218
224
  yajl_set_static_value(ctx, keyStr);
219
225
  }
@@ -260,7 +266,7 @@ static int yajl_found_end_array(void * ctx) {
260
266
  }
261
267
 
262
268
 
263
- // Ruby Interface
269
+ /* Ruby Interface */
264
270
 
265
271
  /*
266
272
  * Document-class: Yajl::Parser
@@ -287,17 +293,17 @@ static VALUE rb_yajl_parser_new(int argc, VALUE * argv, VALUE klass) {
287
293
  VALUE opts, obj;
288
294
  int allowComments = 1, checkUTF8 = 1, symbolizeKeys = 0;
289
295
 
290
- // Scan off config vars
296
+ /* Scan off config vars */
291
297
  if (rb_scan_args(argc, argv, "01", &opts) == 1) {
292
298
  Check_Type(opts, T_HASH);
293
299
 
294
- if (rb_hash_aref(opts, ID2SYM(sym_allow_comments)) == Qfalse) {
300
+ if (rb_hash_aref(opts, sym_allow_comments) == Qfalse) {
295
301
  allowComments = 0;
296
302
  }
297
- if (rb_hash_aref(opts, ID2SYM(sym_check_utf8)) == Qfalse) {
303
+ if (rb_hash_aref(opts, sym_check_utf8) == Qfalse) {
298
304
  checkUTF8 = 0;
299
305
  }
300
- if (rb_hash_aref(opts, ID2SYM(sym_symbolize_keys)) == Qtrue) {
306
+ if (rb_hash_aref(opts, sym_symbolize_keys) == Qtrue) {
301
307
  symbolizeKeys = 1;
302
308
  }
303
309
  }
@@ -354,12 +360,11 @@ static VALUE rb_yajl_parser_init(int argc, VALUE * argv, VALUE self) {
354
360
  static VALUE rb_yajl_parser_parse(int argc, VALUE * argv, VALUE self) {
355
361
  yajl_status stat;
356
362
  struct yajl_parser_wrapper * wrapper;
357
- VALUE parsed, rbufsize, input, blk;
363
+ VALUE rbufsize, input, blk;
358
364
 
359
365
  GetParser(self, wrapper);
360
- parsed = rb_str_new2("");
361
366
 
362
- // setup our parameters
367
+ /* setup our parameters */
363
368
  rb_scan_args(argc, argv, "11&", &input, &rbufsize, &blk);
364
369
  if (NIL_P(rbufsize)) {
365
370
  rbufsize = INT2FIX(READ_BUFSIZE);
@@ -373,6 +378,7 @@ static VALUE rb_yajl_parser_parse(int argc, VALUE * argv, VALUE self) {
373
378
  if (TYPE(input) == T_STRING) {
374
379
  yajl_parse_chunk((const unsigned char *)RSTRING_PTR(input), RSTRING_LEN(input), wrapper->parser);
375
380
  } else if (rb_respond_to(input, intern_eof)) {
381
+ VALUE parsed = rb_str_new2("");
376
382
  while (rb_funcall(input, intern_eof, 0) != Qtrue) {
377
383
  rb_funcall(input, intern_io_read, 2, rbufsize, parsed);
378
384
  yajl_parse_chunk((const unsigned char *)RSTRING_PTR(parsed), RSTRING_LEN(parsed), wrapper->parser);
@@ -381,7 +387,7 @@ static VALUE rb_yajl_parser_parse(int argc, VALUE * argv, VALUE self) {
381
387
  rb_raise(cParseError, "input must be a string or IO");
382
388
  }
383
389
 
384
- // parse any remaining buffered data
390
+ /* parse any remaining buffered data */
385
391
  stat = yajl_parse_complete(wrapper->parser);
386
392
 
387
393
  if (wrapper->parse_complete_callback != Qnil) {
@@ -467,13 +473,13 @@ static VALUE rb_yajl_encoder_new(int argc, VALUE * argv, VALUE klass) {
467
473
  const char * indentString = " ";
468
474
  int beautify = 0;
469
475
 
470
- // Scan off config vars
476
+ /* Scan off config vars */
471
477
  if (rb_scan_args(argc, argv, "01", &opts) == 1) {
472
478
  Check_Type(opts, T_HASH);
473
479
 
474
- if (rb_hash_aref(opts, ID2SYM(sym_pretty)) == Qtrue) {
480
+ if (rb_hash_aref(opts, sym_pretty) == Qtrue) {
475
481
  beautify = 1;
476
- indent = rb_hash_aref(opts, ID2SYM(sym_indent));
482
+ indent = rb_hash_aref(opts, sym_indent);
477
483
  if (indent != Qnil) {
478
484
  Check_Type(indent, T_STRING);
479
485
  indentString = RSTRING_PTR(indent);
@@ -485,8 +491,8 @@ static VALUE rb_yajl_encoder_new(int argc, VALUE * argv, VALUE klass) {
485
491
  obj = Data_Make_Struct(klass, struct yajl_encoder_wrapper, yajl_encoder_wrapper_mark, yajl_encoder_wrapper_free, wrapper);
486
492
  wrapper->encoder = yajl_gen_alloc(&cfg, NULL);
487
493
  wrapper->on_progress_callback = Qnil;
488
- if (opts != Qnil && rb_funcall(opts, intern_has_key, 1, ID2SYM(sym_terminator)) == Qtrue) {
489
- wrapper->terminator = rb_hash_aref(opts, ID2SYM(sym_terminator));
494
+ if (opts != Qnil && rb_funcall(opts, intern_has_key, 1, sym_terminator) == Qtrue) {
495
+ wrapper->terminator = rb_hash_aref(opts, sym_terminator);
490
496
  } else {
491
497
  wrapper->terminator = 0;
492
498
  }
@@ -543,10 +549,10 @@ static VALUE rb_yajl_encoder_encode(int argc, VALUE * argv, VALUE self) {
543
549
  wrapper->on_progress_callback = blk;
544
550
  }
545
551
 
546
- // begin encode process
552
+ /* begin encode process */
547
553
  yajl_encode_part(wrapper, obj, io);
548
554
 
549
- // just make sure we output the remaining buffer
555
+ /* just make sure we output the remaining buffer */
550
556
  yajl_gen_get_buf(wrapper->encoder, &buffer, &len);
551
557
  outBuff = rb_str_new((const char *)buffer, len);
552
558
  yajl_gen_clear(wrapper->encoder);
@@ -590,7 +596,7 @@ static VALUE rb_yajl_encoder_set_progress_cb(VALUE self, VALUE callback) {
590
596
  }
591
597
 
592
598
 
593
- // JSON Gem compatibility
599
+ /* JSON Gem compatibility */
594
600
 
595
601
  /*
596
602
  * Document-class: Hash
@@ -783,7 +789,7 @@ static VALUE rb_yajl_encoder_enable_json_gem_ext(VALUE klass) {
783
789
  }
784
790
 
785
791
 
786
- // Ruby Extension initializer
792
+ /* Ruby Extension initializer */
787
793
  void Init_yajl_ext() {
788
794
  mYajl = rb_define_module("Yajl");
789
795
 
@@ -812,12 +818,13 @@ void Init_yajl_ext() {
812
818
  intern_keys = rb_intern("keys");
813
819
  intern_to_s = rb_intern("to_s");
814
820
  intern_to_json = rb_intern("to_json");
815
-
816
- sym_allow_comments = rb_intern("allow_comments");
817
- sym_check_utf8 = rb_intern("check_utf8");
818
- sym_pretty = rb_intern("pretty");
819
- sym_indent = rb_intern("indent");
820
- sym_terminator = rb_intern("terminator");
821
- sym_symbolize_keys = rb_intern("symbolize_keys");
821
+ intern_to_sym = rb_intern("to_sym");
822
822
  intern_has_key = rb_intern("has_key?");
823
+
824
+ sym_allow_comments = ID2SYM(rb_intern("allow_comments"));
825
+ sym_check_utf8 = ID2SYM(rb_intern("check_utf8"));
826
+ sym_pretty = ID2SYM(rb_intern("pretty"));
827
+ sym_indent = ID2SYM(rb_intern("indent"));
828
+ sym_terminator = ID2SYM(rb_intern("terminator"));
829
+ sym_symbolize_keys = ID2SYM(rb_intern("symbolize_keys"));
823
830
  }