utilrb 1.2 → 1.3

Sign up to get free protection for your applications and to get access to all the features.
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