From 1843d8abbc62f0b148c6b05ee0091619bfd5e332 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 11 May 2005 01:11:52 +0000 Subject: [PATCH] * struct.c (make_struct): allow const_id for accessor names. [ruby-core:04585] * eval.c (rb_attr): check if attribute name is local_id or const_id. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8421 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- .cvsignore | 2 ++ ChangeLog | 8 ++++++++ eval.c | 7 ++++--- misc/ruby-mode.el | 2 +- object.c | 2 +- struct.c | 4 ++-- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.cvsignore b/.cvsignore index 52a5620133..69a30e5f81 100644 --- a/.cvsignore +++ b/.cvsignore @@ -5,6 +5,8 @@ *~ .ccmalloc .ppack +.ext +.rbconfig.time COPYING.LIB ChangeLog.pre-alpha ChangeLog.pre1_1 diff --git a/ChangeLog b/ChangeLog index 294fb035aa..826978e51a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6016,6 +6016,14 @@ Thu Mar 18 21:44:38 2004 Masatoshi SEKI * lib/drb/drb.rb: backport drb.rb 1.16. +Fri Mar 18 17:49:51 2005 Yukihiro Matsumoto + + * struct.c (make_struct): allow const_id for accessor names. + [ruby-core:04585] + + * eval.c (rb_attr): check if attribute name is local_id or + const_id. + Thu Mar 18 16:22:38 2004 Yukihiro Matsumoto * eval.c (proc_eq): avoid false positive by using scope and diff --git a/eval.c b/eval.c index e6a927b21f..990aa5da47 100644 --- a/eval.c +++ b/eval.c @@ -622,6 +622,9 @@ rb_attr(klass, id, read, write, ex) } } + if (!rb_is_local_id(id) && !rb_is_const_id(id)) { + rb_name_error(id, "invalid attribute name `%s'", rb_id2name(id)); + } name = rb_id2name(id); if (!name) { rb_raise(rb_eArgError, "argument needs to be symbol or string"); @@ -633,9 +636,7 @@ rb_attr(klass, id, read, write, ex) rb_add_method(klass, id, NEW_IVAR(attriv), noex); } if (write) { - sprintf(buf, "%s=", name); - id = rb_intern(buf); - rb_add_method(klass, id, NEW_ATTRSET(attriv), noex); + rb_add_method(klass, rb_id_attrset(id), NEW_ATTRSET(attriv), noex); } } diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index 0218fe55ce..61d865060c 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -398,7 +398,7 @@ The variable ruby-indent-level controls the amount of indentation. ((and (not (eobp)) (ruby-expr-beg 'expr-qstr) (not (looking-at "%=")) - (looking-at "%[QqrxWw]?\\(.\\)")) + (looking-at "%[QqrxWw]?\\([^a-zA-Z0-9 \t\n]\\)")) (goto-char (match-beginning 1)) (setq expand (not (memq (char-before) '(?q ?w)))) (setq w (match-string 1)) diff --git a/object.c b/object.c index f291931466..21615cd3ea 100644 --- a/object.c +++ b/object.c @@ -2471,7 +2471,7 @@ VALUE ruby_top_self; * Creating a new Name * * Classes, modules, and objects are interrelated. In the diagram - * that follows, the arrows represent inheritance, and the + * that follows, the vertical arrows represent inheritance, and the * parentheses meta-classes. All metaclasses are instances * of the class `Class'. * diff --git a/struct.c b/struct.c index 8521195b71..59de2ea618 100644 --- a/struct.c +++ b/struct.c @@ -212,7 +212,7 @@ make_struct(name, members, klass) rb_define_singleton_method(nstr, "members", rb_struct_s_members_m, 0); for (i=0; i< RARRAY(members)->len; i++) { ID id = SYM2ID(RARRAY(members)->ptr[i]); - if (rb_is_local_id(id)) { + if (rb_is_local_id(id) || rb_is_const_id(id)) { if (i<10) { rb_define_method_id(nstr, id, ref_func[i], 0); } @@ -488,7 +488,7 @@ inspect_struct(s) } slot = RARRAY(members)->ptr[i]; id = SYM2ID(slot); - if (rb_is_local_id(id)) { + if (rb_is_local_id(id) || rb_is_const_id(id)) { p = rb_id2name(id); rb_str_cat2(str, p); }