Allow string operations to take Unicode strings with 1 byte per CP.
authorChris Hanson <org/chris-hanson/cph>
Thu, 20 Apr 2017 00:44:44 +0000 (17:44 -0700)
committerChris Hanson <org/chris-hanson/cph>
Thu, 20 Apr 2017 00:44:44 +0000 (17:44 -0700)
src/microcode/object.h
src/microcode/string.c

index bb5fc57148743ba884ecc373d2d83814ef6403d3..9b5e02a28caea08a3a692806431ee307a8bb442f 100644 (file)
@@ -177,6 +177,7 @@ extern SCHEME_OBJECT * memory_base;
 #define CHARACTER_P(object) ((OBJECT_TYPE (object)) == TC_CHARACTER)
 #define BYTEVECTOR_P(object) ((OBJECT_TYPE (object)) == TC_BYTEVECTOR)
 #define LEGACY_STRING_P(object) ((OBJECT_TYPE (object)) == TC_CHARACTER_STRING)
+#define UNICODE_STRING_P(object) ((OBJECT_TYPE (object)) == TC_UNICODE_STRING)
 #define BIT_STRING_P(object) ((OBJECT_TYPE (object)) == TC_BIT_STRING)
 #define CELL_P(object) ((OBJECT_TYPE (object)) == TC_CELL)
 #define PAIR_P(object) ((OBJECT_TYPE (object)) == TC_LIST)
index 0cc0d084f573431e584a2f5bc95603e77a4de9cc..22551e7b5c02ccb7c0fbb7dc28f9b1d6e5c4c512 100644 (file)
@@ -33,7 +33,15 @@ USA.
 bool
 string_p (SCHEME_OBJECT object)
 {
-  return ((LEGACY_STRING_P (object)) || (BYTEVECTOR_P (object)));
+  return ((LEGACY_STRING_P (object))
+          || (BYTEVECTOR_P (object))
+          || ((UNICODE_STRING_P (object))
+              // This tests that the ustring-cp-size is == 1, meaning
+              // one byte per code point.  This must be kept in sync
+              // with "runtime/ustring.scm".
+              && (((OBJECT_TYPE (MEMORY_REF (object, BYTEVECTOR_LENGTH_INDEX)))
+                   && 0x03)
+                  == 0x01)));
 }
 
 SCHEME_OBJECT