diff options
| author | Andrea Corallo | 2019-11-05 20:47:34 +0100 |
|---|---|---|
| committer | Andrea Corallo | 2020-01-01 11:38:01 +0100 |
| commit | d392276b63cd0d9eb16f0e624bd8da9737cc66cb (patch) | |
| tree | 117d37db6b9930445aea796c9f4259c0053c4718 /src | |
| parent | 9f15b4c3ca98e6af3dfe61f70d0043ae896167ac (diff) | |
| download | emacs-d392276b63cd0d9eb16f0e624bd8da9737cc66cb.tar.gz emacs-d392276b63cd0d9eb16f0e624bd8da9737cc66cb.zip | |
allow nested loadings
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp.c | 45 |
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 | ||
| 3125 | static Lisp_Object Vnative_elisp_refs_hash; | 3125 | static Lisp_Object Vnative_elisp_refs_hash; |
| 3126 | dynlib_handle_ptr load_handle; | 3126 | static Lisp_Object load_handle_stack; |
| 3127 | 3127 | ||
| 3128 | static void | 3128 | static void |
| 3129 | prevent_gc (Lisp_Object obj) | 3129 | prevent_gc (Lisp_Object obj) |
| @@ -3147,9 +3147,9 @@ static int | |||
| 3147 | load_comp_unit (dynlib_handle_ptr handle) | 3147 | load_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, | |||
| 3269 | void | 3270 | void |
| 3270 | syms_of_comp (void) | 3271 | syms_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 */ |