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

ncd: NCDVal: micro-optimization

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

+ 19 - 16
ncd/NCDVal.c

@@ -33,7 +33,6 @@
 #include <stddef.h>
 #include <stdarg.h>
 
-#include <misc/bsize.h>
 #include <misc/balloc.h>
 #include <misc/strdup.h>
 #include <misc/offset.h>
@@ -100,19 +99,15 @@ static void * NCDValMem__BufAt (NCDValMem *o, NCDVal__idx idx)
     return (o->buf ? o->buf : o->fastbuf) + idx;
 }
 
-static NCDVal__idx NCDValMem__Alloc (NCDValMem *o, bsize_t alloc_size, NCDVal__idx align)
+static NCDVal__idx NCDValMem__Alloc (NCDValMem *o, NCDVal__idx alloc_size, NCDVal__idx align)
 {
-    if (alloc_size.is_overflow) {
-        return -1;
-    }
-    
     NCDVal__idx mod = o->used % align;
     NCDVal__idx align_extra = mod ? (align - mod) : 0;
     
-    if (alloc_size.value > NCDVAL_MAXIDX - align_extra) {
+    if (alloc_size > NCDVAL_MAXIDX - align_extra) {
         return -1;
     }
-    NCDVal__idx aligned_alloc_size = align_extra + alloc_size.value;
+    NCDVal__idx aligned_alloc_size = align_extra + alloc_size;
     
     if (aligned_alloc_size > o->size - o->used) {
         NCDVal__idx newsize = (o->buf ? o->size : NCDVAL_FIRST_SIZE);
@@ -716,11 +711,11 @@ NCDValRef NCDVal_NewStringBin (NCDValMem *mem, const uint8_t *data, size_t len)
     ASSERT(len == 0 || data)
     NCDVal_AssertExternal(mem, data, len);
     
-    if (len == SIZE_MAX) {
+    if (len > NCDVAL_MAXIDX - sizeof(struct NCDVal__string) - 1) {
         goto fail;
     }
     
-    bsize_t size = bsize_add(bsize_fromsize(sizeof(struct NCDVal__string)), bsize_fromsize(len + 1));
+    NCDVal__idx size = sizeof(struct NCDVal__string) + len + 1;
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__string));
     if (idx < 0) {
         goto fail;
@@ -746,11 +741,11 @@ NCDValRef NCDVal_NewStringUninitialized (NCDValMem *mem, size_t len)
 {
     NCDVal__AssertMem(mem);
     
-    if (len == SIZE_MAX) {
+    if (len > NCDVAL_MAXIDX - sizeof(struct NCDVal__string) - 1) {
         goto fail;
     }
     
-    bsize_t size = bsize_add(bsize_fromsize(sizeof(struct NCDVal__string)), bsize_fromsize(len + 1));
+    NCDVal__idx size = sizeof(struct NCDVal__string) + len + 1;
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__string));
     if (idx < 0) {
         goto fail;
@@ -773,7 +768,7 @@ NCDValRef NCDVal_NewIdString (NCDValMem *mem, NCD_string_id_t string_id, NCDStri
     ASSERT(string_id >= 0)
     ASSERT(string_index)
     
-    bsize_t size = bsize_fromsize(sizeof(struct NCDVal__idstring));
+    NCDVal__idx size = sizeof(struct NCDVal__idstring);
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__idstring));
     if (idx < 0) {
         goto fail;
@@ -797,7 +792,7 @@ NCDValRef NCDVal_NewExternalString (NCDValMem *mem, const char *data, size_t len
     ASSERT(data)
     NCDVal_AssertExternal(mem, data, len);
     
-    bsize_t size = bsize_fromsize(sizeof(struct NCDVal__externalstring));
+    NCDVal__idx size = sizeof(struct NCDVal__externalstring);
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__externalstring));
     if (idx < 0) {
         goto fail;
@@ -1028,7 +1023,11 @@ NCDValRef NCDVal_NewList (NCDValMem *mem, size_t maxcount)
 {
     NCDVal__AssertMem(mem);
     
-    bsize_t size = bsize_add(bsize_fromsize(sizeof(struct NCDVal__list)), bsize_mul(bsize_fromsize(maxcount), bsize_fromsize(sizeof(NCDVal__idx))));
+    if (maxcount > (NCDVAL_MAXIDX - sizeof(struct NCDVal__list)) / sizeof(NCDVal__idx)) {
+        goto fail;
+    }
+    
+    NCDVal__idx size = sizeof(struct NCDVal__list) + maxcount * sizeof(NCDVal__idx);
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__list));
     if (idx < 0) {
         goto fail;
@@ -1153,7 +1152,11 @@ NCDValRef NCDVal_NewMap (NCDValMem *mem, size_t maxcount)
 {
     NCDVal__AssertMem(mem);
     
-    bsize_t size = bsize_add(bsize_fromsize(sizeof(struct NCDVal__map)), bsize_mul(bsize_fromsize(maxcount), bsize_fromsize(sizeof(struct NCDVal__mapelem))));
+    if (maxcount > (NCDVAL_MAXIDX - sizeof(struct NCDVal__map)) / sizeof(struct NCDVal__mapelem)) {
+        goto fail;
+    }
+    
+    NCDVal__idx size = sizeof(struct NCDVal__map) + maxcount * sizeof(struct NCDVal__mapelem);
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__map));
     if (idx < 0) {
         goto fail;