diff --git a/encoding.h b/encoding.h index eb9620732..1cfb78d96 100644 --- a/encoding.h +++ b/encoding.h @@ -291,6 +291,7 @@ str_set_valid_encoding(rb_str_t *self, bool status) VALUE mr_enc_s_is_compatible(VALUE klass, SEL sel, VALUE str1, VALUE str2); VALUE rb_str_intern_fast(VALUE str); +VALUE rstr_aref(VALUE str, SEL sel, int argc, VALUE *argv); // The following functions should always been prefered over anything else, // especially if this "else" is RSTRING_PTR and RSTRING_LEN. diff --git a/string.c b/string.c index 95b060ef2..8d7ac6b1e 100644 --- a/string.c +++ b/string.c @@ -1640,7 +1640,7 @@ rb_str_subpat(VALUE str, VALUE re, int nth) return Qnil; } -static VALUE +VALUE rstr_aref(VALUE str, SEL sel, int argc, VALUE *argv) { if (argc == 2) { diff --git a/symbol.c b/symbol.c index cfc22eca6..a0256c18d 100644 --- a/symbol.c +++ b/symbol.c @@ -607,6 +607,20 @@ rsym_empty(VALUE sym, SEL sel) return rb_str_chars_len(RSYM(sym)->str) == 0 ? Qtrue : Qfalse; } +/* + * call-seq: + * sym[idx] => char + * sym[b, n] => char + * + * Returns sym.to_s[]. + */ + +static VALUE +rsym_aref(VALUE sym, SEL sel, int argc, VALUE *argv) +{ + return rstr_aref(RSYM(sym)->str, sel, argc, argv); +} + static CFIndex rsym_imp_length(void *rcv, SEL sel) { @@ -643,6 +657,7 @@ Init_Symbol(void) rb_objc_define_method(rb_cSymbol, "intern", rsym_to_sym, 0); rb_objc_define_method(rb_cSymbol, "to_sym", rsym_to_sym, 0); rb_objc_define_method(rb_cSymbol, "empty?", rsym_empty, 0); + rb_objc_define_method(rb_cSymbol, "[]", rsym_aref, -1); // Cocoa primitives. rb_objc_install_method2((Class)rb_cSymbol, "length",