From 9d985413ce2b60a1a8cf001913ee8dac81c03aac Mon Sep 17 00:00:00 2001
From: Ash Wolf <ninji@wuffs.org>
Date: Fri, 13 Jan 2023 01:36:56 +0000
Subject: fix lots more issues, add endian conversions to ObjGenMachO, add
 64-bit kludge to Switch.c

---
 .../FrontEnd/Common/CompilerTools.c                | 67 ++++++++++++++++++++++
 1 file changed, 67 insertions(+)

(limited to 'compiler_and_linker/FrontEnd/Common')

diff --git a/compiler_and_linker/FrontEnd/Common/CompilerTools.c b/compiler_and_linker/FrontEnd/Common/CompilerTools.c
index fff4809..272cd81 100644
--- a/compiler_and_linker/FrontEnd/Common/CompilerTools.c
+++ b/compiler_and_linker/FrontEnd/Common/CompilerTools.c
@@ -53,6 +53,69 @@ unsigned char *CTool_CtoPstr(char *cstr) {
     return (unsigned char *) cstr;
 }
 
+#ifdef CW_64_BIT_SUPPORT
+enum { PoolCapacity = 64 };
+typedef struct ITPPool {
+    void *pointers[PoolCapacity];
+    UInt32 baseIndex;
+    UInt32 size;
+    struct ITPPool *next;
+} ITPPool;
+static ITPPool *poolHead;
+static ITPPool *poolTail;
+
+void *CTool_ResolveIndexToPointer(UInt32 index) {
+    ITPPool *pool = poolHead;
+
+    if (index == 0)
+        return NULL;
+
+    while (pool && index >= PoolCapacity) {
+        pool = pool->next;
+        index -= PoolCapacity;
+    }
+
+    if (pool && index < pool->size)
+        return pool->pointers[index];
+    else
+        return NULL;
+}
+
+UInt32 CTool_CreateIndexFromPointer(void *ptr) {
+    ITPPool *pool = poolTail;
+    UInt32 index;
+
+    if (ptr == NULL)
+        return 0;
+
+    if (!pool || pool->size >= PoolCapacity) {
+        pool = lalloc(sizeof(ITPPool));
+        pool->size = 0;
+        if (poolTail) {
+            pool->baseIndex = poolTail->baseIndex + PoolCapacity;
+            poolTail->next = pool;
+        } else {
+            pool->baseIndex = 0;
+            // always reserve index 0 for NULL
+            pool->pointers[0] = NULL;
+            pool->size = 1;
+            poolHead = pool;
+        }
+        poolTail = pool;
+    }
+
+    index = pool->baseIndex + pool->size;
+    pool->pointers[pool->size] = ptr;
+    pool->size++;
+    return index;
+}
+
+static void CTool_ResetPointerPool(void) {
+    poolHead = NULL;
+    poolTail = NULL;
+}
+#endif
+
 static void GListError(void) {
     if (GListErrorProc)
         GListErrorProc();
@@ -845,6 +908,10 @@ void freelheap(void) {
             blockp->blockfree = blockp->blocksize - sizeof(HeapBlock);
             blockp = blockp->next;
         }
+
+#ifdef CW_64_BIT_SUPPORT
+        CTool_ResetPointerPool();
+#endif
     }
 }
 
-- 
cgit v1.2.3