[macruby-changes] [1939] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Fri Jun 26 16:09:59 PDT 2009


Revision: 1939
          http://trac.macosforge.org/projects/ruby/changeset/1939
Author:   lsansonetti at apple.com
Date:     2009-06-26 16:09:59 -0700 (Fri, 26 Jun 2009)
Log Message:
-----------
implemented thread locals

Modified Paths:
--------------
    MacRuby/branches/experimental/hash.c
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/thread.c
    MacRuby/branches/experimental/vm.cpp
    MacRuby/branches/experimental/vm.h

Modified: MacRuby/branches/experimental/hash.c
===================================================================
--- MacRuby/branches/experimental/hash.c	2009-06-26 22:10:11 UTC (rev 1938)
+++ MacRuby/branches/experimental/hash.c	2009-06-26 23:09:59 UTC (rev 1939)
@@ -751,14 +751,14 @@
  *     h         #=> {2=>"b", 3=>"c"}
  */
 
-static VALUE rb_hash_keys(VALUE, SEL);
+static VALUE rb_hash_keys_imp(VALUE, SEL);
 
 static VALUE
 rb_hash_shift(VALUE hash, SEL sel)
 {
     VALUE keys, key, val;
 
-    keys = rb_hash_keys(hash, 0);
+    keys = rb_hash_keys_imp(hash, 0);
     if (RARRAY_LEN(keys) == 0) {
 	struct rb_objc_hash_struct *s = rb_objc_hash_get_struct(hash);
 
@@ -1243,7 +1243,7 @@
  */
 
 static VALUE
-rb_hash_keys(VALUE hash, SEL sel)
+rb_hash_keys_imp(VALUE hash, SEL sel)
 {
     VALUE ary;
 
@@ -1253,6 +1253,12 @@
     return ary;
 }
 
+VALUE
+rb_hash_keys(VALUE hash)
+{
+    return rb_hash_keys_imp(hash, 0);
+}
+
 static int
 values_i(VALUE key, VALUE value, VALUE ary)
 {
@@ -1300,12 +1306,17 @@
  */
 
 static VALUE
-rb_hash_has_key(VALUE hash, SEL sel, VALUE key)
+rb_hash_has_key_imp(VALUE hash, SEL sel, VALUE key)
 {
-    if (CFDictionaryContainsKey((CFDictionaryRef)hash, (const void *)RB2OC(key)))
-	return Qtrue;
+    return CFDictionaryContainsKey((CFDictionaryRef)hash,
+	    (const void *)RB2OC(key))
+	? Qtrue : Qfalse;
+}
 
-    return Qfalse;
+VALUE
+rb_hash_has_key(VALUE hash, VALUE key)
+{
+    return rb_hash_has_key_imp(hash, 0, key);
 }
 
 /*
@@ -1426,7 +1437,7 @@
 rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
 {
     if (key == Qundef) return ST_CONTINUE;
-    if (rb_hash_has_key(hash, 0, key)) {
+    if (rb_hash_has_key_imp(hash, 0, key)) {
 	value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
     }
     rb_hash_aset(hash, key, value);
@@ -2364,7 +2375,7 @@
     void *keys;
     static SEL objectEnumerator = 0;
     PREPARE_RCV(rcv);
-    keys = (void *)rb_hash_keys((VALUE)rcv, 0);
+    keys = (void *)rb_hash_keys_imp((VALUE)rcv, 0);
     RESTORE_RCV(rcv);
     if (objectEnumerator == 0)
 	objectEnumerator = sel_registerName("objectEnumerator");
@@ -2536,7 +2547,7 @@
     rb_objc_define_method(rb_cHash, "each_pair", rb_hash_each_pair, 0);
     rb_objc_define_method(rb_cHash, "each", rb_hash_each_pair, 0);
 
-    rb_objc_define_method(rb_cHash, "keys", rb_hash_keys, 0);
+    rb_objc_define_method(rb_cHash, "keys", rb_hash_keys_imp, 0);
     rb_objc_define_method(rb_cHash, "values", rb_hash_values, 0);
     rb_objc_define_method(rb_cHash, "values_at", rb_hash_values_at, -1);
 
@@ -2560,11 +2571,11 @@
     rb_objc_define_method(rb_cHash, "rassoc", rb_hash_rassoc, 1);
     rb_objc_define_method(rb_cHash, "flatten", rb_hash_flatten, -1);
 
-    rb_objc_define_method(rb_cHash, "include?", rb_hash_has_key, 1);
-    rb_objc_define_method(rb_cHash, "member?", rb_hash_has_key, 1);
-    rb_objc_define_method(rb_cHash, "has_key?", rb_hash_has_key, 1);
+    rb_objc_define_method(rb_cHash, "include?", rb_hash_has_key_imp, 1);
+    rb_objc_define_method(rb_cHash, "member?", rb_hash_has_key_imp, 1);
+    rb_objc_define_method(rb_cHash, "has_key?", rb_hash_has_key_imp, 1);
     rb_objc_define_method(rb_cHash, "has_value?", rb_hash_has_value, 1);
-    rb_objc_define_method(rb_cHash, "key?", rb_hash_has_key, 1);
+    rb_objc_define_method(rb_cHash, "key?", rb_hash_has_key_imp, 1);
     rb_objc_define_method(rb_cHash, "value?", rb_hash_has_value, 1);
 
     rb_objc_define_method(rb_cHash, "compare_by_identity", rb_hash_compare_by_id, 0);

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-06-26 22:10:11 UTC (rev 1938)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-06-26 23:09:59 UTC (rev 1939)
@@ -364,6 +364,8 @@
 VALUE rb_hash_aset(VALUE, VALUE, VALUE);
 //VALUE rb_hash_delete_if(VALUE);
 VALUE rb_hash_delete(VALUE,VALUE);
+VALUE rb_hash_has_key(VALUE hash, VALUE key);
+VALUE rb_hash_keys(VALUE hash);
 struct st_table *rb_hash_tbl(VALUE);
 int rb_path_check(const char*);
 int rb_env_path_tainted(void);

Modified: MacRuby/branches/experimental/thread.c
===================================================================
--- MacRuby/branches/experimental/thread.c	2009-06-26 22:10:11 UTC (rev 1938)
+++ MacRuby/branches/experimental/thread.c	2009-06-26 23:09:59 UTC (rev 1939)
@@ -658,9 +658,13 @@
  */
 
 static VALUE
-rb_thread_aref(VALUE thread, VALUE id)
+rb_thread_aref(VALUE thread, SEL sel, VALUE key)
 {
-    // TODO
+    key = ID2SYM(rb_to_id(key));
+    VALUE h = rb_vm_thread_locals(thread, false);
+    if (h != Qnil) {
+	return rb_hash_aref(h, key);
+    }
     return Qnil;
 }
 
@@ -673,10 +677,10 @@
  */
 
 static VALUE
-rb_thread_aset(VALUE self, ID id, VALUE val)
+rb_thread_aset(VALUE self, SEL sel, ID key, VALUE val)
 {
-    // TODO
-    return Qnil;
+    key = ID2SYM(rb_to_id(key));
+    return rb_hash_aset(rb_vm_thread_locals(self, true), key, val);
 }
 
 /*
@@ -693,10 +697,14 @@
  */
 
 static VALUE
-rb_thread_key_p(VALUE self, VALUE key)
+rb_thread_key_p(VALUE self, SEL sel, VALUE key)
 {
-    // TODO
-    return Qnil;
+    key = ID2SYM(rb_to_id(key));
+    VALUE h = rb_vm_thread_locals(self, false);
+    if (h == Qnil) {
+	return Qfalse;
+    }
+    return rb_hash_has_key(h, key);
 }
 
 int
@@ -721,10 +729,10 @@
  */
 
 static VALUE
-rb_thread_keys(VALUE self)
+rb_thread_keys(VALUE self, SEL sel)
 {
-    // TODO
-    return Qnil;
+    VALUE h = rb_vm_thread_locals(self, false);
+    return h == Qnil ? rb_ary_new() : rb_hash_keys(h);
 }
 
 /*
@@ -1339,10 +1347,10 @@
     rb_objc_define_method(rb_cThread, "exit", rb_thread_kill, 0);
     rb_objc_define_method(rb_cThread, "run", rb_thread_run, 0);
     rb_objc_define_method(rb_cThread, "wakeup", rb_thread_wakeup, 0);
-    rb_define_method(rb_cThread, "[]", rb_thread_aref, 1);
-    rb_define_method(rb_cThread, "[]=", rb_thread_aset, 2);
-    rb_define_method(rb_cThread, "key?", rb_thread_key_p, 1);
-    rb_define_method(rb_cThread, "keys", rb_thread_keys, 0);
+    rb_objc_define_method(rb_cThread, "[]", rb_thread_aref, 1);
+    rb_objc_define_method(rb_cThread, "[]=", rb_thread_aset, 2);
+    rb_objc_define_method(rb_cThread, "key?", rb_thread_key_p, 1);
+    rb_objc_define_method(rb_cThread, "keys", rb_thread_keys, 0);
     rb_define_method(rb_cThread, "priority", rb_thread_priority, 0);
     rb_define_method(rb_cThread, "priority=", rb_thread_priority_set, 1);
     rb_objc_define_method(rb_cThread, "status", rb_thread_status, 0);

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-06-26 22:10:11 UTC (rev 1938)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-26 23:09:59 UTC (rev 1939)
@@ -4448,6 +4448,17 @@
 }
 
 extern "C"
+VALUE
+rb_vm_thread_locals(VALUE thread, bool create_storage)
+{
+    rb_vm_thread_t *t = GetThreadPtr(thread);
+    if (t->locals == Qnil && create_storage) {
+	GC_WB(&t->locals, rb_hash_new());
+    }
+    return t->locals;
+}
+
+extern "C"
 void
 rb_vm_thread_pre_init(rb_vm_thread_t *t, rb_vm_block_t *body, int argc,
 	const VALUE *argv, void *vm)
@@ -4476,6 +4487,7 @@
 
     t->vm  = vm;
     t->value = Qundef;
+    t->locals = Qnil;
     t->status = THREAD_ALIVE;
     t->in_cond_wait = false;
 

Modified: MacRuby/branches/experimental/vm.h
===================================================================
--- MacRuby/branches/experimental/vm.h	2009-06-26 22:10:11 UTC (rev 1938)
+++ MacRuby/branches/experimental/vm.h	2009-06-26 23:09:59 UTC (rev 1939)
@@ -91,6 +91,7 @@
     pthread_cond_t sleep_cond;
     rb_vm_thread_status_t status;
     bool in_cond_wait;
+    VALUE locals;  // a Hash object or Qnil
 } rb_vm_thread_t;
 
 typedef struct rb_vm_outer {
@@ -343,6 +344,7 @@
 VALUE rb_vm_current_thread(void);
 VALUE rb_vm_main_thread(void);
 VALUE rb_vm_threads(void);
+VALUE rb_vm_thread_locals(VALUE thread, bool create_storage);
 void rb_vm_thread_wakeup(rb_vm_thread_t *t);
 void rb_vm_thread_cancel(rb_vm_thread_t *t);
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090626/2bf7f122/attachment-0001.html>


More information about the macruby-changes mailing list