utilrb 1.2 → 1.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.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === Version 1.3
2
+
3
+ * added Utilrb::WeakRef, a much leaner version of the standard WeakRef:
4
+ implemented in C++, not a subclass of Delegate (delegate is very costly)
5
+
1
6
  === Version 1.2
2
7
 
3
8
  * compatibility with ruby 1.9. Some feature are specific 1.8:
data/Manifest.txt CHANGED
@@ -65,6 +65,7 @@ lib/utilrb/time/to_hms.rb
65
65
  lib/utilrb/unbound_method.rb
66
66
  lib/utilrb/unbound_method/call.rb
67
67
  lib/utilrb/value_set.rb
68
+ patches/gc_live_objects.patch
68
69
  test/data/test_pkgconfig.pc
69
70
  test/test_array.rb
70
71
  test/test_config.rb
data/ext/utilrb_ext.cc CHANGED
@@ -8,6 +8,8 @@
8
8
  #include "ruby_internals-1.8.h"
9
9
  #endif
10
10
 
11
+ static VALUE mUtilrb;
12
+
11
13
  using namespace std;
12
14
 
13
15
  static VALUE enumerable_each_uniq_i(VALUE i, VALUE* memo)
@@ -116,11 +118,17 @@ static VALUE proc_line(VALUE self)
116
118
 
117
119
  #endif
118
120
 
121
+ static VALUE kernel_is_immediate(VALUE klass, VALUE object)
122
+ { return IMMEDIATE_P(object) ? Qtrue : Qfalse; }
123
+
119
124
  extern "C" void Init_value_set();
120
125
  extern "C" void Init_swap();
126
+ extern "C" void Init_weakref(VALUE mUtilrb);
121
127
 
122
128
  extern "C" void Init_utilrb_ext()
123
129
  {
130
+ mUtilrb = rb_define_module("Utilrb");
131
+
124
132
  rb_define_method(rb_mEnumerable, "each_uniq", RUBY_METHOD_FUNC(enumerable_each_uniq), 0);
125
133
  rb_define_method(rb_mKernel, "is_singleton?", RUBY_METHOD_FUNC(kernel_is_singleton_p), 0);
126
134
  #ifndef RUBY_IS_19
@@ -130,7 +138,10 @@ extern "C" void Init_utilrb_ext()
130
138
  rb_define_method(rb_cIO, "clearerr", RUBY_METHOD_FUNC(io_clearerr), 0);
131
139
  #endif
132
140
 
141
+ rb_define_singleton_method(rb_mKernel, "immediate?", RUBY_METHOD_FUNC(kernel_is_immediate), 1);
142
+
133
143
  Init_value_set();
134
144
  Init_swap();
145
+ Init_weakref(mUtilrb);
135
146
  }
136
147
 
data/lib/utilrb/common.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Utilrb
2
2
  unless defined? Utilrb::VERSION
3
- VERSION = "1.2"
3
+ VERSION = "1.3"
4
4
  RUBY_IS_19 = (RUBY_VERSION >= "1.9")
5
5
  end
6
6
 
