X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Falloc.h;h=58ee8081e391dde43b3738420666453df668c6b4;hb=58a5ffdfec139a0c9d399f603b77a764ae8607f7;hp=239a7e0c281ed6e248d122dd2970c84d5293abf5;hpb=8d55156675587a770c5654362bcbd3d2a98e4aa9;p=muddle-interpreter.git diff --git a/src/alloc.h b/src/alloc.h index 239a7e0..58ee808 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,26 @@ 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; -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); -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; + return heap_alloc ((len + 1) >> 1); } // given a headerless array of objects of known size, // copy it backwards into newly-allocated pool space 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