path: root/hash.c
diff options
authortarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-15 17:15:31 +0000
committertarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-15 17:15:31 +0000
commit28a1c4f33e3349a98c04b8e068d9c674eb936064 (patch)
tree67534f26a7d3c996c75c558f80151eb28e35dc00 /hash.c
parent9e96b1edea5c52fba05a30fc602288bb100acea7 (diff)
* cont.c : Introdule ensure rollback mechanism. Please see below.
* internal.h (ruby_register_rollback_func_for_ensure): catch up above change. Add rollback mechanism API. * vm_core.h (typedef struct rb_vm_struct): catch up above change. Introdule ensure-rollback relation table. * vm_core.h (typedef struct rb_thread_struct): catch up above change. Introdule ensure stack. * eval.c (rb_ensure): catch up above change. Introdule ensure stack. * hash.c : New function for rollback ensure, and register it to ensure-rollback relation table. [ruby-dev:47803] [Bug #9105] Ensure Rollback Mechanism: A rollback's function is a function to rollback a state before ensure's function execution. When the jump of callcc is across the scope of rb_ensure, ensure's functions and rollback's functions are executed appropriately for keeping consistency. Current API is unstable, and only internal use. ruby_register_rollback_func_for_ensure(ensure_func,rollback_func) This API create relation ensure's function to rollback's function. By registered rollback's function, it is executed When jumpping into corresponding rb_ensure scope. git-svn-id: svn+ssh:// b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
1 files changed, 10 insertions, 0 deletions
diff --git a/hash.c b/hash.c
index a37318b..4ae9392 100644
--- a/hash.c
+++ b/hash.c
@@ -201,6 +201,13 @@ hash_foreach_iter(st_data_t key, st_data_t value, st_data_t argp, int error)
static VALUE
+hash_foreach_ensure_rollback(VALUE hash)
+ RHASH_ITER_LEV(hash)++;
+ return 0;
+static VALUE
hash_foreach_ensure(VALUE hash)
if (--RHASH_ITER_LEV(hash) == 0) {
@@ -3765,4 +3772,7 @@ Init_Hash(void)
* See ENV (the class) for more details.
rb_define_global_const("ENV", envtbl);
+ /* for callcc */
+ ruby_register_rollback_func_for_ensure(hash_foreach_ensure, hash_foreach_ensure_rollback);