[#15359] Timeout::Error — Jeremy Thurgood <jerith@...>

Good day,

41 messages 2008/02/05
[#15366] Re: Timeout::Error — Eric Hodel <drbrain@...7.net> 2008/02/06

On Feb 5, 2008, at 06:20 AM, Jeremy Thurgood wrote:

[#15370] Re: Timeout::Error — Jeremy Thurgood <jerith@...> 2008/02/06

Eric Hodel wrote:

[#15373] Re: Timeout::Error — Nobuyoshi Nakada <nobu@...> 2008/02/06

Hi,

[#15374] Re: Timeout::Error — Jeremy Thurgood <jerith@...> 2008/02/06

Nobuyoshi Nakada wrote:

[#15412] Re: Timeout::Error — Nobuyoshi Nakada <nobu@...> 2008/02/07

Hi,

[#15413] Re: Timeout::Error — Jeremy Thurgood <jerith@...> 2008/02/07

Nobuyoshi Nakada wrote:

[#15414] Re: Timeout::Error — Nobuyoshi Nakada <nobu@...> 2008/02/07

Hi,

[#15360] reopen: can't change access mode from "w+" to "w"? — Sam Ruby <rubys@...>

I ran 'rake test' on test/spec [1], using

16 messages 2008/02/05
[#15369] Re: reopen: can't change access mode from "w+" to "w"? — Nobuyoshi Nakada <nobu@...> 2008/02/06

Hi,

[#15389] STDIN encoding differs from default source file encoding — Dave Thomas <dave@...>

This seems strange:

21 messages 2008/02/06
[#15392] Re: STDIN encoding differs from default source file encoding — Yukihiro Matsumoto <matz@...> 2008/02/06

Hi,

[#15481] very bad character performance on ruby1.9 — "Eric Mahurin" <eric.mahurin@...>

I'd like to bring up the issue of how characters are represented in

16 messages 2008/02/10

[#15528] Test::Unit maintainer — Kouhei Sutou <kou@...>

Hi Nathaniel, Ryan,

22 messages 2008/02/13

[#15551] Proc#curry — ts <decoux@...>

21 messages 2008/02/14
[#15557] Re: [1.9] Proc#curry — David Flanagan <david@...> 2008/02/15

ts wrote:

[#15558] Re: [1.9] Proc#curry — Yukihiro Matsumoto <matz@...> 2008/02/15

Hi,

[#15560] Re: Proc#curry — Trans <transfire@...> 2008/02/15

[#15585] Ruby M17N meeting summary — Martin Duerst <duerst@...>

This is a rough translation of the Japanese meeting summary

19 messages 2008/02/18

[#15596] possible bug in regexp lexing — Ryan Davis <ryand-ruby@...>

current:

17 messages 2008/02/19

[#15678] Re: [ANN] MacRuby — "Rick DeNatale" <rick.denatale@...>

On 2/27/08, Laurent Sansonetti <laurent.sansonetti@gmail.com> wrote:

18 messages 2008/02/28
[#15679] Re: [ANN] MacRuby — "Laurent Sansonetti" <laurent.sansonetti@...> 2008/02/28

On Thu, Feb 28, 2008 at 6:33 AM, Rick DeNatale <rick.denatale@gmail.com> wrote:

[#15680] Re: [ANN] MacRuby — Yukihiro Matsumoto <matz@...> 2008/02/28

Hi,

[#15683] Re: [ANN] MacRuby — "Laurent Sansonetti" <laurent.sansonetti@...> 2008/02/28

On Thu, Feb 28, 2008 at 1:51 PM, Yukihiro Matsumoto <matz@ruby-lang.org> wrote:

[PATCH] Re: defining a method with attached data

From: Paul Brannan <pbrannan@...>
Date: 2008-02-25 15:54:13 UTC
List: ruby-core #15659
Attached is a patch to add this feature directly into YARV without a
hack.

Usage:

[pbrannan@zaphod md]$ cat md.c
#include <ruby.h>

VALUE foo(VALUE self)
{
  rb_p(rb_method_data());
}

void Init_md()
{
  rb_define_method_with_data(rb_mKernel, "foo", foo, 0, INT2NUM(42));
}

[pbrannan@zaphod md]$ ruby1.9 -rmd -e foo
42

Paul

Attachments (1)

method_data.patch (3 KB, text/x-diff)
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 15196)
+++ include/ruby/ruby.h	(working copy)
@@ -700,9 +700,12 @@
 
 #define RUBY_METHOD_FUNC(func) ((VALUE (*)(ANYARGS))func)
 void rb_define_method(VALUE,const char*,VALUE(*)(ANYARGS),int);
+void rb_define_method_with_data(VALUE,const char*,VALUE(*)(ANYARGS),int,VALUE);
 void rb_define_module_function(VALUE,const char*,VALUE(*)(ANYARGS),int);
 void rb_define_global_function(const char*,VALUE(*)(ANYARGS),int);
 
+VALUE rb_method_data(void);
+
 void rb_undef_method(VALUE,const char*);
 void rb_define_alias(VALUE,const char*,const char*);
 void rb_define_attr(VALUE,const char*,int,int);
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 15196)
+++ vm_core.h	(working copy)
@@ -326,6 +326,7 @@
     VALUE method_class;         /* cfp[11] saved in special case */
     VALUE prof_time_self;       /* cfp[12] */
     VALUE prof_time_chld;       /* cfp[13] */
+    VALUE method_data;          /* cfp[14] */
 } rb_control_frame_t;
 
 typedef struct {
Index: gc.c
===================================================================
--- gc.c	(revision 15196)
+++ gc.c	(working copy)
@@ -920,6 +920,7 @@
 	  case NODE_FCALL:
 	  case NODE_DEFN:
 	  case NODE_ARGS_AUX:
+	  case NODE_CFUNC:
 	    ptr = (VALUE)obj->as.node.u3.node;
 	    goto again;
 
@@ -985,7 +986,6 @@
 
 	  case NODE_ZARRAY:	/* - */
 	  case NODE_ZSUPER:
-	  case NODE_CFUNC:
 	  case NODE_VCALL:
 	  case NODE_GVAR:
 	  case NODE_LVAR:
Index: class.c
===================================================================
--- class.c	(revision 15196)
+++ class.c	(working copy)
@@ -13,6 +13,7 @@
 #include "ruby/signal.h"
 #include "ruby/node.h"
 #include "ruby/st.h"
+#include "vm_core.h"
 #include <ctype.h>
 
 extern st_table *rb_class_tbl;
@@ -767,6 +768,19 @@
 }
 
 void
+rb_define_method_with_data(VALUE klass, char const * name, VALUE (*func)(ANYARGS), int argc, VALUE data)
+{
+    rb_add_method(klass, rb_intern(name), NEW_NODE(NODE_CFUNC,func,argc,data), NOEX_PUBLIC);
+}
+
+VALUE
+rb_method_data(void)
+{
+  rb_control_frame_t *cfp = ruby_current_thread->cfp;
+  return cfp->method_data;
+}
+
+void
 rb_define_protected_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc)
 {
     rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), NOEX_PROTECTED);
Index: vm.c
===================================================================
--- vm.c	(revision 15196)
+++ vm.c	(working copy)
@@ -453,6 +453,7 @@
 
 	    cfp->method_id = id;
 	    cfp->method_class = klass;
+	    cfp->method_data = body->nd_cval;
 
 	    val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
 
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 15196)
+++ vm_insnhelper.c	(working copy)
@@ -366,6 +366,7 @@
 
 	cfp->method_id = id;
 	cfp->method_class = klass;
+	cfp->method_data = mn->nd_cval;
 
 	reg_cfp->sp -= num + 1;
 

In This Thread