~ chicken-core (chicken-5) aeec82d1840b311d225aa59df7785594463faa23
commit aeec82d1840b311d225aa59df7785594463faa23 Author: Peter Bex <peter@more-magic.net> AuthorDate: Fri May 24 22:23:20 2019 +0200 Commit: Kooda <kooda@upyum.com> CommitDate: Sat May 25 10:42:45 2019 +0200 Fix obscure bug triggered by marking keywords persistable When a keyword has already been read at runtime, and then compiled code is invoked which calls C_h_intern_kw, the keyword will already exist. This is when it is marked as persistent because there's an lf[] referring to it, so it can't be garbage collected. The C_i_persist_symbol() call would then bail out because the offered object is not a symbol but a keyword (the check was done with C_i_check_symbol). This caused several eggs depending on "foreigners" to break, because it exports a macro in the import library which happens to use a keyword. Signed-off-by: Kooda <kooda@upyum.com> diff --git a/runtime.c b/runtime.c index 8a51fd82..30620a22 100644 --- a/runtime.c +++ b/runtime.c @@ -2442,7 +2442,13 @@ C_regparm C_word C_fcall C_i_persist_symbol(C_word sym) C_word bucket; C_SYMBOL_TABLE *stp; - C_i_check_symbol(sym); + /* Normally, this will get called with a symbol, but in + * C_h_intern_kw we may call it with keywords too. + */ + if(!C_truep(C_i_symbolp(sym)) && !C_truep(C_i_keywordp(sym))) { + error_location = C_SCHEME_FALSE; + barf(C_BAD_ARGUMENT_TYPE_NO_SYMBOL_ERROR, NULL, sym); + } for(stp = symbol_table_list; stp != NULL; stp = stp->next) { bucket = lookup_bucket(sym, stp);Trap