Last active
December 17, 2015 04:08
-
-
Save shirosaki/5547805 to your computer and use it in GitHub Desktop.
Fix crash when GC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -r e85071312475 src/if_ruby.c | |
--- a/src/if_ruby.c Tue May 07 05:18:20 2013 +0200 | |
+++ b/src/if_ruby.c Fri May 10 12:09:19 2013 +0900 | |
@@ -144,6 +144,7 @@ | |
#endif | |
static int ruby_initialized = 0; | |
+static void *ruby_stack_start; | |
static VALUE objtbl; | |
static VALUE mVIM; | |
@@ -226,6 +227,7 @@ | |
# define rb_float_new dll_rb_float_new | |
# define rb_ary_new dll_rb_ary_new | |
# define rb_ary_push dll_rb_ary_push | |
+# define ruby_init_stack dll_ruby_init_stack | |
#else | |
# define rb_str2cstr dll_rb_str2cstr | |
#endif | |
@@ -250,7 +252,6 @@ | |
# define rb_enc_str_new dll_rb_enc_str_new | |
# define rb_sprintf dll_rb_sprintf | |
# define rb_require dll_rb_require | |
-# define ruby_init_stack dll_ruby_init_stack | |
# define ruby_process_options dll_ruby_process_options | |
#endif | |
@@ -335,6 +336,7 @@ | |
static VALUE (*dll_rb_float_new) (double); | |
static VALUE (*dll_rb_ary_new) (void); | |
static VALUE (*dll_rb_ary_push) (VALUE, VALUE); | |
+static void (*ruby_init_stack)(VALUE*); | |
#endif | |
#ifdef RUBY19_OR_LATER | |
static VALUE (*dll_rb_int2big)(SIGNED_VALUE); | |
@@ -347,7 +349,6 @@ | |
static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*); | |
static VALUE (*dll_rb_sprintf) (const char*, ...); | |
static VALUE (*dll_rb_require) (const char*); | |
-static void (*ruby_init_stack)(VALUE*); | |
static void* (*ruby_process_options)(int, char**); | |
#endif | |
@@ -475,6 +476,7 @@ | |
#endif | |
#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 | |
{"rb_string_value_ptr", (RUBY_PROC*)&dll_rb_string_value_ptr}, | |
+ {"ruby_init_stack", (RUBY_PROC*)&dll_ruby_init_stack}, | |
# if DYNAMIC_RUBY_VER <= 19 | |
{"rb_float_new", (RUBY_PROC*)&dll_rb_float_new}, | |
# else | |
@@ -491,7 +493,6 @@ | |
{"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new}, | |
{"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf}, | |
{"rb_require", (RUBY_PROC*)&dll_rb_require}, | |
- {"ruby_init_stack", (RUBY_PROC*)&dll_ruby_init_stack}, | |
{"ruby_process_options", (RUBY_PROC*)&dll_ruby_process_options}, | |
#endif | |
{"", NULL}, | |
@@ -716,8 +717,8 @@ | |
NtInitialize(&argc, &argv); | |
#endif | |
{ | |
-#ifdef RUBY19_OR_LATER | |
- RUBY_INIT_STACK; | |
+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 | |
+ ruby_init_stack(ruby_stack_start); | |
#endif | |
ruby_init(); | |
} | |
@@ -1389,3 +1390,9 @@ | |
rb_define_virtual_variable("$curbuf", buffer_s_current, 0); | |
rb_define_virtual_variable("$curwin", window_s_current, 0); | |
} | |
+ | |
+void vim_ruby_init(void *stack_start) | |
+{ | |
+ /* should get machine stack start address early in main function */ | |
+ ruby_stack_start = stack_start; | |
+} | |
diff -r e85071312475 src/main.c | |
--- a/src/main.c Tue May 07 05:18:20 2013 +0200 | |
+++ b/src/main.c Fri May 10 12:09:19 2013 +0900 | |
@@ -192,6 +192,13 @@ | |
params.window_count = -1; | |
#endif | |
+#ifdef FEAT_RUBY | |
+ { | |
+ int ruby_stack_start; | |
+ vim_ruby_init((void *)&ruby_stack_start); | |
+ } | |
+#endif | |
+ | |
#ifdef FEAT_TCL | |
vim_tcl_init(params.argv[0]); | |
#endif | |
diff -r e85071312475 src/proto/if_ruby.pro | |
--- a/src/proto/if_ruby.pro Tue May 07 05:18:20 2013 +0200 | |
+++ b/src/proto/if_ruby.pro Fri May 10 12:09:19 2013 +0900 | |
@@ -6,4 +6,5 @@ | |
void ex_rubyfile __ARGS((exarg_T *eap)); | |
void ruby_buffer_free __ARGS((buf_T *buf)); | |
void ruby_window_free __ARGS((win_T *win)); | |
+void vim_ruby_init __ARGS((void *stack_start)); | |
/* vim: set ft=c : */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment