Переглянути джерело

ncd: NCDVal: make sure fastbuf is aligned

ambrop7 13 роки тому
батько
коміт
3937905ee7
1 змінених файлів з 26 додано та 18 видалено
  1. 26 18
      ncd/NCDVal.h

+ 26 - 18
ncd/NCDVal.h

@@ -40,7 +40,7 @@
 
 // these are implementation details. The interface is defined below.
 
-#define NCDVAL_FASTBUF_SIZE 60
+#define NCDVAL_FASTBUF_SIZE 64
 #define NCDVAL_FIRST_SIZE 256
 
 #define NCDVAL_MAXIDX INT_MAX
@@ -48,23 +48,6 @@
 
 typedef int NCDVal__idx;
 
-typedef struct {
-    char *buf;
-    NCDVal__idx size;
-    NCDVal__idx used;
-    NCDVal__idx first_ref;
-    char fastbuf[NCDVAL_FASTBUF_SIZE];
-} NCDValMem;
-
-typedef struct {
-    NCDValMem *mem;
-    NCDVal__idx idx;
-} NCDValRef;
-
-typedef struct {
-    NCDVal__idx idx;
-} NCDValSafeRef;
-
 struct NCDVal__ref {
     NCDVal__idx next;
     NCDRefTarget *target;
@@ -104,6 +87,31 @@ struct NCDVal__externalstring {
     struct NCDVal__ref ref;
 };
 
+typedef struct {
+    char *buf;
+    NCDVal__idx size;
+    NCDVal__idx used;
+    NCDVal__idx first_ref;
+    union {
+        char fastbuf[NCDVAL_FASTBUF_SIZE];
+        struct NCDVal__ref align_ref;
+        struct NCDVal__string align_string;
+        struct NCDVal__list align_list;
+        struct NCDVal__mapelem align_mapelem;
+        struct NCDVal__idstring align_idstring;
+        struct NCDVal__externalstring align_externalstring;
+    };
+} NCDValMem;
+
+typedef struct {
+    NCDValMem *mem;
+    NCDVal__idx idx;
+} NCDValRef;
+
+typedef struct {
+    NCDVal__idx idx;
+} NCDValSafeRef;
+
 typedef struct NCDVal__mapelem NCDVal__maptree_entry;
 typedef NCDValMem *NCDVal__maptree_arg;