compiler/libec: Fixed parsing memory leaks
authorJerome St-Louis <jerome@ecere.com>
Mon, 5 Dec 2011 05:41:38 +0000 (00:41 -0500)
committerJerome St-Louis <jerome@ecere.com>
Mon, 5 Dec 2011 05:41:38 +0000 (00:41 -0500)
compiler/libec/src/firstPass.ec
compiler/libec/src/freeAst.ec
compiler/libec/src/grammar.ec
compiler/libec/src/grammar.y
compiler/libec/src/pass15.ec

index 9eb3b55..4dd8d96 100644 (file)
@@ -277,13 +277,6 @@ static void AddDefinitions(Class regClass, DataMember member, OldList definition
                inCompiler ? propertyDef.setStmt : null, inCompiler ? propertyDef.getStmt : null);
 
             delete dataTypeString;
-
-            // Testing this... wasn't found anywhere, seems to be useful 
-            // (Determining if it's a conversion property in ProcessClassFunction)
-            // propertyDef.symbol.property = prop;
-
-            if(propertyDef.symbol.type)
-               propertyDef.symbol.type.refCount++;
          }
       }
    }
index 10ac681..2892815 100644 (file)
@@ -481,6 +481,10 @@ static void _FreeExpression(Expression exp, bool freePointer)
          if(exp._class)
             FreeSpecifier(exp._class);
          break;
+      case classDataExp:
+         if(exp.classData.id)
+            FreeIdentifier(exp.classData.id);
+            break;
    }
    if(freePointer)
    {
@@ -908,9 +912,16 @@ void FreeClassDef(ClassDef def)
       case accessOverrideClassDef:
          break;
       case classDataClassDef:
+      {
+         if(def.decl)
+            FreeDeclaration(def.decl);
          break;
+      }
       case classDesignerClassDef:
+      {
+         delete def.designer;
          break;
+      }
       case classFixedClassDef:
          break;
       case classNoExpansionClassDef:
@@ -922,11 +933,19 @@ void FreeClassDef(ClassDef def)
             FreeInitializer(def.initializer);
          break;
       case designerDefaultPropertyClassDef:
+      {
+         if(def.defaultProperty)
+            FreeIdentifier(def.defaultProperty);
          break;
+      }
       case memberAccessClassDef:
          break;
       case propertyWatchClassDef:
+      {
+         if(def.propertyWatch)
+            FreePropertyWatch(def.propertyWatch);
          break;
+      }
    }
    delete def;
 }
@@ -1053,6 +1072,7 @@ void FreeModuleData(Module module)
       DataMember dataMember;
       Method method;
       ClassTemplateParameter param;
+      ClassProperty classProp;
 
       if(_class.dataType)
       {
index 78409ec..84b7abf 100644 (file)
@@ -14355,6 +14355,21 @@ yyreduce:
     { ListAdd((yyvsp[-2].list), (yyvsp[0].exp)); ;}
     break;
 
+  case 625:
+#line 1986 "grammar.y"
+    { FreeList((yyvsp[0].list), FreeExpression); ;}
+    break;
+
+  case 626:
+#line 1987 "grammar.y"
+    { FreeList((yyvsp[0].list), FreeExpression); ;}
+    break;
+
+  case 627:
+#line 1988 "grammar.y"
+    { FreeList((yyvsp[0].list), FreeExpression); ;}
+    break;
+
   case 628:
 #line 1992 "grammar.y"
     { (yyval.list) = MkList(); ListAdd((yyval.list), (yyvsp[0].exp)); ;}
@@ -17622,7 +17637,7 @@ yyreduce:
     }
 
 /* Line 1037 of yacc.c.  */
-#line 17626 "grammar.ec"
+#line 17641 "grammar.ec"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
index fd02716..03ae39d 100644 (file)
@@ -1983,9 +1983,9 @@ expression_error:
    | expression ',' error 
    | expression_error ',' error 
    | expression error
