فهرست منبع

ncd: NCDVal: allow external strings to not be associated with a reference target

ambrop7 13 سال پیش
والد
کامیت
79bc3b7794
2فایلهای تغییر یافته به همراه16 افزوده شده و 12 حذف شده
  1. 10 7
      ncd/NCDVal.c
  2. 6 5
      ncd/NCDVal.h

+ 10 - 7
ncd/NCDVal.c

@@ -242,6 +242,7 @@ void NCDValMem_Free (NCDValMem *o)
     NCDVal__idx refidx = o->first_ref;
     while (refidx != -1) {
         struct NCDVal__ref *ref = NCDValMem__BufAt(o, refidx);
+        ASSERT(ref->target)
         NCDRefTarget_Deref(ref->target);
         refidx = ref->next;
     }
@@ -273,6 +274,7 @@ int NCDValMem_InitCopy (NCDValMem *o, NCDValMem *other)
     NCDVal__idx refidx = o->first_ref;
     while (refidx != -1) {
         struct NCDVal__ref *ref = NCDValMem__BufAt(o, refidx);
+        ASSERT(ref->target)
         if (!NCDRefTarget_Ref(ref->target)) {
             goto fail1;
         }
@@ -425,7 +427,6 @@ NCDValRef NCDVal_NewCopy (NCDValMem *mem, NCDValRef val)
         
         case EXTERNALSTRING_TYPE: {
             struct NCDVal__externalstring *exs_e = ptr;
-            ASSERT(exs_e->ref.target)
             
             return NCDVal_NewExternalString(mem, exs_e->data, exs_e->length, exs_e->ref.target);
         } break;
@@ -727,7 +728,6 @@ NCDValRef NCDVal_NewExternalString (NCDValMem *mem, const char *data, size_t len
     NCDVal__AssertMem(mem);
     ASSERT(data)
     NCDVal_AssertExternal(mem, data, len);
-    ASSERT(ref_target)
     
     bsize_t size = bsize_fromsize(sizeof(struct NCDVal__externalstring));
     NCDVal__idx idx = NCDValMem__Alloc(mem, size, __alignof(struct NCDVal__externalstring));
@@ -735,8 +735,10 @@ NCDValRef NCDVal_NewExternalString (NCDValMem *mem, const char *data, size_t len
         goto fail;
     }
     
-    if (!NCDRefTarget_Ref(ref_target)) {
-        goto fail;
+    if (ref_target) {
+        if (!NCDRefTarget_Ref(ref_target)) {
+            goto fail;
+        }
     }
     
     struct NCDVal__externalstring *exs_e = NCDValMem__BufAt(mem, idx);
@@ -744,9 +746,11 @@ NCDValRef NCDVal_NewExternalString (NCDValMem *mem, const char *data, size_t len
     exs_e->data = data;
     exs_e->length = len;
     exs_e->ref.target = ref_target;
-    exs_e->ref.next = mem->first_ref;
     
-    mem->first_ref = idx + offsetof(struct NCDVal__externalstring, ref);
+    if (ref_target) {
+        exs_e->ref.next = mem->first_ref;
+        mem->first_ref = idx + offsetof(struct NCDVal__externalstring, ref);
+    }
     
     return NCDVal__Ref(mem, idx);
     
@@ -882,7 +886,6 @@ NCDRefTarget * NCDVal_ExternalStringTarget (NCDValRef externalstring)
     ASSERT(NCDVal_IsExternalString(externalstring))
     
     struct NCDVal__externalstring *exs_e = NCDValMem__BufAt(externalstring.mem, externalstring.idx);
-    ASSERT(exs_e->ref.target)
     return exs_e->ref.target;
 }
 

+ 6 - 5
ncd/NCDVal.h

@@ -362,10 +362,10 @@ NCDValRef NCDVal_NewIdString (NCDValMem *mem, NCD_string_id_t string_id,
 
 /**
  * Builds a new string value pointing to the given external data. A reference to
- * the external data is taken using {@link NCDRefTarget}. The data must not change
- * while the reference is being held. Like ID-strings, external strings are
- * transparent for use. An external string can be recognized using
- * {@link NCDVal_IsExternalString}.
+ * the external data is taken using {@link NCDRefTarget}, unless 'ref_target' is
+ * NULL. The data must not change while this value exists. Like ID-strings,
+ * external strings are transparent for use. An external string can be recognized
+ * using {@link NCDVal_IsExternalString}.
  * 
  * Returns a reference to the new value, or an invalid reference
  * on out of memory.
@@ -438,7 +438,8 @@ NCD_string_id_t NCDVal_IdStringId (NCDValRef idstring);
 NCDStringIndex * NCDVal_IdStringStringIndex (NCDValRef idstring);
 
 /**
- * Returns the reference target of an external string.
+ * Returns the reference target of an external string. This may be NULL
+ * if the external string is not associated with a reference target.
  * The value given must be an external string value (which can be determined
  * via {@link NCDVal_IsExternalString}).
  */