summaryrefslogtreecommitdiff
path: root/ruby/src
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2015-06-08 19:51:15 -0400
committerMark Spruiell <mes@zeroc.com>2015-06-08 19:51:15 -0400
commita837dd8c0410c4f5d7b885091c6ab51768f3572e (patch)
treec1baf27c91066f09c8358499f629dd9dea862f63 /ruby/src
parentRemoved work-around for JRE 8 bug, now fixed (diff)
downloadice-a837dd8c0410c4f5d7b885091c6ab51768f3572e.tar.bz2
ice-a837dd8c0410c4f5d7b885091c6ab51768f3572e.tar.xz
ice-a837dd8c0410c4f5d7b885091c6ab51768f3572e.zip
ICE-6553 - Ruby segfault in slicing/objects test
Diffstat (limited to 'ruby/src')
-rw-r--r--ruby/src/IceRuby/Types.cpp19
-rw-r--r--ruby/src/IceRuby/Types.h2
2 files changed, 21 insertions, 0 deletions
diff --git a/ruby/src/IceRuby/Types.cpp b/ruby/src/IceRuby/Types.cpp
index 18bf6ca517b..a0272a86967 100644
--- a/ruby/src/IceRuby/Types.cpp
+++ b/ruby/src/IceRuby/Types.cpp
@@ -2417,6 +2417,11 @@ IceRuby::ProxyInfo::destroy()
IceRuby::ObjectWriter::ObjectWriter(VALUE object, ObjectMap* objectMap) :
_object(object), _map(objectMap)
{
+ //
+ // Mark the object as in use for the lifetime of this wrapper.
+ //
+ rb_gc_register_address(&_object);
+
volatile VALUE cls = CLASS_OF(object);
volatile VALUE type = callRuby(rb_const_get, cls, rb_intern("ICE_TYPE"));
assert(!NIL_P(type));
@@ -2424,6 +2429,11 @@ IceRuby::ObjectWriter::ObjectWriter(VALUE object, ObjectMap* objectMap) :
assert(_info);
}
+IceRuby::ObjectWriter::~ObjectWriter()
+{
+ rb_gc_unregister_address(&_object);
+}
+
void
IceRuby::ObjectWriter::ice_preMarshal()
{
@@ -2498,6 +2508,15 @@ IceRuby::ObjectWriter::writeMembers(const Ice::OutputStreamPtr& os, const DataMe
IceRuby::ObjectReader::ObjectReader(VALUE object, const ClassInfoPtr& info) :
_object(object), _info(info)
{
+ //
+ // Mark the object as in use for the lifetime of this wrapper.
+ //
+ rb_gc_register_address(&_object);
+}
+
+IceRuby::ObjectReader::~ObjectReader()
+{
+ rb_gc_unregister_address(&_object);
}
void
diff --git a/ruby/src/IceRuby/Types.h b/ruby/src/IceRuby/Types.h
index e816d38758f..6a849d257ab 100644
--- a/ruby/src/IceRuby/Types.h
+++ b/ruby/src/IceRuby/Types.h
@@ -453,6 +453,7 @@ class ObjectWriter : public Ice::ObjectWriter
public:
ObjectWriter(VALUE, ObjectMap*);
+ virtual ~ObjectWriter();
virtual void ice_preMarshal();
@@ -475,6 +476,7 @@ class ObjectReader : public Ice::ObjectReader
public:
ObjectReader(VALUE, const ClassInfoPtr&);
+ virtual ~ObjectReader();
virtual void ice_postUnmarshal();