vox-etf 0.1.4 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23e933f7516643febe38cf5e2d8ee5e9f1ab3fe68ff1fb6dd97c6fa62ff9aa4f
4
- data.tar.gz: 84aba301392e4726c27d60be188965cd0657cf312a89e839e315b6a02992c023
3
+ metadata.gz: 07ad7f903c0086a1f59466dad80db4f037d927df1f6cc806f20030ebb8bdf624
4
+ data.tar.gz: 433e74a263635e5a41c7b06eb1e90ae16713bea01375811e40074db9a3b3ec83
5
5
  SHA512:
6
- metadata.gz: 8772aad812bc659a49137e275e369c91dc32923f1ebb1dbbd596bdbc5b9d63d325f0d62cc8379e3dc7d050d4ed2e6112aee88437923b6fcef92b963668596af5
7
- data.tar.gz: bcf8b1923f65051c018c092d41e797d3dd4760dce007f5e82dd63a2b139214009c658ee96a508c0aedb245c43dde931bb0b09841684f9173f3c9e96f4d9e217c
6
+ metadata.gz: 87d8bfa9215395b601017a864bb641cc912021be1809c9ee9f13d11a325ac785a974ad7210e2c7fad29b951e0afc44e5592daf4f766a07211cc5ca5c87657f11
7
+ data.tar.gz: 80bb347731c1379b37b4d5a9bf28d23675cb7c5e71e61df53c6c4af67336546be785215b57ce2aa8599447d661c26f4fe1c7cc951435207857fa7a21a15c67db
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
  #include <zlib.h>
3
+ #include "./etf.hpp"
3
4
  #include "ruby.h"
4
5
  #include "erlpack/sysdep.h"
5
6
  #include "erlpack/constants.h"
@@ -360,11 +361,12 @@ namespace etf
360
361
 
361
362
  VALUE decode_compressed()
362
363
  {
364
+ #if HAVE_ZLIB_H
363
365
  const uint32_t decompressed_size = read32();
364
366
 
365
- uint64_t source_size = decompressed_size;
367
+ unsigned long source_size = decompressed_size;
366
368
  uint8_t *out_buffer = (uint8_t *)malloc(decompressed_size);
367
- const int ret = uncompress(out_buffer, &source_size, (const unsigned char *)(data + offset), (uint64_t)(size - offset));
369
+ const int ret = uncompress(out_buffer, &source_size, (const unsigned char *)(data + offset), (uLong)(size - offset));
368
370
 
369
371
  offset += source_size;
370
372
  if (ret != Z_OK)
@@ -378,6 +380,10 @@ namespace etf
378
380
  VALUE value = decompressed.decode_term();
379
381
  free(out_buffer);
380
382
  return value;
383
+ #else
384
+ rb_raise(rb_eArgError, "vox-etf was compiled without zlib support can cannot decode the compressed term.");
385
+ return Qnil;
386
+ #endif
381
387
  }
382
388
  };
383
389
  } // namespace etf
@@ -1,6 +1,7 @@
1
1
  #include "erlpack/encoder.h"
2
2
  #include "erlpack/constants.h"
3
- #include "etf.hpp"
3
+ #include "./etf.hpp"
4
+ #include "ruby.h"
4
5
 
5
6
  namespace etf
