From e533756d253c13b538c0744f57e98f08056d970f Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Mon, 9 Nov 2020 13:55:55 -0600 Subject: [PATCH] replace global variables holding local data with ALLOCA --- startup.4th | 64 ++++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/startup.4th b/startup.4th index ef352a8..f7ba181 100644 --- a/startup.4th +++ b/startup.4th @@ -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@ ;