From 5dc0946a1964a68a290453b466766f3142af3ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Monta=C3=B1es=20Ojados?= Date: Sun, 15 Feb 2026 22:12:19 +0100 Subject: [PATCH] add JLANG_free and Object --- run.exe | Bin 66102 -> 66815 bytes src/main.c | 22 +++- src/memory/allocator.h | 290 ++++++++++++++++++++--------------------- src/objects/object.h | 101 ++++++++++++++ 4 files changed, 262 insertions(+), 151 deletions(-) create mode 100644 src/objects/object.h diff --git a/run.exe b/run.exe index 99be10faaace17b74b27fcd75af069a2b8b51f4d..cb1ae3770597c205238f0322e03e56b4676deb19 100644 GIT binary patch delta 11966 zcmc(kdt6l2+Q;`^Fvv}3zzf4A7?|O1HY%ET#|+t;dZ@HK-2f330wu)KUUVo-!O>TQN*GElD>FlGG)oNMVenOM@jzx^Kgdk<2=2!?|hl zEJ~Ii4z0@sHQ^pio8?S-7`-p2%31V-oSJ?+Xs^p5Nv%UF<`q;GNYbnTR8-&A*3 zu$X>j9MyQyG%9AllV{RCmP&?z0d$oOkRPC+fK-}|(xiX^az5P?kSfom75H08FQevX z)O>}SN9peJNJsqgT)9z7!r}XXY@P5E2^^3tN}rFf#m9>k@-!cS>_< zNS4e}Qm8R>6gz37bD^p1y<`dqo51c)rpaNm*t1E^&xK{nroUO?yFR;XKhK@#jJ5fP z@VDi`O8pFzQa{_QxUwO$yCKa=t%vJf(7W0k!5F&aR%(x$=(&E6u$74vZj2v1&cf4> zeMWI{r`>JY*SOiG{rKaozR}ZDpMBJoeYF0Fvd*w| z1dr*kXKyTRG9|G73AEodVelj`y(1R6PlVY>FBrpt2_Vx8(qqXQkupQ}7JrFBcCy=R zJ@V-63(G_IBSy(HFCKlYGkl$;b@dr+YO^oMuIvkAv)hepC-n66pt{{#Jt3YpMkG0T zTD(~~VCG{&kZIRpsimm94Gh$k-R+ufuFnnT8d79`@V(he{kKZ(6+8FvlQCk3npwY( z3;*oxgRiP$0wjT79kwbR-{;LmUvW$v>7* zAs)U9xi8uiJ;({g?2>A`*^&WVRa|O@)R=DPt+X)Iau&*bby@zsC+;DjstSLMtB=4v z{25n1?^RYeL3ygRDzvs+u1dPJL+jq;as<~OabiLb4%24sHB8^7Ro>bkjV4EMv0_}& zs?;BWTzI6|n1)pFwdnRXScV3d=d@*CM;qy~jSpFYSJ&+8O5thc@Yex~j0CGIVmj7N zZT5AU+qfL2(b?ClJ1*a(xSU!O&F?s`-z4r=cJs07%OuzHHQ(gL-RiRFf}<|2RfxCM zl_)i>s6mfBOxauUiN69XMy>gIs5avLQBJMRf!p}7G0&m@Qr&yt9`k(Ivk|*c?P}e? z54??*XeOP&o!n%x&jfn(uRT4!d?fRBe#d*XErEPwckou@(FzHfA=fUy9e^qhiCI7Frj16C0LAyCZFJ;n>jirxjOVhk~Q>f-Czvw(eytN5hZ9=}M#}aq`dF z!qX?i;xgQUXA8`YZHDm`baVgFrhA6tNZ~85sxO)c=_p+@I`+U+wb1+-tEB0eExf)IN=9r;(F6U0* zBL)e*jwe}9hq`=^<28ZDcN}ZVW%y?)_Is;bZ}_p4J~bz?_e;40qYJZRTv;Q*)YW&J z%7SlqnNV2H3l?@i7lUY7bWB8n>Kj{*Z&8;askHgU=!r5rp3(em%ov#+OQ*!ReQbO> zosHWcJ+hcjyz!|zxON%RP*QtOD5hOEO|gAYBuQ7>KndE<1rt>KrW@x z!1!BPO%ctEAIX#=S{0wl5{l@}_zV5crsxag!<6Rj2{+6A;tSCd$5(&6OGFmZ7nTvs zT1fp9r#PGEs(FCV(N$`?T?0Ef;^(w>GD8~PVbtWdWTjx@rB!}}@fiI^2P%Zz5Zd`_T81dP8 zQuDsS-zG})?lQcgBJ7AMd^9e+<6x9iwOaLk!*IRQyEyO?vb;;Gicp75?TVml;*1nPs&)RnydYfG=FI=l-ZR;x-EGpyDgEfBu`_1x6r7RyVwp3txb8E{hB~o zsUz8u1S(5i$nHvL{vtI$faS;0gv`k-HkN8LGc&j0twlYxJTIab%-zp@aOAr+{VLb7 zP&xm;51q|i=8Sn5?_2JkWKkLuR>BI|Nj`_I!Rtk-*H?P$|Bup{yrV?x;QvQDd%OYY zBl>lL7LZS#Q_Fh&4sZScCQH5bJ~_=>9^;i6UKzus6R8dLf?wxr9e?MQ=e+WSS03=n z*SvDGSFZ8O$5naBbqm0 z$8X9_8#MbCue6WS$`6jB1NJF{?YC;hCa-jRtJ}RYaT0!b0uqNpP9-G*Vgls9Z} zaPmAUxmZeGOlyW^M1(3uWo3&jk1eV!o0k}hG0>r5>47yCwb_8ThTG(rpbk97PxbU1 z!+jd}FSxJZK7XotLe^Y4<2K~wo3sCZ`}lXL-^X(NmptliAzhgBy~gQ@-#MJ;1il05Qnc$=v?OGj)TtSPq@>ds}irpSvNiz{x*PHo?s-p0PF2aV-~$yET=MsoYUmY^|AD&>dJUvC5e=bp z>A<}eI+v?)zX;t8`DT(NH9>EJ+>iSt^j1haKI1-x&ZRL$k~*Ptc`?O_(W7t?g(0aJ zJ#;QxGBEllHTeKOx=qmYAy43rgU;nO+-cDHr@9sI30ctXkRRiAKrVMxeObQ(L?9*e%#MM=W-YBM(AALi#N92(7ANs zZh_9_b=*gxbNMB{^g5tpQ%D84zkrSnA$^G3=|KUzL9*V85kbdNm$1w+S(?O7kiwyJ z`5q8IOtqrTS&J<=Mq~(%7xD5GTaY9$6oFu%^oXB3u>t# z@Qns#@JRO%kfd1LJh@zk1P2&`?+Of%bJ3;OCJTI;YD06CEp%0}(Z8mK(}UB@ z^q~??A<#dZYHPlEs*}AneN=dOjYZo6ST*V{ZO)&wJz#^~5P}H_M^_7WHHSVB#6mhp zXm-OkBt|vcANopWogrY&h8iayqOxc^6~=g3;cRo2^-bq(iMH{z*8q}Jd_?tmr zJ((bvlUzGqZlsB|2|-uUgWE{CbuqM}c2HCRY)=_|?$JUT2x6j1D-tq>L2Cr*gF8UV z%hSTiG5M^0!NA?M+ERHQ<*l^RiFKj0cI5>5HTqzsl~tIiYvt4OUUELA796iwsqLwU z<)buwl?o6?!?VHMu6k9eTu1BHTjd3`XT6n%thUJ?(cP=9tj0u5t|@eIwIctW`qWJh znt;FnbL-;e8MLU*nlTT+iZ!L@zXHVJB>|Ez(i&6qJ9Wi!m>ao629Z7sPnujsIcwH4 zNv1Pvl9)R}?d~?0B1e+TWd&$%a>dKCjZUrQC7wJUG&J+Nr^A~3&f-*Oo7C`sSZ9-m zQ2(c`tSJ)y2GhK!=gJeQO#|?dTwGCEw795BYKrs)?h8{RJiHKkVs$h*+(R1H_NVi! z`p75M484dha^$J>%X%wojYNu*U{fZ~r`O#HK~4<4HL~G!3|(;#az2exw|^3$NSi_I z{k1*=IFOn^jDvcU6Cf7_au#F=KE!#7wN{rvTJRH-p7a3Z^g8@$3x<2{7YJnGtI04C znjKnfsBf5v{G$y|%b(JN4OY2{o@mICm(lTt1aldm8)Q}Y^EgO;ET3_+8|n!>=Cp2o zzEC-mN@?8YP}$69f$}$p(nmBwuBE=uSeX>(O_Gh4KBLIb(&1+kf?na>#QA0uTIjQ- zEQ`^j&rV?`MhBmrBJU!@#)NSPVdxOzISH~rAm>3U1oAzIJ)XxrE)*mA7>`mtRT&@+ zc$n(xoD4G5;C@0Yz}IB$rZV|2^vkA%poh^r{2*B83aGmieSz>c z>p-%TdXpU>Vb}Oj9zml(aOy>_PtCq_rxImk~BJ)PHawM*}?R~<|O%UirA9M zI+JP4mSQ=Nwr{b@i|82suAoc!TTgwrrZSn)$gN2@8TPzprRuG>n?@s|H2A`~%nw{6 zbx;rC|z&7(V?ze5hA=b>w@*J3Jucz&)NOLuOwGE0hYtwGzotu*Wl z|Ez|qv)aNJT@p=y!6s+YBQM~9^tGTLc81X57Yf5XziDz*Yf{!|lgHAAMl0)3n~>wJ z2>PnAFzniI>^n63wcBlS4(-{VkiHRv<0lvD zZ^O!-$`{Po_qdBx-?Zi}T3EESq)M`<`3O8qr(yG;KsrG>_{rcj;OXiX>P#T*0Ae{o42Xetr@~R$RTr>y|)K7%YmcXcnA5}wmJ%8RtruQDq z2Gpnci9bWB6!>B(lLDyX#U%CxUyd>K#*4YECcWXMYF3B8S@hOR3UjNP{bhx1Qnfdr zJ;V5tB~x24#k^u;jp^iggRaiow?(ET9_IR_x%&OK6&7x|L?p0V?2DR?3W_A@+zOArPs@4U~kwN(S;^dHW1U*doo$Nzf!b09 zCFE=`M;&jObQ~){)f%C7@jQ;8gcCWeTZLOsC``)ahA|&ta#d{;G?S_gI*G~6#B5bF ziwYt?#LTLi8=5^6b3B5KALX!7DqQ;!W>?ihPbo}MwYpP^e3m{wmBVr~)kU_lLy<44 z!K$Ey?*F)4zCp)7PB6cK-N`RJC%i|+>ma$A4X2Z|)^j)518L1^o9VF1`OfACyFsGu zl>+JN1Z?q-gw3 zP$SsbKsp679>k0=gZ-_hg1AxCNfC$xZgsL01Yh78qx6>xiI@8RtQ=@xqY3y3%amqBv z%3smHKC?Q5@Ooj=!^NX%VL^G3TUao0u<29>;Pa3U(j+8e42W6iWjgnaLGnnwsRt1w zDR%;O_`8Rt$R9!YgRF>lc=4C4@N?1JZS z`(i;`5TlmS@&f$cR)}{1zw5locg@P1F-u*+`Z#XDQJ0X9P<$%$OP?7th+D|eaF7M) zUZ2lN{jj0L)iV!9O@h&4?pjzGE|6To=2ehR#HYJ{2PEI04<1?vNS6@M&mhjDLexea zCj1oA9mRk+V55)z7LZ_JTZ{wg5L(>}(jv5a7$gu&Q1|>CZ{_r-8rIUwKyHi-zSIsS z=@7_Cl=Q@&0r3dQzX&n_HoEH=dY%G2oR7-n7(u9@YPEVY*I?sUfOW)+*g9HoSx) z!;d~E_kmOh11bwSHyD(oeeyGS7!sy3|Fbi=YbA&MX&l_n%s1Jbf5cHX< z-~^XGoHdcWnc#X0#eRY354a7cdgDVN;vstqq!oecIqd@J5YD}Sf^-Qs(bz5>aH|KA z1>!(o`aW|wfm;1&amoCJ1!b5nVM_1dHbQ6jbAl1;jw(U;rER^%Rh0`1%PXWNq18&* zbO`}HHvmVonDCu2atPyS2T23b$MG4+T6Ct9fPvbHs%OXs!arzro3SAL(l_SJfjF9< zLCCt16Gknk$Rucd>3EYAeVY zVLFC_C<4g^u?wUS#4N0~RCa;z^H86v5bV)h zFn!dqW-9JXa;BrgA~YTgq6p-7AdNyi`5-%mK|cbLD=exfLEOTi-5_a#pO>6KeE#&f z_JKGA*T+FRg@8T>*@9R z!KMa;U-}~2^l#)+E)+`&)qK z!Mi@w4}s{Z=H1tT?1a=uzk%MofM+|nMF@Q#h*@|noB|P#k@FyDgsl7nq+9SGg#V+P z{Gs#z_3=1b{e+hyjWFtjqHPuHP0jh=ZVsHK8c&-(X=YB|qa}-%6qJ=bUL-BTe+(BE mJ(gFpu*$C&mn|yLOPH^ch4cNDWhINXx(eW`=78^poBtbXnBe~a delta 10957 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 H9UA{{C~2v3 diff --git a/src/main.c b/src/main.c index 2512cdb..698031e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,4 @@ -#include "memory/allocator.h" +#include "objects/object.h" int main() { JLANG_memory_allocator *allocPtr = JLANG_CreateAllocator(); @@ -7,12 +7,24 @@ int main() { printf("memoryPtr=%p\n", allocPtr->memory); printf("size=%zu\n", allocPtr->size); - JLANG_visualize(allocPtr); + // Create object + Object *intVar1 = obj_new_int(allocPtr, 66); + obj_print(intVar1); - void *var1 = JLANG_malloc(allocPtr, 512); - printf("var1Ptr=%p\n", var1); + Object *stringVar1 = obj_new_string(allocPtr, "\nHello world!\n"); + obj_print(stringVar1); JLANG_visualize(allocPtr); - + + for (int i = 0; i < 10; i++) { + Object *intVar1 = obj_new_int(allocPtr, 66); + obj_print(intVar1); + } + + obj_free(allocPtr, intVar1); + void* newPtr = JLANG_malloc(allocPtr, 8); + + obj_print(stringVar1); + JLANG_visualize(allocPtr); return 0; } \ No newline at end of file diff --git a/src/memory/allocator.h b/src/memory/allocator.h index e8c1ff1..b3d3cb5 100644 --- a/src/memory/allocator.h +++ b/src/memory/allocator.h @@ -1,11 +1,12 @@ -#include #include +#include #include /* Custom Memory Allocator - Implementacion custom de un memory allocator que opera sobre un array de bytes usandolo como "heap" + Implementacion custom de un memory allocator que opera sobre un array de + bytes usandolo como "heap" */ #define JLANG_OK 0 @@ -15,99 +16,106 @@ #define JLANG_PAYLOAD 2 /* - La estructura de Metadata se encarga de almacenar el tamaño del bloque y si está en uso. - Se añadirá al principio de cada bloque - [BLOCK_METADATA] + [BLOCK_BYTES] + La estructura de Metadata se encarga de almacenar el tamaño del bloque y si + está en uso. Se añadirá al principio de cada bloque [BLOCK_METADATA] + + [BLOCK_BYTES] */ -typedef struct -{ - size_t size; // 8 bytes - int in_use; // 4 bytes - // --- aquí el compilador mete 4 bytes invisibles --- +typedef struct { + size_t size; // 8 bytes + int in_use; // 4 bytes + // --- aquí el compilador mete 4 bytes invisibles --- } JLANG_metadata; /* - La estructura de Memory Allocator se encarga de almancenar el array de memoria y el tamaño de esta. + La estructura de Memory Allocator se encarga de almancenar el array de + memoria y el tamaño de esta. */ -typedef struct -{ - char *memory; // 8 bytes - size_t size; // 8 bytes +typedef struct { + char *memory; // 8 bytes + size_t size; // 8 bytes } JLANG_memory_allocator; -void *JLANG_CreateAllocator() -{ - // Allocate memory in heap for JLANG_memory_allocator - JLANG_memory_allocator *allocator = (JLANG_memory_allocator *)malloc(sizeof(JLANG_memory_allocator)); +void *JLANG_CreateAllocator() { + // Allocate memory in heap for JLANG_memory_allocator + JLANG_memory_allocator *allocator = + (JLANG_memory_allocator *)malloc(sizeof(JLANG_memory_allocator)); - // Assign default free bytes - allocator->memory = (char *)malloc(1 * 1024); - allocator->size = 1 * 1024; + // Assign default free bytes + allocator->memory = (char *)malloc(1 * 1024); + allocator->size = 1 * 1024; - // ensure all memory is zero - for (int i = 0; i < 1 * 1024; i++) - { - allocator->memory[i] = 0; - } + // ensure all memory is zero + for (int i = 0; i < 1 * 1024; i++) { + allocator->memory[i] = 0; + } - return allocator; + return allocator; } -size_t JLANG_used(void *ptr) -{ - JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; +size_t JLANG_used(void *ptr) { + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; - // Iterate memory parsing only metadata - JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; - size_t used = 0; - while (currentHeader->in_use != 0 && used < allocPtr->size) - { - used += sizeof(JLANG_metadata) + currentHeader->size; + // Iterate memory parsing only metadata + JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; + size_t used = 0; + while (currentHeader->in_use != 0 && used < allocPtr->size) { + used += sizeof(JLANG_metadata) + currentHeader->size; - // Current block is in_use, jump to next block - currentHeader = (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + currentHeader->size); - } + // Current block is in_use, jump to next block + currentHeader = + (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + + currentHeader->size); + } - return used; + return used; } -void *JLANG_last_free(void *ptr) -{ - JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; +void *JLANG_last_free(void *ptr) { + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; - // Iterate memory parsing only metadata - JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; - size_t used = 0; - while (currentHeader->in_use != 0 && used < allocPtr->size) - { - used += sizeof(JLANG_metadata) + currentHeader->size; + // Iterate memory parsing only metadata + JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; + size_t used = 0; + while (currentHeader->in_use != 0 && used < allocPtr->size) { + used += sizeof(JLANG_metadata) + currentHeader->size; - // Current block is in_use, jump to next block - currentHeader = (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + currentHeader->size); - } + // Current block is in_use, jump to next block + currentHeader = + (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + + currentHeader->size); + } - return currentHeader; + return currentHeader; } -void *JLANG_malloc(void *ptr, size_t size) -{ - JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; +void *JLANG_malloc(void *ptr, size_t size) { + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; - // 1. Hay bloques disponibles?? - size_t used = JLANG_used(ptr); - size_t available = allocPtr->size - used; + // 1. Hay bloques disponibles?? + size_t used = JLANG_used(ptr); + size_t available = allocPtr->size - used; - // chequear si hay suficiente espacio libre - if (available > size + sizeof(JLANG_metadata)) - { - JLANG_metadata *freeHeader = (JLANG_metadata *)JLANG_last_free(ptr); - freeHeader->size = size; - freeHeader->in_use = 1; + // chequear si hay suficiente espacio libre + if (available > size + sizeof(JLANG_metadata)) { + JLANG_metadata *freeHeader = (JLANG_metadata *)JLANG_last_free(ptr); + freeHeader->size = size; + freeHeader->in_use = 1; - return (char *)freeHeader + sizeof(JLANG_metadata); - } + return (char *)freeHeader + sizeof(JLANG_metadata); + } - return NULL; // TODO + return NULL; // TODO +} + +void JLANG_free(void *ptr, void *blockPtr) { + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; + + // Get block header + JLANG_metadata *blockHeader = + (JLANG_metadata *)((char *)blockPtr - sizeof(JLANG_metadata)); + + // Set block as not_used + blockHeader->in_use = 0; } /* @@ -116,101 +124,91 @@ void *JLANG_malloc(void *ptr, size_t size) [FF FF FF FF FF FF FF ] */ -int _ceil(float v) -{ - int n = (int)v; - float r = v - n; +int _ceil(float v) { + int n = (int)v; + float r = v - n; - if (r > 0) - { - return n + 1; - } - return n; + if (r > 0) { + return n + 1; + } + return n; } -void JLANG_visualize(void *ptr) -{ - JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; +void JLANG_visualize(void *ptr) { + JLANG_memory_allocator *allocPtr = (JLANG_memory_allocator *)ptr; - // Step 1. Get byte type - char *byteMapPtr = (char *)malloc(allocPtr->size); - memset(byteMapPtr, 0, allocPtr->size); + // Step 1. Get byte type + char *byteMapPtr = (char *)malloc(allocPtr->size); + memset(byteMapPtr, 0, allocPtr->size); - JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; - long used = 0; - while (used < allocPtr->size) - { - long blockIndex = (char *)currentHeader - (char *)allocPtr->memory; - printf("blockIndex=%u\n", blockIndex); - used += sizeof(JLANG_metadata) + currentHeader->size; - - /* - HEADER - blockIndex + sizeof(JLANG_metadata) - */ + JLANG_metadata *currentHeader = (JLANG_metadata *)allocPtr->memory; + long used = 0; + while (used < allocPtr->size) { + long blockIndex = (char *)currentHeader - (char *)allocPtr->memory; + used += sizeof(JLANG_metadata) + currentHeader->size; - if (currentHeader->size > 0) - { - byteMapPtr[blockIndex] = JLANG_HEADER; - for (int i = 0; i < sizeof(JLANG_metadata); i++) - { - byteMapPtr[blockIndex + i] = JLANG_HEADER; - } + /* + HEADER + blockIndex + sizeof(JLANG_metadata) + */ - /* - PAYLOAD - */ - for (int i = 0; i < currentHeader->size; i++) - { - byteMapPtr[blockIndex + sizeof(JLANG_metadata) + i] = JLANG_PAYLOAD; - } - } else { - break; - } + if (currentHeader->size > 0) { + byteMapPtr[blockIndex] = JLANG_HEADER; + for (int i = 0; i < sizeof(JLANG_metadata); i++) { + byteMapPtr[blockIndex + i] = JLANG_HEADER; + } - // Jump to next block - currentHeader = (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + currentHeader->size); + /* + PAYLOAD + */ + for (int i = 0; i < currentHeader->size; i++) { + byteMapPtr[blockIndex + sizeof(JLANG_metadata) + i] = JLANG_PAYLOAD; + } + } else { + break; } - // Step 2. Draw + // Jump to next block + currentHeader = + (JLANG_metadata *)((char *)currentHeader + sizeof(JLANG_metadata) + + currentHeader->size); + } - int bytePerRow = 40; - int totalRows = _ceil(allocPtr->size / bytePerRow); - printf("totalRows=%d\n", totalRows); + // Step 2. Draw - char *currentMemPtr = allocPtr->memory; + int bytePerRow = 40; + int totalRows = _ceil(allocPtr->size / bytePerRow); + printf("totalRows=%d\n", totalRows); - for (int i = 0; i < totalRows; i++) - { - printf("["); - for (int n = 0; n < bytePerRow; n++) - { + char *currentMemPtr = allocPtr->memory; - int index = n + i * bytePerRow; + for (int i = 0; i < totalRows; i++) { + printf("["); + for (int n = 0; n < bytePerRow; n++) { - switch (byteMapPtr[index]) - { - case JLANG_HEADER: - printf("\033[46m"); - break; - case JLANG_FREE: - printf("\033[32m"); - break; - default: - printf("\033[41m"); - break; - } + int index = n + i * bytePerRow; - printf("%.2x", (unsigned char) *(currentMemPtr + (n + i * bytePerRow))); + switch (byteMapPtr[index]) { + case JLANG_HEADER: + printf("\033[46m"); + break; + case JLANG_FREE: + printf("\033[32m"); + break; + default: + printf("\033[41m"); + break; + } - if (n < bytePerRow - 1) - { - printf(" "); - } + printf("%.2x", (unsigned char)*(currentMemPtr + (n + i * bytePerRow))); - printf("\033[0m"); - } + if (n < bytePerRow - 1) { + printf(" "); + } - printf("]\n"); + printf("\033[0m"); } + + printf("]\n"); + } } diff --git a/src/objects/object.h b/src/objects/object.h new file mode 100644 index 0000000..118666f --- /dev/null +++ b/src/objects/object.h @@ -0,0 +1,101 @@ +#include "../memory/allocator.h" + +typedef enum +{ + OBJ_INT, + OBJ_FLOAT, + OBJ_STRING, + OBJ_LIST, + OBJ_NONE +} ObjectType; + +typedef struct Object +{ + ObjectType type; + union + { + int int_val; + double float_val; + struct + { + char *chars; + int length; + } string_val; + struct + { + struct Object **items; + int count; + int capacity; + } list_val; + } data; +} Object; + +Object *obj_new_int(void *allocator, int value) +{ + Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); + objPtr->type = OBJ_INT; + objPtr->data.int_val = value; + return objPtr; +} + +Object *obj_new_float(void *allocator, float value) +{ + Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); + objPtr->type = OBJ_FLOAT; + objPtr->data.float_val = value; + return objPtr; +} + +Object *obj_new_string(void *allocator, const char *str) +{ + Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); + objPtr->type = OBJ_STRING; + + int len = strlen(str); + char *buffer = (char *)JLANG_malloc(allocator, len + 1); + memcpy(buffer, str, len + 1); + + objPtr->data.string_val.chars = buffer; + objPtr->data.string_val.length = len; + + return objPtr; +} + +Object *obj_new_list(void *allocator) +{ + Object *objPtr = (Object *)JLANG_malloc(allocator, sizeof(Object)); + objPtr->type = OBJ_LIST; + return objPtr; +} + +void obj_free(void *allocator, Object* obj) { + if (obj->type == OBJ_STRING) { + JLANG_free(allocator, obj->data.string_val.chars); + } + + JLANG_free(allocator, obj); +} + +void obj_print(Object *obj) +{ + switch (obj->type) + { + case OBJ_INT: + printf("%d", obj->data.int_val); + break; + case OBJ_FLOAT: + printf("%f", obj->data.float_val); + break; + case OBJ_LIST: + for (int i = 0; i < obj->data.list_val.count; i++) + { + obj_print(obj->data.list_val.items[i]); + } + break; + case OBJ_STRING: + printf("%s", obj->data.string_val.chars); + break; + default: + break; + } +}