[prev in list] [next in list] [prev in thread] [next in thread]
List: ruby-core
Subject: defining a method with attached data
From: Paul Brannan <pbrannan () atdesk ! com>
Date: 2008-02-24 13:22:07
Message-ID: 20080224132211.GA21414 () atdesk ! com
[Download RAW message or body]
For various reasons, I need to be able to attached some piece of data to
a method defined in C. The data should:
1. follow the method around if it is aliased
2. be eligible for garbage collection if the method is undefined
3. not interfere with the method in any way
I used to use define_method with a proc, but this prevents my method
from taking a block parameter.
I currently store the data in the unused member of NODE_CFUNC, but this
causes a memory leak (I have no way of knowing when the method becomes
unused).
This morning, I came up with this idea:
static void define_method_with_data(
VALUE klass,
ID id,
VALUE (*cfunc)(ANYARGS),
int arity,
VALUE data)
{
#if RUBY_VERSION_CODE >= 180
VALUE origin = rb_class_boot(klass);
#else
VALUE origin = rb_class_new(klass);
#endif
FL_SET(origin, FL_SINGLETON);
RBASIC(origin)->klass = data;
NODE * node = NEW_FBODY(NEW_CFUNC(cfunc, arity), id, origin);
rb_add_method(klass, id, node, NOEX_PUBLIC);
}
Ruby treats the new method as an alias for another method. I can
retrieve the attached data like this:
static VALUE get_method_data()
{
return RBASIC(ruby_frame->last_class)->klass;
}
Though I feel there is some problem with doing this, I haven't been able
to find one.
Any thoughts on this? Is there another way to do it?
Paul
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic