Revision: 137 http://trac.macosforge.org/projects/ruby/changeset/137 Author: lsansonetti@apple.com Date: 2008-04-15 01:19:47 -0700 (Tue, 15 Apr 2008) Log Message: ----------- fixing some regressions, perf improvements Modified Paths: -------------- MacRuby/trunk/encoding.c MacRuby/trunk/parse.y MacRuby/trunk/string.c Modified: MacRuby/trunk/encoding.c =================================================================== --- MacRuby/trunk/encoding.c 2008-04-12 01:10:16 UTC (rev 136) +++ MacRuby/trunk/encoding.c 2008-04-15 08:19:47 UTC (rev 137) @@ -648,12 +648,16 @@ rb_encoding* rb_enc_check(VALUE str1, VALUE str2) { +#if WITH_OBJC + return NULL; +#else rb_encoding *enc = rb_enc_compatible(str1, str2); if (!enc) rb_raise(rb_eArgError, "character encodings differ: %s and %s", rb_enc_name(rb_enc_get(str1)), rb_enc_name(rb_enc_get(str2))); return enc; +#endif } rb_encoding* @@ -729,11 +733,16 @@ VALUE rb_obj_encoding(VALUE obj) { +#if WITH_OBJC + /* TODO */ + return Qnil; +#else rb_encoding *enc = rb_enc_get(obj); if (!enc) { rb_raise(rb_eTypeError, "unknown encoding"); } return rb_enc_from_encoding(enc); +#endif } int Modified: MacRuby/trunk/parse.y =================================================================== --- MacRuby/trunk/parse.y 2008-04-12 01:10:16 UTC (rev 136) +++ MacRuby/trunk/parse.y 2008-04-15 08:19:47 UTC (rev 137) @@ -4820,8 +4820,8 @@ const char *cptr, *beg, *end, *pend; long clen; - cptr = beg = RSTRING_CPTR(s); - clen = RSTRING_CLEN(s); + cptr = beg = RSTRING_PTR(s); + clen = RSTRING_LEN(s); if (lex_gets_ptr) { if (clen == lex_gets_ptr) return Qnil; beg += lex_gets_ptr; @@ -5000,8 +5000,8 @@ } ruby_sourceline++; parser->line_count++; - lex_pbeg = lex_p = RSTRING_CPTR(v); - lex_pend = lex_p + RSTRING_CLEN(v); + lex_pbeg = lex_p = RSTRING_PTR(v); + lex_pend = lex_p + RSTRING_LEN(v); #ifdef RIPPER ripper_flush(parser); #endif @@ -5681,8 +5681,8 @@ #endif line = here->nd_orig; lex_lastline = line; - lex_pbeg = RSTRING_CPTR(line); - lex_pend = lex_pbeg + RSTRING_CLEN(line); + lex_pbeg = RSTRING_PTR(line); + lex_pend = lex_pbeg + RSTRING_LEN(line); lex_p = lex_pbeg + here->nd_nth; heredoc_end = ruby_sourceline; ruby_sourceline = nd_line(here); @@ -5717,8 +5717,8 @@ long len; VALUE str = 0; - eos = RSTRING_CPTR(here->nd_lit); - len = RSTRING_CLEN(here->nd_lit) - 1; + eos = RSTRING_PTR(here->nd_lit); + len = RSTRING_LEN(here->nd_lit) - 1; indent = (func = *eos++) & STR_FUNC_INDENT; if ((c = nextc()) == -1) { @@ -5736,7 +5736,7 @@ if (!(func & STR_FUNC_EXPAND)) { do { - p = RSTRING_CPTR(lex_lastline); + p = RSTRING_PTR(lex_lastline); pend = lex_pend; if (pend > p) { switch (pend[-1]) { @@ -5992,13 +5992,13 @@ str_copy(name, beg, n); #ifndef RIPPER do { - if (STRNCASECMP(p->name, RSTRING_CPTR(name), n) == 0) { + if (STRNCASECMP(p->name, RSTRING_PTR(name), n) == 0) { n = vend - vbeg; if (p->length) { n = (*p->length)(parser, vbeg, n); } str_copy(val, vbeg, n); - (*p->func)(parser, RSTRING_CPTR(name), RSTRING_CPTR(val)); + (*p->func)(parser, RSTRING_PTR(name), RSTRING_PTR(val)); break; } } while (++p < magic_comments + sizeof(magic_comments) / sizeof(*p)); @@ -6049,7 +6049,7 @@ beg = str; while ((*str == '-' || *str == '_' || ISALNUM(*str)) && ++str < send); s = rb_str_new(beg, parser_encode_length(parser, beg, str - beg)); - parser_set_encode(parser, RSTRING_CPTR(s)); + parser_set_encode(parser, RSTRING_PTR(s)); rb_str_resize(s, 0); } @@ -6077,7 +6077,7 @@ pushback(c); parser->enc = rb_enc_get(lex_lastline); if (parser->enc == NULL) - parser->enc = rb_usascii_encoding(); + parser->enc = rb_utf8_encoding(); } #define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG) @@ -8663,7 +8663,7 @@ err = rb_reg_check_preprocess(str); if (err != Qnil) { err = rb_obj_as_string(err); - compile_error(PARSER_ARG "%s", RSTRING_CPTR(err)); + compile_error(PARSER_ARG "%s", RSTRING_PTR(err)); RB_GC_GUARD(err); } } @@ -8764,7 +8764,7 @@ rb_str_append(rb_str_cat(rb_attr_get(err, mesg), "\n", 1), m); } else { - compile_error(PARSER_ARG "%s", RSTRING_CPTR(m)); + compile_error(PARSER_ARG "%s", RSTRING_PTR(m)); } return Qnil; } @@ -9249,7 +9249,7 @@ else { enc = rb_enc_get(str); } - id = rb_intern3(RSTRING_CPTR(str), RSTRING_CLEN(str), enc); + id = rb_intern3(RSTRING_PTR(str), RSTRING_LEN(str), enc); RB_GC_GUARD(str); return id; } @@ -9329,7 +9329,7 @@ VALUE str = rb_id2str(id); if (!str) return 0; - return RSTRING_CPTR(str); + return RSTRING_PTR(str); } static int @@ -9951,7 +9951,7 @@ parser_initialize(parser); parser->parser_ruby_sourcefile_string = fname2; - parser->parser_ruby_sourcefile = RSTRING_CPTR(fname2)+1; + parser->parser_ruby_sourcefile = RSTRING_PTR(fname2)+1; parser->parser_ruby_sourceline = NIL_P(lineno) ? 0 : NUM2INT(lineno) - 1; return Qnil; @@ -10062,7 +10062,7 @@ { StringValue(msg); if (obj == Qundef) { - rb_raise(rb_eArgError, "%s", RSTRING_CPTR(msg)); + rb_raise(rb_eArgError, "%s", RSTRING_PTR(msg)); } return Qnil; } Modified: MacRuby/trunk/string.c =================================================================== --- MacRuby/trunk/string.c 2008-04-12 01:10:16 UTC (rev 136) +++ MacRuby/trunk/string.c 2008-04-15 08:19:47 UTC (rev 137) @@ -136,7 +136,11 @@ (CFStringRef)str, kCFStringEncodingUTF8, 0); if (data == NULL) return NULL; +#if 1 GC_WB(&s->cfdata, (void *)CFDataCreateCopy(NULL, data)); +#else + GC_WB(&s->cfdata, (void *)data); +#endif } return s->cfdata; } @@ -144,8 +148,12 @@ char * rb_str_byteptr(VALUE str) { +#if 1 return (char *)CFDataGetMutableBytePtr( (CFMutableDataRef)rb_str_cfdata(str)); +#else + return (char *)CFDataGetBytePtr((CFDataRef)rb_str_cfdata(str)); +#endif } long @@ -163,7 +171,7 @@ datalen = CFDataGetLength(data); CFStringRef bytestr = CFStringCreateWithBytesNoCopy( NULL, - CFDataGetMutableBytePtr((CFMutableDataRef)data), + CFDataGetBytePtr((CFDataRef)data), datalen, kCFStringEncodingUTF8, false, @@ -455,11 +463,29 @@ str = str_alloc(klass); #if WITH_OBJC + bool need_padding = len > 0; if (ptr != NULL) { + long slen = strlen(ptr); + if (len > 0 && slen > len && ptr[len] != '\0') { + char *tmp = alloca(len); + memcpy(tmp, ptr, len); + tmp[len] = '\0'; + ptr = tmp; + } CFStringAppendCString((CFMutableStringRef)str, ptr, kCFStringEncodingUTF8); - /* TODO ptr might be a bytestring */ + if (len > 0 && slen < len) { + CFMutableDataRef data; + printf("*** string %p is bytestring (given len %ld, real %ld)\n", + str, len, strlen(ptr), len, slen); + data = CFDataCreateMutable(NULL, 0); + CFDataAppendBytes(data, (const UInt8 *)ptr, len); + GC_WB(&rb_objc_str_get_struct2(str)->cfdata, (void *)data); + } + need_padding = len > 0 && slen != len; } + if (need_padding) + CFStringPad((CFMutableStringRef)str, CFSTR(" "), len, 0); #else if (len > RSTRING_EMBED_LEN_MAX) { RSTRING(str)->as.heap.aux.capa = len; @@ -645,7 +671,7 @@ static VALUE str_new3(VALUE klass, VALUE str) { - return str_new(klass, RSTRING_CPTR(str), 0); + return str_new(klass, RSTRING_PTR(str), 0); } VALUE @@ -982,7 +1008,7 @@ static VALUE rb_str_bytesize(VALUE str) { - return INT2NUM(RSTRING_LEN(str)); + return INT2NUM(rb_str_bytelen(str)); } /* @@ -998,7 +1024,7 @@ static VALUE rb_str_empty(VALUE str) { - if (RSTRING_LEN(str) == 0) + if (CFStringGetLength((CFStringRef)str) == 0) return Qtrue; return Qfalse; } @@ -1057,7 +1083,7 @@ VALUE str2; long n, len; - n = RSTRING_LEN(str); + n = RSTRING_CLEN(str); len = NUM2LONG(times); if (len < 0) { rb_raise(rb_eArgError, "negative argument"); @@ -1066,13 +1092,12 @@ rb_raise(rb_eArgError, "argument too big"); } - str2 = rb_str_new5(str, 0, len *= n); #if WITH_OBJC - while (len > 0) { - CFStringAppend((CFMutableStringRef)str2, (CFStringRef)str); - len--; - } + str2 = rb_str_new(NULL, 0); + CFStringPad((CFMutableStringRef)str2, (CFStringRef)str, + len * n, 0); #else + str2 = rb_str_new5(str, 0, len *= n); if (len) { memcpy(RSTRING_PTR(str2), RSTRING_PTR(str), n); while (n <= len/2) { @@ -1570,7 +1595,9 @@ void rb_str_set_len(VALUE str, long len) { -#if !WITH_OBJC +#if WITH_OBJC + rb_str_resize(str, len); +#else STR_SET_LEN(str, len); RSTRING_PTR(str)[len] = '\0'; #endif @@ -1589,6 +1616,8 @@ #if WITH_OBJC slen = CFStringGetLength((CFStringRef)str); if (slen != len) { + struct rb_objc_str_struct *s; + if (len > slen) { CFStringPad((CFMutableStringRef)str, CFSTR(" "), len, 0); } @@ -1596,6 +1625,10 @@ CFStringDelete((CFMutableStringRef)str, CFRangeMake(len, slen - len)); } + + s = rb_objc_str_get_struct(str); + if (s != NULL && s->cfdata != NULL) + CFDataSetLength((CFMutableDataRef)s->cfdata, len); } #else slen = RSTRING_LEN(str); @@ -2494,7 +2527,7 @@ CFRange r; return (CFStringFindWithOptions((CFStringRef)str, (CFStringRef)sub, - CFRangeMake(pos, CFStringGetLength((CFStringRef)str) - pos), + CFRangeMake(0, pos), kCFCompareBackwards, &r)) ? r.location : -1; @@ -5109,7 +5142,8 @@ CFStringRef str, void *ctx) { CFStringDelete((CFMutableStringRef)str, *result_range); - search_range->length -= search_range->length; + search_range->length -= search_range->location; + search_range->location = result_range->location; *(bool *)ctx = true; } #endif @@ -5646,6 +5680,8 @@ VALUE rs; CFArrayRef ranges; long i, count, n, l; + UInt8 *buffer; + long bufsize = 0; if (rb_scan_args(argc, argv, "01", &rs) == 0) { rs = rb_rs; @@ -5666,15 +5702,21 @@ for (i = l = 0, count = CFArrayGetCount(ranges); i < count; i++) { CFRange *rs_range; CFRange sub_range; - UInt8 *buffer; rs_range = (CFRange *)CFArrayGetValueAtIndex(ranges, i); assert(rs_range->location > 0); - sub_range = CFRangeMake(l, rs_range->location); - buffer = (UInt8 *)alloca(sizeof(UInt8) * sub_range.length); + sub_range = CFRangeMake(l, rs_range->location - l); +#if 1 + rb_yield((VALUE)CFStringCreateWithSubstring(NULL, (CFStringRef)str, sub_range)); +#else + if (bufsize < sub_range.length) { + bufsize = sub_range.length + 100; + buffer = (UInt8 *)alloca(sub_range.length + 100); + } CFStringGetBytes((CFStringRef)str, sub_range, kCFStringEncodingUTF8, 0, false, buffer, sub_range.length, NULL); rb_yield(rb_str_new((const char *)buffer, sub_range.length)); +#endif l = rs_range->location + rs_range->length; } return str; @@ -6346,13 +6388,35 @@ } static VALUE -scan_once(VALUE str, VALUE pat, long *start) +scan_once(VALUE str, VALUE pat, long *start, long strlen, bool pat_is_string) { rb_encoding *enc; VALUE result, match; struct re_registers *regs; long i; +#if WITH_OBJC + if (pat_is_string) { + /* XXX this is sometimes slower than the regexp search, especially for + * long pattern strings + */ + CFRange result_range; + if (CFStringFindWithOptions((CFStringRef)str, + (CFStringRef)pat, + CFRangeMake(*start, strlen - *start), + 0, + &result_range)) { + result = (VALUE)CFStringCreateWithSubstring(NULL, + (CFStringRef)str, result_range); + *start = result_range.location + result_range.length + 1; + } + else { + result = Qnil; + } + return result; + } +#endif + #if !WITH_OBJC enc = STR_ENC_GET(str); #endif @@ -6425,13 +6489,16 @@ VALUE result; long start = 0; VALUE match = Qnil; - char *p = RSTRING_PTR(str); long len = RSTRING_LEN(str); - - pat = get_pat(pat, 1); + long len = CFStringGetLength((CFStringRef)str); + bool pat_is_string = TYPE(pat) == T_STRING; + + if (!pat_is_string) + pat = get_pat(pat, 1); if (!rb_block_given_p()) { VALUE ary = rb_ary_new(); - while (!NIL_P(result = scan_once(str, pat, &start))) { + while (!NIL_P(result = scan_once(str, pat, &start, len, + pat_is_string))) { match = rb_backref_get(); rb_ary_push(ary, result); } @@ -6439,11 +6506,13 @@ return ary; } - while (!NIL_P(result = scan_once(str, pat, &start))) { + while (!NIL_P(result = scan_once(str, pat, &start, len, pat_is_string))) { match = rb_backref_get(); rb_match_busy(match); rb_yield(result); +#if !WITH_OBJC str_mod_check(str, p, len); +#endif rb_backref_set(match); /* restore $~ value */ } rb_backref_set(match);
participants (1)
-
source_changes@macosforge.org