From cccec929bc11925dc4ae8b8c89c87899d8256a84 Mon Sep 17 00:00:00 2001
From: Sara <sara@saragerretsen.nl>
Date: Thu, 25 Jan 2024 14:14:01 +0100
Subject: [PATCH] feat: variant now uses mirror and drop to manage objects

---
 variant.c | 12 +++++++++---
 variant.h |  3 ++-
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/variant.c b/variant.c
index 2f63dd4..62e6665 100644
--- a/variant.c
+++ b/variant.c
@@ -1,8 +1,10 @@
 #include "variant.h"
-#include "debug.h"
 #include "ctype.h"
+#include "mirror.h"
 #include "string.h"
 #include "strutil.h"
+#include "drop.h"
+#include "debug.h"
 
 Variant variant_from_str(const char* str) {
     size_t length = strlen(str);
@@ -54,8 +56,12 @@ void destroy_contained(Variant* self) {
         self->as_string = NULL;
         break;
     case Variant_Object:
-        free(self->as_object);
-        self->as_object = NULL;
+        if(TC_MIRRORS(self->as_object, Drop)) {
+            Drop drop = TC_CAST(self->as_object, Drop);
+            drop.tc->drop(drop.data);
+        }
+        self->as_object.data = NULL;
+        self->as_object.tc = NULL;
         break;
     }
 }
diff --git a/variant.h b/variant.h
index 2446d30..ef3fce0 100644
--- a/variant.h
+++ b/variant.h
@@ -2,6 +2,7 @@
 #define _fencer_variant_h
 
 #include "vmath.h"
+#include "mirror.h"
 
 typedef enum VariantType {
     Variant_Undefined = 0x0,
@@ -17,7 +18,7 @@ typedef struct Variant {
     union {
         double as_number;
         Vector as_vector;
-        void* as_object;
+        Mirror as_object;
         char* as_string;
     };
 } Variant;