[ruby-dev:18820] deprecated method( Re: Different caller(0) in trace_func when NameError from toplevel between 1.6 and 1.7)
From:
nobu.nakada@...
Date:
2002-11-18 04:30:50 UTC
List:
ruby-dev #18820
なかだです。
At Fri, 15 Nov 2002 09:23:41 +0900,
Nobuyoshi-Nakada wrote:
> どっちかというと、メソッド定義の時点でマークしておいて、NODEの
> 書き換えはrb_call()あたりでやったほうがいいような気がしてます。
というわけで、Module#deprecate_methodその他諸々です。
Index: array.c
===================================================================
RCS file: /cvs/ruby/src/ruby/array.c,v
retrieving revision 1.97
diff -u -2 -p -I_WIN32 -INT -r1.97 array.c
--- array.c 3 Nov 2002 11:04:16 -0000 1.97
+++ array.c 18 Nov 2002 02:49:22 -0000
@@ -610,6 +610,4 @@ rb_ary_indexes(argc, argv, ary)
long i;
- rb_warn("Array#%s is deprecated; use Array#select",
- rb_id2name(rb_frame_last_func()));
new_ary = rb_ary_new2(argc);
for (i=0; i<argc; i++) {
@@ -1877,4 +1875,6 @@ Init_Array()
rb_define_method(rb_cArray, "indexes", rb_ary_indexes, -1);
rb_define_method(rb_cArray, "indices", rb_ary_indexes, -1);
+ rb_deprecate_method(rb_cArray, "indexes", "select", 1);
+ rb_deprecate_method(rb_cArray, "indices", "select", 1);
rb_define_method(rb_cArray, "become", rb_ary_replace, 1);
rb_define_method(rb_cArray, "join", rb_ary_join_m, -1);
Index: error.c
===================================================================
RCS file: /cvs/ruby/src/ruby/error.c,v
retrieving revision 1.51
diff -u -2 -p -I_WIN32 -INT -r1.51 error.c
--- error.c 3 Nov 2002 11:04:16 -0000 1.51
+++ error.c 18 Nov 2002 03:15:28 -0000
@@ -29,6 +29,7 @@ int ruby_nerrs;
static void
err_snprintf(buf, len, fmt, args)
- char *buf, *fmt;
+ char *buf;
long len;
+ const char *fmt;
va_list args;
{
@@ -1106,4 +1107,26 @@ err_append(s)
fputs("\n", stderr);
fflush(stderr);
+ }
+}
+
+void
+rb_deprecated(klass, old, new, now)
+ VALUE klass;
+ const char *old, *new;
+ int now;
+{
+ const char *classname, *be;
+
+ if (!now && !RTEST(ruby_verbose)) return;
+ if (!klass) klass = ruby_frame->last_class;
+ classname = rb_class2name(klass);
+ if (!old) old = rb_id2name(ruby_frame->last_func);
+ be = now ? "is" : "will be";
+ if (new) {
+ rb_warn("%s#%s %s deprecated; use %s#%s", classname, old,
+ be, classname, new);
+ }
+ else {
+ rb_warn("%s#%s %s deprecated", classname, old, be);
}
}
Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.353
diff -u -2 -p -I_WIN32 -INT -r1.353 eval.c
--- eval.c 14 Nov 2002 13:51:18 -0000 1.353
+++ eval.c 18 Nov 2002 04:22:56 -0000
@@ -1693,4 +1693,51 @@ rb_mod_undef_method(mod, name)
void
+rb_deprecate(klass, id, tobe, now)
+ VALUE klass;
+ ID id, tobe;
+ int now;
+{
+ VALUE origin;
+ NODE *orig, **body;
+
+ rb_frozen_class_p(klass);
+ if (klass == rb_cObject) {
+ rb_secure(4);
+ }
+ orig = search_method(klass, id, &origin);
+ if (!orig || !orig->nd_body) {
+ print_undef(klass, id);
+ }
+ body = &orig->nd_body;
+ if (nd_type(*body) == NODE_FBODY) { /* was alias */
+ body = &(*body)->nd_head;
+ }
+ *body = NEW_DEPR(*body, tobe, now);
+}
+
+void
+rb_deprecate_method(klass, oldname, newname, now)
+ VALUE klass;
+ const char *oldname, *newname;
+ int now;
+{
+ rb_deprecate(klass, oldname ? rb_intern(oldname) : 0,
+ newname ? rb_intern(newname) : 0, now);
+}
+
+static VALUE
+rb_mod_deprecate_method(argc, argv, mod)
+ int argc;
+ VALUE *argv;
+ VALUE mod;
+{
+ VALUE oldname, newname, now;
+
+ rb_scan_args(argc, argv, "12", &oldname, &newname, &now);
+ rb_deprecate(mod, rb_to_id(oldname), NIL_P(newname) ? 0 : rb_to_id(newname), RTEST(now));
+ return mod;
+}
+
+void
rb_alias(klass, name, def)
VALUE klass;
@@ -1748,4 +1795,29 @@ rb_mod_alias_method(mod, newname, oldnam
}
+void
+rb_deprecated_alias(klass, name, def, now)
+ VALUE klass;
+ ID name, def;
+ int now;
+{
+ rb_alias(klass, name, def);
+ rb_deprecate(klass, name, def, now);
+}
+
+static VALUE
+rb_mod_deprecated_alias(argc, argv, mod)
+ int argc;
+ VALUE *argv;
+ VALUE mod;
+{
+ VALUE depr, orig, now;
+ ID name, def;
+
+ if (rb_scan_args(argc, argv, "21", &depr, &orig, &now) == 2)
+ now = Qtrue;
+ rb_deprecated_alias(mod, rb_to_id(depr), rb_to_id(orig), RTEST(now));
+ return mod;
+}
+
static NODE*
copy_node_scope(node, rval)
@@ -4764,5 +4836,7 @@ rb_call(klass, recv, mid, argc, argv, sc
ID id = mid;
struct cache_entry *ent;
+ int direct = scope & 4;
+ scope &= ~4;
if (!klass) {
rb_raise(rb_eNotImpError, "method `%s' called on terminated object (0x%lx)",
@@ -4804,4 +4878,18 @@ rb_call(klass, recv, mid, argc, argv, sc
}
+ if (nd_type(body) == NODE_DEPR) {
+ rb_deprecated(klass, rb_id2name(mid), rb_id2name(body->nd_mid), body->nd_state);
+ if (body->nd_mid && !direct) {
+ switch (nd_type(ruby_current_node)) {
+ case NODE_CALL:
+ case NODE_FCALL:
+ case NODE_VCALL:
+ if (ruby_current_node->nd_mid == mid)
+ ruby_current_node->nd_mid = body->nd_mid;
+ }
+ }
+ body = body->nd_head;
+ }
+
return rb_call0(klass, recv, mid, id, argc, argv, body, noex & NOEX_NOSUPER);
}
@@ -4819,5 +4907,5 @@ rb_apply(recv, mid, args)
argv = ALLOCA_N(VALUE, argc);
MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc);
- return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1);
+ return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 5);
}
@@ -4834,5 +4922,5 @@ rb_f_send(argc, argv, recv)
vid = *argv++; argc--;
PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT);
- vid = rb_call(CLASS_OF(recv), recv, rb_to_id(vid), argc, argv, 1);
+ vid = rb_call(CLASS_OF(recv), recv, rb_to_id(vid), argc, argv, 5);
POP_ITER();
@@ -4877,5 +4965,5 @@ rb_funcall(recv, mid, n, va_alist)
}
- return rb_call(CLASS_OF(recv), recv, mid, n, argv, 1);
+ return rb_call(CLASS_OF(recv), recv, mid, n, argv, 5);
}
@@ -4887,5 +4975,5 @@ rb_funcall2(recv, mid, argc, argv)
const VALUE *argv;
{
- return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1);
+ return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 5);
}
@@ -4897,5 +4985,5 @@ rb_funcall3(recv, mid, argc, argv)
const VALUE *argv;
{
- return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 0);
+ return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 4);
}
@@ -4915,5 +5003,5 @@ rb_call_super(argc, argv)
result = rb_call(RCLASS(ruby_frame->last_class)->super,
ruby_frame->self, ruby_frame->last_func,
- argc, argv, 3);
+ argc, argv, 7);
POP_ITER();
@@ -6204,4 +6292,6 @@ Init_eval()
rb_define_private_method(rb_cModule, "alias_method", rb_mod_alias_method, 2);
rb_define_private_method(rb_cModule, "define_method", rb_mod_define_method, -1);
+ rb_define_private_method(rb_cModule, "deprecate_method", rb_mod_deprecate_method, -1);
+ rb_define_private_method(rb_cModule, "deprecated_alias", rb_mod_deprecated_alias, -1);
rb_define_singleton_method(rb_cModule, "nesting", rb_mod_nesting, 0);
Index: gc.c
===================================================================
RCS file: /cvs/ruby/src/ruby/gc.c,v
retrieving revision 1.112
diff -u -2 -p -I_WIN32 -INT -r1.112 gc.c
--- gc.c 29 Oct 2002 21:35:27 -0000 1.112
+++ gc.c 18 Nov 2002 03:14:25 -0000
@@ -1400,5 +1400,5 @@ add_final(os, proc)
VALUE os, proc;
{
- rb_warn("ObjectSpace::add_finalizer is deprecated; use define_finalizer");
+ rb_deprecated(0, 0, 0, 1);
if (!rb_obj_is_kind_of(proc, rb_cProc)) {
rb_raise(rb_eArgError, "wrong type argument %s (Proc required)",
@@ -1413,5 +1413,4 @@ rm_final(os, proc)
VALUE os, proc;
{
- rb_warn("ObjectSpace::remove_finalizer is deprecated; use undefine_finalizer");
rb_ary_delete(finalizers, proc);
return proc;
@@ -1421,5 +1420,4 @@ static VALUE
finals()
{
- rb_warn("ObjectSpace::finalizers is deprecated");
return finalizers;
}
@@ -1429,5 +1427,4 @@ call_final(os, obj)
VALUE os, obj;
{
- rb_warn("ObjectSpace::call_finalizer is deprecated; use define_finalizer");
need_call_final = 1;
FL_SET(obj, FL_FINALIZE);
@@ -1595,4 +1592,14 @@ Init_GC()
rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
+ {
+ VALUE klass = rb_mObSpace;
+ for (;;) {
+ rb_deprecate_method(klass, "remove_finalizer", "undefine_finalizer", 1);
+ rb_deprecate_method(klass, "finalizers", 0, 1);
+ rb_deprecate_method(klass, "call_finalizer", "define_finalizer", 1);
+ if (FL_TEST(klass, FL_SINGLETON)) break;
+ klass = rb_singleton_class(klass);
+ }
+ }
rb_define_module_function(rb_mObSpace, "define_finalizer", define_final, -1);
Index: hash.c
===================================================================
RCS file: /cvs/ruby/src/ruby/hash.c,v
retrieving revision 1.81
diff -u -2 -p -I_WIN32 -INT -r1.81 hash.c
--- hash.c 17 Oct 2002 16:13:44 -0000 1.81
+++ hash.c 18 Nov 2002 03:09:12 -0000
@@ -391,6 +391,4 @@ rb_hash_indexes(argc, argv, hash)
int i;
- rb_warn("Hash#%s is deprecated; use Hash#select",
- rb_id2name(rb_frame_last_func()));
indexes = rb_ary_new2(argc);
for (i=0; i<argc; i++) {
@@ -1541,6 +1539,4 @@ env_indexes(argc, argv)
VALUE indexes = rb_ary_new2(argc);
- rb_warn("ENV.%s is deprecated; use ENV.select",
- rb_id2name(rb_frame_last_func()));
for (i=0;i<argc;i++) {
char *v = 0;
@@ -1619,4 +1615,6 @@ Init_Hash()
rb_define_method(rb_cHash,"indexes", rb_hash_indexes, -1);
rb_define_method(rb_cHash,"indices", rb_hash_indexes, -1);
+ rb_deprecate_method(rb_cHash, "indexes", "select", 1);
+ rb_deprecate_method(rb_cHash, "indices", "select", 1);
rb_define_method(rb_cHash,"size", rb_hash_size, 0);
rb_define_method(rb_cHash,"length", rb_hash_size, 0);
@@ -1687,4 +1685,9 @@ Init_Hash()
rb_define_singleton_method(envtbl,"value?", env_has_value, 1);
rb_define_singleton_method(envtbl,"to_hash", env_to_hash, 0);
+ {
+ VALUE klass = rb_singleton_class(envtbl);
+ rb_deprecate_method(klass, "indexes", "select", 1);
+ rb_deprecate_method(klass, "indices", "select", 1);
+ }
rb_define_global_const("ENV", envtbl);
Index: intern.h
===================================================================
RCS file: /cvs/ruby/src/ruby/intern.h,v
retrieving revision 1.100
diff -u -2 -p -I_WIN32 -INT -r1.100 intern.h
--- intern.h 30 Oct 2002 08:04:31 -0000 1.100
+++ intern.h 18 Nov 2002 04:25:23 -0000
@@ -133,4 +133,5 @@ NORETURN(void rb_load_fail _((char*)));
NORETURN(void rb_error_frozen _((char*)));
void rb_check_frozen _((VALUE));
+void rb_deprecated _((VALUE, const char*, const char*, int));
/* eval.c */
EXTERN struct RNode *ruby_current_node;
@@ -144,4 +145,7 @@ void rb_clear_cache _((void));
void rb_alias _((VALUE, ID, ID));
void rb_attr _((VALUE,ID,int,int,int));
+void rb_deprecate _((VALUE, ID, ID, int));
+void rb_deprecated_alias _((VALUE, ID, ID, int));
+void rb_deprecate_method _((VALUE, const char*, const char*, int));
int rb_method_boundp _((VALUE, ID, int));
VALUE rb_dvar_defined _((ID));
Index: node.h
===================================================================
RCS file: /cvs/ruby/src/ruby/node.h,v
retrieving revision 1.37
diff -u -2 -p -I_WIN32 -INT -r1.37 node.h
--- node.h 7 Nov 2002 19:18:10 -0000 1.37
+++ node.h 18 Nov 2002 02:25:01 -0000
@@ -124,4 +124,5 @@ enum node_type {
NODE_IFUNC,
NODE_DSYM,
+ NODE_DEPR,
NODE_LAST
};
@@ -235,4 +236,5 @@ typedef struct RNode {
#define NEW_METHOD(n,x) rb_node_newnode(NODE_METHOD,x,n,0)
#define NEW_FBODY(n,i,o) rb_node_newnode(NODE_FBODY,n,i,o)
+#define NEW_DEPR(b,i,n) rb_node_newnode(NODE_DEPR,b,i,n)
#define NEW_DEFN(i,a,d,p) rb_node_newnode(NODE_DEFN,p,i,NEW_RFUNC(a,d))
#define NEW_DEFS(r,i,a,d) rb_node_newnode(NODE_DEFS,r,i,NEW_RFUNC(a,d))
Index: object.c
===================================================================
RCS file: /cvs/ruby/src/ruby/object.c,v
retrieving revision 1.94
diff -u -2 -p -I_WIN32 -INT -r1.94 object.c
--- object.c 3 Nov 2002 11:04:17 -0000 1.94
+++ object.c 18 Nov 2002 03:00:40 -0000
@@ -75,12 +75,4 @@ rb_obj_id(obj)
VALUE
-rb_obj_id_obsolete(obj)
- VALUE obj;
-{
- rb_warning("Object#id will be deprecated; use Object#object_id");
- return rb_obj_id(obj);
-}
-
-VALUE
rb_class_real(cl)
VALUE cl;
@@ -96,5 +88,5 @@ rb_obj_type(obj)
VALUE obj;
{
- rb_warn("Object#type is deprecated; use Object#class");
+ rb_deprecated(rb_cObject, "type", "class", 1);
return rb_class_real(CLASS_OF(obj));
}
@@ -1325,9 +1317,11 @@ Init_Object()
rb_define_method(rb_mKernel, "hash", rb_obj_id, 0);
- rb_define_method(rb_mKernel, "id", rb_obj_id_obsolete, 0);
+ rb_define_method(rb_mKernel, "id", rb_obj_id, 0);
rb_define_method(rb_mKernel, "__id__", rb_obj_id, 0);
rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
- rb_define_method(rb_mKernel, "type", rb_obj_type, 0);
+ rb_define_method(rb_mKernel, "type", rb_obj_class, 0);
rb_define_method(rb_mKernel, "class", rb_obj_class, 0);
+ rb_deprecate_method(rb_mKernel, "id", "object_id", 0);
+ rb_deprecate_method(rb_mKernel, "type", "class", 1);
rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