Browse Source

* no_fast_exit if procedure contains implicit termination code

pierre 26 years ago
parent
commit
dcaad61969
6 changed files with 39 additions and 7 deletions
  1. 9 1
      compiler/hcodegen.pas
  2. 6 1
      compiler/tcadd.pas
  3. 6 1
      compiler/tccal.pas
  4. 7 1
      compiler/tccnv.pas
  5. 5 2
      compiler/tcflw.pas
  6. 6 1
      compiler/tcld.pas

+ 9 - 1
compiler/hcodegen.pas

@@ -88,6 +88,9 @@ implementation
           { true, if the procedure should be exported (only OS/2) }
           exported : boolean;
 
+          { true, if we can not use fast exit code }
+          no_fast_exit : boolean;
+
           { code for the current procedure }
           aktproccode,aktentrycode,
           aktexitcode,aktlocaldata : paasmoutput;
@@ -288,6 +291,8 @@ implementation
         framepointer:=R_NO;
         globalsymbol:=false;
         exported:=false;
+        no_fast_exit:=false;
+
         aktentrycode:=new(paasmoutput,init);
         aktexitcode:=new(paasmoutput,init);
         aktproccode:=new(paasmoutput,init);
@@ -400,7 +405,10 @@ end.
 
 {
   $Log$
-  Revision 1.51  1999-12-01 12:42:32  peter
+  Revision 1.52  1999-12-09 23:18:04  pierre
+   * no_fast_exit if procedure contains implicit termination code
+
+  Revision 1.51  1999/12/01 12:42:32  peter
     * fixed bug 698
     * removed some notes about unused vars
 

+ 6 - 1
compiler/tcadd.pas

@@ -759,6 +759,8 @@ implementation
                      p^.right:=gentypeconvnode(p^.right,cansistringdef);
                    if not(is_ansistring(ld)) then
                      p^.left:=gentypeconvnode(p^.left,cansistringdef);
+                   { we use ansistrings so no fast exit here }
+                   procinfo^.no_fast_exit:=true;
                    p^.resulttype:=cansistringdef;
                    { this is only for add, the comparisaion is handled later }
                    p^.location.loc:=LOC_REGISTER;
@@ -1188,7 +1190,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.59  1999-12-01 12:42:33  peter
+  Revision 1.60  1999-12-09 23:18:04  pierre
+   * no_fast_exit if procedure contains implicit termination code
+
+  Revision 1.59  1999/12/01 12:42:33  peter
     * fixed bug 698
     * removed some notes about unused vars
 

+ 6 - 1
compiler/tccal.pas

@@ -1113,6 +1113,8 @@ implementation
                              p^.location.loc:=LOC_MEM;
                              { this is wrong we still need one register  PM
                              p^.registers32:=0; }
+                             { we use ansistrings so no fast exit here }
+                             procinfo^.no_fast_exit:=true;
                              p^.registers32:=1;
                           end;
                      end
@@ -1221,7 +1223,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.74  1999-11-30 10:40:57  peter
+  Revision 1.75  1999-12-09 23:18:04  pierre
+   * no_fast_exit if procedure contains implicit termination code
+
+  Revision 1.74  1999/11/30 10:40:57  peter
     + ttype, tsymlist
 
   Revision 1.73  1999/11/18 15:34:49  pierre

+ 7 - 1
compiler/tccnv.pas

@@ -285,6 +285,9 @@ implementation
            end;
          { for simplicity lets first keep all ansistrings
            as LOC_MEM, could also become LOC_REGISTER }
+         if pstringdef(p^.resulttype)^.string_typ in [st_ansistring,st_widestring] then
+           { we may use ansistrings so no fast exit here }
+           procinfo^.no_fast_exit:=true;
          p^.location.loc:=LOC_MEM;
       end;
 
@@ -961,7 +964,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.54  1999-11-30 10:40:57  peter
+  Revision 1.55  1999-12-09 23:18:04  pierre
+   * no_fast_exit if procedure contains implicit termination code
+
+  Revision 1.54  1999/11/30 10:40:57  peter
     + ttype, tsymlist
 
   Revision 1.53  1999/11/18 15:34:49  pierre

+ 5 - 2
compiler/tcflw.pas

@@ -344,7 +344,7 @@ implementation
               { Check the 2 types }
               p^.left:=gentypeconvnode(p^.left,p^.resulttype);
               firstpass(p^.left);
-              if ret_in_param(p^.resulttype) then
+              if ret_in_param(p^.resulttype) or procinfo^.no_fast_exit then
                 begin
                   pt:=genzeronode(funcretn);
                   pt^.rettype.setdef(p^.resulttype);
@@ -517,7 +517,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.28  1999-12-02 17:27:56  peter
+  Revision 1.29  1999-12-09 23:18:05  pierre
+   * no_fast_exit if procedure contains implicit termination code
+
+  Revision 1.28  1999/12/02 17:27:56  peter
     * give error when for counter is in other lexlevel
 
   Revision 1.27  1999/11/30 10:40:58  peter

+ 6 - 1
compiler/tcld.pas

@@ -98,6 +98,8 @@ implementation
                  if pconstsym(p^.symtableentry)^.consttyp=constresourcestring then
                    begin
                       p^.resulttype:=cansistringdef;
+                      { we use ansistrings so no fast exit here }
+                      procinfo^.no_fast_exit:=true;
                       p^.location.loc:=LOC_MEM;
                    end
                  else
@@ -472,7 +474,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.53  1999-12-02 17:28:53  peter
+  Revision 1.54  1999-12-09 23:18:05  pierre
+   * no_fast_exit if procedure contains implicit termination code
+
+  Revision 1.53  1999/12/02 17:28:53  peter
     * fixed procvar -> pointer for array of const
 
   Revision 1.52  1999/11/30 10:40:58  peter