From 6c104d7b2db23648554e15d0cccca21e5537e1fe Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 11 Jun 2020 22:44:13 -0500 Subject: [PATCH] Added flexible buffer implementation --- include/bh.h | 98 +++++++++++++++++++++++++++++++++++++++++++++ onyx | Bin 126664 -> 127192 bytes progs/minimal.onyx | 12 +++--- src/onyx.c | 4 +- src/onyxwasm.c | 28 ++++++++----- 5 files changed, 126 insertions(+), 16 deletions(-) diff --git a/include/bh.h b/include/bh.h index dc8a93a3..9424690c 100644 --- a/include/bh.h +++ b/include/bh.h @@ -115,6 +115,12 @@ inline i64 chars_match(char* ptr1, char* ptr2) { #define fori(var, lo, hi) for (i64 var = (lo); var <= (hi); var++) #define forll(T, var, start, step) for (T* var = (start); var != NULL; var = var->step) +#ifdef BH_DEBUG + #define DEBUG_HERE __asm("int $3") +#else + #define DEBUG_HERE +#endif + @@ -401,6 +407,37 @@ void* bh__debug_realloc(void* ptr, size_t size, const char* file, u64 line) { +//------------------------------------------------------------------------------------- +// Flexible buffer +//------------------------------------------------------------------------------------- + +typedef struct bh_buffer { + bh_allocator allocator; + i32 length, capacity; + ptr data; +} bh_buffer; + +#ifndef BH_BUFFER_GROW_FORMULA +#define BH_BUFFER_GROW_FORMULA(x) ((x) > 0 ? ((x) << 1) : 16) +#endif + +void bh_buffer_init(bh_buffer* buffer, bh_allocator alloc, i32 length); +void bh_buffer_grow(bh_buffer* buffer, i32 length); +void bh_buffer_append(bh_buffer* buffer, ptr data, i32 length); +void bh_buffer_concat(bh_buffer* buffer, bh_buffer other); + + + + + + + + + + + + + //------------------------------------------------------------------------------------- @@ -1286,6 +1323,67 @@ end_of_format: +//------------------------------------------------------------------------------------- +// FLEXIBLE BUFFER IMPLEMENTATION +//------------------------------------------------------------------------------------- +#ifndef BH_NO_BUFFER + +void bh_buffer_init(bh_buffer* buffer, bh_allocator alloc, i32 init_size) { + buffer->allocator = alloc; + buffer->length = 0; + buffer->capacity = init_size; + buffer->data = bh_alloc(alloc, init_size); +} + +void bh_buffer_grow(bh_buffer* buffer, i32 length) { + if (buffer == NULL) return; + + if (buffer->capacity >= length) { + // NOTE: Already have enough room + return; + } + + i32 newcap = buffer->capacity; + while (newcap < length) newcap = BH_BUFFER_GROW_FORMULA(newcap); + + ptr new_data = bh_resize(buffer->allocator, buffer->data, newcap); + if (new_data == NULL) return; + + buffer->capacity = newcap; + buffer->data = new_data; +} + +void bh_buffer_append(bh_buffer* buffer, ptr data, i32 length) { + if (buffer == NULL) return; + + if (buffer->length + length > buffer->capacity) { + bh_buffer_grow(buffer, buffer->length + length); + } + + memcpy(bh_pointer_add(buffer->data, buffer->length), data, length); + buffer->length += length; +} + +void bh_buffer_concat(bh_buffer* buffer, bh_buffer other) { + bh_buffer_append(buffer, other.data, other.length); +} + + + + + +#endif + + + + + + + + + + + diff --git a/onyx b/onyx index 1be388ef9e86b7705ff8d8bc501ddb7d0dcf39f9..552631e52fb05489e67e55946bd09f677b6a05eb 100755 GIT binary patch delta 39493 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 IUQ}6s0aeKP^8f$< delta 39527 zcmd?S33OD&x<9&W?;dt4NvA@0W(b`LGLtZ)AhQMm8AJsEnGrM$LO>8mBa=V?iCb)x zh~R*Nph!RvMZu#oh~sg<5j=VXMLnRNBM#XA-&eJ})8w9e*In=3yWaY**K4tB_{REb zuCFSb_`-eUGxyqj-Tbp{-I+AZ)&0fqZenll4hj9*-A7>Tl z+r8s>w+YYn2;3U?@J+S1Jh}Df4U5~=pV6mgiuNlttzvcjODiboGI5DDG3z3WsUM#` zl9@LQ(X^!ptCFm;TwncXIj_0&UHz=b3TNrB_OqH6WwNX5FE3ip^lz@V-Y>qLO|S1? zayeuDtrex2dWT8%TT3gMesrRhQZ~~$d6K5BwX!yN>mM#lH}rG2S}(R~u0K*~oous5 zPrcQ;uWgQg_*U!rwuSnDN!IDM_vp{xY|U#|>^O9*rdcKJ((7Msw>D0{VWf3KkD>ZI zBkP~((cF>q=}^*dR^N)6-X|(*1`32nDr&l=zG$N86)O&(>3MzqPghQ3`VVE+_=<=1 zx5_QEPqzN_V5_*#VEx%^t%ZF))O!rBA9i&H(?2b-X7}Boe|}}Xw_jJruCcD|U&8#> zo&C3D%X#&ADdfWg9y}Xie{Z6)SpQSiE4j zR-Fjcxf8;u0e}zpJ|1B*CIXpYbso@^RanCYbZnX+vEGhgogW{j|7Qnl$AH4Lqa8FY z!hL%Lx~qeAZa}KOzJtXFX0Ulyi-C9RXWLtQ2NvotwXgqjpvm+-?X2$y6|xmp>fo6y z$yzlyS3lRbe%Ih}G5+pDuB}-7U0KD71t%(2%zC?G#dSwk^nYdXf>*SJrO!bZYtX1` z_5PXG7nRNQ4wqT~7K2UVK!gPb1NxIIRKv%<# zS@UjM#;&vUQMvkK-L3plS$g~{R^L&>^!XVQZ(;}F6<9xv@~1sFR@3%hAR(*Um5-sI zOD6PPGFIlx?)2xAGX6QGiNewF6-81Df_uDJP+Hc}bt9o3iHF#`Z z+H@fAPge9tZj$t0AviPCT03@??nsrSKePd<>pdc^w-$^WlAb&YR4IyT>PSho62X~2 zUyxEA<7epGk|pWAt%>vmkq)yy9KR}k3Gnu}RHUB{m!uaEoT+?XlHNCAhMt-vN%iu3 zrd*+abJ&_ZabkMv2#|GFWYceyWUCOI(e_I+{pJ}M4kX!qtsv2Q>t?58xQ;sZPfBOw zt)Fhr)pvKa(k5l;O`o?qPa3AzG?Cb|O7EFcV4a-QtXUgkUUS{PikkihWtUs=CUv$J z$o?k9N}GI>zBN&jSS9yNDYRam+-%Ub3V)Wwrxqo<=eQq3p|c&S&(vruUPFb)UDL**n&N>6!ZTEv#wN zdnfE#625J@$DhwBq9mS&@e#upgUPKUeii{k#NYCtFLS#rTRM zM;^^#Rn9ZFSp#Ps*Iijw=Ilb($9~l8aqF7dIqvOwh(6+=;o7yB;&)h^X6NWP=2@@K zZh)9y$$7=R9sbw6NZj4M=$KN$z2dzVll4hPC_775cRgSzQ-xK=b=#QKo+LM(g)Q zm$Us=hs8zu#s>jOvF0tFs=FVw&MqG2*j^V3S$8kav!*O*hZ*SG#kq(jSRX8D$$ql_ zT#}_H*41Y%-LC67_t(F57bY#&dMj&XzU5odM&BB=s#m62Z`K?@Q}nMK!K$nUD?exJ ztPwS>*ivg%O@==C7HezG-}DLhTB}zTdWOw~T_1PJGW4Hoy}Igx-o~8%KIKHk`17vM|pL>0Vm304j-T0d|@BXLsFTb#g9@wWBP>^xYh9UY5Us%^~cp?4k zWz-94cIkfsZ6+?6$LY&XS_>Ym)VnUV&LUO%S^dC` zI@5=JW(|4hI=#;)){_sd)O#+nI&7M$|8S?ZebXQM!G+eg&Bcy)7sBLEJ={@0b;3IH zaF*5X;ePrr0c-KY4-H zo&ur@eJ3T7QsVHLUq6${GV0{3S4&b!6HW5W@&+7mII;rCnx&(OWW~}8RJKb=Rxf=U zDmY1hAyZN`CZ<~2v^}lCy7~ajHRn3-%D)= zk{^!~LYF5Z6jO+zrvDMhTL|9KgZSOQV?67R>Rk^&&C<2_V$rksppF#}6c?1P2`rUR zZN<{BP+2wW=nFk1P`0l=5mAOzPKqJzUj}_MnvZV|v&W_kq)5iNhj9T8-98X3gIRsmCI? zw@9frXD#8`ZjLa&Z4sO+31_jyL0^+&{E3RC2Ln}Jsqf-5sWsgM>~rXpan>n26q%`$ zBuH3vnQS6mMn~9P_)He`6bgC{1v;AxB`IPrQ7R&cZxP~R3B%6gx>JyL3UZ~`Qx%IX z&#aVygwA*pWzr*bOQnGR=fV}MHY;*=e*9MmyzW1(So2R(P1b8g4I0|gRAkhwZc5*E z6bDe^NQ*y^rUmQ)#7iPoJE97H7h+JsSSO=FB7KK!d$Rvh@~(FzcDQTJQAydC03G{~ zgv!o@?l<&X-Q{`A zoZYYQv*Ls9*Y#QP&+bFIulVD-iq$3Ck$r8yf{WOgm}j1@|8v_e$F7}265DovA`}{d zf1S|BN}$VKn?j*4(19<1Boun%Q3WITg2zLlG5AM#R(CzMe$%1xERg$RDD;m5q0j~V zqd3Dq3ZwsVq`h`tQ-nKVo)_@%2>!i?f2Z*8JN&!%%}{6){%yy;lvg!lTup&~C~P zpiU4v?+k^0M)>vOP$(6>&$%QN>WFYX!Vw6)%R-@r2wN`$!6rmrLB=Zxk7G*w3gJx5 zg%0dK*C5PA_$I<$2rs)ErbBpr5RCxg-w{5F@ZkMuJP5l!0LvjfumP6in#Qr*D@OPl z=8=I2-$ApjLU?>@D6}5ocY&Q~d5HYE3#|@eNj(I|YT5{dxd`t?*bCuagyRvOL%0N? zZ#M)Z?1k_Zgc}ilg)n~)=;JhP62e@B`w;d*s6PvOgf}2uf^Y}IClCf+LF5P`RePa1 z!t{NikQuLOk08uPcmQDq!k?cDg(e}qZGR}V9O26dpFsF2!XpURKM#6@MK6HfqiMqs z<|AB)umWLsbjL{uD-kY7cpTvq9*kdgFMGiJi>bsZajuYhwuWz_Yl?}N25b{ z7z2c_2^uE`iM9w6-wTC?AbcHR6++MZphtKD;qJ+Z%>4ii5I*xEMlFQ5oj|L_rY-Ix zv|5BqJ_&_}A{_c@C^QFQx6jac5N`V%qY}bBCqto65ng#J6#4_}G5K(M-mykB;WB zDb_^*HdxJ$HD@ta7krmnBk{e>T7Yky^&r0ctpmrJ>%UF0K0lTT9v6|d&1&{~bJoY| zg753rNPOp63trD*>DFe%@I7YLzLC=355hW(cAeIQLZ8qYJ}l*`RmNh6@fHIwl5`L_ z=P-Vt$u;2UcSuQoWSs(hfR*%SbEgAC-&U*Bn;8YUh<#9tAp&DcBfdLhKuL5Jz?o_- z09_?w*IAq2Y+gWvYVkv%kRO9!gzjpoPomqV+YOw2>l@IWKrGoRe=7z3*Df`3vXGPE zYzhu#)*!?>BUWMEhS&(i`dYP!%|~p!^$cQlh)uHILF@&@=2++7%ErQzYQs{c4uo4Vx1AIv~GJlBR~W7eHbUNyM%gR#9s3Oe;x4aqv5?5 z8+t#9B5RMv_KUztiN@)^*cb#9Sto%14EWAyxc($D2uKE}fUsm+D757ggw0X{G0;#k z{7LNgE`cwJ!2N*F1RQI_1`|MmA+`eD0G|SQhv;C{gG_%GA^#_xp4_#KBO z!;@HJ{KEjN@EBu!YY;1H1I2*ffu+LmOFG!~G$>1WKfw23>9GG2P4uvY=9& z1JW~CxEw@0QcC^#h!BB=&mgR0He3R~F9I(E{5arqF0tawh!qC{o{M$Pdza9^73c1c zhD8cY2f_&;oVf(y%ZPxrfNwe)3f&T23S)vavmZ1&0sr=xHSt8I>peu@dEHuhBHi^f zqCJjV+fJmn@L@et{RWnLm<1yxGs1$^hb*0(2mIOijJqQ3m2y$)+&lR4Iz z&pNX8^;w@k=hlD9!9FnATI+Bm>)I%gL3{j$-7W*|KpO(5jKj2pSsg!FkGTmD!V6JN=%=tEGjroL7;2Vdy!{MAfwMsKm2wa$a zIe}}zSuajogt%@xuSd#whbT%idLYYby37X TLm$Svchv%?_5s|KEt?u8o!9hWjP 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 diff --git a/progs/minimal.onyx b/progs/minimal.onyx index 1356f4ba..215f6fdf 100644 --- a/progs/minimal.onyx +++ b/progs/minimal.onyx @@ -7,12 +7,14 @@ export foo :: proc (foo i32, bar i32) -> i32 { return 10 as i32; } -export diff_square :: proc (a i64, b i32) -> i64 { +export diff_square :: proc (a i32, b i32) -> i64 { // Typechecked - c := a - (b as i64); // Mutable - d :: (a as i32) + b; // Constant + c := a - b; // Mutable + d :: a + b; // Constant - { f :: 10 as i32; }; + { + f :: 10; + }; - return (c * (d as i64)); + return (c * d) as i64; } diff --git a/src/onyx.c b/src/onyx.c index f986faca..73eef378 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -62,7 +62,7 @@ int main(int argc, char *argv[]) { OnyxWasmModule wasm_mod = onyx_wasm_generate_module(alloc, program); -#if 1 +#if 0 // NOTE: Ensure type table made correctly bh_printf("Type map:\n"); @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) { } #endif -#if 1 +#if 0 // NOTE: Ensure the export table was built correctly bh_printf("Function types:\n"); diff --git a/src/onyxwasm.c b/src/onyxwasm.c index d19909e5..a410d635 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -1,3 +1,4 @@ +#define BH_DEBUG #include "onyxwasm.h" // NOTE: Allows easier testing of types since most of the characters @@ -206,7 +207,8 @@ static WasmType onyx_type_to_wasm_type(OnyxTypeInfo* type) { return WASM_TYPE_INT32; } -static void process_block(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNodeBlock* block, b32 top_level); +static void process_function_body(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNodeFuncDef* fd); +static void process_block(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNodeBlock* block); static void process_statement(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* stmt); static void process_assign_lval(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* lval); static void process_assignment(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* assign); @@ -214,18 +216,22 @@ static void process_expression(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* static void process_cast(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* cast); static void process_return(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* ret); -static void process_block(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNodeBlock* block, b32 top_level) { - if (!top_level) { - bh_arr_push(func->code, ((WasmInstruction){ WI_BLOCK_START, 0x40 })); +static void process_function_body(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNodeFuncDef* fd) { + if (fd->body == NULL) return; + + forll (OnyxAstNode, stmt, fd->body->body, next) { + process_statement(mod, func, stmt); } +} + +static void process_block(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNodeBlock* block) { + bh_arr_push(func->code, ((WasmInstruction){ WI_BLOCK_START, 0x40 })); forll (OnyxAstNode, stmt, block->body, next) { process_statement(mod, func, stmt); } - if (!top_level) { - bh_arr_push(func->code, ((WasmInstruction){ WI_BLOCK_END, 0x00 })); - } + bh_arr_push(func->code, ((WasmInstruction){ WI_BLOCK_END, 0x00 })); } static void process_statement(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* stmt) { @@ -343,9 +349,10 @@ static void process_expression(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* break; } - case ONYX_AST_NODE_KIND_BLOCK: process_block(mod, func, (OnyxAstNodeBlock *) expr, 0); break; + case ONYX_AST_NODE_KIND_BLOCK: process_block(mod, func, (OnyxAstNodeBlock *) expr); break; default: + DEBUG_HERE; bh_printf("Unhandled case: %d\n", expr->kind); assert(0); } @@ -483,7 +490,7 @@ static void process_function_definition(OnyxWasmModule* mod, OnyxAstNodeFuncDef* bh_hash_each_end; // Generate code - process_block(mod, &wasm_func, fd->body, 1); + process_function_body(mod, &wasm_func, fd); bh_printf("Code for function:\n"); bh_arr_each(WasmInstruction, instr, wasm_func.code) { @@ -533,4 +540,7 @@ OnyxWasmModule onyx_wasm_generate_module(bh_allocator alloc, OnyxAstNode* progra void onyx_wasm_module_free(OnyxWasmModule* module) { bh_arr_free(module->functypes); bh_arr_free(module->funcs); + bh_hash_free(module->local_map); + bh_hash_free(module->type_map); + bh_hash_free(module->exports); } -- 2.25.1