replace global variables holding local data with ALLOCA

This commit is contained in:
Jesse D. McDonald 2020-11-09 13:55:55 -06:00
parent 54ac4ca37b
commit e533756d25
1 changed files with 34 additions and 30 deletions

View File

@ -2226,12 +2226,10 @@ ENDSTRUCT termios%
SYSTEM DEFINITIONS
termios% %VARIABLE SCRATCH-TERMIOS
FORTH DEFINITIONS
: TTY? ( fd -- flag )
IOCTL_TCGETS SCRATCH-TERMIOS SYS_IOCTL SYSCALL3 0= ;
IOCTL_TCGETS termios% %ALLOCA SYS_IOCTL SYSCALL3 UNALLOCA 0= ;
STDIN TTY? CONSTANT INTERACTIVE?
@ -2788,9 +2786,7 @@ ENDSTRUCT FILE%
{ CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES
open_how% %VARIABLE OPEN-HOW
stat64% %VARIABLE STAT64-RESULT
signed-long-long% %VARIABLE LLSEEK-RESULT
: FD>FILE ( fileid -- file-addr )
FILES AA-LOOKUP ?DUP 0= "unknown file ID" ?FAIL ;
@ -2818,36 +2814,44 @@ O_RDWR CONSTANT R/W ( -- fam )
: BIN ( fam1 -- fam2 ) IMMEDIATE ;
: OPEN-FILE ( c-addr u fam -- fileid )
FILE% %ALLOCATE >R
NULL R@ FILE>BUFFER !
R@ CLEAR-LEFTOVER
0# R@ FILE>POSITION 2!
[ NULL 0 ] 2LITERAL R@ FILE>SOURCE 2!
OPEN-HOW SIZEOF open_how% 0 FILL
DUP 0 SWAP OPEN-HOW open_how>flags 2!
[[ O_CREAT __O_TMPFILE OR ]] AND IF
0 0666 OPEN-HOW open_how>mode 2!
THEN
AT_FDCWD ▪ -ROT MAKE-CSTRING DUP >R ▪ OPEN-HOW ▪ SIZEOF open_how%
SYS_OPENAT2 SYSCALL4-RETRY
R> FREE
DUP ERRNO_ENOENT = OR-ELSE DUP ERRNO_ENOTDIR = THEN IF
DROP EXCP-NON-EXISTENT-FILE THROW THEN
DUP 0< IF DROP EXCP-FILE-IO THROW THEN
DUP R@ FILE>FD !
R@ FILES AA-LOOKUP 0<> "internal error - duplicate key in FILES" ?FAIL
R> FILES AA-INSERT ;
-ROT MAKE-CSTRING
open_how% %ALLOCA
FILE% %ALLOCATE
LOCALS| fam name open-how file |
NULL file FILE>BUFFER !
file CLEAR-LEFTOVER
0# file FILE>POSITION 2!
[ NULL 0 ] 2LITERAL file FILE>SOURCE 2!
open-how SIZEOF open_how% 0 FILL
0 fam open-how open_how>flags 2!
fam [[ O_CREAT __O_TMPFILE OR ]] AND IF
0 0666 open-how open_how>mode 2!
THEN
AT_FDCWD ▪ name ▪ open-how ▪ SIZEOF open_how%
SYS_OPENAT2 SYSCALL4-RETRY
name FREE
DUP ERRNO_ENOENT = OR-ELSE DUP ERRNO_ENOTDIR = THEN IF
DROP file FREE EXCP-NON-EXISTENT-FILE THROW THEN
DUP 0< IF DROP file FREE EXCP-FILE-IO THROW THEN
DUP file FILE>FD !
file FILES AA-LOOKUP NULL<> "internal error - duplicate key in FILES" ?FAIL
file FILES AA-INSERT
ENDLOCALS
UNALLOCA ;
: CREATE-FILE ( c-addr u fam -- fileid )
[[ O_CREAT O_TRUNC OR ]] OR OPEN-FILE ;
: REPOSITION-FILE ( ud fileid -- )
DUP ▪ FD>FILE >R ▪ -ROT SWAP ▪ LLSEEK-RESULT ▪ SEEK_SET
SYS__LLSEEK SYSCALL5-RETRY
R@ CLEAR-LEFTOVER
0<> IF RDROP EXCP-FILE-IO THROW THEN
LLSEEK-RESULT 2@ SWAP R@ FILE>POSITION 2!
RDROP ;
DUP FD>FILE ▪ signed-long-long% %ALLOCA
LOCALS| file llseek-result |
-ROT SWAP ▪ llseek-result ▪ SEEK_SET
SYS__LLSEEK SYSCALL5-RETRY
file CLEAR-LEFTOVER
0<> IF RDROP EXCP-FILE-IO THROW THEN
llseek-result 2@ SWAP file FILE>POSITION 2!
ENDLOCALS
UNALLOCA ;
: FILE-POSITION ( fileid -- ud ) FD>FILE FILE>POSITION 2@ ;