summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-15 00:33:12 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-15 00:33:12 +0000
commit3f3bcc697e989078e946ac01313d5e36cfaa3d7d (patch)
tree36649235e647f56dd2c59a78a7fc19dfe9ec711b
parentcc2c313903ff348f588a121238e1be532ad58fba (diff)
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--README4
-rw-r--r--README.jp2
-rw-r--r--eval.c115
-rw-r--r--object.c2
5 files changed, 107 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d8a11cb85..f84351e965 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Jul 15 01:32:34 2000 Yukihiro Matsumoto <matz@netlab.co.jp>
+
+ * eval.c (Init_eval): should prohibit `include' and
+ `module_function' for class Class. The latter was very
+ dangerous.
+
Fri Jul 14 17:19:59 2000 WATANABE Hirofumi <eban@os.rim.or.jp>
* cygwin/GNUmakefile.in: use miniruby instead of sed.
diff --git a/README b/README
index 44244927ab..5794f5daf6 100644
--- a/README
+++ b/README
@@ -74,7 +74,7 @@ the error log and machine/OS type, to help others.
* Copying
-Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.co.jp>.
+Ruby is copyrighted free software by Yukihiro Matsumoto <matz@zetabits.com>.
You can redistribute it and/or modify it under either the terms of the GPL
(see COPYING file), or the conditions below:
@@ -143,7 +143,7 @@ The URL of the Ruby home-page is:
Feel free to send comments and bug reports to the author. Here is the
author's latest mail address:
- matz@netlab.co.jp
+ matz@zetabits.com
-------------------------------------------------------
created at: Thu Aug 3 11:57:36 JST 1995
diff --git a/README.jp b/README.jp
index 1697f7a41d..e4c8a42eaf 100644
--- a/README.jp
+++ b/README.jp
@@ -191,7 +191,7 @@ Public License)または以下に示す条件で本プログラムを再配布で
* 著者
-コメント,バグレポートその他は matz@netlab.co.jp まで.
+コメント,バグレポートその他は matz@zetabis.com まで.
-------------------------------------------------------
created at: Thu Aug 3 11:57:36 JST 1995
Local variables:
diff --git a/eval.c b/eval.c
index 8a2072322b..c399cc7fd2 100644
--- a/eval.c
+++ b/eval.c
@@ -78,6 +78,7 @@ static VALUE rb_f_block_given_p _((void));
static VALUE block_pass _((VALUE,NODE*));
static VALUE rb_cMethod;
static VALUE method_proc _((VALUE));
+static VALUE rb_cUnboundMethod;
static int scope_vmode;
#define SCOPE_PUBLIC 0
@@ -5557,6 +5558,9 @@ Init_eval()
rb_define_method(rb_cModule, "module_eval", rb_mod_module_eval, -1);
rb_define_method(rb_cModule, "class_eval", rb_mod_module_eval, -1);
+ rb_undef_method(rb_cClass, "include");
+ rb_undef_method(rb_cClass, "module_function");
+
rb_define_private_method(rb_cModule, "remove_method", rb_mod_remove_method, 1);
rb_define_private_method(rb_cModule, "undef_method", rb_mod_undef_method, 1);
rb_define_private_method(rb_cModule, "alias_method", rb_mod_alias_method, 2);
@@ -6094,22 +6098,20 @@ bm_mark(data)
}
static VALUE
-rb_obj_method(obj, vid)
- VALUE obj;
- VALUE vid;
+mnew(klass, obj, id, mklass)
+ VALUE klass, obj, mklass;
+ ID id;
{
VALUE method;
- VALUE klass = CLASS_OF(obj);
- ID id;
NODE *body;
int noex;
struct METHOD *data;
-
- id = rb_to_id(vid);
+ VALUE oklass = klass;
+ ID oid = id;
again:
if ((body = rb_get_method_body(&klass, &id, &noex)) == 0) {
- return rb_undefined(obj, rb_to_id(vid), 0, 0, 0);
+ print_undef(oklass, oid);
}
if (nd_type(body) == NODE_ZSUPER) {
@@ -6117,14 +6119,14 @@ rb_obj_method(obj, vid)
goto again;
}
- method = Data_Make_Struct(rb_cMethod, struct METHOD, bm_mark, free, data);
+ method = Data_Make_Struct(mklass, struct METHOD, bm_mark, free, data);
data->klass = klass;
data->recv = obj;
data->id = id;
data->body = body;
- data->oklass = CLASS_OF(obj);
- data->oid = rb_to_id(vid);
- if (OBJ_TAINTED(obj)) {
+ data->oklass = oklass;
+ data->oid = oid;
+ if (OBJ_TAINTED(obj) || OBJ_TAINTED(klass)) {
OBJ_TAINT(method);
}
@@ -6132,6 +6134,22 @@ rb_obj_method(obj, vid)
}
static VALUE
+rb_obj_method(obj, vid)
+ VALUE obj;
+ VALUE vid;
+{
+ return mnew(CLASS_OF(obj), obj, rb_to_id(vid), rb_cMethod);
+}
+
+static VALUE
+rb_mod_method(mod, vid)
+ VALUE mod;
+ VALUE vid;
+{
+ return mnew(mod, 0, rb_to_id(vid), rb_cUnboundMethod);
+}
+
+static VALUE
method_clone(self)
VALUE self;
{
@@ -6139,7 +6157,7 @@ method_clone(self)
struct METHOD *orig, *data;
Data_Get_Struct(self, struct METHOD, orig);
- clone = Data_Make_Struct(rb_cMethod,struct METHOD,bm_mark,free,data);
+ clone = Data_Make_Struct(CLASS_OF(self),struct METHOD,bm_mark,free,data);
CLONESETUP(clone, self);
*data = *orig;
@@ -6147,10 +6165,10 @@ method_clone(self)
}
static VALUE
-method_call(argc, argv, method)
+mcall(argc, argv, method, recv)
int argc;
VALUE *argv;
- VALUE method;
+ VALUE method, recv;
{
VALUE result;
struct METHOD *data;
@@ -6160,12 +6178,12 @@ method_call(argc, argv, method)
Data_Get_Struct(method, struct METHOD, data);
PUSH_ITER(rb_block_given_p()?ITER_PRE:ITER_NOT);
PUSH_TAG(PROT_NONE);
- if (OBJ_TAINTED(data->recv) || OBJ_TAINTED(method)) {
+ if (OBJ_TAINTED(recv) || OBJ_TAINTED(method)) {
OBJ_TAINT(method);
if (ruby_safe_level < 4) ruby_safe_level = 4;
}
if ((state = EXEC_TAG()) == 0) {
- result = rb_call0(data->klass, data->recv, data->id,
+ result = rb_call0(data->klass, recv, data->id,
argc, argv, data->body, 0);
}
POP_TAG();
@@ -6176,6 +6194,42 @@ method_call(argc, argv, method)
}
static VALUE
+method_call(argc, argv, method)
+ int argc;
+ VALUE *argv;
+ VALUE method;
+{
+ struct METHOD *data;
+
+ Data_Get_Struct(method, struct METHOD, data);
+ return mcall(argc, argv, method, data->recv);
+}
+
+static VALUE
+umethod_call(argc, argv, method)
+ int argc;
+ VALUE *argv;
+ VALUE method;
+{
+ struct METHOD *data;
+
+ if (argc < 1) {
+ rb_raise(rb_eArgError, "wrong # of arguments");
+ }
+
+ Data_Get_Struct(method, struct METHOD, data);
+ if (FL_TEST(CLASS_OF(argv[0]), FL_SINGLETON) &&
+ st_lookup(RCLASS(CLASS_OF(argv[0]))->m_tbl, data->oid, 0)) {
+ rb_raise(rb_eTypeError, "method `%s' overridden", rb_id2name(data->oid));
+ }
+ if (!rb_obj_is_instance_of(argv[0], data->oklass)) {
+ rb_raise(rb_eTypeError, "first argument must be instance of %s",
+ rb_class2name(data->oklass));
+ }
+ return mcall(argc-1, argv+1, method, argv[0]);
+}
+
+static VALUE
method_arity(method)
VALUE method;
{
@@ -6247,7 +6301,7 @@ mproc()
}
static VALUE
-mcall(args, method)
+bmcall(args, method)
VALUE args, method;
{
if (TYPE(args) == T_ARRAY) {
@@ -6257,10 +6311,27 @@ mcall(args, method)
}
static VALUE
+umcall(args, method)
+ VALUE args, method;
+{
+ if (TYPE(args) == T_ARRAY) {
+ return umethod_call(RARRAY(args)->len, RARRAY(args)->ptr, method);
+ }
+ return umethod_call(1, &args, method);
+}
+
+static VALUE
method_proc(method)
VALUE method;
{
- return rb_iterate(mproc, 0, mcall, method);
+ return rb_iterate(mproc, 0, bmcall, method);
+}
+
+static VALUE
+umethod_proc(method)
+ VALUE method;
+{
+ return rb_iterate(mproc, 0, umcall, method);
}
void
@@ -6292,6 +6363,12 @@ Init_Proc()
rb_define_method(rb_cMethod, "to_s", method_inspect, 0);
rb_define_method(rb_cMethod, "to_proc", method_proc, 0);
rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
+
+ rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cMethod);
+ rb_define_method(rb_cUnboundMethod, "call", umethod_call, -1);
+ rb_define_method(rb_cUnboundMethod, "[]", umethod_call, -1);
+ rb_define_method(rb_cUnboundMethod, "to_proc", umethod_proc, 0);
+ rb_define_method(rb_cModule, "instance_method", rb_mod_method, 1);
}
static VALUE rb_eThreadError;
diff --git a/object.c b/object.c
index 1c0b1bf828..5ca7624ee1 100644
--- a/object.c
+++ b/object.c
@@ -231,6 +231,7 @@ rb_obj_is_instance_of(obj, c)
switch (TYPE(c)) {
case T_MODULE:
case T_CLASS:
+ case T_ICLASS:
break;
case T_NIL:
@@ -266,6 +267,7 @@ rb_obj_is_kind_of(obj, c)
switch (TYPE(c)) {
case T_MODULE:
case T_CLASS:
+ case T_ICLASS:
break;
default: