[macruby-changes] [3632] MacRuby/branches/icu
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 25 21:24:09 PST 2010
Revision: 3632
http://trac.macosforge.org/projects/ruby/changeset/3632
Author: lsansonetti at apple.com
Date: 2010-02-25 21:24:06 -0800 (Thu, 25 Feb 2010)
Log Message:
-----------
some misc fixes/cleanup
Modified Paths:
--------------
MacRuby/branches/icu/include/ruby/intern.h
MacRuby/branches/icu/parse.y
MacRuby/branches/icu/string.c
MacRuby/branches/icu/symbol.c
Modified: MacRuby/branches/icu/include/ruby/intern.h
===================================================================
--- MacRuby/branches/icu/include/ruby/intern.h 2010-02-26 02:52:51 UTC (rev 3631)
+++ MacRuby/branches/icu/include/ruby/intern.h 2010-02-26 05:24:06 UTC (rev 3632)
@@ -588,7 +588,7 @@
VALUE rb_str_concat(VALUE, VALUE);
VALUE rb_str_plus(VALUE str1, VALUE str2);
long rb_memhash(const void *ptr, long len);
-int rb_str_hash(VALUE);
+unsigned long rb_str_hash(VALUE);
int rb_str_hash_cmp(VALUE,VALUE);
int rb_str_comparable(VALUE, VALUE);
int rb_str_cmp(VALUE, VALUE);
Modified: MacRuby/branches/icu/parse.y
===================================================================
--- MacRuby/branches/icu/parse.y 2010-02-26 02:52:51 UTC (rev 3631)
+++ MacRuby/branches/icu/parse.y 2010-02-26 05:24:06 UTC (rev 3632)
@@ -266,23 +266,10 @@
};
#if WITH_OBJC
+// TODO: we should probably mimic what 1.9 does here and use the right/given
+// encoding instead of always UTF8.
# define UTF8_ENC() (NULL)
-static inline VALUE
-__new_tmp_str(const char *ptr, const size_t len)
-{
- if (ptr != NULL) {
- CFStringRef str = CFStringCreateWithBytes(NULL, (UInt8 *)ptr, len,
- kCFStringEncodingUTF8, false);
- if (str != NULL) {
- CFMutableStringRef str2 =
- CFStringCreateMutableCopy(NULL, 0, str);
- assert(str2 != NULL);
- CFRelease(str);
- return (VALUE)CFMakeCollectable(str2);
- }
- }
- return rb_usascii_str_new(ptr, len);
-}
+#define __new_tmp_str(p, n) (rb_str_new(p, n))
# define STR_NEW(p,n) __new_tmp_str(p, n)
# define STR_NEW0() __new_tmp_str(0, 0)
# define STR_NEW2(p) __new_tmp_str(p, strlen(p))
@@ -5097,7 +5084,6 @@
long chars_len = 0;
bool need_free = false;
rb_str_get_uchars(s, &chars, &chars_len, &need_free);
- assert(!need_free);
struct lex_get_str_context *ctx = (struct lex_get_str_context *)
xmalloc(sizeof(struct lex_get_str_context));
@@ -5111,7 +5097,13 @@
lex_pbeg = lex_p = lex_pend = 0;
compile_for_eval = rb_parse_in_eval();
- return yycompile(parser, f, line);
+ NODE *node = yycompile(parser, f, line);
+
+ if (need_free && chars != NULL) {
+ free(chars);
+ }
+
+ return node;
}
NODE*
Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c 2010-02-26 02:52:51 UTC (rev 3631)
+++ MacRuby/branches/icu/string.c 2010-02-26 05:24:06 UTC (rev 3632)
@@ -456,7 +456,7 @@
// FIXME: Not ucs2 compliant.
return self->data.uchars[pos];
}
- assert(BINARY_ENC(self->encoding));
+ //assert(BINARY_ENC(self->encoding));
return self->data.bytes[pos];
}
@@ -1067,7 +1067,7 @@
chars_len = str_length(RSTR(str), false);
}
else {
- assert(BINARY_ENC(RSTR(str)->encoding));
+ //assert(BINARY_ENC(RSTR(str)->encoding));
chars_len = RSTR(str)->length_in_bytes;
if (chars_len > 0) {
chars = (UChar *)malloc(sizeof(UChar) * chars_len);
@@ -4027,13 +4027,15 @@
unsigned long
rb_str_hash_uchars(const UChar *chars, long len)
{
+ if (len == 0 || chars == NULL) {
+ return 0;
+ }
#define HashNextFourUniChars(accessStart, accessEnd, pointer) \
{result = result * 67503105 + (accessStart 0 accessEnd) * 16974593 + (accessStart 1 accessEnd) * 66049 + (accessStart 2 accessEnd) * 257 + (accessStart 3 accessEnd); pointer += 4;}
#define HashNextUniChar(accessStart, accessEnd, pointer) \
{result = result * 257 + (accessStart 0 accessEnd); pointer++;}
- assert(len > 0);
unsigned long result = len;
const UChar *end4 = chars + (len & ~3);
const UChar *end = chars + len;
@@ -4047,6 +4049,20 @@
#undef HashNextUniChar
}
+unsigned long
+rb_str_hash(VALUE str)
+{
+ UChar *chars = NULL;
+ long chars_len = 0;
+ bool need_free = false;
+ rb_str_get_uchars(str, &chars, &chars_len, &need_free);
+ const unsigned long hash = rb_str_hash_uchars(chars, chars_len);
+ if (need_free) {
+ free(chars);
+ }
+ return hash;
+}
+
long
rb_memhash(const void *ptr, long len)
{
Modified: MacRuby/branches/icu/symbol.c
===================================================================
--- MacRuby/branches/icu/symbol.c 2010-02-26 02:52:51 UTC (rev 3631)
+++ MacRuby/branches/icu/symbol.c 2010-02-26 05:24:06 UTC (rev 3632)
@@ -24,7 +24,6 @@
VALUE klass;
rb_str_t *str;
ID id;
- SEL sel;
} rb_sym_t;
#define RSYM(obj) ((rb_sym_t *)(obj))
@@ -38,72 +37,67 @@
GC_RETAIN(str); // never released
sym->str = str;
sym->id = id;
- sym->sel = NULL; // lazy
return sym;
}
ID
rb_intern_str(VALUE str)
{
- UChar *chars = NULL;
- long chars_len = 0;
- bool need_free = false;
- rb_str_get_uchars(str, &chars, &chars_len, &need_free);
- assert(chars_len > 0);
-
- const unsigned long name_hash = rb_str_hash_uchars(chars, chars_len);
+ const unsigned long name_hash = rb_str_hash(str);
ID id = (ID)CFDictionaryGetValue(sym_id, (const void *)name_hash);
if (id != 0) {
- goto return_id;
+ return id;
}
rb_sym_t *sym = NULL;
- switch (chars[0]) {
- case '$':
- id = ID_GLOBAL;
- break;
+ const long chars_len = rb_str_chars_len(str);
+ if (chars_len > 0) {
+ UChar c = rb_str_get_uchar(str, 0);
+ switch (c) {
+ case '$':
+ id = ID_GLOBAL;
+ break;
- case '@':
- if (chars_len > 1 && chars[1] == '@') {
- id = ID_CLASS;
- }
- else {
- id = ID_INSTANCE;
- }
- break;
+ case '@':
+ if (chars_len > 1 && rb_str_get_uchar(str, 1) == '@') {
+ id = ID_CLASS;
+ }
+ else {
+ id = ID_INSTANCE;
+ }
+ break;
- default:
- if (chars_len > 1 && chars[chars_len - 1] == '=') {
- // Attribute assignment.
- id = rb_intern_str(rb_str_substr(str, 0, chars_len - 1));
- if (!is_attrset_id(id)) {
- id = rb_id_attrset(id);
- goto id_register;
+ default:
+ if (chars_len > 1
+ && rb_str_get_uchar(str, chars_len - 1) == '=') {
+ // Attribute assignment.
+ id = rb_intern_str(rb_str_substr(str, 0, chars_len - 1));
+ if (!is_attrset_id(id)) {
+ id = rb_id_attrset(id);
+ goto id_register;
+ }
+ id = ID_ATTRSET;
}
- id = ID_ATTRSET;
- }
- else if (iswupper(chars[0])) {
- id = ID_CONST;
- }
- else {
- id = ID_LOCAL;
- }
- break;
+ else if (iswupper(c)) {
+ id = ID_CONST;
+ }
+ else {
+ id = ID_LOCAL;
+ }
+ break;
+ }
}
id |= ++last_id << ID_SCOPE_SHIFT;
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);
CFDictionarySetValue(sym_id, (const void *)name_hash, (const void *)id);
CFDictionarySetValue(id_str, (const void *)id, (const void *)sym);
-return_id:
- if (need_free && chars != NULL) {
- free(chars);
- }
return id;
}
@@ -233,26 +227,15 @@
// Pre-register parser symbols.
for (int i = 0; rb_op_tbl[i].token != 0; i++) {
- VALUE str = rb_str_new2(rb_op_tbl[i].name);
-
- UChar *chars = NULL;
- long chars_len = 0;
- bool need_free = false;
- rb_str_get_uchars(str, &chars, &chars_len, &need_free);
- assert(chars_len > 0);
-
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);
- unsigned long name_hash = rb_str_hash_uchars(chars, chars_len);
+ unsigned long name_hash = rb_str_hash(str);
//printf("pre-register %s hash %ld id %ld\n", RSTRING_PTR(str), name_hash, id);
CFDictionarySetValue(sym_id, (const void *)name_hash, (const void *)id);
CFDictionarySetValue(id_str, (const void *)id, (const void *)sym);
-
- if (need_free && chars != NULL) {
- free(chars);
- }
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100225/a1da695b/attachment-0001.html>
More information about the macruby-changes
mailing list