mittens 0.3.2 → 0.3.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5d5216e3e6a0e86aa92ab80ec8876e66be4d766d500d82609f166452f28fb08
4
- data.tar.gz: f5db98b8a25cc9fb2183a2f0010695239a66c82faf00e1ddb34355739087c48b
3
+ metadata.gz: a293e52f3e6ecf7669615bbf24aae34a9fcef78305b7324f7f739fc97e7eb0fc
4
+ data.tar.gz: e5f1ba1b94ac634316599a25d969c1d71d4a0ff591ef043011c2481fe641814d
5
5
  SHA512:
6
- metadata.gz: 886dac65964a1b37c5156ff27b7703a71d6acde7f01c9525d1a564636b1fdfa99bf8871b98e8628ed511cdda536e4d28d7e5bebbefdb9b0a67454346e1f571c7
7
- data.tar.gz: 62a9a20fca62714a28826626183dba6816d11863fb169da43c0fa7d35d2a7978704f4764be63bce5de1986b188566f15f7ec5be5a0d415d9a85fad7285b2f1ac
6
+ metadata.gz: 4c392905c194b9eb723f44e7e97fd040395757751a43a034c34dfef51f399f24e2be4e390414e6e34e79bd26410987d696cd23fa197396ff9510f60a5503730e
7
+ data.tar.gz: 9dbff4611a7d1b43d42d19fa0e873a3c5055b2358b5b0d75e3080e9686ccd315be564dbd93af62e28a63c3e1b50706968a2b6dbcd01f9dc7cd41420bf782ac09
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.3.3 (2026-08-05)
2
+
3
+ - Fixed issue with GC compaction
4
+
1
5
  ## 0.3.2 (2026-07-10)
2
6
 
3
7
  - Updated Snowball to 3.1.1
data/ext/mittens/ext.c CHANGED
@@ -1,13 +1,15 @@
1
+ #include <limits.h>
2
+
1
3
  #include "libstemmer.h"
2
4
  #include "ruby/ruby.h"
3
5
 
4
6
  typedef struct stemmer {
5
- struct sb_stemmer * stemmer;
7
+ struct sb_stemmer* stemmer;
6
8
  } stemmer_t;
7
9
 
8
- static void stemmer_free(void *ptr)
10
+ static void stemmer_free(void* ptr)
9
11
  {
10
- stemmer_t *stemmer = (stemmer_t *)ptr;
12
+ stemmer_t* stemmer = (stemmer_t*) ptr;
11
13
  // safe to pass null pointer according to docs
12
14
  sb_stemmer_delete(stemmer->stemmer);
13
15
  xfree(ptr);
@@ -23,7 +25,7 @@ const rb_data_type_t stemmer_data_type = {
23
25
 
24
26
  static VALUE stemmer_allocate(VALUE klass)
25
27
  {
26
- stemmer_t *stemmer;
28
+ stemmer_t* stemmer;
27
29
  VALUE obj = TypedData_Make_Struct(klass, stemmer_t, &stemmer_data_type, stemmer);
28
30
  stemmer->stemmer = NULL;
29
31
  return obj;
@@ -34,16 +36,17 @@ static VALUE stemmer_initialize(int argc, VALUE* argv, VALUE self)
34
36
  VALUE opts;
35
37
  rb_scan_args(argc, argv, ":", &opts);
36
38
 
37
- const char * algorithm = "english";
39
+ VALUE language = Qnil;
40
+ const char* algorithm = "english";
38
41
  if (!NIL_P(opts)) {
39
- VALUE language = rb_hash_aref(opts, ID2SYM(rb_intern("language")));
42
+ language = rb_hash_aref(opts, ID2SYM(rb_intern("language")));
40
43
  if (!NIL_P(language)) {
41
44
  Check_Type(language, T_STRING);
42
45
  algorithm = RSTRING_PTR(language);
43
46
  }
44
47
  }
45
48
 
46
- stemmer_t *stemmer;
49
+ stemmer_t* stemmer;
47
50
  TypedData_Get_Struct(self, stemmer_t, &stemmer_data_type, stemmer);
48
51
 
49
52
  // in case called multiple times
@@ -55,28 +58,33 @@ static VALUE stemmer_initialize(int argc, VALUE* argv, VALUE self)
55
58
  rb_raise(rb_eArgError, "unknown language: %s", algorithm);
56
59
  }
57
60
 
61
+ // must be placed after last use of algorithm
62
+ RB_GC_GUARD(language);
63
+
58
64
  return self;
59
65
  }
60
66
 
61
67
  static VALUE stemmer_stem(VALUE self, VALUE value)
62
68
  {
63
- stemmer_t *stemmer;
69
+ stemmer_t* stemmer;
64
70
  TypedData_Get_Struct(self, stemmer_t, &stemmer_data_type, stemmer);
65
71
 
66
72
  Check_Type(value, T_STRING);
67
73
 
68
- const sb_symbol * word = (const sb_symbol *) RSTRING_PTR(value);
69
- int size = (int) RSTRING_LEN(value);
70
- const sb_symbol * pointer_out = sb_stemmer_stem(stemmer->stemmer, word, size);
74
+ const sb_symbol* word = (const sb_symbol*) RSTRING_PTR(value);
75
+ long size = RSTRING_LEN(value);
76
+ if (size > INT_MAX)
77
+ rb_raise(rb_eArgError, "string exceeds max length");
78
+ const sb_symbol* pointer_out = sb_stemmer_stem(stemmer->stemmer, word, (int) size);
71
79
 
72
- return rb_utf8_str_new_cstr((char *) pointer_out);
80
+ return rb_utf8_str_new_cstr((char*) pointer_out);
73
81
  }
74
82
 
75
83
  static VALUE stemmer_languages(VALUE klass)
76
84
  {
77
85
  VALUE out = rb_ary_new();
78
86
 
79
- const char **language = sb_stemmer_list();
87
+ const char** language = sb_stemmer_list();
80
88
  while (*language != NULL) {
81
89
  rb_ary_push(out, rb_utf8_str_new_cstr(*language));
82
90
  language++;
@@ -87,10 +95,10 @@ static VALUE stemmer_languages(VALUE klass)
87
95
 
88
96
  void Init_ext(void)
89
97
  {
90
- VALUE rb_mMittens = rb_define_module("Mittens");
91
- VALUE rb_cStemmer = rb_define_class_under(rb_mMittens, "Stemmer", rb_cObject);
92
- rb_define_alloc_func(rb_cStemmer, stemmer_allocate);
93
- rb_define_method(rb_cStemmer, "initialize", stemmer_initialize, -1);
94
- rb_define_method(rb_cStemmer, "stem", stemmer_stem, 1);
95
- rb_define_singleton_method(rb_cStemmer, "languages", stemmer_languages, 0);
98
+ VALUE mMittens = rb_define_module("Mittens");
99
+ VALUE cStemmer = rb_define_class_under(mMittens, "Stemmer", rb_cObject);
100
+ rb_define_alloc_func(cStemmer, stemmer_allocate);
101
+ rb_define_method(cStemmer, "initialize", stemmer_initialize, -1);
102
+ rb_define_method(cStemmer, "stem", stemmer_stem, 1);
103
+ rb_define_singleton_method(cStemmer, "languages", stemmer_languages, 0);
96
104
  }
@@ -1,3 +1,3 @@
1
1
  module Mittens
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mittens
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane