Index: eval.c
===================================================================
RCS file: //sharui/cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.473
diff -u -2 -p -r1.473 eval.c
--- eval.c	3 Jul 2003 11:00:17 -0000	1.473
+++ eval.c	3 Jul 2003 17:22:45 -0000
@@ -104,5 +104,4 @@ static VALUE rb_cMethod;
 static VALUE method_call _((int, VALUE*, VALUE));
 static VALUE rb_cUnboundMethod;
-static VALUE umethod_bind _((VALUE, VALUE));
 static VALUE rb_mod_define_method _((int, VALUE*, VALUE));
 
@@ -4908,5 +4907,5 @@ rb_call0(klass, recv, id, oid, argc, arg
 
       case NODE_DMETHOD:
-	result = method_call(argc, argv, umethod_bind(body->nd_cval, recv));
+	result = method_call(argc, argv, rb_umethod_bind(body->nd_cval, recv));
 	break;
 
@@ -7258,4 +7257,48 @@ bm_mark(data)
 }
 
+VALUE
+rb_method_new(obj, func, argc)
+    VALUE obj;
+    VALUE (*func)();
+    int argc;
+{
+    VALUE method;
+    NODE *body;
+    struct METHOD *data;
+
+    method = Data_Make_Struct(rb_cMethod, struct METHOD, bm_mark, free, data);
+    data->rklass = data->klass = CLASS_OF(obj);
+    data->recv = obj;
+    data->oid = data->id = 0;
+    data->body = NEW_CFUNC(func, argc);
+    OBJ_INFECT(method, obj);
+
+    return method;
+}
+
+VALUE
+rb_umethod_new(klass, func, argc)
+    VALUE klass;
+    VALUE (*func)();
+    int argc;
+{
+    VALUE method;
+    NODE *body;
+    struct METHOD *data;
+
+    if (!rb_obj_is_kind_of(klass, rb_cModule)) {
+	rb_raise(rb_eTypeError, "wrong argument type %s (expected Class/Module)",
+		 rb_obj_classname(klass));
+    }
+    method = Data_Make_Struct(rb_cUnboundMethod, struct METHOD, bm_mark, free, data);
+    data->rklass = data->klass = klass;
+    data->recv = Qundef;
+    data->oid = data->id = 0;
+    data->body = NEW_CFUNC(func, argc);
+    OBJ_INFECT(method, klass);
+
+    return method;
+}
+
 static VALUE
 mnew(klass, obj, id, mklass)
@@ -7318,6 +7361,6 @@ method_eq(method, other)
 }
 
-static VALUE
-method_unbind(obj)
+VALUE
+rb_method_unbind(obj)
     VALUE obj;
 {
@@ -7345,18 +7388,34 @@ umethod_unbind(obj)
 }
 
+VALUE
+rb_obj_method(obj, id)
+    VALUE obj;
+    ID id;
+{
+    return mnew(CLASS_OF(obj), obj, id, rb_cMethod);
+}
+
+VALUE
+rb_mod_method(mod, id)
+    VALUE mod;
+    ID id;
+{
+    return mnew(mod, Qundef, id, rb_cUnboundMethod);
+}
+
 static VALUE
-rb_obj_method(obj, vid)
+obj_method(obj, vid)
     VALUE obj;
     VALUE vid;
 {
-    return mnew(CLASS_OF(obj), obj, rb_to_id(vid), rb_cMethod);
+    return rb_obj_method(obj, rb_to_id(vid));
 }
 
 static VALUE
-rb_mod_method(mod, vid)
+mod_method(mod, vid)
     VALUE mod;
     VALUE vid;
 {
-    return mnew(mod, Qundef, rb_to_id(vid), rb_cUnboundMethod);
+    return rb_mod_method(mod, rb_to_id(vid));
 }
 
@@ -7406,6 +7465,6 @@ method_call(argc, argv, method)
 }
 
-static VALUE
-umethod_bind(method, recv)
+VALUE
+rb_umethod_bind(method, recv)
     VALUE method, recv;
 {
@@ -7417,5 +7476,5 @@ umethod_bind(method, recv)
 	    rb_raise(rb_eTypeError, "singleton method called for a different object");
 	}
-	if (FL_TEST(CLASS_OF(recv), FL_SINGLETON) &&
+	if (data->oid && FL_TEST(CLASS_OF(recv), FL_SINGLETON) &&
 	    st_lookup(RCLASS(CLASS_OF(recv))->m_tbl, data->oid, 0)) {
 	    rb_raise(rb_eTypeError, "method `%s' overridden", rb_id2name(data->oid));
@@ -7512,6 +7571,8 @@ method_inspect(method)
 	}
     }
-    rb_str_buf_cat2(str, sharp);
-    rb_str_buf_cat2(str, rb_id2name(data->oid));
+    if (data->oid) {
+	rb_str_buf_cat2(str, sharp);
+	rb_str_buf_cat2(str, rb_id2name(data->oid));
+    }
     rb_str_buf_cat2(str, ">");
 
@@ -7553,6 +7614,6 @@ rb_proc_new(func, val)
 }
 
-static VALUE
-method_proc(method)
+VALUE
+rb_method_proc(method)
     VALUE method;
 {
@@ -7607,5 +7668,5 @@ rb_mod_define_method(argc, argv, mod)
     }
     if (RDATA(body)->dmark == (RUBY_DATA_FUNC)bm_mark) {
-	node = NEW_DMETHOD(method_unbind(body));
+	node = NEW_DMETHOD(rb_method_unbind(body));
     }
     else if (RDATA(body)->dmark == (RUBY_DATA_FUNC)blk_mark) {
@@ -7683,7 +7744,7 @@ Init_Proc()
     rb_define_method(rb_cMethod, "inspect", method_inspect, 0);
     rb_define_method(rb_cMethod, "to_s", method_inspect, 0);
-    rb_define_method(rb_cMethod, "to_proc", method_proc, 0);
-    rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
-    rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
+    rb_define_method(rb_cMethod, "to_proc", rb_method_proc, 0);
+    rb_define_method(rb_cMethod, "unbind", rb_method_unbind, 0);
+    rb_define_method(rb_mKernel, "method", obj_method, 1);
 
     rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject);
@@ -7695,6 +7756,6 @@ Init_Proc()
     rb_define_method(rb_cUnboundMethod, "inspect", method_inspect, 0);
     rb_define_method(rb_cUnboundMethod, "to_s", method_inspect, 0);
-    rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
-    rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
+    rb_define_method(rb_cUnboundMethod, "bind", rb_umethod_bind, 1);
+    rb_define_method(rb_cModule, "instance_method", mod_method, 1);
 }
 
Index: ruby.h
===================================================================
RCS file: //sharui/cvs/ruby/src/ruby/ruby.h,v
retrieving revision 1.84
diff -u -2 -p -r1.84 ruby.h
--- ruby.h	23 Jun 2003 06:52:39 -0000	1.84
+++ ruby.h	3 Jul 2003 17:22:46 -0000
@@ -538,4 +538,11 @@ VALUE rb_yield_values __((int n, ...));
 int rb_block_given_p _((void));
 VALUE rb_iterate _((VALUE(*)(VALUE),VALUE,VALUE(*)(ANYARGS),VALUE));
+VALUE rb_method_new _((VALUE,VALUE(*)(ANYARGS),int));
+VALUE rb_umethod_new _((VALUE,VALUE(*)(ANYARGS),int));
+VALUE rb_obj_method _((VALUE,ID));
+VALUE rb_mod_method _((VALUE,ID));
+VALUE rb_method_proc _((VALUE));
+VALUE rb_method_unbind _((VALUE));
+VALUE rb_umethod_bind _((VALUE,VALUE));
 VALUE rb_rescue _((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE));
 VALUE rb_rescue2 __((VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE,...));
