wip II
[sdk] / compiler / libec / src / pass2.ec
index cca09c2..37b9fd6 100644 (file)
@@ -2174,23 +2174,30 @@ static void ProcessExpression(Expression exp)
                            _class = eSystem_FindClass(privateModule, "String");
                         if(!_class) _class = eSystem_FindClass(privateModule, "int");
 
-                        if(!strcmp(_class.name, "class"))
+                        if(_class.type == normalClass && destType.byReference == false && strcmp(_class.dataTypeString, "char *"))
                         {
-                           // Already inside a typed_object function, pass the class through
-                           strcpy(className, "class");
+                           exp.call.arguments->Insert(e.prev, MkExpPointer(CopyExpression(e), MkIdentifier("_class")));
                         }
                         else
                         {
-                           strcpy(className, "__ecereClass_");
-                           FullClassNameCat(className, _class.fullName, true);
-                           MangleClassName(className);
+                           if(!strcmp(_class.name, "class"))
+                           {
+                              // Already inside a typed_object function, pass the class through
+                              strcpy(className, "class");
+                           }
+                           else
+                           {
+                              strcpy(className, "__ecereClass_");
+                              FullClassNameCat(className, _class.fullName, true);
+                              MangleClassName(className);
 
-                           if(!_class.symbol)
-                              _class.symbol = FindClass(_class.fullName);
+                              if(!_class.symbol)
+                                 _class.symbol = FindClass(_class.fullName);
 
-                           DeclareClass(_class.symbol, className);
+                              DeclareClass(_class.symbol, className);
+                           }
+                           exp.call.arguments->Insert(e.prev, MkExpIdentifier(MkIdentifier(className)));
                         }
-                        exp.call.arguments->Insert(e.prev, MkExpIdentifier(MkIdentifier(className)));
                      }
                   }
                }
@@ -2219,7 +2226,7 @@ static void ProcessExpression(Expression exp)
       {
          bool changeToPtr = false;
          bool noHead = false;
-         Type type = exp.member.exp.expType;
+         Type type = exp.member.exp ? exp.member.exp.expType : null;
          Specifier memberClassSpecifier = exp.member.member ? exp.member.member._class : null;
          if(exp.member.member) exp.member.member._class = null;
 
@@ -2599,13 +2606,14 @@ static void ProcessExpression(Expression exp)
                else
                {
                   // If it's a this pointer, replace by precomputed shortcut
-                  if(thisPtr)
+                  if(exp.member.exp.type == identifierExp && thisPtr && (!exp.member.exp.expType || !exp.member.exp.expType.typedByReference))
                   {
                      char pointerName[1024];
 
                      strcpy(pointerName, "__ecerePointer_");
                      FullClassNameCat(pointerName, type._class.registered.fullName, false);
-                     FreeIdentifier(exp.member.exp.identifier);
+                     if(exp.member.exp.identifier)
+                        FreeIdentifier(exp.member.exp.identifier);
                      exp.member.exp.identifier = MkIdentifier(pointerName);
                   }
                   // Otherwise, access the data the hard way
@@ -2725,7 +2733,7 @@ static void ProcessExpression(Expression exp)
          FreeSpecifier(memberClassSpecifier);
 
          // Just moved this at the end... How is it?
-         if(exp.type == memberExp || exp.type == pointerExp)
+         if(exp.member.exp && (exp.type == memberExp || exp.type == pointerExp))
          {
             exp.member.exp.usage.usageGet = true;
             exp.member.exp.usage.usageMember = true;
@@ -2851,11 +2859,12 @@ static void ProcessExpression(Expression exp)
          {
             char className[1024];
             char * string = StringFromSpecDecl(exp._classExp.specifiers, exp._classExp.decl);
+            Symbol classSym = FindClass(string);
             
             strcpy(className, "__ecereClass_");
             FullClassNameCat(className, string, true);      // TODO: Verify this
             MangleClassName(className);
-            DeclareClass(FindClass(string), className);
+            DeclareClass(classSym, className);
             delete string;
 
             FreeList(exp._classExp.specifiers, FreeSpecifier);