X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Falloc.h;h=89e1dab7c83e5a04385589b4f3539201d9681a14;hb=e3dcc1d3966fb95a5a232daa193c6b5d89a06b7e;hp=239a7e0c281ed6e248d122dd2970c84d5293abf5;hpb=8d55156675587a770c5654362bcbd3d2a98e4aa9;p=muddle-interpreter.git diff --git a/src/alloc.h b/src/alloc.h index 239a7e0..89e1dab 100644 --- a/src/alloc.h +++ b/src/alloc.h @@ -1,5 +1,5 @@ /* -Copyright (C) 2017 Keziah Wesley +Copyright (C) 2017-2018 Keziah Wesley You can redistribute and/or modify this file under the terms of the GNU Affero General Public License as published by the Free Software @@ -23,79 +23,31 @@ License along with this file. If not, see #include #include -/// 0, or a "pointer" to an object allocated in the pool and fully-initialized typedef uint32_t pool_ptr; -/// 0, or a "pointer" to an object allocated in the heap and fully-initialized typedef int32_t heap_ptr; typedef union pool_object pool_object; typedef union object object; +typedef union uv_val uv_val; -extern char *pool; // pool_object -extern char *vhp_base; // object -extern char *vhp; // object +pool_object *POOL_OBJECT (pool_ptr p); +object *HEAP_OBJECT (heap_ptr p); +uv_val *UV_VAL (heap_ptr p); -static inline pool_object * -POOL_OBJECT (pool_ptr p) +pool_ptr pool_alloc (uint32_t len); +heap_ptr heap_alloc (uint32_t len); +inline static heap_ptr +heap_alloc_uv (uint32_t len) { - return (pool_object *) (uintptr_t) p; -} - -static inline bool -IS_VALID_POOL_OBJECT (pool_object * p) -{ - pool_ptr pp = (pool_ptr) (uintptr_t) p; - return (uintptr_t) pp == (uintptr_t) p; -} - -static inline pool_ptr -POOL_PTR (pool_object * p) -{ - pool_ptr pp = (pool_ptr) (uintptr_t) p; - assert (IS_VALID_POOL_OBJECT (p)); - return pp; -} - -// TODO make (heap_ptr)0 nullish -static inline object * -OBJECT_OF_HEAP_PTR (heap_ptr p) -{ - assert (p >= 0); - return (object *) (vhp_base + (p << 4)); -} - -static inline pool_object * -pool_alloc (uint32_t len) -{ - char *pp = pool; - pool += (len << 4); - return (pool_object *) pp; -} - -static inline heap_ptr -HEAP_PTR_OF_OBJECT (object * p) -{ - assert ((uintptr_t) p >= (uintptr_t) vhp_base); - heap_ptr h = (heap_ptr) ((uintptr_t) p - (uintptr_t) vhp_base); - return h; -} - -static inline object * -heap_alloc (uint32_t len) -{ - enum - { DOPE_LEN = 1 }; - char *p = vhp; - vhp += (len + DOPE_LEN) << 4; - return (object *) p; + // divide by 2 (rounding up), then add one for dope + return heap_alloc (((len + 1) >> 1) + 1); } // given a headerless array of objects of known size, -// copy it backwards into newly-allocated pool space +// copy it into newly-allocated pool space +pool_ptr pool_copy_array (const pool_object * objs, uint32_t len); +// same as above, but backwards pool_ptr pool_copy_array_rev (const pool_object * objs, uint32_t len); - -// given a headerless array of objects of known size, -// copy it backwards into a newly-allocated vector body heap_ptr heap_copy_array_rev (const object * objs, uint32_t len); #endif // ALLOC_H