-   | expression expression
-   | expression_error expression
-   | expression expression_error
+   | expression expression                      { FreeList($2, FreeExpression); }
+   | expression_error expression                { FreeList($2, FreeExpression); }
+   | expression expression_error                { FreeList($2, FreeExpression); }
    ;
 
 expression_anon_inst_error: 
index 63be380..d1d560e 100644 (file)
@@ -7916,12 +7916,14 @@ void ProcessExpressionType(Expression exp)
                         // If first expression is constant, try to match that first
                         if(CheckExpressionType(exp.op.exp1, exp.op.exp1.destType, false))
                         {
+                           if(exp.expType) FreeType(exp.expType);
                            exp.expType = exp.op.exp1.destType;
                            if(exp.op.exp1.destType) exp.op.exp1.destType.refCount++;
                            success = true;
                         }
                         else if(CheckExpressionType(exp.op.exp2, exp.op.exp2.destType, false))
                         {
+                           if(exp.expType) FreeType(exp.expType);
                            exp.expType = exp.op.exp2.destType;
                            if(exp.op.exp2.destType) exp.op.exp2.destType.refCount++;
                            success = true;
@@ -7931,12 +7933,14 @@ void ProcessExpressionType(Expression exp)
                      {
                         if(CheckExpressionType(exp.op.exp2, exp.op.exp2.destType, false))
                         {
+                           if(exp.expType) FreeType(exp.expType);
                            exp.expType = exp.op.exp2.destType;
                            if(exp.op.exp2.destType) exp.op.exp2.destType.refCount++;
                            success = true;
                         }
                         else if(CheckExpressionType(exp.op.exp1, exp.op.exp1.destType, false))
                         {
+                           if(exp.expType) FreeType(exp.expType);
                            exp.expType = exp.op.exp1.destType;
                            if(exp.op.exp1.destType) exp.op.exp1.destType.refCount++;
                            success = true;
@@ -8004,6 +8008,7 @@ void ProcessExpressionType(Expression exp)
 
                      CheckExpressionType(exp.op.exp2, exp.op.exp2.destType, false);
                      type2 = exp.op.exp2.destType;
+
                      exp.expType = type2;
                      type2.refCount++;
                   }
@@ -8030,15 +8035,18 @@ void ProcessExpressionType(Expression exp)
                      {
                         if(CheckExpressionType(exp.op.exp1, exp.op.exp2.expType, false))
                         {
+                           if(exp.expType) FreeType(exp.expType);
                            exp.expType = exp.op.exp1.expType;
                            if(exp.op.exp2.expType) exp.op.exp1.expType.refCount++;
                            valid = true;
                         }
                      }
+
                      else if(type2 && (type2.kind == classType && type2._class && type2._class.registered && type2._class.registered.type == enumClass && exp.op.exp1.expType))
                      {
                         if(CheckExpressionType(exp.op.exp2, exp.op.exp1.expType, false))
                         {
+                           if(exp.expType) FreeType(exp.expType);
                            exp.expType = exp.op.exp2.expType;
                            if(exp.op.exp2.expType) exp.op.exp2.expType.refCount++;
                            valid = true;
@@ -8094,6 +8102,7 @@ void ProcessExpressionType(Expression exp)
 
                      if(CheckExpressionType(exp.op.exp2, exp.op.exp2.destType, false))
                      {
+                        if(exp.expType) FreeType(exp.expType);
                         exp.expType = exp.op.exp2.destType;
                         if(exp.op.exp2.destType) exp.op.exp2.destType.refCount++;
                      }
@@ -8170,6 +8179,7 @@ void ProcessExpressionType(Expression exp)
 
                   if(CheckExpressionType(exp.op.exp1, exp.op.exp1.destType, false))
                   {
+                     if(exp.expType) FreeType(exp.expType);
                      exp.expType = exp.op.exp1.destType;
                      if(exp.op.exp1.destType) exp.op.exp1.destType.refCount++;
                   }