@@ -0,0 +1,71 @@
1
+ --- gc.c 2006-08-25 10:12:46.000000000 +0200
2
+ +++ gc.c.new 2007-01-13 12:39:38.383681000 +0100
3
+ @@ -88,6 +88,8 @@ static void run_final();
4
+ static VALUE nomem_error;
5
+ static void garbage_collect();
6
+
7
+ +static unsigned long live_objects = 0;
8
+ +
9
+ void
10
+ rb_memerror()
11
+ {
12
+ @@ -401,6 +398,7 @@ rb_newobj()
13
+ RANY(obj)->file = ruby_sourcefile;
14
+ RANY(obj)->line = ruby_sourceline;
15
+ #endif
16
+ + live_objects++;
17
+ return obj;
18
+ }
19
+
20
+ @@ -1053,8 +1051,8 @@ gc_sweep()
21
+ RVALUE *p, *pend, *final_list;
22
+ int freed = 0;
23
+ int i;
24
+ - unsigned long live = 0;
25
+ unsigned long free_min = 0;
26
+ + live_objects = 0;
27
+
28
+ for (i = 0; i < heaps_used; i++) {
29
+ free_min += heaps[i].limit;
30
+ @@ -1113,7 +1111,7 @@ gc_sweep()
31
+ }
32
+ else {
33
+ RBASIC(p)->flags &= ~FL_MARK;
34
+ - live++;
35
+ + live_objects++;
36
+ }
37
+ p++;
38
+ }
39
+ @@ -1131,7 +1129,7 @@ gc_sweep()
40
+ }
41
+ }
42
+ if (malloc_increase > malloc_limit) {
43
+ - malloc_limit += (malloc_increase - malloc_limit) * (double)live / (live + freed);
44
+ + malloc_limit += (malloc_increase - malloc_limit) * (double)live_objects / (live_objects + freed);
45
+ if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
46
+ }
47
+ malloc_increase = 0;
48
+ @@ -2003,6 +2001,15 @@ rb_obj_id(VALUE obj)
49
+ return (VALUE)((long)obj|FIXNUM_FLAG);
50
+ }
51
+
52
+ +/* call-seq:
53
+ + * GC.live_objects => number
54
+ + *
55
+ + * Returns the count of objects currently allocated
56
+ + */
57
+ +static
58
+ +VALUE rb_gc_live_objects(VALUE self)
59
+ +{ return INT2FIX(live_objects); }
60
+ +
61
+ /*
62
+ * The <code>GC</code> module provides an interface to Ruby's mark and
63
+ * sweep garbage collection mechanism. Some of the underlying methods
64
+ @@ -2027,6 +2034,7 @@ Init_GC()
65
+ rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1);
66
+ rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
67
+ rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
68
+ + rb_define_module_function(rb_mObSpace, "live_objects", rb_gc_live_objects, 0);
69
+
70
+ rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
71
+ rb_define_module_function(rb_mObSpace, "undefine_finalizer", undefine_final, 1);
@@ -8,7 +8,7 @@ class TC_PkgConfig < Test::Unit::TestCase
8
8
  ENV['PKG_CONFIG_PATH'] = File.join(File.expand_path(File.dirname(__FILE__)), 'data')
9
9
  end
10
10
  def teardown
11
- ENV['PKG_CONFIG_PATH'] = @old_pkg_config_path
11
+ ENV.delete('PKG_CONFIG_PATH')
12
12
  end
13
13
 
14
14
  PkgConfig = Utilrb::PkgConfig
@@ -0,0 +1,55 @@
1
+ require 'test/unit/testcase'
2
+ require 'utilrb/weakref'
3
+
4
+ Utilrb.require_ext('TC_WeakRef') do
5
+ class TC_WeakRef < Test::Unit::TestCase
6
+ WeakRef = Utilrb::WeakRef
7
+ def test_normal
8
+ obj = Object.new
9
+ ref = Utilrb::WeakRef.new(obj)
10
+
11
+ assert_equal(obj, ref.get)
12
+ end
13
+
14
+ def test_initialize_validation
15
+ assert_raises(ArgumentError) { Utilrb::WeakRef.new(nil) }
16
+ assert_raises(ArgumentError) { Utilrb::WeakRef.new(5) }
17
+
18
+ ref = WeakRef.new(Object.new)
19
+ assert_raises(ArgumentError) { Utilrb::WeakRef.new(ref) }
20
+ end
21
+
22
+ def create_deep_ref(lvl)
23
+ if lvl == 0
24
+ obj = Object.new
25
+ refs = (1..100).map { WeakRef.new(obj) }
26
+ return refs, obj.object_id
27
+ else
28
+ create_deep_ref(lvl - 1)
29
+ end
30
+ end
31
+
32
+ def create_deep_obj(lvl)
33
+ if lvl == 0
34
+ ref = WeakRef.new(obj = Object.new)
35
+ return obj, ref.object_id
36
+ else
37
+ create_deep_obj(lvl - 1)
38
+ end
39
+ end
40
+
41
+ def test_finalization
42
+ refs, obj_id = create_deep_ref(100)
43
+ GC.start
44
+ for ref in refs
45
+ assert_raises(WeakRef::RefError) { ref.get }
46
+ end
47
+ assert_equal(nil, WeakRef.refcount(obj_id))
48
+
49
+ obj, ref_id = create_deep_obj(100)
50
+ GC.start
51
+ assert_raises(RangeError) { ObjectSpace._id2ref(ref_id) }
52
+ end
53
+ end
54
+ end
55
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utilrb
3
3
  version: !ruby/object:Gem::Version
4
- version: "1.2"
4
+ version: "1.3"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-07 00:00:00 +02:00
12
+ date: 2008-06-14 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -37,7 +37,7 @@ dependencies:
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.5.1
40
+ version: 1.5.3
41
41
  version:
42
42
  description: == What is Utilrb ? Utilrb is yet another Ruby toolkit, in the spirit of facets. It includes all the standard class extensions I use in my own projects like Genom.rb. == Installation The only dependency Utilrb has is flexmock if you want to run tests. It is available as a gem, so you can run gem install flexmock == Utilrb's C extension Utilrb includes a C extension in ext/. It is optional, but some of the functionalities will be disabled if it is not present. Trying to require a file in which there is a C-only feature will yield a warning on STDOUT.
43
43
  email:
@@ -119,6 +119,7 @@ files:
119
119
  - lib/utilrb/unbound_method.rb
120
120
  - lib/utilrb/unbound_method/call.rb
121
121
  - lib/utilrb/value_set.rb
122
+ - patches/gc_live_objects.patch
122
123
  - test/data/test_pkgconfig.pc
123
124
  - test/test_array.rb
124
125
  - test/test_config.rb
@@ -180,6 +181,7 @@ test_files:
180
181
  - test/test_gc.rb
181
182
  - test/test_array.rb
182
183
  - test/test_enumerable.rb
184
+ - test/test_weakref.rb
183
185
  - test/test_hash.rb
184
186
  - test/test_objectstats.rb
185
187
  - test/test_pkgconfig.rb