From: "Nobuyoshi.Nakada" Date: 2001-03-01T10:40:11+09:00 Subject: [ruby-dev:12329] Re: [ruby-list:28364] class definition extension なかだです。 At Wed, 28 Feb 2001 19:56:19 +0900 "Nobuyoshi.Nakada" wrote: > クラス指定が () 必須でよければルールだけで対応できそうな気も > しますが。 これだけなら楽なんですけどねぇ。甘過ぎ? Index: node.h =================================================================== RCS file: /cvs/ruby/src/ruby/node.h,v retrieving revision 1.21 diff -u -2 -p -r1.21 node.h --- node.h 2001/02/14 05:51:57 1.21 +++ node.h 2001/02/28 22:43:47 @@ -122,4 +122,5 @@ enum node_type { NODE_MEMO, NODE_IFUNC, + NODE_ACLASS, NODE_LAST }; @@ -312,4 +313,5 @@ typedef struct RNode { #define NEW_CLASS(n,b,s) rb_node_newnode(NODE_CLASS,n,NEW_CBODY(b),(s)) #define NEW_SCLASS(r,b) rb_node_newnode(NODE_SCLASS,r,NEW_CBODY(b),0) +#define NEW_ACLASS(r,b) rb_node_newnode(NODE_ACLASS,r,NEW_CBODY(b),0) #define NEW_MODULE(n,b) rb_node_newnode(NODE_MODULE,n,NEW_CBODY(b),0) #define NEW_COLON2(c,i) rb_node_newnode(NODE_COLON2,c,i,0) Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.159 diff -u -2 -p -r1.159 eval.c --- eval.c 2001/02/28 06:30:03 1.159 +++ eval.c 2001/02/28 23:03:47 @@ -3167,4 +3167,28 @@ rb_eval(self, n) break; + case NODE_ACLASS: + { + VALUE klass; + + if (NIL_P(ruby_class)) { + rb_raise(rb_eTypeError, "no outer class/module"); + } + klass = rb_eval(self, node->nd_head); + if (TYPE(klass) != T_CLASS) { + rb_raise(rb_eTypeError, "class name value is not a class object"); + } + if (rb_safe_level() >= 4) { + rb_raise(rb_eSecurityError, "extending class prohibited"); + } + rb_clear_cache(); + if (ruby_wrapper) { + rb_extend_object(klass, ruby_wrapper); + rb_include_module(klass, ruby_wrapper); + } + + result = module_setup(klass, node->nd_body); + } + break; + case NODE_DEFINED: { Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.89 diff -u -2 -p -r1.89 parse.y --- parse.y 2001/02/26 05:29:00 1.89 +++ parse.y 2001/02/28 22:43:13 @@ -1254,4 +1254,22 @@ primary : literal fixpos($$, $2); } + | kCLASS '(' expr opt_nl ')' + { + if (in_def || in_single) + yyerror("class definition in method body"); + class_nest++; + cref_push(); + local_push(); + $$ = ruby_sourceline; + } + compstmt + kEND + { + $$ = NEW_ACLASS($3, $7); + nd_set_line($$, $6); + local_pop(); + cref_pop(); + class_nest--; + } | kCLASS cname superclass { -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