Browse Source

* problem with with and classes fixed

florian 27 years ago
parent
commit
7ff17144f4
4 changed files with 47 additions and 23 deletions
  1. 11 3
      compiler/cg386mem.pas
  2. 17 5
      compiler/pass_1.pas
  3. 13 13
      compiler/pexpr.pas
  4. 6 2
      compiler/symdef.inc

+ 11 - 3
compiler/cg386mem.pas

@@ -619,8 +619,13 @@ implementation
                secondpass(p^.left);
                secondpass(p^.left);
                ref.symbol:=nil;
                ref.symbol:=nil;
                gettempofsizereference(4,ref);
                gettempofsizereference(4,ref);
-               exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
-                 newreference(p^.left^.location.reference),R_EDI)));
+               if (p^.left^.resulttype^.deftype=objectdef) and
+                 pobjectdef(p^.left^.resulttype)^.isclass then
+                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
+                   newreference(p^.left^.location.reference),R_EDI)))
+               else
+                 exprasmlist^.concat(new(pai386,op_ref_reg(A_LEA,S_L,
+                   newreference(p^.left^.location.reference),R_EDI)));
                exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
                exprasmlist^.concat(new(pai386,op_reg_ref(A_MOV,S_L,
                  R_EDI,newreference(ref))));
                  R_EDI,newreference(ref))));
                del_reference(p^.left^.location.reference);
                del_reference(p^.left^.location.reference);
@@ -644,7 +649,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.11  1998-09-17 09:42:18  peter
+  Revision 1.12  1998-09-23 15:46:36  florian
+    * problem with with and classes fixed
+
+  Revision 1.11  1998/09/17 09:42:18  peter
     + pass_2 for cg386
     + pass_2 for cg386
     * Message() -> CGMessage() for pass_1/pass_2
     * Message() -> CGMessage() for pass_1/pass_2
 
 

+ 17 - 5
compiler/pass_1.pas

@@ -1289,11 +1289,20 @@ unit pass_1;
            end
            end
          else
          else
 
 
-         { is one of the sides a string ? }
-           if (ld^.deftype=stringdef) or (rd^.deftype=stringdef) then
+         { is one of the sides a shortstring ? }
+           if (rd^.deftype=stringdef) or (ld^.deftype=stringdef) then
             begin
             begin
