~ chicken-core (chicken-5) a1cd6afd5f38fb21c5fdfe2073fd2210bd2392ad


commit a1cd6afd5f38fb21c5fdfe2073fd2210bd2392ad
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat Apr 6 18:50:09 2019 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu May 2 15:38:42 2019 +0200

    Drop backwards compat support for keywords-as-NUL-prefixed-symbols
    
    Bump binary compatibility version to 11.
    
    After this change, #1576 has been fully fixed.

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 4ba8dda1..842f8645 100644
--- a/runtime.c
+++ b/runtime.c
@@ -2295,21 +2295,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);
 }
 
 
@@ -10631,20 +10623,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);
 }
@@ -12648,8 +12629,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
Trap