;;; Managing a memory area for temporary objects ;;; ;;; A temporary object space is allocated from the current usage ;;; level, or cycling back to be from the lowest space address when ;;; the requested size exceeds the space edge. ;;; WORD p_objectspace,'TEMPSPACE',dovariable ;; Holds size and address of the object space. dq 104857600 ; [0] Total object space size (request size) dq 0 ; [8] Object space base address dq 0 ; [16] Currently used. WORD p_temp,'TEMP',fasm ;; ( size -- addr ) ;; Allocate an object of given size pushr rsi cmp qword [p_objectspace_DFA+8],0 jg p_objecthole_initialized ;; initialize object space push qword [p_objectspace_DFA] DOFORTH p_malloc pop qword [p_objectspace_DFA+8] p_objecthole_initialized: mov rax,qword [rsp] add rax,qword [p_objectspace_DFA+16] cmp rax,qword [p_objectspace_DFA] jl p_objecthole_from_tail mov qword [p_objectspace_DFA+16],0 mov rax,qword [rsp] p_objecthole_from_tail: mov rbx,qword [p_objectspace_DFA+16] mov qword [p_objectspace_DFA+16],rax add rbx,qword [p_objectspace_DFA+8] mov qword [rsp],rbx popr rsi next WORD p_str2temp,'STR>TEMP' ;; ( char* n -- char* n ) ;; Capture a given [n:char*] string as a new temp object with ;; leading size cell. dq p_dup, p_gtR ; ( -- char* n ) [ n ] dq p_dup, p_literal, 8, p_plus ; ( -- char* n n+8 ) dq p_temp ; ( -- char* n addr ) dq p_2dup, p_put dq p_literal, 8, p_plus ; ( -- char* n addr+8 ) [ n ] dq p_dup, p_gtR ; ( -- char* n addr+8 ) [ n addr+8 ] dq p_swap, p_strncpy ; ( -- ) [ n addr+8 ] dq p_Rgt, p_Rgt ; ( -- addr+8 n ) [ ] dq p_exit