ruby-changes:2831
From: ko1@a...
Date: 19 Dec 2007 16:36:41 +0900
Subject: [ruby-changes:2831] nobu - Ruby:r14322 (trunk): * parse.y (reg_named_capture_assign_iter): get rid of creating
nobu 2007-12-19 16:32:00 +0900 (Wed, 19 Dec 2007) New Revision: 14322 Modified files: trunk/ChangeLog trunk/parse.y Log: * parse.y (reg_named_capture_assign_iter): get rid of creating unnecessary ID. * parse.y (rb_enc_symname2_p): check for non-nul-terminated string. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/parse.y?r1=14322&r2=14321 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14322&r2=14321 Index: ChangeLog =================================================================== --- ChangeLog (revision 14321) +++ ChangeLog (revision 14322) @@ -1,7 +1,12 @@ -Wed Dec 19 16:26:35 2007 Nobuyoshi Nakada <nobu@r...> +Wed Dec 19 16:31:58 2007 Nobuyoshi Nakada <nobu@r...> * parse.y (reg_named_capture_assign_iter): remove C99 dependency. + * parse.y (reg_named_capture_assign_iter): get rid of creating + unnecessary ID. + + * parse.y (rb_enc_symname2_p): check for non-nul-terminated string. + Wed Dec 19 15:37:06 2007 Yukihiro Matsumoto <matz@r...> * insnhelper.ci (vm_yield_with_cfunc): call cfunc with Index: parse.y =================================================================== --- parse.y (revision 14321) +++ parse.y (revision 14322) @@ -445,6 +445,7 @@ #define reg_fragment_check(str,options) reg_fragment_check_gen(parser, str, options) static NODE *reg_named_capture_assign_gen(struct parser_params* parser, VALUE regexp, NODE *match); #define reg_named_capture_assign(regexp,match) reg_named_capture_assign_gen(parser,regexp,match) +int rb_enc_symname2_p(const char *, int, rb_encoding *); #else #define remove_begin(node) (node) #endif /* !RIPPER */ @@ -8494,6 +8495,9 @@ { reg_named_capture_assign_t *arg = (reg_named_capture_assign_t*)arg0; struct parser_params* parser = arg->parser; + rb_encoding *enc = arg->enc; + int len = name_end - name; + const char *s = (const char *)name; ID var; arg->num++; @@ -8503,12 +8507,12 @@ arg->fail_block = NEW_BEGIN(0); } - var = rb_intern3((const char *)name, name_end-name, arg->enc); - if (!is_local_id(var)) { - compile_error(PARSER_ARG "named capture with a non local variable - %s", - rb_id2name(var)); + if (!(len && rb_enc_islower(*name, enc) && rb_enc_symname2_p(s, len, enc))) { + compile_error(PARSER_ARG "named capture with a non local variable - %.*s", + len, name); return ST_CONTINUE; } + var = rb_intern3(s, len, enc); if (dvar_defined(var) || local_id(var)) { rb_warningS("named capture conflicts a local variable - %s", rb_id2name(var)); @@ -8796,8 +8800,14 @@ int rb_enc_symname_p(const char *name, rb_encoding *enc) { + return rb_enc_symname2_p(name, strlen(name), enc); +} + +int +rb_enc_symname2_p(const char *name, int len, rb_encoding *enc) +{ const char *m = name; - const char *e = m + strlen(m); + const char *e = m + len; int localid = Qfalse; if (!m) return Qfalse; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml