libsheepyCClassTemplate.c (3094B)
1 // 2 // 3 // 4 5 #include "../libsheepyObject.h" 6 #include "libsheepyCClassTemplate.h" 7 #include "libsheepyCClassTemplateInternal.h" 8 9 #define internal static 10 11 #include <stdlib.h> 12 #include <string.h> 13 #include <stdio.h> 14 15 void initiateClassTemplate(classTemplatet *self); 16 void registerMethodsClassTemplate(classTemplateFunctionst *f); 17 void initiateAllocateClassTemplate(classTemplatet **self); 18 void finalizeClassTemplate(void); 19 classTemplatet* allocClassTemplate(void); 20 internal void freeClassTemplate(classTemplatet *self); 21 internal void terminateClassTemplate(classTemplatet **self); 22 internal char* toStringClassTemplate(classTemplatet *self); 23 internal classTemplatet* duplicateClassTemplate(classTemplatet *self); 24 internal void smashClassTemplate(classTemplatet **self); 25 #if (NFreeStackCheck) 26 internal void finishClassTemplate(classTemplatet **self); 27 #else 28 internal void finishClassTemplate(classTemplatet **self); 29 #endif 30 31 void initiateClassTemplate(classTemplatet *self) { 32 33 self->type = "classTemplate"; 34 if (!classTemplateF) { 35 classTemplateF = malloc(sizeof(classTemplateFunctionst)); 36 registerMethodsClassTemplate(classTemplateF); 37 } 38 self->f = classTemplateF; 39 } 40 41 void registerMethodsClassTemplate(classTemplateFunctionst *f) { 42 43 f->free = freeClassTemplate; 44 f->terminate = terminateClassTemplate; 45 f->toString = toStringClassTemplate; 46 f->duplicate = duplicateClassTemplate; 47 f->smash = smashClassTemplate; 48 f->finish = finishClassTemplate; 49 } 50 51 void initiateAllocateClassTemplate(classTemplatet **self) { 52 53 if (self) { 54 (*self) = malloc(sizeof(classTemplatet)); 55 if (*self) { 56 initiateClassTemplate(*self); 57 if (!(*self)->f) { 58 finishClassTemplate(self); 59 } 60 } 61 } 62 } 63 64 void finalizeClassTemplate(void) { 65 66 if (classTemplateF) { 67 free(classTemplateF); 68 classTemplateF = NULL; 69 // bug in cgc 70 } 71 } 72 73 classTemplatet* allocClassTemplate(void) { 74 classTemplatet *r = NULL; 75 76 initiateAllocateClassTemplate(&r); 77 return(r); 78 } 79 80 81 internal void freeClassTemplate(classTemplatet *self) { 82 83 // TODO 84 return; 85 } 86 87 internal void terminateClassTemplate(classTemplatet **self) { 88 89 freeClassTemplate(*self); 90 free(*self); 91 *self = NULL; 92 } 93 94 95 internal char* toStringClassTemplate(classTemplatet *self) { 96 97 return(strdup("TODO - class template")); 98 } 99 100 internal classTemplatet* duplicateClassTemplate(classTemplatet *self) { 101 102 createAllocateClassTemplate(dup); 103 // TODO COPY data 104 return(dup); 105 } 106 107 internal void smashClassTemplate(classTemplatet **self) { 108 109 finishClassTemplate(self); 110 } 111 112 #if (NFreeStackCheck) 113 internal void finishClassTemplate(classTemplatet **self) { 114 115 #warning "NFreeStackCheck is available on x64/gcc/linux and BSD." 116 register u64 rsp asm("rsp"); 117 if ((u64)*self > rsp) { 118 logW("Probably trying to free a classTemplate on stack: "BLD PRIx64 RST" sp: "BLD PRIx64 RST, *self, rsp); 119 logBtrace; 120 } 121 else { 122 free(*self); 123 *self = NULL; 124 } 125 } 126 127 #else 128 // #if NFreeStackCheck 129 internal void finishClassTemplate(classTemplatet **self) { 130 131 free(*self); 132 *self = NULL; 133 } 134 135 #endif 136 // #if NFreeStackCheck