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
         |