Prechádzať zdrojové kódy

* use iso reset/rewrite with automatic assignmentin iso mode

git-svn-id: trunk@15682 -
florian 15 rokov pred
rodič
commit
8b3bd36ef0
3 zmenil súbory, kde vykonal 48 pridanie a 3 odobranie
  1. 14 3
      compiler/ninl.pas
  2. 2 0
      rtl/inc/compproc.inc
  3. 32 0
      rtl/inc/typefile.inc

+ 14 - 3
compiler/ninl.pas

@@ -338,10 +338,21 @@ implementation
           tfiledef(left.resultdef).typedfiledef.size,s32inttype,true),
           ccallparanode.create(left,nil));
         { create the correct call }
-        if inlinenumber=in_reset_typedfile then
-          result := ccallnode.createintern('fpc_reset_typed',left)
+        if m_iso in current_settings.modeswitches then
+          begin
+            if inlinenumber=in_reset_typedfile then
+              result := ccallnode.createintern('fpc_reset_typed_iso',left)
+            else
+              result := ccallnode.createintern('fpc_rewrite_typed_iso',left);
+          end
         else
-          result := ccallnode.createintern('fpc_rewrite_typed',left);
+          begin
+            if inlinenumber=in_reset_typedfile then
+              result := ccallnode.createintern('fpc_reset_typed',left)
+            else
+              result := ccallnode.createintern('fpc_rewrite_typed',left);
+          end;
+
         { make sure left doesn't get disposed, since we use it in the new call }
         left := nil;
       end;

+ 2 - 0
rtl/inc/compproc.inc

@@ -696,6 +696,8 @@ procedure fpc_assert(Const Msg,FName:Shortstring;LineNo:Longint;ErrorAddr:Pointe
 {$ifdef FPC_HAS_FEATURE_FILEIO}
 Procedure fpc_reset_typed(var f : TypedFile;Size : Longint); compilerproc;
 Procedure fpc_rewrite_typed(var f : TypedFile;Size : Longint); compilerproc;
+Procedure fpc_reset_typed_iso(var f : TypedFile;Size : Longint); compilerproc;
+Procedure fpc_rewrite_typed_iso(var f : TypedFile;Size : Longint); compilerproc;
 Procedure fpc_typed_write(TypeSize : Longint;var f : TypedFile;const Buf); compilerproc;
 Procedure fpc_typed_read(TypeSize : Longint;var f : TypedFile;out Buf); compilerproc;
 {$endif FPC_HAS_FEATURE_FILEIO}

+ 32 - 0
rtl/inc/typefile.inc

@@ -60,6 +60,38 @@ Begin
   Rewrite(UnTypedFile(f),Size);
 End;
 
+{ this code is duplicated in the iso7185 unit }
+Procedure DoAssign(var t : TypedFile);
+Begin
+  Assign(t,'fpc_'+HexStr(random(1000000000),8)+'.tmp');
+End;
+
+
+Procedure fpc_reset_typed_iso(var f : TypedFile;Size : Longint);[Public,IOCheck, Alias:'FPC_RESET_TYPED_ISO']; compilerproc;
+Begin
+  If InOutRes <> 0 then
+   exit;
+
+  { create file name? }
+  if FileRec(f).mode=0 then
+    DoAssign(f);
+
+  Reset(UnTypedFile(f),Size);
+End;
+
+
+Procedure fpc_rewrite_typed_iso(var f : TypedFile;Size : Longint);[Public,IOCheck, Alias:'FPC_REWRITE_TYPED_ISO']; compilerproc;
+Begin
+  If InOutRes <> 0 then
+   exit;
+
+  { create file name? }
+  if FileRec(f).mode=0 then
+    DoAssign(f);
+
+  Rewrite(UnTypedFile(f),Size);
+End;
+
 
 Procedure fpc_typed_write(TypeSize : Longint;var f : TypedFile;const Buf);[IOCheck, Public, Alias :'FPC_TYPED_WRITE']; compilerproc;
 Begin