From e4cef09f38577efc245ce080fde3d622215835cc Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Sat, 6 Apr 2019 18:50:09 +0200 Subject: [PATCH 2/2] Drop backwards compat support for keywords-as-NUL-prefixed-symbols Bump binary compatibility version to 11. After this change, #1576 has been fully fixed. --- NEWS | 4 ++++ defaults.make | 2 +- runtime.c | 33 +++++++-------------------------- tests/library-tests.scm | 5 +++-- 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/NEWS b/NEWS index c401e86a..781b1453 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ for symbols (they can now also start with NUL bytes). Keywords no longer have plists. Fixes #1576. +- Runtime system + - Increased the "binary compatibility version" to 11. + + 5.0.1 - Type system diff --git a/defaults.make b/defaults.make index 4da4d633..9ea214c1 100644 --- a/defaults.make +++ b/defaults.make @@ -27,7 +27,7 @@ # basic parameters -BINARYVERSION = 10 +BINARYVERSION = 11 STACKDIRECTION ?= 1 CROSS_CHICKEN ?= 0 diff --git a/runtime.c b/runtime.c index 2931f1ec..75dec603 100644 --- a/runtime.c +++ b/runtime.c @@ -2291,21 +2291,13 @@ void C_unregister_lf(void *handle) C_regparm C_word C_fcall C_intern(C_word **ptr, int len, C_char *str) { - if (*str == '\0') { /* OBSOLETE: Backwards compatibility */ - return C_intern_kw(ptr, len-1, str+1); - } else { - return C_intern_in(ptr, len, str, symbol_table); - } + return C_intern_in(ptr, len, str, symbol_table); } C_regparm C_word C_fcall C_h_intern(C_word *slot, int len, C_char *str) { - if (*str == '\0') { /* OBSOLETE: Backwards compatibility */ - return C_h_intern_kw(slot, len-1, str+1); - } else { - return C_h_intern_in(slot, len, str, symbol_table); - } + return C_h_intern_in(slot, len, str, symbol_table); } @@ -10009,20 +10001,9 @@ void C_ccall C_string_to_symbol(C_word c, C_word *av) len = C_header_size(string); name = (C_char *)C_data_pointer(string); - if (*name == '\0' && len > 1) { /* OBSOLETE: Backwards compatibility */ - key = hash_string(len-1, name+1, keyword_table->size, keyword_table->rand, 0); - if(!C_truep(s = lookup(key, len-1, name+1, keyword_table))) { - C_word *a2 = C_alloc(C_bytestowords(len-1)+1); - C_word string2 = C_string(&a2, len-1, name+1); - s = add_symbol(&a, key, string, keyword_table); - C_set_block_item(s, 0, s); /* Keywords evaluate to themselves */ - C_set_block_item(s, 2, C_SCHEME_FALSE); /* Keywords have no plists */ - } - } else { - key = hash_string(len, name, symbol_table->size, symbol_table->rand, 0); - if(!C_truep(s = lookup(key, len, name, symbol_table))) - s = add_symbol(&a, key, string, symbol_table); - } + key = hash_string(len, name, symbol_table->size, symbol_table->rand, 0); + if(!C_truep(s = lookup(key, len, name, symbol_table))) + s = add_symbol(&a, key, string, symbol_table); C_kontinue(k, s); } @@ -12026,8 +12007,8 @@ static C_regparm C_word C_fcall decode_literal2(C_word **ptr, C_char **str, } else if (**str == '\2') { val = C_h_intern_kw(dest, size, ++*str); } else { - /* Backwards compatibility */ - val = C_h_intern(dest, size, *str); + C_snprintf(buffer, sizeof(buffer), C_text("Unknown symbol subtype: %d"), (int)**str); + panic(buffer); } *str += size; break; diff --git a/tests/library-tests.scm b/tests/library-tests.scm index f7a1d3ff..1e19a632 100644 --- a/tests/library-tests.scm +++ b/tests/library-tests.scm @@ -328,8 +328,9 @@ (assert (eq? '##foo#bar '|##foo#bar|)) (assert (string=? "|\\x0a|" (with-output-to-string (lambda () (write '|\n|))))) -;; NOT YET, keywords are still prefixed with \000: -; (assert (string=? "|\000foo|" (with-output-to-string (lambda () (write '|\000foo|))))) +;; #1576 +(assert (string=? "|\\x00foo|" (with-output-to-string (lambda () (write '|\000foo|))))) +(assert (not (keyword? '|\000foo|))) (assert (string=? "|###foo#bar|" (with-output-to-string (lambda () (write '|###foo#bar|))))) ;;; Paren synonyms -- 2.11.0