-            { convert other side to a string, if not both site are strings,
-              the typeconv will put give an error if it's not possible }
+              {
+              if is_widestring(rd) or is_widestring(ld) then
+                begin
+                end
+              else if is_ansistring(rd) or is_ansistring(ld) then
+                begin
+                end
+              else if is_longstring(rd) or is_longstring(ld) then
+                begin
+                end
+              }
               if not((rd^.deftype=stringdef) and (ld^.deftype=stringdef)) then
               if not((rd^.deftype=stringdef) and (ld^.deftype=stringdef)) then
                begin
                begin
                  if ld^.deftype=stringdef then
                  if ld^.deftype=stringdef then
@@ -5781,7 +5790,10 @@ unit pass_1;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.91  1998-09-23 12:03:53  peter
+  Revision 1.92  1998-09-23 15:46:37  florian
+    * problem with with and classes fixed
+
+  Revision 1.91  1998/09/23 12:03:53  peter
     * overloading fix for array of const
     * overloading fix for array of const
 
 
   Revision 1.90  1998/09/23 09:58:49  peter
   Revision 1.90  1998/09/23 09:58:49  peter

+ 13 - 13
compiler/pexpr.pas

@@ -437,7 +437,7 @@ unit pexpr;
 
 
 
 
     { the following procedure handles the access to a property symbol }
     { the following procedure handles the access to a property symbol }
-    procedure handle_propertysym(sym : psym;var p1 : ptree;
+    procedure handle_propertysym(sym : psym;st : psymtable;var p1 : ptree;
       var pd : pdef);
       var pd : pdef);
 
 
       var
       var
@@ -470,8 +470,7 @@ unit pexpr;
                      begin
                      begin
                         { generate the method call }
                         { generate the method call }
                         p1:=genmethodcallnode(pprocsym(
                         p1:=genmethodcallnode(pprocsym(
-                          ppropertysym(sym)^.writeaccesssym),
-                          ppropertysym(sym)^.writeaccesssym^.owner,p1);
+                          ppropertysym(sym)^.writeaccesssym),st,p1);
                         { we know the procedure to call, so
                         { we know the procedure to call, so
                           force the usage of that procedure }
                           force the usage of that procedure }
                         p1^.procdefinition:=pprocdef(ppropertysym(sym)^.writeaccessdef);
                         p1^.procdefinition:=pprocdef(ppropertysym(sym)^.writeaccessdef);
@@ -488,8 +487,7 @@ unit pexpr;
                         { subscribed access? }
                         { subscribed access? }
                         if p1=nil then
                         if p1=nil then
                           begin
                           begin
-                             p1:=genloadnode(pvarsym(ppropertysym(sym)^.readaccesssym),
-                               ppropertysym(sym)^.readaccesssym^.owner);
+                             p1:=genloadnode(pvarsym(ppropertysym(sym)^.readaccesssym),st);
                           end
                           end
                         else
                         else
                           p1:=gensubscriptnode(pvarsym(
                           p1:=gensubscriptnode(pvarsym(
@@ -524,8 +522,8 @@ unit pexpr;
                         { subscribed access? }
                         { subscribed access? }
                         if p1=nil then
                         if p1=nil then
                           begin
                           begin
-                             p1:=genloadnode(pvarsym(ppropertysym(sym)^.readaccesssym),
-                               ppropertysym(sym)^.readaccesssym^.owner);
+                             p1:=genloadnode(pvarsym(
+                              ppropertysym(sym)^.readaccesssym),st);
                           end
                           end
                         else
                         else
                           p1:=gensubscriptnode(pvarsym(
                           p1:=gensubscriptnode(pvarsym(
@@ -535,8 +533,7 @@ unit pexpr;
                      begin
                      begin
                         { generate the method call }
                         { generate the method call }
                         p1:=genmethodcallnode(pprocsym(
                         p1:=genmethodcallnode(pprocsym(
-                          ppropertysym(sym)^.readaccesssym),
-                          ppropertysym(sym)^.readaccesssym^.owner,p1);
+                          ppropertysym(sym)^.readaccesssym),st,p1);
                         { we know the procedure to call, so
                         { we know the procedure to call, so
                           force the usage of that procedure }
                           force the usage of that procedure }
                         p1^.procdefinition:=pprocdef(ppropertysym(sym)^.readaccessdef);
                         p1^.procdefinition:=pprocdef(ppropertysym(sym)^.readaccessdef);
@@ -638,7 +635,7 @@ unit pexpr;
                    begin
                    begin
                       if isclassref then
                       if isclassref then
                         Message(parser_e_only_class_methods_via_class_ref);
                         Message(parser_e_only_class_methods_via_class_ref);
-                      handle_propertysym(sym,p1,pd);
+                      handle_propertysym(sym,srsymtable,p1,pd);
                    end;
                    end;
                  else internalerror(16);
                  else internalerror(16);
               end;
               end;
@@ -941,7 +938,7 @@ unit pexpr;
                                Message(parser_e_only_class_methods);
                                Message(parser_e_only_class_methods);
                               { no method pointer }
                               { no method pointer }
                               p1:=nil;
                               p1:=nil;
-                              handle_propertysym(srsym,p1,pd);
+                              handle_propertysym(srsym,srsymtable,p1,pd);
                             end;
                             end;
                  errorsym : begin
                  errorsym : begin
                               p1:=genzeronode(errorn);
                               p1:=genzeronode(errorn);
@@ -1078,7 +1075,7 @@ unit pexpr;
                         else
                         else
                           begin
                           begin
                              p1:=nil;
                              p1:=nil;
-                             handle_propertysym(propsym,p1,pd);
+                             handle_propertysym(propsym,propsym^.owner,p1,pd);
                           end;
                           end;
                       end
                       end
                     else
                     else
@@ -1751,7 +1748,10 @@ unit pexpr;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.53  1998-09-23 09:58:54  peter
+  Revision 1.54  1998-09-23 15:46:39  florian
+    * problem with with and classes fixed
+
+  Revision 1.53  1998/09/23 09:58:54  peter
     * first working array of const things
     * first working array of const things
 
 
   Revision 1.52  1998/09/20 09:38:45  florian
   Revision 1.52  1998/09/20 09:38:45  florian

+ 6 - 2
compiler/symdef.inc

@@ -1558,10 +1558,11 @@
          inherited done;
          inherited done;
       end;
       end;
 
 
-
     var
     var
        binittable : boolean;
        binittable : boolean;
+
     procedure check_rec_inittable(s : psym);
     procedure check_rec_inittable(s : psym);
+
       begin
       begin
          if (s^.typ=varsym) and
          if (s^.typ=varsym) and
             ((pvarsym(s)^.definition^.deftype<>objectdef)
             ((pvarsym(s)^.definition^.deftype<>objectdef)
@@ -3024,7 +3025,10 @@
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.49  1998-09-23 12:03:55  peter
+  Revision 1.50  1998-09-23 15:46:40  florian
+    * problem with with and classes fixed
+
+  Revision 1.49  1998/09/23 12:03:55  peter
     * overloading fix for array of const
     * overloading fix for array of const
 
 
   Revision 1.48  1998/09/22 15:37:23  peter
   Revision 1.48  1998/09/22 15:37:23  peter