From ec14c2c9b925f6add71f7f4d25e0a281f8adb252 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 12 Aug 2005 07:17:36 +0000 Subject: * numeric.c (fix_equal, fix_cmp, fix_gt, fix_ge, fix_lt, fix_le): reduce coercing when a method knows about a operand type. [ruby-dev:26789] * lib/delegate.rb: simplifies Delegator classes; SimpleDelegator now uses method_missing for all methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/delegate.rb | 76 +++++++++++++++++++++++---------------------------------- lib/weakref.rb | 11 ++++++--- 2 files changed, 39 insertions(+), 48 deletions(-) (limited to 'lib') diff --git a/lib/delegate.rb b/lib/delegate.rb index 1d0ebed07a..83aaf292a5 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -17,44 +17,27 @@ # end class Delegator + preserved = ["__id__", "object_id", "__send__", "respond_to?"] + instance_methods.each do |m| + next if preserved.include?(m) + undef_method m + end def initialize(obj) - preserved = ::Kernel.public_instance_methods(false) - preserved -= ["to_s","to_a","inspect","==","=~","==="] - for t in self.class.ancestors - preserved |= t.public_instance_methods(false) - preserved |= t.private_instance_methods(false) - preserved |= t.protected_instance_methods(false) - break if t == Delegator - end - preserved << "singleton_method_added" - for method in obj.methods - next if preserved.include? method - begin - eval <<-EOS - def self.#{method}(*args, &block) - begin - __getobj__.__send__(:#{method}, *args, &block) - rescue Exception - $@.delete_if{|s| /:in `__getobj__'$/ =~ s} #` - $@.delete_if{|s| /^\\(eval\\):/ =~ s} - ::Kernel::raise - end - end - EOS - rescue SyntaxError - raise NameError, "invalid identifier %s" % method, caller(4) - end - end + __setobj__(obj) end - alias initialize_methods initialize def method_missing(m, *args) - target = self.__getobj__ - unless target.respond_to?(m) - super(m, *args) + begin + target = self.__getobj__ + unless target.respond_to?(m) + super(m, *args) + end + target.__send__(m, *args) + rescue Exception + $@.delete_if{|s| /^#{__FILE__}:\d+:in `method_missing'$/ =~ s} #` + ::Kernel::raise end - target.__send__(m, *args) end def respond_to?(m) @@ -66,21 +49,19 @@ class Delegator raise NotImplementedError, "need to define `__getobj__'" end + def __setobj__(obj) + raise NotImplementedError, "need to define `__setobj__'" + end + def marshal_dump __getobj__ end def marshal_load(obj) - initialize_methods(obj) + __setobj__(obj) end end class SimpleDelegator [ref,...] @@id_rev_map = {} # ref -> obj - @@final = lambda{|id| + @@final = lambda {|id| + printf "final: %p\n", id __old_status = Thread.critical Thread.critical = true begin @@ -42,6 +43,7 @@ class WeakRef