aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrea Corallo2019-11-05 20:47:34 +0100
committerAndrea Corallo2020-01-01 11:38:01 +0100
commitd392276b63cd0d9eb16f0e624bd8da9737cc66cb (patch)
tree117d37db6b9930445aea796c9f4259c0053c4718 /src
parent9f15b4c3ca98e6af3dfe61f70d0043ae896167ac (diff)
downloademacs-d392276b63cd0d9eb16f0e624bd8da9737cc66cb.tar.gz
emacs-d392276b63cd0d9eb16f0e624bd8da9737cc66cb.zip
allow nested loadings
Diffstat (limited to 'src')
-rw-r--r--src/comp.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/src/comp.c b/src/comp.c
index ba56cc1ab19..1aa0636c5b7 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -3123,7 +3123,7 @@ helper_PSEUDOVECTOR_TYPEP_XUNTAG (Lisp_Object a, enum pvec_type code)
3123/**************************************/ 3123/**************************************/
3124 3124
3125static Lisp_Object Vnative_elisp_refs_hash; 3125static Lisp_Object Vnative_elisp_refs_hash;
3126dynlib_handle_ptr load_handle; 3126static Lisp_Object load_handle_stack;
3127 3127
3128static void 3128static void
3129prevent_gc (Lisp_Object obj) 3129prevent_gc (Lisp_Object obj)
@@ -3147,9 +3147,9 @@ static int
3147load_comp_unit (dynlib_handle_ptr handle) 3147load_comp_unit (dynlib_handle_ptr handle)
3148{ 3148{
3149 /* Imported data. */ 3149 /* Imported data. */
3150 Lisp_Object *data_relocs = dynlib_sym (load_handle, DATA_RELOC_SYM); 3150 Lisp_Object *data_relocs = dynlib_sym (handle, DATA_RELOC_SYM);
3151 3151
3152 Lisp_Object d_vec = load_static_obj (load_handle, TEXT_DATA_RELOC_SYM); 3152 Lisp_Object d_vec = load_static_obj (handle, TEXT_DATA_RELOC_SYM);
3153 EMACS_UINT d_vec_len = XFIXNUM (Flength (d_vec)); 3153 EMACS_UINT d_vec_len = XFIXNUM (Flength (d_vec));
3154 3154
3155 for (EMACS_UINT i = 0; i < d_vec_len; i++) 3155 for (EMACS_UINT i = 0; i < d_vec_len; i++)
@@ -3160,9 +3160,9 @@ load_comp_unit (dynlib_handle_ptr handle)
3160 3160
3161 /* Imported functions. */ 3161 /* Imported functions. */
3162 Lisp_Object (**f_relocs)(void) = 3162 Lisp_Object (**f_relocs)(void) =
3163 dynlib_sym (load_handle, IMPORTED_FUNC_RELOC_SYM); 3163 dynlib_sym (handle, IMPORTED_FUNC_RELOC_SYM);
3164 Lisp_Object f_vec = 3164 Lisp_Object f_vec =
3165 load_static_obj (load_handle, TEXT_IMPORTED_FUNC_RELOC_SYM); 3165 load_static_obj (handle, TEXT_IMPORTED_FUNC_RELOC_SYM);
3166 EMACS_UINT f_vec_len = XFIXNUM (Flength (f_vec)); 3166 EMACS_UINT f_vec_len = XFIXNUM (Flength (f_vec));
3167 for (EMACS_UINT i = 0; i < f_vec_len; i++) 3167 for (EMACS_UINT i = 0; i < f_vec_len; i++)
3168 { 3168 {
@@ -3213,7 +3213,7 @@ load_comp_unit (dynlib_handle_ptr handle)
3213 } 3213 }
3214 3214
3215 /* Executing this will perform all the expected environment modification. */ 3215 /* Executing this will perform all the expected environment modification. */
3216 void (*top_level_run)(void) = dynlib_sym (load_handle, "top_level_run"); 3216 void (*top_level_run)(void) = dynlib_sym (handle, "top_level_run");
3217 top_level_run (); 3217 top_level_run ();
3218 3218
3219 return 0; 3219 return 0;
@@ -3227,10 +3227,11 @@ DEFUN ("comp--register-subr", Fcomp__register_subr,
3227 (Lisp_Object name, Lisp_Object minarg, Lisp_Object maxarg, 3227 (Lisp_Object name, Lisp_Object minarg, Lisp_Object maxarg,
3228 Lisp_Object c_name, Lisp_Object doc) 3228 Lisp_Object c_name, Lisp_Object doc)
3229{ 3229{
3230 if (!load_handle) 3230 dynlib_handle_ptr handle = xmint_pointer (XCAR (load_handle_stack));
3231 if (!handle)
3231 error ("comp--register-subr can only be called during native code load phase."); 3232 error ("comp--register-subr can only be called during native code load phase.");
3232 3233
3233 void *func = dynlib_sym (load_handle, SSDATA (c_name)); 3234 void *func = dynlib_sym (handle, SSDATA (c_name));
3234 eassert (func); 3235 eassert (func);
3235 3236
3236 union Aligned_Lisp_Subr *x = xmalloc (sizeof (union Aligned_Lisp_Subr)); 3237 union Aligned_Lisp_Subr *x = xmalloc (sizeof (union Aligned_Lisp_Subr));
@@ -3251,17 +3252,17 @@ DEFUN ("native-elisp-load", Fnative_elisp_load, Snative_elisp_load, 1, 1, 0,
3251 (Lisp_Object file) 3252 (Lisp_Object file)
3252{ 3253{
3253 CHECK_STRING (file); 3254 CHECK_STRING (file);
3254 load_handle = dynlib_open (SSDATA (file)); 3255 dynlib_handle_ptr handle = dynlib_open (SSDATA (file));
3255 if (!load_handle) 3256 load_handle_stack = Fcons (make_mint_ptr (handle), load_handle_stack);
3257 if (!handle)
3256 xsignal2 (Qcomp_unit_open_failed, file, build_string (dynlib_error ())); 3258 xsignal2 (Qcomp_unit_open_failed, file, build_string (dynlib_error ()));
3257 3259
3258 int r = load_comp_unit (load_handle); 3260 int r = load_comp_unit (handle);
3259
3260 load_handle = NULL;
3261
3262 if (r != 0) 3261 if (r != 0)
3263 xsignal2 (Qcomp_unit_init_failed, file, INT_TO_INTEGER (r)); 3262 xsignal2 (Qcomp_unit_init_failed, file, INT_TO_INTEGER (r));
3264 3263
3264 load_handle_stack = XCDR (load_handle_stack);
3265
3265 return Qt; 3266 return Qt;
3266} 3267}
3267 3268
@@ -3269,12 +3270,6 @@ DEFUN ("native-elisp-load", Fnative_elisp_load, Snative_elisp_load, 1, 1, 0,
3269void 3270void
3270syms_of_comp (void) 3271syms_of_comp (void)
3271{ 3272{
3272 staticpro (&Vnative_elisp_refs_hash);
3273 Vnative_elisp_refs_hash
3274 = make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE,
3275 DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
3276 Qnil, false);
3277
3278 /* Limple instruction set. */ 3273 /* Limple instruction set. */
3279 DEFSYM (Qcomment, "comment"); 3274 DEFSYM (Qcomment, "comment");
3280 DEFSYM (Qjump, "jump"); 3275 DEFSYM (Qjump, "jump");
@@ -3345,8 +3340,16 @@ syms_of_comp (void)
3345 doc: /* 3340 doc: /*
3346 The compiler context. */); 3341 The compiler context. */);
3347 Vcomp_ctxt = Qnil; 3342 Vcomp_ctxt = Qnil;
3348
3349 comp_speed = DEFAULT_SPEED; 3343 comp_speed = DEFAULT_SPEED;
3344
3345 /* Load mechanism. */
3346 staticpro (&Vnative_elisp_refs_hash);
3347 Vnative_elisp_refs_hash
3348 = make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE,
3349 DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
3350 Qnil, false);
3351 staticpro (&load_handle_stack);
3352 load_handle_stack = Qnil;
3350} 3353}
3351 3354
3352#endif /* HAVE_NATIVE_COMP */ 3355#endif /* HAVE_NATIVE_COMP */