summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-04-07 08:34:10 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-04-07 08:34:10 +0000
commitba06b1a81f81e089849c7c877eba7b1d3618b126 (patch)
tree57e77c2ade50f201b4aafdc071cf86fb95eb7016 /class.c
parentf8fc9136223c83c2791566d3efa52843f89aa127 (diff)
dynamic (nested) local variables
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@151 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r--class.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/class.c b/class.c
index 41a0b504da..40db68beb2 100644
--- a/class.c
+++ b/class.c
@@ -285,7 +285,7 @@ ins_methods_i(key, body, ary)
NODE *body;
VALUE ary;
{
- if ((body->nd_noex&NOEX_PRIVATE) == 0) {
+ if ((body->nd_noex&(NOEX_PRIVATE|NOEX_PROTECTED)) == 0) {
VALUE name = str_new2(rb_id2name(key));
if (!ary_includes(ary, name)) {
@@ -303,6 +303,30 @@ ins_methods_i(key, body, ary)
}
static int
+ins_methods_prot_i(key, body, ary)
+ ID key;
+ NODE *body;
+ VALUE ary;
+{
+ if (!body->nd_body) {
+ ary_push(ary, Qnil);
+ ary_push(ary, str_new2(rb_id2name(key)));
+ }
+ else if (body->nd_noex & NOEX_PROTECTED) {
+ VALUE name = str_new2(rb_id2name(key));
+
+ if (!ary_includes(ary, name)) {
+ ary_push(ary, name);
+ }
+ }
+ else if (nd_type(body->nd_body) == NODE_ZSUPER) {
+ ary_push(ary, Qnil);
+ ary_push(ary, str_new2(rb_id2name(key)));
+ }
+ return ST_CONTINUE;
+}
+
+static int
ins_methods_priv_i(key, body, ary)
ID key;
NODE *body;
@@ -366,6 +390,18 @@ class_instance_methods(argc, argv, mod)
}
VALUE
+class_protected_instance_methods(argc, argv, mod)
+ int argc;
+ VALUE *argv;
+ VALUE mod;
+{
+ VALUE option;
+
+ rb_scan_args(argc, argv, "01", &option);
+ return method_list(mod, RTEST(option), ins_methods_prot_i);
+}
+
+VALUE
class_private_instance_methods(argc, argv, mod)
int argc;
VALUE *argv;
@@ -429,6 +465,17 @@ rb_define_method(klass, name, func, argc)
}
void
+rb_define_protected_method(klass, name, func, argc)
+ VALUE klass;
+ char *name;
+ VALUE (*func)();
+ int argc;
+{
+ rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc),
+ NOEX_PROTECTED|NOEX_CFUNC);
+}
+
+void
rb_define_private_method(klass, name, func, argc)
VALUE klass;
char *name;