diff --git a/7.3.441 b/7.3.441 new file mode 100644 index 0000000..9a7539b --- /dev/null +++ b/7.3.441 @@ -0,0 +1,341 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.441 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.441 +Problem: Newer versions of MzScheme (Racket) require earlier (trampolined) + initialisation. +Solution: Call mzscheme_main() early in main(). (Sergey Khorev) +Files: src/Make_mvc.mak, src/if_mzsch.c, src/main.c, + src/proto/if_mzsch.pro + + +*** ../vim-7.3.440/src/Make_mvc.mak 2011-09-14 19:01:38.000000000 +0200 +--- src/Make_mvc.mak 2012-02-12 01:46:05.000000000 +0100 +*************** +*** 740,745 **** +--- 740,747 ---- + !endif + !endif + MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj ++ # increase stack size ++ MZSCHEME_LIB = $(MZSCHEME_LIB) /STACK:8388608 + !endif + + # Perl interface +*** ../vim-7.3.440/src/if_mzsch.c 2010-11-03 21:59:23.000000000 +0100 +--- src/if_mzsch.c 2012-02-12 01:47:31.000000000 +0100 +*************** +*** 31,38 **** + * depend". */ + #if defined(FEAT_MZSCHEME) || defined(PROTO) + +- #include +- + /* Base data structures */ + #define SCHEME_VIMBUFFERP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type) + #define SCHEME_VIMWINDOWP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_window_type) +--- 31,36 ---- +*************** +*** 559,575 **** + hMzSch = vimLoadLib(sch_dll); + hMzGC = vimLoadLib(gc_dll); + +! if (!hMzSch) + { + if (verbose) +! EMSG2(_(e_loadlib), sch_dll); + return FAIL; + } + +! if (!hMzGC) + { + if (verbose) +! EMSG2(_(e_loadlib), gc_dll); + return FAIL; + } + +--- 557,573 ---- + hMzSch = vimLoadLib(sch_dll); + hMzGC = vimLoadLib(gc_dll); + +! if (!hMzGC) + { + if (verbose) +! EMSG2(_(e_loadlib), gc_dll); + return FAIL; + } + +! if (!hMzSch) + { + if (verbose) +! EMSG2(_(e_loadlib), sch_dll); + return FAIL; + } + +*************** +*** 798,862 **** + static __declspec(thread) void *tls_space; + #endif + +! void +! mzscheme_main(void) + { + #if MZSCHEME_VERSION_MAJOR >= 500 && defined(WIN32) && defined(USE_THREAD_LOCAL) + scheme_register_tls_space(&tls_space, 0); + #endif +! #if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400 +! /* use trampoline for precise GC in MzScheme >= 4.x */ +! scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL); + #else +! mzscheme_env_main(NULL, 0, NULL); + #endif + } + + static int +! mzscheme_env_main(Scheme_Env *env, int argc UNUSED, char **argv UNUSED) + { +! /* neither argument nor return values are used */ +! #ifdef MZ_PRECISE_GC +! # if MZSCHEME_VERSION_MAJOR < 400 +! /* +! * Starting from version 4.x, embedding applications must use +! * scheme_main_setup/scheme_main_stack_setup trampolines +! * rather than setting stack base directly with scheme_set_stack_base +! */ + Scheme_Object *dummy = NULL; + MZ_GC_DECL_REG(1); + MZ_GC_VAR_IN_REG(0, dummy); + + stack_base = &__gc_var_stack__; + # else +- /* environment has been created by us by Scheme */ +- environment = env; +- # endif +- /* +- * In 4.x, all activities must be performed inside trampoline +- * so we are forced to initialise GC immediately +- * This can be postponed in 3.x but I see no point in implementing +- * a feature which will work in older versions only. +- * One would better use conservative GC if he needs dynamic MzScheme +- */ +- mzscheme_init(); +- #else + int dummy = 0; + stack_base = (void *)&dummy; + #endif +! main_loop(FALSE, FALSE); +! #if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR < 400 + /* releasing dummy */ + MZ_GC_REG(); + MZ_GC_UNREG(); + #endif +! return 0; + } + + static void + startup_mzscheme(void) + { +! #if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400 + scheme_set_stack_base(stack_base, 1); + #endif + +--- 796,863 ---- + static __declspec(thread) void *tls_space; + #endif + +! /* +! * Since version 4.x precise GC requires trampolined startup. +! * Futures and places in version 5.x need it too. +! */ +! #if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400 \ +! || MZSCHEME_VERSION_MAJOR >= 500 && (defined(MZ_USE_FUTURES) || defined(MZ_USE_PLACES)) +! # ifdef DYNAMIC_MZSCHEME +! # error Precise GC v.4+ or Racket with futures/places do not support dynamic MzScheme +! # endif +! # define TRAMPOLINED_MZVIM_STARTUP +! #endif +! +! int +! mzscheme_main(int argc, char** argv) + { + #if MZSCHEME_VERSION_MAJOR >= 500 && defined(WIN32) && defined(USE_THREAD_LOCAL) + scheme_register_tls_space(&tls_space, 0); + #endif +! #ifdef TRAMPOLINED_MZVIM_STARTUP +! return scheme_main_setup(TRUE, mzscheme_env_main, argc, argv); + #else +! return mzscheme_env_main(NULL, argc, argv); + #endif + } + + static int +! mzscheme_env_main(Scheme_Env *env, int argc, char **argv) + { +! int vim_main_result; +! #ifdef TRAMPOLINED_MZVIM_STARTUP +! /* Scheme has created the environment for us */ +! environment = env; +! #else +! # ifdef MZ_PRECISE_GC + Scheme_Object *dummy = NULL; + MZ_GC_DECL_REG(1); + MZ_GC_VAR_IN_REG(0, dummy); + + stack_base = &__gc_var_stack__; + # else + int dummy = 0; + stack_base = (void *)&dummy; ++ # endif + #endif +! +! /* mzscheme_main is called as a trampoline from main. +! * We trampoline into vim_main2 +! * Passing argc, argv through from mzscheme_main +! */ +! vim_main_result = vim_main2(argc, argv); +! #if !defined(TRAMPOLINED_MZVIM_STARTUP) && defined(MZ_PRECISE_GC) + /* releasing dummy */ + MZ_GC_REG(); + MZ_GC_UNREG(); + #endif +! return vim_main_result; + } + + static void + startup_mzscheme(void) + { +! #ifndef TRAMPOLINED_MZVIM_STARTUP + scheme_set_stack_base(stack_base, 1); + #endif + +*************** +*** 868,874 **** + MZ_REGISTER_STATIC(exn_message); + MZ_REGISTER_STATIC(vim_exn); + +! #if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400 + /* in newer versions of precise GC the initial env has been created */ + environment = scheme_basic_env(); + #endif +--- 869,875 ---- + MZ_REGISTER_STATIC(exn_message); + MZ_REGISTER_STATIC(vim_exn); + +! #ifndef TRAMPOLINED_MZVIM_STARTUP + /* in newer versions of precise GC the initial env has been created */ + environment = scheme_basic_env(); + #endif +*************** +*** 3013,3019 **** + MZ_GC_REG(); + + tmp = scheme_make_struct_names(exn_name, scheme_null, 0, &nc); +- assert(nc <= 5); + mch_memmove(exn_names, tmp, nc * sizeof(Scheme_Object *)); + MZ_GC_CHECK(); + +--- 3014,3019 ---- +*** ../vim-7.3.440/src/main.c 2011-12-08 15:57:54.000000000 +0100 +--- src/main.c 2012-02-12 01:49:50.000000000 +0100 +*************** +*** 554,559 **** +--- 554,584 ---- + debug_break_level = params.use_debug_break_level; + #endif + ++ #ifdef FEAT_MZSCHEME ++ /* ++ * Newer version of MzScheme (Racket) require earlier (trampolined) ++ * initialisation via scheme_main_setup. ++ * Implement this by initialising it as early as possible ++ * and splitting off remaining Vim main into vim_main2 ++ */ ++ { ++ /* Pack up preprocessed command line arguments. ++ * It is safe because Scheme does not access argc/argv. */ ++ char *args[2]; ++ args[0] = (char *)fname; ++ args[1] = (char *)¶ms; ++ return mzscheme_main(2, args); ++ } ++ } ++ ++ int vim_main2(int argc, char **argv) ++ { ++ char_u *fname = (char_u *)argv[0]; ++ mparm_T params; ++ ++ memcpy(¶ms, argv[1], sizeof(params)); ++ #endif ++ + /* Execute --cmd arguments. */ + exe_pre_commands(¶ms); + +*************** +*** 957,970 **** + + /* + * Call the main command loop. This never returns. +! * For embedded MzScheme the main_loop will be called by Scheme +! * for proper stack tracking +! */ +! #ifndef FEAT_MZSCHEME + main_loop(FALSE, FALSE); +- #else +- mzscheme_main(); +- #endif + + return 0; + } +--- 982,989 ---- + + /* + * Call the main command loop. This never returns. +! */ + main_loop(FALSE, FALSE); + + return 0; + } +*** ../vim-7.3.440/src/proto/if_mzsch.pro 2010-08-15 21:57:28.000000000 +0200 +--- src/proto/if_mzsch.pro 2012-02-12 01:50:57.000000000 +0100 +*************** +*** 14,19 **** + void mzvim_reset_timer __ARGS((void)); + void *mzvim_eval_string __ARGS((char_u *str)); + int mzthreads_allowed __ARGS((void)); +! void mzscheme_main __ARGS((void)); + void do_mzeval __ARGS((char_u *str, typval_T *rettv)); + /* vim: set ft=c : */ +--- 14,20 ---- + void mzvim_reset_timer __ARGS((void)); + void *mzvim_eval_string __ARGS((char_u *str)); + int mzthreads_allowed __ARGS((void)); +! int mzscheme_main __ARGS((int argc, char **argv)); + void do_mzeval __ARGS((char_u *str, typval_T *rettv)); ++ int vim_main2 __ARGS((int argc, char **argv)); + /* vim: set ft=c : */ +*** ../vim-7.3.440/src/version.c 2012-02-12 01:35:06.000000000 +0100 +--- src/version.c 2012-02-12 01:54:14.000000000 +0100 +*************** +*** 716,717 **** +--- 716,719 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 441, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +43. You tell the kids they can't use the computer because "Daddy's got work to + do" and you don't even have a job. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///