From: nobu.nokada@... Date: 2004-12-09T12:04:15+09:00 Subject: Re: [ ruby-Bugs-1173 ] Incorrect escaping in strings produced by String::inspect Hi, At Thu, 9 Dec 2004 02:36:20 +0900, noreply@rubyforge.org wrote in [ruby-core:03922]: > The following causes a runtime syntax error: > eval('Foo #@ bar'.inspect) > > I'm not sure if that use-case is supposed to be supported, > but I think a number of applications rely on it. Does this patch help? Index: string.c =================================================================== RCS file: /cvs/ruby/src/ruby/string.c,v retrieving revision 1.227 diff -U2 -p -d -r1.227 string.c --- string.c 29 Nov 2004 06:09:39 -0000 1.227 +++ string.c 9 Dec 2004 01:57:11 -0000 @@ -2571,4 +2571,6 @@ rb_str_to_s(str) } +#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{')) + /* * call-seq: @@ -2599,5 +2601,5 @@ rb_str_inspect(str) p += len - 1; } - else if (c == '"'|| c == '\\') { + else if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) { s[0] = '\\'; s[1] = c; rb_str_buf_cat(result, s, 2); @@ -2671,9 +2673,13 @@ rb_str_dump(str) case '"': case '\\': case '\n': case '\r': - case '\t': case '\f': case '#': + case '\t': case '\f': case '\013': case '\007': case '\033': len += 2; break; + case '#': + len += IS_EVSTR(p, pend) ? 2 : 1; + break; + default: if (ISPRINT(c)) { @@ -2700,5 +2706,5 @@ rb_str_dump(str) } else if (c == '#') { - *q++ = '\\'; + if (IS_EVSTR(p, pend)) *q++ = '\\'; *q++ = '#'; } -- Nobu Nakada