6
7
  {
@@ -98,11 +99,11 @@ namespace etf
98
99
 
99
100
  void encode_fixnum(VALUE fixnum)
100
101
  {
101
- long l = FIX2LONG(fixnum);
102
- if (l > 0 && l <= 0xFF)
103
- erlpack_append_small_integer(erl_buff, (unsigned char)l);
102
+ uint32_t n = NUM2UINT(fixnum);
103
+ if (n > 0 && n <= UINT8_MAX)
104
+ erlpack_append_small_integer(erl_buff, (uint8_t)n);
104
105
  else
105
- erlpack_append_integer(erl_buff, l);
106
+ erlpack_append_integer(erl_buff, n);
106
107
  }
107
108
 
108
109
  void encode_bignum(VALUE bignum)
@@ -137,15 +138,20 @@ namespace etf
137
138
 
138
139
  void encode_array(VALUE array)
139
140
  {
140
- uint32_t size = RARRAY_LEN(array);
141
+ uint64_t size = RARRAY_LEN(array);
141
142
  if (size == 0)
142
143
  {
143
144
  erlpack_append_nil_ext(erl_buff);
144
145
  return;
145
146
  }
147
+ else if (size > UINT32_MAX)
148
+ {
149
+ rb_raise(rb_eRangeError, "Array size is too large to fit into a 32 bit integer.");
150
+ return;
151
+ }
146
152
 
147
153
  erlpack_append_list_header(erl_buff, size);
148
- for (uint32_t index = 0; index < size; index++)
154
+ for (size_t index = 0; index < size; index++)
149
155
  {
150
156
  encode_object(RARRAY_AREF(array, index));
151
157
  }
@@ -155,8 +161,7 @@ namespace etf
155
161
 
156
162
  void encode_symbol(VALUE symbol)
157
163
  {
158
- VALUE str = rb_sym2str(symbol);
159
- erlpack_append_atom_utf8(erl_buff, RSTRING_PTR(str), RSTRING_LEN(str));
164
+ encode_string(rb_sym2str(symbol));
160
165
  }
161
166
 
162
167
  void encode_string(VALUE string)
@@ -166,13 +171,20 @@ namespace etf
166
171
 
167
172
  void encode_hash(VALUE hash)
168
173
  {
169
- uint32_t size = RHASH_SIZE(hash);
174
+ uint64_t size = RHASH_SIZE(hash);
175
+ if (size > UINT32_MAX)
176
+ {
177
+ rb_raise(rb_eRangeError, "Hash size is too large to fit into a 32 bit integer");
178
+ return;
179
+ }
180
+
170
181
  erlpack_append_map_header(erl_buff, size);
171
182
  VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
172
183
 
173
184
  for (uint32_t index = 0; index < size * 2; index += 2)
174
185
  {
175
186
  VALUE key = RARRAY_AREF(keys, index / 2);
187
+ // Normalize keys to strings because discord
176
188
  encode_object(key);
177
189
  encode_object(rb_hash_aref(hash, key));
178
190
  }
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include "./extconf.h"
3
4
  #define ETF_VERSION 131
4
5
 
5
6
  VALUE decode(VALUE self, VALUE input);
@@ -1,13 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require('mkmf-rice')
3
+ require('mkmf')
4
4
 
5
5
  find_header('ruby.h')
6
- find_header('zlib.h')
7
6
  find_header('stddef.h')
8
7
  find_header('stdlib.h')
9
8
  find_header('stdint.h')
10
9
  find_header('limits.h')
11
10
  find_header('string.h')
11
+ have_header('zlib.h')
12
+ have_library('z')
13
+
14
+ create_header
12
15
 
13
16
  create_makefile('vox/etf')
@@ -21,6 +21,6 @@ module Vox
21
21
  # end
22
22
 
23
23
  # Gem version
24
- VERSION = '0.1.4'
24
+ VERSION = '0.1.9'
25
25
  end
26
26
  end
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ['lib']
31
31
  spec.extensions << 'ext/vox/extconf.rb'
32
32
 
33
- spec.add_dependency 'rice', '~> 2.2.0'
34
33
  spec.add_development_dependency 'rake', '~> 12.3.3'
35
34
  spec.add_development_dependency 'rake-compiler', '~> 1.1.1'
36
35
  spec.add_development_dependency 'rspec', '~> 3.9.0'
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vox-etf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Carey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-11 00:00:00.000000000 Z
11
+ date: 2020-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rice
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 2.2.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 2.2.0
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rake
29
15
  requirement: !ruby/object:Gem::Requirement