You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2011/02/18 23:52:52 UTC

[lucy-commits] svn commit: r1072185 - in /incubator/lucy/trunk/clownfish/src: CFCSymbol.c CFCVariable.c

Author: marvin
Date: Fri Feb 18 22:52:51 2011
New Revision: 1072185

URL: http://svn.apache.org/viewvc?rev=1072185&view=rev
Log:
Move validation and assignment around in CFCVariable and CFCSymbol
constructors so that validation errors get thrown before memory can be leaked.

Modified:
    incubator/lucy/trunk/clownfish/src/CFCSymbol.c
    incubator/lucy/trunk/clownfish/src/CFCVariable.c

Modified: incubator/lucy/trunk/clownfish/src/CFCSymbol.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCSymbol.c?rev=1072185&r1=1072184&r2=1072185&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCSymbol.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCSymbol.c Fri Feb 18 22:52:51 2011
@@ -131,30 +131,27 @@ CFCSymbol_init(CFCSymbol *self, struct C
                const char *exposure, const char *class_name, 
                const char *class_cnick, const char *micro_sym)
 {
-    // Validate parcel.
+    // Validate.
     CFCUTIL_NULL_CHECK(parcel);
-
-    // Validate exposure.
     if (!S_validate_exposure(exposure)) {
         croak("Invalid exposure: '%s'", exposure ? exposure : "[NULL]");
     }
-    self->exposure = CFCUtil_strdup(exposure);
-
-    // Validate class name (if supplied);
     if (class_name && !S_validate_class_name(class_name)) {
         croak("Invalid class_name: '%s'", class_name);
     }
-    self->class_name = CFCUtil_strdup(class_name);
+    if (!micro_sym || !S_validate_identifier(micro_sym)) {
+        croak("Invalid micro_sym: '%s'",  micro_sym ? micro_sym : "[NULL]");
+    }
 
     // Derive class_cnick if necessary, then validate.
+    const char *real_cnick = NULL;
     if (class_name) {
         if (class_cnick) {
-            self->class_cnick = CFCUtil_strdup(class_cnick);
+            real_cnick = class_cnick;
         }
         else {
             const char *last_colon = strrchr(class_name, ':');
-            const char *cnick = last_colon ? last_colon + 1 : class_name;
-            self->class_cnick = CFCUtil_strdup(cnick);
+            real_cnick = last_colon ? last_colon + 1 : class_name;
         }
     }
     else if (class_cnick) {
@@ -162,19 +159,18 @@ CFCSymbol_init(CFCSymbol *self, struct C
         croak("Can't supply class_cnick without class_name");
     }
     else {
-        self->class_cnick = NULL;
+        real_cnick = NULL;
     }
-    if (self->class_cnick && !S_validate_class_cnick(self->class_cnick)) {
-        croak("Invalid class_cnick: '%s'", self->class_cnick);
-    }
-
-    if (!micro_sym || !S_validate_identifier(micro_sym)) {
-        croak("Invalid micro_sym: '%s'",  micro_sym ? micro_sym : "[NULL]");
+    if (real_cnick && !S_validate_class_cnick(real_cnick)) {
+        croak("Invalid class_cnick: '%s'", real_cnick);
     }
-    self->micro_sym = CFCUtil_strdup(micro_sym);
 
-    // Assign parcel.
-    self->parcel = (CFCParcel*)CFCBase_incref((CFCBase*)parcel);
+    // Assign.
+    self->parcel      = (CFCParcel*)CFCBase_incref((CFCBase*)parcel);
+    self->exposure    = CFCUtil_strdup(exposure);
+    self->class_name  = CFCUtil_strdup(class_name);
+    self->class_cnick = CFCUtil_strdup(real_cnick);
+    self->micro_sym   = CFCUtil_strdup(micro_sym);
 
     // Derive short_sym.
     size_t class_cnick_len = self->class_cnick 

Modified: incubator/lucy/trunk/clownfish/src/CFCVariable.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCVariable.c?rev=1072185&r1=1072184&r2=1072185&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCVariable.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCVariable.c Fri Feb 18 22:52:51 2011
@@ -58,6 +58,9 @@ CFCVariable_init(CFCVariable *self, stru
                  const char *class_cnick, const char *micro_sym, 
                  struct CFCType *type)
 {
+    // Validate type.
+    CFCUTIL_NULL_CHECK(type);
+
     // Default exposure to "local".
     const char *real_exposure = exposure ? exposure : "local";
 
@@ -65,7 +68,6 @@ CFCVariable_init(CFCVariable *self, stru
         class_cnick, micro_sym);
 
     // Assign type.
-    CFCUTIL_NULL_CHECK(type);
     self->type = (CFCType*)CFCBase_incref((CFCBase*)type);
 
     // Cache various C string representations.