[macruby-changes] [3641] MacRuby/branches/icu
source_changes at macosforge.org
source_changes at macosforge.org
Fri Feb 26 18:29:46 PST 2010
Revision: 3641
http://trac.macosforge.org/projects/ruby/changeset/3641
Author: lsansonetti at apple.com
Date: 2010-02-26 18:29:44 -0800 (Fri, 26 Feb 2010)
Log Message:
-----------
misc fixes
Modified Paths:
--------------
MacRuby/branches/icu/encoding.h
MacRuby/branches/icu/re.cpp
MacRuby/branches/icu/string.c
MacRuby/branches/icu/symbol.c
Modified: MacRuby/branches/icu/encoding.h
===================================================================
--- MacRuby/branches/icu/encoding.h 2010-02-27 01:17:20 UTC (rev 3640)
+++ MacRuby/branches/icu/encoding.h 2010-02-27 02:29:44 UTC (rev 3641)
@@ -291,7 +291,6 @@
}
VALUE mr_enc_s_is_compatible(VALUE klass, SEL sel, VALUE str1, VALUE str2);
-VALUE str_inspect(rb_str_t *str, bool dump);
VALUE rb_str_intern_fast(VALUE str);
// The following functions should always been prefered over anything else,
Modified: MacRuby/branches/icu/re.cpp
===================================================================
--- MacRuby/branches/icu/re.cpp 2010-02-27 01:17:20 UTC (rev 3640)
+++ MacRuby/branches/icu/re.cpp 2010-02-27 02:29:44 UTC (rev 3641)
@@ -653,11 +653,45 @@
static VALUE
regexp_inspect(VALUE rcv, SEL sel)
{
- return regexp_source(rcv, 0);
+ VALUE str = rb_str_new2("/");
+ rb_str_concat(str, regexp_source(rcv, 0));
+ rb_str_cat2(str, "/");
+ // TODO: add options there.
+ return str;
}
/*
* call-seq:
+ * rxp.to_s => str
+ *
+ * Returns a string containing the regular expression and its options (using the
+ * <code>(?opts:source)</code> notation. This string can be fed back in to
+ * <code>Regexp::new</code> to a regular expression with the same semantics as
+ * the original. (However, <code>Regexp#==</code> may not return true when
+ * comparing the two, as the source of the regular expression itself may
+ * differ, as the example shows). <code>Regexp#inspect</code> produces a
+ * generally more readable version of <i>rxp</i>.
+ *
+ * r1 = /ab+c/ix #=> /ab+c/ix
+ * s1 = r1.to_s #=> "(?ix-m:ab+c)"
+ * r2 = Regexp.new(s1) #=> /(?ix-m:ab+c)/
+ * r1 == r2 #=> false
+ * r1.source #=> "ab+c"
+ * r2.source #=> "(?ix-m:ab+c)"
+ */
+
+static VALUE
+regexp_to_s(VALUE rcv, SEL sel)
+{
+ VALUE str = rb_str_new2("(?:");
+ // TODO: add options there.
+ rb_str_concat(str, regexp_source(rcv, 0));
+ rb_str_cat2(str, ")");
+ return str;
+}
+
+/*
+ * call-seq:
* rxp.casefold? => true or false
*
* Returns the value of the case-insensitive flag.
@@ -709,6 +743,76 @@
return INT2FIX(rb_reg_options(rcv));
}
+static VALUE
+match_getter(void)
+{
+ VALUE match = rb_backref_get();
+ if (NIL_P(match)) {
+ return Qnil;
+ }
+ rb_match_busy(match);
+ return match;
+}
+
+static void
+match_setter(VALUE val)
+{
+ if (!NIL_P(val)) {
+ Check_Type(val, T_MATCH);
+ }
+ rb_backref_set(val);
+}
+
+static VALUE
+last_match_getter(void)
+{
+ return rb_reg_last_match(rb_backref_get());
+}
+
+static VALUE
+prematch_getter(void)
+{
+ return rb_reg_match_pre(rb_backref_get());
+}
+
+static VALUE
+postmatch_getter(void)
+{
+ return rb_reg_match_post(rb_backref_get());
+}
+
+static VALUE
+last_paren_match_getter(void)
+{
+ return rb_reg_match_last(rb_backref_get());
+}
+
+static VALUE
+kcode_getter(void)
+{
+ rb_warn("variable $KCODE is no longer effective");
+ return Qnil;
+}
+
+static void
+kcode_setter(VALUE val, ID id)
+{
+ rb_warn("variable $KCODE is no longer effective; ignored");
+}
+
+static VALUE
+ignorecase_getter(void)
+{
+ rb_warn("variable $= is no longer effective");
+ return Qfalse;
+}
+
+static void
+ignorecase_setter(VALUE val, ID id)
+{
+ rb_warn("variable $= is no longer effective; ignored");
+}
+
/*
* Document-class: Regexp
*
@@ -726,18 +830,21 @@
{
rb_eRegexpError = rb_define_class("RegexpError", rb_eStandardError);
-#if 0
- rb_define_virtual_variable("$~", match_getter, match_setter);
- rb_define_virtual_variable("$&", last_match_getter, 0);
- rb_define_virtual_variable("$`", prematch_getter, 0);
- rb_define_virtual_variable("$'", postmatch_getter, 0);
- rb_define_virtual_variable("$+", last_paren_match_getter, 0);
+#define DEFINE_GVAR(name, getter, setter) \
+ rb_define_virtual_variable(name, (VALUE (*)(...))getter, \
+ (void (*)(...))setter)
- rb_define_virtual_variable("$=", ignorecase_getter, ignorecase_setter);
- rb_define_virtual_variable("$KCODE", kcode_getter, kcode_setter);
- rb_define_virtual_variable("$-K", kcode_getter, kcode_setter);
-#endif
+ DEFINE_GVAR("$~", match_getter, match_setter);
+ DEFINE_GVAR("$&", last_match_getter, 0);
+ DEFINE_GVAR("$`", prematch_getter, 0);
+ DEFINE_GVAR("$'", postmatch_getter, 0);
+ DEFINE_GVAR("$+", last_paren_match_getter, 0);
+ DEFINE_GVAR("$=", ignorecase_getter, ignorecase_setter);
+ DEFINE_GVAR("$KCODE", kcode_getter, kcode_setter);
+ DEFINE_GVAR("$-K", kcode_getter, kcode_setter);
+#undef DEFINE_GVAR
+
rb_cRegexp = rb_define_class("Regexp", rb_cObject);
rb_objc_define_method(*(VALUE *)rb_cRegexp, "alloc",
(void *)regexp_alloc, 0);
@@ -766,7 +873,6 @@
rb_objc_define_method(rb_cRegexp, "match", (void *)regexp_match2, -1);
rb_objc_define_method(rb_cRegexp, "~", (void *)regexp_match3, 0);
rb_objc_define_method(rb_cRegexp, "===", (void *)regexp_eqq, 1);
- //rb_objc_define_method(rb_cRegexp, "to_s", rb_reg_to_s, 0);
rb_objc_define_method(rb_cRegexp, "source", (void *)regexp_source, 0);
rb_objc_define_method(rb_cRegexp, "casefold?", (void *)regexp_casefold, 0);
rb_objc_define_method(rb_cRegexp, "options", (void *)regexp_options, 0);
@@ -778,6 +884,7 @@
rb_objc_define_method(rb_cRegexp, "named_captures",
rb_reg_named_captures, 0);
#endif
+ rb_objc_define_method(rb_cRegexp, "to_s", (void *)regexp_to_s, 0);
rb_objc_define_method(rb_cRegexp, "inspect", (void *)regexp_inspect, 0);
regexp_finalize_imp_super = rb_objc_install_method2((Class)rb_cRegexp,
Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c 2010-02-27 01:17:20 UTC (rev 3640)
+++ MacRuby/branches/icu/string.c 2010-02-27 02:29:44 UTC (rev 3641)
@@ -2031,7 +2031,7 @@
str_append_uchar(RSTR(result), c);
}
-VALUE
+static VALUE
str_inspect(rb_str_t *str, bool dump)
{
const bool uchars = str_is_stored_in_uchars(str);
Modified: MacRuby/branches/icu/symbol.c
===================================================================
--- MacRuby/branches/icu/symbol.c 2010-02-27 01:17:20 UTC (rev 3640)
+++ MacRuby/branches/icu/symbol.c 2010-02-27 02:29:44 UTC (rev 3641)
@@ -22,14 +22,14 @@
typedef struct {
VALUE klass;
- rb_str_t *str;
+ VALUE str;
ID id;
} rb_sym_t;
#define RSYM(obj) ((rb_sym_t *)(obj))
static rb_sym_t *
-sym_alloc(rb_str_t *str, ID id)
+sym_alloc(VALUE str, ID id)
{
rb_sym_t *sym = (rb_sym_t *)malloc(sizeof(rb_sym_t));
assert(rb_cSymbol != 0);
@@ -93,8 +93,7 @@
id_register:
//printf("register %s hash %ld id %ld\n", RSTRING_PTR(str), name_hash, id);
- assert(IS_RSTR(str));
- sym = sym_alloc(RSTR(str), id);
+ sym = sym_alloc(str, id);
CFDictionarySetValue(sym_id, (const void *)name_hash, (const void *)id);
CFDictionarySetValue(id_str, (const void *)id, (const void *)sym);
@@ -122,7 +121,7 @@
id2 = (id & ~ID_SCOPE_MASK) | ID_CONST;
}
- VALUE str = rb_str_dup((VALUE)RSYM(sym)->str);
+ VALUE str = rb_str_dup(RSYM(sym)->str);
rb_str_cat(str, "=", 1);
rb_intern_str(str);
@@ -171,7 +170,7 @@
VALUE
rb_sym_to_s(VALUE sym)
{
- return rb_str_dup((VALUE)RSYM(sym)->str);
+ return rb_str_dup(RSYM(sym)->str);
}
const char *
@@ -223,7 +222,7 @@
for (int i = 0; rb_op_tbl[i].token != 0; i++) {
ID id = rb_op_tbl[i].token;
VALUE str = rb_str_new2(rb_op_tbl[i].name);
- rb_sym_t *sym = sym_alloc(RSTR(str), id);
+ rb_sym_t *sym = sym_alloc(str, id);
unsigned long name_hash = rb_str_hash(str);
//printf("pre-register %s hash %ld id %ld\n", RSTRING_PTR(str), name_hash, id);
@@ -257,11 +256,42 @@
* :fred.inspect #=> ":fred"
*/
+static bool
+sym_should_be_escaped(VALUE sym)
+{
+ UChar *chars = NULL;
+ long chars_len = 0;
+ bool need_free = false;
+ rb_str_get_uchars(RSYM(sym)->str, &chars, &chars_len, &need_free);
+
+ // TODO: this is really not enough, we should mimic 1.9's
+ // rb_enc_symname2_p() function.
+ bool escape = false;
+ for (long i = 0; i < chars_len; i++) {
+ if (!iswprint(chars[i])
+ || iswspace(chars[i])) {
+ escape = true;
+ break;
+ }
+ }
+
+ if (need_free) {
+ free(chars);
+ }
+
+ return escape;
+}
+
static VALUE
rsym_inspect(VALUE sym, SEL sel)
{
VALUE str = rb_str_new2(":");
- rb_str_concat(str, str_inspect(RSYM(sym)->str, true));
+ if (sym_should_be_escaped(sym)) {
+ rb_str_concat(str, rb_str_inspect(RSYM(sym)->str));
+ }
+ else {
+ rb_str_concat(str, RSYM(sym)->str);
+ }
return str;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100226/68c76e57/attachment.html>
More information about the macruby-changes
mailing list