From: <gg...@us...> - 2007-05-19 08:45:14
|
Revision: 9824 http://swig.svn.sourceforge.net/swig/?rev=9824&view=rev Author: gga73 Date: 2007-05-19 01:45:09 -0700 (Sat, 19 May 2007) Log Message: ----------- Dramatically sped up all STL containers when they contain swig::GC_VALUEs. Modified Paths: -------------- trunk/Lib/ruby/rubyclasses.swg Modified: trunk/Lib/ruby/rubyclasses.swg =================================================================== --- trunk/Lib/ruby/rubyclasses.swg 2007-05-18 23:32:55 UTC (rev 9823) +++ trunk/Lib/ruby/rubyclasses.swg 2007-05-19 08:45:09 UTC (rev 9824) @@ -82,6 +82,9 @@ namespace swig { class GC_VALUE { protected: + // Hash of all GC_VALUE's currently in use + static VALUE _hash; + VALUE _obj; static ID hash_id; @@ -118,6 +121,22 @@ public: + static void initialize() + { + if ( _hash == Qnil ) + { + _hash = rb_hash_new(); + rb_gc_register_address( &_hash ); + } + } + + // this function is never called. Provided for symmetry only. + static void cleanup() + { + rb_gc_unregister_address( &_hash ); + } + + GC_VALUE() :_obj( Qnil ) { GC_register(); @@ -146,12 +165,14 @@ void GC_register() { - rb_gc_register_address( &_obj ); + if ( TYPE(_obj) != T_DATA ) return; + rb_hash_aset( _hash, _obj, Qtrue ); } void GC_unregister() { - rb_gc_unregister_address( &_obj ); + if ( TYPE(_obj) != T_DATA ) return; + rb_hash_delete( _hash, _obj ); } operator VALUE() const @@ -297,6 +318,9 @@ ID GC_VALUE::lshift_id = rb_intern("<<"); ID GC_VALUE::rshift_id = rb_intern(">>"); + + VALUE GC_VALUE::_hash = Qnil; + typedef GC_VALUE LANGUAGE_OBJ; } // namespace swig @@ -304,6 +328,9 @@ %} +%init { + swig::GC_VALUE::initialize(); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |