From c3629d71500f19c5cfe093804db8776bf6e1213a Mon Sep 17 00:00:00 2001 From: Elias Bennour Date: Sun, 28 Jan 2024 17:32:30 +0100 Subject: [PATCH] add gc --- CMakeLists.txt | 3 +- GC.c | 104 +------------------ bigint/build/bin/testbip | Bin 72952 -> 72984 bytes bigint/build/lib/libbigint.a | Bin 27544 -> 27728 bytes bigint/src/bigint.o | Bin 27160 -> 27344 bytes bigint/src/libbigint.a | Bin 27544 -> 27728 bytes bigint/tst/support.o | Bin 3536 -> 3584 bytes bigint/tst/testbip | Bin 72952 -> 72984 bytes bigint/tst/testbip.o | Bin 44472 -> 44520 bytes njvm.c | 191 ++++++++++++++++++++++++++++++++++- njvm.h | 11 ++ njvm.o | Bin 53680 -> 60016 bytes objref.c | 2 +- record.c | 5 +- support.c | 9 +- 15 files changed, 212 insertions(+), 113 deletions(-) create mode 100644 njvm.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d44b8df..85bf666 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,8 @@ set(CMAKE_C_STANDARD 99) add_compile_options(-g -Wall -pedantic) -add_executable(njvm njvm.c) +add_executable(njvm njvm.c + njvm.h) # Include directories for njvm executable target_include_directories(njvm PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bigint/build/include) diff --git a/GC.c b/GC.c index e02e026..898ded7 100644 --- a/GC.c +++ b/GC.c @@ -1,6 +1,6 @@ #ifndef GC #define GC -#define HAS_BROKENHEART_FLAG(objRef) (((objRef)->size & 1 << (7 * sizeof(unsigned int) -1)) == 0) + #include #include #include @@ -8,107 +8,7 @@ #include "objref.c" #include "instruktion.c" #include "support.c" +#include "bigint.h" -ObjRef heap; -ObjRef freePointer; -ObjRef middle; -ObjRef start; -ObjRef end; -ObjRef finalEnd; -ObjRef scanPtr; -ObjRef tmpEnd; - -unsigned int defaultHeap = 8192 * 1024; - -void heapAlloc(unsigned int size){ - heap = malloc(size); - if(heap == NULL){ - fatalError("Not enough memory on Heap\n"); - } - - start = heap; - freePointer = start; - middle = (heap + (defaultHeap/2)); - end = middle; - finalEnd = (middle + (defaultHeap/2)); -} - -void flip(void){ - freePointer = end; - tmpEnd = finalEnd; -} - -ObjRef copyObjToFreeMem(ObjRef obj){ - ObjRef tmp = freePointer; - memcpy(tmp, obj, obj->size); - if(IS_PRIMITIVE(tmp)){ - freePointer += sizeof(tmp) + tmp->size; - }else{ - freePointer += sizeof(tmp) + tmp->size * sizeof(void*); - } - return tmp; -} - -ObjRef rellocate(ObjRef orig){ - ObjRef copy; - if (orig == NULL){ - - copy = NULL; - } else { - unsigned int tmp = HAS_BROKENHEART_FLAG(orig); - if (tmp){ - copy = orig->forward_pointer; - } else { - copy = copyObjToFreeMem(orig); - orig->size = (1 | (1 << (7 * sizeof(unsigned int) -1))); - //SET_BROKENHEART_FLAG(orig); - orig->forward_pointer = copy; - } - } - return copy; -} - -void garbageColl(void){ - flip(); - for(int i = 0; i < program_size; i++){ - static_data_area[i] = rellocate(static_data_area[i]); // alte Objekte werden in neue akktive Halbspeicher geleitet bei relocate! - } - bip.op1 = rellocate(bip.op1); - bip.op2 = rellocate(bip.op2); - bip.res = rellocate(bip.res); - bip.rem = rellocate(bip.rem); - returnValueReg = rellocate(returnValueReg); - - scan(); - end = finalEnd; -} - -ObjRef garbageCollectorMalloc(unsigned int size){ - if((freePointer + size) > end){ - garbageColl(); - } else if((freePointer > finalEnd)){ - fatalError("Not enough memory on Heap\n"); - } - ObjRef obj = freePointer; - if(obj == NULL){ - fatalError("Object is Null\n"); - } - freePointer += size; - return obj; -} - - -void scan(void){ - scanPtr = start; //Zielspeicherzeiger; - while (scanPtr < freePointer){ - - if (!IS_PRIMITIVE(scanPtr)){ - - for (int i = 0; i < GET_ELEMENT_COUNT(scanPtr); i++){ - GET_REFS_PTR(scanPtr)[i] = rellocate(GET_REFS_PTR(scanPtr)[i]); - } - } - } -} #endif diff --git a/bigint/build/bin/testbip b/bigint/build/bin/testbip index 02f1195ac14732a2717e31f2bb3994bf1634b85f..5ed94466e561bf902b3165cd3afbdb31d324ffeb 100755 GIT binary patch delta 461 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 YPjT)s?=_6#S*E-3EBd&<(^#+l3n4-8z5oCK diff --git a/bigint/src/bigint.o b/bigint/src/bigint.o index 4e68f95420ef573ae35b673fe7cf9a26ca89ff9b..162ad9f334014e112fd16450027be8f3b967b58a 100644 GIT binary patch delta 3258 zcmb_eYiv|S6rP#8Q?|v{-2$asu@qXKAuWisMW6)=6o`HDDgi>5c4?uzbS*1Zf-ES8 zib%U$w2dHwgiuX1A*+ajiUbppf{=ieXd(oIXkubxG-wq)-`u&a`=80qp7WhKubDYB zcRH@}%h!0@O!vJ?rdp@NqE{jnWn$a1$XmI*`}mCkoL@F?@j|}J93hI`v-2#a_k~4& zHlG!R?mwnlD9a-3pn0C8X-~vT&zc^i&|RRVgS3Y`<~pM=t!lcZdq_*!EXE8HxqRkX zBiD1Uz#6_WNUIfD^rY!_(Q;^-G7!%itDW)#+;*D-S zYXkIK>O9Ml!H3K5iQNg9!Q?MCKf)<{Y<{Fm{%-S`sm$0*;5KzWFmAw6qQX3p?Q#A| zTpS;GKYBg;6<#-p(|D@G$=z}&v72a;JekRK;-3RQ*dZqozXN=VWC>{mq$44dh?6^^ z5`PjQSVBID1~?Mtf`}xNsdj+=d0?@5VWMZ~3K|kwA_)d)_o(wggV{ULGocA%jR@}+ zk!C?u1T_l90X=1*R#$>BXHH5DZ-&8oF-SzVAaT(kpg^$sVW|5RWG}-6d5XXoYwWCBH=_-)cFE zG^^y>GzzKQA{sSiA;{i#`X{^Kcpy_Fe>TuQXtI>cP8EoC65@e&L<*np3-wh@s0%Tn zx?)0Ij0trKhz)HXXgQxqgg3qk=c~!LGY<(=TPx71b*vRQMmk|}S`3+=Xqo;1)4+Q$ z?GY&x^yasyY(Idsw=dbhW0L(RCfWNM1*ajjjr=qIkJhU-`?o!wgtXc9VJy`|3+#X)IG6v4Cj)C)P`yop{^N6)-^|W3*(1lgYG(1$w_0Y;R^fJ-OGQWG= z6TS|G>9*85els*|b*j}Wu%QFDlPFY>B?r^3KsQw&{EKP?YF>{()y5twbec+N8eOo$ zYx{7`09>Pel+VksocPIx2kyd2n{qM_YHfW^)U^=NP9huCM(j28M)((+A5TeZ=z;Yp zwL6qXco95UkkSaMq8V)$jbAw&W7mOI7GrI=b_Hz5*~?$6!u7#5RHucxo&|p)URQs% zT`F4&9aI-im!S*PignRWz5(~KxMU|^OB-=GcW^jBD`31atcgg6u~lv++D?UUgqg%N zv2DgSr`%@q+aHoI5PtwV&%0!s&A*T=UnBkqOd(z+7YWKV;%gw^ z7m^vo?;v~Q)o0{r;+1Vjvm9^h?{ATliBE+7fwoMRh-oJ5qCY8yy-vhstdxg|s%2Qk zFDRK64EopActh(NH*CzQ zs%fnCWqX6coTA1JA>W43#+*66O+J5P(AShx?)Qe)HZ}z|=9GAA$`(~+2eqJI$NVWj zGs*9*dph9V;H~oo$U}6<)VGaFR2}_T=K!mc@htmdMdPD-o;Nji>v`fENgkYDkMvC=j8*v?1Oz5aGtwS|}Wd zP)}M5k1B|cQ_l+1AGQ0`A;WV=TcSiELSgIoB8nFx97?T)V-1l>)6)KXvITza%p}Ne<#X)pK;!8e!g}%uQG3~{hD`2 JkJr_S{{VtJ97g~E delta 3079 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 YPjT)s?=_6#S*E-3EBd&<(^#+l3n4-8z5oCK diff --git a/bigint/tst/support.o b/bigint/tst/support.o index 2ad0cc021555cc0eac87223aa52c5fcd4a80cdab..0147bffc0a2808bff06640fcaabc793b5e781920 100644 GIT binary patch delta 782 zcmZ8fO=uHA6rMMm-Rx#JKPw&@>LIA$PiRdC@4sqiXiDhaEWUvWV34$i+>P7 z5J5__Og(s0@Zd>=oWz3)p7i3+!CoR>gkD7KsYL|e+Z_~q@aBC#kJ+~~^M3r+u0hS- zO0zf`siba2XX-E?J^BFy5kVE!#0NNOgPOQ&Nns1(0I%BjrMg$D-^Ddv-SPZC)y{~w z{FptGvJOf2v?wao;)a&63v!E^$(VxpmAI@_il^jo&!qbhU5a(_TB#UcEyhR~3?Vhg zjR&#C*kjSqCiQh>8fYW2qV4Z*A_3dDhb2RJ3@mdS>l@Ou%rtSPJA`w(Iga=p;e5fI zMEsF(VJA~nBplQdmUK$_f^zB{c}y*%qytWq#9>nX8j3KM<*Rz9AH&8z=NE=azv5kiva%%v2cD^fZYDQ$`unc_aWeCnk?mPQFVNp!VR PDi42UegkZXZR_(N5OICA delta 734 zcmZ8fL2DC16rMMm-RyRgW>-8U)I(80V_I4S4R|nZ6}_|uQKXkbQo4s=l1)<(qhbX? z6p?nB{sC{j1PZzIBGS@B)r(ccgHZ6`sR#W71>d(jc<{m7?|t9*n4LE>&rW?FS)cOv z(;|-fRD%1_?JA8%Z+}xwMO2|BbwD@$1MO}kO`@oZvf>A3LeFaTo$ATTiC6!rKOOZ^ zUiJH0wkhd0Rl%qfwylKK^b(#cgu(T?S~kjsyx!cFc024MHr0+%cD6D?K&TBUbxS(! z*b<_r=B;silbJxQc_f>7H%UxFZFwwGJ}cMknbo*_j=_gvA|7&5YXr`P zM_gxR^yEg&Uh+35*StGmrN`_s%V1kH22XgH4Kd0|VG(_o^&0lVKbDh`sDqU=SVTBg z{+LzuK0SSUwz1f)cY71pg9kw~>;&D3YhkNZZ!gU@+QHp0Y_6y|`;60WG*>!dGq^u^ zYM1EJ4lf`%FLEw$BH{@c9sUy{9-Hx3%mlxbL+9%ioE;i);QF=nwS+U&QWd*piYc|U ftB!^W=P)n~OrQ;110-CPmgJ!19usY=V)pxAI^}8$ diff --git a/bigint/tst/testbip b/bigint/tst/testbip index 02f1195ac14732a2717e31f2bb3994bf1634b85f..5ed94466e561bf902b3165cd3afbdb31d324ffeb 100755 GIT binary patch delta 461 zcmeydlV!#(mJJJ-nIvQ89igi-(OmdIBncc)IAT*0z}F=4YJ zYx{qx?Mw^|DGUg35XetsU}Q*b+4Rq%%~ddfP9FC>5I4-uW8kw$!|pC z??O_~!x+ZI#j^bu594uezMRDL(%i(n#PrnM)Vz}E8zdQ}r$3co6vHYZFUcs1RU$$X zhmJ|ubr@hZg++?dX1bjeqa|yC0uuwzWJ6Z9>5HTog%o%ix&sz{eWLZ*CsJ=J&)wKb z|NhK+x$l9-)_U`c7cC;@Y`-GK_<+&HkaPWG_Gh=QoD*baW8WKdMfAwxt6~285;t9p v>q$KQvi6&Qze=07p5z-0XcP<#LYrwo5I4-uW4nV$(L`oOzi!#Rd5}soB%dOE4Oua^ZxCXgu^E|P-aHllOD1{9e<1KnWhg*vLKN-RYG zSfU1+vn`nDh7pxN<|L`li5ll4OcS%k*UUyXqgj@iWrCU*XVmZe&S|^er1zZP@BF^U z{q8;A>3iq2%jdMIdZ#tY=$g~zXpP3(9^~`!mycS#(~NBp6S_fN6;&ILAxY8xr3OTSt;uNrshcemsg<yecE>G%Zv(*dn4=cv)i}@BnRPvYY~6AXV7&vQGHV@BHtqyK z*CO1xc|VZc?b71W|7eCexU|W_EDia8B(m8E#ciUv%^7P!;Trd}Dwqvk2sb;C9B|HL zOXp><$ju%kPZVkK-3932gG4@KMcSm-foS1liOO7vK0F4YV6CL+dgLxf^bxKx_rfaj zZDY@%TQex;+uWN&IA6_+wRj)J@ba&~ZE-S4IsZXI8D$MeSFj3U#J_FE=20~Fq4@xr z*YlsHejVl5z^_VJK}p`5H1~pe>rNx~1e*7xqxWV;@5_uHNSe!sl#qGG9I|G|=&>g7 z{!}`nSY}4!*JpGW;}c1rkP;Y5$UN&@(&t++aPt8Ad6^+; zJW6gPWS;YG>1K@F97dy)yae1(bxx8I^Z1LT>L96RQ1x{(*pXdE>~&<$6GL`OsbExd z37O}#N4hy}1-W?~jebiTEoT}@$UHM;(r6ssD>vUpBfo|ZN|CxWc;DIZ!sF2bP1Lm; z%?so*}#mso18eHOrc#eFY5e*$hv9mbWbkD$@G9JAO z^8&KB>!~Ey>lsN($PB$k8iios<|Q<0(T%WTFJms|6=b`0kH1!G=ScepvWt4jJ}7f7 z>K1iuBM>k`+vXGnWH+$8rBxZ~&A;*fEiJ(p74@NE3Wl2`yhhtE9%@GTol1PtyG!^w z4{mP=heJdCfymIv@Mx94e`Fw783>1~8b^jB!QsegRa5Y>U}z*9++Woa3Pkpd>^DcN zwg>um?DSWL6_M76KRa*E4+Zu{2pd3G2VTM$EeK#ag!3Q zz#NV0pw4(vAA|7`wN7sy@UOYJ${1~37(Z8-8W-Ttl%BRIV22%Ua8Vb6u~_P3jJ6{X zTa2GjcuMJM9|E3Ndiojw?^aczodwuQRc&O9K1d+0 zsWQ_p0=!jW`ZNJMlmn+K>tR))GoqvCo7fU4ux@xHs{ah7N{E|6QFO|J0yn>EN_d*1 pA)d)fMTa@S-n0r&T~y(btW^~i$EkR ziyzUbf#ytImbpQ6h9AR`)J!vn1~LuPL}wISvKeIfv4kHmHU42y-}gPIE%he!oacF; z_v5_xo^!ZyRr}9REOHp3C3Uv%drIx&Z_%DSHY)9KmVbV9tJ+5v*&=_;CTS( zp<1llf#mLdE#CDl&9H`ituJ?q&@G9KE6OGc19>qof)e*J)i48I2)EWC8Oj^TlEI6? z$gTBAo-feid#7>sX<`Lq1zMkX2GNDjB`TgpGBKWWAuL-&Ss_QuTYO_|x7lkRen5;9MZOZMyxEz6I;htn0s zGArs`TG2y{A4$f9lE6_y=2@FBV}1k!w}NPT7i0F!a&bqk+0uy2hl+veSrsPUMPVdl zo@;Iyria4pN2hUK1YxK<2Rk-0_;`TdkiMm?91c`kco zn9FvMTZhqUA?XPHfq`4+(5Xf@ql&$OwOFIb*6W_&CaE1F?L}lK^r8dMW&?E-IvyjC z@DOdAOO%k^#vYbl#i+Nw!rvdr1YcCwN_0%Ys9VBC+J5nfiEvUC-sde9zNe0sRJZQy zXzu9Vus!^IIMN;scWkI^x2)#2P<3ltxVF7La!`1KcRSizBL}1Hk?^w#fAD8bHVFzD z$&uC2aR$>D;i$xi+6Cj6%1$R6;A6^8hZ^8vg=zJG*FdTGl;gT!bjah1jlq0B{5=4F z&%jkNQvVi@(Xj=@ok}zgb9CAYeZz;&B^aMmcG^^c=d#fX0acPO6sCg+_=`$UTMn?x ziE75^RDrQj>SK(y7Z5v@fQ|^j2UI}XNq}EacDg43SE^Oh0Rp&R>FF~BJfigUb^-5I zU7?)oCU-y{$SlC|+s!J~pgayyDdV0CS4M zk6cl7YXXg%SsgM%N`-f> 24) { case HALT: @@ -315,9 +320,184 @@ void execute(struct program program) { void tests(void) { } +/* + * Garbage Collection + */ + +ObjRef *heap; +int heapSizeKiB; +char *memTargetPtr; //zielspeicherzeiger +char *freeHeapPtr; //freizeiger +char *halfHeapPtr; //halbspeicherende +int gcCount = 0; + +#define MSB (1 << (8 * sizeof(unsigned int) - 1)) +#define IS_PRIMITIVE(objRef) (((objRef)->size & MSB) == 0) +#define GET_SIZE(objRef)((objRef)->size& ~MSB) //Gets the size of an ObjRef +#define GET_REFS(objRef)((ObjRef *)((objRef)->data)) //Pointer on first ObjRef in Object + +ObjRef copyObjectToFreeMem(ObjRef orig) { + //printf("%s%d\n", "Size in CpyObj: ", GET_SIZE(orig) ); + int size; + if (IS_PRIMITIVE(orig)) { + size = GET_SIZE(orig); + } else { + size = sizeof(void *) + sizeof(unsigned int) + sizeof(bool) + GET_SIZE(orig) * sizeof(ObjRef *); + } + memcpy(freeHeapPtr, orig, size); + ObjRef oldPtr = (ObjRef) freeHeapPtr; + //printf("%s%d\n","size after memcpy ", GET_SIZE(oldPtr)); + //printf("%s%d\n","actual Size: ", size); + //oldPtr->size = size; + freeHeapPtr += size; + return oldPtr; +} + +ObjRef relocate(ObjRef orig) { + /* if (orig == NULL) { + printf("%s\n", "null"); + } else { + printf("%s%d\n","Size in relocate ", GET_SIZE(orig)); + } + */ + + ObjRef copy; + if (orig == NULL) { +/* relocate(nil) = nil */ + copy = NULL; + } else { + if (orig->brokenHeart == 1) { +/* Objekt ist bereits kopiert */ + copy = orig->forwardPointer; + //copy->size =orig->size; + //printf("%s\n", "already copied"); + } else { +/* Objekt muss noch kopiert werden*/ + copy = copyObjectToFreeMem(orig); + orig->brokenHeart = true; + orig->forwardPointer = copy; + } + } + + return copy; +} + + +void scan(void) { + char *scanPtr = memTargetPtr; + while (scanPtr < freeHeapPtr) { +/* es gibt noch Objekte, die +* gescannt werden müssen. +*/ ObjRef scanOr = (ObjRef) scanPtr; + // printf("%d\n", GET_SIZE(scanOr)); + if (!IS_PRIMITIVE(scanOr)) { +/* Ist ein Verbundobjekt */ + for (int i = 0; i < GET_SIZE(scanOr); i++) { + GET_REFS(scanOr)[i] = relocate(GET_REFS(scanOr)[i]); + } + scanPtr += sizeof(bool) + (GET_SIZE(scanOr) * sizeof(ObjRef *)) + sizeof(unsigned int) + sizeof(void *); + } else { + //printf("%s %d\n", "is primitive, size: ", GET_SIZE(scanOr)); + scanPtr += GET_SIZE(scanOr); + + } + } +} + +void swap() { + if (memTargetPtr == (char *) heap) { + //printf("%s\n", "swapped to second half"); + freeHeapPtr = halfHeapPtr; + memTargetPtr = halfHeapPtr; + halfHeapPtr = ((char *) heap) + (heapSizeKiB * 1024); + } else { + //printf("%s\n", "swapped to first half"); + freeHeapPtr = ((char *) heap); + memTargetPtr = ((char *) heap); + halfHeapPtr = ((char *) heap) + ((heapSizeKiB * 1024) / 2); + } +} + +void garbageCollector() { + char *memToPurgePtr = halfHeapPtr - ((heapSizeKiB * 1024) / 2); + swap(); + //printf("%s\n", "stack"); + for (int i = 0; i < stack.current; i++) { + if (stack.stack[i].isObjRef) { + stack.stack[i].u.objRef = relocate(stack.stack[i].u.objRef); + } + } + //printf("%s\n", "globals"); + for (int i = 0; i < sda.size; i++) { + sda.sda[i] = relocate(sda.sda[i]); + } + //printf("%s\n", "retVal"); + //returnValue = relocate(returnValue); + + //printf("%s\n", "op1"); + bip.op1 = relocate(bip.op1); + ObjRef b = bip.op1; + if(b!= NULL) + //printf("%d\n", GET_SIZE(b)); + + //printf("%s\n", "op2"); + bip.op2 = relocate(bip.op2); + b = bip.op2; + if(b!= NULL) + //printf("%d\n", GET_SIZE(b)); + + //printf("%s\n", "res"); + bip.res = relocate(bip.res); + b = bip.res; + if(b!= NULL) + //printf("%d\n", GET_SIZE(b)); + + //printf("%s\n", "rem"); + bip.rem = relocate(bip.rem); + b = bip.rem; + if(b!= NULL) + //printf("%d\n", GET_SIZE(b)); + + + scan(); + if (purgeFlag) { + memset(memToPurgePtr, 0, heapSizeKiB * 1024 / 2); + } + gcCount++; +} + +ObjRef alloc(unsigned int size) { + if (freeHeapPtr + size > halfHeapPtr) { + garbageCollector(); + if (freeHeapPtr + size > halfHeapPtr) { + fprintf(stderr, "Heap is full\n"); + exit(1); + } + } + ObjRef or; + or = (ObjRef) freeHeapPtr; + freeHeapPtr = freeHeapPtr + size; + return or; +} + +void heapAllocator(int n) { + heapSizeKiB = n; + if ((heap = malloc(n * 1024)) == NULL) { + perror("malloc"); + exit(1); + } + memTargetPtr = (char *) heap; + freeHeapPtr = memTargetPtr; + halfHeapPtr = (memTargetPtr + (n * 1024) / 2); +} + +/* + * Main + */ + int main(int argc, char *argv[]) { // Init the Heap - initHeap(1000); + //initHeap(1000); // Initialize the Stack int size = SIZE; @@ -372,6 +552,7 @@ int main(int argc, char *argv[]) { run = 1; } } + heapAllocator(argVheapSizeKiB); // Init the sda ObjRef s[sizeSDA]; sda.size = &sizeSDA; @@ -394,4 +575,4 @@ int main(int argc, char *argv[]) { printf("Error: no code file specified\n"); return 1; } -} +} \ No newline at end of file diff --git a/njvm.h b/njvm.h new file mode 100644 index 0000000..2979ce5 --- /dev/null +++ b/njvm.h @@ -0,0 +1,11 @@ +// +// Created by Elias Bennour on 28.01.24. +// +#include "objref.c" + +#ifndef NINJA_NJVM_H +#define NINJA_NJVM_H + +ObjRef alloc(unsigned int size); + +#endif //NINJA_NJVM_H diff --git a/njvm.o b/njvm.o index 649cde959824589b1afb100038d55d7c00d44127..8a414212feeffa2d811ebc1e84db023f623743d3 100644 GIT binary patch literal 60016 zcmcef4_wvN{r^Arez=!=0Tl!l|D$4}Sz1|H@hJ=~L`q95w`7QbLLv}g+H^_a(oOp+ zW$Bh%RJO4EE>~@Vx@zH;E4Q>(Svn^AyhM*ZZdni6L?WyzoumKH$;qpzEH5fqWQaLA z9rd|-4j8*;T^}y3b%#^XSGr_LX^BhA$(cH3&J;IgS#wRj@Kxw1_PIahKsN#AsxE=ab24!f~AXcic9kp8GScQx%P?>%X*{Ftw1vRI{m`U75kLF z+yx8D3vLnp9rgXw=v!)}?mA63A+M!#0bQ;Cc*}kt+hWzd~{pFJ{)R$XUR$P!%lDkCA>r&q~ zBcCOMfM4xx8pHnYWS`boy5J_&z@6=zR;4AAje@to9i~Y~yVa-cE6dI6tgom_3%U9{ zcbuNS%3I62t?!*i-~SjZMt`9`#v683<}58)R#cLolan3Xi1gn{pbCM5nc-^waVx9%nT+ zL;HNi<=ZK%_BlJ}wUaecrf2)-=~iuXq}A3EnbsEYoLaZ=SpCu(KVLCrJMtktBL6P7 zwTw!;2)iy2J6b3&0B_51tC40+Xo=Tx$!i{-))+1yZpXWk*nJwd9DzstltSI$Zl?JutH5qMH8%J5hhiA^f))3TQ5Ij1?Y$`QZ5+ozLn!^@=| zzihc;+i)q9_E%*FsUx&gmT7xvPka04v~P1CvC(?8zGisq1L?yX0+!S@t?@(pQXnF& zEl9k@4nBIswraS1d=~Ho7xy%d`?_T) zf2B2k5kJdVmw7!YbDrY`iSxUt0X4`VfKKI&wP_%Pgt zfb=`&y)P`gy_}oHh78IPd!)><*kj##B=xk$ZDgl0WX8jG+E4tT?0NbN?2$PsRCZe9 zqsWf+L@f>+9J?;O&vf>~dz9Tgfc6+;HA;J&9AGs{Teb{fJ{V)#fwK3Rek^kzd2JsK zsA>${dQ*ecRpKePj#J}ScXi93+XMZ^9_ZKgK%dzIeR>b{^d9I=5A+Lrpr6wN{mdTdqkEta?}0wB2YP%D z^jtLF^e7SMWP-}33l8Yu!m0Aj$Pqvt;-+2 z7ZJS@WPS-Sht)IZ9RAnI0o!YGTEpig>Ty)+UD&=hZTfu073_EQS|^+PSQMua(g<@2 zWrVeaIzj{C0HKAD2=7D!KC$K#mJ>D->Iu&g-XI(!1h_y*B1|UCA`}v;2wMm{3Hu1m zgjT}mE1uo{IeUYX>E446)C}xkyE~sgP&1Ty^&73IR`VRDY^tjn(pq0Lua)^y?fci7 zcB+T(WV&_G^)j3Dr?t1(XvUPdZ!D_4Om3M8gx|XP~`9{O9r+??#>HF%-Wi1oG zQSUC-6RwW>rf)O^MzH>V5g+@S`t+d$&=!<_XVq@EhqMO&@3vRRI#%u2zpT7#d(D8> zSnQ4UvS;#M_S&O0H?#_0k|*jYW2v^zPNdF*TSfjo_N-Ee+p%B#QD5^ld^DGRZFYm~ zhaar*9IUgypDO#zdV6rI;<2+E>YEa=VP0#!J+Sq3`bu5XT=>7%%D%hyS#0@y#V_jB zbyAa;bufx`&|BLa&G^CY@O7~HOxEd{?D50=@A7zA59=zdgSUJ2-l#tPkCOwx@u+=F zp*!B>`e9~TquSdy$= zC*3hB<8zeRLu_W|7z-Xp`=KlBQ&6CEO77wqZ>!uHNw>MQbqPw$=Ql}Q|lW{I{%J0~#2<>#*@ADOzjCHTt*Q$04yB>1e z!`-_`oqB4o=GnA?ZMC^=)@;*9sbdTEwb(12o-JW}>~!fr0miPwE`%V?WVyYunqmJ?}d@uioS}kJA1M$-4dB`?XNq^)!W%J_8K{P(f#_D zoy*i?Na~AjH9tz96gz)PKRLa2$=J^P+vVCv&Rpu7xJLckw_Xk8a{b0NJJ-N6rce9a zMb23Q)=qsMA#tuZw>PP4g=qH-=47;4C!<4oi(8()f6&^nxgdCrRr_HyDlpk=wuI+DYmqecsryE{Na8l9r&>%QejV-q5_S`uG>|XBb=E za@2Kp>P&{RTIioC;G@bPQR`&fcd0`<{n(bhg4kx(I@4!P(jI>CgXGC| z{H<1BX(K5^+DX>C&SSo=MxTAu*RW4G#hHWXP}g+KacV7mojruR#;SE}ctagJq;B=L zw5PSW(=GL8m_r2hD~Pu4%NvWcXIt!Pu>^RN9NU#oif)-eYmDi>0BS$EW{T! zr*u~zx6Mz-*NTTW3^G>m_f0*WfhZqUd}A{8Q|E~RITIaaHFD5_@2GzdI@~2UtDHxQ z4PEF{Jhbmr<{xwRQez!-&s#XJle6BoBYm)iz7RSa4I9_*(H`&9$AtIYPUECU`xq}r z(EA~JWiIJ_&fv}&vVO?gB;!ncf-Q|QXE9IEKiD5KM`f7)A>-{`^4>$Q_$`=l>hm(u zrPgzFf5_a`lMOOnE@NK6=j^Z8e=uf3@nFaC6RyMESBH-;ckgzh^qKAM*>bSB`r7b4 z=gG*lgC}cx9jsqt9c)>HU)QBAbHWla}9 z9$6=Q(rN?K;VaM~78fjmgsPdsRUUCr;mi0WF` zdfQwVqescti2S`qen9IKbM7hSG=FBPeSDp5!?Vfo^lKeqcs~40UmLsr>25An?Hejf z^xS3i#48&=q;9HCb{w|HG0$AnI$hQmbw47l)~X8DHs7~eUqf6HRAclAGRbw<}<@dvDBiC3{OZzM?+*48hpn9Em*^ zI%-wCuG zc_*W-gWuBpwatr+%&S^P`K<~57Xoc9FJ$!Wx83kOi;U~HG+%A=4Mx|KQ+&%tjwr|{cscy0*uo5eNuD5Glzd9(4`4cc#i2zDKt-S)RCIj=T4 zF6rdAkHh?C!544%&J6S0$6vv3RdVfQbPew0w`l6o2fy_R^IOwpwaq7M^cc0neD-N% z+q?gWY-{<)l|A>hqwstjsry>frM1l;8$ItsKYC@`dmmq^`q}?<l731@&+A6dli1Jv6B?5bVf!PIZATutvVBa}q}DdS zWccsX{AxU|gLeZy+R({Iz1rvd<{Eg`7$4PKQro=S=ve{11|O}_KAP5zk9t}M%^HZ` zO*x(C&c*01HDxwkT-*G(DKiiHV#+MlWp-Xm-F>&r>1zH+NA?jTJG7v@^`;Ff8)6?5-6SA9)?0M9Ywo`2}in@)VEyn1!=piYn#^?8{?r5#^=Mk_j#eae?fPY=edhcwP)GWO&z-W z_QKlcRif4gtr_qV{9i;XC+L*5&jISl^AGUxohW6>aambA|GE`hUxR@0`MZ@|6GH`7iqK%~O<5p7I}l zI`Sqqyzb8T=hrsp7(X@X{@8+#>3fehzYgD%`0i;5SG39bwrza=No3ct{vYXsub!d~ zWZPxGDIZ`HW2Ij^?)5+l1p_tzto-&{jmuJN}u zr#ErUw>6b}Xbr3_jT!$f-!+}WcjPJGHJ#db($B>959xE6T)%#JqovMZjy#L*uiDQZ zKZRZ7xxPH|EdA_p+Khg7L>pH z()fSm6!w#+{QAh3^y^IH*N6TMzivK-UF3;fYAnp89Un?-Ji0lpG1C(r9k^!Px+Jw8 z;oC7a&RE*{$ZUUG`1*B!H@@t$cW*kUwt2W|n{1&@JE||BWDnw`P$w+>1%5_ zIW4rOVQx@oU))>cvA1r{BtAvvA3nW?+Y@S=Kdsi+O-G@BI<4)!e@s(r__e3wvzoJO zn~xg#H+>y_w!!$!hUb05^O7$#7cnNkoX={`s%?JL=-G|^;nzElVf*90wj+;EYxh~x z_}b=|4gW)$U+uB)hIcbQ+uX@#1MVNxqtDhMv%&bR>CD>ZXN}$(=G&)i z`KOJ1MJJ!FbLWY1T<;j3yfB}w`;tCON6#Zh&+JY0>vJx6Ux?tG zYih@_$-S-~eYP8!XVIbNv(cP+8NE+J-#wKxuc^wO#i!%5reyYEM*g9Qj$^aNozLL8 z((v3J=ChhF>9eL$oO2mHHJyA`f$hui*|IR7+3=rd_!o!y>_&KV@L5hLpK%YdN1x3` z<_6<4dnD&wM(+&hv+>yt+GoQ~$7eMoIO{UEE?PU;IlqqK5H7z8Q1ORj4RA%pW4jlHfLPv9s3#gn0oZtQDi>0bw6tw#+jGV z`#$ue>703`tA2JcqU+fFk6eSSIK^5|p4x+~=;%-8`wrK^U%UsVULTlxy=sT%gVWjr zHx1>C&d4_5C-;2jN&NFPzJ9vh*UdSRjV(D>ay_Bf-L>xXKi!=HobEZnvQzknJhjJM zmL~TBd6!^VLuX%PoaTKm?%yRS+tH(*^)qrus83J#%iMd@V#D>oC5{Hkf=$G&9$s2Rdps*$}ftbeSde{7(CZ0M$ch>s(AHswFjKT1#GAM#ZHDE$xi z59!u>VW*$Kq4epFGt+7N5F*ba&tLw9oMtouYj5l>Zm~`~JWAzvaKY zQ`k?Q@?YMm{l{~)4eI)WYwPA3`u!TSp41HH{(u=9E1=h~o~+U9N#}XW?N4$~KZ<7* z!>^$_&-edUd*z&>zT~O)%K7)(%hyeN?d#z=fX=??at3bW$0v;+7k|n5DSZ(8ej__u z&ri)a(iS;(Tl0G z)j7e9oWI;aoAQ2;dv5lFFJm+Is(pCVK<@JxU#1&ho`)|lWS+k;op*Nzx7O9%sGcQ| z>-*+2$(sP5?BSadYnwM1*-_BXWGqZDz7Lm)CvSj}v5~1UGSSfEkr|+6mV6ca(+6-r z#OV9ftM)Q2o8|1l%h>^GWoQ4|=2FA+KJ?EnZ+q|L<%*Z*@Vh>*(nFsXy-J^rzC5Gv zB~zyO=2djRZpy6bSKEA};n@xSRmyx_mw8?{W&TI@owHBTcgR!o-t1G)d;iuvH1ibY zlPBdj&rEBSc{Mb*K89}|H$H1h;F`|(>>=on;j_oJ&;IQB67A&n?R4~AY4qJq8FF64 zzO}gq-D|vUN7h{4ww?aHoxXZx6wg9^)iHb7De6t0s`n_K+rO++-B)18DpU9L_}b*q>*7En{Lfb-4jw-=KZ1 z#}B-t4DSrXEA4U#yqCdy8N9rkvE8O!NCd6{qD;{*RCD<{$TQl!>`UmVtKFL=!l0tnD!rjx$3iH zzKTsveYl=B&*$4=Hht>hdfLPF^pucIGOyP)4bso`+sJ)ta>eQ15E zQfJ`uth=;{@L4>!ENvluyUX)>H=;X-a#VkdVh?4?o(=s*+9hX-Y8QE*^mNS5>KDDbAEEDVqwh@0khz?^=E3M5PP-4E!g&&X zQq_%T2-g_ic*ENVUK`#>cq6B@aV>OIu2)@Oy4U^k?Fs61ZI3?ujAx%uy5;cP;4)Lr zr_ev+Ip>plEL{9m>e$3Hg{4N{`;_6<@l|xcZnYhGoqIpgrfeJDJj45v;fwSIz}olo-`AZc} zItdNL=a0gnd?02cFXo;&0~`Zyie*h2i&5jqCrssKUi}_lH}A;U^4#`t-ZkVM5yo2h zI|(gjOuBjU{y=>?@6(8X41egIg7bNHi9GRLi;XXNF5&@r9^_pD+p4+?YxpjNeDi>3 z2_mgFdB;HF?Dh4#Fp-_UAHurit|p3xVZ^tS+nU%fv8eJnHy zs;^$iHww&qiIOkx0jcl8g!`IvntJoBQkVA+;2SINZOA(a=n9y35R?wyxp3c?5dU_h zjcrwJ(I-vL9OL9&p`*Ne;FcX~Hy_^_h_h;gBWOQqQ@%AI@8U`uySzbZ_pm(C`^(Pn zG0+c!JI~bPoSI9TaRfVQL@{Wd-ca-)Shwm678`p#1^;jy+Gbc*c z)s^YtUh;MQX9s>UPW2yoCnj8neAgjdhopPbF@rvk+3Tf2t}dxx=>3y!-l3Gf6kgX* zoVvPk=@+gKsBhy~Y|W&calKv~B=4b*{Z`uD(m%x4(ss|9u_I%op0Od(<#qFUiFDC^!ENO?2G#du?BN&1uj2TNw7fSa@BRd2d@~k6{S3YExb;wR zZF^`;pGpotg~|zr$w5D5dA-8qdWFeB?<}`Av}e(K6VvvM*stFcH}#Nr$in(XV}QOe zoxTw4_3J@$X78mhcu2eRr1U@We+vCZ+9$;$--!u(pEhi6boI8-C-pm=Iia=_Ir$b= zkn*G)i*m##ZrdWGzR`n@zkShnWm@P*uAGeDpocLIy5n&=X=zJ&&(iJdW9jRGUyKdC zbBR42=F{Ud!`@ALV&k>Hw(H7S5<~CApM2=bgD2DbAN-W(V%@Tf&Y&E4q^!b0Vew&M z@saIu;j8Dpq*Z=T<9x5DG50pB?WR}k+Q56OuPyw$)mZqvUAyWNt8pB*rT8rR%-UC~ z;_E&UKNX%qU!d>Em0@-ka{SYYYF34b||xr){`tWJK*a_)^GU^+)o&Q=|{vEbm+Hi__yG zg}zewn!eU6d@Zf9NO;UUYANQMRE4*twH3WqrQW5ZKZU-ffbTl2kE)-cPx^{{o8*h+ z>cjfH_;lx2ka_4dWcHbIq<%66q`qurzR8j1> zyGoaTN+WgS9ai3_)qYa*m|A;TiweVhHNSUSXk zE3K5#MPrE-t+Z0l3SKcQN?u#G6-yUb zOO_T}`9-%_OG@*t^8BKbN^2QkjIAV|S6EJ5{x8feuCzpKkyTb&w#dq@SZI|Kgj6h~ zVyob0i*HK8R$O2$sCSOUsm4xrmip`Af^JY1dvm z^IB{4#Pf=%YK5+?Nkm!Y*0l2S((;Rw@^VW`N-L8}%L+=8@=Egyk`@*f7bK0YaPyay zmzFHjMEU$?M>5W+DB`=dQ>R^i-IYl<7L`<#735WBUz}7SJ|CYXpP^ln#AijJUS^Fx z=b{R0beT0Jzr3KLBB@|`QAK4%l$*>iEy$(CutjCiG!@q6*G`)+SI@aPNf#pR zb8(U>XnayJD#j=A71`XyWu>@xd{X(+lJOK@P&Pj4=A}iHYF%59S6ZGQ>JHOsvE@ml zi;_y0QtgFF3rd%kSUrKHHGMsaCAJ{?aO8)aqYmL#1!IqBSq=T5TD zx$xri&bj!!^Q`MCau*d`oOJetlACT>l5}HfStX9G$WBTPHOi$?!L!a%9~uqf-tx+% zTTH1-OsPdBNh&*uK35>j#*AP^Vd=7vO}Qoc;^9hRC@d&03+n93LdJ`vlR^xte@3Zp zm3Oi73Y}XbNoT4Q-CU*4QYkvTN{v$~y1q(H(0Qd=ZuDrCRO3M_7Qf&|H8wa0aN>r#~^&4rFjbrwTXl2HuTWl2RkYKB-Siy_-7!=xG0IztAuj!89jjPV_% z1~~sOEu$I?a9tUI($vUaR8YB4h?NUf5^`=7vqj}XK&U!Z@l7pQf}0B#7Tg?VWfbI= zNrzs@Oc`aF{sp=tTlWzNYD9yD2mp)n%9fTh8+G6RRsSr=?`e2cRF;;NNw#rNNom;B zBU4Dx!XnAGk~nAKY({=t4MtdZR;}Vdvg0po&UfKKORlQ>e4DKE0=}U3mN!IlEi=!`z_HqVfdpy(mW*Wyo)8jAXAj6kz*}X4~ zjwb4tXms?YL?b5=ogRPLKvyhabofL^Ff3OQqT)RwDa?G)x0jNY#AK2jOi6*g`U7@v z&C)xbr?+*q&wx-gwhuLqJDYm+^`|9j-Z2Bk3d`#2v%H2R+Ttg5NG52Z4^|EAEZ48I zI#Jd?T9sj01Gp1Zm9jcnL=8Q8` zQ;q3I7a0Q=*D+%A*m&$oB|T1c8YpL~i1g$&kU6E~$At~Q7;7T`^N~R7UP@S^9p zT{4GS-g?O#7_^Ue$&Anzcn1aTk4>icHQ^o_wEy0Po7PjA81Y#L?h!%Tx&|?klp1+Q z1#MpkLUPcKaS3t^;T;{c;|-y`B3{coM=~!C+Wop@##-K+B{Mx}kM5EgXLRVSdp5 zzDrP6=LPK_bRaAY+7EOf6b0>vU4pW@IB0Ko2}(z4(EhPYP#on!`w5qzYQ8jRKkX6} z$MT^4bC;lWtO(lAy96b2ThRWMOL*PJH@64v{f5x)n_iapxMWrb?caCFjIzAavm<&1 z?e|?(Bbg2&`ULGib>U9p`-GC&pOGT>kfcpRV}F3x;4&R63i-^d-x_NQ<=}}!&q@2MjfrOyF z_Ige9{-0<#BWR!5rA*cj*Uw7gl8i4QBgWNy+^TYyP1Fvl42 zP2qNec5g#y?>f=iD*+~qfiAbWDKH&RbRf(M+UIv5Fu>DYf^?C@3DrUPMF(7vk!VI{MMOOWvw zs0!NkE-Afz%fXhjQcpjpf7p~xClZp(u$r#^tM;nONCcJlgfLku;e!(vFGO)w;7Yn$i28)l7RU&vJ_Geu?!gA8hf!l>=Ma3!&B_eR3cl`AXM|B> ze1I*yYd>0@We|^;=LPUuai`Q>uB9$kQvIgFC%;L;zhnmgd;9mbYnS__|9JaLQ{%i!X<=`FQP6*rk$3}AytlS& zIW~9`mE~5yTCBk_1$DL4^VHLP;DE3t6?-AG3SWt33BTvb3s&=fFd zi)2O#D>`RADye9b%J`|IVg^uA@(R~dZbaWtIpayRYa3Q=AbFAm7x|X8UGj$eCEm|H z(RxamvKCW(!M+h24p^!weL>}Fd&7Q9x`r<(6+nIdQ>gGo_d|skvP)7iDrML1S@n!0 zdr7i?R&OcLvJMd#fl0rVtb`Ggm2a{dbk-2@kguQikTqzQOhf$Or#Ux@T|@iLF+|nI zOYRY3l8lzaqBTjTM9N4|wvCkHt$uGAi7l#nbs{lFysT<7Mha72mQmmvW4hI>!$|tZ zh&ouaJ`m-Gb;EO(DobUC{E(u`imNp9(ta^{$)l9zkJ975cBS+?f0Xv#hSNwRt0VQ`_inIcvW$$=+BRtU zI4xgkW>d{=(CLtzpTB1*5ew1C-I$uvU{fRmmSkJ}`P%Dg#q~LkONF zp9*nozqy7u|12TOUqlF;MTaa@!#;498TR?o=K^PocHA{zDjt|%QaN6zfr+w)l9v`E zsdHprjhA8HPmlOdqN$#3Vluz}%b6?WmoQ#LH@wyR zY+?A7u3*yqX*w6P=uno}lja$mZ>T$jy2LNk*>3+_K1t+tawrRp>aN#$L?7KXaFOKB z)7^D&>=j!3CZ%VP=*c&FHUyL&okY+|6TxCFIAWU-9HM&SC=smoP}=fo!d2suNwxoB z!z7(tM#@!^w?=8`AGlJNJYVOjRt>CERzey1oXLKJgr_t`^l$cz+9HFMpDdW3C1(ls zVO8oJ(flJ-Dg`Af4?e96vZia9)quD|HR*O;Q2*5?bH2`0D{tU&W5tN^GqmVFz_a91 zDeirb%m53dxc4>N;NymCFHPiGk|kW9sH`D&O_f*9CEC-io+6!|&XhUSt~u^et@97X zPx_cgHk^T0H~o>PMEE^k)p~YKi>Ff3UY(ApS^IS2w}fDOuht3=dsaz0=n6D@#)-lx zH@(*TZOM=JW^4YpJZmH!>*l}VStsc@l}?uGC)zc29(PR}eFhX6|ADi-#c1e1@hai5 ztUZ*1{f9itz5SFpC*~8$LcvDQ-Ds6XadajWrC_pm1q!%o=*z%7LnhOhA;fx(;lEv! z5cPv7{tSk-CF-{57r-QhqgGkbFA^7LL{$Z%f8)k)kBL4&e6;XX$40;H#%uaUzfXL; z&{ro$|I_9Fc1pBOYduOQjaoY~I-2-Z!tZO(TT*DNqk*KbO!N8iLaj( zJ(IZ7xnXYfY~pVVePdyC9&u$`ZCUgp;vWcoQ)ToL;&M?Eb4 z^%_st zco{BlLho2_oVs2V1>U|^^gEE{BFGz0-KBE2Ou_2Xx9$#lp;8-`lqp!1^1rfF*rDWK z)ym=a-&tZhzqtnI8PwGF|F;` zJSZU4v(7nx;>5GhfpYHI=a04IVSuyqtO+7ll$WcX379Zf9tk*`KiN7Vy|ko~M_DQ+ zOf9&jpqOVk$|uY!&aLEGh9wmfco<>k?73%`8A2G(?5Q(C*%kSVEyF3%3D;HdOvi-c z+(k>5gPNYCP7gjwaK@*GEndP2d>(g@Pd~MdW zoE)B{m%r_6$+Ir%7V#D6vU1B8T`zZz<1Mdi6mtP1GX(vpgz zMJ3$v7uky3TM8&q=jP{{hkAJGrF3yY33sh|`X%S`($Zp!$}Y<-&z~iae-!ZKi~Qx| zkS1lNzIC0aAN$eI@ysqRt+a|N^pir?Qj14acx1>bS-NBaI?4+cSqsZ7b*nqv>LmqB z=1`M@%31s&--YD`1=vw0aUSGZ=*G#OUQ&r>x&6)qBUhA{E@>wagSHUbY*}r*-}+} ziTb}7o(08=b>XO_p)4{M($RBrZYj=1L0S34_A#Rhpo3Iiu9=ETcz{Hn7m+XZ5&nNr{^5Ir<{bb2PplvRYGuU^9D88aTa$D9e}Cn;gFjfgV$r1g ze|v7t-UW9(IO3@ncE`ug8_?%Z-`u+L&1GM+mcH;#)uWz^qGl9Z6=`SuaAnKxPg@dx zxHkIDD|2K2`pV{&m;GT;pWxqD4}QLKamMyJKR%IGQ*`X6Ro`E^{NCqo&wc3J8edh@ zwDV`~?enePYfcWqQR4}zge<~5LNQ?_VLf3hVFzIkVL#z5!bgM?gcvq8LkQyuse~*X zK95jLSV>q<*h<(z*hAP)c#H56;RHcWrG^m36H*Csr)(afn6Q$tp0Jg$gRqCNpYRsp zBf<$n3{R>KA&e)a669P<`oXj2@I(%5B>ne3{KrqO2PFN7xo|#AT+%#h^nR)O@ol=s%*`(#xgUIg+@*lq+nRG8BF9+$8|Gsom zesX3b>4#!flD&^kpJ@&e
  • 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 u=$ii3n0 literal 53680 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 diff --git a/objref.c b/objref.c index 82aca28..a525ef2 100644 --- a/objref.c +++ b/objref.c @@ -5,7 +5,7 @@ typedef struct ObjRef{ // if brkokenHeart and forward_pointer added at this point bip throws errors bool brokenHeart; - struct ObjRef *forward_pointer; + struct ObjRef *forwardPointer; unsigned int size; unsigned char data[1]; } *ObjRef; diff --git a/record.c b/record.c index 3d8086c..8df9f48 100644 --- a/record.c +++ b/record.c @@ -5,12 +5,13 @@ #define RECORD #include "stackslot.c" #include "instruktion.c" -#include "GC.c" +#include "njvm.h" + ObjRef newRecord(int size){ ObjRef record; unsigned int objSize; objSize = sizeof(*record) + (size * sizeof(void *)); - if((record = malloc(objSize)) == NULL){ + if((record = alloc(objSize)) == NULL){ perror("malloc"); } record->size = MSB; diff --git a/support.c b/support.c index 20d43cb..f5a885f 100644 --- a/support.c +++ b/support.c @@ -1,10 +1,13 @@ +#ifndef SUPPORT_C +#define SUPPORT_C #include "support.h" #include #include #include "objref.c" -#include "GC.c" +#include "njvm.h" + void fatalError(char *msg){ printf("Fatal error: %s\n", msg); exit(1); @@ -13,7 +16,7 @@ void fatalError(char *msg){ void * newPrimObject(int dataSize) { ObjRef bigObjRef; - bigObjRef = malloc(sizeof(unsigned int) + + bigObjRef = alloc(sizeof(unsigned int) + dataSize * sizeof(unsigned char)); if (bigObjRef == NULL) { fatalError("newPrimObject() got no memory"); @@ -26,3 +29,5 @@ void * getPrimObjectDataPointer(void * obj){ ObjRef oo = ((ObjRef) (obj)); return oo->data; } + +#endif \ No newline at end of file