[前][次][番号順一覧][スレッド一覧]

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

[前][次][番号順一覧][スレッド一覧]