From 8521b6a69deab8cdabe1c87b09ecdc93d75af98e Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 30 Aug 2026 14:20:55 +0000 Subject: Remove the struct memory struct FossilOrigin-Name: 38568a34f631b2a4eef72542e2988a9fe081f85d3248194c2ff995a9eed6bd5d --- src/lib/aplwc_internal.h | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) (limited to 'src/lib/aplwc_internal.h') diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index e394bd8..2e3e274 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -8,16 +8,14 @@ #include #include -struct memory { - uint8_t *data; - size_t size; - size_t offset; -}; - struct aplwc { enum aplwc_rc last_error; - struct memory memory; struct aplwc_module *modules; + + /* Memory management */ + uint8_t *data; + size_t size; + size_t offset; }; struct aplwc_line { @@ -81,20 +79,20 @@ struct aplwc_module { struct aplwc_value *eval_line(struct aplwc_line *); /* memory.c */ -struct memory memory_init(uint8_t *, size_t); -struct aplwc *memory_alloc_aplwc(struct memory *); -struct aplwc_line *memory_alloc_aplwc_line(struct memory *); -struct string *memory_alloc_string(struct memory *, size_t); -struct token_list *memory_alloc_token_list(struct memory *, size_t); -struct aplwc_value *memory_alloc_aplwc_value(struct memory *); -struct aplwc_module *memory_alloc_aplwc_module(struct memory *); -struct module_imports *memory_alloc_module_imports(struct memory *, size_t); -void memory_free_aplwc(struct memory *, struct aplwc *); -void memory_free_aplwc_line(struct memory *, struct aplwc_line *); -void memory_free_string(struct memory *, struct string *); -void memory_free_token_list(struct memory *, struct token_list *); -void memory_free_aplwc_value(struct memory *, struct aplwc_value *); -void memory_free_aplwc_module(struct memory *, struct aplwc_module *); +void memory_init(struct aplwc *, uint8_t *, size_t); +struct aplwc *memory_alloc_aplwc(struct aplwc *); +struct aplwc_line *memory_alloc_aplwc_line(struct aplwc *); +struct string *memory_alloc_string(struct aplwc *, size_t); +struct token_list *memory_alloc_token_list(struct aplwc *, size_t); +struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); +struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); +struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); +void memory_free_aplwc(struct aplwc *, struct aplwc *); +void memory_free_aplwc_line(struct aplwc *, struct aplwc_line *); +void memory_free_string(struct aplwc *, struct string *); +void memory_free_token_list(struct aplwc *, struct token_list *); +void memory_free_aplwc_value(struct aplwc *, struct aplwc_value *); +void memory_free_aplwc_module(struct aplwc *, struct aplwc_module *); /* string.c */ struct string *chars_to_string(struct aplwc *, const char *, int len); -- cgit v1.2.3 From 04827577ea502a9f0edc69e00e008751c8119cbc Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 30 Aug 2026 14:46:38 +0000 Subject: Remove a lot of functions for manually freeing memory (they were not implemented) FossilOrigin-Name: 693765728e62a74a0ab15d657f7d1dd83702a9371fb042dafe6250f84a252959 --- src/lib/aplwc_internal.h | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'src/lib/aplwc_internal.h') diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index 2e3e274..23b26f9 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -87,12 +87,7 @@ struct token_list *memory_alloc_token_list(struct aplwc *, size_t); struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); -void memory_free_aplwc(struct aplwc *, struct aplwc *); -void memory_free_aplwc_line(struct aplwc *, struct aplwc_line *); -void memory_free_string(struct aplwc *, struct string *); -void memory_free_token_list(struct aplwc *, struct token_list *); -void memory_free_aplwc_value(struct aplwc *, struct aplwc_value *); -void memory_free_aplwc_module(struct aplwc *, struct aplwc_module *); +void memory_free_root(struct aplwc *, void *); /* string.c */ struct string *chars_to_string(struct aplwc *, const char *, int len); -- cgit v1.2.3 From 729964bea692f9683860978b89848784a7fc2f46 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 30 Aug 2026 20:52:43 +0000 Subject: Still a lot to be done, but I'm going to bed. Two remaining big issues: * aplwc (the parameter passed "everywhere") - should it move or not? * values returned from the public API should not move. FossilOrigin-Name: 31ab3154b8f3d5ac167218496e9e204324bf0ac9d36b7bada8fe2a6c8f93d51c --- src/lib/aplwc_internal.h | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'src/lib/aplwc_internal.h') diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index 23b26f9..a7b7030 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -9,13 +9,21 @@ #include struct aplwc { + struct aplwc_fns fns; enum aplwc_rc last_error; struct aplwc_module *modules; /* Memory management */ uint8_t *data; + uint8_t *unaligned_data; size_t size; - size_t offset; + struct memory_ptr_frame *memptrs; +}; + +struct memory_ptr_frame { + struct memory_ptr_frame *link; + void ***ptrs; + size_t count; }; struct aplwc_line { @@ -79,8 +87,8 @@ struct aplwc_module { struct aplwc_value *eval_line(struct aplwc_line *); /* memory.c */ -void memory_init(struct aplwc *, uint8_t *, size_t); -struct aplwc *memory_alloc_aplwc(struct aplwc *); +void memory_init(struct aplwc *); +void memory_destroy(struct aplwc *); struct aplwc_line *memory_alloc_aplwc_line(struct aplwc *); struct string *memory_alloc_string(struct aplwc *, size_t); struct token_list *memory_alloc_token_list(struct aplwc *, size_t); @@ -88,6 +96,15 @@ struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); void memory_free_root(struct aplwc *, void *); +void memptrs_add(struct aplwc *, struct memory_ptr_frame *, void ***, size_t); +void memptrs_remove(struct aplwc *, struct memory_ptr_frame *); + +#define MEMPTRS(aplwc, n) \ + void **memptrs[n]; \ + struct memory_ptr_frame memptrs_frame; \ + memptrs_add(aplwc, &memptrs_frame, memptrs, n); +#define MEMPTR(n, ptr) memptrs[n] = (void **)&ptr +#define MEMPTRS_EXIT(aplwc) memptrs_remove(aplwc, &memptrs_frame) /* string.c */ struct string *chars_to_string(struct aplwc *, const char *, int len); -- cgit v1.2.3 From 7f7a2fb4fb23433e7be3d6953725690c8ea958d2 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 31 Aug 2026 19:44:56 +0000 Subject: The objects returned to the user are now integer-based references, not actual pointers. This means the aplwc internals can update those pointers without the user noticing. FossilOrigin-Name: 654c7d0ec85da295a7fb6ed381500410686b280f342fa81a30481f5e9a20c58a --- src/lib/aplwc_internal.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/lib/aplwc_internal.h') diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index a7b7030..5320336 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -18,6 +18,7 @@ struct aplwc { uint8_t *unaligned_data; size_t size; struct memory_ptr_frame *memptrs; + struct root_ptr *rootptrs; }; struct memory_ptr_frame { @@ -26,6 +27,12 @@ struct memory_ptr_frame { size_t count; }; +struct root_ptr { + int id; + void *ptr; + struct root_ptr *link; +}; + struct aplwc_line { struct aplwc *aplwc; struct string *text; @@ -95,9 +102,13 @@ struct token_list *memory_alloc_token_list(struct aplwc *, size_t); struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); -void memory_free_root(struct aplwc *, void *); +struct aplwc_ref memory_root_new(struct aplwc *, void *); +void *memory_root_get(struct aplwc_ref); +void memory_root_free(struct aplwc_ref); void memptrs_add(struct aplwc *, struct memory_ptr_frame *, void ***, size_t); void memptrs_remove(struct aplwc *, struct memory_ptr_frame *); +void clear_ref(struct aplwc_ref *); +int valid_ref(struct aplwc_ref); #define MEMPTRS(aplwc, n) \ void **memptrs[n]; \ -- cgit v1.2.3 From 34189c9b67f3427e077152e3a6c8cb21f4ba3441 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 31 Aug 2026 19:49:48 +0000 Subject: Remove some unneeded references to struct aplwc * in various structures. FossilOrigin-Name: 3b4b7806320d604b0df3654896cfe5d885f116d893ae15cfb3422d6d2de7193c --- src/lib/aplwc_internal.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/lib/aplwc_internal.h') diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index 5320336..b87cfad 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -34,7 +34,6 @@ struct root_ptr { }; struct aplwc_line { - struct aplwc *aplwc; struct string *text; struct token_list *tokens; }; @@ -79,19 +78,17 @@ enum value_tag { }; struct aplwc_value { - struct aplwc *aplwc; enum value_tag tag; }; struct aplwc_module { - struct aplwc *aplwc; struct string *name; struct token_list *tokens; struct aplwc_module *link; }; /* eval.c */ -struct aplwc_value *eval_line(struct aplwc_line *); +struct aplwc_value *eval_line(struct aplwc *, struct aplwc_line *); /* memory.c */ void memory_init(struct aplwc *); -- cgit v1.2.3