summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--vm.c20
-rw-r--r--vm_core.h5
-rw-r--r--vm_insnhelper.h9
-rw-r--r--vm_method.c13
5 files changed, 54 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 30f9a6cc04..43343c63ca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Mon Jun 13 20:18:55 2011 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h, vm_insnhelper.h: move decl. of
+ ruby_vm_global_state_version and related macros
+ from vm_core.h to vm_insnhelper.h.
+
+ * vm.c (vm_clear_all_cache): added. This function is called
+ when ruby_vm_global_state_version overflows.
+ TODO: vm_clear_all_inline_method_cache() is only place holder.
+ We need to implement it ASAP.
+
+ * vm_method.c (vm_clear_global_method_cache): added.
+
Mon Jun 13 19:46:21 2011 Keiju Ishitsuka <keiju@ishitsuka.com>
* lib/cmath.rb: add new methd Object#real?. fix #3137
diff --git a/vm.c b/vm.c
index 83d4351fcb..f6a21c8b83 100644
--- a/vm.c
+++ b/vm.c
@@ -36,7 +36,6 @@ VALUE rb_cThread;
VALUE rb_cEnv;
VALUE rb_mRubyVMFrozenCore;
-VALUE ruby_vm_global_state_version = 1;
VALUE ruby_vm_const_missing_count = 0;
char ruby_vm_redefined_flag[BOP_LAST_];
@@ -58,6 +57,25 @@ rb_vm_change_state(void)
INC_VM_STATE_VERSION();
}
+static void vm_clear_global_method_cache(void);
+
+static void
+vm_clear_all_inline_method_cache(void)
+{
+ /* TODO: Clear all inline cache entries in all iseqs.
+ How to iterate all iseqs in sweep phase?
+ rb_objspace_each_objects() doesn't work at sweep phase.
+ */
+}
+
+static void
+vm_clear_all_cache()
+{
+ vm_clear_global_method_cache();
+ vm_clear_all_inline_method_cache();
+ ruby_vm_global_state_version = 1;
+}
+
void
rb_vm_inc_const_missing_count(void)
{
diff --git a/vm_core.h b/vm_core.h
index 68f246521c..4d1780f303 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -586,11 +586,6 @@ enum vm_special_object_type {
/* inline cache */
typedef struct iseq_inline_cache_entry *IC;
-extern VALUE ruby_vm_global_state_version;
-
-#define GET_VM_STATE_VERSION() (ruby_vm_global_state_version)
-#define INC_VM_STATE_VERSION() \
- (ruby_vm_global_state_version = (ruby_vm_global_state_version+1) & 0x8fffffff)
void rb_vm_change_state(void);
typedef VALUE CDHASH;
diff --git a/vm_insnhelper.h b/vm_insnhelper.h
index 31ef216027..1b352937fe 100644
--- a/vm_insnhelper.h
+++ b/vm_insnhelper.h
@@ -208,4 +208,13 @@ extern VALUE ruby_vm_const_missing_count;
#endif
+static VALUE ruby_vm_global_state_version = 1;
+
+#define GET_VM_STATE_VERSION() (ruby_vm_global_state_version)
+#define INC_VM_STATE_VERSION() do { \
+ ruby_vm_global_state_version = (ruby_vm_global_state_version + 1); \
+ if (ruby_vm_global_state_version == 0) vm_clear_all_cache(); \
+} while (0)
+static void vm_clear_all_cache(void);
+
#endif /* RUBY_INSNHELPER_H */
diff --git a/vm_method.c b/vm_method.c
index 34fddcc01c..83026d8f33 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -23,6 +23,19 @@ static struct cache_entry cache[CACHE_SIZE];
#define ruby_running (GET_VM()->running)
/* int ruby_running = 0; */
+static void
+vm_clear_global_method_cache(void)
+{
+ struct cache_entry *ent, *end;
+
+ ent = cache;
+ end = ent + CACHE_SIZE;
+ while (ent < end) {
+ ent->filled_version = 0;
+ ent++;
+ }
+}
+
void
rb_clear_cache(void)
{