[macruby-changes] [3622] MacRuby/branches/icu
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 25 13:53:45 PST 2010
Revision: 3622
http://trac.macosforge.org/projects/ruby/changeset/3622
Author: lsansonetti at apple.com
Date: 2010-02-25 13:53:42 -0800 (Thu, 25 Feb 2010)
Log Message:
-----------
regexps are now AOT compilable
Modified Paths:
--------------
MacRuby/branches/icu/compiler.cpp
MacRuby/branches/icu/compiler.h
MacRuby/branches/icu/encoding.h
MacRuby/branches/icu/include/ruby/ruby.h
MacRuby/branches/icu/re.cpp
MacRuby/branches/icu/re.h
MacRuby/branches/icu/string.c
Modified: MacRuby/branches/icu/compiler.cpp
===================================================================
--- MacRuby/branches/icu/compiler.cpp 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/compiler.cpp 2010-02-25 21:53:42 UTC (rev 3622)
@@ -18,12 +18,13 @@
#include "ruby/ruby.h"
#include "ruby/encoding.h"
#include "ruby/node.h"
-#include "ruby/re.h"
#include "id.h"
#include "vm.h"
#include "compiler.h"
#include "objc.h"
#include "version.h"
+#include "encoding.h"
+#include "re.h"
extern "C" const char *ruby_node_name(int node);
@@ -498,10 +499,12 @@
GlobalVariable *
RoxorCompiler::compile_const_global_ustring(const UniChar *str,
- const size_t len, CFHashCode hash)
+ const size_t len)
{
assert(len > 0);
+ const unsigned long hash = rb_str_hash_uchars(str, len);
+
std::map<CFHashCode, GlobalVariable *>::iterator iter =
static_ustrings.find(hash);
@@ -2797,22 +2800,18 @@
return CallInst::Create(newString3Func, "", bb);
}
else {
- UniChar *buf = (UniChar *)CFStringGetCharactersPtr(
- (CFStringRef)val);
- bool free_buf = false;
- if (buf == NULL) {
- buf = (UniChar *)malloc(sizeof(UniChar) * str_len);
- CFStringGetCharacters((CFStringRef)val,
- CFRangeMake(0, str_len), buf);
- free_buf = true;
- }
+ UChar *chars = NULL;
+ long chars_len = 0;
+ bool need_free = false;
- GlobalVariable *str_gvar = compile_const_global_ustring(buf,
- str_len, CFHash((CFTypeRef)val));
+ rb_str_get_uchars(val, &chars, &chars_len, &need_free);
- if (free_buf) {
- free(buf);
- buf = NULL;
+ GlobalVariable *str_gvar = compile_const_global_ustring(chars,
+ chars_len);
+
+ if (need_free) {
+ free(chars);
+ chars = NULL;
}
std::vector<Value *> idxs;
@@ -5621,8 +5620,10 @@
RubyObjTy, PtrTy, NULL));
Function *newRegexp2Func =
- cast<Function>(module->getOrInsertFunction("rb_reg_new_retained",
- RubyObjTy, PtrTy, Int32Ty, Int32Ty, NULL));
+ cast<Function>(module->getOrInsertFunction(
+ "rb_unicode_regex_new_retained",
+ RubyObjTy, PointerType::getUnqual(Int16Ty), Int32Ty,
+ Int32Ty, NULL));
Function *newBignumFunc =
cast<Function>(module->getOrInsertFunction("rb_bignum_new_retained",
@@ -5669,28 +5670,33 @@
case T_REGEXP:
{
- struct RRegexp *re = (struct RRegexp *)val;
+ const UChar *chars = NULL;
+ long chars_len = 0;
+ regexp_get_uchars(val, &chars, &chars_len);
+
Value *re_str;
- if (re->len == 0) {
+ if (chars_len == 0) {
+ re_str = ConstantPointerNull::get(
+ PointerType::getUnqual(Int16Ty));
re_str = compile_const_pointer(NULL, NULL);
}
else {
- GlobalVariable *rename_gvar =
- compile_const_global_string(re->str, re->len);
+ GlobalVariable *re_name_gvar =
+ compile_const_global_ustring(chars, chars_len);
std::vector<Value *> idxs;
idxs.push_back(ConstantInt::get(Int32Ty, 0));
idxs.push_back(ConstantInt::get(Int32Ty, 0));
- re_str = GetElementPtrInst::Create(rename_gvar,
+ re_str = GetElementPtrInst::Create(re_name_gvar,
idxs.begin(), idxs.end(), "");
}
std::vector<Value *> params;
params.push_back(re_str);
- params.push_back(ConstantInt::get(Int32Ty, re->len));
+ params.push_back(ConstantInt::get(Int32Ty, chars_len));
params.push_back(ConstantInt::get(Int32Ty,
- re->ptr->options));
+ rb_reg_options(val)));
Instruction *call = CallInst::Create(newRegexp2Func,
params.begin(), params.end(), "");
Modified: MacRuby/branches/icu/compiler.h
===================================================================
--- MacRuby/branches/icu/compiler.h 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/compiler.h 2010-02-25 21:53:42 UTC (rev 3622)
@@ -314,7 +314,7 @@
return compile_const_global_string(str, strlen(str));
}
GlobalVariable *compile_const_global_ustring(const UniChar *str,
- const size_t str_len, CFHashCode hash);
+ const size_t str_len);
Value *compile_arity(rb_vm_arity_t &arity);
Instruction *compile_range(Value *beg, Value *end, bool exclude_end,
Modified: MacRuby/branches/icu/encoding.h
===================================================================
--- MacRuby/branches/icu/encoding.h 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/encoding.h 2010-02-25 21:53:42 UTC (rev 3622)
@@ -301,7 +301,7 @@
long rb_str_chars_len(VALUE str);
UChar rb_str_get_uchar(VALUE str, long pos);
void rb_str_append_uchar(VALUE str, UChar c);
-unsigned long rb_str_hash_uchars(UChar *chars, long chars_len);
+unsigned long rb_str_hash_uchars(const UChar *chars, long chars_len);
VALUE mr_enc_s_is_compatible(VALUE klass, SEL sel, VALUE str1, VALUE str2);
Modified: MacRuby/branches/icu/include/ruby/ruby.h
===================================================================
--- MacRuby/branches/icu/include/ruby/ruby.h 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/include/ruby/ruby.h 2010-02-25 21:53:42 UTC (rev 3622)
@@ -641,13 +641,6 @@
# define RARRAY_PTR(a) (rb_ary_ptr((VALUE)a))
#endif
-struct RRegexp {
- struct RBasic basic;
- struct re_pattern_buffer *ptr;
- long len;
- char *str;
-};
-
#if !WITH_OBJC
struct RHash {
struct RBasic basic;
Modified: MacRuby/branches/icu/re.cpp
===================================================================
--- MacRuby/branches/icu/re.cpp 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/re.cpp 2010-02-25 21:53:42 UTC (rev 3622)
@@ -1336,6 +1336,29 @@
"finalize", (IMP)match_finalize_imp);
}
+// Compiler primitives.
+
+void
+regexp_get_uchars(VALUE re, const UChar **chars_p, long *chars_len_p)
+{
+ assert(chars_p != NULL && chars_len_p != NULL);
+
+ UnicodeString *unistr = RREGEXP(re)->unistr;
+ assert(unistr != NULL);
+
+ *chars_p = unistr->getBuffer();
+ *chars_len_p = unistr->length();
+}
+
+VALUE
+rb_unicode_regex_new_retained(UChar *chars, int chars_len, int options)
+{
+ VALUE str = rb_unicode_str_new(chars, chars_len);
+ VALUE re = rb_reg_new_str(str, options);
+ GC_RETAIN(re);
+ return re;
+}
+
// MRI compatibility.
VALUE
Modified: MacRuby/branches/icu/re.h
===================================================================
--- MacRuby/branches/icu/re.h 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/re.h 2010-02-25 21:53:42 UTC (rev 3622)
@@ -23,6 +23,8 @@
VALUE rb_reg_regcomp(VALUE str);
int rb_reg_search(VALUE re, VALUE str, int pos, bool reverse);
+void regexp_get_uchars(VALUE re, const UChar **chars_p, long *chars_len_p);
+
typedef struct rb_match_result {
unsigned int beg;
unsigned int end;
Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c 2010-02-25 21:13:29 UTC (rev 3621)
+++ MacRuby/branches/icu/string.c 2010-02-25 21:53:42 UTC (rev 3622)
@@ -3731,7 +3731,7 @@
// Unicode characters hashing function, copied from CoreFoundation.
// This function might have some performance issues on large strings.
unsigned long
-rb_str_hash_uchars(UChar *chars, long len)
+rb_str_hash_uchars(const UChar *chars, long len)
{
#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;}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100225/96422dad/attachment.html>
More information about the macruby-changes
mailing list