Change reload-save-string/reload-retrieve-string to preserve type.
authorChris Hanson <org/chris-hanson/cph>
Tue, 24 Jan 2017 16:57:38 +0000 (08:57 -0800)
committerChris Hanson <org/chris-hanson/cph>
Tue, 24 Jan 2017 16:57:38 +0000 (08:57 -0800)
src/microcode/boot.c
src/microcode/bytevector.c
src/microcode/extern.h

index 15fda4245e995a12a0a47bda461764d03b7062e1..11fc8a25ad76b4995e6fcbf4fad95c5d1b94e895 100644 (file)
@@ -59,6 +59,7 @@ struct obstack ffi_obstack;
 void * initial_C_stack_pointer;
 static char * reload_saved_string;
 static unsigned int reload_saved_string_length;
+static bool reload_saved_legacy_p;
 
 void *
 obstack_chunk_alloc (size_t size)
@@ -291,21 +292,16 @@ DEFINE_PRIMITIVE ("RELOAD-SAVE-STRING", Prim_reload_save_string, 1, 1, 0)
   if ((ARG_REF (1)) != SHARP_F)
     {
       CHECK_ARG (1, STRING_P);
-      {
-       unsigned int length = (STRING_LENGTH (ARG_REF (1)));
-       if (length > 0)
-         {
-           reload_saved_string = (OS_malloc (length));
-           reload_saved_string_length = length;
-           {
-             char * scan = (STRING_POINTER (ARG_REF (1)));
-             char * end = (scan + length);
-             char * scan_result = reload_saved_string;
-             while (scan < end)
-               (*scan_result++) = (*scan++);
-           }
-         }
-      }
+      SCHEME_OBJECT string = (ARG_REF (1));
+      unsigned int length = (STRING_LENGTH (string));
+      if (length > 0)
+        {
+          reload_saved_legacy_p = (LEGACY_STRING_P (string));
+          reload_saved_string = (OS_malloc (length));
+          reload_saved_string_length = length;
+
+          memcpy (reload_saved_string, (STRING_POINTER (string)), length);
+        }
     }
   PRIMITIVE_RETURN (UNSPECIFIC);
 }
@@ -315,14 +311,15 @@ DEFINE_PRIMITIVE ("RELOAD-RETRIEVE-STRING", Prim_reload_retrieve_string, 0, 0, 0
   PRIMITIVE_HEADER (0);
   if (reload_saved_string == 0)
     PRIMITIVE_RETURN (SHARP_F);
-  {
-    SCHEME_OBJECT result =
-      (memory_to_string (reload_saved_string_length,
-                        ((unsigned char *) reload_saved_string)));
-    free (reload_saved_string);
-    reload_saved_string = 0;
-    PRIMITIVE_RETURN (result);
-  }
+
+  SCHEME_OBJECT result = reload_saved_legacy_p
+    ? (memory_to_string (reload_saved_string_length,
+                         ((unsigned char *) reload_saved_string)))
+    : (memory_to_bytevector (reload_saved_string_length,
+                             ((unsigned char *) reload_saved_string)));
+  free (reload_saved_string);
+  reload_saved_string = 0;
+  PRIMITIVE_RETURN (result);
 }
 
 DEFINE_PRIMITIVE ("BATCH-MODE?", Prim_batch_mode_p, 0, 0, 0)
index cf103da2985c0a956bfa4dbffa62675d5233abd7..bf070b6bc07c17d4324efc7ae52f714812383828 100644 (file)
@@ -37,7 +37,7 @@ USA.
 
 #define BYTEVECTOR_POINTER(v) ((uint8_t *) (MEMORY_LOC ((v), BYTEVECTOR_DATA)))
 
-static uint8_t *
+uint8_t *
 arg_bytevector (int n, unsigned long * len_r)
 {
   CHECK_ARG (n, BYTEVECTOR_P);
@@ -58,7 +58,7 @@ arg_byte (int n)
   return (uint8_t) value;
 }
 
-static SCHEME_OBJECT
+SCHEME_OBJECT
 allocate_bytevector (unsigned long nbytes)
 {
   SCHEME_OBJECT result
@@ -70,7 +70,7 @@ allocate_bytevector (unsigned long nbytes)
   return (result);
 }
 
-static SCHEME_OBJECT
+SCHEME_OBJECT
 memory_to_bytevector (unsigned long n_bytes, const void * vp)
 {
   SCHEME_OBJECT result = (allocate_bytevector (n_bytes));
index 47b51877b8133b977823de2202122a6226a265ce..c6f77061eb4351b9537be082f9b63860fcb18cf3 100644 (file)
@@ -298,6 +298,9 @@ extern SCHEME_OBJECT memory_to_string_no_gc (unsigned long, const void *);
 extern SCHEME_OBJECT char_pointer_to_string (const char *);
 extern SCHEME_OBJECT char_pointer_to_string_no_gc (const char *);
 extern unsigned char * string_to_char_pointer (SCHEME_OBJECT, unsigned long *);
+extern uint8_t * arg_bytevector (int, unsigned long *);
+extern SCHEME_OBJECT allocate_bytevector (unsigned long);
+extern SCHEME_OBJECT memory_to_bytevector (unsigned long, const void *);
 extern SCHEME_OBJECT allocate_bit_string (unsigned long);
 extern const char * arg_symbol (int);
 extern const char * arg_interned_symbol (int);