Просмотр исходного кода

ncd: NCDVal: optimize copying of strings

ambrop7 13 лет назад
Родитель
Сommit
ab62e48c79
1 измененных файлов с 9 добавлено и 5 удалено
  1. 9 5
      ncd/NCDVal.c

+ 9 - 5
ncd/NCDVal.c

@@ -423,16 +423,20 @@ NCDValRef NCDVal_NewCopy (NCDValMem *mem, NCDValRef val)
     
     switch (get_internal_type(*(int *)ptr)) {
         case NCDVAL_STRING: {
-            size_t len = NCDVal_StringLength(val);
+            struct NCDVal__string *str_e = ptr;
             
-            NCDValRef copy = NCDVal_NewStringUninitialized(mem, len);
-            if (NCDVal_IsInvalid(copy)) {
+            NCDVal__idx size = sizeof(struct NCDVal__string) + str_e->length + 1;
+            NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__string));
+            if (idx < 0) {
                 goto fail;
             }
             
-            memcpy((char *)NCDVal_StringData(copy), NCDVal_StringData(val), len);
+            str_e = NCDValMem__BufAt(val.mem, val.idx);
+            struct NCDVal__string *new_str_e = NCDValMem__BufAt(mem, idx);
             
-            return copy;
+            memcpy(new_str_e, str_e, size);
+            
+            return NCDVal__Ref(mem, idx);
         } break;
         
         case NCDVAL_LIST: {