THIRFT-5367 Fix crashes when using Ruby compaction GC
Client: rb
Patch: Stan Hu
This closes #2347
diff --git a/lib/rb/ext/compact_protocol.c b/lib/rb/ext/compact_protocol.c
index c0f46b9..fab2170 100644
--- a/lib/rb/ext/compact_protocol.c
+++ b/lib/rb/ext/compact_protocol.c
@@ -567,6 +567,7 @@
static void Init_constants() {
thrift_compact_protocol_class = rb_const_get(thrift_module, rb_intern("CompactProtocol"));
+ rb_global_variable(&thrift_compact_protocol_class);
VERSION = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION")));
VERSION_MASK = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION_MASK")));
diff --git a/lib/rb/ext/struct.c b/lib/rb/ext/struct.c
index e3aa855..79cbabe 100644
--- a/lib/rb/ext/struct.c
+++ b/lib/rb/ext/struct.c
@@ -698,14 +698,23 @@
rb_define_method(struct_module, "read", rb_thrift_struct_read, 1);
thrift_union_class = rb_const_get(thrift_module, rb_intern("Union"));
+ rb_global_variable(&thrift_union_class);
rb_define_method(thrift_union_class, "write", rb_thrift_union_write, 1);
rb_define_method(thrift_union_class, "read", rb_thrift_union_read, 1);
setfield_id = rb_intern("@setfield");
+ rb_global_variable(&setfield_id);
+
setvalue_id = rb_intern("@value");
+ rb_global_variable(&setvalue_id);
to_s_method_id = rb_intern("to_s");
+ rb_global_variable(&to_s_method_id);
+
name_to_id_method_id = rb_intern("name_to_id");
+ rb_global_variable(&name_to_id_method_id);
+
sorted_field_ids_method_id = rb_intern("sorted_field_ids");
+ rb_global_variable(&sorted_field_ids_method_id);
}
diff --git a/lib/rb/ext/thrift_native.c b/lib/rb/ext/thrift_native.c
index 3430b7c..d535454 100644
--- a/lib/rb/ext/thrift_native.c
+++ b/lib/rb/ext/thrift_native.c
@@ -112,10 +112,19 @@
void Init_thrift_native() {
// cached classes
thrift_module = rb_const_get(rb_cObject, rb_intern("Thrift"));
+ rb_global_variable(&thrift_module);
+
thrift_bytes_module = rb_const_get(thrift_module, rb_intern("Bytes"));
+ rb_global_variable(&thrift_bytes_module);
+
thrift_types_module = rb_const_get(thrift_module, rb_intern("Types"));
+ rb_global_variable(&thrift_types_module);
+
rb_cSet = rb_const_get(rb_cObject, rb_intern("Set"));
+ rb_global_variable(&rb_cSet);
+
protocol_exception_class = rb_const_get(thrift_module, rb_intern("ProtocolException"));
+ rb_global_variable(&protocol_exception_class);
// Init ttype constants
TTYPE_BOOL = FIX2INT(rb_const_get(thrift_types_module, rb_intern("BOOL")));
@@ -194,6 +203,14 @@
class_sym = ID2SYM(rb_intern("class"));
binary_sym = ID2SYM(rb_intern("binary"));
+ rb_global_variable(&type_sym);
+ rb_global_variable(&name_sym);
+ rb_global_variable(&key_sym);
+ rb_global_variable(&value_sym);
+ rb_global_variable(&element_sym);
+ rb_global_variable(&class_sym);
+ rb_global_variable(&binary_sym);
+
Init_struct();
Init_binary_protocol_accelerated();
Init_compact_protocol();