From c0521c6d992afed75a029c4eb1d2df04f83ea08c Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Tue, 20 Aug 2024 20:35:28 -0600 Subject: [PATCH 001/320] Add linux support for errno. --- core/sys/posix/errno.odin | 97 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/core/sys/posix/errno.odin b/core/sys/posix/errno.odin index 4ef10aadf..c064c0001 100644 --- a/core/sys/posix/errno.odin +++ b/core/sys/posix/errno.odin @@ -141,7 +141,7 @@ when ODIN_OS == .Darwin { EMLINK :: 31 EPIPE :: 32 EAGAIN :: 35 - EWOULDBLOCK :: 35 + EWOULDBLOCK :: EAGAIN EINPROGRESS :: 36 EALREADY :: 37 ENOTSOCK :: 38 @@ -220,7 +220,7 @@ when ODIN_OS == .Darwin { EMLINK :: 31 EPIPE :: 32 EAGAIN :: 35 - EWOULDBLOCK :: 35 + EWOULDBLOCK :: EAGAIN EINPROGRESS :: 36 EALREADY :: 37 ENOTSOCK :: 38 @@ -301,7 +301,7 @@ when ODIN_OS == .Darwin { EMLINK :: 31 EPIPE :: 32 EAGAIN :: 35 - EWOULDBLOCK :: 35 + EWOULDBLOCK :: EAGAIN EINPROGRESS :: 36 EALREADY :: 37 ENOTSOCK :: 38 @@ -367,6 +367,97 @@ when ODIN_OS == .Darwin { ETIME :: -1 } +} else when ODIN_OS == .Linux { + EPERM :: 1 + ENOENT :: 2 + ESRCH :: 3 + EINTR :: 4 + EIO :: 5 + ENXIO :: 6 + E2BIG :: 7 + ENOEXEC :: 8 + EBADF :: 9 + ECHILD :: 10 + EAGAIN :: 11 + EWOULDBLOCK :: EAGAIN + ENOMEM :: 12 + EACCES :: 13 + EFAULT :: 14 + EBUSY :: 16 + EEXIST :: 17 + EXDEV :: 18 + ENODEV :: 19 + ENOTDIR :: 20 + EISDIR :: 21 + EINVAL :: 22 + ENFILE :: 23 + EMFILE :: 24 + ENOTTY :: 25 + ETXTBSY :: 26 + EFBIG :: 27 + ENOSPC :: 28 + ESPIPE :: 29 + EROFS :: 30 + EMLINK :: 31 + EPIPE :: 32 + + EDEADLK :: 35 + ENAMETOOLONG :: 36 + ENOLCK :: 37 + ENOSYS :: 38 + ENOTEMPTY :: 39 + ELOOP :: 40 + ENOMSG :: 42 + EIDRM :: 43 + + ENOSTR :: 60 + ENODATA :: 61 + ETIME :: 62 + ENOSR :: 63 + + ENOLINK :: 67 + + EPROTO :: 71 + EMULTIHOP :: 72 + EBADMSG :: 74 + EOVERFLOW :: 75 + + ENOTSOCK :: 88 + EDESTADDRREQ :: 89 + EMSGSIZE :: 90 + EPROTOTYPE :: 91 + ENOPROTOOPT :: 92 + EPROTONOSUPPORT :: 93 + + EOPNOTSUPP :: 95 + EAFNOSUPPORT :: 97 + EADDRINUSE :: 98 + EADDRNOTAVAIL :: 99 + ENETDOWN :: 100 + ENETUNREACH :: 101 + ENETRESET :: 102 + ECONNABORTED :: 103 + ECONNRESET :: 104 + ENOBUFS :: 105 + EISCONN :: 106 + ENOTCONN :: 107 + + ETIMEDOUT :: 110 + ECONNREFUSED :: 111 + + EHOSTUNREACH :: 113 + EALREADY :: 114 + EINPROGRESS :: 115 + ESTALE :: 116 + + EDQUOT :: 122 + ECANCELED :: 125 + + EOWNERDEAD :: 130 + ENOTRECOVERABLE :: 131 + + // NOTE: Note defined for linux + ENOTSUP :: -1 } else { #panic("posix is unimplemented for the current target") } From ef06cd93ccfa5ea4cf6f49a46626dd10c959bcaa Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Tue, 20 Aug 2024 20:35:56 -0600 Subject: [PATCH 002/320] Initial implementation of linux-specifig dirent struct. --- core/sys/posix/dirent.odin | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core/sys/posix/dirent.odin b/core/sys/posix/dirent.odin index bbb5416c5..38ba2e8cf 100644 --- a/core/sys/posix/dirent.odin +++ b/core/sys/posix/dirent.odin @@ -193,11 +193,21 @@ when ODIN_OS == .Darwin { } else when ODIN_OS == .NetBSD { dirent :: struct { - d_ino: ino_t, /* [PSX] file number of entry */ - d_reclen: c.uint16_t, /* length of this record */ - d_namelen: c.uint16_t, /* length of string in d_name */ - d_type: D_Type, /* file type */ - d_name: [512]c.char `fmt:"s,0"`, /* [PSX] entry name */ + d_ino: ino_t, /* [PSX] file number of entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_namelen: c.uint16_t, /* length of string in d_name */ + d_type: D_Type, /* file type */ + d_name: [512]c.char `fmt:"s,0"`, /* [PSX] entry name */ + } + +} else when ODIN_OS == .Linux { + + dirent :: struct { + d_ino: ino_t, /* [PSX] file number of entry */ + d_off: off_t, /* directory offset of the next entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"` /* [PSX] entry name */ } } else { From 171d917b7e4d0c488f5807fd5ae5928f4b7c625c Mon Sep 17 00:00:00 2001 From: Thomas la Cour Date: Tue, 20 Aug 2024 18:43:40 +0200 Subject: [PATCH 003/320] odin manifest file --- .gitignore | 3 ++ build.bat | 25 +++++++++++--- examples/demo/demo.rc | 75 ++++++++++++++++++++++++++++++++++++++++++ misc/emblem.ico | Bin 0 -> 3638 bytes misc/odin.manifest | 8 +++++ misc/odin.rc | 75 ++++++++++++++++++++++++++++++++++++++++++ misc/sourcefile.ico | Bin 0 -> 3638 bytes 7 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 examples/demo/demo.rc create mode 100644 misc/emblem.ico create mode 100644 misc/odin.manifest create mode 100644 misc/odin.rc create mode 100644 misc/sourcefile.ico diff --git a/.gitignore b/.gitignore index 553e16005..32e5f5b0f 100644 --- a/.gitignore +++ b/.gitignore @@ -266,6 +266,9 @@ bin/ *.exe *.obj *.pdb +*.res +desktop.ini +Thumbs.db # - Linux/MacOS odin diff --git a/build.bat b/build.bat index b458c0c67..6eeeaf9d5 100644 --- a/build.bat +++ b/build.bat @@ -22,9 +22,9 @@ if "%VSCMD_ARG_TGT_ARCH%" neq "x64" ( for /f "usebackq tokens=1,2 delims=,=- " %%i in (`wmic os get LocalDateTime /value`) do @if %%i==LocalDateTime ( set CURR_DATE_TIME=%%j ) - set curr_year=%CURR_DATE_TIME:~0,4% set curr_month=%CURR_DATE_TIME:~4,2% +set curr_day=%CURR_DATE_TIME:~6,2% :: Make sure this is a decent name and not generic set exe_name=odin.exe @@ -53,18 +53,29 @@ rem See https://learn.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-a set compiler_flags= %compiler_flags% /utf-8 set compiler_defines= -DODIN_VERSION_RAW=\"%odin_version_raw%\" +rem fileversion is defined as {Major,Minor,Build,Private: u16} so a bit limited +set rc_flags=-nologo -v ^ +-DV1=%curr_year% -DV2=%curr_month% -DV3=%curr_day% -DV4=%nightly% ^ +-DVF=%curr_year%.%curr_month%.%curr_day%.%nightly% + if not exist .git\ goto skip_git_hash for /f "tokens=1,2" %%i IN ('git show "--pretty=%%cd %%h" "--date=format:%%Y-%%m" --no-patch --no-notes HEAD') do ( set odin_version_raw=dev-%%i set GIT_SHA=%%j ) -if %ERRORLEVEL% equ 0 set compiler_defines=%compiler_defines% -DGIT_SHA=\"%GIT_SHA%\" +if %ERRORLEVEL% equ 0 ( + set compiler_defines=%compiler_defines% -DGIT_SHA=\"%GIT_SHA%\" + set rc_flags=%rc_flags% -DGIT_SHA=%GIT_SHA% -DVP=%odin_version_raw%:%GIT_SHA% +) else ( + set rc_flags=%rc_flags% -DVP=%odin_version_raw% +) :skip_git_hash if %nightly% equ 1 set compiler_defines=%compiler_defines% -DNIGHTLY if %release_mode% EQU 0 ( rem Debug set compiler_flags=%compiler_flags% -Od -MDd -Z7 + set rc_flags=%rc_flags% -D_DEBUG ) else ( rem Release set compiler_flags=%compiler_flags% -O2 -MT -Z7 set compiler_defines=%compiler_defines% -DNO_ARRAY_BOUNDS_CHECK @@ -82,6 +93,8 @@ set libs= ^ kernel32.lib ^ Synchronization.lib ^ bin\llvm\windows\LLVM-C.lib +set odin_res=misc\odin.res +set odin_rc=misc\odin.rc rem DO NOT TOUCH! rem THIS TILDE STUFF IS FOR DEVELOPMENT ONLY! @@ -93,7 +106,7 @@ if %tilde_backend% EQU 1 ( rem DO NOT TOUCH! -set linker_flags= -incremental:no -opt:ref -subsystem:console +set linker_flags= -incremental:no -opt:ref -subsystem:console -MANIFEST:EMBED if %release_mode% EQU 0 ( rem Debug set linker_flags=%linker_flags% -debug /NATVIS:src\odin_compiler.natvis @@ -102,19 +115,21 @@ if %release_mode% EQU 0 ( rem Debug ) set compiler_settings=%compiler_includes% %compiler_flags% %compiler_warnings% %compiler_defines% -set linker_settings=%libs% %linker_flags% +set linker_settings=%libs% %odin_res% %linker_flags% del *.pdb > NUL 2> NUL del *.ilk > NUL 2> NUL +rc %rc_flags% %odin_rc% cl %compiler_settings% "src\main.cpp" "src\libtommath.cpp" /link %linker_settings% -OUT:%exe_name% +mt -nologo -inputresource:%exe_name%;#1 -manifest misc\odin.manifest -outputresource:%exe_name%;#1 -validate_manifest -identity:"odin, processorArchitecture=amd64, version=%curr_year%.%curr_month%.%curr_day%.%nightly%, type=win32" if %errorlevel% neq 0 goto end_of_build call build_vendor.bat if %errorlevel% neq 0 goto end_of_build rem If the demo doesn't run for you and your CPU is more than a decade old, try -microarch:native -if %release_mode% EQU 0 odin run examples/demo -vet -strict-style -- Hellope World +if %release_mode% EQU 0 odin run examples/demo -vet -strict-style -resource:examples/demo/demo.rc -- Hellope World rem Many non-compiler devs seem to run debug build but don't realize. if %release_mode% EQU 0 echo: & echo Debug compiler built. Note: run "build.bat release" if you want a faster, release mode compiler. diff --git a/examples/demo/demo.rc b/examples/demo/demo.rc new file mode 100644 index 000000000..ef3ec2fec --- /dev/null +++ b/examples/demo/demo.rc @@ -0,0 +1,75 @@ + +#define Filename "demo.exe" +#define FileDescription "Odin demo project." +#define ProductName "Odin Programming Language Demo" + +#include "winres.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +#pragma code_page(65001) + +#define IDI_ICON1 101 + +#define Q(x) #x +#define QUOTE(x) Q(x) +#define FMTVER(x,y,z,w) QUOTE(x.y.z.w) + +#ifndef V1 +#define V1 1 +#endif +#ifndef V2 +#define V2 0 +#endif +#ifndef V3 +#define V3 0 +#endif +#ifndef V4 +#define V4 0 +#endif +#ifndef ODIN_VERSION +#define ODIN_VERSION FMTVER(V1,V2,V3,V4) +#endif +#ifndef GIT_SHA +#define GIT_SHA _ +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION V1,V2,V3,V4 + PRODUCTVERSION V1,V2,V3,V4 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0409FDE9" + BEGIN + VALUE "CompanyName", "https://odin-lang.org/" + VALUE "FileDescription", "Odin Demo" + VALUE "FileVersion", FMTVER(V1,V2,V3,V4) + VALUE "InternalName", "demo.exe" + VALUE "LegalCopyright", "Copyright (c) 2016-2024 Ginger Bill. All rights reserved." + VALUE "OriginalFilename", "demo.exe" + VALUE "ProductName", "Odin Programming Language Demo" + VALUE "ProductVersion", QUOTE(ODIN_VERSION) + VALUE "Comments", QUOTE(ODIN_VERSION) + // PrivateBuild + // SpecialBuild + // custom values + VALUE "GitSha", QUOTE(GIT_SHA) + END + END + BLOCK "VarFileInfo" + BEGIN + //0xFDE9=65001=CP_UTF8 + VALUE "Translation", 0x0409, 0xFDE9 + END +END + +IDI_ICON1 ICON "..\\..\\misc\\sourcefile.ico" diff --git a/misc/emblem.ico b/misc/emblem.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5644b4179eff9e731ed9450df8f9a4b5256395b GIT binary patch literal 3638 zcmeH}2~bnl9>za5LBdWF0uq*hh;~8Ha(qugC?cuaqJp$)71UZ4!CkAkYh6$f5l|2) zh$yzWA=U~=-NmAUDdW9klg@*h{#1u;(3@rh zWvUIj4{;$s$VFEQ7t$mS+7j7lPGCb6Z;dy5tng}=C7yk2fvPR$xWCa1&)adK$gIZdTcYCeTTDSnO;vG@5%^Z(5nc?1gQHjTmxi% zsfUy>9jMan(5I9@qgF#BZ$?L91X|C`gjykixM&?7ZMMYC)hztH+!$xR9)RO>^pQD3 z7b(*Kb&fkUZ?B=JGz#)eH}qELq388=h!Skk+g^vxx+|#I?tlx6jc{uI0Q9v!L0@+} zdM`ynk~fG%bqjhW^=K?u2$iB8vc^X!+h~v6aD60&0-BBn^yH0#j6NS#V>!AX zW})fOP-v7LXgn2;r-`0Ww$-Dp_A-i>vT$UU9@MusqPut@+R}zV{wNoU`Wtu{=YgtI ztI?I_2zBRM$gZwOYwpK*o#BHDx<@s~=AcI|LBSF((x>a9i#{)9c^p)&wP;D?K^)J9 z^382XE3$AW#uU=}JE%Od8k(j`bY*)&)2o2=Oc>hF&&SIIS5(vee~>c|Ep_GSpzl;q z?O7;a6hln!S+w6C%_T8-O5cT_R`T%O9CIj620<-(iO!RsLZj+IOBO-L%~&W~YEiqB zgAQ>Wepu@b)!Q<(AK*aM^boSUDQHan5O4CP;p~C|5I?<+!krV*OFf+>%b}Jvqw#nAKG$jkrbteT%(L>b7vgtc&jqb+#Xt|Y)?0Hs5 zn{9@k#(U@}i^sd%iKyFQ0rB~0^maAl@eV$Y(&to?Gz;SAchFwC9-UQZ@GO>(hJqy! zJuAnJBP;Pd@dLEnOhnQC8BogFaX6fgQ51uwE3tTzCdAR`!ML8i9Bq|(c(9EJN%aLZ zKRAt_qKxqRQ7Mwc^iZ7{jI!-R(emm6(j%(C9xZDmxB|85a`b?)5JWHVzJM0aK?&#f0qj`lAuJ+`)q{PKk(cV=Q?E#l-~` z|77FvIedTraPHtKds4ayQ^Fe2>)$PGwyUe(o|RgtT@3YOosQ;^OO@WG^B4QocX;qQlgfy@B-&!j4}JmUec- zeLfR6`8Jal*U6k#ZbX1%NMPex($+tPg@r&c<_&r4vnHRsb9LqTbEmjfg?KeK5RrBU zb8~0s(UVB(OS@MjGHEQ^kIq32q4lIedlzPAW*$%JUDXPnm6GR4p22?naK;c=M_vTd z5ln4uZ7a$BeDdJoBl7r(uRUYB&>qbUKC&>3sS;jw* z{FA1q$muhdR!L)B`P_)Jgc;w^&~T`?@QXO7tZZ^5=jbSsd(3VSU8DbTp)il?185y2 zpBoK~JCsV&<{u`L(ldN^dAf2k$#;9HZa`}!`N)tO;>o^*{fXp&z;aMhuwODsiJ@vuIDZq_EU>iN zvWRS*GBqSLT344k#)pw5OX $qJK|tH|mxYrY|C*9~@y@e0+^rKLA*4w*}*7$)@o zYW~+`!NNr(axtH46XhPQLyIwl5%SUJUrZ-6OlE#bALp#u?8)H~bOJ_a4C6-z(O35q zLME6_B$Gb<%$II5vjDBm81zSs{K%VLIqJi|{B`sgAK$Tl{vQX73+&f*sIG4?VCb;- z-v8i3TMuW!a2HQk{$RHuUcc#jR5vtoGG>|BnmG&XTFJAR*l(FYo{c(!Kd7IuT| z*?g{pBmIE224(@j>L#XCx3scmbGSCZ6+mwbg9!iSV&=R;=VmyCqKlSQ{vA$X7^Rmo z3d1Kd$|Vxo^O?MCpe(>-JCo~|X(ls$pJ5t?WxCUBA7F-Rk3>P*)$Lx!-|4bq{()_tA842s$bcU|3 zDO#YaOoAeBG&EfzNWPx{S!E`=X>Mq<;Lvz2UodQ;Wt0muprD!EbMF9@HK)*;;{&z4 z70=^cP?r;m9-1GQ*1KqPo?!|3QEzA{8?>f-Kv{oHn~#qvOEr|nQ#iG4nHhO4IKHb4aC1opy%`R_np?NMv>U4c*WMVDXb)E@Zb9!&#h7L9|*AOnkOVYL6xnEB-_fz9mjAbsJW zPbN&HjXroX)8>Qp%FV0Ld1+hzC~d#jF*T*_+`YfUdkpuaUD?!@ hc4@wYqm#41#g#eM{k<{sn6~{7JsVs8gAUDH`!{w6TBra3 literal 0 HcmV?d00001 diff --git a/misc/odin.manifest b/misc/odin.manifest new file mode 100644 index 000000000..d42403b22 --- /dev/null +++ b/misc/odin.manifest @@ -0,0 +1,8 @@ + + + + + UTF-8 + + + diff --git a/misc/odin.rc b/misc/odin.rc new file mode 100644 index 000000000..e45d6661b --- /dev/null +++ b/misc/odin.rc @@ -0,0 +1,75 @@ + +#include "winres.h" + +// https://learn.microsoft.com/en-us/windows/win32/menurc/stringfileinfo-block + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT +#pragma code_page(65001) // CP_UTF8 + +#define IDI_ICON1 101 +#define IDI_ICON2 102 + +#ifndef V1 +#define V1 1 +#endif +#ifndef V2 +#define V2 0 +#endif +#ifndef V3 +#define V3 0 +#endif +#ifndef V4 +#define V4 0 +#endif +#ifndef VF +#define VF "1.0.0.0" +#endif +#ifndef VP +#define VP "1.0.0.0" +#endif +#ifndef GIT_SHA +#define GIT_SHA 0 +#endif + +#define Q(x) #x +#define QUOTE(x) Q(x) + +VS_VERSION_INFO VERSIONINFO + FILEVERSION V1,V2,V3,V4 + PRODUCTVERSION V1,V2,V3,V4 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0409FDE9" + BEGIN + VALUE "CompanyName", "https://odin-lang.org/" + VALUE "FileDescription", "Odin general-purpose programming language." // note this is shown in the task manager + VALUE "FileVersion", QUOTE(VF) + VALUE "InternalName", "odin.exe" + VALUE "LegalCopyright", "Copyright (c) 2016-2024 Ginger Bill. All rights reserved." + VALUE "OriginalFilename", "odin.exe" + VALUE "ProductName", "The Odin Programming Language" + VALUE "ProductVersion", QUOTE(VP) + VALUE "Comments", QUOTE(git-sha: GIT_SHA) + // custom values + VALUE "GitSha", QUOTE(GIT_SHA) + END + END + BLOCK "VarFileInfo" + BEGIN + //0xFDE9=65001=CP_UTF8 + VALUE "Translation", 0x0409, 0xFDE9 + END +END + +IDI_ICON1 ICON "emblem.ico" +IDI_ICON2 ICON "sourcefile.ico" diff --git a/misc/sourcefile.ico b/misc/sourcefile.ico new file mode 100644 index 0000000000000000000000000000000000000000..5f377263317d1e04162f53b437547ee687674658 GIT binary patch literal 3638 zcmeHJX;4&G7XF$C0!|bN7!zeN8DkRTl9@1LNL*sZBr0T?L{JkoL~%yUX2vWsA}Rqv zlL*>0i(Aw|0ZDK`+|b4df~+mdW`n)a^g{1%>24>LD(1d!q#Bb-DwUcaQh*cw zIp>{w?(Op(KmadHngsInL$Mz)1wde+TVLk`NXWZK$va|#XNmB3KecY(z72!H0H@Ol zv)K&2UJr}K0+Y!EtJMmJMGgDSQ(#;2!8Gm#d$SToqY*lt4qB}i{r&w=DwS}k8^Knr z04)lIbx#N^*x1%r_sg451IT^f&p=A&>r>~J_7nMRm z6ah=&e3+XKqI-J)t|gB_*P$g~OeBwsAAk{#1AA&EnCc{$v+n~Zy99?#4|&!U+{&8+ zwRjimHwEEpW+Z4+KkRlpbRSGM&L=_oSr9DJYG@^8xbR^B z>h?s#&arTkeKQ3Qfh~OM8J$6kd}I323P zi_o((44hE`tD+e#$w817C7>#2HFB5x!Jv_&Pt^xgYa!ZG#z0fOi`*v%I`S8xA^CpL zdKm`Py~tm256XAE1e&IyQmIHy7<6Pki5p+cgq^iQ+j0VzH;%@wa~WW08?lW+?lNB} z+G}C#7DIo%92{-NmDH)I+5R|Kn;EptiVL}GQCGYTHk%FImFcKl?+Z!cd*nPVU>OGT zwrZ3lMd4!pI@qihXgkC>mpl!{tG)5fh6q%PR-&mi6<1HBLcDK1j&FPdIdNXt7k@9B z%d<#aD-;R^y2SfYnYI82-Wo&l@*y@9^4=It>}R6BBo%tHM~>W8o5ctN`K^_=!(t@= z1-Tpy$wMZSlmE660|Ns;)dGGc=I!n4JN7?bUf+G^;}Z}N5Ez({5aby$JSr+SHumsg z(qXEq+S=Ou{6>ws?O_o9BLAfYBE0n4}b-zYSau|tI;n#1pckoGec6I06l(x0qJHr2JLt|5Oi+dNXlALQ*Bk_yk z>Pz2Vt{K{9?UlOvstca}|4u8fI8}N2%#gv^bLU6mg~yH;6_=bSy;Fy;zbQNE;h&dZ zuy6kX>foWTh76A69Q~IEzU$4;sV~0Vot3?3uiHSFBg*x_Q?_oS{I{oueU_H)F7=L# z%$*+ihyU0}Q6GK$$)}r={^>H;J0HfFbjiUa(E^+-k@4m;EI_muoHhALH(q+pj z>Ww#7M6X=+7BPr_d-a+GkNDJ!3l}Y>qGMiq`IT4y8XX?~+UrYV<2-Tdnd!45s5x`z zQP0kQj{3`j=U<2-gf_e=Ds0;H8UEDFC;srqCnNv#=UGpMM?F1^0u)6>OnUI4-%oyc z%7jNAeQfIEB!_^JI7J1AjJt3A{SQo-7#hak2SSv?i}>@)fAsI}8ADNHeF6f5JddA` z@3F}3_4V|2ecuzm8@|i`2k>3E_sHNROTmccHJtaa|1mhUz6a(JiTED~A9pK}!S5j; zLJ{%3^VvauPT@~_5|N*qQ~3FW?_>OI!p|r?C)+g=*!x>uvkE`MxOj)~w7oSCOwj^Z zkIn`yPJ-^jR;bRVxcWaod)VvJ!Bu|>Cp`e`vFE@l>Y+Rm1J$K$NDi)a%?u8G7ud2T zE?!}3cYu`~Kz~sjY>GxSA4!C~xg2c6Zg8EYa2RE<6fK0cvjXaqiO@(JAQr`guHFp0 zvJR&5HDG$qqqkr_Sfk1{BbW!&C{JGuYhy0-74JY(x(b?av&sDOIb_!^qDqti&ZI*7 z4l)nP>LJOV1CFs0&SX%L@d|Dc8=IyZ*9#LNt2qFRK}&qr;PR1AT)d=`oWi;E`8b&} z8((jk>*Axf^ZQ*~!E*%9iTr%W&wTtm$MeK*>$eL0pHv_=HYSc*>bGpUzdPaJ(8x%_ zD={%c%pwSO(amcyF>YM&!ix(dBNr`>9@6K|BU}?1Nyx^H&w48A>1Rlc*>l|b3>Vvk z61s8gQ(Vjv96D{fTMr9&aZd2$huykhm|uo;LMCH*CJ7$W1p=Q@z5+l0(Zf35)+ukd adZ)?%cy}Kh1eCtNPzVJoBS_;VzW)VtF8j6s literal 0 HcmV?d00001 From 90aa7dff04d51a80fac118ee7006815381f80d7e Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 23 Aug 2024 19:56:45 -0600 Subject: [PATCH 004/320] Add POSIX dirent struct for Linux. --- core/os/os_linux.odin | 3 +++ core/sys/posix/dirent.odin | 22 +++++++++++++++++++++- core/sys/posix/fcntl.odin | 3 +++ core/sys/posix/sys_stat.odin | 3 +++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 2f7a5ac43..0a3a2e236 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -26,6 +26,9 @@ Pid :: distinct i32 File_Time :: distinct u64 Socket :: distinct int +ino_t :: u64 +ino_t32 :: u32 + INVALID_HANDLE :: ~Handle(0) _Platform_Error :: linux.Errno diff --git a/core/sys/posix/dirent.odin b/core/sys/posix/dirent.odin index 38ba2e8cf..127f7bc48 100644 --- a/core/sys/posix/dirent.odin +++ b/core/sys/posix/dirent.odin @@ -202,7 +202,27 @@ when ODIN_OS == .Darwin { } else when ODIN_OS == .Linux { - dirent :: struct { + when ODIN_ARCH == .i386 || ODIN_ARCH == .wasm32 || ODIN_ARCH == .arm32 { + + dirent :: struct { + d_ino: ino_t32, /* [PSX] file number of entry */ + d_off: off_t32, /* directory offset of the next entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"` /* [PSX] entry name */ + } + } else when ODIN_ARCH == .amd64 || ODIN_ARCH == .wasm64p32 || ODIN_ARCH == .arm64 { + + dirent :: struct { + d_ino: ino_t, /* [PSX] file number of entry */ + d_off: off_t, /* directory offset of the next entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"` /* [PSX] entry name */ + } + } + + dirent64 :: struct { d_ino: ino_t, /* [PSX] file number of entry */ d_off: off_t, /* directory offset of the next entry */ d_reclen: c.uint16_t, /* length of this record */ diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index ca030a9a5..617fa408f 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -410,6 +410,9 @@ when ODIN_OS == .Darwin { l_whence: c.short, /* [PSX] flag (Whence) of starting offset */ } +} else when ODIN_OS == .Linux { + off_t :: distinct c.uint64_t + off_t32 :: distinct c.uint32_t } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin index dd66d7d14..5760175b1 100644 --- a/core/sys/posix/sys_stat.odin +++ b/core/sys/posix/sys_stat.odin @@ -427,6 +427,9 @@ when ODIN_OS == .Darwin { UTIME_NOW :: -2 UTIME_OMIT :: -1 +} when ODIN_OS == .Linux { + ino_t :: distinct c.unit64_t + ino_t32 :: distinct c.unit32_t } else { #panic("posix is unimplemented for the current target") } From 9c06898303bd7625c8d450e0b5ddfdad49356ba4 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 23 Aug 2024 20:01:15 -0600 Subject: [PATCH 005/320] Add comma to last dirent struct member. --- core/sys/posix/dirent.odin | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core/sys/posix/dirent.odin b/core/sys/posix/dirent.odin index 127f7bc48..79b4f87c0 100644 --- a/core/sys/posix/dirent.odin +++ b/core/sys/posix/dirent.odin @@ -205,29 +205,29 @@ when ODIN_OS == .Darwin { when ODIN_ARCH == .i386 || ODIN_ARCH == .wasm32 || ODIN_ARCH == .arm32 { dirent :: struct { - d_ino: ino_t32, /* [PSX] file number of entry */ - d_off: off_t32, /* directory offset of the next entry */ - d_reclen: c.uint16_t, /* length of this record */ - d_type: D_Type, /* file type */ - d_name: [256]c.char `fmt:"s,0"` /* [PSX] entry name */ + d_ino: ino_t32, /* [PSX] file number of entry */ + d_off: off_t32, /* directory offset of the next entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ } } else when ODIN_ARCH == .amd64 || ODIN_ARCH == .wasm64p32 || ODIN_ARCH == .arm64 { dirent :: struct { - d_ino: ino_t, /* [PSX] file number of entry */ - d_off: off_t, /* directory offset of the next entry */ - d_reclen: c.uint16_t, /* length of this record */ - d_type: D_Type, /* file type */ - d_name: [256]c.char `fmt:"s,0"` /* [PSX] entry name */ + d_ino: ino_t, /* [PSX] file number of entry */ + d_off: off_t, /* directory offset of the next entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ } } dirent64 :: struct { - d_ino: ino_t, /* [PSX] file number of entry */ - d_off: off_t, /* directory offset of the next entry */ - d_reclen: c.uint16_t, /* length of this record */ - d_type: D_Type, /* file type */ - d_name: [256]c.char `fmt:"s,0"` /* [PSX] entry name */ + d_ino: ino_t, /* [PSX] file number of entry */ + d_off: off_t, /* directory offset of the next entry */ + d_reclen: c.uint16_t, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ } } else { From d8e4a1b93f6c0e609811b4f9f863180d7ef16c92 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 23 Aug 2024 20:02:44 -0600 Subject: [PATCH 006/320] Fix comment typo on POSIX ENOTSUP constant. Co-authored-by: Feoramund <161657516+Feoramund@users.noreply.github.com> --- core/sys/posix/errno.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/posix/errno.odin b/core/sys/posix/errno.odin index c064c0001..91afa4799 100644 --- a/core/sys/posix/errno.odin +++ b/core/sys/posix/errno.odin @@ -456,7 +456,7 @@ when ODIN_OS == .Darwin { EOWNERDEAD :: 130 ENOTRECOVERABLE :: 131 - // NOTE: Note defined for linux + // NOTE: Not defined for Linux ENOTSUP :: -1 } else { #panic("posix is unimplemented for the current target") From 2794eb31d9b955d893a1529defea47e815954aab Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 23 Aug 2024 20:08:59 -0600 Subject: [PATCH 007/320] On Linux POSIX, ENOTSUP and EOPNOTSUPP have the same value. --- core/sys/posix/errno.odin | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/sys/posix/errno.odin b/core/sys/posix/errno.odin index 91afa4799..e670ca889 100644 --- a/core/sys/posix/errno.odin +++ b/core/sys/posix/errno.odin @@ -151,7 +151,7 @@ when ODIN_OS == .Darwin { ENOPROTOOPT :: 42 EPROTONOSUPPORT :: 43 ENOTSUP :: 45 - EOPNOTSUPP :: 45 + EOPNOTSUPP :: ENOTSUP EAFNOSUPPORT :: 47 EADDRINUSE :: 48 EADDRNOTAVAIL :: 49 @@ -230,7 +230,7 @@ when ODIN_OS == .Darwin { ENOPROTOOPT :: 42 EPROTONOSUPPORT :: 43 ENOTSUP :: 45 - EOPNOTSUPP :: 45 + EOPNOTSUPP :: ENOTSUP EAFNOSUPPORT :: 47 EADDRINUSE :: 48 EADDRNOTAVAIL :: 49 @@ -311,7 +311,7 @@ when ODIN_OS == .Darwin { ENOPROTOOPT :: 42 EPROTONOSUPPORT :: 43 ENOTSUP :: 45 - EOPNOTSUPP :: 45 + EOPNOTSUPP :: ENOTSUP EAFNOSUPPORT :: 47 EADDRINUSE :: 48 EADDRNOTAVAIL :: 49 @@ -430,6 +430,7 @@ when ODIN_OS == .Darwin { EPROTONOSUPPORT :: 93 EOPNOTSUPP :: 95 + ENOTSUP :: EOPNOTSUPP EAFNOSUPPORT :: 97 EADDRINUSE :: 98 EADDRNOTAVAIL :: 99 @@ -455,9 +456,6 @@ when ODIN_OS == .Darwin { EOWNERDEAD :: 130 ENOTRECOVERABLE :: 131 - - // NOTE: Not defined for Linux - ENOTSUP :: -1 } else { #panic("posix is unimplemented for the current target") } From e0b78476c584ccee4dcccbdecf8805929c82e545 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 23 Aug 2024 20:18:26 -0600 Subject: [PATCH 008/320] Fix else when clause. --- core/sys/posix/sys_stat.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin index 5760175b1..aa3737361 100644 --- a/core/sys/posix/sys_stat.odin +++ b/core/sys/posix/sys_stat.odin @@ -427,8 +427,8 @@ when ODIN_OS == .Darwin { UTIME_NOW :: -2 UTIME_OMIT :: -1 -} when ODIN_OS == .Linux { - ino_t :: distinct c.unit64_t +} else when ODIN_OS == .Linux { + ino_t :: distinct c.unit64_t ino_t32 :: distinct c.unit32_t } else { #panic("posix is unimplemented for the current target") From 7d94810d016dc12327cd390aeb618a7753418295 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 26 Aug 2024 22:12:05 -0600 Subject: [PATCH 009/320] Fix ino_t and ino_t32 types for POSIX linux. --- core/sys/posix/sys_stat.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin index aa3737361..906318bb9 100644 --- a/core/sys/posix/sys_stat.odin +++ b/core/sys/posix/sys_stat.odin @@ -428,8 +428,8 @@ when ODIN_OS == .Darwin { UTIME_OMIT :: -1 } else when ODIN_OS == .Linux { - ino_t :: distinct c.unit64_t - ino_t32 :: distinct c.unit32_t + ino_t :: distinct u64 + ino_t32 :: distinct u32 } else { #panic("posix is unimplemented for the current target") } From f0e631cfa348790294355d3cbc481f5984077254 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Wed, 28 Aug 2024 19:08:48 -0600 Subject: [PATCH 010/320] Use native types on linux POSIX structs. --- core/os/os_linux.odin | 3 --- core/sys/posix/dirent.odin | 26 +++----------------------- core/sys/posix/fcntl.odin | 3 --- core/sys/posix/sys_stat.odin | 3 --- 4 files changed, 3 insertions(+), 32 deletions(-) diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 74a67f366..81ff5077a 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -26,9 +26,6 @@ Pid :: distinct i32 File_Time :: distinct u64 Socket :: distinct int -ino_t :: u64 -ino_t32 :: u32 - INVALID_HANDLE :: ~Handle(0) _Platform_Error :: linux.Errno diff --git a/core/sys/posix/dirent.odin b/core/sys/posix/dirent.odin index 79b4f87c0..254639a3f 100644 --- a/core/sys/posix/dirent.odin +++ b/core/sys/posix/dirent.odin @@ -202,33 +202,13 @@ when ODIN_OS == .Darwin { } else when ODIN_OS == .Linux { - when ODIN_ARCH == .i386 || ODIN_ARCH == .wasm32 || ODIN_ARCH == .arm32 { - dirent :: struct { - d_ino: ino_t32, /* [PSX] file number of entry */ - d_off: off_t32, /* directory offset of the next entry */ - d_reclen: c.uint16_t, /* length of this record */ + d_ino: u64, /* [PSX] file number of entry */ + d_off: i64, /* directory offset of the next entry */ + d_reclen: u16, /* length of this record */ d_type: D_Type, /* file type */ d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ } - } else when ODIN_ARCH == .amd64 || ODIN_ARCH == .wasm64p32 || ODIN_ARCH == .arm64 { - - dirent :: struct { - d_ino: ino_t, /* [PSX] file number of entry */ - d_off: off_t, /* directory offset of the next entry */ - d_reclen: c.uint16_t, /* length of this record */ - d_type: D_Type, /* file type */ - d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ - } - } - - dirent64 :: struct { - d_ino: ino_t, /* [PSX] file number of entry */ - d_off: off_t, /* directory offset of the next entry */ - d_reclen: c.uint16_t, /* length of this record */ - d_type: D_Type, /* file type */ - d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ - } } else { #panic("posix is unimplemented for the current target") diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index 617fa408f..ca030a9a5 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -410,9 +410,6 @@ when ODIN_OS == .Darwin { l_whence: c.short, /* [PSX] flag (Whence) of starting offset */ } -} else when ODIN_OS == .Linux { - off_t :: distinct c.uint64_t - off_t32 :: distinct c.uint32_t } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin index 906318bb9..dd66d7d14 100644 --- a/core/sys/posix/sys_stat.odin +++ b/core/sys/posix/sys_stat.odin @@ -427,9 +427,6 @@ when ODIN_OS == .Darwin { UTIME_NOW :: -2 UTIME_OMIT :: -1 -} else when ODIN_OS == .Linux { - ino_t :: distinct u64 - ino_t32 :: distinct u32 } else { #panic("posix is unimplemented for the current target") } From 4577d541ec2b807df02c40f187a4c44dc7aa2e0f Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Wed, 28 Aug 2024 22:15:11 -0600 Subject: [PATCH 011/320] Add contants RTLD contants on os_linux and posix (dlfcn). --- core/os/os_linux.odin | 11 +++++++---- core/sys/posix/dlfcn.odin | 9 +++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 81ff5077a..654748305 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -242,10 +242,13 @@ F_SETFL: int : 4 /* Set file flags */ // NOTE(zangent): These are OS specific! // Do not mix these up! -RTLD_LAZY :: 0x001 -RTLD_NOW :: 0x002 -RTLD_BINDING_MASK :: 0x3 -RTLD_GLOBAL :: 0x100 +RTLD_LAZY :: 0x0001 +RTLD_NOW :: 0x0002 +RTLD_BINDING_MASK :: 0x0003 +RTLD_GLOBAL :: 0x0100 +RTLD_NOLOAD :: 0x0004 +RTLD_DEEPBIND :: 0x0008 +RTLD_NODELETE :: 0x1000 socklen_t :: c.int diff --git a/core/sys/posix/dlfcn.odin b/core/sys/posix/dlfcn.odin index 0ddc41337..6a467a2bd 100644 --- a/core/sys/posix/dlfcn.odin +++ b/core/sys/posix/dlfcn.odin @@ -111,6 +111,15 @@ when ODIN_OS == .Darwin { RTLD_LOCAL :: RTLD_Flags{RTLD_Flag_Bits(log2(_RTLD_LOCAL))} +} else when ODIN_OS == .Linux { + + RTLD_LAZY :: 0x001 + RTLD_NOW :: 0x002 + RTLD_GLOBAL :: 0x100 + + _RTLD_LOCAL :: 0 + RTLD_LOCAL :: RTLD_Flags{} + } else { #panic("posix is unimplemented for the current target") } From 3557955f5374f6395d3bb4e6d6f13899e5a5bde9 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Thu, 29 Aug 2024 20:17:39 -0600 Subject: [PATCH 012/320] Align the dirent struct for linux --- core/sys/posix/dirent.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/sys/posix/dirent.odin b/core/sys/posix/dirent.odin index 254639a3f..48830b030 100644 --- a/core/sys/posix/dirent.odin +++ b/core/sys/posix/dirent.odin @@ -203,11 +203,11 @@ when ODIN_OS == .Darwin { } else when ODIN_OS == .Linux { dirent :: struct { - d_ino: u64, /* [PSX] file number of entry */ - d_off: i64, /* directory offset of the next entry */ - d_reclen: u16, /* length of this record */ - d_type: D_Type, /* file type */ - d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ + d_ino: u64, /* [PSX] file number of entry */ + d_off: i64, /* directory offset of the next entry */ + d_reclen: u16, /* length of this record */ + d_type: D_Type, /* file type */ + d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ } } else { From 575aedc3bf08711f30db5ba545007517abdaf02a Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 30 Aug 2024 19:45:56 -0600 Subject: [PATCH 013/320] Implement POSIX support for Linux for the following facilities: - fnmatch - grp - langinfo - locale --- core/sys/posix/fnmatch.odin | 8 ++ core/sys/posix/glob.odin | 36 ++++++- core/sys/posix/grp.odin | 2 +- core/sys/posix/langinfo.odin | 181 ++++++++++++++++++++++++++++++++++- core/sys/posix/locale.odin | 38 ++++++++ 5 files changed, 260 insertions(+), 5 deletions(-) diff --git a/core/sys/posix/fnmatch.odin b/core/sys/posix/fnmatch.odin index 9e54972e7..1326ce9e4 100644 --- a/core/sys/posix/fnmatch.odin +++ b/core/sys/posix/fnmatch.odin @@ -53,6 +53,14 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS FNM_PERIOD :: 0x04 FNM_NOESCAPE :: 0x01 +} else when ODIN_OS == .Linux { + + FNM_NOMATCH :: 1 + + FNM_PATHNAME :: 0x01 + FNM_NOESCAPE :: 0x02 + FNM_PERIOD :: 0x04 + } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/glob.odin b/core/sys/posix/glob.odin index 4f41d83db..b09104900 100644 --- a/core/sys/posix/glob.odin +++ b/core/sys/posix/glob.odin @@ -112,7 +112,7 @@ when ODIN_OS == .Darwin { glob_t :: struct { gl_pathc: c.size_t, /* [PSX] count of paths matched by pattern */ - gl_matchc: c.size_t, /* count of paths matching pattern */ + gl_matchc: c.size_t, /* count of paths matching pattern */ gl_offs: c.size_t, /* [PSX] slots to reserve at the beginning of gl_pathv */ gl_flags: Glob_Flags, /* copy of flags parameter to glob */ gl_pathv: [^]cstring `fmt:"v,gl_pathc"`, /* [PSX] pointer to list of matched pathnames */ @@ -144,7 +144,7 @@ when ODIN_OS == .Darwin { glob_t :: struct { gl_pathc: c.size_t, /* [PSX] count of paths matched by pattern */ - gl_matchc: c.size_t, /* count of paths matching pattern */ + gl_matchc: c.size_t, /* count of paths matching pattern */ gl_offs: c.size_t, /* [PSX] slots to reserve at the beginning of gl_pathv */ gl_flags: Glob_Flags, /* copy of flags parameter to glob */ gl_pathv: [^]cstring `fmt:"v,gl_pathc"`, /* [PSX] pointer to list of matched pathnames */ @@ -174,6 +174,38 @@ when ODIN_OS == .Darwin { GLOB_NOMATCH :: -3 GLOB_NOSPACE :: -1 +} else when ODIN_OS == .Linux { + + glob_t :: struct { + gl_pathc: c.size_t, /* [PSX] count of paths matched by pattern */ + gl_matchc: c.size_t, /* count of paths matching pattern */ + gl_offs: c.size_t, /* [PSX] slots to reserve at the beginning of gl_pathv */ + gl_flags: Glob_Flags, /* copy of flags parameter to glob */ + gl_pathv: [^]cstring `fmt:"v,gl_pathc"`, /* [PSX] pointer to list of matched pathnames */ + + // Non-standard alternate file system access functions: + + gl_errfunc: proc "c" (cstring, c.int) -> c.int, + + gl_closedir: proc "c" (dirp: DIR), + gl_readdir: proc "c" (dirp: DIR) -> ^dirent, + gl_opendir: proc "c" (path: cstring) -> DIR, + gl_lstat: proc "c" (path: cstring, buf: ^stat_t) -> result, + gl_stat: proc "c" (path: cstring, buf: ^stat_t) -> result, + } + + GLOB_ERR :: 1 << 0 + GLOB_MARK :: 1 << 1 + GLOB_NOSORT :: 1 << 2 + GLOB_DOOFFS :: 1 << 3 + GLOB_NOCHECK :: 1 << 4 + GLOB_APPEND :: 1 << 5 + GLOB_NOESCAPE :: 1 << 6 + + GLOB_NOSPACE :: 1 + GLOB_ABORTED :: 2 + GLOB_NOMATCH :: 3 + } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/grp.odin b/core/sys/posix/grp.odin index c8a39de6a..3a78e2c4c 100644 --- a/core/sys/posix/grp.odin +++ b/core/sys/posix/grp.odin @@ -114,7 +114,7 @@ foreign lib { getgrnam_r :: proc(name: cstring, grp: ^group, buffer: [^]byte, bufsize: c.size_t, result: ^^group) -> Errno --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { gid_t :: distinct c.uint32_t diff --git a/core/sys/posix/langinfo.odin b/core/sys/posix/langinfo.odin index 24ecc917a..ffb83730c 100644 --- a/core/sys/posix/langinfo.odin +++ b/core/sys/posix/langinfo.odin @@ -238,7 +238,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD { ABDAY_4 :: 16 ABDAY_5 :: 17 ABDAY_6 :: 18 - ABDAY_7 :: 19 + ABDAY_7 :: 19 MON_1 :: 20 MON_2 :: 21 @@ -278,7 +278,184 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD { YESEXPR :: 47 NOEXPR :: 49 - CRNCYSTR :: 50 + CRNCYSTR :: 50 + +} else when ODIN_OS == .Linux { + + @(private="file") + nl_item :: proc(flag: int) -> int { + return flag << 16 + } + + @(private="file") + _langinfo_values :: enum { + ABDAY_1 = nl_item(LC_TIME), + ABDAY_2, + ABDAY_3, + ABDAY_4, + ABDAY_5, + ABDAY_6, + ABDAY_7, + + DAY_1, + DAY_2, + DAY_3, + DAY_4, + DAY_5, + DAY_6, + DAY_7, + + ABMON_1, + ABMON_2, + ABMON_3, + ABMON_4, + ABMON_5, + ABMON_6, + ABMON_7, + ABMON_8, + ABMON_9, + ABMON_10, + ABMON_11, + ABMON_12, + + MON_1, + MON_2, + MON_3, + MON_4, + MON_5, + MON_6, + MON_7, + MON_8, + MON_9, + MON_10, + MON_11, + MON_12, + + AM_STR, + PM_STR, + + D_T_FMT, + D_FMT, + T_FMT, + T_FMT_AMPM, + + ERA, + _, + ERA_D_FMT, + ALT_DIGITS, + ERA_D_T_FMT, + ERA_T_FMT, + + // These values are defined only to make sure CODESET below gets the correct value. + _NL_CTYPE_CLASS = nl_item(LC_CTYPE), + _NL_CTYPE_TOUPPER, + _NL_CTYPE_GAP1, + _NL_CTYPE_TOLOWER, + _NL_CTYPE_GAP2, + _NL_CTYPE_CLASS32, + _NL_CTYPE_GAP3, + _NL_CTYPE_GAP4, + _NL_CTYPE_GAP5, + _NL_CTYPE_GAP6, + _NL_CTYPE_CLASS_NAMES, + _NL_CTYPE_MAP_NAMES, + _NL_CTYPE_WIDTH, + _NL_CTYPE_MB_CUR_MAX, + CODESET, + + // These values are defined only to make sure CRNCYSTR below gets the correct value. + __INT_CURR_SYMBOL = nl_item(LC_MONETARY), + __CURRENCY_SYMBOL, + __MON_DECIMAL_POINT, + __MON_THOUSANDS_SEP, + __MON_GROUPING, + __POSITIVE_SIGN, + __NEGATIVE_SIGN, + __INT_FRAC_DIGITS, + __FRAC_DIGITS, + __P_CS_PRECEDES, + __P_SEP_BY_SPACE, + __N_CS_PRECEDES, + __N_SEP_BY_SPACE, + __P_SIGN_POSN, + __N_SIGN_POSN, + CRNCYSTR, + + RADIXCHAR = nl_item(LC_NUMERIC), + THOUSEP, + + YESEXPR = nl_item(LC_MESSAGES), + NOEXPR, + } + +// NOTE: declared with `_t` so we can enumerate the real `nl_info`. + nl_item_t :: distinct c.int + + ABDAY_1 :: _langinfo_values.ABDAY_1 + ABDAY_2 :: _langinfo_values.ABDAY_2 + ABDAY_3 :: _langinfo_values.ABDAY_3 + ABDAY_4 :: _langinfo_values.ABDAY_4 + ABDAY_5 :: _langinfo_values.ABDAY_5 + ABDAY_6 :: _langinfo_values.ABDAY_6 + ABDAY_7 :: _langinfo_values.ABDAY_7 + + DAY_1 :: _langinfo_values.DAY_1 + DAY_2 :: _langinfo_values.DAY_2 + DAY_3 :: _langinfo_values.DAY_3 + DAY_4 :: _langinfo_values.DAY_4 + DAY_5 :: _langinfo_values.DAY_5 + DAY_6 :: _langinfo_values.DAY_6 + DAY_7 :: _langinfo_values.DAY_7 + + ABMON_1 :: _langinfo_values.ABMON_1 + ABMON_2 :: _langinfo_values.ABMON_2 + ABMON_3 :: _langinfo_values.ABMON_3 + ABMON_4 :: _langinfo_values.ABMON_4 + ABMON_5 :: _langinfo_values.ABMON_5 + ABMON_6 :: _langinfo_values.ABMON_6 + ABMON_7 :: _langinfo_values.ABMON_7 + ABMON_8 :: _langinfo_values.ABMON_8 + ABMON_9 :: _langinfo_values.ABMON_9 + ABMON_10 :: _langinfo_values.ABMON_10 + ABMON_11 :: _langinfo_values.ABMON_11 + ABMON_12 :: _langinfo_values.ABMON_12 + + MON_1 :: _langinfo_values.MON_1 + MON_2 :: _langinfo_values.MON_2 + MON_3 :: _langinfo_values.MON_3 + MON_4 :: _langinfo_values.MON_4 + MON_5 :: _langinfo_values.MON_5 + MON_6 :: _langinfo_values.MON_6 + MON_7 :: _langinfo_values.MON_7 + MON_8 :: _langinfo_values.MON_8 + MON_9 :: _langinfo_values.MON_9 + MON_10 :: _langinfo_values.MON_10 + MON_11 :: _langinfo_values.MON_11 + MON_12 :: _langinfo_values.MON_12 + + AM_STR :: _langinfo_values.AM_STR + PM_STR :: _langinfo_values.PM_STR + + D_T_FMT :: _langinfo_values.D_T_FMT + D_FMT :: _langinfo_values.D_FMT + T_FMT :: _langinfo_values.T_FMT + T_FMT_AMPM :: _langinfo_values.T_FMT_AMPM + + ERA :: _langinfo_values.ERA + ERA_D_FMT :: _langinfo_values.ERA_D_FMT + ALT_DIGITS :: _langinfo_values.ALT_DIGITS + ERA_D_T_FMT :: _langinfo_values.ERA_D_T_FMT + ERA_T_FMT :: _langinfo_values.ERA_T_FMT + + CODESET :: _langinfo_values.CODESET + + CRNCYSTR :: _langinfo_values.CRNCYSTR + + RADIXCHAR :: _langinfo_values.RADIXCHAR + THOUSEP :: _langinfo_values.THOUSEP + + YESEXP :: _langinfo_values.YESEXP + NOEXPR :: _langinfo_values.NOEXPR } else { #panic("posix is unimplemented for the current target") diff --git a/core/sys/posix/locale.odin b/core/sys/posix/locale.odin index 1f2a336b5..fae692bcb 100644 --- a/core/sys/posix/locale.odin +++ b/core/sys/posix/locale.odin @@ -88,6 +88,44 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS LC_NUMERIC :: 4 LC_TIME :: 5 +} else when ODIN_OS == .Linux { + + // NOTE: All of these fields are standard ([PSX]). + lconv :: struct { + decimal_point: cstring, + thousand_sep: cstring, + grouping: cstring, + int_curr_symbol: cstring, + currency_symbol: cstring, + mon_decimal_points: cstring, + mon_thousands_sep: cstring, + mon_grouping: cstring, + positive_sign: cstring, + negative_sign: cstring, + int_frac_digits: c.char, + frac_digits: c.char, + p_cs_precedes: c.char, + p_sep_by_space: c.char, + n_cs_precedes: c.char, + n_sep_by_space: c.char, + p_sign_posn: c.char, + n_sign_posn: c.char, + int_p_cs_precedes: c.char, + int_n_cs_precedes: c.char, + int_p_sep_by_space: c.char, + int_n_sep_by_space: c.char, + int_p_sign_posn: c.char, + int_n_sign_posn: c.char, + } + + LC_CTYPE :: 0 + LC_NUMERIC :: 1 + LC_TIME :: 2 + LC_COLLATE :: 3 + LC_MONETARY :: 4 + LC_MESSAGES :: 5 + LC_ALL :: 6 + } else { #panic("posix is unimplemented for the current target") } From 186565b0c18317c035c15b1525969ccab7ebfce5 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Fri, 30 Aug 2024 20:34:12 -0600 Subject: [PATCH 014/320] Simplify the implementation of POSIX langinfo for Linux: No need for the enum runtime checks. Constant values were set manually and comments were added to help locate their origin. --- core/sys/posix/langinfo.odin | 231 +++++++++++------------------------ 1 file changed, 69 insertions(+), 162 deletions(-) diff --git a/core/sys/posix/langinfo.odin b/core/sys/posix/langinfo.odin index ffb83730c..7f521e3a4 100644 --- a/core/sys/posix/langinfo.odin +++ b/core/sys/posix/langinfo.odin @@ -282,180 +282,87 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD { } else when ODIN_OS == .Linux { - @(private="file") - nl_item :: proc(flag: int) -> int { - return flag << 16 - } - - @(private="file") - _langinfo_values :: enum { - ABDAY_1 = nl_item(LC_TIME), - ABDAY_2, - ABDAY_3, - ABDAY_4, - ABDAY_5, - ABDAY_6, - ABDAY_7, - - DAY_1, - DAY_2, - DAY_3, - DAY_4, - DAY_5, - DAY_6, - DAY_7, - - ABMON_1, - ABMON_2, - ABMON_3, - ABMON_4, - ABMON_5, - ABMON_6, - ABMON_7, - ABMON_8, - ABMON_9, - ABMON_10, - ABMON_11, - ABMON_12, - - MON_1, - MON_2, - MON_3, - MON_4, - MON_5, - MON_6, - MON_7, - MON_8, - MON_9, - MON_10, - MON_11, - MON_12, - - AM_STR, - PM_STR, - - D_T_FMT, - D_FMT, - T_FMT, - T_FMT_AMPM, - - ERA, - _, - ERA_D_FMT, - ALT_DIGITS, - ERA_D_T_FMT, - ERA_T_FMT, - - // These values are defined only to make sure CODESET below gets the correct value. - _NL_CTYPE_CLASS = nl_item(LC_CTYPE), - _NL_CTYPE_TOUPPER, - _NL_CTYPE_GAP1, - _NL_CTYPE_TOLOWER, - _NL_CTYPE_GAP2, - _NL_CTYPE_CLASS32, - _NL_CTYPE_GAP3, - _NL_CTYPE_GAP4, - _NL_CTYPE_GAP5, - _NL_CTYPE_GAP6, - _NL_CTYPE_CLASS_NAMES, - _NL_CTYPE_MAP_NAMES, - _NL_CTYPE_WIDTH, - _NL_CTYPE_MB_CUR_MAX, - CODESET, - - // These values are defined only to make sure CRNCYSTR below gets the correct value. - __INT_CURR_SYMBOL = nl_item(LC_MONETARY), - __CURRENCY_SYMBOL, - __MON_DECIMAL_POINT, - __MON_THOUSANDS_SEP, - __MON_GROUPING, - __POSITIVE_SIGN, - __NEGATIVE_SIGN, - __INT_FRAC_DIGITS, - __FRAC_DIGITS, - __P_CS_PRECEDES, - __P_SEP_BY_SPACE, - __N_CS_PRECEDES, - __N_SEP_BY_SPACE, - __P_SIGN_POSN, - __N_SIGN_POSN, - CRNCYSTR, - - RADIXCHAR = nl_item(LC_NUMERIC), - THOUSEP, - - YESEXPR = nl_item(LC_MESSAGES), - NOEXPR, - } - -// NOTE: declared with `_t` so we can enumerate the real `nl_info`. + // NOTE: declared with `_t` so we can enumerate the real `nl_info`. nl_item_t :: distinct c.int - ABDAY_1 :: _langinfo_values.ABDAY_1 - ABDAY_2 :: _langinfo_values.ABDAY_2 - ABDAY_3 :: _langinfo_values.ABDAY_3 - ABDAY_4 :: _langinfo_values.ABDAY_4 - ABDAY_5 :: _langinfo_values.ABDAY_5 - ABDAY_6 :: _langinfo_values.ABDAY_6 - ABDAY_7 :: _langinfo_values.ABDAY_7 + // NOTE: All these values are set in an enum on the Linux implementation. + // Some depend on locale.h contants (bits/locale.h to be precise). - DAY_1 :: _langinfo_values.DAY_1 - DAY_2 :: _langinfo_values.DAY_2 - DAY_3 :: _langinfo_values.DAY_3 - DAY_4 :: _langinfo_values.DAY_4 - DAY_5 :: _langinfo_values.DAY_5 - DAY_6 :: _langinfo_values.DAY_6 - DAY_7 :: _langinfo_values.DAY_7 + // NOTE: ABDAY_1 is set to LC_TIME << 16 (LC_TIME is 2) on the enum group of + // the Linux implementation. + ABDAY_1 :: 0x20_000 + ABDAY_2 :: 0x20_001 + ABDAY_3 :: 0x20_002 + ABDAY_4 :: 0x20_003 + ABDAY_5 :: 0x20_004 + ABDAY_6 :: 0x20_005 + ABDAY_7 :: 0x20_006 - ABMON_1 :: _langinfo_values.ABMON_1 - ABMON_2 :: _langinfo_values.ABMON_2 - ABMON_3 :: _langinfo_values.ABMON_3 - ABMON_4 :: _langinfo_values.ABMON_4 - ABMON_5 :: _langinfo_values.ABMON_5 - ABMON_6 :: _langinfo_values.ABMON_6 - ABMON_7 :: _langinfo_values.ABMON_7 - ABMON_8 :: _langinfo_values.ABMON_8 - ABMON_9 :: _langinfo_values.ABMON_9 - ABMON_10 :: _langinfo_values.ABMON_10 - ABMON_11 :: _langinfo_values.ABMON_11 - ABMON_12 :: _langinfo_values.ABMON_12 + DAY_1 :: 0x20_007 + DAY_2 :: 0x20_008 + DAY_3 :: 0x20_009 + DAY_4 :: 0x20_010 + DAY_5 :: 0x20_011 + DAY_6 :: 0x20_012 + DAY_7 :: 0x20_013 - MON_1 :: _langinfo_values.MON_1 - MON_2 :: _langinfo_values.MON_2 - MON_3 :: _langinfo_values.MON_3 - MON_4 :: _langinfo_values.MON_4 - MON_5 :: _langinfo_values.MON_5 - MON_6 :: _langinfo_values.MON_6 - MON_7 :: _langinfo_values.MON_7 - MON_8 :: _langinfo_values.MON_8 - MON_9 :: _langinfo_values.MON_9 - MON_10 :: _langinfo_values.MON_10 - MON_11 :: _langinfo_values.MON_11 - MON_12 :: _langinfo_values.MON_12 + ABMON_1 :: 0x20_014 + ABMON_2 :: 0x20_015 + ABMON_3 :: 0x20_016 + ABMON_4 :: 0x20_017 + ABMON_5 :: 0x20_018 + ABMON_6 :: 0x20_019 + ABMON_7 :: 0x20_020 + ABMON_8 :: 0x20_021 + ABMON_9 :: 0x20_022 + ABMON_10 :: 0x20_023 + ABMON_11 :: 0x20_024 + ABMON_12 :: 0x20_025 - AM_STR :: _langinfo_values.AM_STR - PM_STR :: _langinfo_values.PM_STR + MON_1 :: 0x20_026 + MON_2 :: 0x20_027 + MON_3 :: 0x20_028 + MON_4 :: 0x20_029 + MON_5 :: 0x20_030 + MON_6 :: 0x20_031 + MON_7 :: 0x20_032 + MON_8 :: 0x20_033 + MON_9 :: 0x20_034 + MON_10 :: 0x20_035 + MON_11 :: 0x20_036 + MON_12 :: 0x20_037 - D_T_FMT :: _langinfo_values.D_T_FMT - D_FMT :: _langinfo_values.D_FMT - T_FMT :: _langinfo_values.T_FMT - T_FMT_AMPM :: _langinfo_values.T_FMT_AMPM + AM_STR :: 0x20_038 + PM_STR :: 0x20_039 - ERA :: _langinfo_values.ERA - ERA_D_FMT :: _langinfo_values.ERA_D_FMT - ALT_DIGITS :: _langinfo_values.ALT_DIGITS - ERA_D_T_FMT :: _langinfo_values.ERA_D_T_FMT - ERA_T_FMT :: _langinfo_values.ERA_T_FMT + D_T_FMT :: 0x20_040 + D_FMT :: 0x20_041 + T_FMT :: 0x20_042 + T_FMT_AMPM :: 0x20_043 - CODESET :: _langinfo_values.CODESET + ERA :: 0x20_044 + ERA_D_FMT :: 0x20_045 + ALT_DIGITS :: 0x20_046 + ERA_D_T_FMT :: 0x20_047 + ERA_T_FMT :: 0x20_048 - CRNCYSTR :: _langinfo_values.CRNCYSTR + // NOTE: CODESET is the 16th member of the enum group starting with value + // LC_CTYPE << 16, LC_CTYPE is 0. + CODESET :: 0x15 - RADIXCHAR :: _langinfo_values.RADIXCHAR - THOUSEP :: _langinfo_values.THOUSEP + // NOTE: CRNCYSTR is the 16th member of the enum group starting with value + // LC_MONETARY << 16, LC_MONETARY is 4. + CRNCYSTR :: 0x40_000 - YESEXP :: _langinfo_values.YESEXP - NOEXPR :: _langinfo_values.NOEXPR + // NOTE: RADIXCHAR is the 1st member of the enum group starting with value + // LC_NUMERIC << 16, LC_NUMERIC is 1. + RADIXCHAR :: 0x10_000 + THOUSEP :: 0x10_001 + + // NOTE: YESEXPR is the 1st member of the enum group starting with value + // LC_MESSAGES << 16, LC_MESSAGES is 5. + YESEXPR :: 0x50_000 + NOEXPR :: 0x50_001 } else { #panic("posix is unimplemented for the current target") From a248d49f349479e3a74b7c2fe8f9a173b512efe1 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 2 Sep 2024 14:04:05 -0600 Subject: [PATCH 015/320] Add Linux support for POSIX limits. --- core/sys/posix/limits.odin | 95 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/core/sys/posix/limits.odin b/core/sys/posix/limits.odin index 7bb561215..81ede3368 100644 --- a/core/sys/posix/limits.odin +++ b/core/sys/posix/limits.odin @@ -454,6 +454,101 @@ when ODIN_OS == .Darwin { NL_TEXTMAX :: 255 NZERO :: 20 +} else when ODIN_OS == .Linux { + + // A definition of one of the symbolic constants in the following list shall be omitted from + // on specific implementations where the corresponding value is equal to or greater + // than the stated minimum, but is unspecified. + // + // This indetermination might depend on the amount of available memory space on a specific + // instance of a specific implementation. The actual value supported by a specific instance shall + // be provided by the sysconf() function. + + // AIO_LISTIO_MAX :: sysconf(._AIO_LISTIO_MAX) + // AIO_MAX :: sysconf(._AIO_MAX) + AIO_PRIO_DELTA_MAX :: 20 + ARG_MAX :: 131_072 + // ATEXIT_MAX :: sysconf(._ATEXIT_MAX) + // CHILD_MAX :: sysconf(._POSIX_ARG_MAX) + DELAYTIMER_MAX :: 2_147_483_647 + HOST_NAME_MAX :: 64 + // IOV_MAX :: sysconf(._XOPEN_IOV_MAX) + LOGIN_NAME_MAX :: 256 + // MQ_OPEN_MAX :: sysconf(._MQ_OPEN_MAX) + // MQ_PRIO_MAX :: sysconf(._MQ_PRIO_MAX) + // PAGESIZE :: PAGE_SIZE + // PAGE_SIZE :: sysconf(._PAGE_SIZE) + PTHREAD_DESTRUCTOR_ITERATIONS :: 4 + PTHREAD_KEYS_MAX :: 1024 + PTHREAD_STACK_MIN :: 16_384 + RTSIG_MAX :: 32 + // SEM_NSEMS_MAX :: sysconf(._SEM_NSEMS_MAX) + SEM_VALUE_MAX :: 2_147_483_647 + // SIGQUEUE_MAX :: sysconf(._SIGQUEUE_MAX) + // SS_REPL_MAX :: sysconf(._SS_REPL_MAX) + // STREAM_MAX :: sysconf(._STREAM_MAX) + // SYMLOOP_MAX :: sysconf(._SYSLOOP_MAX) + // TIMER_MAX :: sysconf(._TIMER_MAX) + // TRACE_EVENT_NAME_MAX :: sysconf(._TRACE_EVENT_NAME_MAX) + // TRACE_NAME_MAX :: sysconf(._TRACE_NAME_MAX) + // TRACE_SYS_MAX :: sysconf(._TRACE_SYS_MAX) + // TRACE_USER_EVENT_MAX :: sysconf(._TRACE_USER_EVENT_MAX) + TTY_NAME_MAX :: 32 + // TZNAME_MAX :: sysconf(._TZNAME_MAX) + + // The values in the following list may be constants within an implementation or may vary from + // one pathname to another. + // For example, file systems or directories may have different characteristics. + // + // A definition of one of the symbolic constants in the following list shall be omitted from the + // header on specific implementations where the corresponding value is equal to or + // greater than the stated minimum, but where the value can vary depending on the file to which + // it is applied. + // The actual value supported for a specific pathname shall be provided by the pathconf() function. + + // FILESIZEBITS :: pathconf(".", ._FILESIZEBITS) + LINK_MAX :: 127 + MAX_CANON :: 255 + MAX_INPUT :: 255 + NAME_MAX :: 255 + PATH_MAX :: 4096 + PIPE_BUF :: 4096 + // POSIX_ALLOC_SIZE_MIN :: sysconf(._POSIX_ALLOC_SIZE_MIN) + // POSIX_REC_INCR_XFER_SIZE :: sysconf(._POSIX_REC_INCR_XFER_SIZE) + // POSIX_REC_MAX_XFER_SIZE :: sysconf(._POSIX_REC_MAX_XFER_SIZE) + // POSIX_REC_MIN_XFER_SIZE :: sysconf(._POSIX_REC_MIN_XFER_SIZE) + // POSIX_REC_XFER_ALIGN :: sysconf(._POSIX_REC_XFER_ALIGN) + SYMLINK_MAX :: PATH_MAX + + + // The magnitude limitations in the following list shall be fixed by specific implementations. + // An application should assume that the value of the symbolic constant defined by + // in a specific implementation is the minimum that pertains whenever the application is run + // under that implementation. + // A specific instance of a specific implementation may increase the value relative to that + // supplied by for that implementation. + // The actual value supported by a specific instance shall be provided by the sysconf() function. + + BC_BASE_MAX :: 99 + BC_DIM_MAX :: 2048 + BC_SCALE_MAX :: 99 + BC_STRING_MAX :: 1000 + CHARCLASS_NAME_MAX :: 14 + COLL_WEIGHTS_MAX :: 2 + EXPR_NEST_MAX :: 32 + LINE_MAX :: 2048 + NGROUPS_MAX :: 65_536 + RE_DUP_MAX :: 255 + + // Other limits. + + NL_ARGMAX :: 9 + NL_LANGMAX :: 14 + NL_MSGMAX :: 32_767 + NL_SETMAX :: 255 + NL_TEXTMAX :: 255 + NZERO :: 20 + } else { #panic("posix is unimplemented for the current target") } From 35f961d80f11fca6c0d1f8c6cb7d8d149f3e71f2 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 2 Sep 2024 14:25:32 -0600 Subject: [PATCH 016/320] Add POSIX Linux support for net_if and netdb. --- core/sys/posix/net_if.odin | 2 +- core/sys/posix/netdb.odin | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/core/sys/posix/net_if.odin b/core/sys/posix/net_if.odin index aaeb5088a..75c1a863e 100644 --- a/core/sys/posix/net_if.odin +++ b/core/sys/posix/net_if.odin @@ -44,7 +44,7 @@ foreign lib { if_freenameindex :: proc(ptr: ^if_nameindex_t) --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { // NOTE: `_t` suffix added due to name conflict. diff --git a/core/sys/posix/netdb.odin b/core/sys/posix/netdb.odin index 7570f9a22..b8259b60c 100644 --- a/core/sys/posix/netdb.odin +++ b/core/sys/posix/netdb.odin @@ -318,7 +318,7 @@ Info_Errno :: enum c.int { OVERFLOW = EAI_OVERFLOW, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .OpenBSD { hostent :: struct { h_name: cstring, /* [PSX] official name of host */ @@ -412,9 +412,28 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS NI_NUMERICSERV :: 2 NI_NUMERICSCOPE :: 32 NI_DGRAM :: 16 + + } else when ODIN_OS == .Linux { + + AI_PASSIVE :: 0x001 + AI_CANONNAME :: 0x002 + AI_NUMERICHOST :: 0x004 + AI_NUMERICSERV :: 0x400 + AI_V4MAPPED :: 0x008 + AI_ALL :: 0x010 + AI_ADDRCONFIG :: 0x020 + + NI_NOFQDN :: 4 + NI_NUMERICHOST :: 1 + NI_NAMEREQD :: 8 + NI_NUMERICSERV :: 2 + NI_NUMERICSCOPE :: 0 // NOTE: not implemented + NI_DGRAM :: 16 + } when ODIN_OS == .OpenBSD { + EAI_AGAIN :: -3 EAI_BADFLAGS :: -1 EAI_FAIL :: -4 @@ -425,7 +444,22 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS EAI_SOCKTYPE :: -7 EAI_SYSTEM :: -11 EAI_OVERFLOW :: -14 + + } else when ODIN_OS == .Linux { + + EAI_AGAIN :: -3 + EAI_BADFLAGS :: -1 + EAI_FAIL :: -4 + EAI_FAMILY :: -6 + EAI_MEMORY :: -10 + EAI_NONAME :: -2 + EAI_SERVICE :: -8 + EAI_SOCKTYPE :: -7 + EAI_SYSTEM :: -11 + EAI_OVERFLOW :: -12 + } else { + EAI_AGAIN :: 2 EAI_BADFLAGS :: 3 EAI_FAIL :: 4 @@ -438,6 +472,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS EAI_OVERFLOW :: 14 } -}else { +} else { #panic("posix is unimplemented for the current target") } From f072136c04e4e8f43232fa46679059018f2f77c3 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 2 Sep 2024 21:59:03 -0600 Subject: [PATCH 017/320] Implement POSIX linux support for poll and netinet_tcp. Incomplete support for netinet/in. --- core/sys/posix/netinet_in.odin | 168 ++++++++++++++++++++++++++++++++ core/sys/posix/netinet_tcp.odin | 2 +- core/sys/posix/poll.odin | 28 +++++- 3 files changed, 196 insertions(+), 2 deletions(-) diff --git a/core/sys/posix/netinet_in.odin b/core/sys/posix/netinet_in.odin index 3926c5288..70427e8af 100644 --- a/core/sys/posix/netinet_in.odin +++ b/core/sys/posix/netinet_in.odin @@ -194,6 +194,174 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS ) } +} else when ODIN_OS == .Linux { + + in_addr :: struct { + s_addr: in_addr_t, /* [PSX] big endian address */ + } + + in6_addr :: struct { + using _: struct #raw_union { + s6_addr: [16]c.uint8_t, /* [PSX] big endian address */ + __u6_addr16: [8]c.uint16_t, + __u6_addr32: [4]c.uint32_t, + }, + } + + sockaddr_in :: struct { + sin_family: sa_family_t, /* [PSX] AF_INET (but a smaller size) */ + sin_port: in_port_t, /* [PSX] port number */ + sin_addr: in_addr, /* [PSX] IP address */ + sin_zero: [size_of(sockaddr) - + u16 - + size_of(in_port_t) - + size_of(in_addr)]c.char, + } + + sockaddr_in6 :: struct { + sin6_family: sa_family_t, /* [PSX] AF_INET6 (but a smaller size) */ + sin6_port: in_port_t, /* [PSX] port number */ + sin6_flowinfo: u32be, /* [PSX] IPv6 traffic class and flow information */ + sin6_addr: in6_addr, /* [PSX] IPv6 address */ + sin6_scope_id: c.uint32_t, /* [PSX] set of interfaces for a scope */ + } + + ipv6_mreq :: struct { + ipv6mr_multiaddr: in6_addr, /* [PSX] IPv6 multicast address */ + ipv6mr_interface: c.int, /* [PSX] interface index */ + } + + IPPROTO_IP :: 0 + IPPROTO_ICMP :: 1 + IPPROTO_IPV6 :: 41 + IPPROTO_RAW :: 255 + IPPROTO_TCP :: 6 + IPPROTO_UDP :: 17 + + INADDR_ANY :: 0x00000000 + INADDR_BROADCAST :: 0xFFFFFFFF + + IPV6_MULTICAST_IF :: 17 + IPV6_UNICAST_HOPS :: 16 + IPV6_MULTICAST_HOPS :: 18 + IPV6_MULTICAST_LOOP :: 19 + IPV6_JOIN_GROUP :: 20 + IPV6_LEAVE_GROUP :: 21 + IPV6_V6ONLY :: 26 + + // TODO: (Isaac Andrade, 2024-09-02) Copied from the BSDs block above. Needs to be implemented for Linux. + // Get mentoring from a more senior C and Odin developer or leave this to one of them. + + //IN6_IS_ADDR_UNSPECIFIED :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return a.s6_addr == 0 + //} + // + //IN6_IS_ADDR_LOOPBACK :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // a := a + // return ( + // (^c.uint32_t)(&a.s6_addr[0])^ == 0 && + // (^c.uint32_t)(&a.s6_addr[4])^ == 0 && + // (^c.uint32_t)(&a.s6_addr[8])^ == 0 && + // (^u32be)(&a.s6_addr[12])^ == 1 \ + // ) + //} + // + //IN6_IS_ADDR_MULTICAST :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return a.s6_addr[0] == 0xff + //} + // + //IN6_IS_ADDR_LINKLOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return a.s6_addr[0] == 0xfe && a.s6_addr[1] & 0xc0 == 0x80 + //} + // + //IN6_IS_ADDR_SITELOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return a.s6_addr[0] == 0xfe && a.s6_addr[1] & 0xc0 == 0xc0 + //} + // + //IN6_IS_ADDR_V4MAPPED :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // a := a + // return ( + // (^c.uint32_t)(&a.s6_addr[0])^ == 0 && + // (^c.uint32_t)(&a.s6_addr[4])^ == 0 && + // (^u32be)(&a.s6_addr[8])^ == 0x0000ffff \ + // ) + //} + // + //IN6_IS_ADDR_V4COMPAT :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // a := a + // return ( + // (^c.uint32_t)(&a.s6_addr[0])^ == 0 && + // (^c.uint32_t)(&a.s6_addr[4])^ == 0 && + // (^c.uint32_t)(&a.s6_addr[8])^ == 0 && + // (^c.uint32_t)(&a.s6_addr[12])^ != 0 && + // (^u32be)(&a.s6_addr[12])^ != 1 \ + // ) + //} + // + //@(private) + //__IPV6_ADDR_SCOPE_NODELOCAL :: 0x01 + //@(private) + //__IPV6_ADDR_SCOPE_LINKLOCAL :: 0x02 + //@(private) + //__IPV6_ADDR_SCOPE_SITELOCAL :: 0x05 + //@(private) + //__IPV6_ADDR_SCOPE_ORGLOCAL :: 0x08 + //@(private) + //__IPV6_ADDR_SCOPE_GLOBAL :: 0x0e + // + //@(private) + //IPV6_ADDR_MC_FLAGS :: #force_inline proc "contextless" (a: in6_addr) -> c.uint8_t { + // return a.s6_addr[1] & 0xf0 + //} + // + //@(private) + //IPV6_ADDR_MC_FLAGS_TRANSIENT :: 0x10 + //@(private) + //IPV6_ADDR_MC_FLAGS_PREFIX :: 0x20 + //@(private) + //IPV6_ADDR_MC_FLAGS_UNICAST_BASED :: IPV6_ADDR_MC_FLAGS_TRANSIENT | IPV6_ADDR_MC_FLAGS_PREFIX + // + //@(private) + //__IPV6_ADDR_MC_SCOPE :: #force_inline proc "contextless" (a: in6_addr) -> c.uint8_t { + // return a.s6_addr[1] & 0x0f + //} + // + //IN6_IS_ADDR_MC_NODELOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return ( + // IN6_IS_ADDR_MULTICAST(a) && + // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL) \ + // ) + //} + // + //IN6_IS_ADDR_MC_LINKLOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return ( + // IN6_IS_ADDR_MULTICAST(a) && + // (IPV6_ADDR_MC_FLAGS(a) != IPV6_ADDR_MC_FLAGS_UNICAST_BASED) && + // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL) \ + // ) + //} + // + //IN6_IS_ADDR_MC_SITELOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return ( + // IN6_IS_ADDR_MULTICAST(a) && + // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL) \ + // ) + //} + // + //IN6_IS_ADDR_MC_ORGLOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return ( + // IN6_IS_ADDR_MULTICAST(a) && + // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL) \ + // ) + //} + // + //IN6_IS_ADDR_MC_GLOBAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { + // return ( + // IN6_IS_ADDR_MULTICAST(a) && + // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL) \ + // ) + //} + } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/netinet_tcp.odin b/core/sys/posix/netinet_tcp.odin index ecd084b38..284351732 100644 --- a/core/sys/posix/netinet_tcp.odin +++ b/core/sys/posix/netinet_tcp.odin @@ -2,7 +2,7 @@ package posix // netinet/tcp.h - definitions for the Internet Transmission Control Protocol (TCP) -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { TCP_NODELAY :: 0x01 diff --git a/core/sys/posix/poll.odin b/core/sys/posix/poll.odin index 3e825e009..7f23de267 100644 --- a/core/sys/posix/poll.odin +++ b/core/sys/posix/poll.odin @@ -21,11 +21,17 @@ foreign lib { [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html ]] */ - poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> c.int --- + poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> Poll_Error --- } nfds_t :: c.uint +Poll_Error :: enum c.int { + EAGAIN = Errno.EAGAIN, + EINTR = Errno.EINTR, + EINVAL = Errno.EINVAL, +} + Poll_Event_Bits :: enum c.short { // Data other than high-priority data may be read without blocking. IN = log2(POLLIN), @@ -72,6 +78,26 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS POLLHUP :: 0x0010 POLLNVAL :: 0x0020 +} else when ODIN_OS == .Linux { + + pollfd :: struct { + fd: FD, /* [PSX] the following descriptor being polled */ + events: Poll_Event, /* [PSX] the input event flags */ + revents: Poll_Event, /* [PSX] the output event flags */ + } + + POLLIN :: 0x0001 + POLLRDNORM :: 0x0040 + POLLRDBAND :: 0x0080 + POLLPRI :: 0x0002 + POLLOUT :: 0x0004 + POLLWRNORM :: 0x0100 + POLLWRBAND :: 0x0200 + + POLLERR :: 0x0008 + POLLHUP :: 0x0010 + POLLNVAL :: 0x0020 + } else { #panic("posix is unimplemented for the current target") } From d93f55c5d475e84282e542750e657977fc2daae6 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 2 Sep 2024 22:32:52 -0600 Subject: [PATCH 018/320] Reuse POSIX netinet_in constants for linux. --- core/sys/posix/netinet_in.odin | 251 ++++++++------------------------- 1 file changed, 57 insertions(+), 194 deletions(-) diff --git a/core/sys/posix/netinet_in.odin b/core/sys/posix/netinet_in.odin index 70427e8af..66027362f 100644 --- a/core/sys/posix/netinet_in.odin +++ b/core/sys/posix/netinet_in.odin @@ -44,26 +44,65 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS }, } - sockaddr_in :: struct { - sin_len: c.uint8_t, - sin_family: sa_family_t, /* [PSX] AF_INET (but a smaller size) */ - sin_port: in_port_t, /* [PSX] port number */ - sin_addr: in_addr, /* [PSX] IP address */ - sin_zero: [8]c.char, - } + when ODIN_OS == .Linux { + sockaddr_in :: struct { + sin_family: sa_family_t, /* [PSX] AF_INET (but a smaller size) */ + sin_port: in_port_t, /* [PSX] port number */ + sin_addr: in_addr, /* [PSX] IP address */ + sin_zero: [size_of(sockaddr) - + u16 - + size_of(in_port_t) - + size_of(in_addr)]c.char, + } - sockaddr_in6 :: struct { - sin6_len: c.uint8_t, - sin6_family: sa_family_t, /* [PSX] AF_INET6 (but a smaller size) */ - sin6_port: in_port_t, /* [PSX] port number */ - sin6_flowinfo: c.uint32_t, /* [PSX] IPv6 traffic class and flow information */ - sin6_addr: in6_addr, /* [PSX] IPv6 address */ - sin6_scope_id: c.uint32_t, /* [PSX] set of interfaces for a scope */ - } + sockaddr_in6 :: struct { + sin6_family: sa_family_t, /* [PSX] AF_INET6 (but a smaller size) */ + sin6_port: in_port_t, /* [PSX] port number */ + sin6_flowinfo: u32be, /* [PSX] IPv6 traffic class and flow information */ + sin6_addr: in6_addr, /* [PSX] IPv6 address */ + sin6_scope_id: c.uint32_t, /* [PSX] set of interfaces for a scope */ + } + + IPV6_MULTICAST_IF :: 17 + IPV6_UNICAST_HOPS :: 16 + IPV6_MULTICAST_HOPS :: 18 + IPV6_MULTICAST_LOOP :: 19 + IPV6_JOIN_GROUP :: 20 + IPV6_LEAVE_GROUP :: 21 + IPV6_V6ONLY :: 26 + + } else { + + sockaddr_in :: struct { + sin_len: c.uint8_t, + sin_family: sa_family_t, /* [PSX] AF_INET (but a smaller size) */ + sin_port: in_port_t, /* [PSX] port number */ + sin_addr: in_addr, /* [PSX] IP address */ + sin_zero: [8]c.char, + } + + sockaddr_in6 :: struct { + sin6_len: c.uint8_t, + sin6_family: sa_family_t, /* [PSX] AF_INET6 (but a smaller size) */ + sin6_port: in_port_t, /* [PSX] port number */ + sin6_flowinfo: c.uint32_t, /* [PSX] IPv6 traffic class and flow information */ + sin6_addr: in6_addr, /* [PSX] IPv6 address */ + sin6_scope_id: c.uint32_t, /* [PSX] set of interfaces for a scope */ + } + + ipv6_mreq :: struct { + ipv6mr_multiaddr: in6_addr, /* [PSX] IPv6 multicast address */ + ipv6mr_interface: c.uint, /* [PSX] interface index */ + } + + IPV6_JOIN_GROUP :: 12 + IPV6_LEAVE_GROUP :: 13 + IPV6_MULTICAST_HOPS :: 10 + IPV6_MULTICAST_IF :: 9 + IPV6_MULTICAST_LOOP :: 11 + IPV6_UNICAST_HOPS :: 4 + IPV6_V6ONLY :: 27 - ipv6_mreq :: struct { - ipv6mr_multiaddr: in6_addr, /* [PSX] IPv6 multicast address */ - ipv6mr_interface: c.uint, /* [PSX] interface index */ } IPPROTO_IP :: 0 @@ -76,14 +115,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS INADDR_ANY :: 0x00000000 INADDR_BROADCAST :: 0xFFFFFFFF - IPV6_JOIN_GROUP :: 12 - IPV6_LEAVE_GROUP :: 13 - IPV6_MULTICAST_HOPS :: 10 - IPV6_MULTICAST_IF :: 9 - IPV6_MULTICAST_LOOP :: 11 - IPV6_UNICAST_HOPS :: 4 - IPV6_V6ONLY :: 27 - IN6_IS_ADDR_UNSPECIFIED :: #force_inline proc "contextless" (a: in6_addr) -> b32 { return a.s6_addr == 0 } @@ -194,174 +225,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS ) } -} else when ODIN_OS == .Linux { - - in_addr :: struct { - s_addr: in_addr_t, /* [PSX] big endian address */ - } - - in6_addr :: struct { - using _: struct #raw_union { - s6_addr: [16]c.uint8_t, /* [PSX] big endian address */ - __u6_addr16: [8]c.uint16_t, - __u6_addr32: [4]c.uint32_t, - }, - } - - sockaddr_in :: struct { - sin_family: sa_family_t, /* [PSX] AF_INET (but a smaller size) */ - sin_port: in_port_t, /* [PSX] port number */ - sin_addr: in_addr, /* [PSX] IP address */ - sin_zero: [size_of(sockaddr) - - u16 - - size_of(in_port_t) - - size_of(in_addr)]c.char, - } - - sockaddr_in6 :: struct { - sin6_family: sa_family_t, /* [PSX] AF_INET6 (but a smaller size) */ - sin6_port: in_port_t, /* [PSX] port number */ - sin6_flowinfo: u32be, /* [PSX] IPv6 traffic class and flow information */ - sin6_addr: in6_addr, /* [PSX] IPv6 address */ - sin6_scope_id: c.uint32_t, /* [PSX] set of interfaces for a scope */ - } - - ipv6_mreq :: struct { - ipv6mr_multiaddr: in6_addr, /* [PSX] IPv6 multicast address */ - ipv6mr_interface: c.int, /* [PSX] interface index */ - } - - IPPROTO_IP :: 0 - IPPROTO_ICMP :: 1 - IPPROTO_IPV6 :: 41 - IPPROTO_RAW :: 255 - IPPROTO_TCP :: 6 - IPPROTO_UDP :: 17 - - INADDR_ANY :: 0x00000000 - INADDR_BROADCAST :: 0xFFFFFFFF - - IPV6_MULTICAST_IF :: 17 - IPV6_UNICAST_HOPS :: 16 - IPV6_MULTICAST_HOPS :: 18 - IPV6_MULTICAST_LOOP :: 19 - IPV6_JOIN_GROUP :: 20 - IPV6_LEAVE_GROUP :: 21 - IPV6_V6ONLY :: 26 - - // TODO: (Isaac Andrade, 2024-09-02) Copied from the BSDs block above. Needs to be implemented for Linux. - // Get mentoring from a more senior C and Odin developer or leave this to one of them. - - //IN6_IS_ADDR_UNSPECIFIED :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return a.s6_addr == 0 - //} - // - //IN6_IS_ADDR_LOOPBACK :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // a := a - // return ( - // (^c.uint32_t)(&a.s6_addr[0])^ == 0 && - // (^c.uint32_t)(&a.s6_addr[4])^ == 0 && - // (^c.uint32_t)(&a.s6_addr[8])^ == 0 && - // (^u32be)(&a.s6_addr[12])^ == 1 \ - // ) - //} - // - //IN6_IS_ADDR_MULTICAST :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return a.s6_addr[0] == 0xff - //} - // - //IN6_IS_ADDR_LINKLOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return a.s6_addr[0] == 0xfe && a.s6_addr[1] & 0xc0 == 0x80 - //} - // - //IN6_IS_ADDR_SITELOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return a.s6_addr[0] == 0xfe && a.s6_addr[1] & 0xc0 == 0xc0 - //} - // - //IN6_IS_ADDR_V4MAPPED :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // a := a - // return ( - // (^c.uint32_t)(&a.s6_addr[0])^ == 0 && - // (^c.uint32_t)(&a.s6_addr[4])^ == 0 && - // (^u32be)(&a.s6_addr[8])^ == 0x0000ffff \ - // ) - //} - // - //IN6_IS_ADDR_V4COMPAT :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // a := a - // return ( - // (^c.uint32_t)(&a.s6_addr[0])^ == 0 && - // (^c.uint32_t)(&a.s6_addr[4])^ == 0 && - // (^c.uint32_t)(&a.s6_addr[8])^ == 0 && - // (^c.uint32_t)(&a.s6_addr[12])^ != 0 && - // (^u32be)(&a.s6_addr[12])^ != 1 \ - // ) - //} - // - //@(private) - //__IPV6_ADDR_SCOPE_NODELOCAL :: 0x01 - //@(private) - //__IPV6_ADDR_SCOPE_LINKLOCAL :: 0x02 - //@(private) - //__IPV6_ADDR_SCOPE_SITELOCAL :: 0x05 - //@(private) - //__IPV6_ADDR_SCOPE_ORGLOCAL :: 0x08 - //@(private) - //__IPV6_ADDR_SCOPE_GLOBAL :: 0x0e - // - //@(private) - //IPV6_ADDR_MC_FLAGS :: #force_inline proc "contextless" (a: in6_addr) -> c.uint8_t { - // return a.s6_addr[1] & 0xf0 - //} - // - //@(private) - //IPV6_ADDR_MC_FLAGS_TRANSIENT :: 0x10 - //@(private) - //IPV6_ADDR_MC_FLAGS_PREFIX :: 0x20 - //@(private) - //IPV6_ADDR_MC_FLAGS_UNICAST_BASED :: IPV6_ADDR_MC_FLAGS_TRANSIENT | IPV6_ADDR_MC_FLAGS_PREFIX - // - //@(private) - //__IPV6_ADDR_MC_SCOPE :: #force_inline proc "contextless" (a: in6_addr) -> c.uint8_t { - // return a.s6_addr[1] & 0x0f - //} - // - //IN6_IS_ADDR_MC_NODELOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return ( - // IN6_IS_ADDR_MULTICAST(a) && - // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL) \ - // ) - //} - // - //IN6_IS_ADDR_MC_LINKLOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return ( - // IN6_IS_ADDR_MULTICAST(a) && - // (IPV6_ADDR_MC_FLAGS(a) != IPV6_ADDR_MC_FLAGS_UNICAST_BASED) && - // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL) \ - // ) - //} - // - //IN6_IS_ADDR_MC_SITELOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return ( - // IN6_IS_ADDR_MULTICAST(a) && - // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL) \ - // ) - //} - // - //IN6_IS_ADDR_MC_ORGLOCAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return ( - // IN6_IS_ADDR_MULTICAST(a) && - // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL) \ - // ) - //} - // - //IN6_IS_ADDR_MC_GLOBAL :: #force_inline proc "contextless" (a: in6_addr) -> b32 { - // return ( - // IN6_IS_ADDR_MULTICAST(a) && - // (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL) \ - // ) - //} - } else { #panic("posix is unimplemented for the current target") } From 9e4b45f0f00aa4238249ffd3914dd148e295958e Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 2 Sep 2024 22:58:54 -0600 Subject: [PATCH 019/320] Add linux to OS check. --- core/sys/posix/netdb.odin | 2 +- core/sys/posix/netinet_in.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sys/posix/netdb.odin b/core/sys/posix/netdb.odin index b8259b60c..cd965e2a4 100644 --- a/core/sys/posix/netdb.odin +++ b/core/sys/posix/netdb.odin @@ -318,7 +318,7 @@ Info_Errno :: enum c.int { OVERFLOW = EAI_OVERFLOW, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { hostent :: struct { h_name: cstring, /* [PSX] official name of host */ diff --git a/core/sys/posix/netinet_in.odin b/core/sys/posix/netinet_in.odin index 66027362f..d5121606b 100644 --- a/core/sys/posix/netinet_in.odin +++ b/core/sys/posix/netinet_in.odin @@ -30,7 +30,7 @@ Protocol :: enum c.int { UDP = IPPROTO_UDP, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { in_addr :: struct { s_addr: in_addr_t, /* [PSX] big endian address */ From 73eea33b567950211ee39409ae06b4cb32d3cc14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 21:01:48 +0000 Subject: [PATCH 020/320] Bump actions/download-artifact from 1 to 4.1.7 in /.github/workflows Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 1 to 4.1.7. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v1...v4.1.7) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- .github/workflows/nightly.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 0c5526d0f..e29aceef7 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -160,22 +160,22 @@ jobs: run: python -c "import sys; print(sys.version)" - name: Download Windows artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4.1.7 with: name: windows_artifacts - name: Download Ubuntu artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4.1.7 with: name: ubuntu_artifacts - name: Download macOS artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4.1.7 with: name: macos_artifacts - name: Download macOS arm artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4.1.7 with: name: macos_arm_artifacts From 1a7c1d107a26df00bc6c9379178fccb55569b667 Mon Sep 17 00:00:00 2001 From: Laytan Date: Wed, 4 Sep 2024 22:18:55 +0200 Subject: [PATCH 021/320] set -rpath to \$ORIGIN and expect libraries next to executable just like Windows --- src/linker.cpp | 14 ++++++++------ src/parser.cpp | 14 -------------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/linker.cpp b/src/linker.cpp index faca28932..25b9cfdc3 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -548,14 +548,12 @@ gb_internal i32 linker_stage(LinkerData *gen) { // available at runtime wherever the executable is run, so we make require those to be // local to the executable (unless the system collection is used, in which case we search // the system library paths for the library file). - if (string_ends_with(lib, str_lit(".a")) || string_ends_with(lib, str_lit(".o"))) { + if (string_ends_with(lib, str_lit(".a")) || string_ends_with(lib, str_lit(".o")) || string_ends_with(lib, str_lit(".so")) || string_contains_string(lib, str_lit(".so."))) { // static libs and object files, absolute full path relative to the file in which the lib was imported from lib_str = gb_string_append_fmt(lib_str, " -l:\"%.*s\" ", LIT(lib)); - } else if (string_ends_with(lib, str_lit(".so")) || string_contains_string(lib, str_lit(".so."))) { - // dynamic lib, relative path to executable - // NOTE(vassvik): it is the user's responsibility to make sure the shared library files are visible - // at runtime to the executable - lib_str = gb_string_append_fmt(lib_str, " -l:\"%s/%.*s\" ", cwd, LIT(lib)); + + // NOTE(laytan): If .so, I think we can check for the existence of "$OUT_DIRECTORY/$lib" here and print an error telling the user to copy over the file, or we can even do the copy for them? + } else { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); @@ -643,6 +641,10 @@ gb_internal i32 linker_stage(LinkerData *gen) { } } + // Set the rpath to the $ORIGIN (the path of the executable), + // so that dynamic libraries are looked for at that path. + gb_string_appendc(link_settings, "-Wl,-rpath,\\$ORIGIN "); + if (!build_context.no_crt) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lm "); if (build_context.metrics.os == TargetOs_darwin) { diff --git a/src/parser.cpp b/src/parser.cpp index e3143dd33..88147d465 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5932,20 +5932,6 @@ gb_internal bool determine_path_from_string(BlockingMutex *file_mutex, Ast *node do_error(node, "Unknown library collection: '%.*s'", LIT(collection_name)); return false; } - } else { -#if !defined(GB_SYSTEM_WINDOWS) - // @NOTE(vassvik): foreign imports of shared libraries that are not in the system collection on - // linux/mac have to be local to the executable for consistency with shared libraries. - // Unix does not have a concept of "import library" for shared/dynamic libraries, - // so we need to pass the relative path to the linker, and add the current - // working directory of the exe to the library search paths. - // Static libraries can be linked directly with the full pathname - // - if (node->kind == Ast_ForeignImportDecl && (string_ends_with(file_str, str_lit(".so")) || string_contains_string(file_str, str_lit(".so.")))) { - *path = file_str; - return true; - } -#endif } if (is_package_name_reserved(file_str)) { From 0aa971207ba14f791b1cae3652e67e674710cf8e Mon Sep 17 00:00:00 2001 From: Laytan Date: Wed, 4 Sep 2024 22:38:19 +0200 Subject: [PATCH 022/320] add -no-rpath --- src/build_settings.cpp | 1 + src/linker.cpp | 8 +++++--- src/main.cpp | 9 +++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index fe0e478c7..fb10a25f6 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -411,6 +411,7 @@ struct BuildContext { bool no_dynamic_literals; bool no_output_files; bool no_crt; + bool no_rpath; bool no_entry_point; bool no_thread_local; bool use_lld; diff --git a/src/linker.cpp b/src/linker.cpp index 25b9cfdc3..cdda87697 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -641,9 +641,11 @@ gb_internal i32 linker_stage(LinkerData *gen) { } } - // Set the rpath to the $ORIGIN (the path of the executable), - // so that dynamic libraries are looked for at that path. - gb_string_appendc(link_settings, "-Wl,-rpath,\\$ORIGIN "); + if (!build_context.no_rpath) { + // Set the rpath to the $ORIGIN (the path of the executable), + // so that dynamic libraries are looked for at that path. + gb_string_appendc(link_settings, "-Wl,-rpath,\\$ORIGIN "); + } if (!build_context.no_crt) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lm "); diff --git a/src/main.cpp b/src/main.cpp index a03126caf..d13065364 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -325,6 +325,7 @@ enum BuildFlagKind { BuildFlag_NoTypeAssert, BuildFlag_NoDynamicLiterals, BuildFlag_NoCRT, + BuildFlag_NoRPath, BuildFlag_NoEntryPoint, BuildFlag_UseLLD, BuildFlag_UseSeparateModules, @@ -532,6 +533,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_NoThreadLocal, str_lit("no-thread-local"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None, Command__does_build); + add_flag(&build_flags, BuildFlag_NoRPath, str_lit("no-rpath"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None, Command__does_check &~ Command_test); add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_UseSeparateModules, str_lit("use-separate-modules"), BuildFlagParam_None, Command__does_build); @@ -1181,6 +1183,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_NoCRT: build_context.no_crt = true; break; + case BuildFlag_NoRPath: + build_context.no_rpath = true; + break; case BuildFlag_NoEntryPoint: build_context.no_entry_point = true; break; @@ -2310,6 +2315,10 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(2, "Disables automatic linking with the C Run Time."); print_usage_line(0, ""); + print_usage_line(1, "-no-rpath"); + print_usage_line(2, "Disables automatic addition of an rpath linked to the executable directory."); + print_usage_line(0, ""); + print_usage_line(1, "-no-thread-local"); print_usage_line(2, "Ignores @thread_local attribute, effectively treating the program as if it is single-threaded."); print_usage_line(0, ""); From 6778598bc648a4c605fb1b488185fad59668185a Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 4 Sep 2024 23:45:30 +0200 Subject: [PATCH 023/320] support the rpath changes on macos --- .github/workflows/ci.yml | 10 +++++----- src/linker.cpp | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e547959aa..421b5c586 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -257,16 +257,16 @@ jobs: run: sudo apt-get install -y qemu-user qemu-user-static gcc-12-riscv64-linux-gnu libc6-riscv64-cross - name: Odin run - run: ./odin run examples/demo -vet -strict-style -disallow-do -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" + run: ./odin run examples/demo -vet -strict-style -disallow-do -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" -no-rpath - name: Odin run -debug - run: ./odin run examples/demo -debug -vet -strict-style -disallow-do -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" + run: ./odin run examples/demo -debug -vet -strict-style -disallow-do -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" -no-rpath - name: Normal Core library tests - run: ./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" + run: ./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" -no-rpath - name: Optimized Core library tests - run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" + run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" -no-rpath - name: Internals tests - run: ./odin test tests/internal -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" + run: ./odin test tests/internal -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -target:linux_riscv64 -extra-linker-flags:"-fuse-ld=/usr/bin/riscv64-linux-gnu-gcc-12 -static -Wl,-static" -no-rpath diff --git a/src/linker.cpp b/src/linker.cpp index cdda87697..500fead69 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -549,11 +549,7 @@ gb_internal i32 linker_stage(LinkerData *gen) { // local to the executable (unless the system collection is used, in which case we search // the system library paths for the library file). if (string_ends_with(lib, str_lit(".a")) || string_ends_with(lib, str_lit(".o")) || string_ends_with(lib, str_lit(".so")) || string_contains_string(lib, str_lit(".so."))) { - // static libs and object files, absolute full path relative to the file in which the lib was imported from lib_str = gb_string_append_fmt(lib_str, " -l:\"%.*s\" ", LIT(lib)); - - // NOTE(laytan): If .so, I think we can check for the existence of "$OUT_DIRECTORY/$lib" here and print an error telling the user to copy over the file, or we can even do the copy for them? - } else { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); @@ -642,9 +638,13 @@ gb_internal i32 linker_stage(LinkerData *gen) { } if (!build_context.no_rpath) { - // Set the rpath to the $ORIGIN (the path of the executable), + // Set the rpath to the $ORIGIN/@loader_path (the path of the executable), // so that dynamic libraries are looked for at that path. - gb_string_appendc(link_settings, "-Wl,-rpath,\\$ORIGIN "); + if (build_context.metrics.os == TargetOs_darwin) { + link_settings = gb_string_appendc(link_settings, "-Wl,-rpath,@loader_path "); + } else { + link_settings = gb_string_appendc(link_settings, "-Wl,-rpath,\\$ORIGIN "); + } } if (!build_context.no_crt) { From 2b9096517c0f69bce6308ea81ff50c9caa8b2fe8 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 09:20:56 +1100 Subject: [PATCH 024/320] [mem]: Code formatting --- core/mem/alloc.odin | 220 +++++++++++++++++++++---- core/mem/allocators.odin | 175 +++++++++++--------- core/mem/mem.odin | 16 +- core/mem/mutex_allocator.odin | 14 +- core/mem/raw.odin | 38 +++-- core/mem/rollback_stack_allocator.odin | 81 ++++----- core/mem/tracking_allocator.odin | 36 ++-- 7 files changed, 390 insertions(+), 190 deletions(-) diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index e51d971e1..558e810e3 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -63,30 +63,58 @@ DEFAULT_PAGE_SIZE :: 4 * 1024 @(require_results) -alloc :: proc(size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> (rawptr, Allocator_Error) { +alloc :: proc( + size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { data, err := runtime.mem_alloc(size, alignment, allocator, loc) return raw_data(data), err } @(require_results) -alloc_bytes :: proc(size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { +alloc_bytes :: proc( + size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { return runtime.mem_alloc(size, alignment, allocator, loc) } @(require_results) -alloc_bytes_non_zeroed :: proc(size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { +alloc_bytes_non_zeroed :: proc( + size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { return runtime.mem_alloc_non_zeroed(size, alignment, allocator, loc) } -free :: proc(ptr: rawptr, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { +free :: proc( + ptr: rawptr, + allocator := context.allocator, + loc := #caller_location, +) -> Allocator_Error { return runtime.mem_free(ptr, allocator, loc) } -free_with_size :: proc(ptr: rawptr, byte_count: int, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { +free_with_size :: proc( + ptr: rawptr, + byte_count: int, + allocator := context.allocator, + loc := #caller_location, +) -> Allocator_Error { return runtime.mem_free_with_size(ptr, byte_count, allocator, loc) } -free_bytes :: proc(bytes: []byte, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { +free_bytes :: proc( + bytes: []byte, + allocator := context.allocator, + loc := #caller_location, +) -> Allocator_Error { return runtime.mem_free_bytes(bytes, allocator, loc) } @@ -95,13 +123,26 @@ free_all :: proc(allocator := context.allocator, loc := #caller_location) -> All } @(require_results) -resize :: proc(ptr: rawptr, old_size, new_size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> (rawptr, Allocator_Error) { +resize :: proc( + ptr: rawptr, + old_size: int, + new_size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { data, err := runtime.mem_resize(ptr, old_size, new_size, alignment, allocator, loc) return raw_data(data), err } @(require_results) -resize_bytes :: proc(old_data: []byte, new_size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { +resize_bytes :: proc( + old_data: []byte, + new_size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { return runtime.mem_resize(raw_data(old_data), len(old_data), new_size, alignment, allocator, loc) } @@ -115,7 +156,11 @@ query_features :: proc(allocator: Allocator, loc := #caller_location) -> (set: A } @(require_results) -query_info :: proc(pointer: rawptr, allocator: Allocator, loc := #caller_location) -> (props: Allocator_Query_Info) { +query_info :: proc( + pointer: rawptr, + allocator: Allocator, + loc := #caller_location, +) -> (props: Allocator_Query_Info) { props.pointer = pointer if allocator.procedure != nil { allocator.procedure(allocator.data, .Query_Info, 0, 0, &props, 0, loc) @@ -123,25 +168,44 @@ query_info :: proc(pointer: rawptr, allocator: Allocator, loc := #caller_locatio return } - - -delete_string :: proc(str: string, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { +delete_string :: proc( + str: string, + allocator := context.allocator, + loc := #caller_location, +) -> Allocator_Error { return runtime.delete_string(str, allocator, loc) } -delete_cstring :: proc(str: cstring, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { + +delete_cstring :: proc( + str: cstring, + allocator := context.allocator, + loc := #caller_location, +) -> Allocator_Error { return runtime.delete_cstring(str, allocator, loc) } -delete_dynamic_array :: proc(array: $T/[dynamic]$E, loc := #caller_location) -> Allocator_Error { + +delete_dynamic_array :: proc( + array: $T/[dynamic]$E, + loc := #caller_location, +) -> Allocator_Error { return runtime.delete_dynamic_array(array, loc) } -delete_slice :: proc(array: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> Allocator_Error { + +delete_slice :: proc( + array: $T/[]$E, + allocator := context.allocator, + loc := #caller_location, +) -> Allocator_Error { return runtime.delete_slice(array, allocator, loc) } -delete_map :: proc(m: $T/map[$K]$V, loc := #caller_location) -> Allocator_Error { + +delete_map :: proc( + m: $T/map[$K]$V, + loc := #caller_location, +) -> Allocator_Error { return runtime.delete_map(m, loc) } - delete :: proc{ delete_string, delete_cstring, @@ -150,46 +214,102 @@ delete :: proc{ delete_map, } - @(require_results) -new :: proc($T: typeid, allocator := context.allocator, loc := #caller_location) -> (^T, Allocator_Error) { +new :: proc( + $T: typeid, + allocator := context.allocator, + loc := #caller_location, +) -> (^T, Allocator_Error) { return new_aligned(T, align_of(T), allocator, loc) } + @(require_results) -new_aligned :: proc($T: typeid, alignment: int, allocator := context.allocator, loc := #caller_location) -> (t: ^T, err: Allocator_Error) { +new_aligned :: proc( + $T: typeid, + alignment: int, + allocator := context.allocator, + loc := #caller_location, +) -> (t: ^T, err: Allocator_Error) { return runtime.new_aligned(T, alignment, allocator, loc) } + @(require_results) -new_clone :: proc(data: $T, allocator := context.allocator, loc := #caller_location) -> (t: ^T, err: Allocator_Error) { +new_clone :: proc( + data: $T, + allocator := context.allocator, + loc := #caller_location, +) -> (t: ^T, err: Allocator_Error) { return runtime.new_clone(data, allocator, loc) } @(require_results) -make_aligned :: proc($T: typeid/[]$E, #any_int len: int, alignment: int, allocator := context.allocator, loc := #caller_location) -> (slice: T, err: Allocator_Error) { +make_aligned :: proc( + $T: typeid/[]$E, + #any_int len: int, + alignment: int, + allocator := context.allocator, + loc := #caller_location, +) -> (slice: T, err: Allocator_Error) { return runtime.make_aligned(T, len, alignment, allocator, loc) } + @(require_results) -make_slice :: proc($T: typeid/[]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) { +make_slice :: proc( + $T: typeid/[]$E, + #any_int len: int, + allocator := context.allocator, + loc := #caller_location, +) -> (T, Allocator_Error) { return runtime.make_slice(T, len, allocator, loc) } + @(require_results) -make_dynamic_array :: proc($T: typeid/[dynamic]$E, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) { +make_dynamic_array :: proc( + $T: typeid/[dynamic]$E, + allocator := context.allocator, + loc := #caller_location, +) -> (T, Allocator_Error) { return runtime.make_dynamic_array(T, allocator, loc) } + @(require_results) -make_dynamic_array_len :: proc($T: typeid/[dynamic]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) { +make_dynamic_array_len :: proc( + $T: typeid/[dynamic]$E, + #any_int len: int, + allocator := context.allocator, + loc := #caller_location, +) -> (T, Allocator_Error) { return runtime.make_dynamic_array_len_cap(T, len, len, allocator, loc) } + @(require_results) -make_dynamic_array_len_cap :: proc($T: typeid/[dynamic]$E, #any_int len: int, #any_int cap: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) { +make_dynamic_array_len_cap :: proc( + $T: typeid/[dynamic]$E, + #any_int len: int, + #any_int cap: int, + allocator := context.allocator, + loc := #caller_location, +) -> (array: T, err: Allocator_Error) { return runtime.make_dynamic_array_len_cap(T, len, cap, allocator, loc) } + @(require_results) -make_map :: proc($T: typeid/map[$K]$E, #any_int cap: int = 1< (m: T, err: Allocator_Error) { +make_map :: proc( + $T: typeid/map[$K]$E, + #any_int cap: int = 1< (m: T, err: Allocator_Error) { return runtime.make_map(T, cap, allocator, loc) } + @(require_results) -make_multi_pointer :: proc($T: typeid/[^]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (mp: T, err: Allocator_Error) { +make_multi_pointer :: proc( + $T: typeid/[^]$E, + #any_int len: int, + allocator := context.allocator, + loc := #caller_location +) -> (mp: T, err: Allocator_Error) { return runtime.make_multi_pointer(T, len, allocator, loc) } @@ -202,26 +322,58 @@ make :: proc{ make_multi_pointer, } - @(require_results) -default_resize_align :: proc(old_memory: rawptr, old_size, new_size, alignment: int, allocator := context.allocator, loc := #caller_location) -> (res: rawptr, err: Allocator_Error) { +default_resize_align :: proc( + old_memory: rawptr, + old_size: int, + new_size: int, + alignment: int, + allocator := context.allocator, + loc := #caller_location, +) -> (res: rawptr, err: Allocator_Error) { data: []byte - data, err = default_resize_bytes_align(([^]byte)(old_memory)[:old_size], new_size, alignment, allocator, loc) + data, err = default_resize_bytes_align( + ([^]byte) (old_memory)[:old_size], + new_size, + alignment, + allocator, + loc, + ) res = raw_data(data) return } @(require_results) -default_resize_bytes_align_non_zeroed :: proc(old_data: []byte, new_size, alignment: int, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { +default_resize_bytes_align_non_zeroed :: proc( + old_data: []byte, + new_size: int, + alignment: int, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { return _default_resize_bytes_align(old_data, new_size, alignment, false, allocator, loc) } + @(require_results) -default_resize_bytes_align :: proc(old_data: []byte, new_size, alignment: int, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { +default_resize_bytes_align :: proc( + old_data: []byte, + new_size: int, + alignment: int, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { return _default_resize_bytes_align(old_data, new_size, alignment, true, allocator, loc) } @(require_results) -_default_resize_bytes_align :: #force_inline proc(old_data: []byte, new_size, alignment: int, should_zero: bool, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { +_default_resize_bytes_align :: #force_inline proc( + old_data: []byte, + new_size: int, + alignment: int, + should_zero: bool, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { old_memory := raw_data(old_data) old_size := len(old_data) if old_memory == nil { diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index a5b93ad05..7bc1a6d77 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -3,9 +3,14 @@ package mem import "base:intrinsics" import "base:runtime" -nil_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { +nil_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { return nil, nil } @@ -16,8 +21,6 @@ nil_allocator :: proc() -> Allocator { } } -// Custom allocators - Arena :: struct { data: []byte, offset: int, @@ -30,7 +33,6 @@ Arena_Temp_Memory :: struct { prev_offset: int, } - arena_init :: proc(a: ^Arena, data: []byte) { a.data = data a.offset = 0 @@ -54,9 +56,15 @@ arena_allocator :: proc(arena: ^Arena) -> Allocator { } } -arena_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, Allocator_Error) { +arena_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size: int, + alignment: int, + old_memory: rawptr, + old_size: int, + location := #caller_location, +) -> ([]byte, Allocator_Error) { arena := cast(^Arena)allocator_data switch mode { @@ -120,8 +128,6 @@ end_arena_temp_memory :: proc(tmp: Arena_Temp_Memory) { tmp.arena.temp_count -= 1 } - - Scratch_Allocator :: struct { data: []byte, curr_offset: int, @@ -151,9 +157,14 @@ scratch_allocator_destroy :: proc(s: ^Scratch_Allocator) { s^ = {} } -scratch_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { +scratch_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { s := (^Scratch_Allocator)(allocator_data) @@ -299,10 +310,6 @@ scratch_allocator :: proc(allocator: ^Scratch_Allocator) -> Allocator { } } - - - - Stack_Allocation_Header :: struct { prev_offset: int, padding: int, @@ -339,34 +346,44 @@ stack_allocator :: proc(stack: ^Stack) -> Allocator { } } - -stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, Allocator_Error) { +stack_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size: int, + alignment: int, + old_memory: rawptr, + old_size: int, + location := #caller_location, +) -> ([]byte, Allocator_Error) { s := cast(^Stack)allocator_data if s.data == nil { return nil, .Invalid_Argument } - raw_alloc :: proc(s: ^Stack, size, alignment: int, zero_memory: bool) -> ([]byte, Allocator_Error) { + raw_alloc :: proc( + s: ^Stack, + size: int, + alignment: int, + zero_memory: bool, + ) -> ([]byte, Allocator_Error) { curr_addr := uintptr(raw_data(s.data)) + uintptr(s.curr_offset) - padding := calc_padding_with_header(curr_addr, uintptr(alignment), size_of(Stack_Allocation_Header)) + padding := calc_padding_with_header( + curr_addr, + uintptr(alignment), + size_of(Stack_Allocation_Header), + ) if s.curr_offset + padding + size > len(s.data) { return nil, .Out_Of_Memory } s.prev_offset = s.curr_offset s.curr_offset += padding - next_addr := curr_addr + uintptr(padding) header := (^Stack_Allocation_Header)(next_addr - size_of(Stack_Allocation_Header)) header.padding = padding header.prev_offset = s.prev_offset - s.curr_offset += size - s.peak_used = max(s.peak_used, s.curr_offset) - if zero_memory { zero(rawptr(next_addr), size) } @@ -467,12 +484,6 @@ stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, return nil, nil } - - - - - - Small_Stack_Allocation_Header :: struct { padding: u8, } @@ -505,9 +516,14 @@ small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { } } -small_stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, Allocator_Error) { +small_stack_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + location := #caller_location, +) -> ([]byte, Allocator_Error) { s := cast(^Small_Stack)allocator_data if s.data == nil { @@ -612,10 +628,6 @@ small_stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, return nil, nil } - - - - Dynamic_Pool :: struct { block_size: int, out_band_size: int, @@ -632,15 +644,18 @@ Dynamic_Pool :: struct { block_allocator: Allocator, } - DYNAMIC_POOL_BLOCK_SIZE_DEFAULT :: 65536 DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT :: 6554 - - -dynamic_pool_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { +dynamic_pool_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size: int, + alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { pool := (^Dynamic_Pool)(allocator_data) switch mode { @@ -689,19 +704,21 @@ dynamic_pool_allocator :: proc(pool: ^Dynamic_Pool) -> Allocator { } } -dynamic_pool_init :: proc(pool: ^Dynamic_Pool, - block_allocator := context.allocator, - array_allocator := context.allocator, - block_size := DYNAMIC_POOL_BLOCK_SIZE_DEFAULT, - out_band_size := DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT, - alignment := 8) { - pool.block_size = block_size - pool.out_band_size = out_band_size - pool.alignment = alignment +dynamic_pool_init :: proc( + pool: ^Dynamic_Pool, + block_allocator := context.allocator, + array_allocator := context.allocator, + block_size := DYNAMIC_POOL_BLOCK_SIZE_DEFAULT, + out_band_size := DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT, + alignment := 8, +) { + pool.block_size = block_size + pool.out_band_size = out_band_size + pool.alignment = alignment pool.block_allocator = block_allocator pool.out_band_allocations.allocator = array_allocator - pool. unused_blocks.allocator = array_allocator - pool. used_blocks.allocator = array_allocator + pool.unused_blocks.allocator = array_allocator + pool.used_blocks.allocator = array_allocator } dynamic_pool_destroy :: proc(pool: ^Dynamic_Pool) { @@ -709,11 +726,9 @@ dynamic_pool_destroy :: proc(pool: ^Dynamic_Pool) { delete(pool.unused_blocks) delete(pool.used_blocks) delete(pool.out_band_allocations) - zero(pool, size_of(pool^)) } - @(require_results) dynamic_pool_alloc :: proc(pool: ^Dynamic_Pool, bytes: int) -> (rawptr, Allocator_Error) { data, err := dynamic_pool_alloc_bytes(pool, bytes) @@ -736,9 +751,14 @@ dynamic_pool_alloc_bytes :: proc(p: ^Dynamic_Pool, bytes: int) -> ([]byte, Alloc new_block = pop(&p.unused_blocks) } else { data: []byte - data, err = p.block_allocator.procedure(p.block_allocator.data, Allocator_Mode.Alloc, - p.block_size, p.alignment, - nil, 0) + data, err = p.block_allocator.procedure( + p.block_allocator.data, + Allocator_Mode.Alloc, + p.block_size, + p.alignment, + nil, + 0, + ) new_block = raw_data(data) } @@ -808,10 +828,14 @@ dynamic_pool_free_all :: proc(p: ^Dynamic_Pool) { clear(&p.unused_blocks) } - -panic_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int,loc := #caller_location) -> ([]byte, Allocator_Error) { +panic_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { switch mode { case .Alloc: @@ -859,11 +883,6 @@ panic_allocator :: proc() -> Allocator { } } - - - - - Buddy_Block :: struct #align(align_of(uint)) { size: uint, is_free: bool, @@ -929,7 +948,6 @@ buddy_block_coalescence :: proc(head, tail: ^Buddy_Block) { } } - @(require_results) buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Block { assert(size != 0) @@ -998,7 +1016,6 @@ buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Bl return nil } - Buddy_Allocator :: struct { head: ^Buddy_Block, tail: ^Buddy_Block, @@ -1089,9 +1106,13 @@ buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Erro return nil } -buddy_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int,loc := #caller_location) -> ([]byte, Allocator_Error) { +buddy_allocator_proc :: proc( + allocator_data: rawptr, mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { b := (^Buddy_Allocator)(allocator_data) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index d423cc1eb..9e47c9602 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -14,10 +14,12 @@ Exabyte :: runtime.Exabyte set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr { return runtime.memset(data, i32(value), len) } + zero :: proc "contextless" (data: rawptr, len: int) -> rawptr { intrinsics.mem_zero(data, len) return data } + zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { // This routine tries to avoid the compiler optimizing away the call, // so that it is always executed. It is intended to provided @@ -27,20 +29,22 @@ zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { intrinsics.atomic_thread_fence(.Seq_Cst) // Prevent reordering return data } + zero_item :: proc "contextless" (item: $P/^$T) -> P { intrinsics.mem_zero(item, size_of(T)) return item } + zero_slice :: proc "contextless" (data: $T/[]$E) -> T { zero(raw_data(data), size_of(E)*len(data)) return data } - copy :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr { intrinsics.mem_copy(dst, src, len) return dst } + copy_non_overlapping :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr { intrinsics.mem_copy_non_overlapping(dst, src, len) return dst @@ -120,6 +124,7 @@ compare_ptrs :: proc "contextless" (a, b: rawptr, n: int) -> int { } ptr_offset :: intrinsics.ptr_offset + ptr_sub :: intrinsics.ptr_sub @(require_results) @@ -211,6 +216,7 @@ align_forward_uintptr :: proc(ptr, align: uintptr) -> uintptr { align_forward_int :: proc(ptr, align: int) -> int { return int(align_forward_uintptr(uintptr(ptr), uintptr(align))) } + @(require_results) align_forward_uint :: proc(ptr, align: uint) -> uint { return uint(align_forward_uintptr(uintptr(ptr), uintptr(align))) @@ -230,6 +236,7 @@ align_backward_uintptr :: proc(ptr, align: uintptr) -> uintptr { align_backward_int :: proc(ptr, align: int) -> int { return int(align_backward_uintptr(uintptr(ptr), uintptr(align))) } + @(require_results) align_backward_uint :: proc(ptr, align: uint) -> uint { return uint(align_backward_uintptr(uintptr(ptr), uintptr(align))) @@ -247,7 +254,6 @@ reinterpret_copy :: proc "contextless" ($T: typeid, ptr: rawptr) -> (value: T) { return } - Fixed_Byte_Buffer :: distinct [dynamic]byte @(require_results) @@ -264,8 +270,6 @@ make_fixed_byte_buffer :: proc "contextless" (backing: []byte) -> Fixed_Byte_Buf return transmute(Fixed_Byte_Buffer)d } - - @(require_results) align_formula :: proc "contextless" (size, align: int) -> int { result := size + align-1 @@ -276,12 +280,10 @@ align_formula :: proc "contextless" (size, align: int) -> int { calc_padding_with_header :: proc "contextless" (ptr: uintptr, align: uintptr, header_size: int) -> int { p, a := ptr, align modulo := p & (a-1) - padding := uintptr(0) if modulo != 0 { padding = a - modulo } - needed_space := uintptr(header_size) if padding < needed_space { needed_space -= padding @@ -296,8 +298,6 @@ calc_padding_with_header :: proc "contextless" (ptr: uintptr, align: uintptr, he return int(padding) } - - @(require_results, deprecated="prefer 'slice.clone'") clone_slice :: proc(slice: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> (new_slice: T) { new_slice, _ = make(T, len(slice), allocator, loc) diff --git a/core/mem/mutex_allocator.odin b/core/mem/mutex_allocator.odin index 591703eab..1cccc7dac 100644 --- a/core/mem/mutex_allocator.odin +++ b/core/mem/mutex_allocator.odin @@ -13,7 +13,6 @@ mutex_allocator_init :: proc(m: ^Mutex_Allocator, backing_allocator: Allocator) m.mutex = {} } - @(require_results) mutex_allocator :: proc(m: ^Mutex_Allocator) -> Allocator { return Allocator{ @@ -22,11 +21,16 @@ mutex_allocator :: proc(m: ^Mutex_Allocator) -> Allocator { } } -mutex_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, loc := #caller_location) -> (result: []byte, err: Allocator_Error) { +mutex_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size: int, + alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> (result: []byte, err: Allocator_Error) { m := (^Mutex_Allocator)(allocator_data) - sync.mutex_guard(&m.mutex) return m.backing.procedure(m.backing.data, mode, size, alignment, old_memory, old_size, loc) } diff --git a/core/mem/raw.odin b/core/mem/raw.odin index f56206957..7fda3229d 100644 --- a/core/mem/raw.odin +++ b/core/mem/raw.odin @@ -3,22 +3,36 @@ package mem import "base:builtin" import "base:runtime" -Raw_Any :: runtime.Raw_Any -Raw_String :: runtime.Raw_String -Raw_Cstring :: runtime.Raw_Cstring -Raw_Slice :: runtime.Raw_Slice -Raw_Dynamic_Array :: runtime.Raw_Dynamic_Array -Raw_Map :: runtime.Raw_Map -Raw_Soa_Pointer :: runtime.Raw_Soa_Pointer +Raw_Any :: runtime.Raw_Any + +Raw_String :: runtime.Raw_String + +Raw_Cstring :: runtime.Raw_Cstring + +Raw_Slice :: runtime.Raw_Slice + +Raw_Dynamic_Array :: runtime.Raw_Dynamic_Array + +Raw_Map :: runtime.Raw_Map + +Raw_Soa_Pointer :: runtime.Raw_Soa_Pointer + +Raw_Complex32 :: runtime.Raw_Complex32 + +Raw_Complex64 :: runtime.Raw_Complex64 + +Raw_Complex128 :: runtime.Raw_Complex128 + +Raw_Quaternion64 :: runtime.Raw_Quaternion64 -Raw_Complex32 :: runtime.Raw_Complex32 -Raw_Complex64 :: runtime.Raw_Complex64 -Raw_Complex128 :: runtime.Raw_Complex128 -Raw_Quaternion64 :: runtime.Raw_Quaternion64 Raw_Quaternion128 :: runtime.Raw_Quaternion128 + Raw_Quaternion256 :: runtime.Raw_Quaternion256 -Raw_Quaternion64_Vector_Scalar :: runtime.Raw_Quaternion64_Vector_Scalar + +Raw_Quaternion64_Vector_Scalar :: runtime.Raw_Quaternion64_Vector_Scalar + Raw_Quaternion128_Vector_Scalar :: runtime.Raw_Quaternion128_Vector_Scalar + Raw_Quaternion256_Vector_Scalar :: runtime.Raw_Quaternion256_Vector_Scalar make_any :: proc "contextless" (data: rawptr, id: typeid) -> any { diff --git a/core/mem/rollback_stack_allocator.odin b/core/mem/rollback_stack_allocator.odin index f5e428d87..761435552 100644 --- a/core/mem/rollback_stack_allocator.odin +++ b/core/mem/rollback_stack_allocator.odin @@ -1,45 +1,47 @@ package mem -// The Rollback Stack Allocator was designed for the test runner to be fast, -// able to grow, and respect the Tracking Allocator's requirement for -// individual frees. It is not overly concerned with fragmentation, however. -// -// It has support for expansion when configured with a block allocator and -// limited support for out-of-order frees. -// -// Allocation has constant-time best and usual case performance. -// At worst, it is linear according to the number of memory blocks. -// -// Allocation follows a first-fit strategy when there are multiple memory -// blocks. -// -// Freeing has constant-time best and usual case performance. -// At worst, it is linear according to the number of memory blocks and number -// of freed items preceding the last item in a block. -// -// Resizing has constant-time performance, if it's the last item in a block, or -// the new size is smaller. Naturally, this becomes linear-time if there are -// multiple blocks to search for the pointer's owning block. Otherwise, the -// allocator defaults to a combined alloc & free operation internally. -// -// Out-of-order freeing is accomplished by collapsing a run of freed items -// from the last allocation backwards. -// -// Each allocation has an overhead of 8 bytes and any extra bytes to satisfy -// the requested alignment. +/* +The Rollback Stack Allocator was designed for the test runner to be fast, +able to grow, and respect the Tracking Allocator's requirement for +individual frees. It is not overly concerned with fragmentation, however. +It has support for expansion when configured with a block allocator and +limited support for out-of-order frees. + +Allocation has constant-time best and usual case performance. +At worst, it is linear according to the number of memory blocks. + +Allocation follows a first-fit strategy when there are multiple memory +blocks. + +Freeing has constant-time best and usual case performance. +At worst, it is linear according to the number of memory blocks and number +of freed items preceding the last item in a block. + +Resizing has constant-time performance, if it's the last item in a block, or +the new size is smaller. Naturally, this becomes linear-time if there are +multiple blocks to search for the pointer's owning block. Otherwise, the +allocator defaults to a combined alloc & free operation internally. + +Out-of-order freeing is accomplished by collapsing a run of freed items +from the last allocation backwards. + +Each allocation has an overhead of 8 bytes and any extra bytes to satisfy +the requested alignment. +*/ import "base:runtime" ROLLBACK_STACK_DEFAULT_BLOCK_SIZE :: 4 * Megabyte -// This limitation is due to the size of `prev_ptr`, but it is only for the -// head block; any allocation in excess of the allocator's `block_size` is -// valid, so long as the block allocator can handle it. -// -// This is because allocations over the block size are not split up if the item -// within is freed; they are immediately returned to the block allocator. -ROLLBACK_STACK_MAX_HEAD_BLOCK_SIZE :: 2 * Gigabyte +/* +This limitation is due to the size of `prev_ptr`, but it is only for the +head block; any allocation in excess of the allocator's `block_size` is +valid, so long as the block allocator can handle it. +This is because allocations over the block size are not split up if the item +within is freed; they are immediately returned to the block allocator. +*/ +ROLLBACK_STACK_MAX_HEAD_BLOCK_SIZE :: 2 * Gigabyte Rollback_Stack_Header :: bit_field u64 { prev_offset: uintptr | 32, @@ -60,7 +62,6 @@ Rollback_Stack :: struct { block_allocator: Allocator, } - @(private="file", require_results) rb_ptr_in_bounds :: proc(block: ^Rollback_Stack_Block, ptr: rawptr) -> bool { start := raw_data(block.buffer) @@ -294,9 +295,13 @@ rollback_stack_allocator :: proc(stack: ^Rollback_Stack) -> Allocator { } @(require_results) -rollback_stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, location := #caller_location, +rollback_stack_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + location := #caller_location, ) -> (result: []byte, err: Allocator_Error) { stack := cast(^Rollback_Stack)allocator_data diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index 1b57e5fb4..356180be1 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -12,22 +12,23 @@ Tracking_Allocator_Entry :: struct { err: Allocator_Error, location: runtime.Source_Code_Location, } + Tracking_Allocator_Bad_Free_Entry :: struct { memory: rawptr, location: runtime.Source_Code_Location, } -Tracking_Allocator :: struct { - backing: Allocator, - allocation_map: map[rawptr]Tracking_Allocator_Entry, - bad_free_array: [dynamic]Tracking_Allocator_Bad_Free_Entry, - mutex: sync.Mutex, - clear_on_free_all: bool, - total_memory_allocated: i64, - total_allocation_count: i64, - total_memory_freed: i64, - total_free_count: i64, - peak_memory_allocated: i64, +Tracking_Allocator :: struct { + backing: Allocator, + allocation_map: map[rawptr]Tracking_Allocator_Entry, + bad_free_array: [dynamic]Tracking_Allocator_Bad_Free_Entry, + mutex: sync.Mutex, + clear_on_free_all: bool, + total_memory_allocated: i64, + total_allocation_count: i64, + total_memory_freed: i64, + total_free_count: i64, + peak_memory_allocated: i64, current_memory_allocated: i64, } @@ -35,7 +36,6 @@ tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Alloc t.backing = backing_allocator t.allocation_map.allocator = internals_allocator t.bad_free_array.allocator = internals_allocator - if .Free_All in query_features(t.backing) { t.clear_on_free_all = true } @@ -46,7 +46,6 @@ tracking_allocator_destroy :: proc(t: ^Tracking_Allocator) { delete(t.bad_free_array) } - // Clear only the current allocation data while keeping the totals intact. tracking_allocator_clear :: proc(t: ^Tracking_Allocator) { sync.mutex_lock(&t.mutex) @@ -78,9 +77,14 @@ tracking_allocator :: proc(data: ^Tracking_Allocator) -> Allocator { } } -tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, loc := #caller_location) -> (result: []byte, err: Allocator_Error) { +tracking_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> (result: []byte, err: Allocator_Error) { track_alloc :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { data.total_memory_allocated += i64(entry.size) data.total_allocation_count += 1 From da6213196dd4c64cf53d163dd7392531e26f3ad2 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 09:42:04 +1100 Subject: [PATCH 025/320] [mem]: API for using arena directly --- core/mem/allocators.odin | 71 +++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 7bc1a6d77..52a05958f 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -3,6 +3,13 @@ package mem import "base:intrinsics" import "base:runtime" +nil_allocator :: proc() -> Allocator { + return Allocator{ + procedure = nil_allocator_proc, + data = nil, + } +} + nil_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -14,13 +21,6 @@ nil_allocator_proc :: proc( return nil, nil } -nil_allocator :: proc() -> Allocator { - return Allocator{ - procedure = nil_allocator_proc, - data = nil, - } -} - Arena :: struct { data: []byte, offset: int, @@ -56,6 +56,30 @@ arena_allocator :: proc(arena: ^Arena) -> Allocator { } } +arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { + #no_bounds_check end := &a.data[a.offset] + ptr := align_forward(end, uintptr(alignment)) + total_size := size + ptr_sub((^byte)(ptr), (^byte)(end)) + if a.offset + total_size > len(a.data) { + return nil, .Out_Of_Memory + } + a.offset += total_size + a.peak_used = max(a.peak_used, a.offset) + return byte_slice(ptr, size), nil +} + +arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { + bytes, err := arena_alloc_non_zeroed(a, size, alignment) + if bytes != nil { + zero(raw_data(bytes), size) + } + return bytes, err +} + +arena_free_all :: proc(a: ^Arena) { + a.offset = 0 +} + arena_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -66,49 +90,28 @@ arena_allocator_proc :: proc( location := #caller_location, ) -> ([]byte, Allocator_Error) { arena := cast(^Arena)allocator_data - switch mode { - case .Alloc, .Alloc_Non_Zeroed: - #no_bounds_check end := &arena.data[arena.offset] - - ptr := align_forward(end, uintptr(alignment)) - - total_size := size + ptr_sub((^byte)(ptr), (^byte)(end)) - - if arena.offset + total_size > len(arena.data) { - return nil, .Out_Of_Memory - } - - arena.offset += total_size - arena.peak_used = max(arena.peak_used, arena.offset) - if mode != .Alloc_Non_Zeroed { - zero(ptr, size) - } - return byte_slice(ptr, size), nil - + case .Alloc: + return arena_alloc(arena, size, alignment) + case .Alloc_Non_Zeroed: + return arena_alloc_non_zeroed(arena, size, alignment) case .Free: return nil, .Mode_Not_Implemented - case .Free_All: - arena.offset = 0 - + arena_free_all(arena) case .Resize: return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, arena_allocator(arena)) - case .Resize_Non_Zeroed: return default_resize_bytes_align_non_zeroed(byte_slice(old_memory, old_size), size, alignment, arena_allocator(arena)) - case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Alloc, .Alloc_Non_Zeroed, .Free_All, .Resize, .Resize_Non_Zeroed, .Query_Features} } return nil, nil - case .Query_Info: return nil, .Mode_Not_Implemented } - return nil, nil } @@ -128,6 +131,8 @@ end_arena_temp_memory :: proc(tmp: Arena_Temp_Memory) { tmp.arena.temp_count -= 1 } + + Scratch_Allocator :: struct { data: []byte, curr_offset: int, From e5106e48a809a313be35c3554e9dc310c117eefe Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 10:09:05 +1100 Subject: [PATCH 026/320] [mem]: API for using scratch allocator directly --- core/mem/allocators.odin | 285 ++++++++++++++++++++++----------------- 1 file changed, 165 insertions(+), 120 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 52a05958f..2be4d5b61 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -56,6 +56,14 @@ arena_allocator :: proc(arena: ^Arena) -> Allocator { } } +arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { + bytes, err := arena_alloc_non_zeroed(a, size, alignment) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { #no_bounds_check end := &a.data[a.offset] ptr := align_forward(end, uintptr(alignment)) @@ -68,14 +76,6 @@ arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNM return byte_slice(ptr, size), nil } -arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { - bytes, err := arena_alloc_non_zeroed(a, size, alignment) - if bytes != nil { - zero(raw_data(bytes), size) - } - return bytes, err -} - arena_free_all :: proc(a: ^Arena) { a.offset = 0 } @@ -162,6 +162,153 @@ scratch_allocator_destroy :: proc(s: ^Scratch_Allocator) { s^ = {} } +scratch_allocator_alloc :: proc( + s: ^Scratch_Allocator, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := scratch_allocator_alloc_non_zeroed(s, size, alignment, loc) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + +scratch_allocator_alloc_non_zeroed :: proc( + s: ^Scratch_Allocator, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + if s.data == nil { + DEFAULT_BACKING_SIZE :: 4 * Megabyte + if !(context.allocator.procedure != scratch_allocator_proc && context.allocator.data != s) { + panic("cyclic initialization of the scratch allocator with itself", loc) + } + scratch_allocator_init(s, DEFAULT_BACKING_SIZE) + } + size := size + size = align_forward_int(size, alignment) + switch { + case s.curr_offset+size <= len(s.data): + start := uintptr(raw_data(s.data)) + ptr := start + uintptr(s.curr_offset) + ptr = align_forward_uintptr(ptr, uintptr(alignment)) + s.prev_allocation = rawptr(ptr) + offset := int(ptr - start) + s.curr_offset = offset + size + return byte_slice(rawptr(ptr), size), nil + case size <= len(s.data): + start := uintptr(raw_data(s.data)) + ptr := align_forward_uintptr(start, uintptr(alignment)) + s.prev_allocation = rawptr(ptr) + offset := int(ptr - start) + s.curr_offset = offset + size + return byte_slice(rawptr(ptr), size), nil + } + a := s.backup_allocator + if a.procedure == nil { + a = context.allocator + s.backup_allocator = a + } + ptr, err := alloc_bytes_non_zeroed(size, alignment, a, loc) + if err != nil { + return ptr, err + } + if s.leaked_allocations == nil { + s.leaked_allocations, err = make([dynamic][]byte, a) + } + append(&s.leaked_allocations, ptr) + if logger := context.logger; logger.lowest_level <= .Warning { + if logger.procedure != nil { + logger.procedure(logger.data, .Warning, "mem.Scratch_Allocator resorted to backup_allocator" , logger.options, loc) + } + } + return ptr, err +} + +scratch_allocator_free :: proc(s: ^Scratch_Allocator, ptr: rawptr, loc := #caller_location) -> Allocator_Error { + if s.data == nil { + panic("Free on an uninitialized scratch allocator", loc) + } + if ptr == nil { + return nil + } + start := uintptr(raw_data(s.data)) + end := start + uintptr(len(s.data)) + old_ptr := uintptr(ptr) + if s.prev_allocation == ptr { + s.curr_offset = int(uintptr(s.prev_allocation) - start) + s.prev_allocation = nil + return nil + } + if start <= old_ptr && old_ptr < end { + // NOTE(bill): Cannot free this pointer but it is valid + return nil + } + if len(s.leaked_allocations) != 0 { + for data, i in s.leaked_allocations { + ptr := raw_data(data) + if ptr == ptr { + free_bytes(data, s.backup_allocator, loc) + ordered_remove(&s.leaked_allocations, i, loc) + return nil + } + } + } + return .Invalid_Pointer +} + +scratch_allocator_free_all :: proc(s: ^Scratch_Allocator, loc := #caller_location) { + s.curr_offset = 0 + s.prev_allocation = nil + for ptr in s.leaked_allocations { + free_bytes(ptr, s.backup_allocator, loc) + } + clear(&s.leaked_allocations) +} + +scratch_allocator_resize_non_zeroed :: proc( + s: ^Scratch_Allocator, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + begin := uintptr(raw_data(s.data)) + end := begin + uintptr(len(s.data)) + old_ptr := uintptr(old_memory) + if begin <= old_ptr && old_ptr < end && old_ptr+uintptr(size) < end { + s.curr_offset = int(old_ptr-begin)+size + return byte_slice(old_memory, size), nil + } + data, err := scratch_allocator_alloc_non_zeroed(s, size, alignment, loc) + if err != nil { + return data, err + } + // TODO(flysand): OOB access on size < old_size. + runtime.copy(data, byte_slice(old_memory, old_size)) + err = scratch_allocator_free(s, old_memory, loc) + return data, err +} + +scratch_allocator_resize :: proc( + s: ^Scratch_Allocator, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + bytes, err := scratch_allocator_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + if bytes != nil && size > old_size { + zero_slice(bytes[size:]) + } + return bytes, err +} + scratch_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -170,9 +317,7 @@ scratch_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - s := (^Scratch_Allocator)(allocator_data) - if s.data == nil { DEFAULT_BACKING_SIZE :: 4 * Megabyte if !(context.allocator.procedure != scratch_allocator_proc && @@ -181,129 +326,29 @@ scratch_allocator_proc :: proc( } scratch_allocator_init(s, DEFAULT_BACKING_SIZE) } - size := size - switch mode { - case .Alloc, .Alloc_Non_Zeroed: - size = align_forward_int(size, alignment) - - switch { - case s.curr_offset+size <= len(s.data): - start := uintptr(raw_data(s.data)) - ptr := start + uintptr(s.curr_offset) - ptr = align_forward_uintptr(ptr, uintptr(alignment)) - if mode != .Alloc_Non_Zeroed { - zero(rawptr(ptr), size) - } - - s.prev_allocation = rawptr(ptr) - offset := int(ptr - start) - s.curr_offset = offset + size - return byte_slice(rawptr(ptr), size), nil - - case size <= len(s.data): - start := uintptr(raw_data(s.data)) - ptr := align_forward_uintptr(start, uintptr(alignment)) - if mode != .Alloc_Non_Zeroed { - zero(rawptr(ptr), size) - } - - s.prev_allocation = rawptr(ptr) - offset := int(ptr - start) - s.curr_offset = offset + size - return byte_slice(rawptr(ptr), size), nil - } - a := s.backup_allocator - if a.procedure == nil { - a = context.allocator - s.backup_allocator = a - } - - ptr, err := alloc_bytes(size, alignment, a, loc) - if err != nil { - return ptr, err - } - if s.leaked_allocations == nil { - s.leaked_allocations, err = make([dynamic][]byte, a) - } - append(&s.leaked_allocations, ptr) - - if logger := context.logger; logger.lowest_level <= .Warning { - if logger.procedure != nil { - logger.procedure(logger.data, .Warning, "mem.Scratch_Allocator resorted to backup_allocator" , logger.options, loc) - } - } - - return ptr, err - + case .Alloc: + return scratch_allocator_alloc(s, size, alignment, loc) + case .Alloc_Non_Zeroed: + return scratch_allocator_alloc_non_zeroed(s, size, alignment, loc) case .Free: - if old_memory == nil { - return nil, nil - } - start := uintptr(raw_data(s.data)) - end := start + uintptr(len(s.data)) - old_ptr := uintptr(old_memory) - - if s.prev_allocation == old_memory { - s.curr_offset = int(uintptr(s.prev_allocation) - start) - s.prev_allocation = nil - return nil, nil - } - - if start <= old_ptr && old_ptr < end { - // NOTE(bill): Cannot free this pointer but it is valid - return nil, nil - } - - if len(s.leaked_allocations) != 0 { - for data, i in s.leaked_allocations { - ptr := raw_data(data) - if ptr == old_memory { - free_bytes(data, s.backup_allocator) - ordered_remove(&s.leaked_allocations, i) - return nil, nil - } - } - } - return nil, .Invalid_Pointer - // panic("invalid pointer passed to default_temp_allocator"); - + return nil, scratch_allocator_free(s, old_memory, loc) case .Free_All: - s.curr_offset = 0 - s.prev_allocation = nil - for ptr in s.leaked_allocations { - free_bytes(ptr, s.backup_allocator) - } - clear(&s.leaked_allocations) - - case .Resize, .Resize_Non_Zeroed: - begin := uintptr(raw_data(s.data)) - end := begin + uintptr(len(s.data)) - old_ptr := uintptr(old_memory) - if begin <= old_ptr && old_ptr < end && old_ptr+uintptr(size) < end { - s.curr_offset = int(old_ptr-begin)+size - return byte_slice(old_memory, size), nil - } - data, err := scratch_allocator_proc(allocator_data, .Alloc, size, alignment, old_memory, old_size, loc) - if err != nil { - return data, err - } - runtime.copy(data, byte_slice(old_memory, old_size)) - _, err = scratch_allocator_proc(allocator_data, .Free, 0, alignment, old_memory, old_size, loc) - return data, err - + scratch_allocator_free_all(s, loc) + case .Resize: + return scratch_allocator_resize(s, old_memory, old_size, size, alignment, loc) + case .Resize_Non_Zeroed: + return scratch_allocator_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Alloc, .Alloc_Non_Zeroed, .Free, .Free_All, .Resize, .Resize_Non_Zeroed, .Query_Features} } return nil, nil - case .Query_Info: return nil, .Mode_Not_Implemented } - return nil, nil } From 834f082dbabb807e01f483c6a4d61a51a4dad47c Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 10:24:00 +1100 Subject: [PATCH 027/320] [mem]: Initialize scratch allocator during calls to free and resize --- core/mem/allocators.odin | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 2be4d5b61..4ffb02085 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -261,6 +261,9 @@ scratch_allocator_free :: proc(s: ^Scratch_Allocator, ptr: rawptr, loc := #calle } scratch_allocator_free_all :: proc(s: ^Scratch_Allocator, loc := #caller_location) { + if s.data == nil { + panic("free_all called on an unitialized scratch allocator", loc) + } s.curr_offset = 0 s.prev_allocation = nil for ptr in s.leaked_allocations { @@ -277,6 +280,13 @@ scratch_allocator_resize_non_zeroed :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> ([]byte, Allocator_Error) { + if s.data == nil { + DEFAULT_BACKING_SIZE :: 4 * Megabyte + if !(context.allocator.procedure != scratch_allocator_proc && context.allocator.data != s) { + panic("cyclic initialization of the scratch allocator with itself", loc) + } + scratch_allocator_init(s, DEFAULT_BACKING_SIZE) + } begin := uintptr(raw_data(s.data)) end := begin + uintptr(len(s.data)) old_ptr := uintptr(old_memory) @@ -318,14 +328,6 @@ scratch_allocator_proc :: proc( loc := #caller_location, ) -> ([]byte, Allocator_Error) { s := (^Scratch_Allocator)(allocator_data) - if s.data == nil { - DEFAULT_BACKING_SIZE :: 4 * Megabyte - if !(context.allocator.procedure != scratch_allocator_proc && - context.allocator.data != allocator_data) { - panic("cyclic initialization of the scratch allocator with itself") - } - scratch_allocator_init(s, DEFAULT_BACKING_SIZE) - } size := size switch mode { case .Alloc: From 9750b64096024990ee84b5727d6db34ffc686948 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 10:55:54 +1100 Subject: [PATCH 028/320] [mem]: API for using stack allocator directly --- core/mem/allocators.odin | 283 +++++++++++++++++++++++---------------- 1 file changed, 169 insertions(+), 114 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 4ffb02085..bade70ce0 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -289,6 +289,7 @@ scratch_allocator_resize_non_zeroed :: proc( } begin := uintptr(raw_data(s.data)) end := begin + uintptr(len(s.data)) + // TODO(flysand): Doesn't handle old_memory == nil old_ptr := uintptr(old_memory) if begin <= old_ptr && old_ptr < end && old_ptr+uintptr(size) < end { s.curr_offset = int(old_ptr-begin)+size @@ -362,10 +363,7 @@ scratch_allocator :: proc(allocator: ^Scratch_Allocator) -> Allocator { } } -Stack_Allocation_Header :: struct { - prev_offset: int, - padding: int, -} + // Stack is a stack-like allocator which has a strict memory freeing order Stack :: struct { @@ -375,6 +373,11 @@ Stack :: struct { peak_used: int, } +Stack_Allocation_Header :: struct { + prev_offset: int, + padding: int, +} + stack_init :: proc(s: ^Stack, data: []byte) { s.data = data s.prev_offset = 0 @@ -398,6 +401,156 @@ stack_allocator :: proc(stack: ^Stack) -> Allocator { } } +stack_allocator_alloc_non_zeroed :: proc( + s: ^Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + if s.data == nil { + panic("Stack allocation on an uninitialized stack allocator", loc) + } + curr_addr := uintptr(raw_data(s.data)) + uintptr(s.curr_offset) + padding := calc_padding_with_header( + curr_addr, + uintptr(alignment), + size_of(Stack_Allocation_Header), + ) + if s.curr_offset + padding + size > len(s.data) { + return nil, .Out_Of_Memory + } + s.prev_offset = s.curr_offset + s.curr_offset += padding + next_addr := curr_addr + uintptr(padding) + header := (^Stack_Allocation_Header)(next_addr - size_of(Stack_Allocation_Header)) + header.padding = padding + header.prev_offset = s.prev_offset + s.curr_offset += size + s.peak_used = max(s.peak_used, s.curr_offset) + return byte_slice(rawptr(next_addr), size), nil +} + +stack_allocator_alloc :: proc( + s: ^Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + bytes, err := stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + +stack_allocator_free :: proc( + s: ^Stack, + old_memory: rawptr, + loc := #caller_location, +) -> (Allocator_Error) { + if s.data == nil { + panic("Stack free on an uninitialized stack allocator", loc) + } + if old_memory == nil { + return nil + } + start := uintptr(raw_data(s.data)) + end := start + uintptr(len(s.data)) + curr_addr := uintptr(old_memory) + if !(start <= curr_addr && curr_addr < end) { + panic("Out of bounds memory address passed to stack allocator (free)", loc) + } + if curr_addr >= start+uintptr(s.curr_offset) { + // NOTE(bill): Allow double frees + return nil + } + header := (^Stack_Allocation_Header)(curr_addr - size_of(Stack_Allocation_Header)) + old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) + if old_offset != header.prev_offset { + // panic("Out of order stack allocator free"); + return .Invalid_Pointer + } + s.curr_offset = old_offset + s.prev_offset = header.prev_offset + return nil +} + +stack_allocator_free_all :: proc(s: ^Stack) { + if s.data == nil { + panic("Stack free all on an uninitialized stack allocator", loc) + } + s.prev_offset = 0 + s.curr_offset = 0 +} + +stack_allocator_resize_non_zeroed :: proc( + s: ^Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + if s.data == nil { + panic("Stack free all on an uninitialized stack allocator", loc) + } + if old_memory == nil { + return stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + } + if size == 0 { + return nil, nil + } + start := uintptr(raw_data(s.data)) + end := start + uintptr(len(s.data)) + curr_addr := uintptr(old_memory) + if !(start <= curr_addr && curr_addr < end) { + panic("Out of bounds memory address passed to stack allocator (resize)") + } + if curr_addr >= start+uintptr(s.curr_offset) { + // NOTE(bill): Allow double frees + return nil, nil + } + if old_size == size { + return byte_slice(old_memory, size), nil + } + header := (^Stack_Allocation_Header)(curr_addr - size_of(Stack_Allocation_Header)) + old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) + if old_offset != header.prev_offset { + data, err := stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + if err == nil { + runtime.copy(data, byte_slice(old_memory, old_size)) + } + return data, err + } + old_memory_size := uintptr(s.curr_offset) - (curr_addr - start) + assert(old_memory_size == uintptr(old_size)) + diff := size - old_size + s.curr_offset += diff // works for smaller sizes too + if diff > 0 { + zero(rawptr(curr_addr + uintptr(diff)), diff) + } + return byte_slice(old_memory, size), nil +} + +stack_allocator_resize :: proc( + s: ^Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + if bytes != nil { + if old_memory == nil { + zero_slice(bytes) + } else if size > old_size { + zero_slice(bytes[old_size:]) + } + } + return bytes, err +} + stack_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -408,121 +561,22 @@ stack_allocator_proc :: proc( location := #caller_location, ) -> ([]byte, Allocator_Error) { s := cast(^Stack)allocator_data - if s.data == nil { return nil, .Invalid_Argument } - - raw_alloc :: proc( - s: ^Stack, - size: int, - alignment: int, - zero_memory: bool, - ) -> ([]byte, Allocator_Error) { - curr_addr := uintptr(raw_data(s.data)) + uintptr(s.curr_offset) - padding := calc_padding_with_header( - curr_addr, - uintptr(alignment), - size_of(Stack_Allocation_Header), - ) - if s.curr_offset + padding + size > len(s.data) { - return nil, .Out_Of_Memory - } - s.prev_offset = s.curr_offset - s.curr_offset += padding - next_addr := curr_addr + uintptr(padding) - header := (^Stack_Allocation_Header)(next_addr - size_of(Stack_Allocation_Header)) - header.padding = padding - header.prev_offset = s.prev_offset - s.curr_offset += size - s.peak_used = max(s.peak_used, s.curr_offset) - if zero_memory { - zero(rawptr(next_addr), size) - } - return byte_slice(rawptr(next_addr), size), nil - } - switch mode { - case .Alloc, .Alloc_Non_Zeroed: - return raw_alloc(s, size, alignment, mode == .Alloc) + case .Alloc: + return stack_allocator_alloc(s, size, alignment, loc) + case .Alloc_Non_Zeroed: + return stack_allocator_alloc_non_zeroed(s, size, alignment, loc) case .Free: - if old_memory == nil { - return nil, nil - } - start := uintptr(raw_data(s.data)) - end := start + uintptr(len(s.data)) - curr_addr := uintptr(old_memory) - - if !(start <= curr_addr && curr_addr < end) { - panic("Out of bounds memory address passed to stack allocator (free)") - } - - if curr_addr >= start+uintptr(s.curr_offset) { - // NOTE(bill): Allow double frees - return nil, nil - } - - header := (^Stack_Allocation_Header)(curr_addr - size_of(Stack_Allocation_Header)) - old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) - - if old_offset != header.prev_offset { - // panic("Out of order stack allocator free"); - return nil, .Invalid_Pointer - } - - s.curr_offset = old_offset - s.prev_offset = header.prev_offset - + return nil, stack_allocator_free(s, old_memory, loc) case .Free_All: - s.prev_offset = 0 - s.curr_offset = 0 - - case .Resize, .Resize_Non_Zeroed: - if old_memory == nil { - return raw_alloc(s, size, alignment, mode == .Resize) - } - if size == 0 { - return nil, nil - } - - start := uintptr(raw_data(s.data)) - end := start + uintptr(len(s.data)) - curr_addr := uintptr(old_memory) - if !(start <= curr_addr && curr_addr < end) { - panic("Out of bounds memory address passed to stack allocator (resize)") - } - - if curr_addr >= start+uintptr(s.curr_offset) { - // NOTE(bill): Allow double frees - return nil, nil - } - - if old_size == size { - return byte_slice(old_memory, size), nil - } - - header := (^Stack_Allocation_Header)(curr_addr - size_of(Stack_Allocation_Header)) - old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) - - if old_offset != header.prev_offset { - data, err := raw_alloc(s, size, alignment, mode == .Resize) - if err == nil { - runtime.copy(data, byte_slice(old_memory, old_size)) - } - return data, err - } - - old_memory_size := uintptr(s.curr_offset) - (curr_addr - start) - assert(old_memory_size == uintptr(old_size)) - - diff := size - old_size - s.curr_offset += diff // works for smaller sizes too - if diff > 0 { - zero(rawptr(curr_addr + uintptr(diff)), diff) - } - - return byte_slice(old_memory, size), nil - + stack_allocator_free_all(s) + case .Resize: + return stack_allocator_resize(s, old_memory, old_size, size, alignment, loc) + case .Resize_Non_Zeroed: + return stack_allocator_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -532,10 +586,11 @@ stack_allocator_proc :: proc( case .Query_Info: return nil, .Mode_Not_Implemented } - return nil, nil } + + Small_Stack_Allocation_Header :: struct { padding: u8, } From de220a9aa5382b50a828eef42eb8e5895909b661 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 11:06:59 +1100 Subject: [PATCH 029/320] [mem]: Remove the extra word 'allocator' in procedures --- core/mem/allocators.odin | 95 +++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index bade70ce0..97c6d03c9 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -131,9 +131,12 @@ end_arena_temp_memory :: proc(tmp: Arena_Temp_Memory) { tmp.arena.temp_count -= 1 } +/* old procedures */ +Scratch_Allocator :: Scratch +scratch_allocator_init :: scratch_init +scratch_allocator_destroy :: scratch_destroy - -Scratch_Allocator :: struct { +Scratch :: struct { data: []byte, curr_offset: int, prev_allocation: rawptr, @@ -141,7 +144,7 @@ Scratch_Allocator :: struct { leaked_allocations: [dynamic][]byte, } -scratch_allocator_init :: proc(s: ^Scratch_Allocator, size: int, backup_allocator := context.allocator) -> Allocator_Error { +scratch_init :: proc(s: ^Scratch, size: int, backup_allocator := context.allocator) -> Allocator_Error { s.data = make_aligned([]byte, size, 2*align_of(rawptr), backup_allocator) or_return s.curr_offset = 0 s.prev_allocation = nil @@ -150,7 +153,7 @@ scratch_allocator_init :: proc(s: ^Scratch_Allocator, size: int, backup_allocato return nil } -scratch_allocator_destroy :: proc(s: ^Scratch_Allocator) { +scratch_destroy :: proc(s: ^Scratch) { if s == nil { return } @@ -162,21 +165,21 @@ scratch_allocator_destroy :: proc(s: ^Scratch_Allocator) { s^ = {} } -scratch_allocator_alloc :: proc( - s: ^Scratch_Allocator, +scratch_alloc :: proc( + s: ^Scratch, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := scratch_allocator_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := scratch_alloc_non_zeroed(s, size, alignment, loc) if bytes != nil { zero_slice(bytes) } return bytes, err } -scratch_allocator_alloc_non_zeroed :: proc( - s: ^Scratch_Allocator, +scratch_alloc_non_zeroed :: proc( + s: ^Scratch, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, @@ -186,7 +189,7 @@ scratch_allocator_alloc_non_zeroed :: proc( if !(context.allocator.procedure != scratch_allocator_proc && context.allocator.data != s) { panic("cyclic initialization of the scratch allocator with itself", loc) } - scratch_allocator_init(s, DEFAULT_BACKING_SIZE) + scratch_init(s, DEFAULT_BACKING_SIZE) } size := size size = align_forward_int(size, alignment) @@ -222,13 +225,13 @@ scratch_allocator_alloc_non_zeroed :: proc( append(&s.leaked_allocations, ptr) if logger := context.logger; logger.lowest_level <= .Warning { if logger.procedure != nil { - logger.procedure(logger.data, .Warning, "mem.Scratch_Allocator resorted to backup_allocator" , logger.options, loc) + logger.procedure(logger.data, .Warning, "mem.Scratch resorted to backup_allocator" , logger.options, loc) } } return ptr, err } -scratch_allocator_free :: proc(s: ^Scratch_Allocator, ptr: rawptr, loc := #caller_location) -> Allocator_Error { +scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error { if s.data == nil { panic("Free on an uninitialized scratch allocator", loc) } @@ -260,7 +263,7 @@ scratch_allocator_free :: proc(s: ^Scratch_Allocator, ptr: rawptr, loc := #calle return .Invalid_Pointer } -scratch_allocator_free_all :: proc(s: ^Scratch_Allocator, loc := #caller_location) { +scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { if s.data == nil { panic("free_all called on an unitialized scratch allocator", loc) } @@ -272,8 +275,8 @@ scratch_allocator_free_all :: proc(s: ^Scratch_Allocator, loc := #caller_locatio clear(&s.leaked_allocations) } -scratch_allocator_resize_non_zeroed :: proc( - s: ^Scratch_Allocator, +scratch_resize_non_zeroed :: proc( + s: ^Scratch, old_memory: rawptr, old_size: int, size: int, @@ -285,7 +288,7 @@ scratch_allocator_resize_non_zeroed :: proc( if !(context.allocator.procedure != scratch_allocator_proc && context.allocator.data != s) { panic("cyclic initialization of the scratch allocator with itself", loc) } - scratch_allocator_init(s, DEFAULT_BACKING_SIZE) + scratch_init(s, DEFAULT_BACKING_SIZE) } begin := uintptr(raw_data(s.data)) end := begin + uintptr(len(s.data)) @@ -295,25 +298,25 @@ scratch_allocator_resize_non_zeroed :: proc( s.curr_offset = int(old_ptr-begin)+size return byte_slice(old_memory, size), nil } - data, err := scratch_allocator_alloc_non_zeroed(s, size, alignment, loc) + data, err := scratch_alloc_non_zeroed(s, size, alignment, loc) if err != nil { return data, err } // TODO(flysand): OOB access on size < old_size. runtime.copy(data, byte_slice(old_memory, old_size)) - err = scratch_allocator_free(s, old_memory, loc) + err = scratch_free(s, old_memory, loc) return data, err } -scratch_allocator_resize :: proc( - s: ^Scratch_Allocator, +scratch_resize :: proc( + s: ^Scratch, old_memory: rawptr, old_size: int, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> ([]byte, Allocator_Error) { - bytes, err := scratch_allocator_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + bytes, err := scratch_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) if bytes != nil && size > old_size { zero_slice(bytes[size:]) } @@ -328,21 +331,21 @@ scratch_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - s := (^Scratch_Allocator)(allocator_data) + s := (^Scratch)(allocator_data) size := size switch mode { case .Alloc: - return scratch_allocator_alloc(s, size, alignment, loc) + return scratch_alloc(s, size, alignment, loc) case .Alloc_Non_Zeroed: - return scratch_allocator_alloc_non_zeroed(s, size, alignment, loc) + return scratch_alloc_non_zeroed(s, size, alignment, loc) case .Free: - return nil, scratch_allocator_free(s, old_memory, loc) + return nil, scratch_free(s, old_memory, loc) case .Free_All: - scratch_allocator_free_all(s, loc) + scratch_free_all(s, loc) case .Resize: - return scratch_allocator_resize(s, old_memory, old_size, size, alignment, loc) + return scratch_resize(s, old_memory, old_size, size, alignment, loc) case .Resize_Non_Zeroed: - return scratch_allocator_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return scratch_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -356,7 +359,7 @@ scratch_allocator_proc :: proc( } @(require_results) -scratch_allocator :: proc(allocator: ^Scratch_Allocator) -> Allocator { +scratch_allocator :: proc(allocator: ^Scratch) -> Allocator { return Allocator{ procedure = scratch_allocator_proc, data = allocator, @@ -401,7 +404,7 @@ stack_allocator :: proc(stack: ^Stack) -> Allocator { } } -stack_allocator_alloc_non_zeroed :: proc( +stack_alloc_non_zeroed :: proc( s: ^Stack, size: int, alignment := DEFAULT_ALIGNMENT, @@ -430,20 +433,20 @@ stack_allocator_alloc_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } -stack_allocator_alloc :: proc( +stack_alloc :: proc( s: ^Stack, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> ([]byte, Allocator_Error) { - bytes, err := stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) if bytes != nil { zero_slice(bytes) } return bytes, err } -stack_allocator_free :: proc( +stack_free :: proc( s: ^Stack, old_memory: rawptr, loc := #caller_location, @@ -475,7 +478,7 @@ stack_allocator_free :: proc( return nil } -stack_allocator_free_all :: proc(s: ^Stack) { +stack_free_all :: proc(s: ^Stack, loc := #caller_location) { if s.data == nil { panic("Stack free all on an uninitialized stack allocator", loc) } @@ -483,7 +486,7 @@ stack_allocator_free_all :: proc(s: ^Stack) { s.curr_offset = 0 } -stack_allocator_resize_non_zeroed :: proc( +stack_resize_non_zeroed :: proc( s: ^Stack, old_memory: rawptr, old_size: int, @@ -495,7 +498,7 @@ stack_allocator_resize_non_zeroed :: proc( panic("Stack free all on an uninitialized stack allocator", loc) } if old_memory == nil { - return stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + return stack_alloc_non_zeroed(s, size, alignment, loc) } if size == 0 { return nil, nil @@ -516,7 +519,7 @@ stack_allocator_resize_non_zeroed :: proc( header := (^Stack_Allocation_Header)(curr_addr - size_of(Stack_Allocation_Header)) old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) if old_offset != header.prev_offset { - data, err := stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + data, err := stack_alloc_non_zeroed(s, size, alignment, loc) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -532,7 +535,7 @@ stack_allocator_resize_non_zeroed :: proc( return byte_slice(old_memory, size), nil } -stack_allocator_resize :: proc( +stack_resize :: proc( s: ^Stack, old_memory: rawptr, old_size: int, @@ -540,7 +543,7 @@ stack_allocator_resize :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) if bytes != nil { if old_memory == nil { zero_slice(bytes) @@ -558,7 +561,7 @@ stack_allocator_proc :: proc( alignment: int, old_memory: rawptr, old_size: int, - location := #caller_location, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { s := cast(^Stack)allocator_data if s.data == nil { @@ -566,17 +569,17 @@ stack_allocator_proc :: proc( } switch mode { case .Alloc: - return stack_allocator_alloc(s, size, alignment, loc) + return stack_alloc(s, size, alignment, loc) case .Alloc_Non_Zeroed: - return stack_allocator_alloc_non_zeroed(s, size, alignment, loc) + return stack_alloc_non_zeroed(s, size, alignment, loc) case .Free: - return nil, stack_allocator_free(s, old_memory, loc) + return nil, stack_free(s, old_memory, loc) case .Free_All: - stack_allocator_free_all(s) + stack_free_all(s, loc) case .Resize: - return stack_allocator_resize(s, old_memory, old_size, size, alignment, loc) + return stack_resize(s, old_memory, old_size, size, alignment, loc) case .Resize_Non_Zeroed: - return stack_allocator_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return stack_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { From 4843db0960abb49de9357d048083a46bb603b2ae Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 12:23:55 +1100 Subject: [PATCH 030/320] [mem]: API for using small stack allocator directly --- core/mem/allocators.odin | 356 ++++++++++++++++++++++----------------- 1 file changed, 203 insertions(+), 153 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 97c6d03c9..a9a362014 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -33,6 +33,14 @@ Arena_Temp_Memory :: struct { prev_offset: int, } +@(require_results) +arena_allocator :: proc(arena: ^Arena) -> Allocator { + return Allocator{ + procedure = arena_allocator_proc, + data = arena, + } +} + arena_init :: proc(a: ^Arena, data: []byte) { a.data = data a.offset = 0 @@ -48,14 +56,6 @@ init_arena :: proc(a: ^Arena, data: []byte) { a.temp_count = 0 } -@(require_results) -arena_allocator :: proc(arena: ^Arena) -> Allocator { - return Allocator{ - procedure = arena_allocator_proc, - data = arena, - } -} - arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { bytes, err := arena_alloc_non_zeroed(a, size, alignment) if bytes != nil { @@ -144,6 +144,14 @@ Scratch :: struct { leaked_allocations: [dynamic][]byte, } +@(require_results) +scratch_allocator :: proc(allocator: ^Scratch) -> Allocator { + return Allocator{ + procedure = scratch_allocator_proc, + data = allocator, + } +} + scratch_init :: proc(s: ^Scratch, size: int, backup_allocator := context.allocator) -> Allocator_Error { s.data = make_aligned([]byte, size, 2*align_of(rawptr), backup_allocator) or_return s.curr_offset = 0 @@ -275,6 +283,21 @@ scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { clear(&s.leaked_allocations) } +scratch_resize :: proc( + s: ^Scratch, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + bytes, err := scratch_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + if bytes != nil && size > old_size { + zero_slice(bytes[size:]) + } + return bytes, err +} + scratch_resize_non_zeroed :: proc( s: ^Scratch, old_memory: rawptr, @@ -308,21 +331,6 @@ scratch_resize_non_zeroed :: proc( return data, err } -scratch_resize :: proc( - s: ^Scratch, - old_memory: rawptr, - old_size: int, - size: int, - alignment := DEFAULT_ALIGNMENT, - loc := #caller_location -) -> ([]byte, Allocator_Error) { - bytes, err := scratch_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) - if bytes != nil && size > old_size { - zero_slice(bytes[size:]) - } - return bytes, err -} - scratch_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -358,14 +366,6 @@ scratch_allocator_proc :: proc( return nil, nil } -@(require_results) -scratch_allocator :: proc(allocator: ^Scratch) -> Allocator { - return Allocator{ - procedure = scratch_allocator_proc, - data = allocator, - } -} - // Stack is a stack-like allocator which has a strict memory freeing order @@ -381,6 +381,14 @@ Stack_Allocation_Header :: struct { padding: int, } +@(require_results) +stack_allocator :: proc(stack: ^Stack) -> Allocator { + return Allocator{ + procedure = stack_allocator_proc, + data = stack, + } +} + stack_init :: proc(s: ^Stack, data: []byte) { s.data = data s.prev_offset = 0 @@ -396,12 +404,17 @@ init_stack :: proc(s: ^Stack, data: []byte) { s.peak_used = 0 } -@(require_results) -stack_allocator :: proc(stack: ^Stack) -> Allocator { - return Allocator{ - procedure = stack_allocator_proc, - data = stack, +stack_alloc :: proc( + s: ^Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) + if bytes != nil { + zero_slice(bytes) } + return bytes, err } stack_alloc_non_zeroed :: proc( @@ -433,19 +446,6 @@ stack_alloc_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } -stack_alloc :: proc( - s: ^Stack, - size: int, - alignment := DEFAULT_ALIGNMENT, - loc := #caller_location -) -> ([]byte, Allocator_Error) { - bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) - if bytes != nil { - zero_slice(bytes) - } - return bytes, err -} - stack_free :: proc( s: ^Stack, old_memory: rawptr, @@ -486,6 +486,25 @@ stack_free_all :: proc(s: ^Stack, loc := #caller_location) { s.curr_offset = 0 } +stack_resize :: proc( + s: ^Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) + if bytes != nil { + if old_memory == nil { + zero_slice(bytes) + } else if size > old_size { + zero_slice(bytes[old_size:]) + } + } + return bytes, err +} + stack_resize_non_zeroed :: proc( s: ^Stack, old_memory: rawptr, @@ -535,25 +554,6 @@ stack_resize_non_zeroed :: proc( return byte_slice(old_memory, size), nil } -stack_resize :: proc( - s: ^Stack, - old_memory: rawptr, - old_size: int, - size: int, - alignment := DEFAULT_ALIGNMENT, - loc := #caller_location, -) -> ([]byte, Allocator_Error) { - bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) - if bytes != nil { - if old_memory == nil { - zero_slice(bytes) - } else if size > old_size { - zero_slice(bytes[old_size:]) - } - } - return bytes, err -} - stack_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -626,6 +626,129 @@ small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { } } +small_stack_alloc :: proc( + s: ^Small_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := small_stack_alloc_non_zeroed(s, size, alignment, loc) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + +small_stack_alloc_non_zeroed :: proc( + s: ^Small_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + if s.data == nil { + return nil, .Invalid_Argument + } + alignment := alignment + alignment := clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) + curr_addr := uintptr(raw_data(s.data)) + uintptr(s.offset) + padding := calc_padding_with_header(curr_addr, uintptr(alignment), size_of(Small_Stack_Allocation_Header)) + if s.offset + padding + size > len(s.data) { + return nil, .Out_Of_Memory + } + s.offset += padding + next_addr := curr_addr + uintptr(padding) + header := (^Small_Stack_Allocation_Header)(next_addr - size_of(Small_Stack_Allocation_Header)) + header.padding = auto_cast padding + s.offset += size + s.peak_used = max(s.peak_used, s.offset) + return byte_slice(rawptr(next_addr), size), nil +} + +small_stack_free :: proc( + s: ^Small_Stack, + old_memory: rawptr, + loc := #caller_location, +) -> Allocator_Error { + if old_memory == nil { + return nil, nil + } + start := uintptr(raw_data(s.data)) + end := start + uintptr(len(s.data)) + curr_addr := uintptr(old_memory) + if !(start <= curr_addr && curr_addr < end) { + // panic("Out of bounds memory address passed to stack allocator (free)"); + return nil, .Invalid_Pointer + } + if curr_addr >= start+uintptr(s.offset) { + // NOTE(bill): Allow double frees + return nil, nil + } + header := (^Small_Stack_Allocation_Header)(curr_addr - size_of(Small_Stack_Allocation_Header)) + old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) + s.offset = old_offset +} + +small_stack_free_all :: proc(s: ^Small_Stack) { + s.offset = 0 +} + +small_stack_resize :: proc( + s: ^Small_Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := small_stack_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + if bytes != nil { + if old_memory == nil { + zero_slice(bytes) + } else if size > old_size { + zero_slice(bytes[old_size:]) + } + } + return bytes, err +} + +small_stack_resize_non_zeroed :: proc( + s: ^Small_Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + if old_memory == nil { + return small_stack_alloc_non_zeroed(s, size, align, loc) + } + if size == 0 { + return nil, nil + } + alignment := alignment + alignment := clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) + start := uintptr(raw_data(s.data)) + end := start + uintptr(len(s.data)) + curr_addr := uintptr(old_memory) + if !(start <= curr_addr && curr_addr < end) { + // panic("Out of bounds memory address passed to stack allocator (resize)"); + return nil, .Invalid_Pointer + } + if curr_addr >= start+uintptr(s.offset) { + // NOTE(bill): Treat as a double free + return nil, nil + } + if old_size == size { + return byte_slice(old_memory, size), nil + } + data, err := small_stack_alloc_non_zeroed(s, size, alignment, loc) + if err == nil { + runtime.copy(data, byte_slice(old_memory, old_size)) + } + return data, err + +} + small_stack_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -635,109 +758,36 @@ small_stack_allocator_proc :: proc( location := #caller_location, ) -> ([]byte, Allocator_Error) { s := cast(^Small_Stack)allocator_data - if s.data == nil { return nil, .Invalid_Argument } - - align := clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) - - raw_alloc :: proc(s: ^Small_Stack, size, alignment: int, zero_memory: bool) -> ([]byte, Allocator_Error) { - curr_addr := uintptr(raw_data(s.data)) + uintptr(s.offset) - padding := calc_padding_with_header(curr_addr, uintptr(alignment), size_of(Small_Stack_Allocation_Header)) - if s.offset + padding + size > len(s.data) { - return nil, .Out_Of_Memory - } - s.offset += padding - - next_addr := curr_addr + uintptr(padding) - header := (^Small_Stack_Allocation_Header)(next_addr - size_of(Small_Stack_Allocation_Header)) - header.padding = auto_cast padding - - s.offset += size - - s.peak_used = max(s.peak_used, s.offset) - - if zero_memory { - zero(rawptr(next_addr), size) - } - return byte_slice(rawptr(next_addr), size), nil - } - switch mode { - case .Alloc, .Alloc_Non_Zeroed: - return raw_alloc(s, size, align, mode == .Alloc) + case .Alloc: + return small_stack_alloc(s, size, alignment, loc) + case .Alloc_Non_Zeroed: + return small_stack_alloc_non_zeroed(s, size, alignment, loc) case .Free: - if old_memory == nil { - return nil, nil - } - start := uintptr(raw_data(s.data)) - end := start + uintptr(len(s.data)) - curr_addr := uintptr(old_memory) - - if !(start <= curr_addr && curr_addr < end) { - // panic("Out of bounds memory address passed to stack allocator (free)"); - return nil, .Invalid_Pointer - } - - if curr_addr >= start+uintptr(s.offset) { - // NOTE(bill): Allow double frees - return nil, nil - } - - header := (^Small_Stack_Allocation_Header)(curr_addr - size_of(Small_Stack_Allocation_Header)) - old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) - - s.offset = old_offset - + return nil, small_stack_free(s, old_memory, loc) case .Free_All: - s.offset = 0 - - case .Resize, .Resize_Non_Zeroed: - if old_memory == nil { - return raw_alloc(s, size, align, mode == .Resize) - } - if size == 0 { - return nil, nil - } - - start := uintptr(raw_data(s.data)) - end := start + uintptr(len(s.data)) - curr_addr := uintptr(old_memory) - if !(start <= curr_addr && curr_addr < end) { - // panic("Out of bounds memory address passed to stack allocator (resize)"); - return nil, .Invalid_Pointer - } - - if curr_addr >= start+uintptr(s.offset) { - // NOTE(bill): Treat as a double free - return nil, nil - } - - if old_size == size { - return byte_slice(old_memory, size), nil - } - - data, err := raw_alloc(s, size, align, mode == .Resize) - if err == nil { - runtime.copy(data, byte_slice(old_memory, old_size)) - } - return data, err - + small_stack_free_all(s) + case .Resize: + return small_stack_resize(s, old_memory, old_size, size, alignment, loc) + case .Resize_Non_Zeroed: + return small_stack_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Alloc, .Alloc_Non_Zeroed, .Free, .Free_All, .Resize, .Resize_Non_Zeroed, .Query_Features} } return nil, nil - case .Query_Info: return nil, .Mode_Not_Implemented } - return nil, nil } + + Dynamic_Pool :: struct { block_size: int, out_band_size: int, From aea3e9a585e07765a1d5c71448460665e25414e2 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 12:26:47 +1100 Subject: [PATCH 031/320] [mem]: Fix vet errors --- core/mem/allocators.odin | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index a9a362014..2d9d6d114 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -649,7 +649,7 @@ small_stack_alloc_non_zeroed :: proc( return nil, .Invalid_Argument } alignment := alignment - alignment := clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) + alignment = clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) curr_addr := uintptr(raw_data(s.data)) + uintptr(s.offset) padding := calc_padding_with_header(curr_addr, uintptr(alignment), size_of(Small_Stack_Allocation_Header)) if s.offset + padding + size > len(s.data) { @@ -670,22 +670,23 @@ small_stack_free :: proc( loc := #caller_location, ) -> Allocator_Error { if old_memory == nil { - return nil, nil + return nil } start := uintptr(raw_data(s.data)) end := start + uintptr(len(s.data)) curr_addr := uintptr(old_memory) if !(start <= curr_addr && curr_addr < end) { // panic("Out of bounds memory address passed to stack allocator (free)"); - return nil, .Invalid_Pointer + return .Invalid_Pointer } if curr_addr >= start+uintptr(s.offset) { // NOTE(bill): Allow double frees - return nil, nil + return nil } header := (^Small_Stack_Allocation_Header)(curr_addr - size_of(Small_Stack_Allocation_Header)) old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) s.offset = old_offset + return nil } small_stack_free_all :: proc(s: ^Small_Stack) { @@ -719,14 +720,14 @@ small_stack_resize_non_zeroed :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { + alignment := alignment + alignment = clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) if old_memory == nil { - return small_stack_alloc_non_zeroed(s, size, align, loc) + return small_stack_alloc_non_zeroed(s, size, alignment, loc) } if size == 0 { return nil, nil } - alignment := alignment - alignment := clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) start := uintptr(raw_data(s.data)) end := start + uintptr(len(s.data)) curr_addr := uintptr(old_memory) @@ -755,7 +756,7 @@ small_stack_allocator_proc :: proc( size, alignment: int, old_memory: rawptr, old_size: int, - location := #caller_location, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { s := cast(^Small_Stack)allocator_data if s.data == nil { From f8641ddd1b096663ed45f9179014ff5201b65225 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 12:33:12 +1100 Subject: [PATCH 032/320] [mem]: Rename dynamic pool to dynamic arena --- core/mem/allocators.odin | 61 ++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 2d9d6d114..7c33d1c9f 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -788,8 +788,19 @@ small_stack_allocator_proc :: proc( } +/* old stuff */ +Dynamic_Pool :: Dynamic_Arena +DYNAMIC_POOL_BLOCK_SIZE_DEFAULT :: DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT +DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT :: DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT +dynamic_pool_allocator_proc :: dynamic_arena_allocator_proc +dynamic_pool_free_all :: dynamic_arena_free_all +dynamic_pool_reset :: dynamic_arena_reset +dynamic_pool_alloc_bytes :: dynamic_arena_alloc_bytes +dynamic_pool_alloc :: dynamic_arena_alloc +dynamic_pool_init :: dynamic_arena_init +dynamic_pool_allocator :: dynamic_arena_allocator -Dynamic_Pool :: struct { +Dynamic_Arena :: struct { block_size: int, out_band_size: int, alignment: int, @@ -805,10 +816,10 @@ Dynamic_Pool :: struct { block_allocator: Allocator, } -DYNAMIC_POOL_BLOCK_SIZE_DEFAULT :: 65536 -DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT :: 6554 +DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT :: 65536 +DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT :: 6554 -dynamic_pool_allocator_proc :: proc( +dynamic_arena_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, size: int, @@ -817,21 +828,21 @@ dynamic_pool_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - pool := (^Dynamic_Pool)(allocator_data) + pool := (^Dynamic_Arena)(allocator_data) switch mode { case .Alloc, .Alloc_Non_Zeroed: - return dynamic_pool_alloc_bytes(pool, size) + return dynamic_arena_alloc_bytes(pool, size) case .Free: return nil, .Mode_Not_Implemented case .Free_All: - dynamic_pool_free_all(pool) + dynamic_arena_free_all(pool) return nil, nil case .Resize, .Resize_Non_Zeroed: if old_size >= size { return byte_slice(old_memory, size), nil } - data, err := dynamic_pool_alloc_bytes(pool, size) + data, err := dynamic_arena_alloc_bytes(pool, size) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -856,21 +867,20 @@ dynamic_pool_allocator_proc :: proc( return nil, nil } - @(require_results) -dynamic_pool_allocator :: proc(pool: ^Dynamic_Pool) -> Allocator { +dynamic_arena_allocator :: proc(pool: ^Dynamic_Arena) -> Allocator { return Allocator{ - procedure = dynamic_pool_allocator_proc, + procedure = dynamic_arena_allocator_proc, data = pool, } } -dynamic_pool_init :: proc( - pool: ^Dynamic_Pool, +dynamic_arena_init :: proc( + pool: ^Dynamic_Arena, block_allocator := context.allocator, array_allocator := context.allocator, - block_size := DYNAMIC_POOL_BLOCK_SIZE_DEFAULT, - out_band_size := DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT, + block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, + out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, alignment := 8, ) { pool.block_size = block_size @@ -882,8 +892,8 @@ dynamic_pool_init :: proc( pool.used_blocks.allocator = array_allocator } -dynamic_pool_destroy :: proc(pool: ^Dynamic_Pool) { - dynamic_pool_free_all(pool) +dynamic_arena_destroy :: proc(pool: ^Dynamic_Arena) { + dynamic_arena_free_all(pool) delete(pool.unused_blocks) delete(pool.used_blocks) delete(pool.out_band_allocations) @@ -891,14 +901,14 @@ dynamic_pool_destroy :: proc(pool: ^Dynamic_Pool) { } @(require_results) -dynamic_pool_alloc :: proc(pool: ^Dynamic_Pool, bytes: int) -> (rawptr, Allocator_Error) { - data, err := dynamic_pool_alloc_bytes(pool, bytes) +dynamic_arena_alloc :: proc(pool: ^Dynamic_Arena, bytes: int) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc_bytes(pool, bytes) return raw_data(data), err } @(require_results) -dynamic_pool_alloc_bytes :: proc(p: ^Dynamic_Pool, bytes: int) -> ([]byte, Allocator_Error) { - cycle_new_block :: proc(p: ^Dynamic_Pool) -> (err: Allocator_Error) { +dynamic_arena_alloc_bytes :: proc(p: ^Dynamic_Arena, bytes: int) -> ([]byte, Allocator_Error) { + cycle_new_block :: proc(p: ^Dynamic_Arena) -> (err: Allocator_Error) { if p.block_allocator.procedure == nil { panic("You must call pool_init on a Pool before using it") } @@ -960,8 +970,7 @@ dynamic_pool_alloc_bytes :: proc(p: ^Dynamic_Pool, bytes: int) -> ([]byte, Alloc return ([^]byte)(memory)[:bytes], nil } - -dynamic_pool_reset :: proc(p: ^Dynamic_Pool) { +dynamic_arena_reset :: proc(p: ^Dynamic_Arena) { if p.current_block != nil { append(&p.unused_blocks, p.current_block) p.current_block = nil @@ -980,8 +989,8 @@ dynamic_pool_reset :: proc(p: ^Dynamic_Pool) { p.bytes_left = 0 // Make new allocations call `cycle_new_block` again. } -dynamic_pool_free_all :: proc(p: ^Dynamic_Pool) { - dynamic_pool_reset(p) +dynamic_arena_free_all :: proc(p: ^Dynamic_Arena) { + dynamic_arena_reset(p) for block in p.unused_blocks { free(block, p.block_allocator) @@ -989,6 +998,8 @@ dynamic_pool_free_all :: proc(p: ^Dynamic_Pool) { clear(&p.unused_blocks) } + + panic_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, From 03f6b9bbf6bdd9ccf2f566a2da108d1f8b3a38e1 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 12:59:19 +1100 Subject: [PATCH 033/320] [mem]: Add alloc_non_zeroed variant to dynamic pool --- core/mem/allocators.odin | 303 +++++++++++++++++++-------------------- 1 file changed, 151 insertions(+), 152 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 7c33d1c9f..4c6ab09b1 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -795,30 +795,158 @@ DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT :: DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT dynamic_pool_allocator_proc :: dynamic_arena_allocator_proc dynamic_pool_free_all :: dynamic_arena_free_all dynamic_pool_reset :: dynamic_arena_reset -dynamic_pool_alloc_bytes :: dynamic_arena_alloc_bytes -dynamic_pool_alloc :: dynamic_arena_alloc +dynamic_pool_alloc_bytes :: dynamic_arena_alloc +dynamic_pool_alloc :: _dynamic_arena_alloc_ptr dynamic_pool_init :: dynamic_arena_init dynamic_pool_allocator :: dynamic_arena_allocator - -Dynamic_Arena :: struct { - block_size: int, - out_band_size: int, - alignment: int, - - unused_blocks: [dynamic]rawptr, - used_blocks: [dynamic]rawptr, - out_band_allocations: [dynamic]rawptr, - - current_block: rawptr, - current_pos: rawptr, - bytes_left: int, - - block_allocator: Allocator, -} +dynamic_pool_destroy :: dynamic_arena_destroy DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT :: 65536 DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT :: 6554 +Dynamic_Arena :: struct { + block_size: int, + out_band_size: int, + alignment: int, + unused_blocks: [dynamic]rawptr, + used_blocks: [dynamic]rawptr, + out_band_allocations: [dynamic]rawptr, + current_block: rawptr, + current_pos: rawptr, + bytes_left: int, + block_allocator: Allocator, +} + +dynamic_arena_init :: proc( + pool: ^Dynamic_Arena, + block_allocator := context.allocator, + array_allocator := context.allocator, + block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, + out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, + alignment := DEFAULT_ALIGNMENT, +) { + pool.block_size = block_size + pool.out_band_size = out_band_size + pool.alignment = alignment + pool.block_allocator = block_allocator + pool.out_band_allocations.allocator = array_allocator + pool.unused_blocks.allocator = array_allocator + pool.used_blocks.allocator = array_allocator +} + +@(require_results) +dynamic_arena_allocator :: proc(pool: ^Dynamic_Arena) -> Allocator { + return Allocator{ + procedure = dynamic_arena_allocator_proc, + data = pool, + } +} + +dynamic_arena_destroy :: proc(pool: ^Dynamic_Arena) { + dynamic_arena_free_all(pool) + delete(pool.unused_blocks) + delete(pool.used_blocks) + delete(pool.out_band_allocations) + zero(pool, size_of(pool^)) +} + +@(private="file") +_dynamic_arena_cycle_new_block :: proc(p: ^Dynamic_Arena, loc := #caller_location) -> (err: Allocator_Error) { + if p.block_allocator.procedure == nil { + panic("You must call pool_init on a Pool before using it", loc) + } + if p.current_block != nil { + append(&p.used_blocks, p.current_block, loc=loc) + } + new_block: rawptr + if len(p.unused_blocks) > 0 { + new_block = pop(&p.unused_blocks) + } else { + data: []byte + data, err = p.block_allocator.procedure( + p.block_allocator.data, + Allocator_Mode.Alloc, + p.block_size, + p.alignment, + nil, + 0, + ) + new_block = raw_data(data) + } + p.bytes_left = p.block_size + p.current_pos = new_block + p.current_block = new_block + return +} + +@(private, require_results) +_dynamic_arena_alloc_ptr :: proc(pool: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc(pool, size, loc) + return raw_data(data), err +} + +@(require_results) +dynamic_arena_alloc :: proc(p: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { + bytes, err := dynamic_arena_alloc_non_zeroed(p, size, loc) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + +@(require_results) +dynamic_arena_alloc_non_zeroed :: proc(p: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { + n := align_formula(size, p.alignment) + if n > p.block_size { + return nil, .Invalid_Argument + } + if n >= p.out_band_size { + assert(p.block_allocator.procedure != nil, "Backing block allocator must be initialized", loc=loc) + memory, err := alloc_bytes_non_zeroed(p.block_size, p.alignment, p.block_allocator, loc) + if memory != nil { + append(&p.out_band_allocations, raw_data(memory), loc = loc) + } + return memory, err + } + if p.bytes_left < n { + err := _dynamic_arena_cycle_new_block(p, loc) + if err != nil { + return nil, err + } + if p.current_block == nil { + return nil, .Out_Of_Memory + } + } + memory := p.current_pos + p.current_pos = ([^]byte)(p.current_pos)[n:] + p.bytes_left -= n + return ([^]byte)(memory)[:size], nil +} + +dynamic_arena_reset :: proc(p: ^Dynamic_Arena, loc := #caller_location) { + if p.current_block != nil { + append(&p.unused_blocks, p.current_block, loc=loc) + p.current_block = nil + } + for block in p.used_blocks { + append(&p.unused_blocks, block, loc=loc) + } + clear(&p.used_blocks) + for a in p.out_band_allocations { + free(a, p.block_allocator, loc=loc) + } + clear(&p.out_band_allocations) + p.bytes_left = 0 // Make new allocations call `_dynamic_arena_cycle_new_block` again. +} + +dynamic_arena_free_all :: proc(p: ^Dynamic_Arena) { + dynamic_arena_reset(p) + for block in p.unused_blocks { + free(block, p.block_allocator) + } + clear(&p.unused_blocks) +} + dynamic_arena_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -831,8 +959,10 @@ dynamic_arena_allocator_proc :: proc( pool := (^Dynamic_Arena)(allocator_data) switch mode { - case .Alloc, .Alloc_Non_Zeroed: - return dynamic_arena_alloc_bytes(pool, size) + case .Alloc: + return dynamic_arena_alloc(pool, size, loc) + case .Alloc_Non_Zeroed: + return dynamic_arena_alloc_non_zeroed(pool, size, loc) case .Free: return nil, .Mode_Not_Implemented case .Free_All: @@ -842,7 +972,7 @@ dynamic_arena_allocator_proc :: proc( if old_size >= size { return byte_slice(old_memory, size), nil } - data, err := dynamic_arena_alloc_bytes(pool, size) + data, err := dynamic_arena_alloc(pool, size) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -867,137 +997,6 @@ dynamic_arena_allocator_proc :: proc( return nil, nil } -@(require_results) -dynamic_arena_allocator :: proc(pool: ^Dynamic_Arena) -> Allocator { - return Allocator{ - procedure = dynamic_arena_allocator_proc, - data = pool, - } -} - -dynamic_arena_init :: proc( - pool: ^Dynamic_Arena, - block_allocator := context.allocator, - array_allocator := context.allocator, - block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, - out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, - alignment := 8, -) { - pool.block_size = block_size - pool.out_band_size = out_band_size - pool.alignment = alignment - pool.block_allocator = block_allocator - pool.out_band_allocations.allocator = array_allocator - pool.unused_blocks.allocator = array_allocator - pool.used_blocks.allocator = array_allocator -} - -dynamic_arena_destroy :: proc(pool: ^Dynamic_Arena) { - dynamic_arena_free_all(pool) - delete(pool.unused_blocks) - delete(pool.used_blocks) - delete(pool.out_band_allocations) - zero(pool, size_of(pool^)) -} - -@(require_results) -dynamic_arena_alloc :: proc(pool: ^Dynamic_Arena, bytes: int) -> (rawptr, Allocator_Error) { - data, err := dynamic_arena_alloc_bytes(pool, bytes) - return raw_data(data), err -} - -@(require_results) -dynamic_arena_alloc_bytes :: proc(p: ^Dynamic_Arena, bytes: int) -> ([]byte, Allocator_Error) { - cycle_new_block :: proc(p: ^Dynamic_Arena) -> (err: Allocator_Error) { - if p.block_allocator.procedure == nil { - panic("You must call pool_init on a Pool before using it") - } - - if p.current_block != nil { - append(&p.used_blocks, p.current_block) - } - - new_block: rawptr - if len(p.unused_blocks) > 0 { - new_block = pop(&p.unused_blocks) - } else { - data: []byte - data, err = p.block_allocator.procedure( - p.block_allocator.data, - Allocator_Mode.Alloc, - p.block_size, - p.alignment, - nil, - 0, - ) - new_block = raw_data(data) - } - - p.bytes_left = p.block_size - p.current_pos = new_block - p.current_block = new_block - return - } - - n := align_formula(bytes, p.alignment) - if n > p.block_size { - return nil, .Invalid_Argument - } - if n >= p.out_band_size { - assert(p.block_allocator.procedure != nil) - memory, err := p.block_allocator.procedure(p.block_allocator.data, Allocator_Mode.Alloc, - p.block_size, p.alignment, - nil, 0) - if memory != nil { - append(&p.out_band_allocations, raw_data(memory)) - } - return memory, err - } - - if p.bytes_left < n { - err := cycle_new_block(p) - if err != nil { - return nil, err - } - if p.current_block == nil { - return nil, .Out_Of_Memory - } - } - - memory := p.current_pos - p.current_pos = ([^]byte)(p.current_pos)[n:] - p.bytes_left -= n - return ([^]byte)(memory)[:bytes], nil -} - -dynamic_arena_reset :: proc(p: ^Dynamic_Arena) { - if p.current_block != nil { - append(&p.unused_blocks, p.current_block) - p.current_block = nil - } - - for block in p.used_blocks { - append(&p.unused_blocks, block) - } - clear(&p.used_blocks) - - for a in p.out_band_allocations { - free(a, p.block_allocator) - } - clear(&p.out_band_allocations) - - p.bytes_left = 0 // Make new allocations call `cycle_new_block` again. -} - -dynamic_arena_free_all :: proc(p: ^Dynamic_Arena) { - dynamic_arena_reset(p) - - for block in p.unused_blocks { - free(block, p.block_allocator) - } - clear(&p.unused_blocks) -} - panic_allocator_proc :: proc( From b350a35b7738c6f7ba7ee65dd403b86de32213c5 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 13:10:29 +1100 Subject: [PATCH 034/320] [mem]: Add resize_non_zeroed variant to dynamic arena, and rename pool to arena --- core/mem/allocators.odin | 126 +++++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 50 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 4c6ab09b1..d7e3cfbfd 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -880,14 +880,14 @@ _dynamic_arena_cycle_new_block :: proc(p: ^Dynamic_Arena, loc := #caller_locatio } @(private, require_results) -_dynamic_arena_alloc_ptr :: proc(pool: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { - data, err := dynamic_arena_alloc(pool, size, loc) +_dynamic_arena_alloc_ptr :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc(a, size, loc) return raw_data(data), err } @(require_results) -dynamic_arena_alloc :: proc(p: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { - bytes, err := dynamic_arena_alloc_non_zeroed(p, size, loc) +dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { + bytes, err := dynamic_arena_alloc_non_zeroed(a, size, loc) if bytes != nil { zero_slice(bytes) } @@ -895,56 +895,91 @@ dynamic_arena_alloc :: proc(p: ^Dynamic_Arena, size: int, loc := #caller_locatio } @(require_results) -dynamic_arena_alloc_non_zeroed :: proc(p: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { - n := align_formula(size, p.alignment) - if n > p.block_size { +dynamic_arena_alloc_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { + n := align_formula(size, a.alignment) + if n > a.block_size { return nil, .Invalid_Argument } - if n >= p.out_band_size { - assert(p.block_allocator.procedure != nil, "Backing block allocator must be initialized", loc=loc) - memory, err := alloc_bytes_non_zeroed(p.block_size, p.alignment, p.block_allocator, loc) + if n >= a.out_band_size { + assert(a.block_allocator.procedure != nil, "Backing block allocator must be initialized", loc=loc) + memory, err := alloc_bytes_non_zeroed(a.block_size, a.alignment, a.block_allocator, loc) if memory != nil { - append(&p.out_band_allocations, raw_data(memory), loc = loc) + append(&a.out_band_allocations, raw_data(memory), loc = loc) } return memory, err } - if p.bytes_left < n { - err := _dynamic_arena_cycle_new_block(p, loc) + if a.bytes_left < n { + err := _dynamic_arena_cycle_new_block(a, loc) if err != nil { return nil, err } - if p.current_block == nil { + if a.current_block == nil { return nil, .Out_Of_Memory } } - memory := p.current_pos - p.current_pos = ([^]byte)(p.current_pos)[n:] - p.bytes_left -= n + memory := a.current_pos + a.current_pos = ([^]byte)(a.current_pos)[n:] + a.bytes_left -= n return ([^]byte)(memory)[:size], nil } -dynamic_arena_reset :: proc(p: ^Dynamic_Arena, loc := #caller_location) { - if p.current_block != nil { - append(&p.unused_blocks, p.current_block, loc=loc) - p.current_block = nil +dynamic_arena_reset :: proc(a: ^Dynamic_Arena, loc := #caller_location) { + if a.current_block != nil { + append(&a.unused_blocks, a.current_block, loc=loc) + a.current_block = nil } - for block in p.used_blocks { - append(&p.unused_blocks, block, loc=loc) + for block in a.used_blocks { + append(&a.unused_blocks, block, loc=loc) } - clear(&p.used_blocks) - for a in p.out_band_allocations { - free(a, p.block_allocator, loc=loc) + clear(&a.used_blocks) + for a in a.out_band_allocations { + free(a, a.block_allocator, loc=loc) } - clear(&p.out_band_allocations) - p.bytes_left = 0 // Make new allocations call `_dynamic_arena_cycle_new_block` again. + clear(&a.out_band_allocations) + a.bytes_left = 0 // Make new allocations call `_dynamic_arena_cycle_new_block` again. } -dynamic_arena_free_all :: proc(p: ^Dynamic_Arena) { - dynamic_arena_reset(p) - for block in p.unused_blocks { - free(block, p.block_allocator) +dynamic_arena_free_all :: proc(a: ^Dynamic_Arena, loc := #caller_location) { + dynamic_arena_reset(a) + for block in a.unused_blocks { + free(block, a.block_allocator, loc) } - clear(&p.unused_blocks) + clear(&a.unused_blocks) +} + +dynamic_arena_resize :: proc( + a: ^Dynamic_Arena, + old_memory: rawptr, + old_size: int, + size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := dynamic_arena_resize_non_zeroed(a, old_memory, old_size, size, loc) + if bytes != nil { + if old_memory == nil { + zero_slice(bytes) + } else if size > old_size { + zero_slice(bytes[old_size:]) + } + } + return bytes, err +} + +dynamic_arena_resize_non_zeroed :: proc( + a: ^Dynamic_Arena, + old_memory: rawptr, + old_size: int, + size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + if old_size >= size { + return byte_slice(old_memory, size), nil + } + data, err := dynamic_arena_alloc_non_zeroed(a, size, loc) + if err == nil { + runtime.copy(data, byte_slice(old_memory, old_size)) + } + return data, err } dynamic_arena_allocator_proc :: proc( @@ -956,35 +991,26 @@ dynamic_arena_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - pool := (^Dynamic_Arena)(allocator_data) - + arena := (^Dynamic_Arena)(allocator_data) switch mode { case .Alloc: - return dynamic_arena_alloc(pool, size, loc) + return dynamic_arena_alloc(arena, size, loc) case .Alloc_Non_Zeroed: - return dynamic_arena_alloc_non_zeroed(pool, size, loc) + return dynamic_arena_alloc_non_zeroed(arena, size, loc) case .Free: return nil, .Mode_Not_Implemented case .Free_All: - dynamic_arena_free_all(pool) - return nil, nil - case .Resize, .Resize_Non_Zeroed: - if old_size >= size { - return byte_slice(old_memory, size), nil - } - data, err := dynamic_arena_alloc(pool, size) - if err == nil { - runtime.copy(data, byte_slice(old_memory, old_size)) - } - return data, err - + dynamic_arena_free_all(arena, loc) + case .Resize: + return dynamic_arena_resize(arena, old_memory, old_size, size, loc) + case .Resize_Non_Zeroed: + return dynamic_arena_resize_non_zeroed(arena, old_memory, old_size, size, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Alloc, .Alloc_Non_Zeroed, .Free_All, .Resize, .Resize_Non_Zeroed, .Query_Features, .Query_Info} } return nil, nil - case .Query_Info: info := (^Allocator_Query_Info)(old_memory) if info != nil && info.pointer != nil { From 6d3cffa13c4e43400eaaa33a0c551cef5cd3e44c Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 13:14:58 +1100 Subject: [PATCH 035/320] [mem]: Add @require_results to all functions returning values --- core/mem/allocators.odin | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index d7e3cfbfd..1efc60033 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -56,6 +56,7 @@ init_arena :: proc(a: ^Arena, data: []byte) { a.temp_count = 0 } +@(require_results) arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { bytes, err := arena_alloc_non_zeroed(a, size, alignment) if bytes != nil { @@ -64,6 +65,7 @@ arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([] return bytes, err } +@(require_results) arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { #no_bounds_check end := &a.data[a.offset] ptr := align_forward(end, uintptr(alignment)) @@ -173,6 +175,7 @@ scratch_destroy :: proc(s: ^Scratch) { s^ = {} } +@(require_results) scratch_alloc :: proc( s: ^Scratch, size: int, @@ -186,6 +189,7 @@ scratch_alloc :: proc( return bytes, err } +@(require_results) scratch_alloc_non_zeroed :: proc( s: ^Scratch, size: int, @@ -239,6 +243,7 @@ scratch_alloc_non_zeroed :: proc( return ptr, err } +@(require_results) scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error { if s.data == nil { panic("Free on an uninitialized scratch allocator", loc) @@ -283,6 +288,7 @@ scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { clear(&s.leaked_allocations) } +@(require_results) scratch_resize :: proc( s: ^Scratch, old_memory: rawptr, @@ -298,6 +304,7 @@ scratch_resize :: proc( return bytes, err } +@(require_results) scratch_resize_non_zeroed :: proc( s: ^Scratch, old_memory: rawptr, @@ -404,6 +411,7 @@ init_stack :: proc(s: ^Stack, data: []byte) { s.peak_used = 0 } +@(require_results) stack_alloc :: proc( s: ^Stack, size: int, @@ -417,6 +425,7 @@ stack_alloc :: proc( return bytes, err } +@(require_results) stack_alloc_non_zeroed :: proc( s: ^Stack, size: int, @@ -446,6 +455,7 @@ stack_alloc_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } +@(require_results) stack_free :: proc( s: ^Stack, old_memory: rawptr, @@ -486,6 +496,7 @@ stack_free_all :: proc(s: ^Stack, loc := #caller_location) { s.curr_offset = 0 } +@(require_results) stack_resize :: proc( s: ^Stack, old_memory: rawptr, @@ -505,6 +516,7 @@ stack_resize :: proc( return bytes, err } +@(require_results) stack_resize_non_zeroed :: proc( s: ^Stack, old_memory: rawptr, @@ -626,6 +638,7 @@ small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { } } +@(require_results) small_stack_alloc :: proc( s: ^Small_Stack, size: int, @@ -639,6 +652,7 @@ small_stack_alloc :: proc( return bytes, err } +@(require_results) small_stack_alloc_non_zeroed :: proc( s: ^Small_Stack, size: int, @@ -664,6 +678,7 @@ small_stack_alloc_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } +@(require_results) small_stack_free :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -693,6 +708,7 @@ small_stack_free_all :: proc(s: ^Small_Stack) { s.offset = 0 } +@(require_results) small_stack_resize :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -712,6 +728,7 @@ small_stack_resize :: proc( return bytes, err } +@(require_results) small_stack_resize_non_zeroed :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -932,8 +949,8 @@ dynamic_arena_reset :: proc(a: ^Dynamic_Arena, loc := #caller_location) { append(&a.unused_blocks, block, loc=loc) } clear(&a.used_blocks) - for a in a.out_band_allocations { - free(a, a.block_allocator, loc=loc) + for allocation in a.out_band_allocations { + free(allocation, a.block_allocator, loc=loc) } clear(&a.out_band_allocations) a.bytes_left = 0 // Make new allocations call `_dynamic_arena_cycle_new_block` again. @@ -947,6 +964,7 @@ dynamic_arena_free_all :: proc(a: ^Dynamic_Arena, loc := #caller_location) { clear(&a.unused_blocks) } +@(require_results) dynamic_arena_resize :: proc( a: ^Dynamic_Arena, old_memory: rawptr, @@ -965,6 +983,7 @@ dynamic_arena_resize :: proc( return bytes, err } +@(require_results) dynamic_arena_resize_non_zeroed :: proc( a: ^Dynamic_Arena, old_memory: rawptr, @@ -1014,8 +1033,8 @@ dynamic_arena_allocator_proc :: proc( case .Query_Info: info := (^Allocator_Query_Info)(old_memory) if info != nil && info.pointer != nil { - info.size = pool.block_size - info.alignment = pool.alignment + info.size = arena.block_size + info.alignment = arena.alignment return byte_slice(info, size_of(info^)), nil } return nil, nil @@ -1033,7 +1052,6 @@ panic_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - switch mode { case .Alloc: if size > 0 { @@ -1057,7 +1075,6 @@ panic_allocator_proc :: proc( } case .Free_All: panic("mem: panic allocator, .Free_All called", loc=loc) - case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -1068,7 +1085,6 @@ panic_allocator_proc :: proc( case .Query_Info: panic("mem: panic allocator, .Query_Info called", loc=loc) } - return nil, nil } @@ -1080,6 +1096,8 @@ panic_allocator :: proc() -> Allocator { } } + + Buddy_Block :: struct #align(align_of(uint)) { size: uint, is_free: bool, From c0e17808d46be70b461c020c9c320349e2f99ad9 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 13:26:09 +1100 Subject: [PATCH 036/320] [mem]: Split alloc and alloc_non_zeroed for buddy allocator --- core/mem/allocators.odin | 59 ++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 1efc60033..45c80e678 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1133,7 +1133,6 @@ buddy_block_coalescence :: proc(head, tail: ^Buddy_Block) { // Keep looping until there are no more buddies to coalesce block := head buddy := buddy_block_next(block) - no_coalescence := true for block < tail && buddy < tail { // make sure the buddies are within the range if block.is_free && buddy.is_free && block.size == buddy.size { @@ -1156,7 +1155,6 @@ buddy_block_coalescence :: proc(head, tail: ^Buddy_Block) { } } } - if no_coalescence { return } @@ -1166,17 +1164,14 @@ buddy_block_coalescence :: proc(head, tail: ^Buddy_Block) { @(require_results) buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Block { assert(size != 0) - best_block: ^Buddy_Block block := head // left buddy := buddy_block_next(block) // right - // The entire memory section between head and tail is free, // just call 'buddy_block_split' to get the allocation if buddy == tail && block.is_free { return buddy_block_split(block, size) } - // Find the block which is the 'best_block' to requested allocation sized for block < tail && buddy < tail { // make sure the buddies are within the range // If both buddies are free, coalesce them together @@ -1187,7 +1182,6 @@ buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Bl if size <= block.size && (best_block == nil || block.size <= best_block.size) { best_block = block } - block = buddy_block_next(buddy) if block < tail { // Delay the buddy block for the next iteration @@ -1195,20 +1189,16 @@ buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Bl } continue } - - if block.is_free && size <= block.size && (best_block == nil || block.size <= best_block.size) { best_block = block } - if buddy.is_free && size <= buddy.size && (best_block == nil || buddy.size < best_block.size) { // If each buddy are the same size, then it makes more sense // to pick the buddy as it "bounces around" less best_block = buddy } - if (block.size <= buddy.size) { block = buddy_block_next(buddy) if (block < tail) { @@ -1221,12 +1211,10 @@ buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Bl buddy = buddy_block_next(buddy) } } - if best_block != nil { // This will handle the case if the 'best_block' is also the perfect fit return buddy_block_split(best_block, size) } - // Maybe out of memory return nil } @@ -1245,26 +1233,20 @@ buddy_allocator :: proc(b: ^Buddy_Allocator) -> Allocator { } } -buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint) { +buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint, loc := #caller_location) { assert(data != nil) - assert(is_power_of_two(uintptr(len(data)))) - assert(is_power_of_two(uintptr(alignment))) - + assert(is_power_of_two(uintptr(len(data))), "Size of the backing buffer must be power of two", loc) + assert(is_power_of_two(uintptr(alignment)), "Alignment must be a power of two", loc) alignment := alignment if alignment < size_of(Buddy_Block) { alignment = size_of(Buddy_Block) } - ptr := raw_data(data) - assert(uintptr(ptr) % uintptr(alignment) == 0, "data is not aligned to minimum alignment") - + assert(uintptr(ptr) % uintptr(alignment) == 0, "data is not aligned to minimum alignment", loc) b.head = (^Buddy_Block)(ptr) - b.head.size = len(data) b.head.is_free = true - b.tail = buddy_block_next(b.head) - b.alignment = alignment } @@ -1274,19 +1256,25 @@ buddy_block_size_required :: proc(b: ^Buddy_Allocator, size: uint) -> uint { actual_size := b.alignment size += size_of(Buddy_Block) size = align_forward_uint(size, b.alignment) - for size > actual_size { actual_size <<= 1 } - return actual_size } @(require_results) -buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint, zeroed: bool) -> ([]byte, Allocator_Error) { +buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { + bytes, err := buddy_allocator_alloc_non_zeroed(b, size) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + +@(require_results) +buddy_allocator_alloc_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { if size != 0 { actual_size := buddy_block_size_required(b, size) - found := buddy_block_find_best(b.head, b.tail, actual_size) if found != nil { // Try to coalesce all the free buddy blocks and then search again @@ -1297,32 +1285,28 @@ buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint, zeroed: bool) -> return nil, .Out_Of_Memory } found.is_free = false - data := ([^]byte)(found)[b.alignment:][:size] - if zeroed { - zero_slice(data) - } return data, nil } return nil, nil } +@(require_results) buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Error { if ptr != nil { if !(b.head <= ptr && ptr <= b.tail) { return .Invalid_Pointer } - block := (^Buddy_Block)(([^]byte)(ptr)[-b.alignment:]) block.is_free = true - buddy_block_coalescence(b.head, b.tail) } return nil } buddy_allocator_proc :: proc( - allocator_data: rawptr, mode: Allocator_Mode, + allocator_data: rawptr, + mode: Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, @@ -1330,10 +1314,11 @@ buddy_allocator_proc :: proc( ) -> ([]byte, Allocator_Error) { b := (^Buddy_Allocator)(allocator_data) - switch mode { - case .Alloc, .Alloc_Non_Zeroed: - return buddy_allocator_alloc(b, uint(size), mode == .Alloc) + case .Alloc: + return buddy_allocator_alloc(b, uint(size)) + case .Alloc_Non_Zeroed: + return buddy_allocator_alloc_non_zeroed(b, uint(size)) case .Resize: return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, buddy_allocator(b)) case .Resize_Non_Zeroed: @@ -1341,13 +1326,11 @@ buddy_allocator_proc :: proc( case .Free: return nil, buddy_allocator_free(b, old_memory) case .Free_All: - alignment := b.alignment head := ([^]byte)(b.head) tail := ([^]byte)(b.tail) data := head[:ptr_sub(tail, head)] buddy_allocator_init(b, data, alignment) - case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { From c0112d1c70e369dd4f4704d577c7ff6e8ef17282 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 13:27:17 +1100 Subject: [PATCH 037/320] [mem]: Add free_all for buddy allocator --- core/mem/allocators.odin | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 45c80e678..5fedbd4d6 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1304,6 +1304,14 @@ buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Erro return nil } +buddy_allocator_free_all :: proc(b: ^Buddy_Allocator) { + alignment := b.alignment + head := ([^]byte)(b.head) + tail := ([^]byte)(b.tail) + data := head[:ptr_sub(tail, head)] + buddy_allocator_init(b, data, alignment) +} + buddy_allocator_proc :: proc( allocator_data: rawptr, mode: Allocator_Mode, @@ -1312,7 +1320,6 @@ buddy_allocator_proc :: proc( old_size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - b := (^Buddy_Allocator)(allocator_data) switch mode { case .Alloc: @@ -1326,18 +1333,13 @@ buddy_allocator_proc :: proc( case .Free: return nil, buddy_allocator_free(b, old_memory) case .Free_All: - alignment := b.alignment - head := ([^]byte)(b.head) - tail := ([^]byte)(b.tail) - data := head[:ptr_sub(tail, head)] - buddy_allocator_init(b, data, alignment) + buddy_allocator_free_all(b) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Query_Features, .Alloc, .Alloc_Non_Zeroed, .Resize, .Resize_Non_Zeroed, .Free, .Free_All, .Query_Info} } return nil, nil - case .Query_Info: info := (^Allocator_Query_Info)(old_memory) if info != nil && info.pointer != nil { @@ -1345,7 +1347,6 @@ buddy_allocator_proc :: proc( if !(b.head <= ptr && ptr <= b.tail) { return nil, .Invalid_Pointer } - block := (^Buddy_Block)(([^]byte)(ptr)[-b.alignment:]) info.size = int(block.size) info.alignment = int(b.alignment) @@ -1353,6 +1354,5 @@ buddy_allocator_proc :: proc( } return nil, nil } - return nil, nil } From 64814f4199c8d89a3fb0ed7013aa20321a0b34d5 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 14:19:50 +1100 Subject: [PATCH 038/320] [mem]: Document the package --- core/mem/doc.odin | 111 ++++++++++++++++++++++++------- core/mem/tracking_allocator.odin | 31 +++++++++ 2 files changed, 119 insertions(+), 23 deletions(-) diff --git a/core/mem/doc.odin b/core/mem/doc.odin index 44c93f798..b152d0738 100644 --- a/core/mem/doc.odin +++ b/core/mem/doc.odin @@ -1,34 +1,99 @@ /* -package mem implements various types of allocators. +The `mem` package implements various allocators and provides utility functions +for dealing with memory, pointers and slices. +The documentation below describes basic concepts, applicable to the `mem` +package. -An example of how to use the `Tracking_Allocator` to track subsequent allocations -in your program and report leaks and bad frees: +## Pointers, multipointers, and slices -Example: - package foo +A *pointer* is an abstraction of an *address*, a numberic value representing the +location of an object in memory. That object is said to be *pointed to* by the +pointer. To obtain the address of a pointer, cast it to `uintptr`. - import "core:mem" - import "core:fmt" +A multipointer is a pointer that points to multiple objects. Unlike a pointer, +a multipointer can be indexed, but does not have a definite length. A slice is +a pointer that points to multiple objects equipped with the length, specifying +the amount of objects a slice points to. - _main :: proc() { - // do stuff - } +When object's values are read through a pointer, that operation is called a +*load* operation. When memory is read through a pointer, that operation is +called a *store* operation. Both of these operations can be called a *memory +access operation*. - main :: proc() { - track: mem.Tracking_Allocator - mem.tracking_allocator_init(&track, context.allocator) - defer mem.tracking_allocator_destroy(&track) - context.allocator = mem.tracking_allocator(&track) +## Allocators - _main() +In C and C++ memory models, allocations of objects in memory are typically +treated individually with a generic allocator (The `malloc` function). Which in +some scenarios can lead to poor cache utilization, slowdowns on individual +objects' memory management and growing complexity of the code needing to keep +track of the pointers and their lifetimes. - for _, leak in track.allocation_map { - fmt.printf("%v leaked %m\n", leak.location, leak.size) - } - for bad_free in track.bad_free_array { - fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) - } - } +Using different kinds of *allocators* for different purposes can solve these +problems. The allocators are typically optimized for specific use-cases and +can potentially simplify the memory management code. + +For example, in the context of making a game, having an Arena allocator could +simplify allocations of any temporary memory, because the programmer doesn't +have to keep track of which objects need to be freed every time they are +allocated, because at the end of every frame the whole allocator is reset to +its initial state and all objects are freed at once. + +The allocators have different kinds of restrictions on object lifetimes, sizes, +alignment and can be a significant gain, if used properly. Odin supports +allocators on a language level. + +Operations such as `new`, `free` and `delete` by default will use +`context.allocator`, which can be overridden by the user. When an override +happens all called functions will inherit the new context and use the same +allocator. + +## Alignment + +An address is said to be *aligned to `N` bytes*, if the addresses's numeric +value is divisible by `N`. The number `N` in this case can be referred to as +the *alignment boundary*. Typically an alignment is a power of two integer +value. + +A *natural alignment* of an object is typically equal to its size. For example +a 16 bit integer has a natural alignment of 2 bytes. When an object is not +located on its natural alignment boundary, accesses to that object are +considered *unaligned*. + +Some machines issue a hardware **exception**, or experience **slowdowns** when a +memory access operation occurs from an unaligned address. Examples of such +operations are: + +- SIMD instructions on x86. These instructions require all memory accesses to be + on an address that is aligned to 16 bytes. +- On ARM unaligned loads have an extra cycle penalty. + +As such, many operations that allocate memory in this package allow to +explicitly specify the alignment of allocated pointers/slices. The default +alignment for all operations is specified in a constant `mem.DEFAULT_ALIGNMENT`. + +## Zero by default + +Whenever new memory is allocated, via an allocator, or on the stack, by default +Odin will zero-initialize that memory, even if it wasn't explicitly +initialized. This allows for some convenience in certain scenarios and ease of +debugging, which will not be described in detail here. + +However zero-initialization can be a cause of slowdowns, when allocating large +buffers. For this reason, allocators have `*_non_zeroed` modes of allocation +that allow the user to request for uninitialized memory and will avoid a +relatively expensive zero-filling of the buffer. + +## Naming conventions + +The word `size` is used to denote the **size in bytes**. The word `length` is +used to denote the count of objects. + +Higher-level allocation functions follow the following naming scheme: + +- `new`: Allocates a single object +- `free`: Free a single object (opposite of `new`) +- `make`: Allocate a group of objects +- `delete`: Free a group of objects (opposite of `make`) */ package mem diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index 356180be1..e75844130 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -18,6 +18,37 @@ Tracking_Allocator_Bad_Free_Entry :: struct { location: runtime.Source_Code_Location, } +/* +An example of how to use the `Tracking_Allocator` to track subsequent allocations +in your program and report leaks and bad frees: + +Example: + + package foo + + import "core:mem" + import "core:fmt" + + _main :: proc() { + // do stuff + } + + main :: proc() { + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + defer mem.tracking_allocator_destroy(&track) + context.allocator = mem.tracking_allocator(&track) + + _main() + + for _, leak in track.allocation_map { + fmt.printf("%v leaked %m\n", leak.location, leak.size) + } + for bad_free in track.bad_free_array { + fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) + } + } +*/ Tracking_Allocator :: struct { backing: Allocator, allocation_map: map[rawptr]Tracking_Allocator_Entry, From 2d988bbc5f21fd7e07926c93b01996a392b5a92d Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 14:45:15 +1100 Subject: [PATCH 039/320] [mem]: Rename alloc to alloc_bytes and add alloc --- core/mem/allocators.odin | 295 ++++++++++++++++++++++++++++++++------- 1 file changed, 248 insertions(+), 47 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 5fedbd4d6..acbc202e6 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -57,8 +57,14 @@ init_arena :: proc(a: ^Arena, data: []byte) { } @(require_results) -arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { - bytes, err := arena_alloc_non_zeroed(a, size, alignment) +arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> (rawptr, Allocator_Error) { + bytes, err := arena_alloc_bytes(a, size, alignment) + return raw_data(bytes), err +} + +@(require_results) +arena_alloc_bytes :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { + bytes, err := arena_alloc_bytes_non_zeroed(a, size, alignment) if bytes != nil { zero_slice(bytes) } @@ -66,7 +72,13 @@ arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([] } @(require_results) -arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { +arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> (rawptr, Allocator_Error) { + bytes, err := arena_alloc_bytes_non_zeroed(a, size, alignment) + return raw_data(bytes), err +} + +@(require_results) +arena_alloc_bytes_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { #no_bounds_check end := &a.data[a.offset] ptr := align_forward(end, uintptr(alignment)) total_size := size + ptr_sub((^byte)(ptr), (^byte)(end)) @@ -94,9 +106,9 @@ arena_allocator_proc :: proc( arena := cast(^Arena)allocator_data switch mode { case .Alloc: - return arena_alloc(arena, size, alignment) + return arena_alloc_bytes(arena, size, alignment) case .Alloc_Non_Zeroed: - return arena_alloc_non_zeroed(arena, size, alignment) + return arena_alloc_bytes_non_zeroed(arena, size, alignment) case .Free: return nil, .Mode_Not_Implemented case .Free_All: @@ -181,8 +193,19 @@ scratch_alloc :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := scratch_alloc_bytes(s, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +scratch_alloc_bytes :: proc( + s: ^Scratch, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := scratch_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := scratch_alloc_bytes_non_zeroed(s, size, alignment, loc) if bytes != nil { zero_slice(bytes) } @@ -195,6 +218,17 @@ scratch_alloc_non_zeroed :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := scratch_alloc_bytes_non_zeroed(s, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +scratch_alloc_bytes_non_zeroed :: proc( + s: ^Scratch, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { if s.data == nil { DEFAULT_BACKING_SIZE :: 4 * Megabyte @@ -296,8 +330,21 @@ scratch_resize :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location +) -> (rawptr, Allocator_Error) { + bytes, err := scratch_resize_bytes(s, old_memory, old_size, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +scratch_resize_bytes :: proc( + s: ^Scratch, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location ) -> ([]byte, Allocator_Error) { - bytes, err := scratch_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + bytes, err := scratch_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) if bytes != nil && size > old_size { zero_slice(bytes[size:]) } @@ -312,6 +359,19 @@ scratch_resize_non_zeroed :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location +) -> (rawptr, Allocator_Error) { + bytes, err := scratch_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +scratch_resize_bytes_non_zeroed :: proc( + s: ^Scratch, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location ) -> ([]byte, Allocator_Error) { if s.data == nil { DEFAULT_BACKING_SIZE :: 4 * Megabyte @@ -328,7 +388,7 @@ scratch_resize_non_zeroed :: proc( s.curr_offset = int(old_ptr-begin)+size return byte_slice(old_memory, size), nil } - data, err := scratch_alloc_non_zeroed(s, size, alignment, loc) + data, err := scratch_alloc_bytes_non_zeroed(s, size, alignment, loc) if err != nil { return data, err } @@ -350,17 +410,17 @@ scratch_allocator_proc :: proc( size := size switch mode { case .Alloc: - return scratch_alloc(s, size, alignment, loc) + return scratch_alloc_bytes(s, size, alignment, loc) case .Alloc_Non_Zeroed: - return scratch_alloc_non_zeroed(s, size, alignment, loc) + return scratch_alloc_bytes_non_zeroed(s, size, alignment, loc) case .Free: return nil, scratch_free(s, old_memory, loc) case .Free_All: scratch_free_all(s, loc) case .Resize: - return scratch_resize(s, old_memory, old_size, size, alignment, loc) + return scratch_resize_bytes(s, old_memory, old_size, size, alignment, loc) case .Resize_Non_Zeroed: - return scratch_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return scratch_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -417,8 +477,19 @@ stack_alloc :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location +) -> (rawptr, Allocator_Error) { + bytes, err := stack_alloc_bytes(s, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +stack_alloc_bytes :: proc( + s: ^Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location ) -> ([]byte, Allocator_Error) { - bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := stack_alloc_bytes_non_zeroed(s, size, alignment, loc) if bytes != nil { zero_slice(bytes) } @@ -431,6 +502,17 @@ stack_alloc_non_zeroed :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location +) -> (rawptr, Allocator_Error) { + bytes, err := stack_alloc_bytes_non_zeroed(s, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +stack_alloc_bytes_non_zeroed :: proc( + s: ^Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location ) -> ([]byte, Allocator_Error) { if s.data == nil { panic("Stack allocation on an uninitialized stack allocator", loc) @@ -496,6 +578,7 @@ stack_free_all :: proc(s: ^Stack, loc := #caller_location) { s.curr_offset = 0 } + @(require_results) stack_resize :: proc( s: ^Stack, @@ -504,8 +587,21 @@ stack_resize :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := stack_resize_bytes(s, old_memory, old_size, size, alignment) + return raw_data(bytes), err +} + +@(require_results) +stack_resize_bytes :: proc( + s: ^Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := stack_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := stack_alloc_bytes_non_zeroed(s, size, alignment, loc) if bytes != nil { if old_memory == nil { zero_slice(bytes) @@ -524,12 +620,25 @@ stack_resize_non_zeroed :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment) + return raw_data(bytes), err +} + +@(require_results) +stack_resize_bytes_non_zeroed :: proc( + s: ^Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { if s.data == nil { panic("Stack free all on an uninitialized stack allocator", loc) } if old_memory == nil { - return stack_alloc_non_zeroed(s, size, alignment, loc) + return stack_alloc_bytes_non_zeroed(s, size, alignment, loc) } if size == 0 { return nil, nil @@ -550,7 +659,7 @@ stack_resize_non_zeroed :: proc( header := (^Stack_Allocation_Header)(curr_addr - size_of(Stack_Allocation_Header)) old_offset := int(curr_addr - uintptr(header.padding) - uintptr(raw_data(s.data))) if old_offset != header.prev_offset { - data, err := stack_alloc_non_zeroed(s, size, alignment, loc) + data, err := stack_alloc_bytes_non_zeroed(s, size, alignment, loc) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -581,17 +690,17 @@ stack_allocator_proc :: proc( } switch mode { case .Alloc: - return stack_alloc(s, size, alignment, loc) + return stack_alloc_bytes(s, size, alignment, loc) case .Alloc_Non_Zeroed: - return stack_alloc_non_zeroed(s, size, alignment, loc) + return stack_alloc_bytes_non_zeroed(s, size, alignment, loc) case .Free: return nil, stack_free(s, old_memory, loc) case .Free_All: stack_free_all(s, loc) case .Resize: - return stack_resize(s, old_memory, old_size, size, alignment, loc) + return stack_resize_bytes(s, old_memory, old_size, size, alignment, loc) case .Resize_Non_Zeroed: - return stack_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -644,8 +753,19 @@ small_stack_alloc :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := small_stack_alloc_bytes(s, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +small_stack_alloc_bytes :: proc( + s: ^Small_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := small_stack_alloc_non_zeroed(s, size, alignment, loc) + bytes, err := small_stack_alloc_bytes_non_zeroed(s, size, alignment, loc) if bytes != nil { zero_slice(bytes) } @@ -658,6 +778,17 @@ small_stack_alloc_non_zeroed :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := small_stack_alloc_bytes_non_zeroed(s, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +small_stack_alloc_bytes_non_zeroed :: proc( + s: ^Small_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { if s.data == nil { return nil, .Invalid_Argument @@ -716,8 +847,21 @@ small_stack_resize :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := small_stack_resize_bytes(s, old_memory, old_size, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +small_stack_resize_bytes :: proc( + s: ^Small_Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := small_stack_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + bytes, err := small_stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) if bytes != nil { if old_memory == nil { zero_slice(bytes) @@ -736,11 +880,24 @@ small_stack_resize_non_zeroed :: proc( size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := small_stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return raw_data(bytes), err +} + +@(require_results) +small_stack_resize_bytes_non_zeroed :: proc( + s: ^Small_Stack, + old_memory: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { alignment := alignment alignment = clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) if old_memory == nil { - return small_stack_alloc_non_zeroed(s, size, alignment, loc) + return small_stack_alloc_bytes_non_zeroed(s, size, alignment, loc) } if size == 0 { return nil, nil @@ -759,7 +916,7 @@ small_stack_resize_non_zeroed :: proc( if old_size == size { return byte_slice(old_memory, size), nil } - data, err := small_stack_alloc_non_zeroed(s, size, alignment, loc) + data, err := small_stack_alloc_bytes_non_zeroed(s, size, alignment, loc) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -781,17 +938,17 @@ small_stack_allocator_proc :: proc( } switch mode { case .Alloc: - return small_stack_alloc(s, size, alignment, loc) + return small_stack_alloc_bytes(s, size, alignment, loc) case .Alloc_Non_Zeroed: - return small_stack_alloc_non_zeroed(s, size, alignment, loc) + return small_stack_alloc_bytes_non_zeroed(s, size, alignment, loc) case .Free: return nil, small_stack_free(s, old_memory, loc) case .Free_All: small_stack_free_all(s) case .Resize: - return small_stack_resize(s, old_memory, old_size, size, alignment, loc) + return small_stack_resize_bytes(s, old_memory, old_size, size, alignment, loc) case .Resize_Non_Zeroed: - return small_stack_resize_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return small_stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -805,19 +962,21 @@ small_stack_allocator_proc :: proc( } -/* old stuff */ +/* Preserved for compatibility */ Dynamic_Pool :: Dynamic_Arena DYNAMIC_POOL_BLOCK_SIZE_DEFAULT :: DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT :: DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT dynamic_pool_allocator_proc :: dynamic_arena_allocator_proc dynamic_pool_free_all :: dynamic_arena_free_all dynamic_pool_reset :: dynamic_arena_reset -dynamic_pool_alloc_bytes :: dynamic_arena_alloc -dynamic_pool_alloc :: _dynamic_arena_alloc_ptr +dynamic_pool_alloc_bytes :: dynamic_arena_alloc_bytes +dynamic_pool_alloc :: dynamic_arena_alloc dynamic_pool_init :: dynamic_arena_init dynamic_pool_allocator :: dynamic_arena_allocator dynamic_pool_destroy :: dynamic_arena_destroy + + DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT :: 65536 DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT :: 6554 @@ -897,14 +1056,14 @@ _dynamic_arena_cycle_new_block :: proc(p: ^Dynamic_Arena, loc := #caller_locatio } @(private, require_results) -_dynamic_arena_alloc_ptr :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { - data, err := dynamic_arena_alloc(a, size, loc) +dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc_bytes(a, size, loc) return raw_data(data), err } @(require_results) -dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { - bytes, err := dynamic_arena_alloc_non_zeroed(a, size, loc) +dynamic_arena_alloc_bytes :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { + bytes, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) if bytes != nil { zero_slice(bytes) } @@ -912,7 +1071,13 @@ dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_locatio } @(require_results) -dynamic_arena_alloc_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { +dynamic_arena_alloc_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) + return raw_data(data), err +} + +@(require_results) +dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { n := align_formula(size, a.alignment) if n > a.block_size { return nil, .Invalid_Argument @@ -971,8 +1136,20 @@ dynamic_arena_resize :: proc( old_size: int, size: int, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := dynamic_arena_resize_bytes(a, old_memory, old_size, size, loc) + return raw_data(bytes), err +} + +@(require_results) +dynamic_arena_resize_bytes :: proc( + a: ^Dynamic_Arena, + old_memory: rawptr, + old_size: int, + size: int, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := dynamic_arena_resize_non_zeroed(a, old_memory, old_size, size, loc) + bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_memory, old_size, size, loc) if bytes != nil { if old_memory == nil { zero_slice(bytes) @@ -990,11 +1167,23 @@ dynamic_arena_resize_non_zeroed :: proc( old_size: int, size: int, loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_memory, old_size, size, loc) + return raw_data(bytes), err +} + +@(require_results) +dynamic_arena_resize_bytes_non_zeroed :: proc( + a: ^Dynamic_Arena, + old_memory: rawptr, + old_size: int, + size: int, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { if old_size >= size { return byte_slice(old_memory, size), nil } - data, err := dynamic_arena_alloc_non_zeroed(a, size, loc) + data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -1013,17 +1202,17 @@ dynamic_arena_allocator_proc :: proc( arena := (^Dynamic_Arena)(allocator_data) switch mode { case .Alloc: - return dynamic_arena_alloc(arena, size, loc) + return dynamic_arena_alloc_bytes(arena, size, loc) case .Alloc_Non_Zeroed: - return dynamic_arena_alloc_non_zeroed(arena, size, loc) + return dynamic_arena_alloc_bytes_non_zeroed(arena, size, loc) case .Free: return nil, .Mode_Not_Implemented case .Free_All: dynamic_arena_free_all(arena, loc) case .Resize: - return dynamic_arena_resize(arena, old_memory, old_size, size, loc) + return dynamic_arena_resize_bytes(arena, old_memory, old_size, size, loc) case .Resize_Non_Zeroed: - return dynamic_arena_resize_non_zeroed(arena, old_memory, old_size, size, loc) + return dynamic_arena_resize_bytes_non_zeroed(arena, old_memory, old_size, size, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -1263,8 +1452,14 @@ buddy_block_size_required :: proc(b: ^Buddy_Allocator, size: uint) -> uint { } @(require_results) -buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { - bytes, err := buddy_allocator_alloc_non_zeroed(b, size) +buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint) -> (rawptr, Allocator_Error) { + bytes, err := buddy_allocator_alloc_bytes(b, size) + return raw_data(bytes), err +} + +@(require_results) +buddy_allocator_alloc_bytes :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { + bytes, err := buddy_allocator_alloc_bytes_non_zeroed(b, size) if bytes != nil { zero_slice(bytes) } @@ -1272,7 +1467,13 @@ buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Alloc } @(require_results) -buddy_allocator_alloc_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { +buddy_allocator_alloc_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) -> (rawptr, Allocator_Error) { + bytes, err := buddy_allocator_alloc_bytes_non_zeroed(b, size) + return raw_data(bytes), err +} + +@(require_results) +buddy_allocator_alloc_bytes_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { if size != 0 { actual_size := buddy_block_size_required(b, size) found := buddy_block_find_best(b.head, b.tail, actual_size) @@ -1323,9 +1524,9 @@ buddy_allocator_proc :: proc( b := (^Buddy_Allocator)(allocator_data) switch mode { case .Alloc: - return buddy_allocator_alloc(b, uint(size)) + return buddy_allocator_alloc_bytes(b, uint(size)) case .Alloc_Non_Zeroed: - return buddy_allocator_alloc_non_zeroed(b, uint(size)) + return buddy_allocator_alloc_bytes_non_zeroed(b, uint(size)) case .Resize: return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, buddy_allocator(b)) case .Resize_Non_Zeroed: From 6017a20e1cde4c218ab05a754c747b6864e87394 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 15:11:04 +1100 Subject: [PATCH 040/320] [mem]: Make resize_bytes take a slice for the old memory --- core/mem/allocators.odin | 90 ++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index acbc202e6..34b89fcb8 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -331,21 +331,20 @@ scratch_resize :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> (rawptr, Allocator_Error) { - bytes, err := scratch_resize_bytes(s, old_memory, old_size, size, alignment, loc) + bytes, err := scratch_resize_bytes(s, byte_slice(old_memory, old_size), size, alignment, loc) return raw_data(bytes), err } @(require_results) scratch_resize_bytes :: proc( s: ^Scratch, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> ([]byte, Allocator_Error) { - bytes, err := scratch_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) - if bytes != nil && size > old_size { + bytes, err := scratch_resize_bytes_non_zeroed(s, old_data, size, alignment, loc) + if bytes != nil && size > len(old_data) { zero_slice(bytes[size:]) } return bytes, err @@ -360,19 +359,20 @@ scratch_resize_non_zeroed :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> (rawptr, Allocator_Error) { - bytes, err := scratch_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + bytes, err := scratch_resize_bytes_non_zeroed(s, byte_slice(old_memory, old_size), size, alignment, loc) return raw_data(bytes), err } @(require_results) scratch_resize_bytes_non_zeroed :: proc( s: ^Scratch, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location ) -> ([]byte, Allocator_Error) { + old_memory := raw_data(old_data) + old_size := len(old_data) if s.data == nil { DEFAULT_BACKING_SIZE :: 4 * Megabyte if !(context.allocator.procedure != scratch_allocator_proc && context.allocator.data != s) { @@ -418,9 +418,9 @@ scratch_allocator_proc :: proc( case .Free_All: scratch_free_all(s, loc) case .Resize: - return scratch_resize_bytes(s, old_memory, old_size, size, alignment, loc) + return scratch_resize_bytes(s, byte_slice(old_memory, old_size), size, alignment, loc) case .Resize_Non_Zeroed: - return scratch_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return scratch_resize_bytes_non_zeroed(s, byte_slice(old_memory, old_size), size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -588,25 +588,24 @@ stack_resize :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := stack_resize_bytes(s, old_memory, old_size, size, alignment) + bytes, err := stack_resize_bytes(s, byte_slice(old_memory, old_size), size, alignment) return raw_data(bytes), err } @(require_results) stack_resize_bytes :: proc( s: ^Stack, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { bytes, err := stack_alloc_bytes_non_zeroed(s, size, alignment, loc) if bytes != nil { - if old_memory == nil { + if old_data == nil { zero_slice(bytes) - } else if size > old_size { - zero_slice(bytes[old_size:]) + } else if size > len(old_data) { + zero_slice(bytes[len(old_data):]) } } return bytes, err @@ -621,19 +620,20 @@ stack_resize_non_zeroed :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment) + bytes, err := stack_resize_bytes_non_zeroed(s, byte_slice(old_memory, old_size), size, alignment) return raw_data(bytes), err } @(require_results) stack_resize_bytes_non_zeroed :: proc( s: ^Stack, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { + old_memory := raw_data(old_data) + old_size := len(old_data) if s.data == nil { panic("Stack free all on an uninitialized stack allocator", loc) } @@ -698,9 +698,9 @@ stack_allocator_proc :: proc( case .Free_All: stack_free_all(s, loc) case .Resize: - return stack_resize_bytes(s, old_memory, old_size, size, alignment, loc) + return stack_resize_bytes(s, byte_slice(old_memory, old_size), size, alignment, loc) case .Resize_Non_Zeroed: - return stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return stack_resize_bytes_non_zeroed(s, byte_slice(old_memory, old_size), size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -848,25 +848,24 @@ small_stack_resize :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := small_stack_resize_bytes(s, old_memory, old_size, size, alignment, loc) + bytes, err := small_stack_resize_bytes(s, byte_slice(old_memory, old_size), size, alignment, loc) return raw_data(bytes), err } @(require_results) small_stack_resize_bytes :: proc( s: ^Small_Stack, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := small_stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + bytes, err := small_stack_resize_bytes_non_zeroed(s, old_data, size, alignment, loc) if bytes != nil { - if old_memory == nil { + if old_data == nil { zero_slice(bytes) - } else if size > old_size { - zero_slice(bytes[old_size:]) + } else if size > len(old_data) { + zero_slice(bytes[len(old_data):]) } } return bytes, err @@ -881,19 +880,20 @@ small_stack_resize_non_zeroed :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := small_stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + bytes, err := small_stack_resize_bytes_non_zeroed(s, byte_slice(old_memory, old_size), size, alignment, loc) return raw_data(bytes), err } @(require_results) small_stack_resize_bytes_non_zeroed :: proc( s: ^Small_Stack, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { + old_memory := raw_data(old_data) + old_size := len(old_data) alignment := alignment alignment = clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) if old_memory == nil { @@ -946,9 +946,9 @@ small_stack_allocator_proc :: proc( case .Free_All: small_stack_free_all(s) case .Resize: - return small_stack_resize_bytes(s, old_memory, old_size, size, alignment, loc) + return small_stack_resize_bytes(s, byte_slice(old_memory, old_size), size, alignment, loc) case .Resize_Non_Zeroed: - return small_stack_resize_bytes_non_zeroed(s, old_memory, old_size, size, alignment, loc) + return small_stack_resize_bytes_non_zeroed(s, byte_slice(old_memory, old_size), size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -1137,24 +1137,23 @@ dynamic_arena_resize :: proc( size: int, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := dynamic_arena_resize_bytes(a, old_memory, old_size, size, loc) + bytes, err := dynamic_arena_resize_bytes(a, byte_slice(old_memory, old_size), size, loc) return raw_data(bytes), err } @(require_results) dynamic_arena_resize_bytes :: proc( a: ^Dynamic_Arena, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { - bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_memory, old_size, size, loc) + bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_data, size, loc) if bytes != nil { - if old_memory == nil { + if old_data == nil { zero_slice(bytes) - } else if size > old_size { - zero_slice(bytes[old_size:]) + } else if size > len(old_data) { + zero_slice(bytes[len(old_data):]) } } return bytes, err @@ -1168,18 +1167,19 @@ dynamic_arena_resize_non_zeroed :: proc( size: int, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_memory, old_size, size, loc) + bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, byte_slice(old_memory, old_size), size, loc) return raw_data(bytes), err } @(require_results) dynamic_arena_resize_bytes_non_zeroed :: proc( a: ^Dynamic_Arena, - old_memory: rawptr, - old_size: int, + old_data: []byte, size: int, loc := #caller_location, ) -> ([]byte, Allocator_Error) { + old_memory := raw_data(old_data) + old_size := len(old_data) if old_size >= size { return byte_slice(old_memory, size), nil } @@ -1210,9 +1210,9 @@ dynamic_arena_allocator_proc :: proc( case .Free_All: dynamic_arena_free_all(arena, loc) case .Resize: - return dynamic_arena_resize_bytes(arena, old_memory, old_size, size, loc) + return dynamic_arena_resize_bytes(arena, byte_slice(old_memory, old_size), size, loc) case .Resize_Non_Zeroed: - return dynamic_arena_resize_bytes_non_zeroed(arena, old_memory, old_size, size, loc) + return dynamic_arena_resize_bytes_non_zeroed(arena, byte_slice(old_memory, old_size), size, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { From 7c9d2f61f58f9ccb730da335dbd6573ec6e844b4 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 15:16:20 +1100 Subject: [PATCH 041/320] [mem]: Update package documentation --- core/mem/doc.odin | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/core/mem/doc.odin b/core/mem/doc.odin index b152d0738..5e8bcce6a 100644 --- a/core/mem/doc.odin +++ b/core/mem/doc.odin @@ -1,5 +1,5 @@ /* -The `mem` package implements various allocators and provides utility functions +The `mem` package implements various allocators and provides utility procedures for dealing with memory, pointers and slices. The documentation below describes basic concepts, applicable to the `mem` @@ -24,7 +24,7 @@ access operation*. ## Allocators In C and C++ memory models, allocations of objects in memory are typically -treated individually with a generic allocator (The `malloc` function). Which in +treated individually with a generic allocator (The `malloc` procedure). Which in some scenarios can lead to poor cache utilization, slowdowns on individual objects' memory management and growing complexity of the code needing to keep track of the pointers and their lifetimes. @@ -45,7 +45,7 @@ allocators on a language level. Operations such as `new`, `free` and `delete` by default will use `context.allocator`, which can be overridden by the user. When an override -happens all called functions will inherit the new context and use the same +happens all called procedures will inherit the new context and use the same allocator. ## Alignment @@ -89,7 +89,17 @@ relatively expensive zero-filling of the buffer. The word `size` is used to denote the **size in bytes**. The word `length` is used to denote the count of objects. -Higher-level allocation functions follow the following naming scheme: +The allocation procedures use the following conventions: + +- If the name contains `alloc_bytes` or `resize_bytes`, then the procedure takes + in slice parameters and returns slices. +- If the procedure name contains `alloc` or `resize`, then the procedure takes + in a raw pointer and returns raw pointers. +- If the procedure name contains `free_bytes`, then the procedure takes in a + slice. +- If the procedure name contains `free`, then the procedure takes in a pointer. + +Higher-level allocation procedures follow the following naming scheme: - `new`: Allocates a single object - `free`: Free a single object (opposite of `new`) From 3a351ec407af42aeb82ac4fb51f9b633422f59fb Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 18:01:41 +1100 Subject: [PATCH 042/320] [mem]: Document mem.odin --- core/mem/mem.odin | 458 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 409 insertions(+), 49 deletions(-) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 9e47c9602..c17ab43a9 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -3,23 +3,99 @@ package mem import "base:runtime" import "base:intrinsics" -Byte :: runtime.Byte -Kilobyte :: runtime.Kilobyte -Megabyte :: runtime.Megabyte -Gigabyte :: runtime.Gigabyte -Terabyte :: runtime.Terabyte -Petabyte :: runtime.Petabyte -Exabyte :: runtime.Exabyte +/* +The size, in bytes, of a single byte. +This constant is equal to the value of `1`. +*/ +Byte :: runtime.Byte + +/* +The size, in bytes, of one kilobyte. + +This constant is equal to the amount of bytes in one kilobyte (also known as +kibibyte), which is equal to 1024 bytes. +*/ +Kilobyte :: runtime.Kilobyte + +/* +The size, in bytes, of one megabyte. + +This constant is equal to the amount of bytes in one megabyte (also known as +mebibyte), which is equal to 1024 kilobyte. +*/ +Megabyte :: runtime.Megabyte + +/* +The size, in bytes, of one gigabyte. + +This constant is equal to the amount of bytes in one gigabyte (also known as +gibiibyte), which is equal to 1024 megabytes. +*/ +Gigabyte :: runtime.Gigabyte + +/* +The size, in bytes, of one terabyte. + +This constant is equal to the amount of bytes in one terabyte (also known as +tebiibyte), which is equal to 1024 gigabytes. +*/ +Terabyte :: runtime.Terabyte + +/* +The size, in bytes, of one petabyte. + +This constant is equal to the amount of bytes in one petabyte (also known as +pebiibyte), which is equal to 1024 terabytes. +*/ +Petabyte :: runtime.Petabyte + +/* +The size, in bytes, of one exabyte. + +This constant is equal to the amount of bytes in one exabyte (also known as +exbibyte), which is equal to 1024 petabytes. +*/ +Exabyte :: runtime.Exabyte + +/* +Set each byte of a memory range to a specific value. + +This procedure copies value specified by the `value` parameter into each of the +`len` bytes of a memory range, located at address `data`. + +This procedure returns the pointer to `data`. +*/ set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr { return runtime.memset(data, i32(value), len) } +/* +Set each byte of a memory range to zero. + +This procedure copies the value `0` into the `len` bytes of a memory range, +starting at address `data`. + +This procedure returns the pointer to `data`. +*/ zero :: proc "contextless" (data: rawptr, len: int) -> rawptr { intrinsics.mem_zero(data, len) return data } +/* +Set each byte of a memory range to zero. + +This procedure copies the value `0` into the `len` bytes of a memory range, +starting at address `data`. + +This procedure returns the pointer to `data`. + +Unlike the `zero()` procedure, which can be optimized away or reordered by the +compiler under certain circumstances, `zero_explicit()` procedure can not be +optimized away or reordered with other memory access operations, and the +compiler assumes volatile semantics of the memory. +*/ zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { // This routine tries to avoid the compiler optimizing away the call, // so that it is always executed. It is intended to provided @@ -30,26 +106,82 @@ zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { return data } +/* +Zero-fill the memory of an object. + +This procedure sets each byte of the object pointed to by the pointer `item` +to zero, and returns the pointer to `item`. +*/ zero_item :: proc "contextless" (item: $P/^$T) -> P { intrinsics.mem_zero(item, size_of(T)) return item } +/* +Zero-fill the memory of the slice. + +This procedure sets each byte of the slice pointed to by the slice `data` +to zero, and returns the slice `data`. +*/ zero_slice :: proc "contextless" (data: $T/[]$E) -> T { zero(raw_data(data), size_of(E)*len(data)) return data } +/* +Copy bytes from one memory range to another. + +This procedure copies `len` bytes of data, from the memory range pointed to by +the `src` pointer into the memory range pointed to by the `dst` pointer, and +returns the `dst` pointer. +*/ copy :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr { intrinsics.mem_copy(dst, src, len) return dst } +/* +Copy bytes between two non-overlapping memory ranges. + +This procedure copies `len` bytes of data, from the memory range pointed to by +the `src` pointer into the memory range pointed to by the `dst` pointer, and +returns the `dst` pointer. + +This is a slightly more optimized version of the `copy` procedure that requires +that memory ranges specified by the parameters to this procedure are not +overlapping. If the memory ranges specified by `dst` and `src` pointers overlap, +the behavior of this function may be unpredictable. +*/ copy_non_overlapping :: proc "contextless" (dst, src: rawptr, len: int) -> rawptr { intrinsics.mem_copy_non_overlapping(dst, src, len) return dst } +/* +Compare two memory ranges defined by slices. + +This procedure performs a byte-by-byte comparison between memory ranges +specified by slices `a` and `b`, and returns a value, specifying their relative +ordering. + +If the return value is: +- Equal to `-1`, then `a` is "smaller" than `b`. +- Equal to `+1`, then `a` is "bigger" than `b`. +- Equal to `0`, then `a` and `b` are equal. + +The comparison is performed as follows: +1. Each byte, upto `min(len(a), len(b))` bytes is compared between `a` and `b`. + - If the byte in slice `a` is smaller than a byte in slice `b`, then comparison + stops and this procedure returns `-1`. + - If the byte in slice `a` is bigger than a byte in slice `b`, then comparison + stops and this procedure returns `+1`. + - Otherwise the comparison continues until `min(len(a), len(b))` are compared. +2. If all the bytes in the range are equal, then the lengths of the slices are + compared. + - If the length of slice `a` is smaller than the length of slice `b`, then `-1` is returned. + - If the length of slice `b` is smaller than the length of slice `b`, then `+1` is returned. + - Otherwise `0` is returned. +*/ @(require_results) compare :: proc "contextless" (a, b: []byte) -> int { res := compare_byte_ptrs(raw_data(a), raw_data(b), min(len(a), len(b))) @@ -61,16 +193,89 @@ compare :: proc "contextless" (a, b: []byte) -> int { return res } +/* +Compare two memory ranges defined by byte pointers. + +This procedure performs a byte-by-byte comparison between memory ranges of size +`n` located at addresses `a` and `b`, and returns a value, specifying their relative +ordering. + +If the return value is: +- Equal to `-1`, then `a` is "smaller" than `b`. +- Equal to `+1`, then `a` is "bigger" than `b`. +- Equal to `0`, then `a` and `b` are equal. + +The comparison is performed as follows: +1. Each byte, upto `n` bytes is compared between `a` and `b`. + - If the byte in `a` is smaller than a byte in `b`, then comparison stops + and this procedure returns `-1`. + - If the byte in `a` is bigger than a byte in `b`, then comparison stops + and this procedure returns `+1`. + - Otherwise the comparison continues until `n` bytes are compared. +2. If all the bytes in the range are equal, this procedure returns `0`. +*/ @(require_results) compare_byte_ptrs :: proc "contextless" (a, b: ^byte, n: int) -> int #no_bounds_check { return runtime.memory_compare(a, b, n) } +/* +Compare two memory ranges defined by pointers. + +This procedure performs a byte-by-byte comparison between memory ranges of size +`n` located at addresses `a` and `b`, and returns a value, specifying their relative +ordering. + +If the return value is: +- Equal to `-1`, then `a` is "smaller" than `b`. +- Equal to `+1`, then `a` is "bigger" than `b`. +- Equal to `0`, then `a` and `b` are equal. + +The comparison is performed as follows: +1. Each byte, upto `n` bytes is compared between `a` and `b`. + - If the byte in `a` is smaller than a byte in `b`, then comparison stops + and this procedure returns `-1`. + - If the byte in `a` is bigger than a byte in `b`, then comparison stops + and this procedure returns `+1`. + - Otherwise the comparison continues until `n` bytes are compared. +2. If all the bytes in the range are equal, this procedure returns `0`. +*/ +@(require_results) +compare_ptrs :: proc "contextless" (a, b: rawptr, n: int) -> int { + return compare_byte_ptrs((^byte)(a), (^byte)(b), n) +} + +/* +Check whether two objects are equal on binary level. + +This procedure checks whether the memory ranges occupied by objects `a` and +`b` are equal. See `compare_byte_ptrs()` for how this comparison is done. +*/ +@(require_results) +simple_equal :: proc "contextless" (a, b: $T) -> bool where intrinsics.type_is_simple_compare(T) { + a, b := a, b + return compare_byte_ptrs((^byte)(&a), (^byte)(&b), size_of(T)) == 0 +} + +/* +Check if the memory range defined by a slice is zero-filled. + +This procedure checks whether every byte, pointed to by the slice, specified +by the parameter `data`, is zero. If all bytes of the slice are zero, this +procedure returns `true`. Otherwise this procedure returns `false`. +*/ @(require_results) check_zero :: proc(data: []byte) -> bool { return check_zero_ptr(raw_data(data), len(data)) } +/* +Check if the memory range defined defined by a pointer is zero-filled. + +This procedure checks whether each of the `len` bytes, starting at address +`ptr` is zero. If all bytes of this range are zero, this procedure returns +`true`. Otherwise this procedure returns `false`. +*/ @(require_results) check_zero_ptr :: proc(ptr: rawptr, len: int) -> bool { switch { @@ -85,58 +290,99 @@ check_zero_ptr :: proc(ptr: rawptr, len: int) -> bool { case 4: return intrinsics.unaligned_load((^u32)(ptr)) == 0 case 8: return intrinsics.unaligned_load((^u64)(ptr)) == 0 } - start := uintptr(ptr) start_aligned := align_forward_uintptr(start, align_of(uintptr)) end := start + uintptr(len) end_aligned := align_backward_uintptr(end, align_of(uintptr)) - for b in start.. bool where intrinsics.type_is_simple_compare(T) { - a, b := a, b - return compare_byte_ptrs((^byte)(&a), (^byte)(&b), size_of(T)) == 0 -} +/* +Offset a given pointer by a given amount. -@(require_results) -compare_ptrs :: proc "contextless" (a, b: rawptr, n: int) -> int { - return compare_byte_ptrs((^byte)(a), (^byte)(b), n) -} +This procedure offsets the pointer `ptr` to an object of type `T`, by the amount +of bytes specified by `offset*size_of(T)`, and returns the pointer `ptr`. +**Note**: Prefer to use multipointer types, if possible. +*/ ptr_offset :: intrinsics.ptr_offset +/* +Offset a given pointer by a given amount backwards. + +This procedure offsets the pointer `ptr` to an object of type `T`, by the amount +of bytes specified by `offset*size_of(T)` in the negative direction, and +returns the pointer `ptr`. +*/ ptr_sub :: intrinsics.ptr_sub +/* +Construct a slice from pointer and length. + +This procedure creates a slice, that points to `len` amount of objects located +at an address, specified by `ptr`. +*/ @(require_results) slice_ptr :: proc "contextless" (ptr: ^$T, len: int) -> []T { return ([^]T)(ptr)[:len] } +/* +Construct a byte slice from raw pointer and length. + +This procedure creates a byte slice, that points to `len` amount of bytes +located at an address specified by `data`. +*/ @(require_results) byte_slice :: #force_inline proc "contextless" (data: rawptr, #any_int len: int) -> []byte { return ([^]u8)(data)[:max(len, 0)] } +/* +Create a byte slice from pointer and length. + +This procedure creates a byte slice, pointing to `len` objects, starting from +the address specified by `ptr`. +*/ +@(require_results) +ptr_to_bytes :: proc "contextless" (ptr: ^$T, len := 1) -> []byte { + return transmute([]byte)Raw_Slice{ptr, len*size_of(T)} +} + +/* +Obtain the slice, pointing to the contents of `any`. + +This procedure returns the slice, pointing to the contents of the specified +value of the `any` type. +*/ +@(require_results) +any_to_bytes :: proc "contextless" (val: any) -> []byte { + ti := type_info_of(val.id) + size := ti != nil ? ti.size : 0 + return transmute([]byte)Raw_Slice{val.data, size} +} + +/* +Obtain a byte slice from any slice. + +This procedure returns a slice, that points to the same bytes as the slice, +specified by `slice` and returns the resulting byte slice. +*/ @(require_results) slice_to_bytes :: proc "contextless" (slice: $E/[]$T) -> []byte { s := transmute(Raw_Slice)slice @@ -144,6 +390,15 @@ slice_to_bytes :: proc "contextless" (slice: $E/[]$T) -> []byte { return transmute([]byte)s } +/* +Transmute slice to a different type. + +This procedure performs an operation similar to transmute, returning a slice of +type `T` that points to the same bytes as the slice specified by `slice` +parameter. Unlike plain transmute operation, this procedure adjusts the length +of the resulting slice, such that the resulting slice points to the correct +amount of objects to cover the memory region pointed to by `slice`. +*/ @(require_results) slice_data_cast :: proc "contextless" ($T: typeid/[]$A, slice: $S/[]$B) -> T { when size_of(A) == 0 || size_of(B) == 0 { @@ -155,12 +410,25 @@ slice_data_cast :: proc "contextless" ($T: typeid/[]$A, slice: $S/[]$B) -> T { } } +/* +Obtain data and length of a slice. + +This procedure returns the pointer to the start of the memory region pointed to +by slice `slice` and the length of the slice. +*/ @(require_results) slice_to_components :: proc "contextless" (slice: $E/[]$T) -> (data: ^T, len: int) { s := transmute(Raw_Slice)slice return (^T)(s.data), s.len } +/* +Create a dynamic array from slice. + +This procedure creates a dynamic array, using slice `backing` as the backing +buffer for the dynamic array. The resulting dynamic array can not grow beyond +the size of the specified slice. +*/ @(require_results) buffer_from_slice :: proc "contextless" (backing: $T/[]$E) -> [dynamic]E { return transmute([dynamic]E)Raw_Dynamic_Array{ @@ -174,19 +442,12 @@ buffer_from_slice :: proc "contextless" (backing: $T/[]$E) -> [dynamic]E { } } -@(require_results) -ptr_to_bytes :: proc "contextless" (ptr: ^$T, len := 1) -> []byte { - return transmute([]byte)Raw_Slice{ptr, len*size_of(T)} -} - -@(require_results) -any_to_bytes :: proc "contextless" (val: any) -> []byte { - ti := type_info_of(val.id) - size := ti != nil ? ti.size : 0 - return transmute([]byte)Raw_Slice{val.data, size} -} - +/* +Check whether a number is a power of two. +This procedure checks whether a given pointer-sized unsigned integer contains +a power-of-two value. +*/ @(require_results) is_power_of_two :: proc "contextless" (x: uintptr) -> bool { if x <= 0 { @@ -195,67 +456,156 @@ is_power_of_two :: proc "contextless" (x: uintptr) -> bool { return (x & (x-1)) == 0 } +/* +Align uintptr forward. + +This procedure returns the next address after `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ +@(require_results) +align_forward_uintptr :: proc(ptr, align: uintptr) -> uintptr { + assert(is_power_of_two(align)) + return (p + align-1) & ~(align-1) +} + +/* +Align pointer forward. + +This procedure returns the next address after `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ @(require_results) align_forward :: proc(ptr: rawptr, align: uintptr) -> rawptr { return rawptr(align_forward_uintptr(uintptr(ptr), align)) } -@(require_results) -align_forward_uintptr :: proc(ptr, align: uintptr) -> uintptr { - assert(is_power_of_two(align)) +/* +Align int forward. - p := ptr - modulo := p & (align-1) - if modulo != 0 { - p += align - modulo - } - return p -} +This procedure returns the next address after `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. +The specified alignment must be a power of 2. +*/ @(require_results) align_forward_int :: proc(ptr, align: int) -> int { return int(align_forward_uintptr(uintptr(ptr), uintptr(align))) } +/* +Align uint forward. + +This procedure returns the next address after `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ @(require_results) align_forward_uint :: proc(ptr, align: uint) -> uint { return uint(align_forward_uintptr(uintptr(ptr), uintptr(align))) } +/* +Align uintptr backwards. + +This procedure returns the previous address before `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ +@(require_results) +align_backward_uintptr :: proc(ptr, align: uintptr) -> uintptr { + assert(is_power_of_two(align)) + return ptr & ~(align-1) +} + +/* +Align rawptr backwards. + +This procedure returns the previous address before `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ @(require_results) align_backward :: proc(ptr: rawptr, align: uintptr) -> rawptr { return rawptr(align_backward_uintptr(uintptr(ptr), align)) } -@(require_results) -align_backward_uintptr :: proc(ptr, align: uintptr) -> uintptr { - return align_forward_uintptr(ptr - align + 1, align) -} +/* +Align int backwards. +This procedure returns the previous address before `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ @(require_results) align_backward_int :: proc(ptr, align: int) -> int { return int(align_backward_uintptr(uintptr(ptr), uintptr(align))) } +/* +Align uint backwards. + +This procedure returns the previous address before `ptr`, that is located on the +alignment boundary specified by `align`. If `ptr` is already aligned to `align` +bytes, `ptr` is returned. + +The specified alignment must be a power of 2. +*/ @(require_results) align_backward_uint :: proc(ptr, align: uint) -> uint { return uint(align_backward_uintptr(uintptr(ptr), uintptr(align))) } +/* +Create a context with a given allocator. + +This procedure returns a copy of the current context with the allocator replaced +by the allocator `a`. +*/ @(require_results) context_from_allocator :: proc(a: Allocator) -> type_of(context) { context.allocator = a return context } +/* +Copy the value from a pointer into a value. + +This procedure copies the object of type `T` pointed to by the pointer `ptr` +into a new stack-allocated value and returns that value. +*/ @(require_results) reinterpret_copy :: proc "contextless" ($T: typeid, ptr: rawptr) -> (value: T) { copy(&value, ptr, size_of(T)) return } +/* +Dynamic array with a fixed capacity buffer. + +This type represents dynamic arrays with a fixed-size backing buffer. Upon +allocating memory beyond reaching the maximum capacity, allocations from fixed +byte buffers return `nil` and no error. +*/ Fixed_Byte_Buffer :: distinct [dynamic]byte +/* +Create a fixed byte buffer from a slice. +*/ @(require_results) make_fixed_byte_buffer :: proc "contextless" (backing: []byte) -> Fixed_Byte_Buffer { s := transmute(Raw_Slice)backing @@ -270,12 +620,24 @@ make_fixed_byte_buffer :: proc "contextless" (backing: []byte) -> Fixed_Byte_Buf return transmute(Fixed_Byte_Buffer)d } +/* +General-purpose align formula. + +This procedure is equivalent to `align_forward`, but it does not require the +alignment to be a power of two. +*/ @(require_results) align_formula :: proc "contextless" (size, align: int) -> int { result := size + align-1 return result - result%align } +/* +Calculate the padding after the pointer with a header. + +This procedure returns the next address, following `ptr` and `header_size` +bytes of space that is aligned to a boundary specified by `align`. +*/ @(require_results) calc_padding_with_header :: proc "contextless" (ptr: uintptr, align: uintptr, header_size: int) -> int { p, a := ptr, align @@ -287,14 +649,12 @@ calc_padding_with_header :: proc "contextless" (ptr: uintptr, align: uintptr, he needed_space := uintptr(header_size) if padding < needed_space { needed_space -= padding - if needed_space & (a-1) > 0 { padding += align * (1+(needed_space/align)) } else { padding += align * (needed_space/align) } } - return int(padding) } From f8cd13767e360092fb4b7df02508f2884cf82da5 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 7 Sep 2024 18:08:11 +1100 Subject: [PATCH 043/320] [mem]: Fix the issue with unbranched version of ptr align --- core/mem/mem.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index c17ab43a9..2212ee171 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -468,7 +468,7 @@ The specified alignment must be a power of 2. @(require_results) align_forward_uintptr :: proc(ptr, align: uintptr) -> uintptr { assert(is_power_of_two(align)) - return (p + align-1) & ~(align-1) + return (ptr + align-1) & ~(align-1) } /* From 1842cd6297ae60fba46b43758d5ffc655ef2e58c Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 00:09:18 +1100 Subject: [PATCH 044/320] Fix typo Co-authored-by: FourteenBrush <74827262+FourteenBrush@users.noreply.github.com> --- core/mem/mem.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 2212ee171..0554cee23 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -98,7 +98,7 @@ compiler assumes volatile semantics of the memory. */ zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { // This routine tries to avoid the compiler optimizing away the call, - // so that it is always executed. It is intended to provided + // so that it is always executed. It is intended to provide // equivalent semantics to those provided by the C11 Annex K 3.7.4.1 // memset_s call. intrinsics.mem_zero_volatile(data, len) // Use the volatile mem_zero From dc767da12b0e03a6cd9ff20085565c95c06ef7bc Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Thu, 5 Sep 2024 21:17:40 +0200 Subject: [PATCH 045/320] Make tags use #+ syntax instead of //+ syntax so it no longer looks like a comment. Old style still works but is deprecated with a warning. Using unknown tags is now an error instead of a warning. There is a new token for #+ which consumes the whole line (or until it hits a comment). The tags are parsed like before. There are errors to tell you if you use something invalid in the pre-package-line block. --- src/parser.cpp | 155 ++++++++++++++++++++++++++++++++-------------- src/tokenizer.cpp | 15 +++++ 2 files changed, 123 insertions(+), 47 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index e3143dd33..03ed725c5 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5337,6 +5337,12 @@ gb_internal Ast *parse_stmt(AstFile *f) { s = ast_empty_stmt(f, token); expect_semicolon(f); return s; + + case Token_FileTag: + // This is always an error because all valid file tags will have been processed in `parse_file` already. + // Any remaining file tags must be past the package line and thus invalid. + syntax_error(token, "Lines starting with #+ (file tags) are only allowed before the package line."); + return ast_bad_stmt(f, token, f->curr_token); } // Error correction statements @@ -6091,7 +6097,7 @@ gb_internal String build_tag_get_token(String s, String *out) { } gb_internal bool parse_build_tag(Token token_for_pos, String s) { - String const prefix = str_lit("+build"); + String const prefix = str_lit("build"); GB_ASSERT(string_starts_with(s, prefix)); s = string_trim_whitespace(substring(s, prefix.len, s.len)); @@ -6176,7 +6182,7 @@ gb_internal String vet_tag_get_token(String s, String *out) { gb_internal u64 parse_vet_tag(Token token_for_pos, String s) { - String const prefix = str_lit("+vet"); + String const prefix = str_lit("vet"); GB_ASSERT(string_starts_with(s, prefix)); s = string_trim_whitespace(substring(s, prefix.len, s.len)); @@ -6281,7 +6287,7 @@ gb_internal isize calc_decl_count(Ast *decl) { } gb_internal bool parse_build_project_directory_tag(Token token_for_pos, String s) { - String const prefix = str_lit("+build-project-name"); + String const prefix = str_lit("build-project-name"); GB_ASSERT(string_starts_with(s, prefix)); s = string_trim_whitespace(substring(s, prefix.len, s.len)); if (s.len == 0) { @@ -6325,6 +6331,48 @@ gb_internal bool parse_build_project_directory_tag(Token token_for_pos, String s return any_correct; } +gb_internal bool process_file_tag(const String &lc, const Token &tok, AstFile *f) { + if (string_starts_with(lc, str_lit("build-project-name"))) { + if (!parse_build_project_directory_tag(tok, lc)) { + return false; + } + } else if (string_starts_with(lc, str_lit("build"))) { + if (!parse_build_tag(tok, lc)) { + return false; + } + } else if (string_starts_with(lc, str_lit("vet"))) { + f->vet_flags = parse_vet_tag(tok, lc); + f->vet_flags_set = true; + } else if (string_starts_with(lc, str_lit("ignore"))) { + return false; + } else if (string_starts_with(lc, str_lit("private"))) { + f->flags |= AstFile_IsPrivatePkg; + String command = string_trim_starts_with(lc, str_lit("private ")); + command = string_trim_whitespace(command); + if (lc == "private") { + f->flags |= AstFile_IsPrivatePkg; + } else if (command == "package") { + f->flags |= AstFile_IsPrivatePkg; + } else if (command == "file") { + f->flags |= AstFile_IsPrivateFile; + } + } else if (lc == "lazy") { + if (build_context.ignore_lazy) { + // Ignore + } else if (f->pkg->kind == Package_Init && build_context.command_kind == Command_doc) { + // Ignore + } else { + f->flags |= AstFile_IsLazy; + } + } else if (lc == "no-instrumentation") { + f->flags |= AstFile_NoInstrumentation; + } else { + error(tok, "Unknown tag '%.*s'", LIT(lc)); + } + + return true; +} + gb_internal bool parse_file(Parser *p, AstFile *f) { if (f->tokens.count == 0) { return true; @@ -6337,15 +6385,38 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { String filepath = f->tokenizer.fullpath; String base_dir = dir_from_path(filepath); - if (f->curr_token.kind == Token_Comment) { - consume_comment_groups(f, f->prev_token); + + Array tags = array_make(ast_allocator(f)); + + bool has_first_invalid_pre_package_token = false; + Token first_invalid_pre_package_token; + + while (f->curr_token.kind != Token_package && f->curr_token.kind != Token_EOF) { + if (f->curr_token.kind == Token_Comment) { + consume_comment_groups(f, f->prev_token); + } else if (f->curr_token.kind == Token_FileTag) { + array_add(&tags, f->curr_token); + advance_token(f); + } else { + if (!has_first_invalid_pre_package_token) { + has_first_invalid_pre_package_token = true; + first_invalid_pre_package_token = f->curr_token; + } + + advance_token(f); + } } CommentGroup *docs = f->lead_comment; if (f->curr_token.kind != Token_package) { ERROR_BLOCK(); - syntax_error(f->curr_token, "Expected a package declaration at the beginning of the file"); + + // The while loop above scanned until it found the package token. If we never + // found one, then make this error appear on the first invalid token line. + Token t = has_first_invalid_pre_package_token ? first_invalid_pre_package_token : f->curr_token; + syntax_error(t, "Expected a package declaration at the beginning of the file"); + // IMPORTANT NOTE(bill): this is technically a race condition with the suggestion, but it's ony a suggession // so in practice is should be "fine" if (f->pkg && f->pkg->name != "") { @@ -6354,6 +6425,12 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { return false; } + // There was an OK package declaration. But there some invalid token was hit before the package declaration. + if (has_first_invalid_pre_package_token) { + syntax_error(first_invalid_pre_package_token, "There can only be lines starting with #+ or // before package declaration"); + return false; + } + f->package_token = expect_token(f, Token_package); if (f->package_token.kind != Token_package) { return false; @@ -6379,55 +6456,39 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } f->package_name = package_name.string; - if (!f->pkg->is_single_file && docs != nullptr && docs->list.count > 0) { - for (Token const &tok : docs->list) { - GB_ASSERT(tok.kind == Token_Comment); - String str = tok.string; - if (string_starts_with(str, str_lit("//"))) { - String lc = string_trim_whitespace(substring(str, 2, str.len)); - if (lc.len > 0 && lc[0] == '+') { - if (string_starts_with(lc, str_lit("+build-project-name"))) { - if (!parse_build_project_directory_tag(tok, lc)) { + if (!f->pkg->is_single_file) { + if (docs != nullptr && docs->list.count > 0) { + for (Token const &tok : docs->list) { + GB_ASSERT(tok.kind == Token_Comment); + String str = tok.string; + if (string_starts_with(str, str_lit("//"))) { + String lc = string_trim_whitespace(substring(str, 2, str.len)); + if (string_starts_with(lc, str_lit("+"))) { + syntax_warning(tok, "//+ is deprecated: Use #+ instead"); + String lt = substring(lc, 1, lc.len); + if (process_file_tag(lt, tok, f) == false) { return false; } - } else if (string_starts_with(lc, str_lit("+build"))) { - if (!parse_build_tag(tok, lc)) { - return false; - } - } else if (string_starts_with(lc, str_lit("+vet"))) { - f->vet_flags = parse_vet_tag(tok, lc); - f->vet_flags_set = true; - } else if (string_starts_with(lc, str_lit("+ignore"))) { - return false; - } else if (string_starts_with(lc, str_lit("+private"))) { - f->flags |= AstFile_IsPrivatePkg; - String command = string_trim_starts_with(lc, str_lit("+private ")); - command = string_trim_whitespace(command); - if (lc == "+private") { - f->flags |= AstFile_IsPrivatePkg; - } else if (command == "package") { - f->flags |= AstFile_IsPrivatePkg; - } else if (command == "file") { - f->flags |= AstFile_IsPrivateFile; - } - } else if (lc == "+lazy") { - if (build_context.ignore_lazy) { - // Ignore - } else if (f->pkg->kind == Package_Init && build_context.command_kind == Command_doc) { - // Ignore - } else { - f->flags |= AstFile_IsLazy; - } - } else if (lc == "+no-instrumentation") { - f->flags |= AstFile_NoInstrumentation; - } else { - warning(tok, "Ignoring unknown tag '%.*s'", LIT(lc)); } } } } + + for (Token const &tok : tags) { + GB_ASSERT(tok.kind == Token_FileTag); + String str = tok.string; + + if (string_starts_with(str, str_lit("#+"))) { + String lt = string_trim_whitespace(substring(str, 2, str.len)); + if (process_file_tag(lt, tok, f) == false) { + return false; + } + } + } } + array_free(&tags); + Ast *pd = ast_package_decl(f, f->package_token, package_name, docs, f->line_comment); expect_semicolon(f); f->pkg_decl = pd; diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 4425bee29..e9bad390e 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -2,6 +2,7 @@ TOKEN_KIND(Token_Invalid, "Invalid"), \ TOKEN_KIND(Token_EOF, "EOF"), \ TOKEN_KIND(Token_Comment, "Comment"), \ + TOKEN_KIND(Token_FileTag, "FileTag"), \ \ TOKEN_KIND(Token__LiteralBegin, ""), \ TOKEN_KIND(Token_Ident, "identifier"), \ @@ -939,6 +940,20 @@ gb_internal void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { if (t->curr_rune == '!') { token->kind = Token_Comment; tokenizer_skip_line(t); + } else if (t->curr_rune == '+') { + token->kind = Token_FileTag; + + // Skip the line or until it ends or until we hit was is probably a comment. + // The parsing of tags happens in `parse_file`. + while (t->curr_rune != GB_RUNE_EOF) { + if (t->curr_rune == '\n') { + break; + } + if (t->curr_rune == '/') { + break; + } + advance_to_next_rune(t); + } } break; case '/': From c719a86312813c1eed8793aafe6f98eb5ed1b3e0 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 10:58:40 +1100 Subject: [PATCH 046/320] [mem]: Document alloc.odin --- core/mem/alloc.odin | 577 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 530 insertions(+), 47 deletions(-) diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index 558e810e3..dbf9af9b2 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -2,66 +2,272 @@ package mem import "base:runtime" -// NOTE(bill, 2019-12-31): These are defined in `package runtime` as they are used in the `context`. This is to prevent an import definition cycle. +//NOTE(bill, 2019-12-31): These are defined in `package runtime` as they are used in the `context`. This is to prevent an import definition cycle. + +/* +A request to allocator procedure. + +This type represents a type of allocation request made to an allocator +procedure. There is one allocator procedure per allocator, and this value is +used to discriminate between different functions of the allocator. + +The type is defined as follows: + + Allocator_Mode :: enum byte { + Alloc, + Alloc_Non_Zeroed, + Free, + Free_All, + Resize, + Resize_Non_Zeroed, + Query_Features, + } + +Depending on which value is used, the allocator procedure will perform different +functions: + +- `Alloc`: Allocates a memory region with a given `size` and `alignment`. +- `Alloc_Non_Zeroed`: Same as `Alloc` without explicit zero-initialization of + the memory region. +- `Free`: Free a memory region located at address `ptr` with a given `size`. +- `Free_All`: Free all memory allocated using this allocator. +- `Resize`: Resize a memory region located at address `old_ptr` with size + `old_size` to be `size` bytes in length and have the specified `alignment`, + in case a re-alllocation occurs. +- `Resize_Non_Zeroed`: Same as `Resize`, without explicit zero-initialization. + +*/ Allocator_Mode :: runtime.Allocator_Mode -/* -Allocator_Mode :: enum byte { - Alloc, - Free, - Free_All, - Resize, - Query_Features, - Alloc_Non_Zeroed, - Resize_Non_Zeroed, -} -*/ +/* +A set of allocator features. + +This type represents values that contain a set of features an allocator has. +Currently the type is defined as follows: + + Allocator_Mode_Set :: distinct bit_set[Allocator_Mode]; +*/ Allocator_Mode_Set :: runtime.Allocator_Mode_Set -/* -Allocator_Mode_Set :: distinct bit_set[Allocator_Mode]; -*/ +/* +Allocator information. + +This type represents information about a given allocator at a specific point +in time. Currently the type is defined as follows: + + Allocator_Query_Info :: struct { + pointer: rawptr, + size: Maybe(int), + alignment: Maybe(int), + } + +- `pointer`: Pointer to a backing buffer. +- `size`: Size of the backing buffer. +- `alignment`: The allocator's alignment. + +If not applicable, any of these fields may be `nil`. +*/ Allocator_Query_Info :: runtime.Allocator_Query_Info -/* -Allocator_Query_Info :: struct { - pointer: rawptr, - size: Maybe(int), - alignment: Maybe(int), -} -*/ -Allocator_Error :: runtime.Allocator_Error /* -Allocator_Error :: enum byte { - None = 0, - Out_Of_Memory = 1, - Invalid_Pointer = 2, - Invalid_Argument = 3, - Mode_Not_Implemented = 4, -} +An allocation request error. + +This type represents error values the allocators may return upon requests. + + Allocator_Error :: enum byte { + None = 0, + Out_Of_Memory = 1, + Invalid_Pointer = 2, + Invalid_Argument = 3, + Mode_Not_Implemented = 4, + } + +The meaning of the errors is as follows: + +- `None`: No error. +- `Out_Of_Memory`: Either: + 1. The allocator has ran out of the backing buffer, or the requested + allocation size is too large to fit into a backing buffer. + 2. The operating system error during memory allocation. + 3. The backing allocator was used to allocate a new backing buffer and the + backing allocator returned Out_Of_Memory. +- `Invalid_Pointer`: The pointer referring to a memory region does not belong + to any of the allocators backing buffers or does not point to a valid start + of an allocation made in that allocator. +- `Invalid_Argument`: Can occur if one of the arguments makes it impossible to + satisfy a request (i.e. having alignment larger than the backing buffer + of the allocation). +- `Mode_Not_Implemented`: The allocator does not support the specified + operation. For example, an arena does not support freeing individual + allocations. +*/ +Allocator_Error :: runtime.Allocator_Error + +/* +The allocator procedure. + +This type represents allocation procedures. An allocation procedure is a single +procedure, implementing all allocator functions such as allocating the memory, +freeing the memory, etc. + +Currently the type is defined as follows: + + Allocator_Proc :: #type proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size: int, + alignment: int, + old_memory: rawptr, + old_size: int, + location: Source_Code_Location = #caller_location, + ) -> ([]byte, Allocator_Error); + +The function of this procedure and the meaning of parameters depends on the +value of the `mode` parameter. + +## 1. `.Alloc`, `.Alloc_Non_Zeroed` + +Allocates a memory region of size `size`, aligned on a boundary specified by +`alignment`. + +**Inputs**: +- `allocator_data`: Pointer to the allocator data. +- `mode`: `.Alloc` or `.Alloc_Non_Zeroed`. +- `size`: The desired size of the memory region. +- `alignment`: The desired alignmnet of the allocation. +- `old_memory`: Unused, should be `nil`. +- `old_size`: Unused, should be 0. + +**Returns**: +1. The memory region, if allocated successfully, or `nil` otherwise. +2. An error, if allocation failed. + +**Note**: Some allocators may return `nil`, even if no error is returned. +Always check both the error and the allocated buffer. + +Same as `.Alloc`. + +## 2. `Free` + +Frees a memory region located at the address specified by `old_memory`. If the +allocator does not track sizes of allocations, the size should be specified in +the `old_size` parameter. + +**Inputs**: +- `allocator_data`: Pointer to the allocator data. +- `mode`: `.Free`. +- `size`: Unused, should be 0. +- `alignment`: Unused, should be 0. +- `old_memory`: Pointer to the memory region to free. +- `old_size`: The size of the memory region to free. This parameter is optional + if the allocator keeps track of the sizes of allocations. + +**Returns**: +1. `nil` +2. Error, if freeing failed. + +## 3. `Free_All` + +Frees all allocations, associated with the allocator, making it available for +further allocations using the same backing buffers. + +**Inputs**: +- `allocator_data`: Pointer to the allocator data. +- `mode`: `.Free_All`. +- `size`: Unused, should be 0. +- `alignment`: Unused, should be 0. +- `old_memory`: Unused, should be `nil`. +- `old_size`: Unused, should be `0`. + +**Returns**: +1. `nil`. +2. Error, if freeing failed. + +## 4. `Resize`, `Resize_Non_Zeroed` + +Resizes the memory region, of the size `old_size` located at the address +specified by `old_memory` to have the new size `size`. The slice of the new +memory region is returned from the procedure. The allocator may attempt to +keep the new memory region at the same address as the previous allocation, +however no such guarantee is made. Do not assume the new memory region will +be at the same address as the old memory region. + +If `old_memory` pointer is `nil`, this function acts just like `.Alloc` or +`.Alloc_Non_Zeroed`, using `size` and `alignment` to allocate a new memory +region. + +If `new_size` is `nil`, the procedure acts just like `.Free`, freeing the +memory region `old_size` bytes in length, located at the address specified by +`old_memory`. + +**Inputs**: +- `allocator_data`: Pointer to the allocator data. +- `mode`: `.Resize` or `.Resize_All`. +- `size`: The desired new size of the memory region. +- `alignment`: The alignment of the new memory region, if its allocated +- `old_memory`: The pointer to the memory region to resize. +- `old_size`: The size of the memory region to resize. If the allocator + keeps track of the sizes of allocations, this parameter is optional. + +**Returns**: +1. The slice of the memory region after resize operation, if successfull, + `nil` otherwise. +2. An error, if the resize failed. + +**Note**: Some allocators may return `nil`, even if no error is returned. +Always check both the error and the allocated buffer. */ Allocator_Proc :: runtime.Allocator_Proc -/* -Allocator_Proc :: #type proc(allocator_data: rawptr, mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, location: Source_Code_Location = #caller_location) -> ([]byte, Allocator_Error); -*/ +/* +Allocator. + +This type represents generic interface for all allocators. Currently this type +is defined as follows: + + Allocator :: struct { + procedure: Allocator_Proc, + data: rawptr, + } + +- `procedure`: Pointer to the allocation procedure. +- `data`: Pointer to the allocator data. +*/ Allocator :: runtime.Allocator -/* -Allocator :: struct { - procedure: Allocator_Proc, - data: rawptr, -} -*/ +/* +Default alignment. + +This value is the default alignment for all platforms that is used, if the +alignment is not specified explicitly. +*/ DEFAULT_ALIGNMENT :: 2*align_of(rawptr) +/* +Default page size. + +This value is the default page size for the current platform. +*/ DEFAULT_PAGE_SIZE :: 64 * 1024 when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else 16 * 1024 when ODIN_OS == .Darwin && ODIN_ARCH == .arm64 else 4 * 1024 +/* +Allocate memory. + +This function allocates `size` bytes of memory, aligned to a boundary specified +by `alignment` using the allocator specified by `allocator`. + +**Inputs**: +- `size`: The desired size of the allocated memory region. +- `alignment`: The desired alignment of the allocated memory region. +- `allocator`: The allocator to allocate from. + +**Returns**: +1. Pointer to the allocated memory, or `nil` if allocation failed. +2. Error, if the allocation failed. +*/ @(require_results) alloc :: proc( size: int, @@ -73,6 +279,21 @@ alloc :: proc( return raw_data(data), err } +/* +Allocate memory. + +This function allocates `size` bytes of memory, aligned to a boundary specified +by `alignment` using the allocator specified by `allocator`. + +**Inputs**: +- `size`: The desired size of the allocated memory region. +- `alignment`: The desired alignment of the allocated memory region. +- `allocator`: The allocator to allocate from. + +**Returns**: +1. Slice of the allocated memory region, or `nil` if allocation failed. +2. Error, if the allocation failed. +*/ @(require_results) alloc_bytes :: proc( size: int, @@ -83,6 +304,22 @@ alloc_bytes :: proc( return runtime.mem_alloc(size, alignment, allocator, loc) } +/* +Allocate non-zeroed memory. + +This function allocates `size` bytes of memory, aligned to a boundary specified +by `alignment` using the allocator specified by `allocator`. This procedure +does not explicitly zero-initialize allocated memory region. + +**Inputs**: +- `size`: The desired size of the allocated memory region. +- `alignment`: The desired alignment of the allocated memory region. +- `allocator`: The allocator to allocate from. + +**Returns**: +1. Slice of the allocated memory region, or `nil` if allocation failed. +2. Error, if the allocation failed. +*/ @(require_results) alloc_bytes_non_zeroed :: proc( size: int, @@ -93,6 +330,16 @@ alloc_bytes_non_zeroed :: proc( return runtime.mem_alloc_non_zeroed(size, alignment, allocator, loc) } +/* +Free memory. + +This procedure frees memory region located at the address, specified by `ptr`, +allocated from the allocator specified by `allocator`. + +**Inputs**: +- `ptr`: Pointer to the memory region to free. +- `allocator`: The allocator to free to. +*/ free :: proc( ptr: rawptr, allocator := context.allocator, @@ -101,15 +348,42 @@ free :: proc( return runtime.mem_free(ptr, allocator, loc) } +/* +Free a memory region. + +This procedure frees `size` bytes of memory region located at the address, +specified by `ptr`, allocated from the allocator specified by `allocator`. + +**Inputs**: +- `ptr`: Pointer to the memory region to free. +- `size`: The size of the memory region to free. +- `allocator`: The allocator to free to. + +**Returns**: +- The error, if freeing failed. +*/ free_with_size :: proc( ptr: rawptr, - byte_count: int, + size: int, allocator := context.allocator, loc := #caller_location, ) -> Allocator_Error { - return runtime.mem_free_with_size(ptr, byte_count, allocator, loc) + return runtime.mem_free_with_size(ptr, size, allocator, loc) } +/* +Free a memory region. + +This procedure frees memory region, specified by `bytes`, allocated from the +allocator specified by `allocator`. + +**Inputs**: +- `bytes`: The memory region to free. +- `allocator`: The allocator to free to. + +**Returns**: +- The error, if freeing failed. +*/ free_bytes :: proc( bytes: []byte, allocator := context.allocator, @@ -118,10 +392,45 @@ free_bytes :: proc( return runtime.mem_free_bytes(bytes, allocator, loc) } +/* +Free all allocations. + +This procedure frees all allocations made on the allocator specified by +`allocator` to that allocator, making it available for further allocations. +*/ free_all :: proc(allocator := context.allocator, loc := #caller_location) -> Allocator_Error { return runtime.mem_free_all(allocator, loc) } +/* +Resize a memory region. + +This procedure resizes a memory region, `old_size` bytes in size, located at +the address specified by `ptr`, such that it has a new size, specified by +`new_size` and and is aligned on a boundary specified by `alignment`. + +If the `ptr` parameter is `nil`, `resize()` acts just like `alloc`, allocating +`new_size` bytes, aligned on a boundary specified by `alignment`. + +If the `new_size` parameter is `0`, `resize()` acts just like `free`, freeing +the memory region `old_size` bytes in length, located at the address specified +by `ptr`. + +**Inputs**: +- `ptr`: Pointer to the memory region to resize. +- `old_size`: Size of the memory region to resize. +- `new_size`: The desired size of the resized memory region. +- `alignment`: The desired alignment of the resized memory region. +- `allocator`: The owner of the memory region to resize. + +**Returns**: +1. The pointer to the resized memory region, if successfull, `nil` otherwise. +2. Error, if resize failed. + +**Note**: The `alignment` parameter is used to preserve the original alignment +of the allocation, if `resize()` needs to relocate the memory region. Do not +use `resize()` to change the alignment of the allocated memory region. +*/ @(require_results) resize :: proc( ptr: rawptr, @@ -135,6 +444,33 @@ resize :: proc( return raw_data(data), err } +/* +Resize a memory region. + +This procedure resizes a memory region, specified by `old_data`, such that it +has a new size, specified by `new_size` and and is aligned on a boundary +specified by `alignment`. + +If the `old_data` parameter is `nil`, `resize()` acts just like `alloc`, +allocating `new_size` bytes, aligned on a boundary specified by `alignment`. + +If the `new_size` parameter is `0`, `resize()` acts just like `free`, freeing +the memory region specified by `old_data`. + +**Inputs**: +- `old_data`: Pointer to the memory region to resize. +- `new_size`: The desired size of the resized memory region. +- `alignment`: The desired alignment of the resized memory region. +- `allocator`: The owner of the memory region to resize. + +**Returns**: +1. The resized memory region, if successfull, `nil` otherwise. +2. Error, if resize failed. + +**Note**: The `alignment` parameter is used to preserve the original alignment +of the allocation, if `resize()` needs to relocate the memory region. Do not +use `resize()` to change the alignment of the allocated memory region. +*/ @(require_results) resize_bytes :: proc( old_data: []byte, @@ -146,6 +482,9 @@ resize_bytes :: proc( return runtime.mem_resize(raw_data(old_data), len(old_data), new_size, alignment, allocator, loc) } +/* +Query allocator features. +*/ @(require_results) query_features :: proc(allocator: Allocator, loc := #caller_location) -> (set: Allocator_Mode_Set) { if allocator.procedure != nil { @@ -155,6 +494,9 @@ query_features :: proc(allocator: Allocator, loc := #caller_location) -> (set: A return nil } +/* +Query allocator information. +*/ @(require_results) query_info :: proc( pointer: rawptr, @@ -168,6 +510,9 @@ query_info :: proc( return } +/* +Free a string. +*/ delete_string :: proc( str: string, allocator := context.allocator, @@ -176,6 +521,9 @@ delete_string :: proc( return runtime.delete_string(str, allocator, loc) } +/* +Free a cstring. +*/ delete_cstring :: proc( str: cstring, allocator := context.allocator, @@ -184,6 +532,9 @@ delete_cstring :: proc( return runtime.delete_cstring(str, allocator, loc) } +/* +Free a dynamic array. +*/ delete_dynamic_array :: proc( array: $T/[dynamic]$E, loc := #caller_location, @@ -191,6 +542,9 @@ delete_dynamic_array :: proc( return runtime.delete_dynamic_array(array, loc) } +/* +Free a slice. +*/ delete_slice :: proc( array: $T/[]$E, allocator := context.allocator, @@ -199,6 +553,9 @@ delete_slice :: proc( return runtime.delete_slice(array, allocator, loc) } +/* +Free a map. +*/ delete_map :: proc( m: $T/map[$K]$V, loc := #caller_location, @@ -206,6 +563,9 @@ delete_map :: proc( return runtime.delete_map(m, loc) } +/* +Free. +*/ delete :: proc{ delete_string, delete_cstring, @@ -214,6 +574,13 @@ delete :: proc{ delete_map, } +/* +Allocate a new object. + +This procedure allocates a new object of type `T` using an allocator specified +by `allocator`, and returns a pointer to the allocated object, if allocated +successfully, or `nil` otherwise. +*/ @(require_results) new :: proc( $T: typeid, @@ -223,6 +590,14 @@ new :: proc( return new_aligned(T, align_of(T), allocator, loc) } +/* +Allocate a new object with alignment. + +This procedure allocates a new object of type `T` using an allocator specified +by `allocator`, and returns a pointer, aligned on a boundary specified by +`alignment` to the allocated object, if allocated successfully, or `nil` +otherwise. +*/ @(require_results) new_aligned :: proc( $T: typeid, @@ -233,6 +608,14 @@ new_aligned :: proc( return runtime.new_aligned(T, alignment, allocator, loc) } +/* +Allocate a new object and initialize it with a value. + +This procedure allocates a new object of type `T` using an allocator specified +by `allocator`, and returns a pointer, aligned on a boundary specified by +`alignment` to the allocated object, if allocated successfully, or `nil` +otherwise. The allocated object is initialized with `data`. +*/ @(require_results) new_clone :: proc( data: $T, @@ -242,6 +625,13 @@ new_clone :: proc( return runtime.new_clone(data, allocator, loc) } +/* +Allocate a new slice with alignment. + +This procedure allocates a new slice of type `T` with length `len`, aligned +on a boundary specified by `alignment` from an allocator specified by +`allocator`, and returns the allocated slice. +*/ @(require_results) make_aligned :: proc( $T: typeid/[]$E, @@ -253,6 +643,12 @@ make_aligned :: proc( return runtime.make_aligned(T, len, alignment, allocator, loc) } +/* +Allocate a new slice. + +This procedure allocates a new slice of type `T` with length `len`, from an +allocator specified by `allocator`, and returns the allocated slice. +*/ @(require_results) make_slice :: proc( $T: typeid/[]$E, @@ -263,6 +659,12 @@ make_slice :: proc( return runtime.make_slice(T, len, allocator, loc) } +/* +Allocate a dynamic array. + +This procedure creates a dynamic array of type `T`, with `allocator` as its +backing allocator, and initial length and capacity of `0`. +*/ @(require_results) make_dynamic_array :: proc( $T: typeid/[dynamic]$E, @@ -272,6 +674,13 @@ make_dynamic_array :: proc( return runtime.make_dynamic_array(T, allocator, loc) } +/* +Allocate a dynamic array with initial length. + +This procedure creates a dynamic array of type `T`, with `allocator` as its +backing allocator, and initial capacity of `0`, and initial length specified by +`len`. +*/ @(require_results) make_dynamic_array_len :: proc( $T: typeid/[dynamic]$E, @@ -282,6 +691,13 @@ make_dynamic_array_len :: proc( return runtime.make_dynamic_array_len_cap(T, len, len, allocator, loc) } +/* +Allocate a dynamic array with initial length and capacity. + +This procedure creates a dynamic array of type `T`, with `allocator` as its +backing allocator, and initial capacity specified by `cap`, and initial length +specified by `len`. +*/ @(require_results) make_dynamic_array_len_cap :: proc( $T: typeid/[dynamic]$E, @@ -293,6 +709,13 @@ make_dynamic_array_len_cap :: proc( return runtime.make_dynamic_array_len_cap(T, len, cap, allocator, loc) } +/* +Allocate a map. + +This procedure creates a map of type `T` with initial capacity specified by +`cap`, that is using an allocator specified by `allocator` as its backing +allocator. +*/ @(require_results) make_map :: proc( $T: typeid/map[$K]$E, @@ -303,6 +726,12 @@ make_map :: proc( return runtime.make_map(T, cap, allocator, loc) } +/* +Allocate a multi pointer. + +This procedure allocates a multipointer of type `T` pointing to `len` elements, +from an allocator specified by `allocator`. +*/ @(require_results) make_multi_pointer :: proc( $T: typeid/[^]$E, @@ -313,6 +742,9 @@ make_multi_pointer :: proc( return runtime.make_multi_pointer(T, len, allocator, loc) } +/* +Allocate. +*/ make :: proc{ make_slice, make_dynamic_array, @@ -322,6 +754,23 @@ make :: proc{ make_multi_pointer, } +/* +Default resize procedure. + +When allocator does not support resize operation, but supports `.Alloc` and +`.Free`, this procedure is used to implement allocator's default behavior on +resize. + +The behavior of the function is as follows: + +- If `new_size` is `0`, the function acts like `free()`, freeing the memory + region of `old_size` bytes located at `old_memory`. +- If `old_memory` is `nil`, the function acts like `alloc()`, allocating + `new_size` bytes of memory aligned on a boundary specified by `alignment`. +- Otherwise, a new memory region of size `new_size` is allocated, then the + data from the old memory region is copied and the old memory region is + freed. +*/ @(require_results) default_resize_align :: proc( old_memory: rawptr, @@ -343,6 +792,27 @@ default_resize_align :: proc( return } +/* +Default resize procedure. + +When allocator does not support resize operation, but supports +`.Alloc_Non_Zeroed` and `.Free`, this procedure is used to implement allocator's +default behavior on +resize. + +Unlike `default_resize_align` no new memory is being explicitly +zero-initialized. + +The behavior of the function is as follows: + +- If `new_size` is `0`, the function acts like `free()`, freeing the memory + region of `old_size` bytes located at `old_memory`. +- If `old_memory` is `nil`, the function acts like `alloc()`, allocating + `new_size` bytes of memory aligned on a boundary specified by `alignment`. +- Otherwise, a new memory region of size `new_size` is allocated, then the + data from the old memory region is copied and the old memory region is + freed. +*/ @(require_results) default_resize_bytes_align_non_zeroed :: proc( old_data: []byte, @@ -354,6 +824,23 @@ default_resize_bytes_align_non_zeroed :: proc( return _default_resize_bytes_align(old_data, new_size, alignment, false, allocator, loc) } +/* +Default resize procedure. + +When allocator does not support resize operation, but supports `.Alloc` and +`.Free`, this procedure is used to implement allocator's default behavior on +resize. + +The behavior of the function is as follows: + +- If `new_size` is `0`, the function acts like `free()`, freeing the memory + region specified by `old_data`. +- If `old_data` is `nil`, the function acts like `alloc()`, allocating + `new_size` bytes of memory aligned on a boundary specified by `alignment`. +- Otherwise, a new memory region of size `new_size` is allocated, then the + data from the old memory region is copied and the old memory region is + freed. +*/ @(require_results) default_resize_bytes_align :: proc( old_data: []byte, @@ -383,16 +870,13 @@ _default_resize_bytes_align :: #force_inline proc( return alloc_bytes_non_zeroed(new_size, alignment, allocator, loc) } } - if new_size == 0 { err := free_bytes(old_data, allocator, loc) return nil, err } - if new_size == old_size { return old_data, .None } - new_memory : []byte err : Allocator_Error if should_zero { @@ -403,7 +887,6 @@ _default_resize_bytes_align :: #force_inline proc( if new_memory == nil || err != nil { return nil, err } - runtime.copy(new_memory, old_data) free_bytes(old_data, allocator, loc) return new_memory, err From b78d54601021e4c22a0a62aa7a1cfa69405da455 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 11:02:17 +1100 Subject: [PATCH 047/320] [mem]: Add non_zeroed versions of resize --- core/mem/alloc.odin | 100 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 6 deletions(-) diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index dbf9af9b2..c2e55541c 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -409,10 +409,10 @@ This procedure resizes a memory region, `old_size` bytes in size, located at the address specified by `ptr`, such that it has a new size, specified by `new_size` and and is aligned on a boundary specified by `alignment`. -If the `ptr` parameter is `nil`, `resize()` acts just like `alloc`, allocating +If the `ptr` parameter is `nil`, `resize()` acts just like `alloc()`, allocating `new_size` bytes, aligned on a boundary specified by `alignment`. -If the `new_size` parameter is `0`, `resize()` acts just like `free`, freeing +If the `new_size` parameter is `0`, `resize()` acts just like `free()`, freeing the memory region `old_size` bytes in length, located at the address specified by `ptr`. @@ -444,6 +444,51 @@ resize :: proc( return raw_data(data), err } +/* +Resize a memory region without zero-initialization. + +This procedure resizes a memory region, `old_size` bytes in size, located at +the address specified by `ptr`, such that it has a new size, specified by +`new_size` and and is aligned on a boundary specified by `alignment`. + +If the `ptr` parameter is `nil`, `resize()` acts just like `alloc()`, allocating +`new_size` bytes, aligned on a boundary specified by `alignment`. + +If the `new_size` parameter is `0`, `resize()` acts just like `free()`, freeing +the memory region `old_size` bytes in length, located at the address specified +by `ptr`. + +Unlike `resize()`, this procedure does not explicitly zero-initialize any new +memory. + +**Inputs**: +- `ptr`: Pointer to the memory region to resize. +- `old_size`: Size of the memory region to resize. +- `new_size`: The desired size of the resized memory region. +- `alignment`: The desired alignment of the resized memory region. +- `allocator`: The owner of the memory region to resize. + +**Returns**: +1. The pointer to the resized memory region, if successfull, `nil` otherwise. +2. Error, if resize failed. + +**Note**: The `alignment` parameter is used to preserve the original alignment +of the allocation, if `resize()` needs to relocate the memory region. Do not +use `resize()` to change the alignment of the allocated memory region. +*/ +@(require_results) +resize_non_zeroed :: proc( + ptr: rawptr, + old_size: int, + new_size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + data, err := runtime.non_zero_mem_resize(ptr, old_size, new_size, alignment, allocator, loc) + return raw_data(data), err +} + /* Resize a memory region. @@ -451,11 +496,12 @@ This procedure resizes a memory region, specified by `old_data`, such that it has a new size, specified by `new_size` and and is aligned on a boundary specified by `alignment`. -If the `old_data` parameter is `nil`, `resize()` acts just like `alloc`, -allocating `new_size` bytes, aligned on a boundary specified by `alignment`. +If the `old_data` parameter is `nil`, `resize_bytes()` acts just like +`alloc_bytes()`, allocating `new_size` bytes, aligned on a boundary specified +by `alignment`. -If the `new_size` parameter is `0`, `resize()` acts just like `free`, freeing -the memory region specified by `old_data`. +If the `new_size` parameter is `0`, `resize_bytes()` acts just like +`free_bytes()`, freeing the memory region specified by `old_data`. **Inputs**: - `old_data`: Pointer to the memory region to resize. @@ -482,6 +528,48 @@ resize_bytes :: proc( return runtime.mem_resize(raw_data(old_data), len(old_data), new_size, alignment, allocator, loc) } +/* +Resize a memory region. + +This procedure resizes a memory region, specified by `old_data`, such that it +has a new size, specified by `new_size` and and is aligned on a boundary +specified by `alignment`. + +If the `old_data` parameter is `nil`, `resize_bytes()` acts just like +`alloc_bytes()`, allocating `new_size` bytes, aligned on a boundary specified +by `alignment`. + +If the `new_size` parameter is `0`, `resize_bytes()` acts just like +`free_bytes()`, freeing the memory region specified by `old_data`. + +Unlike `resize_bytes()`, this procedure does not explicitly zero-initialize +any new memory. + +**Inputs**: +- `old_data`: Pointer to the memory region to resize. +- `new_size`: The desired size of the resized memory region. +- `alignment`: The desired alignment of the resized memory region. +- `allocator`: The owner of the memory region to resize. + +**Returns**: +1. The resized memory region, if successfull, `nil` otherwise. +2. Error, if resize failed. + +**Note**: The `alignment` parameter is used to preserve the original alignment +of the allocation, if `resize()` needs to relocate the memory region. Do not +use `resize()` to change the alignment of the allocated memory region. +*/ +@(require_results) +resize_bytes_non_zeroed :: proc( + old_data: []byte, + new_size: int, + alignment: int = DEFAULT_ALIGNMENT, + allocator := context.allocator, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + return runtime.non_zero_mem_resize(raw_data(old_data), len(old_data), new_size, alignment, allocator, loc) +} + /* Query allocator features. */ From 6eb80831b5ec9e43f1b70eb305688e8cff60f0ce Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 11:12:28 +1100 Subject: [PATCH 048/320] [mem]: Panic when allocator is not initialized --- core/mem/allocators.odin | 67 +++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 34b89fcb8..e7b5faa16 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -57,14 +57,24 @@ init_arena :: proc(a: ^Arena, data: []byte) { } @(require_results) -arena_alloc :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> (rawptr, Allocator_Error) { - bytes, err := arena_alloc_bytes(a, size, alignment) +arena_alloc :: proc( + a: ^Arena, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := arena_alloc_bytes(a, size, alignment, loc) return raw_data(bytes), err } @(require_results) -arena_alloc_bytes :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { - bytes, err := arena_alloc_bytes_non_zeroed(a, size, alignment) +arena_alloc_bytes :: proc( + a: ^Arena, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := arena_alloc_bytes_non_zeroed(a, size, alignment, loc) if bytes != nil { zero_slice(bytes) } @@ -72,13 +82,26 @@ arena_alloc_bytes :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) } @(require_results) -arena_alloc_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> (rawptr, Allocator_Error) { - bytes, err := arena_alloc_bytes_non_zeroed(a, size, alignment) +arena_alloc_non_zeroed :: proc( + a: ^Arena, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := arena_alloc_bytes_non_zeroed(a, size, alignment, loc) return raw_data(bytes), err } @(require_results) -arena_alloc_bytes_non_zeroed :: proc(a: ^Arena, size: int, alignment := DEFAULT_ALIGNMENT) -> ([]byte, Allocator_Error) { +arena_alloc_bytes_non_zeroed :: proc( + a: ^Arena, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location +) -> ([]byte, Allocator_Error) { + if a.data == nil { + panic("Arena is not initialized", loc) + } #no_bounds_check end := &a.data[a.offset] ptr := align_forward(end, uintptr(alignment)) total_size := size + ptr_sub((^byte)(ptr), (^byte)(end)) @@ -101,22 +124,22 @@ arena_allocator_proc :: proc( alignment: int, old_memory: rawptr, old_size: int, - location := #caller_location, + loc := #caller_location, ) -> ([]byte, Allocator_Error) { arena := cast(^Arena)allocator_data switch mode { case .Alloc: - return arena_alloc_bytes(arena, size, alignment) + return arena_alloc_bytes(arena, size, alignment, loc) case .Alloc_Non_Zeroed: - return arena_alloc_bytes_non_zeroed(arena, size, alignment) + return arena_alloc_bytes_non_zeroed(arena, size, alignment, loc) case .Free: return nil, .Mode_Not_Implemented case .Free_All: arena_free_all(arena) case .Resize: - return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, arena_allocator(arena)) + return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, arena_allocator(arena), loc) case .Resize_Non_Zeroed: - return default_resize_bytes_align_non_zeroed(byte_slice(old_memory, old_size), size, alignment, arena_allocator(arena)) + return default_resize_bytes_align_non_zeroed(byte_slice(old_memory, old_size), size, alignment, arena_allocator(arena), loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -311,9 +334,6 @@ scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Alloc } scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { - if s.data == nil { - panic("free_all called on an unitialized scratch allocator", loc) - } s.curr_offset = 0 s.prev_allocation = nil for ptr in s.leaked_allocations { @@ -571,9 +591,6 @@ stack_free :: proc( } stack_free_all :: proc(s: ^Stack, loc := #caller_location) { - if s.data == nil { - panic("Stack free all on an uninitialized stack allocator", loc) - } s.prev_offset = 0 s.curr_offset = 0 } @@ -791,7 +808,7 @@ small_stack_alloc_bytes_non_zeroed :: proc( loc := #caller_location, ) -> ([]byte, Allocator_Error) { if s.data == nil { - return nil, .Invalid_Argument + panic("Small stack is not initialized", loc) } alignment := alignment alignment = clamp(alignment, 1, 8*size_of(Stack_Allocation_Header{}.padding)/2) @@ -815,6 +832,9 @@ small_stack_free :: proc( old_memory: rawptr, loc := #caller_location, ) -> Allocator_Error { + if s.data == nil { + panic("Small stack is not initialized", loc) + } if old_memory == nil { return nil } @@ -892,6 +912,9 @@ small_stack_resize_bytes_non_zeroed :: proc( alignment := DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { + if s.data == nil { + panic("Small stack is not initialized", loc) + } old_memory := raw_data(old_data) old_size := len(old_data) alignment := alignment @@ -1029,7 +1052,7 @@ dynamic_arena_destroy :: proc(pool: ^Dynamic_Arena) { @(private="file") _dynamic_arena_cycle_new_block :: proc(p: ^Dynamic_Arena, loc := #caller_location) -> (err: Allocator_Error) { if p.block_allocator.procedure == nil { - panic("You must call pool_init on a Pool before using it", loc) + panic("You must call arena_init on a Pool before using it", loc) } if p.current_block != nil { append(&p.used_blocks, p.current_block, loc=loc) @@ -1528,9 +1551,9 @@ buddy_allocator_proc :: proc( case .Alloc_Non_Zeroed: return buddy_allocator_alloc_bytes_non_zeroed(b, uint(size)) case .Resize: - return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, buddy_allocator(b)) + return default_resize_bytes_align(byte_slice(old_memory, old_size), size, alignment, buddy_allocator(b), loc) case .Resize_Non_Zeroed: - return default_resize_bytes_align_non_zeroed(byte_slice(old_memory, old_size), size, alignment, buddy_allocator(b)) + return default_resize_bytes_align_non_zeroed(byte_slice(old_memory, old_size), size, alignment, buddy_allocator(b), loc) case .Free: return nil, buddy_allocator_free(b, old_memory) case .Free_All: From f1f5dc614e0451c65d7e036ecb92eb76a7b753bd Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 11:17:27 +1100 Subject: [PATCH 049/320] [mem]: Remove old comments --- core/mem/allocators.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index e7b5faa16..2ee397316 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -402,7 +402,6 @@ scratch_resize_bytes_non_zeroed :: proc( } begin := uintptr(raw_data(s.data)) end := begin + uintptr(len(s.data)) - // TODO(flysand): Doesn't handle old_memory == nil old_ptr := uintptr(old_memory) if begin <= old_ptr && old_ptr < end && old_ptr+uintptr(size) < end { s.curr_offset = int(old_ptr-begin)+size @@ -412,7 +411,6 @@ scratch_resize_bytes_non_zeroed :: proc( if err != nil { return data, err } - // TODO(flysand): OOB access on size < old_size. runtime.copy(data, byte_slice(old_memory, old_size)) err = scratch_free(s, old_memory, loc) return data, err From 73e495434666b230e16ea7300c957ddc978e3e1a Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sun, 8 Sep 2024 02:52:43 +0200 Subject: [PATCH 050/320] Better #+build tag error messages: Error when using more than one !notted operating system per build line. Error when using more than one operating system within a 'kind', such as writing #+build windows linux. --- src/parser.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 03ed725c5..7f2fa9b70 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6106,9 +6106,12 @@ gb_internal bool parse_build_tag(Token token_for_pos, String s) { } bool any_correct = false; + bool any_notted_os_seen = false; + bool any_os_seen = false; while (s.len > 0) { bool this_kind_correct = true; + bool this_kind_os_seen = false; do { String p = string_trim_whitespace(build_tag_get_token(s, &s)); @@ -6133,12 +6136,30 @@ gb_internal bool parse_build_tag(Token token_for_pos, String s) { continue; } + TargetOsKind os = get_target_os_from_string(p); TargetArchKind arch = get_target_arch_from_string(p); if (os != TargetOs_Invalid) { + // Catches cases where you have multiple !notted operating systems on a line. This never does what you think since + // you need a new build line to get a logical AND. + if (any_notted_os_seen && is_notted) { + syntax_error(token_for_pos, "Invalid build tag: Use a separate '#+build' line for each platform that has '!' in front."); + break; + } + + // Catches 'windows linux', which is an impossible combination. + if (this_kind_os_seen) { + syntax_error(token_for_pos, "Invalid build tag: Missing ',' before '%.*s'. Format: '#+build linux, windows, darwin' or '#+build linux amd64, darwin, windows i386'", LIT(p)); + break; + } + + this_kind_os_seen = true; + any_os_seen = true; + GB_ASSERT(arch == TargetArch_Invalid); if (is_notted) { this_kind_correct = this_kind_correct && (os != build_context.metrics.os); + any_notted_os_seen = true; } else { this_kind_correct = this_kind_correct && (os == build_context.metrics.os); } @@ -6427,7 +6448,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { // There was an OK package declaration. But there some invalid token was hit before the package declaration. if (has_first_invalid_pre_package_token) { - syntax_error(first_invalid_pre_package_token, "There can only be lines starting with #+ or // before package declaration"); + syntax_error(first_invalid_pre_package_token, "There can only be lines starting with '#+' or '//' before package declaration"); return false; } @@ -6464,7 +6485,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { if (string_starts_with(str, str_lit("//"))) { String lc = string_trim_whitespace(substring(str, 2, str.len)); if (string_starts_with(lc, str_lit("+"))) { - syntax_warning(tok, "//+ is deprecated: Use #+ instead"); + syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); String lt = substring(lc, 1, lc.len); if (process_file_tag(lt, tok, f) == false) { return false; From 3b30bc305c9da737545c96173b566efb1e10b466 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 14:13:03 +1100 Subject: [PATCH 051/320] [mem]: Document raw.odin --- core/mem/raw.odin | 74 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/core/mem/raw.odin b/core/mem/raw.odin index 7fda3229d..ab1148cea 100644 --- a/core/mem/raw.odin +++ b/core/mem/raw.odin @@ -3,40 +3,86 @@ package mem import "base:builtin" import "base:runtime" +/* +Mamory layout of the `any` type. +*/ Raw_Any :: runtime.Raw_Any +/* +Mamory layout of the `string` type. +*/ Raw_String :: runtime.Raw_String - +/* +Mamory layout of the `cstring` type. +*/ Raw_Cstring :: runtime.Raw_Cstring - +/* +Mamory layout of `[]T` types. +*/ Raw_Slice :: runtime.Raw_Slice - +/* +Mamory layout of `[dynamic]T` types. +*/ Raw_Dynamic_Array :: runtime.Raw_Dynamic_Array - +/* +Mamory layout of `map[K]V` types. +*/ Raw_Map :: runtime.Raw_Map - +/* +Mamory layout of `#soa []T` types. +*/ Raw_Soa_Pointer :: runtime.Raw_Soa_Pointer - +/* +Mamory layout of the `complex32` type. +*/ Raw_Complex32 :: runtime.Raw_Complex32 - +/* +Mamory layout of the `complex64` type. +*/ Raw_Complex64 :: runtime.Raw_Complex64 - +/* +Mamory layout of the `complex128` type. +*/ Raw_Complex128 :: runtime.Raw_Complex128 - +/* +Mamory layout of the `quaternion64` type. +*/ Raw_Quaternion64 :: runtime.Raw_Quaternion64 - +/* +Mamory layout of the `quaternion128` type. +*/ Raw_Quaternion128 :: runtime.Raw_Quaternion128 - +/* +Mamory layout of the `quaternion256` type. +*/ Raw_Quaternion256 :: runtime.Raw_Quaternion256 - +/* +Mamory layout of the `quaternion64` type. +*/ Raw_Quaternion64_Vector_Scalar :: runtime.Raw_Quaternion64_Vector_Scalar - +/* +Mamory layout of the `quaternion128` type. +*/ Raw_Quaternion128_Vector_Scalar :: runtime.Raw_Quaternion128_Vector_Scalar - +/* +Mamory layout of the `quaternion256` type. +*/ Raw_Quaternion256_Vector_Scalar :: runtime.Raw_Quaternion256_Vector_Scalar +/* +Create a value of the any type. + +This procedure creates a value with type `any` that points to an object with +typeid `id` located at an address specified by `data`. +*/ make_any :: proc "contextless" (data: rawptr, id: typeid) -> any { return transmute(any)Raw_Any{data, id} } +/* +Obtain pointer to the data. + +This procedure returns the pointer to the data of a slice, string, or a dynamic +array. +*/ raw_data :: builtin.raw_data From 299accb717ff376bbb063cde7585d582b658d405 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 14:17:32 +1100 Subject: [PATCH 052/320] [mem]: Put panic allocator after nil allocator, adjust @require_results --- core/mem/allocators.odin | 115 +++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 2ee397316..649d5466a 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -3,6 +3,7 @@ package mem import "base:intrinsics" import "base:runtime" +@(require_results) nil_allocator :: proc() -> Allocator { return Allocator{ procedure = nil_allocator_proc, @@ -21,6 +22,62 @@ nil_allocator_proc :: proc( return nil, nil } + + +@(require_results) +panic_allocator :: proc() -> Allocator { + return Allocator{ + procedure = panic_allocator_proc, + data = nil, + } +} + +panic_allocator_proc :: proc( + allocator_data: rawptr, + mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, + old_size: int, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + switch mode { + case .Alloc: + if size > 0 { + panic("mem: panic allocator, .Alloc called", loc=loc) + } + case .Alloc_Non_Zeroed: + if size > 0 { + panic("mem: panic allocator, .Alloc_Non_Zeroed called", loc=loc) + } + case .Resize: + if size > 0 { + panic("mem: panic allocator, .Resize called", loc=loc) + } + case .Resize_Non_Zeroed: + if size > 0 { + panic("mem: panic allocator, .Resize_Non_Zeroed called", loc=loc) + } + case .Free: + if old_memory != nil { + panic("mem: panic allocator, .Free called", loc=loc) + } + case .Free_All: + panic("mem: panic allocator, .Free_All called", loc=loc) + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory) + if set != nil { + set^ = {.Query_Features} + } + return nil, nil + + case .Query_Info: + panic("mem: panic allocator, .Query_Info called", loc=loc) + } + return nil, nil +} + + + Arena :: struct { data: []byte, offset: int, @@ -300,7 +357,6 @@ scratch_alloc_bytes_non_zeroed :: proc( return ptr, err } -@(require_results) scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error { if s.data == nil { panic("Free on an uninitialized scratch allocator", loc) @@ -555,7 +611,6 @@ stack_alloc_bytes_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } -@(require_results) stack_free :: proc( s: ^Stack, old_memory: rawptr, @@ -824,7 +879,6 @@ small_stack_alloc_bytes_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } -@(require_results) small_stack_free :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -1254,60 +1308,6 @@ dynamic_arena_allocator_proc :: proc( -panic_allocator_proc :: proc( - allocator_data: rawptr, - mode: Allocator_Mode, - size, alignment: int, - old_memory: rawptr, - old_size: int, - loc := #caller_location, -) -> ([]byte, Allocator_Error) { - switch mode { - case .Alloc: - if size > 0 { - panic("mem: panic allocator, .Alloc called", loc=loc) - } - case .Alloc_Non_Zeroed: - if size > 0 { - panic("mem: panic allocator, .Alloc_Non_Zeroed called", loc=loc) - } - case .Resize: - if size > 0 { - panic("mem: panic allocator, .Resize called", loc=loc) - } - case .Resize_Non_Zeroed: - if size > 0 { - panic("mem: panic allocator, .Resize_Non_Zeroed called", loc=loc) - } - case .Free: - if old_memory != nil { - panic("mem: panic allocator, .Free called", loc=loc) - } - case .Free_All: - panic("mem: panic allocator, .Free_All called", loc=loc) - case .Query_Features: - set := (^Allocator_Mode_Set)(old_memory) - if set != nil { - set^ = {.Query_Features} - } - return nil, nil - - case .Query_Info: - panic("mem: panic allocator, .Query_Info called", loc=loc) - } - return nil, nil -} - -@(require_results) -panic_allocator :: proc() -> Allocator { - return Allocator{ - procedure = panic_allocator_proc, - data = nil, - } -} - - - Buddy_Block :: struct #align(align_of(uint)) { size: uint, is_free: bool, @@ -1513,7 +1513,6 @@ buddy_allocator_alloc_bytes_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) return nil, nil } -@(require_results) buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Error { if ptr != nil { if !(b.head <= ptr && ptr <= b.tail) { From 05df34f99c97eefc6957786150e19010cb84c230 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 18:44:33 +1100 Subject: [PATCH 053/320] [mem]: Start documenting allocators.odin --- core/mem/allocators.odin | 663 ++++++++++++++++++++++++++++++++++----- 1 file changed, 592 insertions(+), 71 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 649d5466a..972031a21 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -3,6 +3,13 @@ package mem import "base:intrinsics" import "base:runtime" +/* +Nil allocator. + +The `nil` allocator returns `nil` on every allocation attempt. This type of +allocator can be used in scenarios where memory doesn't need to be allocated, +but an attempt to allocate memory is not an error. +*/ @(require_results) nil_allocator :: proc() -> Allocator { return Allocator{ @@ -23,7 +30,13 @@ nil_allocator_proc :: proc( } +/* +Panic allocator. +The panic allocator is a type of allocator that panics on any allocation +attempt. This type of allocator can be used in scenarios where memory should +not be allocated, and an attempt to allocate memory is an error. +*/ @(require_results) panic_allocator :: proc() -> Allocator { return Allocator{ @@ -77,7 +90,9 @@ panic_allocator_proc :: proc( } - +/* +Arena allocator data. +*/ Arena :: struct { data: []byte, offset: int, @@ -85,11 +100,19 @@ Arena :: struct { temp_count: int, } -Arena_Temp_Memory :: struct { - arena: ^Arena, - prev_offset: int, -} +/* +Arena allocator. +The arena allocator (also known as a linear allocator, bump allocator, +region allocator) is an allocator that uses a single backing buffer for +allocations. + +The buffer is being used contiguously, from start by end. Each subsequent +allocation occupies the next adjacent region of memory in the buffer. Since +arena allocator does not keep track of any metadata associated with the +allocations and their locations, it is impossible to free individual +allocations. +*/ @(require_results) arena_allocator :: proc(arena: ^Arena) -> Allocator { return Allocator{ @@ -98,6 +121,12 @@ arena_allocator :: proc(arena: ^Arena) -> Allocator { } } +/* +Initialize an arena. + +This procedure initializes the arena `a` with memory region `data` as it's +backing buffer. +*/ arena_init :: proc(a: ^Arena, data: []byte) { a.data = data a.offset = 0 @@ -113,6 +142,13 @@ init_arena :: proc(a: ^Arena, data: []byte) { a.temp_count = 0 } +/* +Allocate memory from an arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from an arena `a`. The allocated memory is zero-initialized. +This procedure returns a pointer to the newly allocated memory region. +*/ @(require_results) arena_alloc :: proc( a: ^Arena, @@ -124,6 +160,13 @@ arena_alloc :: proc( return raw_data(bytes), err } +/* +Allocate memory from an arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from an arena `a`. The allocated memory is zero-initialized. +This procedure returns a slice of the newly allocated memory region. +*/ @(require_results) arena_alloc_bytes :: proc( a: ^Arena, @@ -138,6 +181,14 @@ arena_alloc_bytes :: proc( return bytes, err } +/* +Allocate non-initialized memory from an arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from an arena `a`. The allocated memory is not explicitly +zero-initialized. This procedure returns a pointer to the newly allocated +memory region. +*/ @(require_results) arena_alloc_non_zeroed :: proc( a: ^Arena, @@ -149,6 +200,14 @@ arena_alloc_non_zeroed :: proc( return raw_data(bytes), err } +/* +Allocate non-initialized memory from an arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from an arena `a`. The allocated memory is not explicitly +zero-initialized. This procedure returns a slice of the newly allocated +memory region. +*/ @(require_results) arena_alloc_bytes_non_zeroed :: proc( a: ^Arena, @@ -170,6 +229,9 @@ arena_alloc_bytes_non_zeroed :: proc( return byte_slice(ptr, size), nil } +/* +Free all memory to an arena. +*/ arena_free_all :: proc(a: ^Arena) { a.offset = 0 } @@ -209,6 +271,28 @@ arena_allocator_proc :: proc( return nil, nil } +/* +Temporary memory region of arena. + +Temporary memory regions of arena act as "savepoints" for arena. When one is +created, the subsequent allocations are done inside the temporary memory +region. When `end_arena_temp_memory` is called, the arena is rolled back, and +all of the memory that was allocated from the arena will be freed. + +Multiple temporary memory regions can exist at the same time for an arena. +*/ +Arena_Temp_Memory :: struct { + arena: ^Arena, + prev_offset: int, +} + +/* +Start a temporary memory region. + +This procedure creates a temporary memory region. After a temporary memory +region is created, all allocations are said to be *inside* the temporary memory +region, until `end_arena_temp_memory` is called. +*/ @(require_results) begin_arena_temp_memory :: proc(a: ^Arena) -> Arena_Temp_Memory { tmp: Arena_Temp_Memory @@ -218,6 +302,12 @@ begin_arena_temp_memory :: proc(a: ^Arena) -> Arena_Temp_Memory { return tmp } +/* +End a temporary memory region. + +This procedure ends the temporary memory region for an arena. All of the +allocations *inside* the temporary memory region will be freed to the arena. +*/ end_arena_temp_memory :: proc(tmp: Arena_Temp_Memory) { assert(tmp.arena.offset >= tmp.prev_offset) assert(tmp.arena.temp_count > 0) @@ -225,11 +315,14 @@ end_arena_temp_memory :: proc(tmp: Arena_Temp_Memory) { tmp.arena.temp_count -= 1 } -/* old procedures */ +/* Preserved for compatibility */ Scratch_Allocator :: Scratch scratch_allocator_init :: scratch_init scratch_allocator_destroy :: scratch_destroy +/* +Scratch allocator data. +*/ Scratch :: struct { data: []byte, curr_offset: int, @@ -238,6 +331,23 @@ Scratch :: struct { leaked_allocations: [dynamic][]byte, } +/* +Scratch allocator. + +The scratch allocator works in a similar way to the `Arena` allocator. The +scratch allocator has a backing buffer, that is being allocated in +contiguous regions, from start to end. + +Each subsequent allocation will be the next adjacent region of memory in the +backing buffer. If the allocation doesn't fit into the remaining space of the +backing buffer, this allocation is put at the start of the buffer, and all +previous allocations will become invalidated. If the allocation doesn't fit +into the backing buffer as a whole, it will be allocated using a backing +allocator, and pointer to the allocated memory region will be put into the +`leaked_allocations` array. + +The `leaked_allocations` array is managed by the `context` allocator. +*/ @(require_results) scratch_allocator :: proc(allocator: ^Scratch) -> Allocator { return Allocator{ @@ -246,6 +356,9 @@ scratch_allocator :: proc(allocator: ^Scratch) -> Allocator { } } +/* +Initialize scratch allocator. +*/ scratch_init :: proc(s: ^Scratch, size: int, backup_allocator := context.allocator) -> Allocator_Error { s.data = make_aligned([]byte, size, 2*align_of(rawptr), backup_allocator) or_return s.curr_offset = 0 @@ -255,6 +368,9 @@ scratch_init :: proc(s: ^Scratch, size: int, backup_allocator := context.allocat return nil } +/* +Free all data associated with a scratch allocator. +*/ scratch_destroy :: proc(s: ^Scratch) { if s == nil { return @@ -267,6 +383,13 @@ scratch_destroy :: proc(s: ^Scratch) { s^ = {} } +/* +Allocate memory from scratch allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is zero-initialized. This procedure +returns a pointer to the allocated memory region. +*/ @(require_results) scratch_alloc :: proc( s: ^Scratch, @@ -278,6 +401,13 @@ scratch_alloc :: proc( return raw_data(bytes), err } +/* +Allocate memory from scratch allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is zero-initialized. This procedure +returns a slice of the allocated memory region. +*/ @(require_results) scratch_alloc_bytes :: proc( s: ^Scratch, @@ -292,6 +422,13 @@ scratch_alloc_bytes :: proc( return bytes, err } +/* +Allocate memory from scratch allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is not explicitly zero-initialized. +This procedure returns a pointer to the allocated memory region. +*/ @(require_results) scratch_alloc_non_zeroed :: proc( s: ^Scratch, @@ -303,6 +440,13 @@ scratch_alloc_non_zeroed :: proc( return raw_data(bytes), err } +/* +Allocate memory from scratch allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is not explicitly zero-initialized. +This procedure returns a slice of the allocated memory region. +*/ @(require_results) scratch_alloc_bytes_non_zeroed :: proc( s: ^Scratch, @@ -319,44 +463,49 @@ scratch_alloc_bytes_non_zeroed :: proc( } size := size size = align_forward_int(size, alignment) - switch { - case s.curr_offset+size <= len(s.data): + if size <= len(s.data) { + offset := uintptr(0) + if s.curr_offset+size <= len(s.data) { + offset = uintptr(s.curr_offset) + } else { + offset = 0 + } start := uintptr(raw_data(s.data)) - ptr := start + uintptr(s.curr_offset) - ptr = align_forward_uintptr(ptr, uintptr(alignment)) + ptr := align_forward_uintptr(offset+start, uintptr(alignment)) s.prev_allocation = rawptr(ptr) - offset := int(ptr - start) - s.curr_offset = offset + size + s.curr_offset = int(offset) + size return byte_slice(rawptr(ptr), size), nil - case size <= len(s.data): - start := uintptr(raw_data(s.data)) - ptr := align_forward_uintptr(start, uintptr(alignment)) - s.prev_allocation = rawptr(ptr) - offset := int(ptr - start) - s.curr_offset = offset + size - return byte_slice(rawptr(ptr), size), nil - } - a := s.backup_allocator - if a.procedure == nil { - a = context.allocator - s.backup_allocator = a - } - ptr, err := alloc_bytes_non_zeroed(size, alignment, a, loc) - if err != nil { + } else { + a := s.backup_allocator + if a.procedure == nil { + a = context.allocator + s.backup_allocator = a + } + ptr, err := alloc_bytes_non_zeroed(size, alignment, a, loc) + if err != nil { + return ptr, err + } + if s.leaked_allocations == nil { + s.leaked_allocations, err = make([dynamic][]byte, a) + } + append(&s.leaked_allocations, ptr) + if logger := context.logger; logger.lowest_level <= .Warning { + if logger.procedure != nil { + logger.procedure(logger.data, .Warning, "mem.Scratch resorted to backup_allocator" , logger.options, loc) + } + } return ptr, err } - if s.leaked_allocations == nil { - s.leaked_allocations, err = make([dynamic][]byte, a) - } - append(&s.leaked_allocations, ptr) - if logger := context.logger; logger.lowest_level <= .Warning { - if logger.procedure != nil { - logger.procedure(logger.data, .Warning, "mem.Scratch resorted to backup_allocator" , logger.options, loc) - } - } - return ptr, err } +/* +Free memory to scratch allocator. + +This procedure frees the memory region allocated at pointer `ptr`. + +If `ptr` is not the latest allocation and is not a leaked allocation, this +operation is a no-op. +*/ scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error { if s.data == nil { panic("Free on an uninitialized scratch allocator", loc) @@ -389,6 +538,9 @@ scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Alloc return .Invalid_Pointer } +/* +Free all memory to the scratch allocator. +*/ scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { s.curr_offset = 0 s.prev_allocation = nil @@ -398,6 +550,22 @@ scratch_free_all :: proc(s: ^Scratch, loc := #caller_location) { clear(&s.leaked_allocations) } +/* +Resize an allocation. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `scratch_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `scratch_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) scratch_resize :: proc( s: ^Scratch, @@ -411,6 +579,22 @@ scratch_resize :: proc( return raw_data(bytes), err } +/* +Resize an allocation. + +This procedure resizes a memory region, specified by `old_data`, to have a size +`size` and alignment `alignment`. The newly allocated memory, if any is +zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `scratch_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `scratch_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) scratch_resize_bytes :: proc( s: ^Scratch, @@ -426,6 +610,22 @@ scratch_resize_bytes :: proc( return bytes, err } +/* +Resize an allocation without zero-initialization. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is not explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `scratch_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `scratch_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) scratch_resize_non_zeroed :: proc( s: ^Scratch, @@ -439,6 +639,22 @@ scratch_resize_non_zeroed :: proc( return raw_data(bytes), err } +/* +Resize an allocation. + +This procedure resizes a memory region, specified by `old_data`, to have a size +`size` and alignment `alignment`. The newly allocated memory, if any is not +explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `scratch_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `scratch_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) scratch_resize_bytes_non_zeroed :: proc( s: ^Scratch, @@ -509,7 +725,9 @@ scratch_allocator_proc :: proc( -// Stack is a stack-like allocator which has a strict memory freeing order +/* +Stack allocator data. +*/ Stack :: struct { data: []byte, prev_offset: int, @@ -517,11 +735,30 @@ Stack :: struct { peak_used: int, } +/* +Header of a stack allocation. +*/ Stack_Allocation_Header :: struct { prev_offset: int, padding: int, } +/* +Stack allocator. + +The stack allocator is an allocator that allocates data in the backing buffer +linearly, from start to end. Each subsequent allocation will get the next +adjacent memory region. + +Unlike arena allocator, the stack allocator saves allocation metadata and has +a strict freeing order. Only the last allocated element can be freed. After the +last allocated element is freed, the next previous allocated element becomes +available for freeing. + +The metadata is stored in the allocation headers, that are located before the +start of each allocated memory region. Each header points to the start of the +previous allocation header. +*/ @(require_results) stack_allocator :: proc(stack: ^Stack) -> Allocator { return Allocator{ @@ -530,6 +767,12 @@ stack_allocator :: proc(stack: ^Stack) -> Allocator { } } +/* +Initialize the stack allocator. + +This procedure initializes the stack allocator with a backing buffer specified +by `data` parameter. +*/ stack_init :: proc(s: ^Stack, data: []byte) { s.data = data s.prev_offset = 0 @@ -545,6 +788,13 @@ init_stack :: proc(s: ^Stack, data: []byte) { s.peak_used = 0 } +/* +Allocate memory from stack. + +This procedure allocates `size` bytes of memory, aligned to the boundary +specified by `alignment`. The allocated memory is zero-initialized. This +procedure returns the pointer to the allocated memory. +*/ @(require_results) stack_alloc :: proc( s: ^Stack, @@ -556,6 +806,13 @@ stack_alloc :: proc( return raw_data(bytes), err } +/* +Allocate memory from stack. + +This procedure allocates `size` bytes of memory, aligned to the boundary +specified by `alignment`. The allocated memory is zero-initialized. This +procedure returns the slice of the allocated memory. +*/ @(require_results) stack_alloc_bytes :: proc( s: ^Stack, @@ -570,6 +827,13 @@ stack_alloc_bytes :: proc( return bytes, err } +/* +Allocate memory from stack. + +This procedure allocates `size` bytes of memory, aligned to the boundary +specified by `alignment`. The allocated memory is not explicitly +zero-initialized. This procedure returns the pointer to the allocated memory. +*/ @(require_results) stack_alloc_non_zeroed :: proc( s: ^Stack, @@ -581,6 +845,13 @@ stack_alloc_non_zeroed :: proc( return raw_data(bytes), err } +/* +Allocate memory from stack. + +This procedure allocates `size` bytes of memory, aligned to the boundary +specified by `alignment`. The allocated memory is not explicitly +zero-initialized. This procedure returns the slice of the allocated memory. +*/ @(require_results) stack_alloc_bytes_non_zeroed :: proc( s: ^Stack, @@ -611,6 +882,13 @@ stack_alloc_bytes_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } +/* +Free memory to the stack. + +This procedure frees the memory region starting at `old_memory` to the stack. +If the freeing does is an out of order freeing, the `.Invalid_Pointer` error +is returned. +*/ stack_free :: proc( s: ^Stack, old_memory: rawptr, @@ -643,12 +921,30 @@ stack_free :: proc( return nil } +/* +Free all allocations to the stack. +*/ stack_free_all :: proc(s: ^Stack, loc := #caller_location) { s.prev_offset = 0 s.curr_offset = 0 } +/* +Resize an allocation. +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) stack_resize :: proc( s: ^Stack, @@ -662,6 +958,22 @@ stack_resize :: proc( return raw_data(bytes), err } +/* +Resize an allocation. + +This procedure resizes a memory region, specified by the `old_data` parameter +to have a size `size` and alignment `alignment`. The newly allocated memory, +if any is zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) stack_resize_bytes :: proc( s: ^Stack, @@ -681,6 +993,22 @@ stack_resize_bytes :: proc( return bytes, err } +/* +Resize an allocation without zero-initialization. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is not explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) stack_resize_non_zeroed :: proc( s: ^Stack, @@ -694,6 +1022,22 @@ stack_resize_non_zeroed :: proc( return raw_data(bytes), err } +/* +Resize an allocation without zero-initialization. + +This procedure resizes a memory region, specified by the `old_data` parameter +to have a size `size` and alignment `alignment`. The newly allocated memory, +if any is not explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) stack_resize_bytes_non_zeroed :: proc( s: ^Stack, @@ -784,18 +1128,28 @@ stack_allocator_proc :: proc( } - +/* +Allocation header of the small stack allocator. +*/ Small_Stack_Allocation_Header :: struct { padding: u8, } -// Small_Stack is a stack-like allocator which uses the smallest possible header but at the cost of non-strict memory freeing order +/* +Small stack allocator data. +*/ Small_Stack :: struct { data: []byte, offset: int, peak_used: int, } +/* +Initialize small stack. + +This procedure initializes the small stack allocator with `data` as its backing +buffer. +*/ small_stack_init :: proc(s: ^Small_Stack, data: []byte) { s.data = data s.offset = 0 @@ -809,6 +1163,28 @@ init_small_stack :: proc(s: ^Small_Stack, data: []byte) { s.peak_used = 0 } +/* +Small stack allocator. + +The small stack allocator is just like a stack allocator, with the only +difference being an extremely small header size. Unlike the stack allocator, +small stack allows out-of order freeing of memory. + +The memory is allocated in the backing buffer linearly, from start to end. +Each subsequent allocation will get the next adjacent memory region. + +The metadata is stored in the allocation headers, that are located before the +start of each allocated memory region. Each header contains the amount of +padding bytes between that header and end of the previous allocation. + +## Properties + +**Performance characteristics**: TODO + +**Has a backing allocator**: No + +**Saves metadata**: Allocation header before each allocation. +*/ @(require_results) small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { return Allocator{ @@ -817,6 +1193,13 @@ small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { } } +/* +Allocate memory from small stack. + +This procedure allocates `size` bytes of memory aligned to a boundary specified +by `alignment`. The allocated memory is zero-initialized. This procedure +returns a pointer to the allocated memory region. +*/ @(require_results) small_stack_alloc :: proc( s: ^Small_Stack, @@ -828,6 +1211,13 @@ small_stack_alloc :: proc( return raw_data(bytes), err } +/* +Allocate memory from small stack. + +This procedure allocates `size` bytes of memory aligned to a boundary specified +by `alignment`. The allocated memory is zero-initialized. This procedure +returns a slice of the allocated memory region. +*/ @(require_results) small_stack_alloc_bytes :: proc( s: ^Small_Stack, @@ -842,6 +1232,13 @@ small_stack_alloc_bytes :: proc( return bytes, err } +/* +Allocate memory from small stack. + +This procedure allocates `size` bytes of memory aligned to a boundary specified +by `alignment`. The allocated memory is not explicitly zero-initialized. This +procedure returns a pointer to the allocated memory region. +*/ @(require_results) small_stack_alloc_non_zeroed :: proc( s: ^Small_Stack, @@ -853,6 +1250,13 @@ small_stack_alloc_non_zeroed :: proc( return raw_data(bytes), err } +/* +Allocate memory from small stack. + +This procedure allocates `size` bytes of memory aligned to a boundary specified +by `alignment`. The allocated memory is not explicitly zero-initialized. This +procedure returns a slice of the allocated memory region. +*/ @(require_results) small_stack_alloc_bytes_non_zeroed :: proc( s: ^Small_Stack, @@ -879,6 +1283,13 @@ small_stack_alloc_bytes_non_zeroed :: proc( return byte_slice(rawptr(next_addr), size), nil } +/* +Allocate memory from small stack. + +This procedure allocates `size` bytes of memory aligned to a boundary specified +by `alignment`. The allocated memory is not explicitly zero-initialized. This +procedure returns a slice of the allocated memory region. +*/ small_stack_free :: proc( s: ^Small_Stack, old_memory: rawptr, @@ -907,10 +1318,29 @@ small_stack_free :: proc( return nil } +/* +Free all memory to small stack. +*/ small_stack_free_all :: proc(s: ^Small_Stack) { s.offset = 0 } +/* +Resize an allocation. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `small_stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `small_stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) small_stack_resize :: proc( s: ^Small_Stack, @@ -924,6 +1354,22 @@ small_stack_resize :: proc( return raw_data(bytes), err } +/* +Resize an allocation. + +This procedure resizes a memory region, specified by the `old_data` parameter +to have a size `size` and alignment `alignment`. The newly allocated memory, +if any is zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `small_stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `small_stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) small_stack_resize_bytes :: proc( s: ^Small_Stack, @@ -943,6 +1389,22 @@ small_stack_resize_bytes :: proc( return bytes, err } +/* +Resize an allocation without zero-initialization. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is not explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `small_stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `small_stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) small_stack_resize_non_zeroed :: proc( s: ^Small_Stack, @@ -956,6 +1418,22 @@ small_stack_resize_non_zeroed :: proc( return raw_data(bytes), err } +/* +Resize an allocation without zero-initialization. + +This procedure resizes a memory region, specified by the `old_data` parameter +to have a size `size` and alignment `alignment`. The newly allocated memory, +if any is not explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `small_stack_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `small_stack_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) small_stack_resize_bytes_non_zeroed :: proc( s: ^Small_Stack, @@ -1050,11 +1528,19 @@ dynamic_pool_init :: dynamic_arena_init dynamic_pool_allocator :: dynamic_arena_allocator dynamic_pool_destroy :: dynamic_arena_destroy - - +/* +Default block size for dynamic arena. +*/ DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT :: 65536 + +/* +Default out-band size of the dynamic arena. +*/ DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT :: 6554 +/* +Dynamic arena allocator data. +*/ Dynamic_Arena :: struct { block_size: int, out_band_size: int, @@ -1068,65 +1554,95 @@ Dynamic_Arena :: struct { block_allocator: Allocator, } +/* +Initialize a dynamic arena. + +This procedure initializes a dynamic arena. The specified `block_allocator` +will be used to allocate arena blocks, and `array_allocator` to allocate +arrays of blocks and out-band blocks. The blocks have the default size of +`block_size` and out-band threshold will be `out_band_size`. All allocations +will be aligned to a boundary specified by `alignment`. +*/ dynamic_arena_init :: proc( - pool: ^Dynamic_Arena, + a: ^Dynamic_Arena, block_allocator := context.allocator, array_allocator := context.allocator, block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, alignment := DEFAULT_ALIGNMENT, ) { - pool.block_size = block_size - pool.out_band_size = out_band_size - pool.alignment = alignment - pool.block_allocator = block_allocator - pool.out_band_allocations.allocator = array_allocator - pool.unused_blocks.allocator = array_allocator - pool.used_blocks.allocator = array_allocator + a.block_size = block_size + a.out_band_size = out_band_size + a.alignment = alignment + a.block_allocator = block_allocator + a.out_band_allocations.allocator = array_allocator + a.unused_blocks.allocator = array_allocator + a.used_blocks.allocator = array_allocator } +/* +Dynamic arena allocator. + +The dynamic arena allocator uses blocks of a specific size, allocated on-demand +using the block allocator. This allocator acts similarly to arena. All +allocations in a block happen contiguously, from start to end. If an allocation +does not fit into the remaining space of the block, and its size is smaller +than the specified out-band size, a new block is allocated using the +`block_allocator` and the allocation is performed from a newly-allocated block. + +If an allocation has bigger size than the specified out-band size, a new block +is allocated such that the allocation fits into this new block. This is referred +to as an *out-band allocation*. The out-band blocks are kept separately from +normal blocks. + +Just like arena, the dynamic arena does not support freeing of individual +objects. +*/ @(require_results) -dynamic_arena_allocator :: proc(pool: ^Dynamic_Arena) -> Allocator { +dynamic_arena_allocator :: proc(a: ^Dynamic_Arena) -> Allocator { return Allocator{ procedure = dynamic_arena_allocator_proc, - data = pool, + data = a, } } -dynamic_arena_destroy :: proc(pool: ^Dynamic_Arena) { - dynamic_arena_free_all(pool) - delete(pool.unused_blocks) - delete(pool.used_blocks) - delete(pool.out_band_allocations) - zero(pool, size_of(pool^)) +/* +Destroy a dynamic arena. +*/ +dynamic_arena_destroy :: proc(a: ^Dynamic_Arena) { + dynamic_arena_free_all(a) + delete(a.unused_blocks) + delete(a.used_blocks) + delete(a.out_band_allocations) + zero(a, size_of(a^)) } @(private="file") -_dynamic_arena_cycle_new_block :: proc(p: ^Dynamic_Arena, loc := #caller_location) -> (err: Allocator_Error) { - if p.block_allocator.procedure == nil { +_dynamic_arena_cycle_new_block :: proc(a: ^Dynamic_Arena, loc := #caller_location) -> (err: Allocator_Error) { + if a.block_allocator.procedure == nil { panic("You must call arena_init on a Pool before using it", loc) } - if p.current_block != nil { - append(&p.used_blocks, p.current_block, loc=loc) + if a.current_block != nil { + append(&a.used_blocks, a.current_block, loc=loc) } new_block: rawptr - if len(p.unused_blocks) > 0 { - new_block = pop(&p.unused_blocks) + if len(a.unused_blocks) > 0 { + new_block = pop(&a.unused_blocks) } else { data: []byte - data, err = p.block_allocator.procedure( - p.block_allocator.data, + data, err = a.block_allocator.procedure( + a.block_allocator.data, Allocator_Mode.Alloc, - p.block_size, - p.alignment, + a.block_size, + a.alignment, nil, 0, ) new_block = raw_data(data) } - p.bytes_left = p.block_size - p.current_pos = new_block - p.current_block = new_block + a.bytes_left = a.block_size + a.current_pos = new_block + a.current_block = new_block return } @@ -1435,6 +1951,11 @@ Buddy_Allocator :: struct { alignment: uint, } +/* +Buddy allocator. + +TODO +*/ @(require_results) buddy_allocator :: proc(b: ^Buddy_Allocator) -> Allocator { return Allocator{ From 167ced8ad161e0c8a84fd7b4fc3c94afff27236e Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 8 Sep 2024 18:50:44 +1100 Subject: [PATCH 054/320] [mem]: Don't use named params for dynamic pool in tests --- core/mem/allocators.odin | 16 ++++++++-------- tests/core/mem/test_mem_dynamic_pool.odin | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 972031a21..f1e45d1a1 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1564,20 +1564,20 @@ arrays of blocks and out-band blocks. The blocks have the default size of will be aligned to a boundary specified by `alignment`. */ dynamic_arena_init :: proc( - a: ^Dynamic_Arena, + pool: ^Dynamic_Arena, block_allocator := context.allocator, array_allocator := context.allocator, block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, alignment := DEFAULT_ALIGNMENT, ) { - a.block_size = block_size - a.out_band_size = out_band_size - a.alignment = alignment - a.block_allocator = block_allocator - a.out_band_allocations.allocator = array_allocator - a.unused_blocks.allocator = array_allocator - a.used_blocks.allocator = array_allocator + pool.block_size = block_size + pool.out_band_size = out_band_size + pool.alignment = alignment + pool.block_allocator = block_allocator + pool.out_band_allocations.allocator = array_allocator + pool.unused_blocks.allocator = array_allocator + pool.used_blocks.allocator = array_allocator } /* diff --git a/tests/core/mem/test_mem_dynamic_pool.odin b/tests/core/mem/test_mem_dynamic_pool.odin index d1086cfe6..fa204d3b1 100644 --- a/tests/core/mem/test_mem_dynamic_pool.odin +++ b/tests/core/mem/test_mem_dynamic_pool.odin @@ -6,7 +6,7 @@ import "core:mem" expect_pool_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, alignment: int) { pool: mem.Dynamic_Pool - mem.dynamic_pool_init(pool = &pool, alignment = alignment) + mem.dynamic_pool_init(&pool, alignment = alignment) pool_allocator := mem.dynamic_pool_allocator(&pool) element, err := mem.alloc(num_bytes, alignment, pool_allocator) @@ -48,7 +48,7 @@ expect_pool_allocation_out_of_band :: proc(t: ^testing.T, num_bytes, out_band_si testing.expect(t, num_bytes >= out_band_size, "Sanity check failed, your test call is flawed! Make sure that num_bytes >= out_band_size!") pool: mem.Dynamic_Pool - mem.dynamic_pool_init(pool = &pool, out_band_size = out_band_size) + mem.dynamic_pool_init(&pool, out_band_size = out_band_size) pool_allocator := mem.dynamic_pool_allocator(&pool) element, err := mem.alloc(num_bytes, allocator = pool_allocator) From 036d7edda92c8d93c1295e4f2661152abe729bf1 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Thu, 5 Sep 2024 01:52:40 -0400 Subject: [PATCH 055/320] Changed Linux CI builds to static linking with Musl for better compatibility Changed to tarball distribution for mac and linux Updated upload-artifact to v4 --- .github/workflows/nightly.yml | 121 ++++++++++++++++++---------------- ci/build_linux_static.sh | 19 ++++++ ci/nightly.py | 39 ++++++----- 3 files changed, 106 insertions(+), 73 deletions(-) create mode 100755 ci/build_linux_static.sh diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 0c5526d0f..f6e50e60b 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -36,43 +36,50 @@ jobs: cp -r bin dist cp -r examples dist - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: windows_artifacts path: dist - build_ubuntu: - name: Ubuntu Build + build_linux: + name: Linux Build if: github.repository == 'odin-lang/Odin' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: jirutka/setup-alpine@v1 + with: + branch: v3.20 - name: (Linux) Download LLVM run: | - wget https://apt.llvm.org/llvm.sh - chmod +x llvm.sh - sudo ./llvm.sh 18 - echo "/usr/lib/llvm-18/bin" >> $GITHUB_PATH + apk add --no-cache \ + musl-dev llvm18-dev clang18 git mold lz4 \ + libxml2-static llvm18-static zlib-static zstd-static \ + make + shell: alpine.sh --root {0} - name: build odin - run: make nightly + # NOTE: this build does slow compile times because of musl + run: ci/build_linux_static.sh + shell: alpine.sh {0} - name: Odin run run: ./odin run examples/demo - name: Copy artifacts run: | - mkdir dist - cp odin dist - cp LICENSE dist - cp -r shared dist - cp -r base dist - cp -r core dist - cp -r vendor dist - cp -r examples dist - # Zipping so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 - zip -r dist.zip dist + FILE="odin-linux-amd64-nightly+$(date -I)" + mkdir $FILE + cp odin $FILE + cp LICENSE $FILE + cp -r shared $FILE + cp -r base $FILE + cp -r core $FILE + cp -r vendor $FILE + cp -r examples $FILE + # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 + tar -czvf dist.tar.gz $FILE - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: - name: ubuntu_artifacts - path: dist.zip + name: linux_artifacts + path: dist.tar.gz build_macos: name: MacOS Build if: github.repository == 'odin-lang/Odin' @@ -89,24 +96,25 @@ jobs: run: CXXFLAGS="-L/usr/lib/system -L/usr/lib" make nightly - name: Bundle run: | - mkdir dist - cp odin dist - cp LICENSE dist - cp -r shared dist - cp -r base dist - cp -r core dist - cp -r vendor dist - cp -r examples dist - dylibbundler -b -x dist/odin -d dist/libs -od -p @executable_path/libs - # Zipping so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 - zip -r dist.zip dist + FILE="odin-macos-amd64-nightly+$(date -I)" + mkdir $FILE + cp odin $FILE + cp LICENSE $FILE + cp -r shared $FILE + cp -r base $FILE + cp -r core $FILE + cp -r vendor $FILE + cp -r examples $FILE + dylibbundler -b -x $FILE/odin -d $FILE/libs -od -p @executable_path/libs + # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 + tar -czvf dist.tar.gz $FILE - name: Odin run run: ./dist/odin run examples/demo - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: macos_artifacts - path: dist.zip + path: dist.tar.gz build_macos_arm: name: MacOS ARM Build if: github.repository == 'odin-lang/Odin' @@ -123,27 +131,28 @@ jobs: run: CXXFLAGS="-L/usr/lib/system -L/usr/lib" make nightly - name: Bundle run: | - mkdir dist - cp odin dist - cp LICENSE dist - cp -r shared dist - cp -r base dist - cp -r core dist - cp -r vendor dist - cp -r examples dist - dylibbundler -b -x dist/odin -d dist/libs -od -p @executable_path/libs - # Zipping so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 - zip -r dist.zip dist + FILE="odin-macos-arm64-nightly+$(date -I)" + mkdir $FILE + cp odin $FILE + cp LICENSE $FILE + cp -r shared $FILE + cp -r base $FILE + cp -r core $FILE + cp -r vendor $FILE + cp -r examples $FILE + dylibbundler -b -x $FILE/odin -d $FILE/libs -od -p @executable_path/libs + # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 + tar -czvf dist.tar.gz $FILE - name: Odin run run: ./dist/odin run examples/demo - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: macos_arm_artifacts - path: dist.zip + path: dist.tar.gz upload_b2: runs-on: [ubuntu-latest] - needs: [build_windows, build_macos, build_macos_arm, build_ubuntu] + needs: [build_windows, build_macos, build_macos_arm, build_linux] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v2 @@ -160,22 +169,22 @@ jobs: run: python -c "import sys; print(sys.version)" - name: Download Windows artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4 with: name: windows_artifacts - name: Download Ubuntu artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4 with: - name: ubuntu_artifacts + name: linux_artifacts - name: Download macOS artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4 with: name: macos_artifacts - name: Download macOS arm artifacts - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4 with: name: macos_arm_artifacts @@ -188,8 +197,8 @@ jobs: DAYS_TO_KEEP: ${{ secrets.B2_DAYS_TO_KEEP }} run: | python3 ci/nightly.py artifact windows-amd64 windows_artifacts/ - python3 ci/nightly.py artifact ubuntu-amd64 ubuntu_artifacts/dist.zip - python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.zip - python3 ci/nightly.py artifact macos-arm64 macos_arm_artifacts/dist.zip + python3 ci/nightly.py artifact linux-amd64 linux_artifacts/dist.tar.gz + python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.tar.gz + python3 ci/nightly.py artifact macos-arm64 macos_arm_artifacts/dist.tar.gz python3 ci/nightly.py prune python3 ci/nightly.py json diff --git a/ci/build_linux_static.sh b/ci/build_linux_static.sh new file mode 100755 index 000000000..f821cbb59 --- /dev/null +++ b/ci/build_linux_static.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env sh +# Intended for use in Alpine containers, see the "nightly" Github action for a list of dependencies + +CXX="clang++-18" +LLVM_CONFIG="llvm-config-18" + +DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value" + +CPPFLAGS="-DODIN_VERSION_RAW=\"dev-$(date +"%Y-%m")\"" +CXXFLAGS="-std=c++14 $($LLVM_CONFIG --cxxflags --ldflags)" + +LDFLAGS="-static -lm -lzstd -lz -lffi -pthread -ldl -fuse-ld=mold" +LDFLAGS="$LDFLAGS $($LLVM_CONFIG --link-static --ldflags --libs --system-libs --libfiles)" +LDFLAGS="$LDFLAGS -Wl,-rpath=\$ORIGIN" + +EXTRAFLAGS="-DNIGHTLY -O3" + +set -x +$CXX src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CPPFLAGS $CXXFLAGS $EXTRAFLAGS $LDFLAGS -o odin diff --git a/ci/nightly.py b/ci/nightly.py index 7bd32899d..779a04d96 100644 --- a/ci/nightly.py +++ b/ci/nightly.py @@ -2,7 +2,7 @@ import os import sys from zipfile import ZipFile, ZIP_DEFLATED from b2sdk.v2 import InMemoryAccountInfo, B2Api -from datetime import datetime +from datetime import datetime, UTC import json UPLOAD_FOLDER = "nightly/" @@ -22,7 +22,7 @@ def auth() -> bool: pass # Not yet authenticated err = b2_api.authorize_account("production", application_key_id, application_key) - return err == None + return err is None def get_bucket(): if not auth(): sys.exit(1) @@ -32,30 +32,35 @@ def remove_prefix(text: str, prefix: str) -> str: return text[text.startswith(prefix) and len(prefix):] def create_and_upload_artifact_zip(platform: str, artifact: str) -> int: - now = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) - destination_zip_name = "odin-{}-nightly+{}.zip".format(platform, now.strftime("%Y-%m-%d")) + now = datetime.now(UTC).replace(hour=0, minute=0, second=0, microsecond=0) - source_zip_name = artifact - if not artifact.endswith(".zip"): - print(f"Creating archive {destination_zip_name} from {artifact} and uploading to {bucket_name}") + source_archive: str + destination_name = f'odin-{platform}-nightly+{now.strftime("%Y-%m-%d")}' - source_zip_name = destination_zip_name - with ZipFile(source_zip_name, mode='w', compression=ZIP_DEFLATED, compresslevel=9) as z: + if platform.startswith("linux") or platform.startswith("macos"): + destination_name += ".tar.gz" + source_archive = artifact + else: + destination_name += ".zip" + source_archive = destination_name + + print(f"Creating archive {destination_name} from {artifact} and uploading to {bucket_name}") + with ZipFile(source_archive, mode='w', compression=ZIP_DEFLATED, compresslevel=9) as z: for root, directory, filenames in os.walk(artifact): for file in filenames: file_path = os.path.join(root, file) zip_path = os.path.join("dist", os.path.relpath(file_path, artifact)) z.write(file_path, zip_path) - if not os.path.exists(source_zip_name): - print(f"Error: Newly created ZIP archive {source_zip_name} not found.") + if not os.path.exists(source_archive): + print(f"Error: Newly created ZIP archive {source_archive} not found.") return 1 - print("Uploading {} to {}".format(source_zip_name, UPLOAD_FOLDER + destination_zip_name)) + print("Uploading {} to {}".format(source_archive, UPLOAD_FOLDER + destination_name)) bucket = get_bucket() res = bucket.upload_local_file( - source_zip_name, # Local file to upload - "nightly/" + destination_zip_name, # B2 destination path + source_archive, # Local file to upload + "nightly/" + destination_name, # B2 destination path ) return 0 @@ -66,7 +71,7 @@ def prune_artifacts(): for file, _ in bucket.ls(UPLOAD_FOLDER, latest_only=False): # Timestamp is in milliseconds date = datetime.fromtimestamp(file.upload_timestamp / 1_000.0).replace(hour=0, minute=0, second=0, microsecond=0) - now = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) + now = datetime.now(UTC).replace(hour=0, minute=0, second=0, microsecond=0) delta = now - date if delta.days > int(days_to_keep): @@ -100,7 +105,7 @@ def update_nightly_json(): 'sizeInBytes': size, }) - now = datetime.utcnow().isoformat() + now = datetime.now(UTC).isoformat() nightly = json.dumps({ 'last_updated' : now, @@ -137,4 +142,4 @@ if __name__ == "__main__": elif command == "json": res = update_nightly_json() - sys.exit(res) \ No newline at end of file + sys.exit(res) From 5ae27c6ebce707aa6a153cf01ab658c6b1cbdabf Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 5 Sep 2024 18:00:35 +0200 Subject: [PATCH 056/320] wasm: support more vendor libraries Adds support for: - box2d - cgltf - stb image - stb rect pack --- core/bytes/bytes.odin | 4 +- core/mem/allocators.odin | 78 + core/os/os_js.odin | 89 +- core/strings/strings.odin | 14 +- vendor/box2d/box2d.odin | 22 +- vendor/box2d/box2d_wasm.odin | 4 + vendor/box2d/build_box2d.sh | 2 + vendor/box2d/lib/box2d_wasm.o | Bin 0 -> 433031 bytes vendor/box2d/lib/box2d_wasm_simd.o | Bin 0 -> 405135 bytes vendor/box2d/wasm.Makefile | 32 + vendor/cgltf/cgltf.odin | 5 + vendor/cgltf/cgltf_wasm.odin | 4 + vendor/cgltf/lib/cgltf_wasm.o | Bin 0 -> 112327 bytes vendor/cgltf/src/Makefile | 4 + vendor/libc/README.md | 12 + vendor/libc/assert.odin | 15 + vendor/libc/include/assert.h | 16 + vendor/libc/include/math.h | 21 + vendor/libc/include/stdio.h | 47 + vendor/libc/include/stdlib.h | 19 + vendor/libc/include/string.h | 21 + vendor/libc/libc.odin | 25 + vendor/libc/math.odin | 100 + vendor/libc/stdio.odin | 106 + vendor/libc/stdlib.odin | 119 ++ vendor/libc/string.odin | 111 + vendor/stb/image/stb_image.odin | 57 +- vendor/stb/image/stb_image_resize.odin | 5 + vendor/stb/image/stb_image_wasm.odin | 4 + vendor/stb/image/stb_image_write.odin | 22 +- vendor/stb/lib/stb_image_resize_wasm.o | Bin 0 -> 27646 bytes vendor/stb/lib/stb_image_wasm.o | Bin 0 -> 78144 bytes vendor/stb/lib/stb_image_write_wasm.o | Bin 0 -> 24259 bytes vendor/stb/lib/stb_rect_pack_wasm.o | Bin 0 -> 3683 bytes vendor/stb/lib/stb_sprintf_wasm.o | Bin 0 -> 13793 bytes vendor/stb/lib/stb_truetype_wasm.o | Bin 41425 -> 46482 bytes vendor/stb/rect_pack/stb_rect_pack.odin | 5 + vendor/stb/rect_pack/stb_rect_pack_wasm.odin | 4 + vendor/stb/sprintf/stb_sprintf.odin | 37 + vendor/stb/src/Makefile | 14 +- vendor/stb/src/stb_sprintf.c | 2 + vendor/stb/src/stb_sprintf.h | 1906 ++++++++++++++++++ vendor/stb/src/stb_truetype_wasm.c | 46 - vendor/stb/truetype/stb_truetype.odin | 7 +- vendor/stb/truetype/stb_truetype_wasm.odin | 80 +- 45 files changed, 2828 insertions(+), 231 deletions(-) create mode 100644 vendor/box2d/box2d_wasm.odin create mode 100755 vendor/box2d/lib/box2d_wasm.o create mode 100755 vendor/box2d/lib/box2d_wasm_simd.o create mode 100644 vendor/box2d/wasm.Makefile create mode 100644 vendor/cgltf/cgltf_wasm.odin create mode 100644 vendor/cgltf/lib/cgltf_wasm.o create mode 100644 vendor/libc/README.md create mode 100644 vendor/libc/assert.odin create mode 100644 vendor/libc/include/assert.h create mode 100644 vendor/libc/include/math.h create mode 100644 vendor/libc/include/stdio.h create mode 100644 vendor/libc/include/stdlib.h create mode 100644 vendor/libc/include/string.h create mode 100644 vendor/libc/libc.odin create mode 100644 vendor/libc/math.odin create mode 100644 vendor/libc/stdio.odin create mode 100644 vendor/libc/stdlib.odin create mode 100644 vendor/libc/string.odin create mode 100644 vendor/stb/image/stb_image_wasm.odin create mode 100644 vendor/stb/lib/stb_image_resize_wasm.o create mode 100644 vendor/stb/lib/stb_image_wasm.o create mode 100644 vendor/stb/lib/stb_image_write_wasm.o create mode 100644 vendor/stb/lib/stb_rect_pack_wasm.o create mode 100644 vendor/stb/lib/stb_sprintf_wasm.o create mode 100644 vendor/stb/rect_pack/stb_rect_pack_wasm.odin create mode 100644 vendor/stb/sprintf/stb_sprintf.odin create mode 100644 vendor/stb/src/stb_sprintf.c create mode 100644 vendor/stb/src/stb_sprintf.h delete mode 100644 vendor/stb/src/stb_truetype_wasm.c diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 45eb44307..c0d25bcce 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -334,7 +334,7 @@ Inputs: Returns: - index: The index of the byte `c`, or -1 if it was not found. */ -index_byte :: proc(s: []byte, c: byte) -> (index: int) #no_bounds_check { +index_byte :: proc "contextless" (s: []byte, c: byte) -> (index: int) #no_bounds_check { i, l := 0, len(s) // Guard against small strings. On modern systems, it is ALWAYS @@ -469,7 +469,7 @@ Inputs: Returns: - index: The index of the byte `c`, or -1 if it was not found. */ -last_index_byte :: proc(s: []byte, c: byte) -> int #no_bounds_check { +last_index_byte :: proc "contextless" (s: []byte, c: byte) -> int #no_bounds_check { i := len(s) // Guard against small strings. On modern systems, it is ALWAYS diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index a5b93ad05..cbed5fbe3 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1137,3 +1137,81 @@ buddy_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, return nil, nil } + +// An allocator that keeps track of allocation sizes and passes it along to resizes. +// This is useful if you are using a library that needs an equivalent of `realloc` but want to use +// the Odin allocator interface. +// +// You want to wrap your allocator into this one if you are trying to use any allocator that relies +// on the old size to work. +// +// The overhead of this allocator is an extra max(alignment, size_of(Header)) bytes allocated for each allocation, these bytes are +// used to store the size and original pointer. +Compat_Allocator :: struct { + parent: Allocator, +} + +compat_allocator_init :: proc(rra: ^Compat_Allocator, allocator := context.allocator) { + rra.parent = allocator +} + +compat_allocator :: proc(rra: ^Compat_Allocator) -> Allocator { + return Allocator{ + data = rra, + procedure = compat_allocator_proc, + } +} + +compat_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, old_size: int, + location := #caller_location) -> (data: []byte, err: Allocator_Error) { + size, old_size := size, old_size + + Header :: struct { + size: int, + ptr: rawptr, + } + + rra := (^Compat_Allocator)(allocator_data) + switch mode { + case .Alloc, .Alloc_Non_Zeroed: + a := max(alignment, size_of(Header)) + size += a + assert(size >= 0, "overflow") + + allocation := rra.parent.procedure(rra.parent.data, mode, size, alignment, old_memory, old_size, location) or_return + #no_bounds_check data = allocation[a:] + + ([^]Header)(raw_data(data))[-1] = { + size = size, + ptr = raw_data(allocation), + } + return + + case .Free: + header := ([^]Header)(old_memory)[-1] + return rra.parent.procedure(rra.parent.data, mode, size, alignment, header.ptr, header.size, location) + + case .Resize, .Resize_Non_Zeroed: + header := ([^]Header)(old_memory)[-1] + + a := max(alignment, size_of(header)) + size += a + assert(size >= 0, "overflow") + + allocation := rra.parent.procedure(rra.parent.data, mode, size, alignment, header.ptr, header.size, location) or_return + #no_bounds_check data = allocation[a:] + + ([^]Header)(raw_data(data))[-1] = { + size = size, + ptr = raw_data(allocation), + } + return + + case .Free_All, .Query_Info, .Query_Features: + return rra.parent.procedure(rra.parent.data, mode, size, alignment, old_memory, old_size, location) + + case: unreachable() + } +} diff --git a/core/os/os_js.odin b/core/os/os_js.odin index eb434c727..02821c3e3 100644 --- a/core/os/os_js.odin +++ b/core/os/os_js.odin @@ -3,33 +3,38 @@ package os import "base:runtime" +foreign import "odin_env" + @(require_results) is_path_separator :: proc(c: byte) -> bool { return c == '/' || c == '\\' } +Handle :: distinct u32 + +stdout: Handle = 1 +stderr: Handle = 2 + @(require_results) open :: proc(path: string, mode: int = O_RDONLY, perm: int = 0) -> (Handle, Error) { unimplemented("core:os procedure not supported on JS target") } close :: proc(fd: Handle) -> Error { - unimplemented("core:os procedure not supported on JS target") + return nil } flush :: proc(fd: Handle) -> (err: Error) { - unimplemented("core:os procedure not supported on JS target") + return nil } - - write :: proc(fd: Handle, data: []byte) -> (int, Error) { - unimplemented("core:os procedure not supported on JS target") -} - -@(private="file") -read_console :: proc(handle: Handle, b: []byte) -> (n: int, err: Error) { - unimplemented("core:os procedure not supported on JS target") + foreign odin_env { + @(link_name="write") + _write :: proc "contextless" (fd: Handle, p: []byte) --- + } + _write(fd, data) + return len(data), nil } read :: proc(fd: Handle, data: []byte) -> (int, Error) { @@ -45,19 +50,6 @@ file_size :: proc(fd: Handle) -> (i64, Error) { unimplemented("core:os procedure not supported on JS target") } - -@(private) -MAX_RW :: 1<<30 - -@(private) -pread :: proc(fd: Handle, data: []byte, offset: i64) -> (int, Error) { - unimplemented("core:os procedure not supported on JS target") -} -@(private) -pwrite :: proc(fd: Handle, data: []byte, offset: i64) -> (int, Error) { - unimplemented("core:os procedure not supported on JS target") -} - read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { unimplemented("core:os procedure not supported on JS target") } @@ -65,16 +57,6 @@ write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) unimplemented("core:os procedure not supported on JS target") } -stdout: Handle = 1 -stderr: Handle = 2 - -@(require_results) -get_std_handle :: proc "contextless" (h: uint) -> Handle { - context = runtime.default_context() - unimplemented("core:os procedure not supported on JS target") -} - - @(require_results) exists :: proc(path: string) -> bool { unimplemented("core:os procedure not supported on JS target") @@ -90,9 +72,6 @@ is_dir :: proc(path: string) -> bool { unimplemented("core:os procedure not supported on JS target") } -// NOTE(tetra): GetCurrentDirectory is not thread safe with SetCurrentDirectory and GetFullPathName -//@private cwd_lock := win32.SRWLOCK{} // zero is initialized - @(require_results) get_current_directory :: proc(allocator := context.allocator) -> string { unimplemented("core:os procedure not supported on JS target") @@ -118,18 +97,6 @@ remove_directory :: proc(path: string) -> (err: Error) { } - -@(private, require_results) -is_abs :: proc(path: string) -> bool { - unimplemented("core:os procedure not supported on JS target") -} - -@(private, require_results) -fix_long_path :: proc(path: string) -> string { - unimplemented("core:os procedure not supported on JS target") -} - - link :: proc(old_name, new_name: string) -> (err: Error) { unimplemented("core:os procedure not supported on JS target") } @@ -169,7 +136,6 @@ read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []F unimplemented("core:os procedure not supported on JS target") } -Handle :: distinct uintptr File_Time :: distinct u64 _Platform_Error :: enum i32 { @@ -254,12 +220,7 @@ WSAECONNRESET :: Platform_Error.WSAECONNRESET ERROR_FILE_IS_PIPE :: General_Error.File_Is_Pipe ERROR_FILE_IS_NOT_DIR :: General_Error.Not_Dir -// "Argv" arguments converted to Odin strings -args := _alloc_command_line_arguments() - - - - +args: []string @(require_results) last_write_time :: proc(fd: Handle) -> (File_Time, Error) { @@ -279,26 +240,14 @@ get_page_size :: proc() -> int { @(private, require_results) _processor_core_count :: proc() -> int { - unimplemented("core:os procedure not supported on JS target") + return 1 } exit :: proc "contextless" (code: int) -> ! { - context = runtime.default_context() - unimplemented("core:os procedure not supported on JS target") + unimplemented_contextless("core:os procedure not supported on JS target") } - - @(require_results) current_thread_id :: proc "contextless" () -> int { - context = runtime.default_context() - unimplemented("core:os procedure not supported on JS target") + return 0 } - - - -@(require_results) -_alloc_command_line_arguments :: proc() -> []string { - return nil -} - diff --git a/core/strings/strings.odin b/core/strings/strings.odin index b69c4a0e0..dbc84f8b7 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -93,7 +93,7 @@ Inputs: Returns: - res: A string created from the null-terminated byte pointer and length */ -string_from_null_terminated_ptr :: proc(ptr: [^]byte, len: int) -> (res: string) { +string_from_null_terminated_ptr :: proc "contextless" (ptr: [^]byte, len: int) -> (res: string) { s := string(ptr[:len]) s = truncate_to_byte(s, 0) return s @@ -139,7 +139,7 @@ NOTE: Failure to find the byte results in returning the entire string. Returns: - res: The truncated string */ -truncate_to_byte :: proc(str: string, b: byte) -> (res: string) { +truncate_to_byte :: proc "contextless" (str: string, b: byte) -> (res: string) { n := index_byte(str, b) if n < 0 { n = len(str) @@ -261,7 +261,7 @@ Inputs: Returns: - result: `-1` if `lhs` comes first, `1` if `rhs` comes first, or `0` if they are equal */ -compare :: proc(lhs, rhs: string) -> (result: int) { +compare :: proc "contextless" (lhs, rhs: string) -> (result: int) { return mem.compare(transmute([]byte)lhs, transmute([]byte)rhs) } /* @@ -1447,7 +1447,7 @@ Output: -1 */ -index_byte :: proc(s: string, c: byte) -> (res: int) { +index_byte :: proc "contextless" (s: string, c: byte) -> (res: int) { return #force_inline bytes.index_byte(transmute([]u8)s, c) } /* @@ -1482,7 +1482,7 @@ Output: -1 */ -last_index_byte :: proc(s: string, c: byte) -> (res: int) { +last_index_byte :: proc "contextless" (s: string, c: byte) -> (res: int) { return #force_inline bytes.last_index_byte(transmute([]u8)s, c) } /* @@ -1576,8 +1576,8 @@ Output: -1 */ -index :: proc(s, substr: string) -> (res: int) { - hash_str_rabin_karp :: proc(s: string) -> (hash: u32 = 0, pow: u32 = 1) { +index :: proc "contextless" (s, substr: string) -> (res: int) { + hash_str_rabin_karp :: proc "contextless" (s: string) -> (hash: u32 = 0, pow: u32 = 1) { for i := 0; i < len(s); i += 1 { hash = hash*PRIME_RABIN_KARP + u32(s[i]) } diff --git a/vendor/box2d/box2d.odin b/vendor/box2d/box2d.odin index 081e0861b..c1d789273 100644 --- a/vendor/box2d/box2d.odin +++ b/vendor/box2d/box2d.odin @@ -3,7 +3,11 @@ package vendor_box2d import "base:intrinsics" import "core:c" -@(private) VECTOR_EXT :: "avx2" when #config(VENDOR_BOX2D_ENABLE_AVX2, intrinsics.has_target_feature("avx2")) else "sse2" +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + @(private) VECTOR_EXT :: "_simd" when #config(VENDOR_BOX2D_ENABLE_SIMD128, intrinsics.has_target_feature("simd128")) else "" +} else { + @(private) VECTOR_EXT :: "avx2" when #config(VENDOR_BOX2D_ENABLE_AVX2, intrinsics.has_target_feature("avx2")) else "sse2" +} when ODIN_OS == .Windows { @(private) LIB_PATH :: "lib/box2d_windows_amd64_" + VECTOR_EXT + ".lib" @@ -13,6 +17,8 @@ when ODIN_OS == .Windows { @(private) LIB_PATH :: "lib/box2d_darwin_amd64_" + VECTOR_EXT + ".a" } else when ODIN_ARCH == .amd64 { @(private) LIB_PATH :: "lib/box2d_other_amd64_" + VECTOR_EXT + ".a" +} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + @(private) LIB_PATH :: "lib/box2d_wasm" + VECTOR_EXT + ".o" } else { @(private) LIB_PATH :: "lib/box2d_other.a" } @@ -21,8 +27,16 @@ when !#exists(LIB_PATH) { #panic("Could not find the compiled box2d libraries at \"" + LIB_PATH + "\", they can be compiled by running the `build.sh` script at `" + ODIN_ROOT + "vendor/box2d/build_box2d.sh\"`") } -foreign import lib { - LIB_PATH, +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + when VECTOR_EXT == "_simd" { + foreign import lib "lib/box2d_wasm_simd.o" + } else { + foreign import lib "lib/box2d_wasm.o" + } +} else { + foreign import lib { + LIB_PATH, + } } @@ -1520,4 +1534,4 @@ IsValid :: proc{ Joint_IsValid, IsValidRay, -} \ No newline at end of file +} diff --git a/vendor/box2d/box2d_wasm.odin b/vendor/box2d/box2d_wasm.odin new file mode 100644 index 000000000..eab369a0d --- /dev/null +++ b/vendor/box2d/box2d_wasm.odin @@ -0,0 +1,4 @@ +//+build wasm32, wasm64p32 +package vendor_box2d + +@(require) import _ "vendor:libc" diff --git a/vendor/box2d/build_box2d.sh b/vendor/box2d/build_box2d.sh index 4fa64faa0..9513d3113 100755 --- a/vendor/box2d/build_box2d.sh +++ b/vendor/box2d/build_box2d.sh @@ -68,5 +68,7 @@ esac cd .. +make -f wasm.Makefile + rm -rf v3.0.0.tar.gz rm -rf box2d-3.0.0 diff --git a/vendor/box2d/lib/box2d_wasm.o b/vendor/box2d/lib/box2d_wasm.o new file mode 100755 index 0000000000000000000000000000000000000000..15d71c5a141c1667db29fedc403421da7946346c GIT binary patch literal 433031 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 literal 0 HcmV?d00001 diff --git a/vendor/box2d/lib/box2d_wasm_simd.o b/vendor/box2d/lib/box2d_wasm_simd.o new file mode 100755 index 0000000000000000000000000000000000000000..568900bd982f488dadb09abd2068e1bc1eaa870b GIT binary patch literal 405135 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
    l)9jQ7;?A0Fj^)RniiX1@}&k=L&Z85(*fEfus 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

    3#-fWtlU(;`eg zBAGJuP5stcrqDu{I$|npqTcH*&_~1dW8pgXvZT z2stsIIhD@o`LJZ2!^cE3+>tzQuM@`N+Vz;>+t1H=d zzS$A7s|eVZ6$qOrrfEn>sn2$~vp!F*Q0T2D3M-JlRaiE!P|P{SO{~C+ImLBW;G6cU zAOUCxWK$Ag$^t%0Sxg`Z>QN@`j%(I7P3U~@G1rkek2~FP;M2o8rJpAKX3}r*>A3(v z={HG3L~cqNg3)NxBnxv)lEr3W>s;DDXie*IRQ*EnDP0|lF?Q&+D1lmWHj%ixBJHqWxGY$ZgpF9-@>dO zvxq5=CPKKyOH#Unkf&q2K2^cTBTDCdol?T9m2K~B%S|?e@U98VK#qF@M#7^3-y2GpKCA?Eh zM?9yF!YN3hQ4L1>ua}6A3qWOu(RKWCoy;X}e|prNpB|x~MJ;5Qm=u8oM|h|2(A%k1 zcL~jR-uj#=l>No@IiA*S#G)%`Z_^OEavBm>!F*H)%Zaooa{j^1@|UPZs-w+JiAC8F z&>lW*c^&qh%x-FJRs>$M>JI3+LwT;c`4wd70+%}CcPM+h9O;?!6tQguDWbmV+E$Rw zLyFt9f`lJZ+|&vU<07e=i%>OAa*}uX4C@jnSuk}-W~Z_g^u~aTiN4TkQw7hf@GzaO z7?9W7C1S*^6sFSn8b1)&kymp^-SI)Y0LAgM<1RX2m)<#-?GQh9Q%*{B8tFI)1!5i& zyP6e?-BCFl#p)NEh)`^8l1W}yl< zb4blr%=nH6)M{BrKB!N9SFT3*8v69@I&&}Y*v~YEey_ei`D*4>txky#9s8K+J%*KN z#un;QOW50~j9@Gjb?l~1O>4>mHsxtb)mGvfl4>?(NTxwz9Xm*7Kr#!GDUW1Yx^c6c zmNuN#qe^$m1BlN73U*XD;Y_Oq(f{ z*Jpb}`^S#(E#E(A`8y?42t9`5F1{+@+xu3O-8{KV7w$G&0UHDeMd~pw+)Qdm7EjBhsGW@mK>r5}%xS zOa*qjlpbO04WhBb{5V=;_`}w%YY13j%Yl6oXX~* z5v6Q?hPeyL!@QhrKFB7M%CYX<>6q{HA%WHROI`249+zGn$Cg5quq{B|oHKZeh-qfr zy&jP#L(2(5UOnaGZU0tSZqJd@*JqnS*5Y(&jf*F|3CBYt2p%lf$IO$3wMCCu>q?UD zS<>S3bNTxj-gUuU{{AdZ73(_3yQaRtG#)B=Cm~YBIyi4 z(@RiC&@hs@!T51F_Kw?u=GiWNg=J$SaM0ql=j`yJe_%W~2GUGrtp!g4c|htsnsg2o zb=qtsw3}hvMx4w$857t~U=LJP!yp?Yz|Eh^c3Jie&32<8QGIATivmxGnsHlKvKcJH ztxsEZJ74);zd}tBAp@{^k%DzW?uN~xgbnL~|3b7QAlhO0aztmW*qQtx$kTYxLtUGR z81J$@TOy>Y2!^xj0yn5)tui=6ZCo0oSR0@Wwec*ULv5TPnAe5@{m6jm2i$4-9Waiu z?EBTx@YR9B1hu(q#=AfE8E=&oGCNKg=-Oguy!}N}1QPbUd zi~4^*KTA$l!_-^y6&x0&zkX^?({sgN!8Q2ZD!U~12TNJ6r-^n>l(LOJ*U}TSc}i#a zg^n-cTCky6iL9PBim}UAMf_wxQ^y*raKMBpT4kNFwS7M8%%02*v|}J)?AwVD!MrDjd5^)o$6zjWdPeCX!CVB)#Rh{5{yl;Tv;BBS4Cb)GTSTINPe2yB-QG+?+^o-I=FtwQP8i}h?59Pbbrys(jGb~6y6hA_lFQv?vS(z7?vZE^V z<$0Mew=!RDWxmYm8KsxD-Fw}l&s*hHxvk7s_;}@^a;bb)wks*ycuD%JeEd-QWAt)? zcLVs}>*I&gcVz*V;J@0(52e3`GA~+rFJHM>6V zT*LVnJjQGb5z0!K6dhnBtVE2s{QHE`{UA+MHW|&c;Fm~Y3pDT&aeEK1UvD2p?il3nb*7kR~kGoH(1afg&BY&U! zn7dOkH&dn?RHpa4kGkW&l(#sfd#Ee9(V6@W#b4p;dnmr^>w75vYM58FzG8Q^>ke03 zVBU?n%&(CJnD-G=F6lMy4%)A3#Y=!P9Ox$+>qx-dIuaoE?<|p+%*PK&%nU-gOPt&3 zZbmu@>~c4tFbKStvKFnzP}a317Ry@ljk12&R6%;3`x(p&%6dIAd5v4)O?tRr*#=-eB=)&@E?CQ>B3LwK%+d32gX@z=niqKzE)wZxhl zSL@%WvI@tVZ=vae zYtw~FHIhrdt=sx{dd>=Dz=YgI$*vRO`;hY+>H9F8eaDJ5JVif6%zM?TDb3XsVvl03 zaR=RnC34WfW4^y6e#ECAs;5mp{ZRarukRsh_xSoAiqBwPajX*42=@%vLSUZh$MX9A zpx4rS-G|J4N%tez`&8mB@b8cU+f0-Q%%Gv@IoDPKKFtxy@KF2?AHOzV9Kfu*C`mu! z5~W~eyE3T0iJU$Lwu-w>1!cr|{&-R`ybLAT%SRqH?GF3nBv0a;-h(_KxYpIh&}7g{frKtr;x|9udbDQ4VV#xmyNzPj!% zc1KF$+dlnJeKvjip?K}e2*%TZeC_b{uYwH3XTJW2;u+|u{)ghX!9*MJ4>8e)|QGd{5bc(ZG;X@oOnasezp11L@_S zqb7#ZHz}d{C(28>mY!k>OTJOUx>Qg}MKv`>9*Uo$0w+r1x1iz}gAb)wg_vt(h}V@ha@Q8!Dg<=qH7Q3|QbP6eR=*|R^3vK0vS$?%GL%-Fpuw;^_ew$x`5pluaThrSEDGODZoF4Y~;-MYk8Y!kq7m{PPjP0!{ z-3eCo_eS<3e{V5%*?WOo`5G;)VzZtA*RuIuybqX33>#;%dK>>Qi!a6?(C$bl$H+Xo z^d8#jr#VpX10D-LV0IETQIwoRX)xiSYIXvIe8MCr_&aEWj^%?7SW7cowzxw+;7mtz zvUVfD*dh*m4}#f52ct1FbD~;2*Ge~AKHLmDC73Na%od|B**eaO$9A@6~nYVmckYxGbH*T_sxs~oPnE9n_ zUNAdzn4Jc*(_mN{VKB@%G*bsmYB2bKcM66TLh7k&E;E?SU{bmxl?SDXpBb3l27?bc z6U=!z%y|amea*XruX&eX_5icjVDJGKea$tuj<30y?gPgAn(+Y_ea$tuj<30iVbBV` zW_-X!Uvtf^<7;kWE3|^I86R-b*IaY!_?nyPMZjEa<-vzq^flMk^EGe7#Xqd6E@3XO ztm8aFzcyKt{wV4LJw2q^7E!9;mzEkZ{I+@gL-8yE75<@kRy61RzyKare3cpsGg|gi zLeF+O=rTX~dy$~AlJu8){6qB2dHh51EE6d0CucqWq4bhLY5$0Y_1@2aSuV4enao~h za^7-!vQ(z+7IFC-p9jo<%N;8fhkJ_j3iup+!vpEB^zou+!2G<*;~$DYikVU7J7;Zq z-k%TP=`sf%DG2Z=sZh5lgWep#aWQm*dx*aG zArB??aC)h?qCYF7qlXyB#Veua|81qO8A=!i} zk(N+>UlUId5{R0^X?iuuvX9}=wRw^cqOm+FA9d5p^TTvSJsQ4mWVDdq_X_IcKq+AiPn_+O zWlnLJ8O!d(r7m9XW)I44Wx`}kD5a_}pS|0T|IVgkGM{{pIk3bjO|>v}mfdA&_Tsea z72B{eZIgY{z8x|c{DG9$rs%S}E&d*ZaaXDk#`@m8pil+YzZ!_z?%wAv6%#+@4xz2d zVh`&XEK7F}-6s+F9(+WPiIn_8d`>{!3zU)rC17E{$C3jjU{8bo`Y^1QKO=avGWizx zHP+Mpma)F=K0)o+r)+;<^m1(}`?UMCm9~vTm|p|+)$r87*Zq9mU-){Ki_Q!(y$`Oj zh(}n``xOooUq4GYpAg$YI84N)PT?@YrIwaYl%+}^Cdv*F4l|mJQ3(4lllwBW4`FuE_@HN6dNuNy92HB1Di-r>B%5Dtek-Z;Jr@;+! z|7W58V}O`$W^ODHv&-vdSEidkPI6PqJ9Px{ig=L9^&hv!q?@{jcS7XS?Lhd3?J2-SC;85!Sw%xvyL&n z$5|(sKH#j=OSN2{)e!W*O+rt3eA%t&A4+ta>f{5I&v&*qH6N7lhKIT5>u1Atbti!c5?18XUR>4YprC?C`57Dy1m+W)S_aq;8pQo|!_1*QJ z{Idthw7>yC{ih0=3=<(^ySommM2v7>=X|g8c{&!0aSxM=eI@OuobP+?wY3tY_ox)` znExduqD7e|h85D(pC+S^pt&jR2bACaeE%qorG;6d=5mzwL$onZsYJzn)cFT#E-9(( zgZ|Kf?0b(7fhub(;R}uB9$LsjF;5^}58FSjVCTPe4f3mJ5;hi+iRsc#rTW=wHd zfpbpWM(tmTM0{SIgLr7g`dG18@JkvD{K$@c;1&LAUI=m) z976yNC2HeS1tGf*!CI>}Ji522_QRGfj_lYbCm za*+n&ssAAKQlNy&^n=J=UT1Fh_PS~wR(#)vHt|A ztVlS(_EMSlK0;(lV?2^+&KEAd75?JDf2Tm}c!yMFT?u;r9R>d5R&Gx`U zn`AfN?plAa$Gg^XVR#ddx8xgm@mx`G_{wr%1&-1R_9(z8hKd{-s;AqL5jeDVc#A1$ z92$z>Rt}>Uk~xpC|HZCNI}UrDA-}5gkhVSXd%38Azw$B!YH}uVM#T8ST-x=)|sA8DS$cC zhYCP#Y{0@Wbv-O(DmRRg@S4ND9B)bCJM2?ddev%;a87>l5bEj%jj^p z6CA}c!lJ1mQ5&N}4wL)?qN8RTyu$9 zCG4Rq`IeVnp9aJtlzu2alzu3lxp$R*D82=`HuY6b?m8V`kHc#?W2LvX1m)9tF08^5)+Gv`%@Z)c;Kb7st$ zJb$gOL*`06jc>baDsZDZFke2fX9^bh>2>WGE6$f!2jZ$gD`LtkWa+n!|nK76x=tAYQSuh-`m~J%~ z=F4XUvn_|&W-!|fW-I;*!ORL~4w!j^VZMBuV6@Z9%H#K0`Mp{5*s_9|6HI?^7W3uX z1>-7)=W1ptNw=a`y|dfzZxFdgVQI zDP^mAu$3GO$*>!n`Kd8+;{-N{@`rl3oot$=1x+-b2Pd|i5qx~?4 zH;}ImZengCJ#0K>J;5RI^pc#Xml#hkF`gb~@>x7(e)?kk6~le&5%-?FXDjMgWNH%* z(&6++eY|KLNWbXu55>!=AL^#4j8oN3u=oe?T+DoM+1#DxiOc5QF6DruviZf!eEbkS zm%}^tLpHB}iTHL!&bKR!Z&w)KnoOIBZ|FXH1=QpfJ_3IU9>Au#BQhPwv>d`$VR-R+ zrs6*xV@Q+^ivW(N-3-cxL^uokV2Z5Bt`SN@vsN;)hDS3LA68HlIn4|>{u!H%Q;D+c zFf_m`KQhKBAI|!jh-@sBAiPdcK_!+fvk8ENQr^Ip19Og0`LHF#9=9AouK(sIQC`Dy zW(`ploSuZj4yXECU00*|$kC5K_BQ6EnSAc7hEw33JE)%vf;j7#4 z4wkU_CR$X9M#$bbY+q$N#1BI=#OBQ&%}{(WdIs2kvuFQPfjRG|MT7TfkNx?4Tu0HA zAg~`zms^knLZKSf_9R-F zO&+P1m~ie-ntdF1ntizyg=gu4Urp7tL#b~jbv}=EYhdM3;_?YJP9sySvcVoEZK&B# z;J!4>x7n~QG!i))1?-E1d)Vs6e}n=psv+ZBl<_T$-XJtgq21;)VR?}D+4u}uibRUn z1Fk!LY{-cElvnxHAOw;|)p0{{!OaS-A>pRBx5y5l)} zRRHoaH-GMK1@DMwvdxTMMP(lJ>CjZI9FiI5iJ5?}b;8yCK9g};+3 zV!lFjG{BeHPJ&HTG)hbF`h&?S|EKe8)Nj6GW2bk89<~Iv?5t!vsT401ilC! z$ms$PekNy50NAfJ{zD*R{iRw1X2gWM93T5|dNbL}dPYi9(q+Sd4lWs}A6BAbj;y&& z6vvj%7CpGte1zihmW;_XS~a{S-@wb!al<+u4smj4N&J{kKg1rkBC_cqNDSC+eoJv(>6`|NESPdlX zwAfnu4NjSjx0Z>i97bif)~t_Tn+=>b0T{xAwOb|_jQ?(DDKs_Tk# zB3wIKg|neji@j*Egln_+GIr3K0$s~qYZ~cZDh(TasJ6FI+rg|EsO_x?8uso``gs~` z5bS~Usv;YnmKR_x?}`N|`9>A(wKW~KPTGdB<#xRbYbYLJV|KP!vjd)bn!< z#LvDJ0Ielh0UPt4WIfR=&eMw`GoidDPGon)F0-5zS zFhq}zbqT}Z0Xj9;VBVl1PW2q!MNtejpq5~@zvdg9y4i+ii0sGA3Z}K(LW`o2w3z^B z7`2wav?2~sEs57Thk>&LjYq@0lC4!~*k?D?NSc(;d{^ZqTuV=}geBi7p$+h#a$fKMyHUnTjoN{y}B~&DoBLdt zV+N%W3j5Od;~@%PEYRaATrI?S3SZ1I_c;0EAqrnC(BmmwEyQ>VznkM3ltw7*OXC|u z6uwlT$5Z%?LX4;Ir5tmQ!Z(H}e5pW>r|=tv7*FAAIi5jjgu=cwzBxqU%LRHoh0hdX zJcTdkn0pkyIYi;h1$sP%&lF-jh2P8Za2r#X(<@Q3VKSD(8QH*VTbp(1wL=L$se6yx zZQk~Wa5wH%|=dVn)xCX7vr4HMmdI7Mj;nw za!1tZYK)M^R(xn9)?R`I6!!v+%1Xb^&_WZ>e*OK zxX4SgO$|=0y7o%Og*y^P_MWb~`bswL<&kOFRX4JdwY;QZORu`xN(Q_VbF`&ohhlMy zf)8<`^{h2XTAJ>@X&#?5Yl@EEZq9LB#@nr&2v<0YmdavsEe|fAJ=XrsIOeV=n3Z6E zVWy!$#uEk(N*CJ0DNjidbl#!~2~c>?bVHjR{+*}KDyK8rW$cd#ceG;e;#)lpQ)q^8 z5zL84S@p<>pfOs!@?vd+wV9~>3vrwT;(7#*S8Z66r%_@T?@Kx;5FbVv7){oeMTVU+ zZkoi%)Dhrn!=l@ouBi}DtQ`;D%fA-+Bvi+)b!Nk zhu@=IX~3!FD)MSnlPMLNzV=Mlr4-Nz-33!bfxw!yTLadGGs{ik$eIr4v7<7C*P{z6 ztcS@?;`c@6W=N1oi{!;C(4`v@JZ(l|O(p4`wK$`Qu8Ys6qGmIRSAlL(&0?9H>VnKd zIG0``$D)2EL*T?16KQVx;;r5O(>SrKpN=_trcM^qHta}w)g5|&m3ON_`{ECmr@*JP z7}elax^x$*=ykN4i_Ydvt}mW7*_6Pc<&`!zx%;F~d-+nHt`7+;OGoOxTjMw*y3S$8 z8jILH4R&W-ohyfWDV$Q+T?8DIEg|XBcZ!C~L&pWjPd`mTYNzbPaT5wcv+YxjWSo1j z`bB=tb9!x=k(6+#JF-$eO*gb+H*WU1#4Wd{vk?_C3PSy~;H1c)h(Iqf{lT zs49w-SxU8oHY#^))z+gjUX>~q#*u#8^~j}1-FT6+YdC;I6b{60H0Qtwl>rCf))*~M z>OtM)s@jBI$}z!{i?cPKVwK006urtbr4hOyW$bU73ss7&LI*t!^KxWab&ZgvuN1uP zq24-FD)&4TYZjQQsN&iN?ggCa*KvpH<-JhHh`wuzzp#WGkbT#zZp-t=h#BB^si<{& zG6XFmXi&;TMlS^vhzur|yp$zW1zF1^&|wP&xh{|psqL1?c+LbJMMj3N7CZBbeBmc&(fujYzlq=c=hL%9I}~aWlPd85dqQoi3lt=F|yrMM;%pEVuSoVNNTO z+pQ1F|=?fc-QgvRSrba}eWePFZ@>!G+c^tCIKI!@{Fq;<% z+#YZo)z$+Yt=!SoF^b$f8>&eKwlY|ODZ?@HP{Hh?Co33N zz8oiVtD6PmZEZwq2fsT>S)q;;#Dp_zPB-?b)?d%BcNdUUY1xR>+{kTRV+-;|G}BZ&0em^BChREZp&u%IFYF? z)dG0=kdON^E3Jr|rCaltI;vZy`o!!YE4kvnLpP7GoK}~}D!sqYmp+C@o~QXLK}iDY zaWZrp6*XtY!OKbhP(VsFn1!2^-h~0kO0WN^9M?_H2HW{tKexOL9&0rdU9Og62~Rq~ z_ikdO($P!%c;!AzJA9h5&a2ObBATNvS-C^pkmxdfS>@&^42zwJEZ0op zeocoN6zM+CU238?77-UurTdJ-r?{BKMzDQ$f7!En>uFuJD)x)f`yiz-=-?(v!MT0l z5qaBnk<31~Z*@gQ(XcqOf=WY3fF=+iaWGw=fz0r$*$5oj$1=WXV1puQSx?5=!@6vRF`k6qyl>=C} z*;Q1?!5pzC3bEZUn{kdn!FYb}%FdfZ*bth#vORMsXVZau5q9Kz&JiWGm=qcjGwJ?5 zvHdE)(&-{GsdwFe6*AAu0a`HVYD=%{H}?{HO{%6NwQ9=re5v~dQ}=!CcR=cX!EL5n z@!WheF0k`BN)i6CHI%Ya?kT;s>}{LfrHAQL#!B5AQpQSd_IwvuITKhp^ERxUp{LxK zl^jO5;OJtRpUrzf?wKB7YKwvum}=eSLRq)Cpl)%SJKwsb1;pWib&EUHzI1LKiXOQ} zn@bI%+YvEhIq3@#*X?_hCWO@5Q9pxvkc0T>@#R@mcOvDW-W7X*z%+VcM|T=c(f+fw z`~13c-~9WxsRcdYbx~c~pf}pC?W-Ki4$91;SoMptmTm&_)H z^G!KQ8J2gb)!c~m=3~!jkgoF=cOt^ zNKL;KV{+1nMTu5i5%nTVL=`0&;eu!?GPsJgS_VTwjukMTiI;ZUn5F$&TP7+eN4)3C zMmI5|9e?9?^JM&Z{8&EDNgl`&55ri7-9!~XhFO2iqjCFexYEl!@Q`cX^`!d-mBB@` zxrItN40-AVdt;(FAN}CT$cIM^`ts3Fi(qd|glqg+?Uv=~2Sj}2UTG9oHhv^|J*Lx& zbI#*c{jtu0#cj&GIz0wg&3ZS7d>fOeY-#1VmuH+F@~2u-j#9(-zIqyAv-BLD1h7cP z{!c3i{S?*v0>V9wa8Dz%3}znXkzwqLLZ(;X0gJ!MB3~<#(*;a^{N3NYIzaT zj3jYjv_J>;F&Vy;ptJ%svV!b6}A2vZPzjtL*a~ZP-3dM8O z;zvl#xLpYt{sWKu|3-y?KZr^g^6%w{0=wo@Jc*D4T`07?{LnzX2wZ&NFFhfJxs* zluWGFFv+kfW0=H*Tws!q?HPPpUdr!XSyfD8!O2=CO}VNuiOqkdOrr7vn}S%AE)*PN zKn1FJ!y~YX3+zq$k=h=AyufSUPof&5AuT2c2;0;Iy^1X7im6DMASN)HlY(6JJKcOn z@|xBk{?=uyS;s413PzpNQWemh#w(fQnq^Sg_4HK0n{mqhpZk+Hbl!VlHiEYmiV;lC zs`C6N>O3E{$CIwn@ZSHIySD+d>^koI?#Fv?-pqS5^X790JF~#K7eionxl1m|6?O%J z!aQI}t|*9t9l8pYa6wc>sX{I3n4qDAi74($ge6!SNz~3jB3&v4wkQ*pA&DYkhp}jA zS!QCmLPm%UTS!D#pa`OvgtqAv;=n4bncu(r-23jEnO*EskST}Y&b#;A^Vz4nPoM5S zeSDVnsNNNZ_r>AZN$#A5%mK||5Qs>;TO}qbZhzYF=1r`&F>ltCqc=@a^=e`BrfhNExHh*u z@-#SYKGUy%+V&hRhFoK_O;C-^j5mJOcyApWujP!GIwEIJtuYnEaB@y-a$c>;SrK$m z)2{}Sc9S!rjE{GHM9wh9=6GXMHsTRE7m|4kvA4td#>pI_6*Dy>m=SgY9nhual4lb75 zpRK*LdLo%353e_yy+nWY%f4zSaYTxYTn4^1eipRD$Sb{p@qOFf8$(5R`Xmxw^&il! zHr?O^M0PLig`bB307N-&hM@Prmq`0CG>S@Gw%U#nkl7issLaT!2Jh>4fB|bDbgjIz zmKSA4Tz^;$QKM9<@Ep)pB|pOBC0B7Qk5n9<#=I>LD-{R%T!Vslx2re$Z2^_SQJ)c~ zBPtqvMhdw@%4K3EZzZ`3Fea@74A&Ri_XtIRfiwP(upsbuANwO_HIscoYcRt>=okFRS`^Ka|Qt!8VECyyRteZCO z8X2p2Dt#`7iz3DbFAV`@d`7o=?8XYo|Eew&q8z_oShv!n1;)Oj|9seP=dBc+KJqig zyp4`=g4oqJoA!^u)XW#n)+VwWIL?SBvf($}PIyrlW@9PAj=RS16u*XWhqDz)yV=m_ zZ6xdt)7um6Q>?r6RcK8|1?M0c1TFcIY+VwFC?RpV4pcN*7ZDU>mo9=+?SK?|Q3(#e zf@>l~7sL{j5GD^=IV$RE_AX_Wko;r4R+|_Eh{Yd`;_&hJmlKsVEGkmV%(jH{+{_jd zz>(n5^B*^P8F+Hkzk4~UZHA092WJU@I!ZgGtqS?38fkJCYAa)}N_2ecY+qhr3z0KI zw4&O(n}zo>PLf~4gbK;WWHXYIj91!%ol9kNYO6O_z?|{vf1h23(T5BzL)`+*^unVb1j`0&?#aR*R;*)5yOM**>fKtH=O$@EljKO1sP%&ITLXc*6WK(OHgc6=z!7?3YA+LxQW9V zs~ebThOY?_tJ*OJdj-hl(l)e>UrR_1XAfwVoe*tLjMh@V9nM3!a?*-pkr-1MhObG&Hc2e;i^&7h^yY^tJ`slrFBYWCKS*F|7D%jiqJB z=g$DlE0T!<^@C`NcW*?X+HBS|(c7jQ#_vgr_arPZ;2-3-!|wxPl3<7f5=*~<&;Z6o z9w2TdB#*(*0JrF1+y%dt3Vti~G=7`#TeytuKaQa_0O1jab^AduHC!_Y5=f*0K{OKM z5CjB5(W^qxNF`}NP}4mIL5{@^k5@eSlM~s*4`)B(ye}8;gXdOEPL35Lx=zqy8eSwr zJZwE3=COd|xJ@C0mn%Wc;>J71t7%s7j+l-GFBXl(IET8I{dGV#%BjZ4?aW)D*_n;1 zM$R(tsu3EESOpvG?9T@A<%f0YoW7z^L4UH)$3B`5kETkIs`wC>g6Jrt4^z;em8%;1 z!xRBS-Hp62I)~KbU#aT8w7a*|WX&Mxs?*LB@xl;Kbcc%~&o=!(1ucBAQpU=j%6kGc z5z?pLdG;ABvPxh9*XrYg&{sadSiJkK2q4I=C0gZAvQ772u=`@WKZPl& zNwuRg{1Kv|HLKBK{_kLoB~kB+8S?I>%Bbu_((jzZq56!8=@ zK;HX}gUeiUgx*jda5vz+r01z0Zn>`nZ-j8de0ae(w23X(dy7 zg5+oRl>WR*KRePD7TsD0!67X=cUodUt7ralYHB^ErO2zoQjyrkz9qLOU*fz> zRAwMB>FKwm{p+IGmrubY+6+RMiN}4&~>a0{bP65UpmZK65JoZ;V! zD_dCH;ao3kiutdxqvA47rD#iS?#$@ZWv%E(w{F4F+`6ZB3%P=oqryb#~zJq!lq$vAdroEHbobn6VY1<{F3AYaZo?4I&V^GSl zSRB@KzdWMn*Xug5>|V9J0jny|`0;*5??La!?A>~{qW3r0`yKkesP{M8`vZDErT63Z zexKft>-|mk{$9PG(EFS1{XKd=s`t0p`#pMJ*ZT>3KdtvQy?>XUK3LwiMU+~eK2V<8 zD!v=kyIpS&7H`$h4;J)igKhrX!V&fu#rK4~xKkME_;{xTkWCANL6nY#a%i_pYGXxE zJ{WKq5(ml_q4KVMq=vgV0Zpb&B5PXS7;dAy+d}{$v;IL!!F{(yr^8*ub(B1Cn!@E> z7!#@E4MEW!dAArs7P+H1O#|QM4V>Udy}P^0t@h&*KBO}&;Tjo)_x9oWVuF7iA&>qG zZ;R_V5Srj0AHoro3}wr;+ehFnberX6GMw6>E*8hzL>N0^Q_rMLT0%E`4_R3>CWmQ( z)2fuP?~p?Fov~Ibl-A-MG7_9o9;JuZ7cKZeD>^$!>t+0i7Fg?|?%PvqjiRpW;otq` zJ67ow$0hDB-?a(@$BpJ(`F#iho$wBBXjwH=HwFTA1_MEhxRhsHqxeqgMU?MI6x{86 zMQp})n$RNby69*RMa;|^92*fFa(w=714jaPI_UuEIyCgw#iSoA+7}=b)Vm)*Cc@!A z1%OOMfN(TL#(*mVWFl<53P2`$;QrlYn=sj~WrE8QjJlHaw7r1>%X@^C`qa|GVUphW zgDthx2I3@!J=+4ZN#mKeTC5_!9nWI{gVF3LoN1QCn3>m}ia0mIMR ztX}j$7r7@$H5B(kIN)hN+#yVTEBoi-&v9isNs~(A#sMY$d7=M)bIo<`TRY+2@OGU= z(ZdhyaEe=RSD0e6k)Mgx#VPIx=f5xF{GV)!J2lR~qsIAnnc&-5WtNNGQ_Mkg$N4jk z^Vc@T0{y#3v&_7juetOAeL+}ii16pP1&p@~z6pTATm0Qx)-HxWXEP=)qh(05P|up^ zrk=HQY}O#8YSvPpHJy#wHEYrUj?db@4C`vM_Ww&ZJs#Vem zvWF6&hBmgNZn(2}ckas$%=#f=WEY*!)HayY#klfz9v@=`5!!UayQ6A|fQ;6Sy4A_p zs+sJ+cZ#M8*WNTFTvSQ9CAv7t2qt;TwlOHtkf$U#J)WOicc+W<9D>iPeGo@1Gfzh( zMODV;LTd0Xt`mb_k;6xs$eUP7M(qGmS4exO$I3if=5bGfCFt(t-hc4U9d>$Y;2+~< z_jEtL(#TLOak2eP+OIu3Xg`hZr*->jqkW{VLR+G$c*uHhyTbX-{kk7e;Qw^mZ2r!% z(pPW%7-fs3*?Q9Z&2$(1^4Nbi;t_t*w!bR;E(xmf&?^T<-N?++7hwqG1U+ELR+F6> zdw$+Ini4Wg%SZz*fnU>A>IeaE`ghh+Mn__McV8F8U7NKV=%=r*4n_xw@2=#>vn<2k zXJp1muR8Zd=2Bq}#U^h|TZ7L%VihNFY`_~fKB9^0y-M*-&pg$XI&xNjHQ5bCGrEc6x-;QFn*}lj*8|f){mlF-u z=>QuG3kmDmP-`WhAVKGY`S5ch$h1}_qO;f>!@(>9A*&InNq}-35*9Pinh1J#ja6`U zD5?UK=)3WFoDN>4514;bp;@B~*Hs?V((dxtiIgYy!>8-4!;b0g#>xA}K)DAF*(QT- zlJl|TXVPG=^)IPgr=sHQ3D)u4S_d>DF z)uI~5h#m#d8grYhJL(JFVEobq3sr-Svs&z2A041g--ATgIYd{;@5X??o59Xc-(^@ruLb;yIR5aTsiBfuZqp94P{V7Zc#mQIvlb$KgD5#c^<%5{sD>zu@VF z{@j6pQgIykO2u(7ucCwCyrbFF zk|aza9XPJNS>mYjRGZq+z;|i)1MI?h!teIH+_YOI8@_j}x@;j6oMmiz#+EXo38l0iR84|rm{=@Og zxgENS;ry{e!3_dq{|JR1VL^@4b%DouTBgbLSn^0pLnh?zf0k10Jyh8L-?v&iai5>> zR}>)5k;Szf$?hnOkDm>g13&992Yv!tpA4=tOfDzcC$u?1=dX2D?~lg!VC|F><^g2( z6}b{mdT?{d>P(naeDk8)Gf=&dn5*&L?`T81j>GIGWcmg(3I@Tm;T+rEBznfcWk@yD z1e}I%WH#q1{5NBELEPP;lZI{#sEaNO0U5+dkjHES^=R>%RS8cOqpOTqpo>Z` z?ns~$Nua~`;@tPLgC%X0D1#-NK>2GgaU`4%UAC5Ov0hm=7!s}o>Vb52WMh_NBK%m) znSuifDtDLM+FxC&ndmoWA{wnU(I{`Ck>SsVZFIcHOah=WQr;~L+xBHbj~S9+M6$mk5%ro=GpMIM+^ZqX-vmPa1oRXm{W z6W=daz^Zw;wgxi;i`~Y6YD|5`oH6nDW+dcX)NwaTzhdoktPt!ujsi@4*jOQT0=j8K z;}%{#H?VL?l}O}Zaa(Gpfs4$m4&kgpvp{K4bim{i$dOhrGTR+;!`C6kIfw(oHvc<( zhIpDcHl;C3qhh^h4N&hFn@uI&u{Uqu=E!5J5I7-T%_3V2L!Jg7T(t z5a{2?shb_DMPnxiaf=!^{R`dWd&tjAhPCnd>gTQu*BxJ9YL zhgpf-U8cn5mgT3rZ1w6b%V*N}m#uZviZWp!vHj^wE9A?E$5%69MoJ-YNk#zNB~Hn; z+Hy;Bz}?KEsuB6;RQ7~EFg^CCZyq2nRg?s`bwk3RbNga}}f=bEH-QN4;Io#dhWqfA{Y|`$9U>Vou)ul`r4(Hk`_FtlmLh zVIFo&hQ)Ww6`Z!jX-FE!M`#cEfu|4iL>d_Lu&43#LG2k&vsdS51yS0D{Na=Nz5evU zlld7&4ZG$q)I0q6KmP|zNXX}YLaM-|?v=aFY`U!!CoR{n8Z;!=sUshtO5_%v9^{E_ zHO>DZPegm;>4E(^@}OcASeI}vJw+D)Gk;GhxXmk|%6|PYj(W!!C}2+(qDN|T>(V}B zew1lG?rmM*af4>iO0+m7J$(A|AGaHAL7aO*_5@{u7k`|`6-ovb=X9ikW;BX7N{0&I zD$N!Xa)3`<*c=sk)S$dy5w(KM%+7J&B8Hx}yED#X7-6R)k0pr~YP3X1DA?f)J$Ll; zWXd!cdRpoyIHgSL6G{a=8FMJ?=QJubn-hVI$JjpKLOSOi?$I&axt!>Gzni1{gN1Rn z7-{G(;PI{5lTdClywDk3)CfylXem9kl#hAJ@TIn3m+R1SI((6r^PcHT&2+++4msYe zEW|4v*-%=ra#5Ygs1N`(;wlb&5HIxR$a-?CgE69^@)?&+U#Imtdk%XyI0ZEiBlMB*+6+TUK%7(x3kJX zhKp-I+4aBDL(8xz>3DwcFQgghH~3$*@0XfD{errsB{P3QkMM?8QAeb3NO^0z4toMR zI)%dN)xqznB+r!8aVdeR)%%~av_-X4R;1ac9tI^*wavF)Z++g<9}1jTr(W=$6%yz; zy4#G%en-BplCc3QN@~icbp%3HoqN??ge=u5e;SLWqI_%)ixdV)MbaT*o%G`=l#_8# zK9HjcKdun5jY@RV7y-utA<|;%tvjlOfvXbhpCXb{=rr0MVk{DiEB)cYc^`kP%q!4> zrEv~1_RuqRUE%lCVYnJ;rLJ)Tc5(_pK2WZ5;teUWRTQxWx7G~NK>oS}TGemPMo`YK zoZUAmQ_)sYkW_|eu06+l^X^1J0g%(BUqBX>QlcE7g+a^#lw=dH5 zmZC4L5d=&PFTF8c*G-;4bb`ln0zk5@=P)AG@b7GSNYxym8Xj^V{*8Bk>s#l~7Xt~s z%4}OK_M?OcV!Q*LWxNqpsbvoSb9R-D2)hoA^C08o9|PevVPB|wQ*4~P_shUI`RAWo zWx+W4XX9MtKuJ+rZ`Xvj=3}rBO7-9%hcziz&;w;FZ{99_wu1kt2aD=4Cv)g^scZ~y zNx+%VaYbGOZ+#zJoavjj`34elci?yNebbpzD1bgREWVc?_O%g-!YrfKp1cU5N}BN` z+GaB6s?;hYvVN6RX9P?)vrV4BRU<5(9j1TzL*>LO#Y?m;JRnXmgabU5hDO5wJ6CuaJkM9awW2~Uc9Q&_G)NAw!W^4PdT~%5U_8Zm$r>n$PsHW3q3ULrB2AVjwIrTKuaGTs)v*&?ze#d1dHVnP=Yv4 z`sqScUH0!7Mo8}SPI4bXlwBs7=aotXY^Ao~%eZz*>jSl-tmCMx#z^J*!_f@>LX70( zJI(^mj;tqZ*u2!uHT8t(&7nu-VnZZI<45PHcL7zVQu?I8sL7(eE(!8*!)=HxlT?l7 zfj_o$AmGB;X*B-kOnL;o1a`0IP43b34MntNyG00;5LxV2{Vatw(ajN-s1Hfh9fa41 zHBBMHh6E0q#Ih|(7tO4Ky>Oe2_TAiQsVz1NEN!uug#H_<@Q`CI%vSZLMv1Qr?Jshi z@Q~_FA^kL>hGPSai(Y^hWeaowTb4s>x)TmXL|NAH?7FvB>sW8C)?4W<|Gc-iT5m;* z)}vd3Nu?->y!(sZeG8R?4oTf#t2%AKs5*VCI&Hw%r_)6Du`V_{je4~1bX(y@2xoPa z8DJug@x$92_yL#SD3j(|aYR2Wb_KImvGO=LD->c@*TU-!Np_*DaBClQ6|(I`S7F~( z(G`4VpJwRFUwq9dFpjQA{!}q_2{91SZ%HWHZlGw}C$8nVDIq)J=CLc`<{KTGk1F5* zSml_CNj0WaptJ_jsufNPckOdHxWE>@3@(x-To`TdXgs3Y+XmUk=g*5=Q*AR9{FL@zWdW z3kiGqskkbFU}(dI&z2`73r|6iP77_d!eAu*0S}Z`Y6VTBEgdT|$dDq?VKybp4M=4q zv`ARAEH^U{Y>kXq@;7&qan(Sh6(@UJ8vvrMQd3lJYXfm|!vb&xGy`87Bok{PL(cNG zfp9vOMc|UWud_vc+BmzaI1;TS&08!Hw}iJiov;Qhijj#|OG5ZiNwm>HcvCq1ML_JV zl?~^uW6MC{eDo&gquA}W421Dz0FJ4u+3Tt5wdOLAY8e2jYY8DP1N(E-w8>Fhq6l@^ zYTesmtNPa69d4`yZ}v5hFb-PCh*sEG$jZI!VXWT_lW(FtZ z6-we3ooreXdqeb)0}R-0U_T_V9}CC7$O73GfHp!JHXQ7!*0bFlj(~44Y%vOPxSO5B znF(r~UmS{{PwT}D4j2yAE3okksdU@B_(j%O%(7mH9Io!Wt(1HFZX9WM-&=CLP;c?R zQE%aO;!tqsBt$0HuJFZRGS+DW$3C4FpWn@v0bY$SsbZBNOBmdxPgn;2NS%nxY#pTy z>GgX5k?H?JI{4?VNP%VhMm;;HJqLP0DIZKQl7NcNq*6+`N&>2~3u2U6p=rq9`;9zn zbJUatjYRhSrgzbn#cqzE7BnUpro^<=7uN!S%!{@NN+gicK&5zIGrcu+wSD)Y@TU}% zOtVNWE=tNQM}QEXdaAHw}ph0H_BS=uGJ)NC5(% z!bzJRbHV_n?l)*eC6Ok`MoU~p_0=bDG}=lFyH0VwcYX4Dy$O3=>>cBGFDjtGlFlY7 zhEOQE(yjNnyaro8qMA&p<%`fLGjj%j7TI@bXBIFX^-=N3hJKs5ZRWUc50XKkNr$(bQ)a4&-4?Jr02`_j;Wlf=#HvZqwJ3aVwxQQZ zTp~G58NeoD^)M+EPDx1`89NM1vH?RriS3`QP)>J045LYep8%X` zPtci;65e07K3lf8Aiow6S}of@CFuWvp<4S1i<~$_2Ylhf0)(AE2rUjTW;8BvXo!F# zHE?9T|F_+lqQ5y&JTo+=>R?w2cGE5wX&i;k&TzfR7zgvBBZdBj!K3@ubP;Qs=_0km zq_u}1tc)yBc=j;%E3M=?8U~MHrVMHen%89THFCI$VJp@8Vhmf3d^VMkk&gKDr7yL! zDmNtIyeCK1bhTE|g;e;Sa85EQrd+p%v{#_FoSuJ`PIN>*|FdexK^DxbPGdxy)bsQUm0MHA4B_hxVLaU3m z;joOOoDu}!&|%tM`+CI_Z9mfmOj#-_77D4TbkN;bskW^Ri@Y1tCgMoKT0w}Nu(Wqo zKuTKNn>t!6z+^_y(GLS-;&s4QKZ-M8HUl-hY|B%|fN^mRGg0c14FwFbvm5$BW$swT zpoBkD6?SFsg4%P?8x3n_&@oaa6U(}zQ)LtB{fji0#R+G5Ll?8L2$cvj@({(-%Tqwi z%>#C{I3*tu*mb8t7OyV=ost4(TO>j`t)+CPrE}770;4ub4!cudFh7?)$scD@_sM+; zied3I)Gj4tFy$5rpScx>xN_SR6DZ>Seam!6R-fY^(C>!)2=QNLQOva{w$8^RJ{Q91 zf|9m!MoXZ_Xs|`CD?$@NXn$s8mWodpRne&ue?{1fVO@_2Dxo{Ar<1A;jkYbj(<}`! zmOh_2v&Z@{dgm=6j;`2RqS%ML<4VzZ2X8_qReZJyen(afT1;bEM#{|R%m|iDrxM?% zhTod_K5F5nAOs=d3tpe`Yo`Obun-=!awA4)ztTJf0% zqzn!QoR$vEQc+g{NXqWX{E5Ijzv79HW5;ht|9&~Fl;&hPr9;i13Q#=1j|XU(-zNgp z!tav-a;YYQs;HQPVKQPqO}VUt0iWnVP{IuEO0z=+S?kDz zW3uMlwdeo!0X@+g#vVzntFh8($K14TCFulT~VV-*1j1&1M!E(u(E1b4TuK z(-@D`8{RI$cRMH%deJt53#FJ0u9bBHYT+%x#QJ}B)t1|O1P5v)1h?e1s)>@(q(aEQ zDyu9?5-a_mOy>Y60yg$A6TCoHiG-?_!;4vUo5U0j{Rgmn$%;`(o~j=q9COjo(!c*>!ilAm;iAnRCP2jKf~U!de4 z;lS98Jf=fM0Qfc8{dL^tW3g-5Ep?96Ia0MWq7&8q=-g*Q2p?O6*~p%g&-Jv%4wvMc!Wmd!a9c9klyyMn zU|JCjsK>%PR9%OS)V)wZWQ!UuZp%$nN3zq9Hb3`5rTm=1#7b0uqsQm!=t33KAZlQk z*(w*~^=b?d!+<zi@3i; ziwc-TXboWoAO?&#X;GQB?FneDkO1U}(&MzPE`4#D8EfA!h^(`rgcPS~a*X;LU$i4W zuwOa8Nh3J9@3)%M)Kx8EIMvOX8q1w>ioFqIu_EeL2^SHf4guAfn!PaeHJcaDA}`gM zElpj7hw+=bfqsMEU?%yhRt6ye9-F&3j+b|iDyV?MAy(GU-vz|ZhwI*4JrL?KU7G12Ct!vwp7{;*fpsBHamqN)~8XGAjpR&yw zuP09Sh@R;o(`7fV2fgMKqS4kQ)W-WmF17WKhZMQ|c?G9r-=Thmpfi$UkaAfT|$W zVl6}uOihpyg=c0^~1 zjMYYueULUs9}gj`yd@vuS-5&ZzuIWE2LDoO5U$Y<0G?Z=q~Qt^nlOq>6y{2mMQ~(F zYaM25^e$ST5OJXGDeXV!B>%G%!>EO^PHr=KmL{MQq1=V7To0Jj@v1_m-)jZUBLWQ9 zhA2ZtF%zrjf_AWSc++U5B?L!Zi>g}4 zpW(mM)|g-n?o4G3xN0tS=GZ5Ltzv{-z!Ow~+d)pKnprV&gDAt4YR;>+m}Uzpi@MY% z8^0S|39S{TWCLVy8U)4-;4&DgIK+r-0@!xA0-0P9xDMoR7r2uGF3J~&F%K1RVQLza zG+4t6mn#2Xd?o)*r zz8=tpnHc3ohH%7bMB8NP`VB~k>EfEdvOR5@;uc(gZ)e6@HxH8WwyXtnHK8?~D+L;O zzTmmXPFYJlzm;e;1&>ER#sV%{orTB&k}0szB7trw)PNK^LJ7)R)Zo-c&^T?QT|xA~ z;3R6tFysYX*EEn<5c4Etrfftpi#Ns)-wnAB)GiiQW<--A0T#OwU@zyW46W4zz09rpRg|^^ughHN>SkV|qS>1h$!c75gY#=m?4#zAG4Npsr|HF*` zY6FjLT*tuc;f_E6R@uO_Z)f1MV*__j^t}To-20UWF5M95pZ*t84~FcFV$tM7tTMfy zH2>=A#Oi)Qd;m@c4oP(}_{Zo^%(p*PoCwoiq@zTP6@$V5TxHQ4A%znDXZJPGUJQ~G z4{k{F+=wHQ^?tRDio8D4!3V{$?%0_@G%K?2T`fvd43nquaI!* zx6gZEBOK5z?Wah)(~``O`%ZeKf4{9?G;#<(macb8)30mlRQ$pv;v_wqa;kve3sPVJ zkv2{0z?65OOmxw_@@P%nLS1CI4h5hJ;g6yTfr;AtJL`$6>Mi0hOIhm+BS3bkRwp~9 zFXD%7u|Y5z2~6SGGHjwLqtGD_p>t-{2thkZsRk0oOqbO@?jC8{c99&6(V~#+8hbQD z^2g&(6&ZkBml6^V=fqMUbyqS*)zf{uMk^@G?X+fsFybASS^*%zc(qCUsCa||OKV7^ zOMUJtr6TkERWSx9ZpnQgrsv|~E!~_&0D^Ypul8*KD<+wvlq$_lYI8X5g}J-`_OJdb zA#df*p`(l0Mby4?aM=Mblf?U~reKCXSm4MO&{sDVNdTFP$_NO{-6?ht1Trz)nw46Y zKwMxrIe6zN*?TNaQ%r{6E+U$VS5h!cY^wx$bS!!iY>8=hJq6$rURfsD?F`ERV@%u! zIeVAetb&S|JW-J}WYpSCMlj|-8)U@pXn!(diRYLQt8Q0{dnX62!6;$)!IyKZn1af3 zu!W5kOD6cu1j<~)n{JQL$>*M9J(!en*iVquQMQcJi&}YOQb$zTVQyLP@`&qNEJjq> zhEuX|8ddh4Dm|Pqe`rwkt*d`Xv=EU z2zQJsTahZO?lyb6Z`Ww0L6v@Ge9^6`QrB}rm5ex2<)l;Pl#^qm%BmP}mimjE>oC#? zy2O0Iog77Dq)PinbO0q!)>JvKYiQ;pRq7Oh2+^n#eGxwBQeeX9;+SS3(2-?=j)^M! z6;*b1$+}G^5be6-!>=^$FAjRfuNVJ32tTp&?OKIUIXW+27=J=>9$Az78(q~lQ z_cZPw?LZKMCIvP{-XSHp2diAhQTvOb&5au#eZxL&LFf=TACxGtGHr;Egg&4oMP?}C z*Glwi>}hR*z zg+kGC;YaN_li(X62b$(NvJ1!>7k*n2Y-cHsE`iz_P{MjTZuC^QX> zRUM4{LTcSmy`V}gtb50-KBIAF0wVtl8Fn_oA(iz9GPf+*#ZgzerB#Q;nE^hj=uT<(o-;Ot zHBuSM=I}8XaPEVmvpIpIdAYE;bN7q?`In<7AZsW0$6Z(nO7yb1tD67p0{+u?| z12EXBok@bCv^5~j=4X@lt8EH$KzZ&9Pa$IiEn;knZJ79C!OPaE$;>A^O22Pfg480* z)X7yrZTy;Lv3`RU#B%^vYP~!V7gT!etklFx$P?PdDHzJvL|_&L$ZV)OkCj9s6Az38;N$Be{slykNYWMXQ(~dS@T9M^kg-SyR&Yym1 zIz2d6jizvJJ`jMAuA1PW9#{$K!pH|DD!@&PX0*p*hk^W|UWt9v;ojd*)2UH&C^f7( zTCxUx0rmhRZmMM?sRm)^x{pOVG$~Is|BP|OD+N0$A;VdqT<6;saX zY>mL=Dm(oYIN2?xHT|tEQzT*nz|1AR9u^XORmcHROapP?70JNHW({yprv}7UA1x+E zN`}HxsQ_5`tH^H?A&xHsfVOT7imsVfHFS8E<{SL>2Fsp_7={)WTo6=NBofUxi$guV z3KXL0g=B1cpG?!qIK9^lAQbuz)YQSojv?pxTi>a64w|3sw``r|mGzl^{vr1k_ zh9A#r(=KR0P&`x#PeqNKE(cc_($qy7>)GJ5vS#rCJxel7$J11t1<1bgP_4w-Fu6V1 zLS(eS0?(@gi~R77lz}Pq!z(r!+mX;ZX2Q&=;-$n%Jn zb@)-6Fqs@$TM*#%_Rnn-9zEfI@+>f8j!72!ZBwAqY<1DtW($_xx~n zM!|P-g?7(vtE(YYfOpWJ7GzGCHwVOXo8k$}hId>ovB5Z%odQaz#OU$hM>S*OxuRQ` zqbL>bS6Owy{#KyqyOzfZw2wSh%6eo zfT}yUh0N^tBSw!S^BN{z8}0(zC_w?K7m3ElyVyJXZkUMvI0`Y1za|**#gcma*Ns_QsoYZ69uT*Ex+%1ZVS0{ zfmt2kbv0Am06b|Y`d^Zd$+l@+SExaq7zZ5J+i@m*UeP6Qut2CWIB%Td=G58RG}Za258Z!z|kT2$*5;Sc#Gm ze3o>`VvDdK3K37z=`?8vVH&t;@(D|TQjOHv=s8#I{V@&*V}_=de}K$Qf|F7uKAG?+ z_GzSMdp(Vuc@TqPZ9`{i=S^6U+uP=`2y2^&hfpk0QlHiZXjL`~*@fFg-4wm+##cu6 zs;qqs_v8AEd_|uyqg>Y_VQ2T)yG^H~aX2XBQGZkY1jh!tBGRiK-RbR^iuLIbc zwCZ}sD;M_R8(e*ssa!X!AbJX?vDgr-Ier(1H>{n}69l5Y31S6MBG#zf8JSA9{K!Xg zZ?kQ@tr6I3e04w>AX%5Kr4(@^Ca*(PHsRA-F+An{oRNs)-4<2rCDCrKHr)KTE!?&_ zhr_v+R5wjlo??sMNd+4HvfT&>0|3No5$kDpc|m7~!B z5!Pl7YlRs1lzy;^;ikcEr*OeUr%@<&$z%SRiyhv005~G1?y@oU9Yqz~IZAVQj!G0I zA;Ml=kBcsx!YM??#82iCMp-9cLtk4}U-eM+^~}k-ulMfl>veV&utLvu zpZ-jDb$qJ7b6w>G-_;QyqN;I@KLeos*|{k@pu)~yH-G3pU5=?#3gD0DHNS&vu?BB~ zsM+wpJU9HWIm%S~YDB)0eb(9X(3Px1wr;zQ7it426C1}1%{|uwp;fmbv5jCBFAR5x zBI*b4CiU|zGvdmh!a`krtC;qWGo~@%EPm&CIuvtaAKI+t_z;}%5Z z*t2;5q-<~d#iC0~@Ga_KCSY+<%N)yaU4rYH3E}_?i~0i{`7Rfui9%PCx@SJ#16oXQ zmDEC0yYIs`XQi&7KVhIFG77df?`Hv!-Q@elVFgYsgiiGP*O@%YOV8RJ4V99->KY%O zlit6I2S?;0?<4*mX|ZVPloI~(P_bac>&Z)uH z<(vb3)%7RL1Rh!%x;6s~T11o+T|1CntS42?YHP1<;k)H8=subg3YvC_;?@$E8$rAhPY?~RkO2P+R<)Q z_hs{!{pxetuOgOU?B^zIBnF#Xu!Q;fYAUP$k?i@@m;uT{p*Uz`#ETXQw5$o9P9RzW zy692H>g*VTFf595a=_zLsqkhy2ZG##7FhW}1ce;-0_On|%fvB;o#YC`7FX(>E;^=c%< zpxp`WN}mBm%n>QLXB1s7R%DEuHf6nXIut86yz$nZvb_?vq;#TKLQi|sc8vQt^ z`IjnQCpE4wDT~soini_`pW!$ugcT)48Xm1N*jW01sT}c1ID|N)=tM+!%GDm1Ox~@0 z_h=pSmI5kdr+4&MUccIAhVJ`H4UhzQu$DRXQEP*tf7y?--iI8GtFsqp>MWz%?7<+% zNQj4;%p9p%qta^hRE$TNT+`!26e&!CuJ5b->4}cEU9M)UwVm2{wSE6hb)8s}?wbFz zN7%5961r%jmU9~2!KO`9sZie+l+-@VujsZtd=$vHAy#KQR0K58H*U)@ax0T2lZQt$ zHnX{l5o|=^Dm{}kO(leSPf*D(G0ZA#3$CZYjUL*Ho3qgm+B(1H}VpN>-Cl&$dF=HeN zs-Vq(^e17h@yMiF_=AW0ph0J|oX6-R%$Zft1(C^wC_{6(Wh<#>IE zD-)9eIAe7AXj7m>TVjmum*|0{3r~TRRs@CmfUU@dkMJXYakt&YL_P&VmP$Vjy5mWt zAs)ESJBS&CXsOm$`GePV8(SBk>5myKWqyb7H(1Z{yfCJVa4w|6e@H*p9x<2ATsmqh zs@ooz=HN(I#DwA)tq^@~IWcu$e;D}1@zmBX(vp(R;)lS;wYcW*E;H#r7&v@^)!iAr zA~aXyGagS6@}LOH)-8ho)`{3|RY=^4QSsA~lp=Vbk&~I&;88L7s@u30q4~j7WBwK! zunObyeT4MK#O(t3x^@h0ku%`+J!J?O4>V;aA(| z20tSy4Oxq(UTo7di=pH76Y*ab9ShebytOgu6Zb#FrgikBDpa(!p3$__U1}Ob$nccT zpY2uP5)_5bkR1kFJ;FJw$K&UGLR7sD%ODDPO*RaQF+V3leiy^P@WGQ@gh&R9Po^6a zfgtxKmb!6D#SwHb_jTie{+IAS{n9!cE>Ex0V!BLe01H%>Z2qJ{*rK}Uy^p0#mqUt1 zG&Jp+s|fM5EKE@2lw`7aYYl!=6?iBQ1F;3Zkz~tsYGPD^nshS4PHl1OQ*f~#i|~R5 zP!q)ow4c>f^=3d4&6W3{_bZ)r;ylk5>>nxxfrwW!_^g_h`*O(Qvltf5(x|3TeWL@m z@n%8?|Kek+n=Ja^S(JIdEMCusJSFU0upx_KkMPr>Lh#qNZ&Nq}2b2^POC3AqKH;gR z3p>|F_B=qttFb*;5khi15?#;id=2cxq`M`>X$ zo!a284Nk+WAGrm4G8wPK0M%n6>l}wAQ#3Uetr_7`2(BXmhJ^9aG{xdbah%I~hm<2C z1VYKU*SH{1WbhXqC=}`|4-gehoe&ybXj?d^*aZjLco&RvybC#N$nGvsX;)&o90;tq zn0tH_Djk>JgB<*gy@X2ZNnvKWC%Q2yxw1njqe+n+wwe@@ZBlfo)JEelWA@{u=+0L= ztg1a@kbVQOndT)Tghc~(gkUOH0Qv|abk3Z%)#->3tw!46Czti!{gCLf4JLL{c+43b>w)7-S4>Q!{*gU5Y%mZPpy*% z8SfpXxk^g-tmPB>l?16Sl80~DmpmD$sd?)>Y+pPry^GUXN2{qUS?@SMZ!1CoNW7e| z0i6&l{|zI3qbqdPM({@e%mxGZ6fGRBiaea^Io_h?p>p;l3Yfx42-ze=_G~cP@cfQh zO&e@MgEL|m3)zUniZt&`KErDwf|Q)=4VvF*(EN!2nht*1Gy@D~Lj-@^_`A=q4u6Oq z!IF)N;92Lz4n*)r!7Zjo1g6Qe2^>ub>sO?-lIWL4?(aa7f!64LmmyC;$hBD1;Z#gb z`jHq!mH-6lhX#%4IQ@#V*%fUQo*?K-}!F_>`X;s@)Rkkd$p4rpv5l+x}~jk!~T7$}o^ zs&!HfWD3*=L2*f>??@mNk+PC3l8YTd(M@(#A=Ydgpj$$N7?5zpHi;(QL=}E)MqX{9C`uDD z>V6A&L?O{E(+p4S`;@k**F}VCJft(vP*oFIY1!r}lj$jUDuC`AH4)mLJ-A>ck@x4NLo zVW-^`ySXV0vD@g5&n|Y`o8l03qR0(Ortd1?DB>F8yTl3k+9MK}|HfoZfVTShB(p{) zLtA8dIw3iYem<{-mEWh@@MBiNh!CtTi{MN4Fap_M*BU-}>0|t5)zLQK-!xJt885l} zWHch3ET+JDw#Fhqlv*6sfI@S*1AV`T7vY2Tf8|;-0#m?jY5M*Gp$26m717LlivB+e>@hQsq zHmMk3-Z5-HB9$&YC1Yv3y*^oQ1$sVIj&){aWz~6Ao4KFuo3|f3;>W|19t&M0Hsv9VIKtqxV4%4@JwD)p07W!gAF%eiD4406VGvVGQz9q~zm-0;KLqSU9%k$wE zCLmqJoc_7N$CO9PH^1p!ckX!k-YMD`>PTl5<3ZjHuYlx%^j~=5f1u`jm7~(ZC%XC* zBTnx>PIX@)744%HiVEwmgM+)x)*&uiLz3ZX%c~BE;{K3ms6Yto0qcZ45oUyo&_M#|Y!uAJTy6s*Lrq#!zx&H?-NC^E z7gHUPIZl}q?3u9x$Snuy-d>LS%N_QDh$@-f3n&lEf=ZmA8h%dsXFs6RfsNb8O|L-~ zU-F#xH`)GSlDsa6`0dG0+d=SS$sME%TT?_eam5vsIB!imyhsONY?xg6u=bbzdME9k zSI$i&HVFYTLrdi{WvgeQ-5$$yt!QT-AR5C!Rx8?xQHr7+zu#h(%#yroMf;4rHC@Rs zxxXq^U`kL0Vb*(um+Gw142VJj<2VO>r+}RfgP#)=k&+}g5t~BNHuq@Wp1hqOjvQ?A z!{Ng_s0R7uM3{9gl)d4=uQz2Tr)8%+jNIIw1t3ZNe#XP#wNuB{6CvQ*)p|~YgW;eV5PC071E3lp4nvQZAY4z zAf;t?L;2q}rXU+H{lbm-L(~Atju$dLotIfTHy9NO5~=uy%aGfJGj+h!^3o{FW(m!J z%QI1LPt{V9kup2@DdBcu^A50ZMb>=Dky)23+XgL|=o0%*WwMq`yV6jVOf#R}8BP)G zt-=A3dl#5?E|&6V1POH$zeKp+zXAz)cHT@TH6pF3k&*G_X^li1vY}r^K-Ygk9Fg6a zQ)8ej>N)dGw|f6a4*Qm8`pw@d_I=dZcPgH>G0wih2H5w$Ob%x5Ec~lAWmbG%oZ6YQ z-DuQ-E{wIVIcrtO5E!jpIn_bZI!F6SVx3SrS_t1-AuK6ZA^92nJRv3uOURE(8`7)aE zTv~`D5>DWDXzoXM;Or$t@gguZo69(7Xp0e==WZY=FE^OJeJ(koHoM1y^8qtjhc3;BCu|Bh;D~m zCVttGXy~N8F9RTlmIQ_PxMXoYnBWO}FuGN;(Jk2`{YSYi(ti}(I5g|RnPfM5af+$u zh%~O|cFad9$R7NhK=$ZfOKUHTbxJ{5_(!nLD|S!uduSlaft=LPTa*Jov5y@1*G6*S zCsSuj_gn{CLUpr;Eg|34vK}m|DeH9`vYrCULrH`tdkxvr|D_E?V+Fz=D0c*hr}ze9 zO@af=W3Adiw645?(EZSM(A75(c4)Rff-FNykk~t7U5eDOk-f)x4@~S>a_ z7YFaD_Yn4Edx%K?uhd9vED*P%$mgm6A`tiCJP4VY*A1{d9Wt$swHAIyILW;} zzqV;_EQjJGY~-%WNnXBoPLd9HMl1wnLB&nbDO5b>T)RmVQGD=Qs+g$H%(p)xp~rRTt)|m$Dq&5-X~L4}q11(11v~uw zd8}fCU$$7@qrU5~!&WKA+R%He#KCIyxjd1XH)zND$@}5SK{|bGw zBTA#4J*~jVq6QhCTurO&nfqvvk*Y4qej4@HD2vG|K%@;FvMFYh-gl&B#hdQ^W)6`v z&89$q>JcDU+KkuGt*5O_hChM@=UBoBOmh{?vYCM~OekN?^i}Z!prW9lnh*COYte|` z9xCxuN*m;&l{0X@MarUKgLQ(Wid>xyALkc~Bt?MO%WbN91@tZH%Nf9L>NvK|>>QsQ zTu`4~BBQZVuEKIUkz4Zw$~c}hM+E%mXeV3Pl}Oxit%8`|2AN z;F2Ov!*})FuluGe#>gYJ@r7fVV&pi(sNV>EY;L1AS$3~7Rl-B`G43!D!Gs=+gub>T z6bgunk$d}C;j&0SqGEe>s~b<5bQk|9m-XsBZ*Dr z{ zZ%y776 zG+O-)Z}mshYZ@#7`lq9YdHcggbN~0~nJ<5J)F5wvW9;pdqYm)xGv0-_8=(orr$MXd za-ljF2lJgn5VrRsm9B(k{tIdgvJrn~+Q0#h;sCwgb=C6suT;xB8-2;DzQ7h`j>xLM zWa6rUUJRbLdVIBzYb3qNtv6rk=4~{*W2YP|T?*YEiLJ7s%DtR1SAs08m<5T2Kx-R| zgg*%(Rj`)EteTOfS^*fu<1R_8jkKjm3{;FYh=NFT^zZ`5mC%mXYTs|Ndq9s=y-QWA zkSKOk635^uuIVmwf*dRS%%VrKR2B|VDv0H&jBt2JlEibCuxqCuyF{uym3=*?zr^nm zV&$RVqoNhBXl+!{%ftw_ie8KbzL}0!^g^oPkN(qmHlfEh{IK29xf~9=B(#6Im!F9* z-^7U^ucD?&@rds_LDz)EeJjC9tK((=Wd3|A+zX(SP>_8E$0twbA0+=b%_MPQb9mw3 zX}wM79+g1HI;DKEl(KVN^aV~!K1dNXJ#ej91VHaCvSKZuh7%>9s$9%6e*hc5uynBGx+^g1IiKbeDwK+(dT^-3rx|pBi~Wt zaR?eAZ}_;lh&Vt4#{hogtmey#STO1u!ORi5WG`w+)qh7 z3JbE)FQ?3yQW{<)7DkN|;+DIwaB`ID61hvEi2)gw8$t#0nec%)^eLtko$?sB7P!@J z8RfQePIBs?Fc$_Zn72Z*ak+znxDFJrmJOrTL@vUx>ZCT*B{>)yQX9?(^Ql5mV*X)g zsZMank@maX{fh_NxFZOFBkH;0N+QDEmOUsKyfr-vLJ}X0^OZxXUZ-SATGW`(YKY~~ zVJTf?(k78Ha`mZ_9-u&9`MGj+hbt-KL@FjC;raYck@_gd6{tk`t8(a`U_vNXITS4= z20gbHCIi)%9Sd-!k+NClRBG%)pHN;FgK|KJ2xv>Pv>B)zl|ctqYX6IW(_-cauR8N$ zjg7fiJbmU~2jn&Ph7D7W4TOR0>q!yZ6ouX9obmC?1*lA+W~`d~YP#piXjq`oZVQ@K zyJ(h()^-?`TUEp2Hjx#{Mszm?;M*n^A~--C7=^=SYcEV3C}^2S$(`itW(!0)F9>=d zyhWTuxc^;DWQGvg1SbUM{cQzp@l4G5JXaHwZjoFFFlTM(W}g|QE?z8Vq-|03OUFrq z23-f<4KyCZJ36;?&3Lyo!aKXPXwe~Ict_tWyt8gkZuc*i=g3}blr#i=Ym zzf|EJ`rGz83(*B=4QYbEBd%kZ)@5loEHevTtDMs1Opaz;>?TaKsId5>>M|#yQaHXT z0IbNI`*%Ssi`SWeUwk&)Q8ZZvVRxPbL0u&L6PFY#2qE9V0`e|0;%%b(2*rq|vg8v8 zD$MUYfyIJ{p3){7afu*(uo1*N8(3Oo{I(?DX_G;}X+wlWE0|| z;otpbu80ksEDJm!Z|RVE25hyTkB7`@u%~M!DJ1UI-zt_}qM;3Wkr9HxgIz6bmj^6G zMTc4yl6aMnL2@N5cy~lnH*A*&9rCMOTV4^07BLHGapHcwd1#mmc(=3do@;+aKg(_9pl;E0{;6$sy)QCVF|)@@ zqR2{;yM)=_VF@dFHw^RpKOpAlpL!Lxt>wlI92J+nlzK?MVP5<&1h0fl_Hq(u;X zmDoaY%p~pt!536FAYcc@#GJ}L$WO*bE@87OA-WZxwV)ed`OALAgYOLfVVr~)stEGE zUph3CDwgd>+eCL%Ok4SHD2};2k@70qLcrjctKxZ|PQa~#(xW|uTOliv?=UzND zw4kxdaehckAc1wj*%mSyZ(YJM@|Lh3x6u>kY}oCX8q4Y2ZP_b=GM^viKEs#o`Ea&* zGXD(f0ii6h3VWYcEJN-jaoIi$zhN&;Ziibk|2`lPpndVO0qAa0KNt;UA zw4^~yvUN8`ruD^FI+Rzka*jnF<@Nm2giBj^ns9=cL~Q+ExJ?QS-n_$KPwCi#t9%r! z85xDO0!}~0vbAhtChHl(zklfGO(8pFB4+Xi%2=T zqYEJ;<)1FdY1^ismEMF33ZT2!vVX}W3~_cQD#{zBt*II~UrFcVvTkQ^V6@J$!rF8y zB(N28!HH6yg|OqJLY5Q(<=5f}P~S+)1qW1n_!%NP-cX4sm5`KIS{Ptt_aYLc=^;cN z?%w@@>C|PbgBqV!)`cq6Q%ewis8}6+&+G9^1vQWKQwj*eFyFg?k~atxhIA3zmOVfy z#|g~;ojTExHPRfKrYu|rGd$?F;!;!IHy#SfMW}Y*CiJzK)%s?D@^69>|L{BO08d>r z0+)sc!B6?%6Ie>NHZ#JkO3qr2Q|K{~u2d@?b} zNd{&9y-o6s)g%i~_f9eh>v%IZ!>i0eCmgaFwkOT-A(&bgR<$Eo4GVFWfslf!7@!?+ zqMob)LjnIDIpr^i(psWF9;_^0cM`Sy{T(&`U}0Q2FH>OFs!DCv$= z=ffd_q!)+6Y7=E>fSYmETk3n2k~XG@J}oK0?M~guH5dv^wGpH40I~|&8%YW;XXQ=$ z{d!u4izRYhN4ug!T=-+L9FoQ!^B~=*Y7B=SC^aP-u~1uBs+q}c|5U|9hlki!MN3o{ zh=7)bflV|)QG@S!i%d7~jEWGtH#9zkwVFdK7MF1nvGd4ABuB%~MeUwy420BWrk#Hx zO85tdPtKOBz9AI$fEBIPK!PaLSc)^0aD%YHExX{mM;f$H9Zor7k1`YbwsU-NMso~~ z;qkau|HM}ynInqsxanFDu!<;!1w8y5?X zp%_Bm2z3tUN!dG@--jSjrHU^N6IksW@$7U#pCaUz<;nbB%k%$5Vgp9Ica{bUgs14WSd1NBMpeaHYwZB zL%g@-xPI{KR_$&k)crq)yUsY(MVec=ct7_I!hW>1UjpMzXxp& zKkqGPw}F|Y3l3l?Una*yBS#lnV5HUHF5LMV4({}o2DiD-;4+QNhWMHfPBX~B{#0l1 zJy)8+dz&-Z`VVsk_YN-3;NHR6G`_Yo2VU&kyDUzDs_sMBHi{RQl>?>cT{JrU2$Uo|6w~3U)WnrRbObgN+!e; zj9dZ@U0_7j&f!8G^mn_{$#u_)jN#|)p1p?ZSiF_>TPvmPt31?ELt8pP#AnhZcOxRL zmcGPmi(vX?8fF_LXMz6H7&AP`rtMDI|Hy)6J1Tvjdm2^Uwk`>Pl-1dx78KL|R_xh= znVPQLRMMQu+m>FLy`pU3lyOBY=Jc(!S`A7?8!eZZ2_9PIfno)obs$!vyFXP!d4qVI z8#t7eT&Q8CwpIEGMFTcQV7W*S2OlfBCF-E=XPT74j{FC;>zuKdW%0#@u&8og&%$^; z%s!PYJce1WyumA3V1}{FZL^=(jZf616q#6x0X_q!Hs=az`(2Xm8S9r+?6M@>5ZN}$ zNK}z_!6=3U>cG^(SeG?QURN|~<)5wcPbvS3dQbEWIQ&J%z7Uo!7E@Z4L!0iS1HX+W zge{bt$ykR1+5hruPUW(+V*`%f?@FYg1cx z+QiKu(TTYS`Oz^CY>{M2djG7Iqo6@$bFHgqdEji=5}WwZWAXf*scYc7*~g zqvQHPBVE*7r~;u~{^~+HQwZwD<){!u31$kxPE-g+MPL{y6)#DFbFB)&t^l=5Ay_E@ zFQMB(fDK(&j@_lPqh~i|Ai%s}ZYR1ODR&U?;~+qbwg&>FNf{UcP-#RX07jjsGX?-0 zVE}+MqPvxW06@w>#($ij?|?E8kiAyQz^`PxHO|kbBgNkpRITvPUFv3{tnEUja1E;F zOVXifWjd98Nsp+SuSv^#34e$Ua7L~qW18kyz!ikeXVOZ=if4-wzMR(jRU(Hs^~+aN zuCCCfO1TOL2y{{B`dzUq8&9QMeKtL}Ze-c}Px1AR6sj}2ZBM2M$0CI+sq1Q6f#)mh zaDy6QF=YuGd`ZFqufROEaVaxaP@4#v6PE5~1^dp__45FmDdzz;Q{yDCmjhJ#@N1Z< zNdKdms)%1RwTti#>mmFPHo&)gmg4jke@yLHR#*80|$RgHyNN^^O~@Y~05EmPYD3puS>}-?s1sSpJ7%tXyu^y7u#pml$QY_qow5}vF(GA<#@SnT9|KIw z5;@U^?_6a2xQ$`q0Alm9Ot?1o9ZaAFyLkApyKl_DiqDYP0r9K_(s{bJ@4k0GPa&$W zJcZbM%TtKy=E4kl3PpXouGS_IvuZ7No2Y^Jg`ml5tG+XL{)SmnHQ2VCZy0caL;a1N zZpj_4k|DSNNO}%Q-QYf)NCs=OQ4egvmSYC8)FdzR(!e8zCwXb$S*Z*%G1lHezq2pH z?>KJ}Tn5afEvL4s67dq-JMr^G|-`#3#vj%gJAf=$^20{n20e*o3wZ`zo7R;W@RZX@Rxl9 zo($iVNnz3FkG+OJXv1+Tdr6;|f^X(FSHqWc!2-8fzoH3PzmgZIhS1LD#Tt3Bz(gi; zDtl3d-EP9{zYwc>fvOZ7;OkaZecO{)g*Ml!x>3L1$P2VWD17q*eGnBp8<7_3IaQ`} zcK{8LeQ>x3mg28{-EMp{By}SMYlgXb z$n0WCF_^6Qp*c;#yWzp>x`p?3JJdQGZdU1%dgXP2z3z~%J<~oJcttO(#?OxAUH((MzkBv8simT0%;uz^ihb?aL z3-gy3iZ^iM(HOA3-uC%6t-TK_Oq>g33G`4aYc_)(gkbLTlQ>vG*6pm@Wotn8~yi zZ(#y&(XdZ41)#G}oyJZ#6_@1@<78NRv)C(1I7u2Gv?dvge@k6l^dMoPD(9AD5r>ws zlThQRq!)#y7H`oOoG|J1oS$3hE(W1vrt|OEeXg$`W`@x5e$3AB7i|#$tZcsruwxzU z^sJ7HNB3m6eY#~CD?;op+)Ge>!~VZ6g?afVBCtKFYhCp41%0C#WD9GQ6)+im-W2PQ z<`0$_%Em2K@}`odY6`7+5?=R(U%M;(c)0lszxGJDb*t?9Yso9}StRDw5>8yKhp<&n z`uCfZeIZ1iwOXFy`*%myT-+W`8EY=yDnh^Ve-#U$7l-iiGDC*E`k-Aizw+}?agxxS zw~zw3+tV4O?FQlEP=5kG654M}6AzFI`$w^_Kkq@k3q8CxRfnetFr+d<9A^F5M^ZKh0yj01lA^aNeT|M(^ezPy4*|BGNN)^#_=?oh*J3nn{bwNEvT@~I1~X(kW5byhuU4#lq1`4L|Jq~J4_@y zo>rF8Mw4MWOolVfB$`&!AT2Gaj;G-`ip|7?*w6QQ&b{w_cVGM>l{B3xNZ`Fc&OPTj z&w0-C>pbTI8O9{l zXd#zcdD_&|ADo8PK%bZq3t@(H{qx8cn2V2XT@T7*6_Ga|U9vK0F(=d(#0C+P+#uya0AE3T2cqF)VC8|(!Ql15@xuIp-$S_~57 zcTD^tTkVC_I7rhW*Wif-5N8Y25*u0sE@W7X4DpdRtaB)#tt>awC_7{@5r$ZOp=C|8 zniQn5U!__QpdbM#B4~KJ6#RjmmHwx^+4u2&o(D;vZHsIE>>hhI&8UcWQI!t(MtM~8?rClPIW>6A6vY}5N}YhHA{&kL zH4xlJguLS1Co>RfPG0%QOBs5RUqbJ!0@+G--H2U9o!D(Q z^vSnZ5e)mDvm+Krka;{oHt4g}?6xuv^%lYyqNNrgLXzTs+*FElRxG9DgU zf8o8eQ95+BQG(v#CA=OpN_w}-$nclgDd=0j*fMcIO9s!4WYw2W9PlG zsv=HBVVJ>&1=ZM<1=ZBXHn|QaKnl&@Br*XHRBFYZAsce&m&IA;n(}q4*FX!cpx`p?P zxRLd0KidzCG29aIXax3={P=RV8e{};aYwX=w6u_^1I^p_~nOns3=n>2~WqS2bGG?HkOALh(L!+Zt~&S#mmOCXoj8Mzg2wU?@j zVO3a9(@WcuNF!V2$q|2Y%zx(nCx;Q-`O=SFG{FMC5S4Y&SuNkM0GBOW7)f z6s#TVV|*BH4digN_IIv(2Aq}`pa<;mCD|kU8H`nYXslNHA}9oOhnCbd#cvIVZ9vCW z2W(y!{=i(H+l~t&JAl{_ovVR)HNf&H`o(5;NUL;I4Ubo%-6Il|u`u#e^fwnZ0~`Ze z*|ETJ@6ofz8`Pjx=|Bi4VBJL3ImAZ{)>Jq&Qfj}*%Sy2px>}?=mJ{ho1T|Y6zmK~krm31m^ANWd%407-!d>%y$s_#ChAeKqQfp|%kMS_-8+MPD z3?PuHDKOGV?zPW&0)(z2pRh7GSL8jR-*UvNYM#iof_KE#XerF_3MmN>QXpy_(kRxs zWs!j^9NG}8G>S^)7^>JR>MDndy2@dCiXu#pD8mY#q;tn$x_`MzWlH@Zr!2pwQ(znQ*G}4h7RDS56%xNB^wJ4UmO0TNM`4>2(=bUyCEi|&LGQ%XE$6<|z?rd4pU)5@oo=rcNDI^VAJg5Oi?QqQ< zbB~Y)$&W3)gpIgjxfpnE{UJ-b!Xj47nJJS{Q3?d_=nKLVR$<S;{wk9t>n!IM>u4r;{)dkIQ_GyNqTWR(& zhx1h(7cT1>D?%p0WWG6YU$;Hb-_< ztK0%_%*ZBUr+nFTiABVewqgdKp;2PlL$KY%r#@~bG+7tBz`5-#>9KUj;oJ~E(LEA5 zI};KU9Z150MXFf|62 zNdvF8q+rr}kR{yo<7F`odpazu(Q8(>seei(%^j8eS34@m9F@pb<9l1#p9L~Rm`z{7qbqXxiwr-Lw`mTr+hYL~*Z|nRkhdd%_^=GX z`-Z^}gD3LTXDZ+~M0B_XwZoa*d0#Nkh;7nBj4S1LoYPnP-iq=)sHoLIDi(6U)xZDH zO|%bf*789oAt|#@+eOSiU4!ibC?zSE^XOd?dzVzblb53G9koL}nN|tP-f`N>58VuW zOiH0&&M`|5;)(3*-PH`Z36QAp-NMAO#`hK`Unkj#r$=rEPprroO#A~?I5wEND3-l z*MaGtYK}ZImQ_yYy>@k~sbzK|mNb3;vIjb9NrHtMWqI=B?NqQsL6-J(ka}5A8IL%K zgYA7v?xb8XZBj6hiIAyI&gT=U2?R{w__pJ3v28hO=0ti_^X*nZV`Y7fYo4!b3w?l* zUls`RQA&;@Z3ih0%Px)0)N*UE)0*K{U$v$OrAie@bDH#&z zq-I1osULXaE4)BL%>;{Zq2v!r)2Eu#vSyQmUdQXyF{i+ic_n1YE&5Yu4p5#wsLgn# zI{rYd5%M5-$u!bnpnXK!cyv z>J;A_I{s88_~T8^&o8w3(ivh zp?D=eLCK*+Um}zeddX=CWc@gA_g$@eZ-WR`0irLcq|KQ}mI-3<&MIzViVFPhEDfU( zoZpTiC>CcCqfyA2a2nX2O*HQSKn7dhyha{!Qz2l8@iDb7Z-?JP`X)s~e z>;3&Ep@%K@9#2NT$}D51Z~(1-EL$%pdJv4uUC5LmBOq0vG+VH{EGfbcXpw*x@XX)t z_j&3EVQTSCvD}vy-H=ZJ*|l8!1{1t>BJ-kNs!?zoHm|%AMA-DIP+fddL<@ zCrqL;OqbHbX)c)=x)k9?S3D%AT%H67DE2#acyoyrSKUa7mOd=4l^3L|sP5TZ&CpMH zBZ~0XBA1aolK>NiFL1C$*BfLCktm7KChrW}w(7&3Ol~D1feo-|Ll_Ysn#!dRUFa05 zE$_);76~ji;MGGG5EbDPUb)KqEHq{9f0}4(5SwR~*ie4hbn}ALFU>W(^zlTA(RkWG zt}&1{o{D@4JBPA4GL%e9Mmx7dcj;9eO}z2dXinK^PBNPH@uY-&wxYzWr}LwaM^R8_x7B5zgLvUY{{oIwq3kX4J8f$qV0U&d2C%a3vh!$ zYEzI)hK4mq3=|@Nc<2IaJIBUnvXl8J>_Zst4NG{~iS*HAjGDkQmnDtvFO!ZHpZZyoEWddkX~dgaEB>VUW$sQI&&a%rs^}6g!jtyS2GV zO^gD&TriGEv_hNA39k-zuIl#5HQtSKY0`iFL$#>@tOnZ{%~>VgYcKu+YFr866RS}O zY@g2#KyLFs-Yj!s4=-<%=)ApcEF4496kfz3Dj_z9hyL&(adpjZe)x-D-BwNa20c1# zEBb^n;{L+p4b0|gvsfbO|8kW~&=|Wc*czhtC&7-%7&$&MP-ip|F~qcshZ#N34i297 zC+Fxqc&hZ`ljx9azo`-8f#Q-QB=EVv{%tsnKn@)ZB_az$Dl|DMOvLSy;XTOk!v23jbL#; ztoLY%NJ}odh`e1|qFjIIw&H@){n&u7D7rT6L^dxq(pmJ6RBSIZ1HF-TkR)gC%PdZ} zk#(8+QK8GHOvZc&wmxNSot>}7wTV=wYH?TaB*AYQS*{vTnEYq+0&!A=+IGU!g^cB5 z6o3=y!+a!@z*g=};`#A1#yBNJ(5dK|UC|hkJrDh7Y{k3aJ%ayw3k108ty-fQ+o@;F zmc}NchKKqFBSD4bumjT)O^cmClk+OH&6pQ$GzQxaNThSBTB%M# zj8UKbyGha&**PIX)};uMLMeg~v7?JbGtBjo+t5c$Juq@b8iiUC0us}C+o zj};R|Hlxt0$EMAKKRk-lA`Qu80B0{KW8MT}O&q3%>YU{gNT%GUOI}%8j^0HWo$Q27gb!!k2G79HSU-lrUq!}Y(@$K#427< z;Q-ey5*WFx7Eu5+;PzHi4OBDxqhIhd$n*JaviC{%OT%`HDFbY9{kr)VZm0(0fUdJ^C%;s8ax{xOh z>%~OzXnt4%Kle0VOuz&~Z}U#(PwCj|-9I9>5+~X~@#yw5$5^a6)|*jfRY7Rpcjr*uppH>u zIzi4xKeDK>V9GJgXF z19eFK#AgWBZ*?x=V@kDL(f>^k7>BZr4%pw+fWb@O<=pamcMjN1QMFcucB-~FIapLN zX0RUNNQks1+mbk1!}B3D8_S`CI}C@dl-H1PE(@m~i2O{H2Tj8ZBJ;*(pX(>^+Bv_4n=a>o6KW+NzcJF1m zr{|oX-`8e$M+tuO4_nO zaFVc;3sEDMj*~BVDXHz2x7ri4l13UaFKv2Jofwc%uu(imnNq2a&hD)|CMM9)^ej2E zwbbk5AUZmLUr;V$(lYoZiIOYV^<|?e5smAiGyGr;2~<-5+YPj(y_n{Hz`u;|0lfq* zW{)yGEN*W4JHguEsh9Yu z4RJ0_aYgm1a+;?OoBv=2^|t|3(GwfH zgRa;oLdf7}+tHQ1_)c8eXFqv%#FhQV(6wE;vYA!mUDeT*%}gEt-dx%4Zje0%0f==? z;Z3$lfZ{JzPR~Th(2g$UdA7NLQ#6v2>HAXgd96Gt2klC3KPG`5vI64sfTSs<`khHz zch#EgneshDsOAk%%odPA8dZH!uDoxsKBDbP$M?|9DTgK@RHgaB1p<@OQr=6xSK59G ztRg0ddXy6d;-`%9PpiaYSLAkA;k4Tmykd~nDo$7FW5S8+Hn&VRJ(7_B+#r&nrlQ zQ6O?uwVLml<0y7{nHyC1osIz^63&xCp@rK27=Y5Aw2KqcxQthC1uvC z0vM$3wn(|C=^?*=*p^EfE}<;7VO#F}g-zx3i7|H<;*&ORp?lr-NEmaI1sX?1lLPf_jNa%1ugThdr1R!Ft#~&V!v~ zXvG#NRyvfjj4M+&vcoa_6UV4H;Be4~NII`g%Om5x13w|RQD$JkleNsAod$o{CYF_$ z0)6iUQ(@eg8%`?A>j29=-kiqY58fAvaiRMRVZpf5Nlq$gF9#BVB#(yNq5s8w9 z7OA-i*r??s&#o2SYegrG0JS5)m(C>8#e9rsMQN{NVA?#PTXRteOZH3T>w&GDX>rX~ z&K9VaL(RD%s)Ja)>8O9pAda>f;{yGmVLvkHjmEf(Ug~_ znhuZ7Mt~xC5w2$e=7hs_mdo3Lh*ixNgJP$~;Vc*eWx#AZFi-Q1!SI};<|*z$JMEn2 z3aoSWQ6It42A@(!3`5CBwZpYl9946H=FYwaYOD4XlRz;W4~7Pn^hv*GEbuyT|9I8V zV_bRTkB)2daqXYACLh)Q*%thVf6yom@53hHN1`}`H!lUE(fM6;Y*N5MXIZRLV z1g(ldx%BdHL*k)Po}j@siD#sZi zMM;UK>SSO6UXC1H2)I4?sSn@K>82j?TK+3{!$r0PMY_Mu7VnM{bZs?NE6a%BB{;Pm zd8aiU*i9vQT|s4GM(eScEUZtL3h%K!v-aG>d+a&kJuJ70`Npm^dmp?>dOY6v1!!CG zPms<%x-o@+x2JzJo}t8D9bH2_snVUKc!N&gl9I+deQ&ao%VP=Q#@+l87~K5PGKg+| zueWmZUy3UuppG{IUZlTc-29J>xcUFwO%K&)>qEtjG_T!!bN z@-CUiRaULufq%aw9`{bYOZR?R8M?{4Wk^&ph9TX$GcLwF_O-AW^W0ig%q^y$TFAHc zjX4j|QRgOC?zY<6?!D2*%|0ej=EmIYXi)zl-R#2{aE}1Tonsz#j{u*7woR#({)rEq zGs#R5?elzxPo2{uWmI|mjiO312;!oId)d*F(O@Z1cdAotmrEW0K5W_p#c^JHt+;Ba zkm5M!yd~-z;O_*Ufmw%Vlilud{}x{ppDE>S!=!`7dE1v=^~fS*d{F_nkQ{ntGrJ^$ z!hxbh@W>!?7)!ab=PnWKITB$?&S*mH&m|8u_>(C@1LIeA8g47QLFpSGV(nja({&1? z4nSbJ?;e$xd@_2;r_7(So%gV_N(U)Au40lVdFn0rkH;h_m|*fk1sE!DqtH4*3`)}S zf=<$-)uEUCc5Jfo&T&2-#FgmYzbqrZd+)?eesPDJ{JG(MW+r1Et1*mpJN$H7 zK50zB=yEQD!zncq9F85&)ET;*6?NkK4`RJutB6G&R0|KsVAk|yhIe~!^rPc>p)`rZ zO*)>31Ku>p^Kih2j^{Yw*KjbJagd=U%am@128PnUtD>z_f-Ds1-Y(``tYEX@#Ttg8s>Yg*o}L; zSw4_+%O!1C_)jk5y7FVtXoMDZ8Vsn7I?y=HPmOyFaS z?tF`zw<^jtfcf&3T>B;F7Rox}h8%ONNV_r4glJ$FWJ&tcU4=x*I- z%}cVmmdVPH@nLi8TCPi6m`lc1v;CC|(^LAB+TI*{Rty*B68eC18nXOG7v28YjvUAE z7RJR!KpO$#ItItKmV~s#(6gQ^-=#Ybga6>ZwP1gF>q$MZSR({2bIkfENdIMYm5)IH zo~;;fYiZZhiOZsZ5Z(GyrGU1r4(@ z)6rp;;g>bao z?ZsG>jx5}5lC?Pc7#+Dj{m2gUIB;r}PvDFD=|k3-pI5 zWKMN32$se`fNRsB`8v>?6*RCN{)K{v5V_OTrOEqX8pcnA)zT-@88TK~im`UYSnatp zR(lR(CHS4#a>)J82e$Rq`i1}DPc_N#F1MW^;fkp{ctPr(qsy?iX1qbCOaSNO6hhF) zk2q^{juYh0Hk1)pTB-{hgD&rDiV0L_-)O;(IK1J8B1X&twNK!c4wF|y-;2!E$Ufb9 z9(|ZgB~%*AM^$6#NB2X2I2sn`GZ_Ly0+5yO9IrNq?Cc)F7c>@e3^mtn2pPSLiDSZk zM%sMX+mt`_BFcdE>X_KwC~o+YY&d=-k`0-$MK*GORt{THkM&TUUH3~l z-8sZTqKkiVl$tZPAG?ZN82OqrW3^e*D)}~F9_4bz&egz6#`i~o`#0W}kGia3q=I

    N=d`nvL{*PAB{uGYNzz}kbFC&9big*rW;Y`#&AmCk=#vvr-`JtMA{ z;c8FwF58M1ir=sq*&G-#a?&QX#!nS>N3VuqfxUl_B+c^d2;7}*FK81hk<0VT=OF03 zBPG+^eVR=yCYj?p_LzK?*6YES)NVd8__DPRcG(~s*c_{+E6ALF;q+paXYfT$Djg6R zCXP3LNYbAIgG>61xjOik+7zGw@V=zQRqMUU8_D~UjxMpJNU_AGbO5QGn!PV|o9#0R z`Ogni%h`rD?RLB`h`~48Y`#s`x%zf{WAJkdbb{|PC~vm&$>J#)XKdXJ-E4|NusE_A z$43*zTgl+(Rb!Zt2^UMtOx0zWa!_DzQh>Kbo%Jg)HLLv9xt}%E3wI;cG(q z4wSzd+?_teEAk!xaiS;38{wYDAKK;7^x$3TBYJ2be9&KK_cZ=>EScZa_)fe$d{5)w zko@I%V~rSGtL{y`Y2DNKBYulBccmx!Vd7`4-M)YfRy_Q#j&i&kHYj=f%7@cO?aTWb z9G6i3&3j4`Zv34B>^=2V-)!w=Jj##tDNh)K@=0+y*-&|&G6?0Gph7yjxj~}K6Bj2(^ zZZ#aYC?r~JRT=QhvkXKZ9dWVd;6;<1Qw%UGCQ}NJ&?QNZj4#}7o93r%X;e-(_<~G* z)+z^oA{y5G_7)fNrtiJhbP7!yG|?t$PZRxOrIka;W+?GMcHZ-vw}7`~6O>TA$W=N} zedG&Mz2B8*i2YB)BNHw+DsMr7o@pn-`boAmDuQtghI1F0>a&KGz@|w)_wY9df1<42 zKeeYrZ6==-lC3SBE>X1bJSB)TR(vZbI9Z5fw7*UpLsQJRu{}MR? zfJi{#l}cX5bL-rUm}=hNY*zH*c(dY`WZblNB76@r5zSG`VI!8Y;y$T1TCbKGs)Jf= zYok3~;OVYTwD4+|{SZ$ti%3=y=K(~Ccam2XnfGo2N6p67@LkK_b;Lz@hs|{~U62X@|AC|6b=8w45;oqIE_v-IwRPBP5VvX#-ZG_t4AaOT z)j|1w&avbaK`Dhre4Sd0WUa$gamvMKlX1U9NfmTmO7~pJZwZ8`NVZ*(q|H|GMy0pG5RRsAwMi#m>1~Xr z6ui*Mx)hd?Rny;=>grqkNNN0aiKH-1l1}6OW0;cN8iYwg+3lwOx=zR3Yoo$sQrw{- z4u*%??0ek`f4nvwiHf5rdT+8|f^>mC;!PU-m2=?EuSHPu{ey6Q4X?VV@$;xWWL#`q z;8(Q8o71{FmiF&XpYp4PyA}PTXfBLF%4p*)Kc>d|NCoNEXh~Asq%5VU2b&r*Ny({# z@s{#ZayHoIDg0NTU5xi8Qz!1Q{2ts0B+!(+|M<)YmQfDI?6jK2JN+Sa-6F9?l zyeY#x1H}1^O$w6*2%>K2SFM7;63T83Ec$hNqj-G70dI}KrZ6SJMu5^d*w{fU*m|Ik zfhxfZ-B?w2#xHiP+)dpidt_|#Rwb8dWn3E#kt!|piD>8dnHD$6L3vc(3NnouM)mdaXJ3!hEQzz4<$Uyl5~=~ z`DQ?VGdr+I7}R{w93hEu)&S8=Jma6Hm6~qrGNoPeO4Zm*RX)kVt^8Zis01luEeC=;Klnqy3w_$R}n$OZlo$>kR{ zB*Xu9^iq|wB8Qq5^{6Cn-}hUTEcp;h$5~YdeYpCBG7TdHl&(i<-mhiMiG@`6-?LUm z00cB&U)TX}9YD%pavF_F=l?W$jQ(y4 zkr?t*9!f#U~<#|HHDd`%(YZp(12ntrRB*T9BrDVHVYfYX?=!2M>d2admB`$ zC%Dl4$>wL&fv4>uZtSwhDuZj=Zz*FSGtp)ErUgepq^@~2e*oYWWt)n(+dBEMEji_f z%@`W!9#zxgO(3|2P(E~AmvF`b;ki>u39yY!CK=KDZyM#0`_yP9IF>LL%So-pqQRTe zDAkZp1=(&3gFhbk@ZXjX$E!oV&$pY(px6F*)aJ^@%isF^obU#{OP*^&Dnmq));g4% z*ldS#76+cTa&k{-IB`%@+)=6Q6KIKA^l&0of(kv*o@5lmk1R8aO? zO-p^veC;u7LAxkR;)0?TmiUyRWQvuiu1^DcJ*hohU$X*qaGLVdoKvDGc@`%l$~a6i znpk|!i;pa06h#R=A;B{--2gxkVj+MIs9H3{lQKG@vxbLqI5w%VM52;QqdU|P54!Y# z)FeRD1o7Y<*;_Re2W&?(anywF(Po@HYRx#QYruCkBYprffXxtWQSh3xEe)N$gW>mj z|GbIiT5XIEPgMINt{XB$FYw`;vLi<;0+GfBrFxE`>iS&_7Dp)vxCqFaN-2-(g$ePb z4|kCgtFg61zff0H9hw%0PRC_5xl=Tt@%R#b*V6G4RKeF8DV{WPlEGUQeJjkz%Bh6V z!r-a@Cl#X<|CZfJ4Z^oBV{m*zhNGO94n}B;gj~<1|XJZ zoKbk}xk|S^_D5V;9bretd4kv^U3sZ>L+iRrWRL|5gG;L{#=G9B$80Up8m7L$=d5oy z)XW}XwzZ1Vf7ko1R!cmnmf=C(yXc>wAmftYn2tVi1O|SBbY14-Lq+2QsEnmAr*j^w zLPO{$zxkDo1oK$v_dq^&zo?)pW;Q2TpE=xPwgR5kw3M))NGO>ie!32$$Ocb!1eH&_ zAIUHj?->=U=Hi=tpY?+M&lV2NzBGj!k`6g zURb(LJZ*KV0V%ubMp@I1Za!V7o9gMO>U2{*eYQ?F)zhD;Q;j`^Y6kXHG=s{gQ3p7q z8FsIg1jFIHLa1R86;1?$UI<~)4Wk)*-P6~Ui8P}DEAj1=WMsn>SaaLsN&FzuR{>XO z`%?%_rjc^HN*A`3xHS5(%GO;c?WVc zoLk@v_sAYYw|&KCF8_)%5%m>YI( zYbwNvfM9j|pFu#8k~*QOAy)R;BxzTjcZd2_Pz;;VwDKL|NO=?y&9j6MCG_ZqG{o(gMSDM2fzO+1+*yPYMvtXxbmdc z*G_;5-DY&@0?$`mx>2*CB_md{$ZoJ;7Zm`~`ZnEB=y1{yX>L%;`OE*~WU$T0yqc&{YB)QQ!eR=1c zMk9)I`nKzF1q8P%i7`cNi@CMBgy6BtT`6MR~~pb)y95&-}UOC zAH!&&-jAX)B+oD@cZv&Hui{tC7}y{zV+>n&)~2LAa#uHGG6ej%x&*Nb$dJy{U=Bv^ z^kZu6FOO}_bSAYX^jxPo>62x1R}`&cZnH7%{dwE~MJmc;IV!v-0Cg)8d&OJJ(5)!85-_G{*154?4p5Gi>uV?Ycg6Rk$+Xq zG<|VI4p?qATv`yxQn$2WtF1qcAR}Ps?YG~aIF+~Is;#WiT&L@O`(lDCCops(S30$j z=`GpfJ^BKB7YMbh-+2g=bP2svgx-^&*3Skr_iYDXudle^oHE(T?-ObsS-={e0kNx@ zoy#@7-hZqpIXHq6-3?KqyCF(+s=_-)i9Q}(!RqxMhAC;rrlQ;TmI>uWF-t1Fvq zuABP8LLvbgXe&|6p@B6t^{!$uxIP-X9*c3jaWC4BV3`yMif%I?dLns?2tP{fwX~ME z6z73IwhUE;+%)}&YKzlvDop#gQ~H)b*J6eMQZKG$Ld*-kkSf=+FIdr#yr7eVUz9Oe ztZm@-j_xcPWHH?Qc66c^S>gz=r~&sTH5oKxQ$uxE3$}PMc7*_n!7s|zSOt^=0tR3MV#dECgW8|T~?(!yx7nXLX5l9Rown#G;LH~Pcw)7c%FtQIc z_~Tv;o)L>?VT5`sKL*B`qHjUaJ&p4UIF=^&TuSHIUeUBYeYO{ zLPK6jSe$~u^spHTlH&&$ufeC~anWPxqI7{VPPnQ*f6pX|v z_i2GI`aYF7p+|vBl;XsbpHLz^RZp&VkHnbO31OOI3cg{Ro_C9{vuSv}Jh&`esDi=k zK8W1m@SHBRsjqi(nJd+2D0qsVeiEVDmTV6O9b=J~hF7=tCcycd)&7K79I{v!QYYhag1I-5?Fl4ry@eYBX4H)@flzQDa?t zN={7;&j?TIS3Kz|V^ZTsQx!j=rqC}dg&+0n{HP!Kk%H$UAKFnq(t@{rm3HadPCm4w zmT|3KixviTS{RJdf|Lp--GtG?#5h`bLA3A!{vPHcQ=D1T3;S)%uf|4R)E6&`dK!b0 zdK%ZD9@e`?sYf9F|0MMP84_~p=^@kWnQ8I~O z7<^vLMf-@0ga9BIN-1*0Y>IoI44n=6Ls8l1B^IPM!M<5C50fPwHWl-#_zBYv5EaZq zo04BuM#4fxyED-RKWwl$IgN||X!1rG{1IXIQE#CP7>E)hYsY%!aPl)mGW4!4qY7fW)Lo$=<%S-+WDIZU@<=3~)D)TzK z)3xkHY0^-TGnB*TlnI5j)mmrLj(-$2mASJlqvJ}I+Oy|p;uPOh+yb6hzMBfOpSi&K zmP9)1{MKwv^ay7r?jRQaRzq$`$TJ;&r!>UV=T#2y8=RATVOvT{BXFc1_zKhdX$Ct6 zwowEjF;&zOairD2O)zj85z@YQe_*<8`c+D}?@XFBh?}x86^Zl*zgizyTRwQuUKB^4 z++d>uL-P`*v6BjP@H>%CUSfXK+UxY_8l5ZKP*ASu#;ZyOU#z#ndIPTTYqWx%@YV6{ zwCR_TAg(;ofb89QE-eu)WC`LOUp{cVEL^!9!KIn}plt2q1ieW%c+rFOsdc5*7;E7mf7We-Yq zBWp1ENcli8pt3&X3Ah7}eOD$^jVDQAmms(+pwOm5zTfUx&bQwtX$m;Lp3cScM@5ca z+NZ`9JR@mb-@k&P`ptxN+}aDkRs?T?94QB@kF@P-B{qR$j=R;^&>?M4{JkU(vg*&? zSN|K9!vXDOJapyt1c2;1gy8!bul%3-=38SnJ^)Av%U2$}^27PE;0jj`*)df6`SegK z>R!^7mh?z}!IkYWTqRk~k4U0toZYTY-?B!EFWXN~@xDwvGTEr$s` z8|c}rp4DnJyzaoY;ooXpfaS4pkZbcY$GV2r`=<%-igSv2kJa;pMH*UT@-7i;{9sJ#*XWSb%@{?r)dPfW7w@TbPr_>%%6=`tR^8vh%-7`dN| z(qGeEulLK%WCB;bfdwb-=FMp4s2@CtCNDA<0x@G(56dm1Dq(?vvTizV>B=WiTDn9I z{g|(UY6lUPZs(LX2;em|pNPmAOBdISssXELJaEW~($Ynz;F&afI8_R#5>WBu=xxy* zB+@D5S8QY5c+J!#>(MKncz-@=)=esX3d%H9O3rc`8(ThFH{SMD+ErAP_D`6vW^66v zS~c%0Q(9gY$zc%4wv}ks_>HI?K`Rq?(Chue_fH%|^J4Qq`*_pganP40IktPvLW0~Y z15>B+W6evQ`;({d=7;&l%F9^Ei+%}U1=hSovsPce-n2`QQM~MzQ(Qjlmje27Y6bdS{zur&}DDGivrMx+>SbdQGPu;sbr)4L+7dG@As z-P~l%7yM1W8lcH0&l?(~uqbfZk`BOnKW`Zs({;YFHi#9~W2-Lx3H3l38-a{OlF^5g7MGw( z+MMtP-tfCAzkAN^Vsj)p^5!_YIW{*zbu`Bs0p4ZmwB|&Ng*T`7G)D+))!gOIusJym zunD?>2n_N(gnfX4X{W^tJdg4}!(1kdo=G4y0_jsPi+Cdm?`OOhz+myuY7faVM#;k({Iv4LSo*bOxwr`Kyg@)6I25_g?U?F`K4E zji|Kayf1NX13P6HU~;U9YWnC!vx0(oxkjy1C5i~|o#0LTbhbj>llH2M3d+U)up<9# z=f9vPMVx3y<;I`ZrrilsIaYm5C22GoDSw;%%??p2E`d&F9hha4#8ro`^k3v<{qL3E zOs@O}J0&59raAajs70arUrJEnaDkIFh_=8vnFWKBsF_S02|yVefRipe8M2KmaQ|ZR zBx9CEi`sUsb?ChopI&5~bqpK^tL$nRf7jS7v-64KY3a(UGE`NTb=faTrb2i^vx&}G zwM+u9SvA%ksU0=gM60MjeoYKtk68p8R#3dzjNn~lgRj7ob zAEUHzAoOdrfMyq_m{jkW9A09i>wn)RIb2_lf%kJmhl9W5u~n+BL^9d z*Cq$LA2RjVMa))j(u0(`>+)_q1 zIjx0hSAUU4)=kvz2bP)VY@HTQSdv_US7$4b78qRcPZsK*EZ8UWDo&!xAI)rolcYq^ z-pF&DO2x0B0hA1IF<``^%oV>?dzkTXMGyaJ?P1{IydHk1_V6$d_vzs#3DwFv*9$jW^>F*Xb=;s$y>^s@|ekR8(H;Z7eGO zsG`^CEr42o5AW=+<-~&Jmi?XZ{>~Q-=>dlUzUsCd923@Ujq-~3o1at0*(Us%`i*9C z8gqQ5?DrI-+X=z?J<(jJnsK8{s8Q@U+rD+hC=Z%;{F>dcTp^>URM6s^9p=c&*`9b*?&uHB%dAo9ieHFQe|vGJSI( zo`GB_l@^zI=t`j$im5X#q-m9LOFTT4DdN9NX>KZdndI)f7Vnff-ewGMU0NECw`PU6 z>(WasI;59Tymf^)1r?ZBv;cISSvP_=su12Hy_vo>J7-JsSMNcgHZqP#&H;x`z0=v-zDWMVLXLdHlLdjhO z6R|w6L{*FTLmF?--p%fX#V{|HwHOX7l^UK#@ykUVS!EI3-Hz|mpWn6-GQSEVB@S+c z6@Sjoi@=pcgVVXRpha>rc__(ZTv9OwnfYvEX#O%t9g%1AfN9^$rbMd+`Cu$8u~~c+ z+Xr1*tu#@*N(KgrNLBL3C|a(y@x-S5q!dZHEBJxT^aB^v4+us+z|T!>LnV*XQsAmt z2iL)r{{vDp@C2rugiKesa?f_(sXPt}vuQfgD2YsI7_LNdOpwL>JX7kl#@1s{o^NkUJ_bCQ79>ZAPZzbk!`p96QLkMpzluJl3ov%I1& z7Vk=*#sC$w-{}a#g%Ek&?NBMq-;FtDwkQ`;tH!YSOr?p{Ttk&6mK#z{``WFHO_a(Q zbz+G&S(9=PUdh?_Ng|@ll?qs(&z!OehWEYf z6>mk{jJ1WXAz-iHn!dTI4`{;lI)ynRxhyLSu`TLd>RUjNMdoqUqZ%Hs)#2@N;|B1T zqXVQ>eAzu#3Rs&cjw<|4ojVI#5-WL(sE5H{H%C=RoUdEmJiT#0kI#Noq3zA$HjRuF zX`Dt@Jvu_KS6Ff-TzQw|h^=r|4LskBj=GR`wcg3;_S?I-RUZBed2Hw`A|( z*U~sQOWkUsdOHP9V+m{TJq!-JwpgS%pC9$Zu^0{A+ggMz=r&ni(td^`MMC{Yv-d~@ z=|dLOMm}WqXvc@FI*oqGSC=($m?JeZroI`C>w93gYcPi5c3CNGjI4mVH9c4ZXh)r> z;D#h9hzzxaJ>mrS&|$HBs1C60Y2Tk};_2xO&Eca~ZO1}Kk;NI@(tc+Z*nhU`X>gCG z&v$YOvwU7-$0?JrFRnm4=J8t0n6{*MD#fo>C3HzwqQ%bDnmQHUqoaA6;g}M^Hp7v- z<*yID_a!s@ptOmXTMjh*EFY~)8C=Cj$Nb2^)`SA6>Aw!8Sz z&yW1n7e8h}7)R4bQRu`U7Z@UK_fTo7(snirP;VY5?XK~bqv=U0AQlF#?Qubd89Wvr z*mq-Z{#br&q9Nqe;KMillnl+}lR19Tjh6;z<&-cVs3PCtln{?HmN912L*l{N5{aiO zCE_8hMIYE8OIpfrjOR#s>7-SOU(g93`Xl$Bc{&{VWParS#t)09mJ0Q}zwQn`rKJ;4 z_{un3m$Cba`5}OjfX<6@N+7g0&83_G$tCN+#?`*Qqc~` zm|iLWEPZUl3mB<2iytwr6L-Hfi-#q-@}uEBCh_oQNfRt(o#aKiQARf1)rvxV#COqf zsiU#!z{1{jE>5|UHD!#B34WWz0b6Ha4z~XcdAC-zk8b=5GQ>YrFJW25*BTXzopS7; zgbhL;LGY(p~nWFbtrp|C7gZobX z`m|+V4hqABX$9ogG~R{iR>)vO*@!I; zhef`5Dqmw|Rk`{<(dA$T1xs=LDZk!}0c8M9xwmFsH?tGyHUk+}Vdn%$Fgu z>>%7QvO(gWbgm6W1_X^Nh=)QeoDZY;CZ05S(kJ+auUVBjBoYlg>Tcwju5-@Z(IKga zgTiz2HG=!3P!W}QFdWrT-89mufA7G(Nzr+#RzDF)pW927pO1A*?E5cnT%jW9^2M>OtW{PJU5Se_aP&3FQAeUs)D8tcrJehk35>F^}Vv z9uBt(l+yfOH3fr~m`T~HaA=uX&Pjokp9)mSBmCO*y>_(3gWy!;SDV1(;-8jJ4ebFwN@3s)4A4xum=LO zK61>wsD0iXd5ZlhvtWA=wt5GU^tZNks;6`Bl3&t*q7 zpV^DMuSpeP$uz=Lh~n%7sL3)_O9g;djyi~xjNbr4izMtixkC|>EZhvM2qa=P<5SNy z8TW;@Q0Ft24>hNCWViCQaI;`HO7Vgci_HUuwL_KqQ<-daNO7ZKcl)`!*X~4M@*V(Jhl8b*Cq`FGTy?oRK;lMC#eLAb zu0%l~<&SNPQi;TUVV|QB#86ueTVh@qCU9s|pFmEPaODT$9?M{!^aj+I5kMOnPh<@+ zD^9I{J{Zi-8vK65Ax_5@bs}ESt$V%Rjn(q#b!z$2bdO+k5~H;cHTrE^a?rHQ(EVCc zg+@v0USjXf*#t{YSrw5YAUz;mT5x?04*OV%Fh1dN6S0i%5MDlw%8M>ECz z8plJ-@JSabL+wzZ!ZmvOslXPYMQtjqxNDqF-H$3q|&X1|(q_#<&ZUnNdZ9P?|C zDr$|fm4ZfKPMqu5OZML@mD$P(7HMCRSu5Z++wkoO?>`{Q_QwxL@Jn-IbuiL zAypMeW}`w(#4>P%4FuKR^Tydn=>xd)rG!=QS-m;5O&kkPUQH0C%1d-U7Gd0i4u>Pk#Xfyb z&-dXmvS;*;vd_{kJRoG5s^#jEa)hsg;mahA(4br*MVzx5N~uWe(LCoWzcSrOe7nTb z{sYSgS5^-Np6`Bo<$)_dOn&Q!RhzyRyJ0ZU#{V#ZYg)6dhiUb8jArqS;*3Y%aRaFg ze&6g&Q{0DT11uyh!uYboVguq&WP^>X5@F!BZbb_mqG+dPpjUyDA2xkuYsjM`2-ByyRP0`oAag-J=ZRa@Z@r%9(tsaX!$N z4g$3Lp-SBy^mi@BN-<7*#0Fwc?tLSQ?J6E4XGOA*VUQMh4a~No*pQqung}O*0cFQ@ z7(9q1GYvMTAyV++Jp`{03xUA(u!de|jtHMRb0noO4<4cOCsKuCiXI^himi)aB#0LM zv%akeT~4L)=k#Fhzs zFbElm98d$luyqkO76Xwqmpa-SqiE7%_7D?d#0|xsHHg#G6;oUMoU7Ggujm?cXQXSZ zcBj(AuBnzCU7MyuhpcP5(wU27mjsXAwQ0y?v}>%2?(AAmlKQnOBm6&`Xm!s_ems4q zI!NM;w3b;wa=5EZ@CaW_N8Q>!d;FsclQqtU{({oMKe2$$LueLER>-|IOx*?ETF26d z?rsL&nihi*h=EOwk|cO7?Jc$t-&&EuFNqgOT`k*+OoS|Y#`v|s$>-*h<7B_TC+jbt zg8lMISq8Pyg#*X?y{Q7!2YFG!*C%pgGX$Q?8p|i&m%uZDLsiP%3TMT_jotKw5u18M z!3X(?r=z`Jm*po`@i!)9CF+>2^LEUfU9O|n&?|7FK=-H9GkKI;8?gQ5XulbY@ zWciMi_=q&YrWP5(M3p__60)UL-SIBwjo^8eI3i2J)G@Rf4m>-C%W{srMR34NX;i;t`f#jNSA3FLa(=wY9 zrS^!>u+pngXSgwu1_Y&&6(W>D!@mSk4vAFQ2lM2sbx;II=o?h*$Y3#5Xn&(jlTjqS z3yCFs5?8y#UJhK_I4TC87uA6%5*@q{FV{8(Ux=4P$p31*gpW1{U$h(6!-x+~;sFWG zx=k*kXpl+VFrF67+wv0gC0>@l+QxZr?|<&3Gwj+FSYIb;5lA)wO$`=^;v*!)jEhre zQK&j9frD2r_7}JpbHV(Sr$uyT0YB1V(3F{l__$1)W)FF#6A}y3Li)pIPQWce<~b0C zZ*B0R^{>wtW%iP(!LR9=MK2dpl`egXTk9U{2Hd|~-UB%bCM#}n831`kP)mb{S4ZvnQ0d=c5sEgyahFXpqat>VLKYLml)t3?aZPL)Zm|G(m@N1~`t)6zxyW9LwR z%p8(kF3d8A%1h=@yexlh4ppwu-L8O!AXAGva}YQ^datMU#-OX zYa}sgxz4x|3*cv5g6(|D5Fk%AykEGOgixzX&X%>oQF}T^O3_WCwjNj>gH5ji$!Rt9 zz$)^ryaBJ}d;IhFdY5I3DVjuNEQ~=73xi)W!stnA>m|QRz+!-)M%gi(;--8?@i4d; zi_6^IQEaU$cH7`rtQdi{Wf}Uc9oMlwMhMn8U}UJYpIg!)QHGe|oPdQH&T}tjxQAac zL2}YiS-#geqlXI2gFvlS<~XzNEo<3_MyXMdel)2_eJO|s&F`iS>2p*9!(|n*1sm!` z2B~#Jm}*XT{voH_2QoaM1;y&u)g$Le^HxdFnWUxOW&DWqA_sOtF3zCP7X|`=#bedWPh)z0GyX3Ju14p^_FD=+OxtbJx%3wX(7YHLh>L zAnH@TPirhf3_;iONpglf?zH=#3G=`Hv!67Vnx+=-%ddBSz{ap$AHWFrsmU%FDqBNp z^`SrT*MR(b5pSS>H{LYUwTTQk`MI)gax)%-Ii(%2Rw`YiM^V^kQ4bkl%ROqgK!1|FW9;D&7as18>{+4lz zd7z6LfDuQ3@bYlZEh&8xF=ZNF>!ApeY+@0Worpu5Z|dxwC2_KsLQ|axOlPMs(rP$sxp9+gTFIu6@0%=zA3d_EwwWy+Oo$EVz$0&{8~PY)#{zxGcKcgzuZnG zzT7UBmbya;l%8%p9!cHGm8LC7a5cdZ8P`IJMwn!lRjtLNgdHJZCaR9kB^7O!F!bnp zf|4$@TW(waVw%xDJgO-*RiES1OqtYE z^;XxcRki4oSuKJuX&*<`;#8bJts1*YxZc>^qLb6GgAlt~gj7dbT&h}hTCeqyjeJPK zNKvgJMIrK}Xzl8wD_X-A(XiAa3fD-Bq>nZY!xbz;YV6{jLhn>0DXHh`d_2N#h));5 zQJ^=Yex)$XXrlXw+ymu#K~li=sGaNyU-Sz8WXXjBi~~ z%DSYz_)4eTMC-(SoTJuBI%=I@4Js~{(XtveBfpi9o;+Zsiuqv#V4J*-nQqwyNS0&m zynmTqs)Q1gTWXUD15i+)<=KKE8X@z<^>i}jP_^K+XfuTZqg+_4ZUuMXj zbDBlNep{n*{TPwMH9CX8DobG2<}`OTZU;7BHSZ4mz<|{360NJp{a)|x2E8=RKJjBW zA?${@k)5_D3T#LpC2*)16k%XnzjgZTAzq;L6@$TlXDpW+d(!gr0(<{L2rQDA?2)&i zki@*K&JFt~LCk73FQUn{ozxc%Ig6#Fh-~+^}GYVX`PUmq5bqFYUD%8LyMHmNq zhpl#Rf|4avqA{v9W5=i|J^*ySrb8_ij&=MQa=E7KdP=mXzhpfUK68p81>ukvh(&nu zQuk;VA^9^n;B?QtZ4JvwCWS`tym@?{DJwOb+fw_$1MbhB4aukO|3{zwr@#N*fA=q6 zJo8N6(xcX=?*CuD{`3FjU;OTGeCxsL(HDm`I|S4;0)g&^g03XSYF{CpJBX1fD$MOXv&(GlX<_O>v!l{BcT?b+XqVc4HSoaQbSu(Ea#DdU|jW+@9HJHVWz#rbK z;rB-2ev+-y34>p>^RA6q3oMGF8De~t+T%=g;}6;Jm5F9}aMB+{*4B)*@d=NA_Gz0Y091Lm{me(O=c{W+ zH;SLOO{d5lpnK&3BEQxgk~fM*Bk=d5_XG4gO_Mmp3azhGsNZ`oNd@?Iz^))20Xk2w z2DYBR)zmgXP*$EZ`Hx~m9BvCS9N`1wemkZd2sc0NaU(+3H z5IqUx`_Wl!uS)Oq^*eymXNdQofAJqs=TXP4VjTqJFMR2nZ*qx5(t=s7F^QuQKmeW8 zDvu@dtdCKC%OOSMEic2)(T$B6a;k1IE~sSn#_Wuv!*ug3Kn(+0VE*iXP)hGqXlf6> z@ClW;lLl=mcxd)LkcuLQH6(5hhNP-N8S82_u)xHW)bUcWWO{QjoOstTuqOL1VYv5Q z!@x@LZWz|lm4=v1OZ-%r92tvCjom;zcyoh66=R^dEfI$aq$v9inVBE}Y;1}#tE5Zm zK};bDCG_T*CMw8)vWlZ(y_Y&^=S-I>Fr@&IpsgIs;LGv{m}oOw9qW;lUd0((X+{-I zm5oc2l3)cfR0%gLX!Z@U&@y9MITlJRC~E^Bg955>97~<#{4n`PSxP&Zcf|tCv?&C+ZPq_+u(#@vmp`Ac#{yY|1k-B!DYcdVgNqunC4yxpW1l~Ni zATCN;?A8_wxUA-@KP=lSYDn2M``a;4fxs97MHG6Zx@gqvLhEC8+M{7L@e?*x;qsyy z@@#t5d^W(#4FCfcN;n7w390a31J8fsw`X}nUZ{A7e;M{o&% zkWqH?VakuV&V>k@k*sRu%>$n|bd7YqGp$Cz?Y%Mc9lrbCxWrIYDJ=iWHE1 z)Pp>=2|8Wpkxi}5Y-9%jt_pqvj9dYMTgrG zYwvInpvvz^-diS943~%b z;22c^g(%;^v+5aAp7tR$s?%VQG*_Q>6}8j5(6v!)p4nT9LPn_>890S+^Km@tKdDq=p;L|H?w#VxCW2)nY1e4(s1-vh??C}?k<=*Nl&6>upV2Ib_5DU`LM zrYI!AzbNuWDCLRMhn5mxerk8|yoJkbg?$X-5(Kc7E4W$f6D7qHK&q6rk<{~jWL=)) z0Z;c4ShK~lf|RKkl*3a+uEn4nl?7ZcyFl56QB3Z4j0iD}M&_FZtPjRV9laLhPa8&p zEFQt-iQ_?4_dav=HR~k^Bbs$D%Q<^=(7CgJ?VhBY_5otSk)&8xIH@ore8Dz#xmQTi zM6__e2I*?|o-g-+SVriU(6EP7rFDRGhv+^+j8?!C!9~1UP&g{D^mJ9Xd%!IB3R|4p z2CXcl@bBIWfav{wWSRKO6()5{TO<0L2-W%RO{C)tGjWNsGaBQqa9}g%y~3Cn9hT2# z0Ag#4X!Lx)s@&cVY==1u|dg~)qq_K*$s-g~@82K*c{|5EV5(=si&F#?sZwd-X_1!{26=R^#DRkG+y>|`O z@y4&hSE_O1#-^l8_4+v7H&XGn$4Qm$9Hg7Xab$iwaD0=Mpx}%_(WjG z3>lEicP+-sq(fz?aSIlMwr`GMAZ*@k52L)=LCk+KX~{sf)a~N;IK<6XRgAk?65BZ< zD2=j`$Y#BOhffoz*N=*^itG27NGitXNaWZF*4v_+}D zY10;6>41`T00%x{GSo}eDG`3hx0Mg#|I@MtQU*={43 zW_D$Ys|_Ns*~Dzbfj-iabo&Dl&yJ(}T13Wix(uN(OctT}y~{fk;Qxomrk*Rl$ESvI%V~(uP zaT(9(c&@~oxfjNO3uH-U5;Fx$lla7#z(0Ahd%eHbjwbTrJ28>Ze|pqJert@0%*-5b z0!I^>**^ZgnaIW*6tpTIjO6ANMygFDJV?^m^h}e%4Hm4e30KfTYZ|ZQ!Ey5ef-OyL z88gxT*8cI*#Nu_>`H?B8P6U^iIl{nE@2 z@HqhP=SxnsDb4=SX4jQOTDc(}H-G{rSGL`Z7YS>PNU(Kcqh1?bk+~OZQx$IQf3qJ6 za;YRpbf9Y*`2lYLgkYBakRaXC9}=W2{ie;_NRTlU&U`i&-$|f>X;~(KM3Nqs=#ySa z&)vUcW!=)BlIrBPwN$RRObm*lR6~ysF;a;br_O?Nnh~3Ik`yi^t%YU;wn$MNmYuSv&CHqNUl|jAknZqG`Vg;r6%T-P-15 z?oTnrt-Pm?qNws;`Fo7596X`$K*Y2{@)9KP{IO zjciUMaJ=yaOW#98&}PLxr8crYD&9$RuAFS=tLL$3SIuXV2cE+L=_+l`2q;(5FeURW zWMP#}{8>2k;pN=6__g>hXqI3)!YgEbGGnqCoj`FZ+BDFq;e&NTlvY@w}B}wlE=$qw^i0 zx>4M{rFrXSTrS99OUgKMV?-{;F{5 z#JX&BEEwEGpiz5adtmko#~LjjA=FkO?0DrLlXpQFuwqc)iaD17ouO8ElCD5;lzr8ll>J=vI-~5ntQPG5*ahNNtVHZ`PMXFrXUkG ziEE1(WFqR3$3@CdCLE~g23g@9sO5aWSSOK5l-v)sv+s3HL51^!A^Z?3FwJ1GHs^%u))l8K6I8oS57pdT&N|2*njLzoFUXX$0 zVT#BLq}4F@81?D7yh2SIRq1i^Ps=r=)RUYGK|eu{d6^^!2|+iCDLqLvGxQ{(_D!kw z-Y-wEp4TaDxtEhC$^%rrVK|9Ij&6hF75Ro-PBIZTi~dLReO~2 zfis#MIjP6ueENqF!4hrxgz9l2Ue z(cN>2U|!1X=Rta4@IDW`C;jp{E(!0`Oyb{5fc~X#{bOP-Ls9}yc%C++|IRi*0nz6i zqVsB|=x zKuc`vX%#`i6=cI7wx>x7=4?C|8c6?1zh^AyEBB9A4L!z{H~#3jCLh1MxukE8rH|g- zBqs{9n}1NJ4DZ7xne8GrgEy1|Cz_+Y^51;*vqEEI zE|za8cz%s}su-^njHfS9g*_;kedxBqqHRuS zCKQ2=_fll+{yYzr|9{x~68I{MbMJZI^Pcl21TY99MYJaoty=X`un5(*98oJ=tyb)E zzuSHq$w7i4p-HIP+t#p(fPm~E$||6u0EICVDsRij~On%QJ8(l1ci#&6X_ixp+PZ66Ni=1oIyW*9@(f$ z_i{veX@sjleK89~h0BrCeN-wR%TpvX#mk(K7iK-NNO`F|zn3-XUbZMNt-?|sO`KA; z@o;LRiPOp!Hy{Lgh$ha|Xj?9u0qo#U;q6`BHqq2$k&V}3*&;yTCD02Lzd8|_m?=%3 zTR&;yV|6m?%7h&%vVn*umTL>VK!v^I(4F|4Bz~KoWycQvh>uEghheGQ(G%BK{@jz zh2kIm?ff&+`KP4vvn#c_uz$p^8uX$!S?G)Hgue!jal}OeI*5foOjBtU6`PF5#H<+h zpLi0l*3%S2MbGiPDnfI^kL=gu`b#Dw2n38(Jt9vNkOv{Q~uf|`zfh#*@>#q_uE@a8 zDO7CA!&dfK(6 zyiCXY<}gbMBd%iVAxjOj$9&Wha-7|(H_Bd4fN=DU7%RQgR2;)6*tlDG%@ZwL92U?+ z@4*kYj%Ta%sAaGm%w_9@afS;{*p+IHz?fOg#*71IlB{^G5jmK__Aoq!tAgdW&j^2- zAWW=r%D1Un*<1`c5|i^FSVCYtKO3G~=MOpZB3|{l>S5`e!@aJUR8q@gIZP5v_2>f+ ztg}oL2UIwg45u97FezD>wGCjj^imr433BNSV~h-}T4dviXBnV;uUYO>y^xmxXW?Wb zZViZYhS9kMS(En@U8o?$wtBg2irJ%9b~BX_uHad5YiKCSS^#U;1*_T&&$ZOjor;p{ zcq+>9iXE~vRrYQR_Z!HLwSHoU zdU}QLrrA<;yg1?D+?zTkVhJH^{6+AGdC-f!H&boozaiW5IId_oTQB~-Z+$tH+W^p_ zgULZS;Xl5diVJ3OcTBFsb{==y%9m4llPuCsUw9@SeH=P}MCR~zOaa7^RXFLH2VR7W zo`T1Z(dS*9Bj1!mE_>U#jl5izOT2R~MlKrz1B`=^M}&=&0tg#H!Aide+Zb`xnES># zHqwBbN&edzwwYnfM)T5%#yZ1|AC@yrP#f`u%ev!@0|Znm&yN7^BKE@bb3Y@L`|1C5 zx!)4XJ)W^ez4&J;`!k{3pZ=%I{gg;h?2g0j8c6;SIVbT?Bl!)qjw{Ci*v{kWI*p*`;)^2q*FXLZPME& zm()0}U&_dpF=McZ5m1wOefdz(r3?X2IyB%fZWFu=m|*e;7me3XV9qBej$h0U^6_Uo>JePAF(#LemS2kt39X|)2 zT|?epuCkTG3~=^TWrZ(M%Lbi`w>f@Rd@h{^dO$K%R^;FqSrIBLctwR-!P}S2icndR zmKajYtYF|=Qvz77zyr9jUHQ8b0NAi&(@TK7)=s7h)svP?08)jq@OAO)5C`T=izSjc zK}cgp2^_H>z-DpBHEeO2EFYni!jAh0`CQ=s2N$-*RI#wLhs&Af%MnE!G78C{lzk^t=y8-qzSlCV6ZuQkQS=dhkI-BAc7F;Q3D=K_g=ZG#RF|&hg#ScmzxDEu;8oqH6kPM z1$!qBtJ>O19>JEyD%*$BKcZT*aYG{^?;pkPtl-5m@SzvJ1vA$2SuyX$GNgK(g*~vS zNW6j>Ys&Fj{?#UR)e{#vC<)lt#-<`%Uvh!A#AWO`+4$pbbX+tHos0D!Um4sYi`!w< zwPsn@@a7Wq>~VbEfyEH8U*NOjD}$>JxNW)|_gk@9&sH5uZRrmkIdV*Yam1e?ch6o( zo7$LZcNk>t+y=OE9vOGEm|nNcE(xUOj$SOHqfS6&qTFZm78?|77Y1l7_LV8n}uh?sIZtkj~m;4KO~!=#qxadHw5jH;KN z;7K!Ak$I71uKG`zH<0s$4|ICUU$$k8Ou+*f(IG z0d&5^beOTUmRJrmRKdgy?ms}n`$h1G7j))qsWanLou@F@qr#j`h514>IdcC2&aqHu zW<8XrEdcgU2{yX>TUGtTiv;od`ehoNdY0Sx(3oFsXWtkp$FkN{b`!2Ka~Em@0E%6Q zum+M9_)b*VU7&48>-DCXpb3g&OLlMIeT_XZg3}N3^(y%)nBF4XkbAe6vp~Rt&{4zG zc3|39&>n}5ZhoV6WF|w$%qi$Oy{0}B4fb3Fjn`F?s2=V1^n?O-|M*|G|%34sCJ-^NbHA z2l#Sw8%SVa-RgedCaK_3z-h|^uIp0T`u_*<6lw=!-od29Tmtt3+Kk=M+{89u5Z3?@A z<>~whQbufUfuGKNI5QBiA-M<}XtW_3%0q4=SuycCS=+H=#{3L7f=pZN)t-wyt6Spzq%GH zX(;iWAG{+*uhyJKSCJ@}wdOP)K03I16qlMW)|;xR#3K4c4bjV8GP!)G6MZK-%0{6$ zZPaWW0rOKP(;&<7R+OVm!*RsxrQtBsa2zLY?ZjcE;am@FyN?5IeQ*NUBNmkKpKl$G zwxNpLs%nyVWlJLm`N%-SarPH7u%sWF2*WffH!#H)ts z8DyS4=xYFZLnwoljDCZRz7iQM|K?m6WF(WZ_!+FIp23RL49W(%sjLe+gA3?qfuBJ< zzUpNV@{aq^1?njJ_6D+V52|x6`emi%$x7XqZ4;Gsv<^_oyyqh7QJb&VE4QA~=CSjG zYCJZGprztVbV^2B6GJDl;IB|f5duaupx9q2t3Ngmq5Eo}yRjzdzR*X(A35WAE&`($ zM9X(1$PVYaXc6QLOkH)&9a@$Lkc%cvn`{H9M4=y=5J4zB1|@Y(Ocpdi(hg3cxwQ7D4iTy)bF{6jiECi^<^^& zZR-plPvawkC@+BxB~ZbJ^jI2!CENPkxO&3;wKunuPpAjs5J+74-|$v18}^q%C*l*F zQh|dsz^buSlM*M&KcdN1rqN%#@8~wMeqGxZh-}~HJ_rF7GqJkIIXAKR>{n3+e)}c7 zQX2w~4tfGR=;>D6inDTHJQt5evrRi3{Wnv9mYz`bg?TuC@f_t4{^H@uf!f?po2g!rzZ}1b@<^8ij?=t?=7jA#iMJhA4>6 zRNs)Zk(>F<;V(ziv{FUFWjUAU~?7dh@du_E3`76 zcGH;J4K^z^4)mLxIO_%e>d26&A?31Ureo(4;7?b;7HBM~Dpt<7s93*45ID4m{7v|KHLM2^M3oHUTNSL%U_0!^^!Msl zQjV(WSCG0Ix_I8F*Do`4-3OFyXzOZ&j?W0uMGpDsMqMsa1mWs#TCeXpLc|O6SX0 zs=R#Zu_wEHWN2^Su1fL! zLk`bVtA1lP1dS8AV}%4nx->;&hN+Z(4$ek8-o!~Wf8(`WY2Y6Faq?YtJYS1sDNRJS zux@y2E(2pvSI)}CGoZauX|qw{Y>Dmbgwn$}{>Kf)c%@2dMz!=TTn0E1;_tcJ5udft z1VcyTRGiXnaHbYR@HE|q2WwS0j00D{bJ!_W9G-Gj>GU<7tdORI(DY;DzNQm|b)CS& z8A{=ieEBd*g~zemFlk|hhi5KB3J>ByQ;0c#N@IT@(-6JtCY+F5)R!p8kgas1%EAnw$Li95AnYJeZy z7R2{qaE4d+$S99nWwC0hVAJDy_J~ha( z_~V~Oe^j1n=2>MN!sa-FbDpw5c?ul|5z2+AE!R1jlWO_EO}5^B-OQz))OBT6z%8?a zDQU1lPnT!>p@rxys07va5`@U*;aZL^cxC`A@{}v^d*go`8-`!imlBC1YRdx@U1q2@ ze;jBAK`?OygSN_IZxzS72c-rFmjRWpAI{G*HNS~!qi+OwG;r(YyLAr5!+RuTJb?HP z^@TeD+8{>g37{3w7T6ZbSQXBk8-}{7+ks!=c^>F}HvS@L>a5_w{4$B&RWb*e3K z=C4w<^xr*#tg@wX@WbbWvi^#f#Ju3}%X4ng?+`4f>}`Dv4SK5_z+viKdMHvoiVpK7VchHATCyDqv5~H)Y z@8l}9S2|vc`%-Ae5&ExV0eMHikpC;n9i#Y-6c z5aQ}_GnoZ7LY9%}^ZT^cS%^n49%k>MI(|Db=W%9Kjmyb{sF{}7KPG;46uidx)#7HN z_uqo}880v>V_gB+nhus z$4V@>azvz!-Nrl5iF7C_LKBmHl-fS35StxzTxi>=!15{ZtgNi-1bm^~c*?Lax90TW zG>J^ncjW%7$KC$BguUT!Y=ebpd+yxhkH;;X8RG};9aCr5c%3fN`JIAV^PPfv&iXFN zQp=S%ffq^~>bI9TTUyJ+0a%>B3$fLl2e4J8uto6Xkj`o(2rVn?GL)|0;wP#&3EqV# zB(dVe*WXq}(M%yQbyCS^WRvJGil904zE$&vr|sAo;O-&M9^d{ViqE5((nTSj1>U#M z!$#gp%=GN>J;VFDhy4x%ch!uqCz<<-M7`?0r4((-L|&?RJFh(Apw`um!vJ z2w%#JOJ=p~oc$$byd^YtY?vZWE$yb#`G7p+is~R=H$qtQ!6aEvk*Ge59FEv$b1fik zMkVgFXNm74-nZO{!&_WoIiauih410sw`OQXhDy&8-;2C&&A^v<630DDd>`<>H3RA> zY)3;WQ0rS(Vxae}IWVIQjtb8f-*dcg%|RstDy(OV@7>98*i|;Mow+@4MWm$=SUeV+GOqe5UK)r~A9S6DIXoouu zETsY2Z4xV3q=^qmv*idOS6&#$wkk&?Mo}gbc&H9LaHXc*7;T5why~LB7ui1BcvPs@Z3zum|!Ugg$}n2Q@q9BSN7ERVZNR z{BNQMr3;A}lENO;lz_dQ?Bg|ic?x?_i39fIR7A#6un;IMtY<} zf=Guml&9FVAkraTC?QM{yT1P;X1B4GmIPf#tw==@)-N$P#YP3AE&RFo=3ElT<(i@ts!H_<4J0u^eGWEz?J~7J*s3d~Z)hA|}xJE`> zYPUPoK~(4`3A75dt%FZ&^WdkvH(X8R@apO*Dh<$65@%Fw_3*hxee%lS8S0a}?R%?F z=qricDmJeA%~79N_Dc*@pIoLspkm`?(~H#S_wYGfeKy9Yo=my~pZ!!Cpz|cER21Am zvp{`bhR-4D^ZWQbtfGkH6I~ZGl!MRF>N6Lg$5j-Ub5@hjs$=o0)(M9^w;F<}VXH&i(+ zBY15v@6f#vTTB{Yt7Jng3pT#NbLe>0 zyauXLHdq{+<1+;uJV=jiiKy$b$;<$hsG&^qejRSA8deVspSr=mt&!WGpKT=0NYaT z?qmGlSW4WHuv^Wyld0T5t=L8uFq*@%#-3HE#AoY9UMoEHO!Pgqt#1 zTED}L;TjquFdXMAv%6v9eL>B@iObfwI->#-36Z@(mIlruG?gQ7Zo>CP59>T~OQaM@ z$|2@0DS&v=fC4DxwzDUIwYi)@0d!IX5PF~j@*gaLU;jN4h}wZe7yqwG;KF}k#Xa+P zz{WMUfwJ=Uv;JShZj6m(L~iBR4K-Gx|MONaf%?a%pRZ!=l>0y$v7M4%aeSfG!d@#%l-Jx3JfW@vwtx(4vWFRfCrOu__h_r@WJi`|TJS?p$JLr&=|5 z`>r0?hsk)-Jg{Z+mS(f2**4}JJYcHOV>@1dfF6NQ3$X*^ge#8%$qoz;H*v#F^$rYN zssocNNodyCuxW0t>!&nqSPw$ebPpPNoEqUw5_&>>-~z$c1TTN@`}feSG_HjZEovRDFqU%_ zu691YutJNtxJdv&ad}@ZtUGe0AJaWtzr}m8Sm=x^W}MREqI#`(hFnx{0$WsdD(HSI zAg?TBQMvIL=U@FaG=PmPmfC#s9)kto%jbRKwY6F^UbX^!|0ny1YzXk?PJ>WG;Id>2 z;gcmJeOig{?1zPO9zPsbW5la4{lBq2Snz+oJ-DZOd+rM=kXtF>fnGyGwcGb1zu$K?z~lRb8NQ-C(LfrK=FhLXoL6#pci324W}Hv zn?tg58b;cv>T7qwO@ioAIHQ1}Uzc2g3$NMB$a9^%^O_wFBIdQ%`uRTGe4X3q><4sm zx@dMOUW#45HLTd1D4!8L)pZd(oISw*@g6VdFk}dL`zx?-bhb`LX05D7-)nqH?K*WY zXmaUg-;c+?)^Df$sqf;DNrUC*xe8uraRkR6IQC4mOOAQgHS|`Ys%fV(zHPJww zu)^;udq(Z(;~AdnJTsUTKqbe}7&kA-O{vhvs5qm2lWMcx;3^OBpz*j>ZZBnavfp5A zShj;gn~>XIBAl?4PTpJqHsQx(YS0he9NA^PNT{6wdQcYOPJKB$K!%iA1L$4jtbq0L4^3!gWjp~dc4;2|4A6f0*cG9^A}CSc}d8Z>Ho!fu#caM(*08S@^;Z3#_1egcn^8zv8N&OQ$jJJ2*Wy1V<0Z+`?uBKgqElXJ zS^UA`{DNeuC@3w=E6R_TmgRMPSj4Zm{zskS`N@aG75UmH%8iVNoZmSxrpm(*AvOF2sd%j#+I2vkuF*_>N{&G{%j9pU2-h{`o)RSkGf( zb;UVxS-~a|e}1R9=W#glAC_~!OTLbOC$1sbXDdUkk$4!*jAS+JSX_isD~oq4E+{HX z0)CD13WV@r@uSW2@9&!IT3qtj^<|Hii7sRcSh0a1l6BD|!V3exrDY{~;6Zl2j$~a4 zc`4~sSo}!529AP!1XNsDN(q?gWL*T|c?hE9l{X|s3dcOmIZL|-3yV8GTq;V73lV6% z6cPfd@VK@)S(kZnXhxOR5YH*_C`--Zc?j_gjb>f?P)T05&T-A7B|F426MMpIL{(aP z&~Auk)wWd zOq_2s#m%boU`cUa{&n3t=anWY2D4lwqb#qipkutOB$@P5x75vQ@GzQ-uGL(&xmg$H zKUS32HO)9Aln%)<1`@yOihQ&>`ByWNZ``a4=$0TJUKCGdWHn^#QS^@3QOk(I6NkOM#M>oT$~P(l}C-II}3&lA3o^)ZCtwWL9~-(+N6 z2xeWe;!--9h9Q|*^;N|vC}VZ-ft{S0)ljy?@w`IRnY^;%5}8JNdOb5M($Lc~fRdgVBJKD!-2WQwe~qh^g?f>gP%EpF_2d7Ke~IH+ zS>^qL&hr0{T$x-L1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@ zU=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm z0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6 zAYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~ z3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+ zz#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB z1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VB zLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0} z7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwt zfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M z2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rL zgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{ zFbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO z0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj z5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg z1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm0tNwtfI+|@ zU=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6AYc$M2p9wm z0tNwtfI+|@U=T0}7z7Lg1_6VBLBJqj5HJWB1PlTO0fT@+z#w1{FbEg~3<3rLgMdN6 zAYc$M2p9wm0tNwtfI+|@U=T0}7z7Lg1_6VBLBJsJ_aHE5u;msO6g^x}^pKsgy_fYy zR5%yZeXw~Vamy|Dw=4ZkUSUDLoh^j3$%gH3k{z3Sw!+Ew`0mYntZiOtnQ-dCrbDtU zQCL{qF|Vw+L^v0^2#ZF+KCY**~yER!_R#Nv4BunC6als?x~DL& zWAfKU1;s_exvYU7MRERP9SXYY^nJf!ihWs-m$>hvZE;aqUdJ-+Bj-ZTNBiP}BF{Fr zzGvI6v@owIUo&5h6l*|kNr|`V#iY#swq$mq7^yZmLzyOkPS|A8Y8w|I1FDz`AFPs~Im$tgEB(JEnQ*lYxUv)3& z_^@z(i~>n_5>89x?XJ9sWnvk?jT8|TCQ4s8t&jxItPC58F7 zmlStpFoSF)R92F9`IZCWxxX-3^iWx6h*??bJ;{>0l4Z$~8-ydAr&$SAcwQzCIVdVw zO#y$0;=(^AOCar~!ubgRYFEnqCLTeWg>w^1;gtpPC@ zY9l!*5+|IIHbV2V=H>UN-+Qn*Gj%_J)={+0>z3ECpbSC&3}T+#B^^lL`E{T1zuh*e8CjXtw?}pjk3rq zyoYUtaBd6P%W$>*?IAEEKU#0uCjTPjAU${vcX$y)faP%kTS|)a^6%-K zSDL*4F4SUOvh5m$Qd&@i=JYp7bOEx6+K0+7QS?yv!m#7NdLEI0JJUSg>3M`(HIH|p z)sWaEx^*jj?Dpc4ju7}?dOiZn`-_!(C7~Upqp%c? zzsddtQ!Ko&$A)s(q^=cYWV9S_R6|xJ01a(Dv)Fe zy$k14R$tFbv%N0MN%o!LdN#^Nql?sfp?$z6#;aDS5JeD+f73AHQEGnfM@Nbs{PEr;am4^F0Cj^(~^nm9C zU#i$|&Fk6?DwA;XJSX@{b9yi&%vuh7Zyh~1My6_k@0QPc#TE{+{h}m~CDQ@59kP=2 zT;MC!rIS|}?MiiP{}ANE3q@OvrC@dFR#;HxHKxZRXkqUwd8|WWGTF_u>nv8a(lGk_W;$;Mhl`i*nE=iVlE-r+phdnnWH{Gq!D?AmFbQVrmFB`WO zlrm=F6d}nnF^W$(#U9{@@b-d7lleir+0BEeU1^%jAH6KW(=F)zp$9Q43Ji!GcT7UB!@>ke2rUq_(0Xp;>3KUkK2)H-0@+`ns~)eHxtqSdbD4!U{h zi2s^Iv-KCYuR$<62F=;SL3Wf1Cz*F!sLSDSQ`z6MAPQmUP!IIC)Ocrqp(0|o{Uw<}9Rp?rpFi$YUtF2Xqzfyl@)iY%DV*b#6{ z74p{8N-eGXFnqcjieX`1H{tYRX@$z*-sFSb3kvfoFA&J1=^~+>h0~j;h5UIE->xV> z`KWOEQ1-lDMY46HS|FT*7HU-(JC8{?eZzi!S*(izEyoiUag{w8+PQ9>h11VM)1b>= zTRq7_fnaH5?km>z{h50uM%sxzfOZ_fC{@U^&b2Gj4g)Qy5C~1$`e8lA#D|6%p^yey zO*kNgVuvyEpD~1$1G;;Y4;7R`!2p!YsJ`mrZ(C5(v5@#Kw}HNAnb)nfdts78PU$S1 z6*dx)>Iy$^hy2`AT=>{S#YG`M@7O38?I+}_!WPcTP>|XgL9Px3*&+E*SG01WAXkNg z47qwiuBp*k2QHko_V@h+b?91LT-G@hhR*0ZJAQs1FP`<^!sN#`f&&MoE%{YsJgbeW zYQEjV2&968H(4#wzm(+_b@W<<1@w^OAe;%TC-;;jyXBQ6S$R4Y7C)jx1Ar4Ps4TzD zE9r`AS0XD{s{16?b~&`F?sqb4l2kiAH%wZT6_j;X>i-n!6`HyqtyUiq?enajI#FI? zR1-CozWfBGx=mwEk%>vQpHAtP2?-@Y1^0sV!bEtHEBhB&xzO<3S$%{moR{c`cA-Yc zS6GALGf@h~vh4PbMV155mFW)5ZWJavu&8yv@|qqwdlXMVa}3*l^`KK@J0HOO{DIIlCg zQux#)+CrizC6%%#$Aq_cFVg9JgYDOCf66QD&f&h#Ae=>n_r8Lz$-6tD#4xoaoHu2^ ztR-ExYg8#!;Xsr)j0dLD0V!_VIoa`HH3C^&-J@Ts!dXJm_s~|sDt+nBg02OKw!*qB z-Mw9@bW?0--`}dv;-~E1yrPHDZ7gMhq{f0Y+*MHIrGHt?40(@w49hLFG1Wq7+r6X& zt)0j8cJ)wHDm!#5kqZ6_3QuY%(1E3+pPiL8W=ApI0b&2Ma4M}U(t|;c6^qvV?`2U7 zXBCS-H9}-u2lGz#)W9({fYs+KpSz0X@PAG9)V3>?ZhnT=QrJ_|fYeH!4&9O*5Ui`t z!Qx>Inq&R>IrR8^L-hh;EP0R0U^LUl>P(C%m1z?jKLQaJb{)WGHgdYjOmRm|B-DPJ zndZ2aHBB~}X%5@i7~NWu_eh%kUWt21NkoEV3#9e`eN1Fn5rX?2$%2PEqt5J4S4rWP zfc~Rp;{EiXbxY-W{~+BR-T~1qd6+ilOvoWw7NMkRt?riMGK_(L4XyC7tnwj_4xI}+ zmEB!Z@K6C-#}8{roa5j2b8V2 zQh6}vK@YNF{9|`?%ECFplAy)iojR3rnoa6P!Z~RnAllzj49)ZuCnagR7pn~UNer!E z`57DLz$@*tqar&doX;(cwfsKD5AzGgrD0dN{fCK2Ds;->%aDT(MLB#` zEhIIc_I1dE4oNwj2|4JHl*8GOgQsK3Nz8AUJJ~O_EAn*9bA-XO^Hi*I>Zsb%&uR~< zRC-Ov^S#YhHB7ae&=o@+SWgDx@p~cn3R&v3VGI$n^rP!T4b_(mFT%byiXpJ|f_);z z+7Gy2inSl~lbrGJ>Iw$=!Wkf!vAC**{__rLH83=(o_|kqF}R)z&qiyzAxyhBcHw}F z)7Hb-m!qA4iA?xo4VX*|_> z9p*hH1*LLsEO4F>it^s%pNb1HWgfUrv^kZa67<_-p&CZX7$=2d{B7rCvM}&8g=isf z(nik7Ph~J_c$U_>ei8u=5=Vc*0ys=(xhwu4qr!P1Z0%)II4=gFr{n;dD-)^0NzJ-& zX2=1Q9E;x*Pg zpHohqCW<KIhhx5jS9;o^4~KE^ky=XH z@wtd-z`1+2aM88UW1BXzu7u(QBWNW08d{DOO907)tdm>~TB=yM% zf|Z`rlR1eijnXA8iDS4LD;+|~o5}t`S%#9fgiV7++M8sMiA0^OU_V%($YVR>8E`ls>0dIhQn7Tk5sK%6? zDVz`3BE!Bfs*sjCl}SBQ^HmK=OP{Lw+Qw{7S|Et;&f-UsB|4Zh zHM9J>TQ{HOEcJl2Pymz+08P?2=S`^;cj26?F{RScpR_2CR8J}5kW6|`qDKuZl#9@` zMbB?x(G|Q`1RDXWX9m(G1JYc*Yv5vBsayjhD5I2iGEEK#Mj&FT4AsQ&DW*A~BWO%g9aF?}SoJigOXu(i z>Tzli2tO>GBWmOb%jQTb4XI&-M03>n5-H1CIHPMyq;&HIb4>Llq{-#j>Kw>MSS+8Z z9*xK0br0hxaMkkR$(zUZY;`UMq@_}GW!J*|Fne)0-Ter*a`^Kh!kH@9JcC^(7;TYL z4W88KT@KqZ+>%?SB&VLw&<-yJ4tl7r9cBa$dT6g5UZ$?8$5qlQ*mL$OH^+pXFyso7 z*tRo<8yNOeOVYzr>0b^_XNA0K#@D!q2Dz3@+=Wt7T!7)y91VuF#+E#c&E+nl`3yl% zeMmRqEa09B>v)m_P5)-8Q6n2uwU#440Wi3-dMAQ z!(tT(S9#@B4ph7#I-NMoxie>ebhpC4-14(DutsdY^|BxlNZjou1$zBqd0-Fr!2WF( zkRN(zISGrJffKx>IIRp)&(I1AC8(8wE#ua(rq&N4#nBIA9oy@07*MjMw(JG6J_5bL4bPr`vep71=WNc2a0Mkk!_{4e3Hw>x(WB%g#H|~ zYdg6m$8#7M3Rg;m4B{yVO^82s4#tjJ0UDI*j7+GJqo*G^=wEB_ovQH+N#*hbN#%Ol zK~t0xmL6g1xQ3>>Ba~G4VGhPoHTh4CW_T)F5KJoDSc+vZC{NQspK;LSgY>WSw4|i#lar(f z1W7?0VP$f1b?2}qIfXlGLs0_=Z-n!Fjj7T)w1IrA3Qy!@A-0G-o6_?EFGn z=$^Bu5x(f4=S)p?nmXvbl*Ym!QZz=(!HV1ckMLAO=}n@%ALef621^;TWX@ zz3!m3l;8JvC`)1;a#3KxnIfn%a{7${dzzEi)4t`PQBr=9o^X$k-2)PC&sR!Uj*VGt zNt8!_wQ)Jq#V&s-N`PR?tp$F}~eO+Q~Vwz;C6L1R1}QKiT%l4F#)YX@#8p zsW|EUPLOitlZh`V>W-NjY}<06p=h{LRH@Le+cmPf%J3m4p8gPGSR2Fu293>q-HT-O z>o{}kgNo(rP6ZsQt!Mk~TgwG)xyNloPzJYl@7nDyoaMo8VjN^B71>!LySB)#BeLt_ z^jP4Z(~8)LsCv>ZLFsCHPl?zTAn3Vxip2J6PQKQ#BPd#Krh)P+oSgx?w$nYfaCQf| zrIQ!;-XOKo+Kc$TRC_Z&Jdn^#!)Ao^J0?31<7D;7^L4BYnzNkOS# zQ=;0D|9)T%A@{8h1o^z}(Qbvs+#`ILtlk2pF4j_u8;tMogyl-?xVlj|7AJA~bzybFZrGWW7XNcI^5)ug8jxCF)pqhWft# zN4Cha>^i0Q7x;T4^IHoG5trUy;_Z(7iKw)MJ($}Hw0`JsKfEiisGt+~kK04IVy(&~ zuzZ?+H1ak08Oj}DI>^A&Fz$~Cc~S)$xDTfKEHd{uCl5pBO)&Bo!oz>^}^&YDUkLqxxu4|+x_lL<{@}Qe}BGG z>$u&RT#jfa>^)>uyKKoQ>;v4t;H}%MEi(2oMu2euHcCP#y{jPK;u@hpF>yck$)lkx zdknicgxy~*93(q-FDaF){6W^fmm;d)%M|uB@~Y_z*@|0slW^AA4N3d!I~Erfmz2hs z;!3$^ps=8u1{w9N=EP(pF&jK)Ei7QZG8}^hSN7N{o&Z@_#4Y=pYP_j)kD-#tAb<6O zOPLf3v1hX2rbIGIi_!()%38pMD^v;>*$etpF7|W|AJqO@>B6?WRM@LH^pRs3x$WtE zki-GW0nVG;_9zMn=j_lHJuK{l3{+d)g-ILqA`c~la;sB2+{9$n4NT2ziF$#lMOM8F z0@Dq(?fQY~$8|)Lz|^v?a0Ang7l=>{t+GWZl-Bjwz-4+3T(b*B9bq5hUXb=f`H>tvvtot1c>80{Mg|sX4KAYe1)U+Wt4-Et zsmH@oqAR)TgRVyxj(L>^%-M|Rp?U0L{YZ-nN;@;( z=wO6BpM9p+=;Y`7_6s>eQ!*rv9?&7cxJ9cU2~^EDqzlPv^>?J&pLN8Lt15s=i3B;y( zt$NYG)FLY^iZ|32cHs8oI!$T?rj~Wxy29S*xShPJ=jGwX3u-qA_*!LOkRph6AnGAO ztdkuw{^()~t?$~rQHt?~?+H{I-}T3hDG$D}MY~@?QiR6)(*#ZfqtR3VX9t zk8+$Mn8M!b)Tgbl!D?;Le%HCc-!SLd?P5*wY}K5StU-I6dQt$DD(Z0`bm~dXk9*_; zg{97)xV1{}haGW!O>F1yOl{HpydKWmquSq+`SW$Fb~Ox}SBJGl zb*meyTm87YRme;dA{>2v8 z)x>(n2C}9bIBao|=bUnCiPinV(o!_5{em&|)_27R^`l}~gQ%F^psrZdz!kkOii+9ztGuYL*mDv5G>nQZ z`1`0~U2(3VD=IIJiqG)ZzfoQBTq9Qu{a#(MqH$d@>XN!{|H~|Q#ATLv<+A4D;w%5&mkKu*2L*&Imb`?)z{*X4D@z^3)Yu`7No#$VaeedkI`9KW))c=87~ ziK-vmEM{EwQ}O0iEyd?o{Y;c!{d2MYYFAX@_pKkc5g+_8Azr=q3i0)|SBhcR{annv zuBBLZ-A&>v{H^_$TgAKoQdf*?c9VOix#d35!iubCby$DHFT}W(cZid%f8j3vi6u7t zq`i3VruO0p{+8U_UR3_Hz1Z-x_F~P?+q=u#Snh^4me|#%edNts;CX1Xy*Puv%3rh=!|rG=R^QQDjBM9ltZLU<>}cO!4EWd9;-i0UFP^=#wK#NV zdolK|)?)oH+l!uew-(>r-CoSPr?q(MSMA-Ge`UF^|H=|8e$`$)eedmJ`@KIEhwp7E z$~&|ci#j|YKEdzc`&x_5_vMK__x)I``}Koj5B|3Q=4ayMZ#s(Sew!yg`du3__}>y@ zOgV&xz5#jZcxF5dq`QhfY}mhS04SfcO$Y%gBI z-v<1Rxxc+QfWO%fv=>k0-6Z;T1SlPE5>MsdE+*vPB-Z4&7boz$EZJTR>U5KMuTy*R z;zKuyuODhJmUeD0j&{CDJYRr(7d$3DD)_VbvY@>f-=)2H3x5akH{ju$MCHS+#cuqr zD*UO~S=drcEoviH7bV2lVx+M+PfY0cfLPY;L9rDVcI@fa(*3BL<$l)95S?$$}DlV>?U!%`|aXf_x9rXKiwog{}bYVq`esN zDAI?&t&aisKerbZe;#0o6aO*5a^L)mew|kNI^IqVc(Hl++NS1+!L%pqMEb(=3 zy3gnX_x*j~bd2OH5Nq)h)?1Ev=Lzds%Q_;zPs{IT`q6$`KiIn~`hj~B$zBjK>PhQ4 z2)(3-`di~IF?xV?jhI9-eSkI4ip?8n*`n7|R@AL{%Cek~pR$&sf%^0*Yog_h8DuSk zVf-K%tTzW)g_6EA#A+!%dfJ+1 ziPMrkKh%2B5;IBNB}0+CcR<8;Oe>1xL#=EvW|&o9OdW==clfoPUuXH%e>lEo4#(G< z{5rs|Px&=^1iqdhfv+|EdY512Bk}drNPNxV*IWEL%&*V*HExtu-<>uJ@xC_7x=<`0 zWnC&(jj}EiTWEZb#*bVH`Xf#%D&uIE}{FXk0?$Y8toG_&$xF(D*ftPmFMZLAV#W&Ctt0uI-u1o^|o`Zb!?Tj!ijuF!&Q;;ckts_{ob)wI+4LNh{#y}oDtTfcdSY$@&Zk# zMPv?tZ?G1LboG@;6zl7W0pQ=>@V)%Y21 zS%X$vtDVRQnub``v#aT03QZLv@+yC~2y6aoYmF0GOw$GtS;gPlkuCgb5_yk5%SGfP z{_YmmiPhFxC-NmtJA~C^4Sn`o15>s&WDT80(a_2ozs6eUM5fYkSXi$}(_ETRdEQ)O zt#=~JX_|oEguhd)$WHzq5!Qa``XNnm>(e#X1}AcwhUr$M*IN9}u&e=VX*-mrN@0y% zYi)EQ6KPstMP~4KkrkQG-v*JT{26FP*7En}$PWHAjl9pFHNyH>dObnYXe)Adtt`BL z>tGybxx?3?HjM`no7P!#Eq4#ihe=M-a_V|(j^)l;5A!0Dl_27)_11jL?Xv;qAtcX$ zh;&5qH z#)F8tyCQYPz^ceD^j=l?{1|hjqVFe>-Ilxg6EJ;E^2Bj)ZpU3$kuOgpZqe%-xQpFA z9Qx|*fcJDC$8!7k1sMS%DhI$)tRF}^crY2x41wF)(ID@FM9z+J5YG6qPF*xoAg_*h z0K(G~oV}KKW2W;Sy1H4QZslzF*h*3bBEFc7^SF`Gufelh`5K)_szAgSuffTEVh+s1 zNydYSd2?vFlIBe$duVw|TK1U>^9Yg&AY%SphP-<&LtZ!!wkt_Cfrt<1F_1Gf510=! z5=6W_pO$aYypd!#El<)?Jh{MWFD5T=t`l=X+*Pl`c^k<-5OMl-dK|bA=20Y*K*Z|{ zX}Ol>og@coc}7|eego#QB+rA0MQ@OEJEwF(swZ|pIuDOS@?7pldPg;m9#uXbFU>JgFwWXCCKmW zC1hVm%e^EY(xtqDmcuJxo=7qSL@bk*+i5;Ta*~#P-U3{sNZwpZad~h}m9y2!jvVHX5X07xW!qY~9ws>j5*fcvvb@S4Atr1j%ktfD-9)k% zM7*#UmXS&Cq2Ob$R5@;BK@~se?ZaoqK7LNx@3^sjB*Wi#GGZ%9-ag=DxSJ2a|K|rB zjEFGjCsrPIFlHk8jO3{gK_-w?edug+#MqCV?T$G35!las1d;FmF=II5>_GRpnLqK! z2mHwvU!5fX`varzI^x(6(!ozh;rE3R(VdRiCg}%~E*lk%if5jQg8jK?qpmw=eAIF) zKw>>6Ms0V+L>Tvyd;}t%ofO?|#fDCeX1aT)!SV#jHz4Bdi_yBV-mk*p-I=ianB+8w zm^Ulxiq*3a%RYV`;aBhZjBn=r=q^WWSjg{Z-@v!Kc@cb#T?XQ|M^U#%E{FS6l35^PE}S~s%fXmmG3=J?U*GF1CxV4gto5{MY_Npzeo z)*feIBR+-gG?Ldq#Gn&&T6rS+j4k$@Bz^i6>Hbr+U-kvR&yc!3zJ#B_Bx6Cu)UUzd zo;?Heh_fIQLByi+7}B#r(!=Gkx{=SyV@%ZxJz{$>(C85ZU?dwr#K9h9J|pSyo?xEX zQ!;PuN#=b$!S@Nt*C1j@FEUS)bV)BTujwV3%X^b~U~lk^C7B8$-snx{O_F}p8_Zwy zmdr2pA@lq`;Cq{7BZ&C851D)RB^}!r%+vZx=3RZse5fz@`aA*hG)Uy-Ct~OZz8D-s z;jDW)w#N}Yhmvj`2^;tHDDVv$4Kfx)92*VG$fmLMGU*wzZ6S4^7!QsyBvU}d)CpvJ zc_P{7O=395Cc(Pzy? zYs7Yvucyaai|1YdSu_*IbtFS)!FYI93?stfb4j0?M>=di=`2Z?F9hHGH)wJA4Sb#< z+59HWha_FS7;z0i)>p( zRA#P@)e~Du-dO|k;o4YxsC)2!5=0DKA8Rh=t&jasY$Z9iK30X+WdnTA+CbkQZi@X> ze7z~w(tUX|*!OG(kR!JM$dy|V*y`=E%f&Y&uk8R-Z|{g<*f8K-m{-3WTVRXwow0oJ zh$9&;FE_F)6$kHF7Jl8GQ<;SqQ| za0GsO9R(S8lpfa{g~!RCz{}iE;N{RK;66$64TuuH5t|L3FJf1Td8Z*ND^JH-iA^NCPsdt{W2a;7 z#i%c1H;buX;%hz0@h@Z7i=JQMYw}n4n$NFUUxU1OCU%oJb_PM0p9R@_HU`zV-!~}X z`R9;^Rp$`kj&ooTGbXVKrXis;IExzvQ zuC>LJz1(%S7}d*NZ;R)9xf^WEXMnw`x4X#}M|!)PZE?D{yTum0`?yX%@*VO zxZ7>9u8(^f-9sPuU0Zz6$K7d*6MfuWw)m!xyW1B1`?`BdP0qo4b+Ee7{{hzJuoX^oNGd=?k8Li-u}^J-`B{<|Kt$y>c-pX?o|f&Pr}aDFw1?y{i1=&=+}G?T zd!u8=kxBt0Q*dW?{qBgi>|)SWd7YY&S+#O6^M(8NEW`BRcJv>Y*- zmQzQ=Jd0!zh}bMGdyav5Fv(aDF>4Gtm(#qFWH&8OO3M*rVV*?tGKg3{mYh3iK1gz$ zmQOrG%NL%3c^=7IAYzBKJVNuAB)!MM@|khuT#Zk62g&=i{7PC5dKRCHCua1FxQ8ZZ zSdlSPG7duhe}O;3ePtTBUk8aCm?rH{@kfZcFTjIX{&EHceeWya`HoOz+Pwfq6Q~ zYarsCCA8d2^T#Bg)AFebT28Eh`4y7aLBs}Wd4T3mNzTx6*jqA5Z^1l=WC@7aCM`dr z`3sVsOJVuUQgT+})7?z6mzJMN%O{t?Jep)Oh*-Fcoa<=bLvomw=cMJZ&fZAL+nDhIB=Qu0gu8Ydn0J6gdTp2X!}ue_*!}eI{6U6CvIHbH=}?9n+kY73 ziw{8#eFU=eV~{~dGBRR|K-^VFz`TXzJrHsF2$MDCD9o>tECdl7kJ9oW%_m6C(sKAQ zT24O(^IVb&5V2iaeoXUel3t&{a_lGMdZ z56vHud`8QGUyyUc7cjp{vJgbP{ROhQSGs&j%O_8R3!Qpi4F@kP;N5Jja2wL5p!7LU!mR=hVh^CL%mHa7Ei@y*!GmhOyaz_^HHC5YJb zOlAu)Xk2C;v1A-preA*+OV!IKWq$04vy(E1Sz^m%_<3(K*iVw21BvvTl8K&i#gxnu z&<&?#4!6b7=QBszV!`v7qipdWsXJ*JxL+n&03xY*E({d#MN5I47@DXI%Y;$ zGwN`-_WIqZ*y|{S$6g0EEt2**7DS2seUAB2Vil!*!G8Fyrq~Q24(!M2oN~~y z2n`-|EW{}~=qSSS?Vw|El(;}?KY0kw%@j8vMAl)R`>Mk@_x8HO0D2BPuu{r9LRq8a zAtf&<*?9z$ChMpJFDOSH&xji4nkX`kIeu?1J%(zlAjB@HqV<^LX>q>6F$cd)9(UwN ziK630dzXptwe{>NH%c&p572d)*l{au`CKIfK)+#8!&r3lJ3) z=@%jPQe3`>lXCweoR42Zuf)|$$nLz%?5WGhE^J|TZ40ueTj1KQ^l4X6H0dh9nb#po zZqj@cN72jNnpWhdw>#bx1??zusvV=h^cIeGHH6r93uSw6!6o%Jj&{av$961aZ}XIH zzU_F#+H~7-1NW4S4hQzt3Oi7&grX8c-0N_(SjCAuj+@x!yi2*h%Ym(o!(EP6YzQcM zrOR;xC#uU)XAx=Ljw@ENznj)ZmA}^QxQSP{ZpTh6r0=nYQ$3VN?^B-ZrT?8?M=R#@ z1II4h-yaaa)JOSck_LGrS%XhbiiSEDq%dEJe3aOdqQO5al|ChDl#9|SD>CSFCPUke z$7d!>?aCx_GE>`wC9*;?vVho&vNY^vPSo%YSu;`Fi(fmYYWpx?Q#HI#-kqxLw}|3t z+9kXi&t`tlZ00*>YxTI{m$qQVP(V zZF7N!BQDTNE%IK0)`l@pD%2KPWI>_U4rMVFaeTh^sNB3*y9H#&Vw#UG)^0;-R7%TY ztpmzUrA#i;I-$%cV!;c`wa4U^GVKnKx-u3#R;JyB^0`u4%Cs&PR7!7|)(s`KoNhVg z+C3=wR4i5HT3M9sV7X=$leeMMmTlX#%T`a-qdJ5mSt2X(OL?4*6cP7S+aB}%SUawPQfVtOnITCAT-Q)!q}RKdDjsM9gp0UKXnx z0orRDadNLvbU;`$KG*OpDrnZ;vX@=J8E?9vJ&*;P*cC%Z1TkKAD;&Y5-=XXVO zvh&xXB*po%eSL}({eTenQ=Bh|@>Hi=%t&{BO>9edeqCHncYZ_6$aFp_mS*CMxb>ON zABm<+=Z{5imh<~!#zbHR6P-U1>n20pI~i*8WT>;IIe#D)PJ>!L&G}Q2o{hc~WjlX{ zZ5=e(l8x31+te59;Cqh;0SHrWZmiD#Z7JHHE+~ zGMBRmSji&f8W%h5)(y*@*wwjNOu4MYnH(Kstz;ssi&m&)C6gHIJoPq;9)daL^jumFeGSEC2+^Rx%hWq4 z`UvJ#(6gihdKE=2glJUYb?V&|X)6KFTS?EA%r>lbVhz5!%4xBluX3hfgl{tu_Pguh zow5OV`38k=W`djLCKk9~3v1?fh#Uw}x}6m^Qa?{|lVJJ|f^&92Uq-PSLhMoCY3f%f zItWg#qvwJ;=w%eu5aOT$o2j=_+#@(+Cq0+$guaGiGlV#yz@%N!CsX7>i1J>zkbfj6o5Qe^E1ICH=A_o8e+-FHK`pQLD}rCWhh>!Hu3SPCIF z)zkAZ^@awVoQ&hnRGhRtCc=L4b3n6CDQGzpVc&ZRuE!y4RV_}t?e-OjtZNWm6xXgp zEV$u}u^oc2pT6O=$eTBuxw7jc`G6_HW8GBAJSM3z_KKURZ#{%OLnLE*jJ(dwwEP&^ z!%W`77&)mGnfb*ravL)lG4iyLb{Xl^Hr)a5*3PvSxs+;$O|D}q@XLVnF?p2vq!@9d z&3WA_JE?s|=C>pHx>(TeoNAHFsbIyhs@++JMP$2kS(MyCtSnkKFs+OhP3=ynyhdeP zwCIK+GH=l@`xc;@XtDSf?vV#>;m)x0HgavZkvq|WTyiIJS3Bw3)d}C0XgTo?Qhc*K z>kg_Zx`?N4n(KxYKODIpvmZ`(;WZyZwx*-) z@v@JJ5WN|$$HaGIXT6Z5p8Ro; zX|7D%`ZrH=VKrP`?0Uj-qS%!cZM#+Mvf37uxTGj8abX$ST;lqw*izqJ?e!ZdZ&g zX%EB>imMdY_PXr0)_s^R)AzfkqKbn3tfGFuOS2uW2i#t-;NE(|bZOSQM)qd%=c+dar_g*e#gZ=| z_EGFTjl%oRpxLWuT+>l;=NT3*`Vti{ItzH~Sq1MqOStQ-OS5lk!m#e6I1V8;pTnpx zJC7dPsxP?g_PPtO9HBT3A=)pvu*cR*edYm;s&?HZHua$&2|R<|KZijg~+;^A`J&~w|NS4PX* zOkvNxg|rJgQ|h;o-j9~;Orhs=Agzy<7nzQix0xV_bSDyA*o~d8*JSz~WtzzZ!P0fD zR@ctyTC1*=-Bq3&m5k$yqwLnV7x46dU(8C&$Mp5JjAqXy!?Xc z_3^Tu>B3KCFVoyl<;(|2_k1cBFx~X2T*tKSQ(4RO!l$_PBh8;6&oiAe!QS%#vn{g^ zvnadIH6vQcS$(b?Oz?Sqt`$<2_qk?5S>NX>#dXt%A{h4bNCCF?xn@PnZi1^O$ebj1 z9>DoYZh*x}ZZ+VwN$%MI4=C^?L7bJgBzHc*`wGlR28dI!AlW?!U}-XouOo=_c`(^M z7vL!cULe>qLG~uQ=K-9U0#7kB#a$-l+!S{Kpk*m;^m26y{K_WC{VDE3fG6oE&k?Md zAn&KR=L5`2C76>6unyBC)x7{Rt%2MS-^no}M5lr@0paoSnwvi_!qL zO^_SY+=~J3R^SnW9TVi$G1 zo6}kEZkjOj4l2{BboVltE-6zRO_-v0l_@pDy&R_O43?Um0aN}sF+an7+bWBx6^xU6 zGu*{+Ij&sJ5?nG)c4fFr0H$TK+>}g!HRHt0OqMI8wrQN)lIdOnmwj{*4Vmoz8Ja+e zHPKxP%T6Rxo|xz^gVH>aHMLK4mqY1Q%9Kg&3Ml!LXjwkVy%Ne=rEH(%UIpbK7120} zRku%duV%@q>ikV}uYs~@8cViKQ`Ph+Wo5RiWQw%)%HL4=ZszS7d8j9cVm<_ZqjCRS^yRsKA#!HB9}!DtyRq+bZMJ)d#kMscZ6C^q z=UIwt5b{C3YP)ETdsdXJoTJ)4JBMx0oy)eD&1KuWRQ{;Sx2k*(^Y*NHs3(tNF@#(< zPgQnmo;xo}UZaBBK>;f}QNYTY3s_l7A@kD;nJ-oOYUb^Ag{Y^2;w*%`RmjR@@qAWe zxia5f6)oE5yVIg9a~CkbcmebKRsISbb9wtDm@p`58-?-=Ol_nYSNYf*P`yLd=7Z z6-!lLE0(DWT9>(N@QSj`ogQT=TF!jMa^_E}d^7X**5xSMOEIw+eQhpAUt5aN*Q^rv zR;#VM1bxk00dp}$C4}6)LN$_ErW)B(#)^-XvEutGpIOfQs&e8RnYZsLN7-hIn-DU& zLRFB>1go^UOogR(4GYw-Vc|}dPg=`-$y(x-%-d_%qWJN(@P9|1XYyy+%j6GoawU@A z$s#6opUG`{YClZ3-G4!Kh-qAz7v7<*k6L0B_!!ML>1bTTt&ND*) zldnbckG)a0(Vo%6$BeTw^?DLz%wLRn9?^1mymzEcdSl~8+M{E=al_(bkU(?T5Q8D^ z`H`CAFJ{~wXY|PUF`hV=ZRAG@v56jc^hog04}ZiqayY|4Jc@8KjId)ym-~vT8?hoD zgN~44M(m~dgvSv@R4Gr`5Qhf6{3|#hc$kl{>#M$aN3SO&3>)_~n2orhO8;v_@llzf zj2QZLwnn$1i0lKN({Di6g95z~i=cane}hO(Mrj@RCix@KS}a1#jn!#IM}ckeTd0-w z=}zB9Ekok|JZji*&%1GmVDTLUt}tq4RGZk*s>$y%o~sIW>Wg)w@F#uV43q=n1BHGM z@q=`46-G&6-$zId9n*=I6!-)5(Cl(RYd`eIPYrJFM}Ggn_I|7a+aQcW{5XGuKS9@w zx&vDLDTj0fNu7CYKjV-Z8sqo;T(=r^KZSs8u&OG5fdDkf>oq-%k=BD`8TCAa2s!}( zt9sVwW7PIb5@;YQ-(PgDrsvSKuIhC@kFbrL8tB*yC~9PX3tp@tBVN>FzS8Ck((zAY zV~2nE5(e7v^ch~pG3bnIBgPFG@d{72UM-IIRWxd9?Br{(`cLcMqKBa1Mk|US>+f** z27}PJzlSN{MEwepk?6-jkjCL5(whq5`=4-%LQHSsGW#`ps$e6Q7%!v$j5B1=FrzL~ zveEN((-U?7IUb?0F)7~&z)Y6$-{7R14fziKO;l-uilRw{;r@pJRE17d=x+mhs(cZP zB{4qXzXZU_S%-gTHis+9*W3^UIQ2EB$WQ*6p#Tv3?Dqj9WCV;gP5)>XLQQ&DThsCf zvk)vHh5m>crdm=Yv5MH>znb2D=$&{5O7|rE$s8|b(!-1XImlga*kF|XCq%aMR~}?C zYkUg<`1~$L=ZxZSV^*1?z$n=7m^z0F`nzUtpqoL||JlTFmQCzm%yPgu8~zp3-mG^B zLf?bm`5hH({ofGo&ornrXB_oNmili2Ms@xIjsM+j7F{tX-2X5!qghVE{~2_+^d#T3 z3jX8$UuL&>mc}B$B-lcS(`Be>Kt(}@|7{vjLLXftQ0_3(fD%E5_X6gKG1x|t;iiR+ z#JxWjbn1p>1n$vlRM3hMp7QPC!$x^LCXNz;_(*fOhj`WX{yuIyW_bmCz))$t%7=K3 znCG$PwSmaPsCbM4{~xnYXj$RD7^fea7PK8~8D)-oKvdSzW{(ixaM*jJJaM?|s1E2p z@#biuncv2K>=|L+3dWd6IK&%-|GRkrD4@rDOE8ZS_c`2JJ&9hksNRGbq}7`kaLdqR zKJgJc)~t|+^TDt&9`9cQ{M3U&J!(G+@KdPwV~m_mMvntRfI7rF1M{J097e&o0sENf zKk+}!{3P$=Igmb=p?Vn=-0xFf*M5s}msX|;JUGAUk9hVd{IlR92HU$b{a*|aLx?lP zsEVT3f56dXvWXh^ZeIhcOa#XJNPPDZIqe5vw9g>vrWt0{Pg);JSszAN-#=Y_1hV=8 zsOtM8svnT1eh`xShyhsp3BMXK_-cQlS0e{r?Jw+V#GtE@L#{>+xSDSnG~DXL1Y3QW zP^p5FqExvkr+#tLOS7!HdL&W=95NOzg+dp+_+rB>FgtM(?@2eADEXu zA}jsCob&@R(htl>-#;7ufL!$bGto!jp^v~q-){t5U;NuJhWZdH`uo^CuRJ`bg24_JPMMcWREwSAhQ%LAJVT%d)7+m6gzf0k>m zz?yvPxu(!I0#|hBLW|)%=xp^7sqP~a-G_$-zi7c?Gq88&!t4@*uLm0RdGN-tQN!Yf zdoEi*8y9GO%k$pY*iqP^NyMAgyJK2HhyLvkVn-(aDIxa#*tjd9hmD$jTWePtC_k`b z6%Y1W=ovP4?yiRplD_6g=;#|^CG-x41wn7MU^B&_qCl-}7QDQ0AI6AF-cB?1xBq=C zD3orodw$k?!|ApKyFmKp&Bq;Fs4)K)LnM1JA|H41$>A>q*&v)5-VRdlFrYFGJsDtqR0NAL5aBl!?M&}3ofJb34-Rs@! zXTg<;88~AtPp}!1ijLt8XXfaIlP9jgHJD z-vq7@UCU*teQY^=Xe@eX(f{4JQGO&Zuob<~Y*xWS>fxKuD)b^spF`$q#S5=?5A-75 zx%7H_%&1tS;dzRK*{?I0ctHT6ebDnA(QOM!fonv$^+)ChFh9sJ)~j!;!mxl0r$&k3 zXu<#&1~e5EH5j%&08+->^?yuQ@ zkQMr&`?uCj>VcJb^z+|VB+u{JR9ct#3l?M z@-QL&PVA#X*%@Fn@A7dY^gHn`HKFu9E#tx9-5r1#{@yUQj=daBqe1f-flBqJ z_XQXOTGWmE1G*DXQXNNqKtaFFsNw(_jLjwkITw9LdN2wv8UuOgtsjcuVzd)RHgbfw zb7O^Yl-G|6{%!!F1nUjF*ZSDl`{iao!3zY_Re!-k?|trraI+7>%sv<|`(Ui>5jfc+ zFtSJDV~@nf{t#U355dHKj;t{lOaGl#UC+(Dkb+?S$CUHDUw}Gl43={KA{XfGBN6lC z7u7S5{33pAK-TvGIo~5QzDMSJe<-&1hvIsV!1Nx0=l!N{c+F>)8s1jl@S3nbylp|l zYuegFhS$Vz1q`o=4Mr>9!Rt48b%38abTUNaSB=3bQ2_5IXz8$?ONE zvLBSlK0BP89;2*ZW5#cmZ{fGo_=hF2k3eA`nZSNf`uf4h>j$H*k3?J_nYMmV()z(D z>jxvOAC#{CVaVzqhN^zP!AuW2torm)t1r$m*k&5!nXvzJ(FdAhI+NYEMFp4oVPl1;;4(jKEL9a;&XF-*uoPgvc~z+61j9VOc2WlQyX{I+odvqD@*kIC zNnIV_pnx?zAoG_F{+9hZ_GZ=+#2BfH`Qb!DeC&uyW8n1GJPEO*J^03CU1)i38&#=; zi64!x<~+*%A3jb*E!Aw?*t$`04Qbf)MzF`GGV4`+I-xeZqYi5WrvZ1ol#BVgtV|n& z=)n1UxrzN$jwC*Q7i@?8lw-3W#etdV7GDSW*jHbbZ1q#9zk}gbn@`*PjTqgpWjB3| zyor+d+Go2TL>mUU!{0EvW0IrS`BAu<=uSWFIeY^M(|7p|a1Su-_V z{=ovGU%m}N=h3(vk8=*{O~NsV0rW(Wzwy?3G6*y-^+tbdI5m1}pZgt&>9>kgL7>rv zFM>d$%F{tp1ALsg(A1TEhEq)CcpaEi>`S`)(14kA);}dU5c<#L=#BcEuPLYz!^q3( zT+o2>-qGwoHLOSHO;cCVdD2m;^PIr#zA(zkehDWpS@HF(Dl`DUV;H+*KirP}F*`=$ zb-d1jHgBVRVN1XW-r%8f14usvAUApUcnAE-{0K_l=xpT)R=b}*FE1jfo4fO#1m2ARkN%V~FWYydZ_91ty z-0;PRz6!a^BjfyK0rTv3@pf&3MwR&7vfFr+W3j8;{g!*IQ-8E!7?3|lW1eo6H9sQAPO>S4s06&vUMN6)xE4i?(|-7xP5@a2y--Xw_)ZhT@3b28~3 z^^aqrrTFQ~-@&6NA(ecUDE!A*d_v{*437taWSZ2M+kqH1L@>)eiRonXQ)epBnjta0 z{w>xsYD6aMGq-)o>V$lj#0fSqo;YMDlIYoh^jqsBiP19<_3M%jPY$S0-8SGdB>+>` zAh4;5ejFX}?MCXK0R9eNI({-O*oeaoFlI}9u<6^lo?7$uv zUlgh?pll)oTq z|3myoo&@Dn6mEQX%oxMCM6tH}ORDLH_Pk5`?TgytS{Bw91si=?9?~3YRA%+|UL0aX zNBzcuMtX~4oF6%Yk*L8=|5C;|yaws!ro$qkfWGt8ZHlV+5y}k-gU2``2 zimar!e>(c`RlEu4^U;T`RyP{FwfL)ELkK-nA20K>;~^u~O8ti>1yu&x@q@{So)PQ( zw@BqOAPaE+9Kbcw|MH;9ua~&7tK87H6Fp=4V+al<1m5H?!k4iA*ntDsfP)Erx2XZ+ zt(U(Y@qVkX2WussfqFN92d+oAtEp#}2wH0H;C)&zWNfY1@$guy`M;f=bkSFIhRZG@ z`r^nyb`vpg1nS4uJ?c78Z5p=?KK*0k-ruWcY=FUc?qS^L@2OsjosEqf8$Z^&Ut+y% zjB?Q0-uL-*y}Bi-nlYEnHLcHlz+X4a#wffqHV(}mvsxOs2 z3Esp0QGRpm=rMo9e^jut!QVr?ep2M4{*nfRE?0d0G3_?^&!x$=tA3K{pMUp+e@snp zeHnZ*%wR60{il~Sym%`MXYf7cFKqZ2tI__6eNX$xN-_JY{`SZ9`=x&rbPC`x-m#-R zXM<6rpG`q0_cvp`_?$&wADA4$=hVH-Jh|rEj%jW7cM9j$_-_BaAH)S=fEWBDqIif$ zc=}@`zQi#xKN`SP;cum}f5E%!W!~~kgMaPX!lq2vm|9-@;}-Gg(4k(gA%~8M$FH8A z1jh{L-;4ejjV&RB#!+E>#@6Qs6qm8RU-nWpEb1u~ z+Mk&J4<=*Bz=s{QcNK8hTIkq4?+is=aD^f-xAr?t5X-^WP7HUid*6^x_Z0pqG9W2EF{_FzA(^ zgh8+VGz@y}XQ9vwzx;U^^xRWn(DT0tgI;(#40`dIFzBUc!=RUc83w)bTp0A~^Zia3 zu37#iHt~Zu__3Y$nfDWhjrjmy0K_MFUkIz>wHG6@6Tj3yIq}P3+{CYhQWL)#&P@DT zKg7g;8^%lgcOkUI;#tQSP|S}Vj>o&jh3s&T*XtSa^n2qhkNhrvwCBA9&qq%V#|N12 z+n#&%ndhE)RlM|Q;;@AGJ&8j{dWI#AP4IZFPdz$%Y$E@K_4NCr;@=xK%KKD|7k|5c S+VgSZQ+6-@j{V&8ul@&oWZ1_5 literal 0 HcmV?d00001 diff --git a/vendor/box2d/wasm.Makefile b/vendor/box2d/wasm.Makefile new file mode 100644 index 000000000..929b61aea --- /dev/null +++ b/vendor/box2d/wasm.Makefile @@ -0,0 +1,32 @@ +# Custom Makefile to build box2d for Odin's WASM targets. +# I tried to make a cmake toolchain file for this / use cmake but this is far easier. +# NOTE: We are pretending to be emscripten to box2d so it takes WASM code paths, but we don't actually use emscripten. + +# CC = $(shell brew --prefix llvm)/bin/clang +# LD = $(shell brew --prefix llvm)/bin/wasm-ld + +VERSION = 3.0.0 +SRCS = $(wildcard box2d-$(VERSION)/src/*.c) +OBJS_SIMD = $(SRCS:.c=_simd.o) +OBJS = $(SRCS:.c=.o) +SYSROOT = $(shell odin root)/vendor/libc +CFLAGS = -Ibox2d-$(VERSION)/include -Ibox2d-$(VERSION)/Extern/simde --target=wasm32 -D__EMSCRIPTEN__ -DNDEBUG -O3 --sysroot=$(SYSROOT) + +all: lib/box2d_wasm.o lib/box2d_wasm_simd.o clean + +%.o: %.c + $(CC) -c $(CFLAGS) $< -o $@ + +%_simd.o: %.c + $(CC) -c $(CFLAGS) -msimd128 $< -o $@ + +lib/box2d_wasm.o: $(OBJS) + $(LD) -r -o lib/box2d_wasm.o $(OBJS) + +lib/box2d_wasm_simd.o: $(OBJS_SIMD) + $(LD) -r -o lib/box2d_wasm_simd.o $(OBJS_SIMD) + +clean: + rm -rf $(OBJS) $(OBJS_SIMD) + +.PHONY: clean diff --git a/vendor/cgltf/cgltf.odin b/vendor/cgltf/cgltf.odin index f4518360d..a24c36d64 100644 --- a/vendor/cgltf/cgltf.odin +++ b/vendor/cgltf/cgltf.odin @@ -5,6 +5,7 @@ LIB :: ( "lib/cgltf.lib" when ODIN_OS == .Windows else "lib/cgltf.a" when ODIN_OS == .Linux else "lib/darwin/cgltf.a" when ODIN_OS == .Darwin + else "lib/cgltf_wasm.o" when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else "" ) @@ -13,7 +14,11 @@ when LIB != "" { // Windows library is shipped with the compiler, so a Windows specific message should not be needed. #panic("Could not find the compiled cgltf library, it can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/cgltf/src\"`") } +} +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import lib "lib/cgltf_wasm.o" +} else when LIB != "" { foreign import lib { LIB } } else { foreign import lib "system:cgltf" diff --git a/vendor/cgltf/cgltf_wasm.odin b/vendor/cgltf/cgltf_wasm.odin new file mode 100644 index 000000000..f2da86a2c --- /dev/null +++ b/vendor/cgltf/cgltf_wasm.odin @@ -0,0 +1,4 @@ +//+build wasm32, wasm64p32 +package cgltf + +@(require) import _ "vendor:libc" diff --git a/vendor/cgltf/lib/cgltf_wasm.o b/vendor/cgltf/lib/cgltf_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..54346d176c8e8c1335d00f418d7f554fe690e3f0 GIT binary patch literal 112327 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 ! { + context = g_ctx + loc := runtime.Source_Code_Location{ + file_path = string(file), + line = line, + column = 0, + procedure = string(func), + } + context.assertion_failure_proc("runtime assertion", string(expr), loc) +} diff --git a/vendor/libc/include/assert.h b/vendor/libc/include/assert.h new file mode 100644 index 000000000..a6fb6c696 --- /dev/null +++ b/vendor/libc/include/assert.h @@ -0,0 +1,16 @@ +#ifdef NDEBUG +#define assert(e) ((void)0) +#else + +#ifdef __FILE_NAME__ +#define __ASSERT_FILE_NAME __FILE_NAME__ +#else /* __FILE_NAME__ */ +#define __ASSERT_FILE_NAME __FILE__ +#endif /* __FILE_NAME__ */ + +void __odin_libc_assert_fail(const char *, const char *, int, const char *); + +#define assert(e) \ + (__builtin_expect(!(e), 0) ? __odin_libc_assert_fail(__func__, __ASSERT_FILE_NAME, __LINE__, #e) : (void)0) + +#endif /* NDEBUG */ diff --git a/vendor/libc/include/math.h b/vendor/libc/include/math.h new file mode 100644 index 000000000..3f60d698f --- /dev/null +++ b/vendor/libc/include/math.h @@ -0,0 +1,21 @@ +#include + +float sqrtf(float); +float cosf(float); +float sinf(float); +float atan2f(float, float); +bool isnan(float); +bool isinf(float); +double floor(double x); +double ceil(double x); +double sqrt(double x); +double pow(double x, double y); +double fmod(double x, double y); +double cos(double x); +double acos(double x); +double fabs(double x); +int abs(int); +double ldexp(double, int); +double exp(double); +float log(float); +float sin(float); diff --git a/vendor/libc/include/stdio.h b/vendor/libc/include/stdio.h new file mode 100644 index 000000000..807437f3c --- /dev/null +++ b/vendor/libc/include/stdio.h @@ -0,0 +1,47 @@ +#include +#include + +#pragma once + +typedef struct {} FILE; + +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 + +#define stdout ((FILE *)2) +#define stderr ((FILE *)3) + +FILE *fopen(const char *, char *); +int fclose(FILE *); +int fseek(FILE *, long, int); +long ftell(FILE *); +size_t fread(void *, size_t, size_t, FILE *); +size_t fwrite(const void *, size_t, size_t, FILE *); + +int vfprintf(FILE *, const char *, va_list); +int vsnprintf(char *, size_t, const char *, va_list); + +static inline int snprintf(char *buf, size_t size, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + int result = vsnprintf(buf, size, fmt, args); + va_end(args); + return result; +} + +static inline int fprintf(FILE *f, const char *fmt, ...) { + va_list args; + va_start(args, fmt); + int result = vfprintf(f, fmt, args); + va_end(args); + return result; +} + +static inline int printf(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + int result = vfprintf(stdout, fmt, args); + va_end(args); + return result; +} diff --git a/vendor/libc/include/stdlib.h b/vendor/libc/include/stdlib.h new file mode 100644 index 000000000..22cfc528b --- /dev/null +++ b/vendor/libc/include/stdlib.h @@ -0,0 +1,19 @@ +#include + +void *malloc(size_t size); + +void *aligned_alloc(size_t alignment, size_t size); + +void free(void *); + +void *realloc(void *, size_t); + +void qsort(void* base, size_t num, size_t size, int (*compare)(const void*, const void*)); + +int atoi(const char *); +long atol(const char *); +long long atoll(const char *); + +double atof(const char *); + +long strtol(const char *, char **, int); diff --git a/vendor/libc/include/string.h b/vendor/libc/include/string.h new file mode 100644 index 000000000..4571f9454 --- /dev/null +++ b/vendor/libc/include/string.h @@ -0,0 +1,21 @@ +#include + +void *memcpy(void *, const void *, size_t); +void *memset(void *, int, size_t); +void *memmove(void *, void *, size_t); +int memcmp(const void *, const void *, size_t); + +unsigned long strlen(const char *str); + +char *strchr(const char *, int); +char *strrchr(const char *, int); + +char *strncpy(char *, const char *, size_t); +char *strcpy(char *, const char *); + +size_t strcspn(const char *, const char *); + +int strcmp(const char *, const char *); +int strncmp(const char *, const char *, size_t); + +char *strstr(const char *, const char *); diff --git a/vendor/libc/libc.odin b/vendor/libc/libc.odin new file mode 100644 index 000000000..00d687109 --- /dev/null +++ b/vendor/libc/libc.odin @@ -0,0 +1,25 @@ +package odin_libc + +import "base:runtime" + +import "core:mem" + +@(private) +g_ctx: runtime.Context +@(private) +g_allocator: mem.Compat_Allocator + +@(init) +init_context :: proc() { + g_ctx = context + + // Wrapping the allocator with the mem.Compat_Allocator so we can + // mimic the realloc semantics. + mem.compat_allocator_init(&g_allocator, g_ctx.allocator) + g_ctx.allocator = mem.compat_allocator(&g_allocator) +} + +// NOTE: the allocator must respect an `old_size` of `-1` on resizes! +set_context :: proc(ctx := context) { + g_ctx = ctx +} diff --git a/vendor/libc/math.odin b/vendor/libc/math.odin new file mode 100644 index 000000000..59f42dd67 --- /dev/null +++ b/vendor/libc/math.odin @@ -0,0 +1,100 @@ +package odin_libc + +import "base:builtin" + +import "core:math" + +@(require, linkage="strong", link_name="sqrtf") +sqrtf :: proc "c" (v: f32) -> f32 { + return math.sqrt(v) +} + +@(require, linkage="strong", link_name="cosf") +cosf :: proc "c" (v: f32) -> f32 { + return math.cos(v) +} + +@(require, linkage="strong", link_name="sinf") +sinf :: proc "c" (v: f32) -> f32 { + return math.sin(v) +} + +@(require, linkage="strong", link_name="atan2f") +atan2f :: proc "c" (v: f32, v2: f32) -> f32 { + return math.atan2(v, v2) +} + +@(require, linkage="strong", link_name="isnan") +isnan :: proc "c" (v: f32) -> bool { + return math.is_nan(v) +} + +@(require, linkage="strong", link_name="isinf") +isinf :: proc "c" (v: f32) -> bool { + return math.is_inf(v) +} + +@(require, linkage="strong", link_name="sqrt") +sqrt :: proc "c" (x: f64) -> f64 { + return math.sqrt(x) +} + +@(require, linkage="strong", link_name="floor") +floor :: proc "c" (x: f64) -> f64 { + return math.floor(x) +} + +@(require, linkage="strong", link_name="ceil") +ceil :: proc "c" (x: f64) -> f64 { + return math.ceil(x) +} + +@(require, linkage="strong", link_name="pow") +pow :: proc "c" (x, y: f64) -> f64 { + return math.pow(x, y) +} + +@(require, linkage="strong", link_name="fmod") +fmod :: proc "c" (x, y: f64) -> f64 { + return math.mod(x, y) +} + +@(require, linkage="strong", link_name="cos") +cos :: proc "c" (x: f64) -> f64 { + return math.cos(x) +} + +@(require, linkage="strong", link_name="acos") +acos :: proc "c" (x: f64) -> f64 { + return math.acos(x) +} + +@(require, linkage="strong", link_name="fabs") +fabs :: proc "c" (x: f64) -> f64 { + return math.abs(x) +} + +@(require, linkage="strong", link_name="abs") +abs :: proc "c" (x: i32) -> i32 { + return builtin.abs(x) +} + +@(require, linkage="strong", link_name="ldexp") +ldexp :: proc "c" (x: f64, y: i32) -> f64{ + return math.ldexp(x, int(y)) +} + +@(require, linkage="strong", link_name="exp") +exp :: proc "c" (x: f64) -> f64 { + return math.exp(x) +} + +@(require, linkage="strong", link_name="log") +log :: proc "c" (x: f32) -> f32 { + return math.ln(x) +} + +@(require, linkage="strong", link_name="sin") +sin :: proc "c" (x: f32) -> f32 { + return math.sin(x) +} diff --git a/vendor/libc/stdio.odin b/vendor/libc/stdio.odin new file mode 100644 index 000000000..10b95b96b --- /dev/null +++ b/vendor/libc/stdio.odin @@ -0,0 +1,106 @@ +package odin_libc + +import "core:c" +import "core:io" +import "core:os" + +import stb "vendor:stb/sprintf" + +FILE :: uintptr + +@(require, linkage="strong", link_name="fopen") +fopen :: proc "c" (path: cstring, mode: cstring) -> FILE { + context = g_ctx + unimplemented("odin_libc.fopen") +} + +@(require, linkage="strong", link_name="fseek") +fseek :: proc "c" (file: FILE, offset: c.long, whence: i32) -> i32 { + context = g_ctx + handle := os.Handle(file-1) + _, err := os.seek(handle, i64(offset), int(whence)) + if err != nil { + return -1 + } + return 0 +} + +@(require, linkage="strong", link_name="ftell") +ftell :: proc "c" (file: FILE) -> c.long { + context = g_ctx + handle := os.Handle(file-1) + off, err := os.seek(handle, 0, os.SEEK_CUR) + if err != nil { + return -1 + } + return c.long(off) +} + +@(require, linkage="strong", link_name="fclose") +fclose :: proc "c" (file: FILE) -> i32 { + context = g_ctx + handle := os.Handle(file-1) + if os.close(handle) != nil { + return -1 + } + return 0 +} + +@(require, linkage="strong", link_name="fread") +fread :: proc "c" (buffer: [^]byte, size: uint, count: uint, file: FILE) -> uint { + context = g_ctx + handle := os.Handle(file-1) + n, _ := os.read(handle, buffer[:min(size, count)]) + return uint(max(0, n)) +} + +@(require, linkage="strong", link_name="fwrite") +fwrite :: proc "c" (buffer: [^]byte, size: uint, count: uint, file: FILE) -> uint { + context = g_ctx + handle := os.Handle(file-1) + n, _ := os.write(handle, buffer[:min(size, count)]) + return uint(max(0, n)) +} + +@(require, linkage="strong", link_name="vsnprintf") +vsnprintf :: proc "c" (buf: [^]byte, count: uint, fmt: cstring, args: ^c.va_list) -> i32 { + i32_count := i32(count) + assert_contextless(i32_count >= 0) + return stb.vsnprintf(buf, i32_count, fmt, args) +} + +@(require, linkage="strong", link_name="vfprintf") +vfprintf :: proc "c" (file: FILE, fmt: cstring, args: ^c.va_list) -> i32 { + context = g_ctx + + handle := os.Handle(file-1) + + MAX_STACK :: 4096 + + buf: []byte + stack_buf: [MAX_STACK]byte = --- + { + n := stb.vsnprintf(&stack_buf[0], MAX_STACK, fmt, args) + if n <= 0 { + return n + } + + if n >= MAX_STACK { + buf = make([]byte, n) + n2 := stb.vsnprintf(raw_data(buf), i32(len(buf)), fmt, args) + assert(n == n2) + } else { + buf = stack_buf[:n] + } + } + defer if len(buf) > MAX_STACK { + delete(buf) + } + + _, err := io.write_full(os.stream_from_handle(handle), buf) + if err != nil { + return -1 + } + + return i32(len(buf)) +} diff --git a/vendor/libc/stdlib.odin b/vendor/libc/stdlib.odin new file mode 100644 index 000000000..f898de619 --- /dev/null +++ b/vendor/libc/stdlib.odin @@ -0,0 +1,119 @@ +package odin_libc + +import "base:runtime" + +import "core:c" +import "core:slice" +import "core:sort" +import "core:strconv" +import "core:strings" + +@(require, linkage="strong", link_name="malloc") +malloc :: proc "c" (size: uint) -> rawptr { + context = g_ctx + ptr, err := runtime.mem_alloc_non_zeroed(int(size)) + assert(err == nil, "allocation failure") + return raw_data(ptr) +} + +@(require, linkage="strong", link_name="aligned_alloc") +aligned_alloc :: proc "c" (alignment: uint, size: uint) -> rawptr { + context = g_ctx + ptr, err := runtime.mem_alloc_non_zeroed(int(size), int(alignment)) + assert(err == nil, "allocation failure") + return raw_data(ptr) +} + +@(require, linkage="strong", link_name="free") +free :: proc "c" (ptr: rawptr) { + context = g_ctx + runtime.mem_free(ptr) +} + +@(require, linkage="strong", link_name="realloc") +realloc :: proc "c" (ptr: rawptr, new_size: uint) -> rawptr { + context = g_ctx + // -1 for the old_size, assumed to be wrapped with the mem.Compat_Allocator to get the right size. + // Note that realloc does not actually care about alignment and is allowed to just align it to something + // else than the original allocation. + ptr, err := runtime.non_zero_mem_resize(ptr, -1, int(new_size)) + assert(err != nil, "realloc failure") + return raw_data(ptr) +} + +@(require, linkage="strong", link_name="qsort") +qsort :: proc "c" (base: rawptr, num: uint, size: uint, cmp: proc "c" (a, b: rawptr) -> i32) { + context = g_ctx + + Inputs :: struct { + base: rawptr, + num: uint, + size: uint, + cmp: proc "c" (a, b: rawptr) -> i32, + } + + sort.sort({ + collection = &Inputs{base, num, size, cmp}, + len = proc(it: sort.Interface) -> int { + inputs := (^Inputs)(it.collection) + return int(inputs.num) + }, + less = proc(it: sort.Interface, i, j: int) -> bool { + inputs := (^Inputs)(it.collection) + a := rawptr(uintptr(inputs.base) + (uintptr(i) * uintptr(inputs.size))) + b := rawptr(uintptr(inputs.base) + (uintptr(j) * uintptr(inputs.size))) + return inputs.cmp(a, b) < 0 + }, + swap = proc(it: sort.Interface, i, j: int) { + inputs := (^Inputs)(it.collection) + + a := rawptr(uintptr(inputs.base) + (uintptr(i) * uintptr(inputs.size))) + b := rawptr(uintptr(inputs.base) + (uintptr(j) * uintptr(inputs.size))) + + slice.ptr_swap_non_overlapping(a, b, int(inputs.size)) + }, + }) +} + +@(require, linkage="strong", link_name="atoi") +atoi :: proc "c" (str: cstring) -> i32 { + return i32(atoll(str)) +} + +@(require, linkage="strong", link_name="atol") +atol :: proc "c" (str: cstring) -> c.long { + return c.long(atoll(str)) +} + +@(require, linkage="strong", link_name="atoll") +atoll :: proc "c" (str: cstring) -> c.longlong { + context = g_ctx + + sstr := string(str) + sstr = strings.trim_left_space(sstr) + i, _ := strconv.parse_i64_of_base(sstr, 10) + return c.longlong(i) +} + +@(require, linkage="strong", link_name="atof") +atof :: proc "c" (str: cstring) -> f64 { + context = g_ctx + + sstr := string(str) + sstr = strings.trim_left_space(sstr) + f, _ := strconv.parse_f64(sstr) + return f +} + +@(require, linkage="strong", link_name="strtol") +strtol :: proc "c" (str: cstring, str_end: ^cstring, base: i32) -> c.long { + context = g_ctx + + sstr := string(str) + sstr = strings.trim_left_space(sstr) + + n: int + i, _ := strconv.parse_i64_of_base(sstr, int(base), &n) + str_end ^= cstring(raw_data(sstr)[n:]) + return c.long(clamp(i, i64(min(c.long)), i64(max(c.long)))) +} diff --git a/vendor/libc/string.odin b/vendor/libc/string.odin new file mode 100644 index 000000000..1ab0803da --- /dev/null +++ b/vendor/libc/string.odin @@ -0,0 +1,111 @@ +package odin_libc + +import "base:intrinsics" + +import "core:c" +import "core:strings" +import "core:mem" + +// NOTE: already defined by Odin. +// void *memcpy(void *, const void *, size_t); +// void *memset(void *, int, size_t); + +@(require, linkage="strong", link_name="memcmp") +memcmp :: proc "c" (lhs: [^]byte, rhs: [^]byte, count: uint) -> i32 { + icount := int(count) + assert_contextless(icount >= 0) + return i32(mem.compare(lhs[:icount], rhs[:icount])) +} + +@(require, linkage="strong", link_name="strlen") +strlen :: proc "c" (str: cstring) -> c.ulong { + return c.ulong(len(str)) +} + +@(require, linkage="strong", link_name="strchr") +strchr :: proc "c" (str: cstring, ch: i32) -> cstring { + bch := u8(ch) + sstr := string(str) + if bch == 0 { + return cstring(raw_data(sstr)[len(sstr):]) + } + + idx := strings.index_byte(sstr, bch) + if idx < 0 { + return nil + } + + return cstring(raw_data(sstr)[idx:]) +} + +@(require, linkage="strong", link_name="strrchr") +strrchr :: proc "c" (str: cstring, ch: i32) -> cstring { + bch := u8(ch) + sstr := string(str) + if bch == 0 { + return cstring(raw_data(sstr)[len(sstr):]) + } + + idx := strings.last_index_byte(sstr, bch) + if idx < 0 { + return nil + } + + return cstring(raw_data(sstr)[idx:]) +} + +@(require, linkage="strong", link_name="strncpy") +strncpy :: proc "c" (dst: [^]byte, src: cstring, count: uint) -> cstring { + icount := int(count) + assert_contextless(icount >= 0) + cnt := min(len(src), icount) + intrinsics.mem_copy_non_overlapping(dst, rawptr(src), cnt) + intrinsics.mem_zero(dst, icount-cnt) + return cstring(dst) +} + +@(require, linkage="strong", link_name="strcpy") +strcpy :: proc "c" (dst: [^]byte, src: cstring) -> cstring { + intrinsics.mem_copy_non_overlapping(dst, rawptr(src), len(src)+1) + return cstring(dst) +} + +@(require, linkage="strong", link_name="strcspn") +strcspn :: proc "c" (dst: cstring, src: cstring) -> uint { + context = g_ctx + sdst := string(dst) + idx := strings.index_any(sdst, string(src)) + if idx == -1 { + return len(sdst) + } + return uint(idx) +} + +@(require, linkage="strong", link_name="strncmp") +strncmp :: proc "c" (lhs: cstring, rhs: cstring, count: uint) -> i32 { + icount := int(count) + assert_contextless(icount >= 0) + lhss := strings.string_from_null_terminated_ptr(([^]byte)(lhs), icount) + rhss := strings.string_from_null_terminated_ptr(([^]byte)(rhs), icount) + return i32(strings.compare(lhss, rhss)) +} + +@(require, linkage="strong", link_name="strcmp") +strcmp :: proc "c" (lhs: cstring, rhs: cstring) -> i32 { + return i32(strings.compare(string(lhs), string(rhs))) +} + +@(require, linkage="strong", link_name="strstr") +strstr :: proc "c" (str: cstring, substr: cstring) -> cstring { + if substr == "" { + return str + } + + idx := strings.index(string(str), string(substr)) + if idx < 0 { + return nil + } + + return cstring(([^]byte)(str)[idx:]) +} + diff --git a/vendor/stb/image/stb_image.odin b/vendor/stb/image/stb_image.odin index 828a1c2bd..85d612354 100644 --- a/vendor/stb/image/stb_image.odin +++ b/vendor/stb/image/stb_image.odin @@ -7,6 +7,7 @@ LIB :: ( "../lib/stb_image.lib" when ODIN_OS == .Windows else "../lib/stb_image.a" when ODIN_OS == .Linux else "../lib/darwin/stb_image.a" when ODIN_OS == .Darwin + else "../lib/stb_image_wasm.o" when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else "" ) @@ -15,12 +16,19 @@ when LIB != "" { // The STB libraries are shipped with the compiler on Windows so a Windows specific message should not be needed. #panic("Could not find the compiled STB libraries, they can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/stb/src\"`") } +} +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import stbi "../lib/stb_image_wasm.o" + foreign import stbi { LIB } +} else when LIB != "" { foreign import stbi { LIB } } else { foreign import stbi "system:stb_image" } +NO_STDIO :: ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 + #assert(size_of(c.int) == size_of(b32)) #assert(size_of(b32) == size_of(c.int)) @@ -33,14 +41,48 @@ Io_Callbacks :: struct { eof: proc "c" (user: rawptr) -> c.int, // returns nonzero if we are at end of file/data } +when !NO_STDIO { + @(default_calling_convention="c", link_prefix="stbi_") + foreign stbi { + //////////////////////////////////// + // + // 8-bits-per-channel interface + // + load :: proc(filename: cstring, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]byte --- + load_from_file :: proc(f: ^c.FILE, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]byte --- + + //////////////////////////////////// + // + // 16-bits-per-channel interface + // + load_16 :: proc(filename: cstring, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]u16 --- + load_16_from_file :: proc(f: ^c.FILE, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]u16 --- + + //////////////////////////////////// + // + // float-per-channel interface + // + loadf :: proc(filename: cstring, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]f32 --- + loadf_from_file :: proc(f: ^c.FILE, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]f32 --- + + is_hdr :: proc(filename: cstring) -> c.int --- + is_hdr_from_file :: proc(f: ^c.FILE) -> c.int --- + + // get image dimensions & components without fully decoding + info :: proc(filename: cstring, x, y, comp: ^c.int) -> c.int --- + info_from_file :: proc(f: ^c.FILE, x, y, comp: ^c.int) -> c.int --- + + is_16_bit :: proc(filename: cstring) -> b32 --- + is_16_bit_from_file :: proc(f: ^c.FILE) -> b32 --- + } +} + @(default_calling_convention="c", link_prefix="stbi_") foreign stbi { //////////////////////////////////// // // 8-bits-per-channel interface // - load :: proc(filename: cstring, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]byte --- - load_from_file :: proc(f: ^c.FILE, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]byte --- load_from_memory :: proc(buffer: [^]byte, len: c.int, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]byte --- load_from_callbacks :: proc(clbk: ^Io_Callbacks, user: rawptr, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]byte --- @@ -50,8 +92,6 @@ foreign stbi { // // 16-bits-per-channel interface // - load_16 :: proc(filename: cstring, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]u16 --- - load_16_from_file :: proc(f: ^c.FILE, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]u16 --- load_16_from_memory :: proc(buffer: [^]byte, len: c.int, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]u16 --- load_16_from_callbacks :: proc(clbk: ^Io_Callbacks, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]u16 --- @@ -59,8 +99,6 @@ foreign stbi { // // float-per-channel interface // - loadf :: proc(filename: cstring, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]f32 --- - loadf_from_file :: proc(f: ^c.FILE, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]f32 --- loadf_from_memory :: proc(buffer: [^]byte, len: c.int, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]f32 --- loadf_from_callbacks :: proc(clbk: ^Io_Callbacks, user: rawptr, x, y, channels_in_file: ^c.int, desired_channels: c.int) -> [^]f32 --- @@ -73,9 +111,6 @@ foreign stbi { is_hdr_from_callbacks :: proc(clbk: ^Io_Callbacks, user: rawptr) -> c.int --- is_hdr_from_memory :: proc(buffer: [^]byte, len: c.int) -> c.int --- - is_hdr :: proc(filename: cstring) -> c.int --- - is_hdr_from_file :: proc(f: ^c.FILE) -> c.int --- - // get a VERY brief reason for failure // NOT THREADSAFE failure_reason :: proc() -> cstring --- @@ -84,13 +119,9 @@ foreign stbi { image_free :: proc(retval_from_load: rawptr) --- // get image dimensions & components without fully decoding - info :: proc(filename: cstring, x, y, comp: ^c.int) -> c.int --- - info_from_file :: proc(f: ^c.FILE, x, y, comp: ^c.int) -> c.int --- info_from_memory :: proc(buffer: [^]byte, len: c.int, x, y, comp: ^c.int) -> c.int --- info_from_callbacks :: proc(clbk: ^Io_Callbacks, user: rawptr, x, y, comp: ^c.int) -> c.int --- - is_16_bit :: proc(filename: cstring) -> b32 --- - is_16_bit_from_file :: proc(f: ^c.FILE) -> b32 --- is_16_bit_from_memory :: proc(buffer: [^]byte, len: c.int) -> c.int --- // for image formats that explicitly notate that they have premultiplied alpha, diff --git a/vendor/stb/image/stb_image_resize.odin b/vendor/stb/image/stb_image_resize.odin index e22b587b2..a37c2e243 100644 --- a/vendor/stb/image/stb_image_resize.odin +++ b/vendor/stb/image/stb_image_resize.odin @@ -7,6 +7,7 @@ RESIZE_LIB :: ( "../lib/stb_image_resize.lib" when ODIN_OS == .Windows else "../lib/stb_image_resize.a" when ODIN_OS == .Linux else "../lib/darwin/stb_image_resize.a" when ODIN_OS == .Darwin + else "../lib/stb_image_resize_wasm.o" when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else "" ) @@ -15,7 +16,11 @@ when RESIZE_LIB != "" { // The STB libraries are shipped with the compiler on Windows so a Windows specific message should not be needed. #panic("Could not find the compiled STB libraries, they can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/stb/src\"`") } +} +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import lib "../lib/stb_image_resize_wasm.o" +} else when RESIZE_LIB != "" { foreign import lib { RESIZE_LIB } } else { foreign import lib "system:stb_image_resize" diff --git a/vendor/stb/image/stb_image_wasm.odin b/vendor/stb/image/stb_image_wasm.odin new file mode 100644 index 000000000..77bb44f02 --- /dev/null +++ b/vendor/stb/image/stb_image_wasm.odin @@ -0,0 +1,4 @@ +//+build wasm32, wasm64p32 +package stb_image + +@(require) import _ "vendor:libc" diff --git a/vendor/stb/image/stb_image_write.odin b/vendor/stb/image/stb_image_write.odin index f030f1e28..a0c0b57a0 100644 --- a/vendor/stb/image/stb_image_write.odin +++ b/vendor/stb/image/stb_image_write.odin @@ -7,6 +7,7 @@ WRITE_LIB :: ( "../lib/stb_image_write.lib" when ODIN_OS == .Windows else "../lib/stb_image_write.a" when ODIN_OS == .Linux else "../lib/darwin/stb_image_write.a" when ODIN_OS == .Darwin + else "../lib/stb_image_write_wasm.o" when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else "" ) @@ -15,7 +16,11 @@ when WRITE_LIB != "" { // The STB libraries are shipped with the compiler on Windows so a Windows specific message should not be needed. #panic("Could not find the compiled STB libraries, they can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/stb/src\"`") } +} +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import stbiw "../lib/stb_image_write_wasm.o" +} else when WRITE_LIB != "" { foreign import stbiw { WRITE_LIB } } else { foreign import stbiw "system:stb_image_write" @@ -25,12 +30,6 @@ write_func :: proc "c" (ctx: rawptr, data: rawptr, size: c.int) @(default_calling_convention="c", link_prefix="stbi_") foreign stbiw { - write_png :: proc(filename: cstring, w, h, comp: c.int, data: rawptr, stride_in_bytes: c.int) -> c.int --- - write_bmp :: proc(filename: cstring, w, h, comp: c.int, data: rawptr) -> c.int --- - write_tga :: proc(filename: cstring, w, h, comp: c.int, data: rawptr) -> c.int --- - write_hdr :: proc(filename: cstring, w, h, comp: c.int, data: [^]f32) -> c.int --- - write_jpg :: proc(filename: cstring, w, h, comp: c.int, data: rawptr, quality: c.int /*0..=100*/) -> c.int --- - write_png_to_func :: proc(func: write_func, ctx: rawptr, w, h, comp: c.int, data: rawptr, stride_in_bytes: c.int) -> c.int --- write_bmp_to_func :: proc(func: write_func, ctx: rawptr, w, h, comp: c.int, data: rawptr) -> c.int --- write_tga_to_func :: proc(func: write_func, ctx: rawptr, w, h, comp: c.int, data: rawptr) -> c.int --- @@ -39,3 +38,14 @@ foreign stbiw { flip_vertically_on_write :: proc(flip_boolean: b32) --- } + +when !NO_STDIO { + @(default_calling_convention="c", link_prefix="stbi_") + foreign stbiw { + write_png :: proc(filename: cstring, w, h, comp: c.int, data: rawptr, stride_in_bytes: c.int) -> c.int --- + write_bmp :: proc(filename: cstring, w, h, comp: c.int, data: rawptr) -> c.int --- + write_tga :: proc(filename: cstring, w, h, comp: c.int, data: rawptr) -> c.int --- + write_hdr :: proc(filename: cstring, w, h, comp: c.int, data: [^]f32) -> c.int --- + write_jpg :: proc(filename: cstring, w, h, comp: c.int, data: rawptr, quality: c.int /*0..=100*/) -> c.int --- + } +} diff --git a/vendor/stb/lib/stb_image_resize_wasm.o b/vendor/stb/lib/stb_image_resize_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..1bf91266bf948e08986d6d402f30216ca3f829f5 GIT binary patch literal 27646 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 G?)yIx)!R(~ literal 0 HcmV?d00001 diff --git a/vendor/stb/lib/stb_image_wasm.o b/vendor/stb/lib/stb_image_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..cd7fa31cebc2c011bd3c2185c41d7fb42cab5264 GIT binary patch literal 78144 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%0AIBK9ErKP%v9o@A-s7 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 literal 0 HcmV?d00001 diff --git a/vendor/stb/lib/stb_rect_pack_wasm.o b/vendor/stb/lib/stb_rect_pack_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..fdd6d95d609945116972f99d96a240939a58ca55 GIT binary patch literal 3683 zcma)9O>7&-6`q-$f8 z^Ku-w(soko##_l&r+Z5}_~jz)c_gkBSp=RtEc%^!e$J!!XyY5A(oFM3;g{7RrZ0GO zADZ`>PIEqpcpyk)k&y-SmxJduBh&TnqqnSn^5ulA=q_)Y3jE;e(g|;K!2yH;1G>5>k2)RTu%`;QLVH?aj zC_pxbs=0QeW35K$&I=jlFTo0SZdfRCrCo~8^8orqohJm`P*UJ7LhgK5M(O_uQh5xy#glvD^mx&W;i`q6;0Hjct0EBbg01w;bG z0uS2kprXCd1O*bQ_DGFC48|Cz!y$F=S<#a*b>yV>4G``S2%tBXU*vO`W;gJ_jWcEf z&?!;2u~4>sJ#~=n3bO47Q^-0po&{_|EmB36p*lp@4Z*{DB2;vN=n(+5snS!_4M1yA zNEjp#LYo4E4d6={q8`8<*nmhY;-1p^2C_la(7ObW44aQ6AweWtxmpx(lMI@Mrj|RA z6@-s;?&q(_JPWY6%m2mCzv*H62DM-ZQe{rLlry8#0IMrd2oYVzAjAUiJ*6G$VMmLx zF8<}Hi!lwotdqt5C;%nvWH`0kfcl86JFf#i9@tcXUW78j+&j3t9NKdMY#o^&)Yf7c z2tPVM_D9MQXQ&bV#!2c_fU1@;grk9(*vOb0TAI^B4F_)o#;XMS(ZB#1A_f{cdHukIp`9>P(xz5Z%78 zbgjRszpLvDOSM+I(Iy8;{9~>PyI|8x+4%`q^X<-Bvar-ncKZuUyLw5R`%|ZMM&H#x zxL`<-{)($-pJsduUthOy|Bg`Q^|aeFib#x1zAM!9gbBKMU#QZ!4bZ-R8(26NVVUIrF)2vwii9U@7z2i14Dt1e4Z@ zaW%D8t8+8%?DXT#I(>68DJ$81+D`lUMC@)PeI{+H4ipZRhAEPs@EH@iX;Uzp2Kcz% z+1jpk6ZpWz_a@waI+&6@H*)YL8>tY^@yym?0RzB@^=yt6MyHn@HqV5cdDH2p8)>`N ziaXu4q|3$0|Kp0$?6PM^>dxg^d2~8oVAG@1D~gru4`_IJ^VM!=t=6wqCk!0zFJ2n4 z5>AZ!hY8g)lcX0J|Ne;UND&-P&OvKT=zVEY@7YPx%Zxw&4NYZ@Fk$E1q|)<~q*oYc zpU{jibdy%6UVZgPuU)bi;% z-j6?#pGumM85Q<8T*$f<-H#6Z0iaBR9jnEy~Rr_ovmcGo7~j(R;|5}J9EBzrh1YsdU;wy@Fatkzn+({2v~ZUN)#f5C??=Kufz literal 0 HcmV?d00001 diff --git a/vendor/stb/lib/stb_sprintf_wasm.o b/vendor/stb/lib/stb_sprintf_wasm.o new file mode 100644 index 0000000000000000000000000000000000000000..4c8e140e5dafae0d1dfceb1b455cbb438bec1307 GIT binary patch literal 13793 zcmd5@dwf*Yoj><6b7$selF4KyGh_msJ77g6aq>=h<^~8L^3YOWpV|;Y1STPGXmF7P z5JbiLet{nisKxrItX2iV6>uwRSBumt)@=o)1sAt#tJFue?Du!hoxDJ|b@z{*Fmuj5 z_nh;4zs|j|+V&+1V@!FdyStmY=BZs>Y@Vx&K1$a-H?=FMr^x}G29z%KcQjkq>YJ8j z)YLRCZmO?st65UNq`7Um$`og~y`#3Sp{AvIaZ^Wqo7N?U-I&x~-@!DRGo+?wanpju zZS{2>HCHTcs_R(X+*H$1JHN4BX<@2%9l`K2Mb&f-|GewzT4Ax0!LN$n5n|l#(Hr8fk+Q$%$xswx6i&_Q|jQ`okm-+Fk8-_o~%b zceci}S}{G7s|_~63u%=+3-`smR==uNaz^`wY<-$vHMz=zr7E@`rRr7?qbslkK(SKe zDm9q!O|Y<+Y0~~mt9`~)Ley51RuB|rX_dBWX??Wx^$6c&JPeZJA$wjjJyS6ZRW}UH zFbuE348!F%ZN<{kJf^LqF-+To27|j9T9;{eV`rX)2F%gzZfMKe?Q4{~C9wy#a^}(ExMqd>w)RaI4AZTMX?I!CL8#;d6|OmQ1}Lxx z*ePHtkRYZ;`*!lq5NJmMJ~|M5l;|cjgAzQ+)uBv)CkQ5wSh`RrAuk>w`gBq=6$>Lo zU$mD|DJ-Epf@N{d{+OKyRD;$KjA`~=UCDHp=5cv+1_iZWW>bMQLAQnoT(DqfGF^9j zFoh<30y$`Czn~WCV-0~&u|OqNR`3J-?PIJuhV>Au4p~B~07W;j*@svM=mJ1$rI^ZT zChaJ1L4H`F+QkwdSS{@*CP5#9wwB}qLDeoKSSBAr3ZtEd@IDrNeGdddpCGe`zz)mI za6Xzx^}7r`!%x@gUSCFrLVXjg3fa$Ns-YU`>3X`BZbFh>^gS(+1gI%hJ<>vS?t%6KIS^4T z^nMSkhTZ74k+k8Qa?jFOd}vki`mOfKj8-dT=SdGiQdZjFsfJdu@5bVE1xjr$tX!w= zIhF?4K};l@hxA-r8^eacO$1Hb&7(XF)3>(~tL&Qu!y+*tFtqBV{1|Jjp(HvU0+)cY zy}FYRofC_PfV*@KtKf=5SU~O{AJ5g+Q0NHeMw8^Q?QI_^V;RDk4Jyv_Bd{(2Aw#MPyD(Vc>z+yJ{NXYCPwBsQ&;>583<3SCY#B zkn=H%I0yta1Smu>(gR>0o&k#hI+z9(q0NF^Bc(z^N|ly@a7Xiaa9Rv^Fanp9vdnMd zY|!DX!_n{nc7mos*#2B#3nWRfq?!HP2|R+-x;`I3M(_B50rn3S8-m5i>Y@~g;g@6< zgT@0#*L_H-_Ggm4O8X;2BMwpeGtkOlOvDr+=v?Afh=*s=ED`< z4^59b5!NDYhPeqS#CljCI4X@0HiqqlfL%N%kEO%-usXNFp)z8NKJgc~WwMjv=M_;rShJEd|6$y4EmK1aiH;G;goSLiS#` zcgPDjJt9wa*{ct+u_8F^W%heu2i#50Ky?kqEJ#O#=DW~OHWvLa+vS$1M`7{zI44Ox?jQO+9j zRSlQ`j|#^j01KT2d&#Lw_d_AvGdBk24&7l5lhpummlz)Er4~eVBZz60Rm|ep35)i= zb?#iSWvJ8dj&m`#5?Go%gR-q$h`>o$a{LT(GAO!HkUqkiAhIK@vB6e4>^CWlB+pgY zScOPH;YbeQ2%Dbr_>c=U7-XQ6s`w};LlCw#;#G*;2Mk|CF&PgfARoc;0Sv`j$k0h1 zDA=W@!QvR46-6Z?8BnDE5pyUr;B%0Db89Ft&qb8_yAiMx*jZ)>-vmzLoaDKv2Tg+0 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 literal 0 HcmV?d00001 diff --git a/vendor/stb/lib/stb_truetype_wasm.o b/vendor/stb/lib/stb_truetype_wasm.o index d3380e8a2441184569d910562ff374d9d621d4f0..e545ef8e7f2ae4527168f2c970ef30248bb5fb44 100644 GIT binary patch literal 46482 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 literal 41425 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 a?wfDjd*J3BduPwB% i32 --- + snprintf :: proc(buf: [^]byte, count: i32, fmt: cstring, #c_vararg args: ..any) -> i32 --- + vsprintf :: proc(buf: [^]byte, fmt: cstring, va: c.va_list) -> i32 --- + vsnprintf :: proc(buf: [^]byte, count: i32, fmt: cstring, va: ^c.va_list) -> i32 --- + vsprintfcb :: proc(callback: SPRINTFCB, user: rawptr, buf: [^]byte, fmt: cstring, va: ^c.va_list) -> i32 --- +} + +SPRINTFCB :: #type proc "c" (buf: [^]byte, user: rawptr, len: i32) -> cstring diff --git a/vendor/stb/src/Makefile b/vendor/stb/src/Makefile index b7217d528..194ea5e75 100644 --- a/vendor/stb/src/Makefile +++ b/vendor/stb/src/Makefile @@ -8,17 +8,24 @@ endif wasm: mkdir -p ../lib - $(CC) -c -Os --target=wasm32 -nostdlib stb_truetype_wasm.c -o ../lib/stb_truetype_wasm.o + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_image.c -o ../lib/stb_image_wasm.o -DSTBI_NO_STDIO + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_image_write.c -o ../lib/stb_image_write_wasm.o -DSTBI_WRITE_NO_STDIO + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_image_resize.c -o ../lib/stb_image_resize_wasm.o + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_truetype.c -o ../lib/stb_truetype_wasm.o + # $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_vorbis.c -o ../lib/stb_vorbis_wasm.o -DSTB_VORBIS_NO_STDIO + $(CC) -c -Os --target=wasm32 --sysroot=$(shell odin root)/vendor/libc stb_rect_pack.c -o ../lib/stb_rect_pack_wasm.o + $(CC) -c -Os --target=wasm32 stb_sprintf.c -o ../lib/stb_sprintf_wasm.o unix: mkdir -p ../lib - $(CC) -c -O2 -Os -fPIC stb_image.c stb_image_write.c stb_image_resize.c stb_truetype.c stb_rect_pack.c stb_vorbis.c + $(CC) -c -O2 -Os -fPIC stb_image.c stb_image_write.c stb_image_resize.c stb_truetype.c stb_rect_pack.c stb_vorbis.c stb_sprintf.c $(AR) rcs ../lib/stb_image.a stb_image.o $(AR) rcs ../lib/stb_image_write.a stb_image_write.o $(AR) rcs ../lib/stb_image_resize.a stb_image_resize.o $(AR) rcs ../lib/stb_truetype.a stb_truetype.o $(AR) rcs ../lib/stb_rect_pack.a stb_rect_pack.o $(AR) rcs ../lib/stb_vorbis.a stb_vorbis.o + $(AR) rcs ../lib/stb_sprintf.a stb_sprintf.o #$(CC) -fPIC -shared -Wl,-soname=stb_image.so -o ../lib/stb_image.so stb_image.o #$(CC) -fPIC -shared -Wl,-soname=stb_image_write.so -o ../lib/stb_image_write.so stb_image_write.o #$(CC) -fPIC -shared -Wl,-soname=stb_image_resize.so -o ../lib/stb_image_resize.so stb_image_resize.o @@ -47,4 +54,7 @@ darwin: $(CC) -arch x86_64 -c -O2 -Os -fPIC stb_vorbis.c -o stb_vorbis-x86_64.o -mmacosx-version-min=10.12 $(CC) -arch arm64 -c -O2 -Os -fPIC stb_vorbis.c -o stb_vorbis-arm64.o -mmacosx-version-min=10.12 lipo -create stb_vorbis-x86_64.o stb_vorbis-arm64.o -output ../lib/darwin/stb_vorbis.a + $(CC) -arch x86_64 -c -O2 -Os -fPIC stb_sprintf.c -o stb_sprintf-x86_64.o -mmacosx-version-min=10.12 + $(CC) -arch arm64 -c -O2 -Os -fPIC stb_sprintf.c -o stb_sprintf-arm64.o -mmacosx-version-min=10.12 + lipo -create stb_sprintf-x86_64.o stb_sprintf-arm64.o -output ../lib/darwin/stb_sprintf.a rm *.o diff --git a/vendor/stb/src/stb_sprintf.c b/vendor/stb/src/stb_sprintf.c new file mode 100644 index 000000000..d60a91bae --- /dev/null +++ b/vendor/stb/src/stb_sprintf.c @@ -0,0 +1,2 @@ +#define STB_SPRINTF_IMPLEMENTATION +#include "stb_sprintf.h" diff --git a/vendor/stb/src/stb_sprintf.h b/vendor/stb/src/stb_sprintf.h new file mode 100644 index 000000000..ca432a6bc --- /dev/null +++ b/vendor/stb/src/stb_sprintf.h @@ -0,0 +1,1906 @@ +// stb_sprintf - v1.10 - public domain snprintf() implementation +// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 +// http://github.com/nothings/stb +// +// allowed types: sc uidBboXx p AaGgEef n +// lengths : hh h ll j z t I64 I32 I +// +// Contributors: +// Fabian "ryg" Giesen (reformatting) +// github:aganm (attribute format) +// +// Contributors (bugfixes): +// github:d26435 +// github:trex78 +// github:account-login +// Jari Komppa (SI suffixes) +// Rohit Nirmal +// Marcin Wojdyr +// Leonard Ritter +// Stefano Zanotti +// Adam Allison +// Arvid Gerstmann +// Markus Kolb +// +// LICENSE: +// +// See end of file for license information. + +#ifndef STB_SPRINTF_H_INCLUDE +#define STB_SPRINTF_H_INCLUDE + +/* +Single file sprintf replacement. + +Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. +Hereby placed in public domain. + +This is a full sprintf replacement that supports everything that +the C runtime sprintfs support, including float/double, 64-bit integers, +hex floats, field parameters (%*.*d stuff), length reads backs, etc. + +Why would you need this if sprintf already exists? Well, first off, +it's *much* faster (see below). It's also much smaller than the CRT +versions code-space-wise. We've also added some simple improvements +that are super handy (commas in thousands, callbacks at buffer full, +for example). Finally, the format strings for MSVC and GCC differ +for 64-bit integers (among other small things), so this lets you use +the same format strings in cross platform code. + +It uses the standard single file trick of being both the header file +and the source itself. If you just include it normally, you just get +the header file function definitions. To get the code, you include +it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. + +It only uses va_args macros from the C runtime to do it's work. It +does cast doubles to S64s and shifts and divides U64s, which does +drag in CRT code on most platforms. + +It compiles to roughly 8K with float support, and 4K without. +As a comparison, when using MSVC static libs, calling sprintf drags +in 16K. + +API: +==== +int stbsp_sprintf( char * buf, char const * fmt, ... ) +int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) + Convert an arg list into a buffer. stbsp_snprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) +int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) + Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va ) + typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len ); + Convert into a buffer, calling back every STB_SPRINTF_MIN chars. + Your callback can then copy the chars out, print them or whatever. + This function is actually the workhorse for everything else. + The buffer you pass in must hold at least STB_SPRINTF_MIN characters. + // you return the next buffer to use or 0 to stop converting + +void stbsp_set_separators( char comma, char period ) + Set the comma and period characters to use. + +FLOATS/DOUBLES: +=============== +This code uses a internal float->ascii conversion method that uses +doubles with error correction (double-doubles, for ~105 bits of +precision). This conversion is round-trip perfect - that is, an atof +of the values output here will give you the bit-exact double back. + +One difference is that our insignificant digits will be different than +with MSVC or GCC (but they don't match each other either). We also +don't attempt to find the minimum length matching float (pre-MSVC15 +doesn't either). + +If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT +and you'll save 4K of code space. + +64-BIT INTS: +============ +This library also supports 64-bit integers and you can use MSVC style or +GCC style indicators (%I64d or %lld). It supports the C99 specifiers +for size_t and ptr_diff_t (%jd %zd) as well. + +EXTRAS: +======= +Like some GCCs, for integers and floats, you can use a ' (single quote) +specifier and commas will be inserted on the thousands: "%'d" on 12345 +would print 12,345. + +For integers and floats, you can use a "$" specifier and the number +will be converted to float and then divided to get kilo, mega, giga or +tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is +"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn +2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three +$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the +suffix, add "_" specifier: "%_$d" -> "2.53M". + +In addition to octal and hexadecimal conversions, you can print +integers in binary: "%b" for 256 would print 100. + +PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): +=================================================================== +"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) +"%24d" across all 32-bit ints (4.5x/4.2x faster) +"%x" across all 32-bit ints (4.5x/3.8x faster) +"%08x" across all 32-bit ints (4.3x/3.8x faster) +"%f" across e-10 to e+10 floats (7.3x/6.0x faster) +"%e" across e-10 to e+10 floats (8.1x/6.0x faster) +"%g" across e-10 to e+10 floats (10.0x/7.1x faster) +"%f" for values near e-300 (7.9x/6.5x faster) +"%f" for values near e+300 (10.0x/9.1x faster) +"%e" for values near e-300 (10.1x/7.0x faster) +"%e" for values near e+300 (9.2x/6.0x faster) +"%.320f" for values near e-300 (12.6x/11.2x faster) +"%a" for random values (8.6x/4.3x faster) +"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) +"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) +"%s%s%s" for 64 char strings (7.1x/7.3x faster) +"...512 char string..." ( 35.0x/32.5x faster!) +*/ + +#if defined(__clang__) + #if defined(__has_feature) && defined(__has_attribute) + #if __has_feature(address_sanitizer) + #if __has_attribute(__no_sanitize__) + #define STBSP__ASAN __attribute__((__no_sanitize__("address"))) + #elif __has_attribute(__no_sanitize_address__) + #define STBSP__ASAN __attribute__((__no_sanitize_address__)) + #elif __has_attribute(__no_address_safety_analysis__) + #define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) + #endif + #endif + #endif +#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) + #if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ + #define STBSP__ASAN __attribute__((__no_sanitize_address__)) + #endif +#endif + +#ifndef STBSP__ASAN +#define STBSP__ASAN +#endif + +#ifdef STB_SPRINTF_STATIC +#define STBSP__PUBLICDEC static +#define STBSP__PUBLICDEF static STBSP__ASAN +#else +#ifdef __cplusplus +#define STBSP__PUBLICDEC extern "C" +#define STBSP__PUBLICDEF extern "C" STBSP__ASAN +#else +#define STBSP__PUBLICDEC extern +#define STBSP__PUBLICDEF STBSP__ASAN +#endif +#endif + +#if defined(__has_attribute) + #if __has_attribute(format) + #define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va))) + #endif +#endif + +#ifndef STBSP__ATTRIBUTE_FORMAT +#define STBSP__ATTRIBUTE_FORMAT(fmt,va) +#endif + +#ifdef _MSC_VER +#define STBSP__NOTUSED(v) (void)(v) +#else +#define STBSP__NOTUSED(v) (void)sizeof(v) +#endif + +#include // for va_arg(), va_list() +#include // size_t, ptrdiff_t + +#ifndef STB_SPRINTF_MIN +#define STB_SPRINTF_MIN 512 // how many characters per callback +#endif +typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); + +#ifndef STB_SPRINTF_DECORATE +#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names +#endif + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4); + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period); + +#endif // STB_SPRINTF_H_INCLUDE + +#ifdef STB_SPRINTF_IMPLEMENTATION + +#define stbsp__uint32 unsigned int +#define stbsp__int32 signed int + +#ifdef _MSC_VER +#define stbsp__uint64 unsigned __int64 +#define stbsp__int64 signed __int64 +#else +#define stbsp__uint64 unsigned long long +#define stbsp__int64 signed long long +#endif +#define stbsp__uint16 unsigned short + +#ifndef stbsp__uintptr +#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) +#define stbsp__uintptr stbsp__uint64 +#else +#define stbsp__uintptr stbsp__uint32 +#endif +#endif + +#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC) +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define STB_SPRINTF_MSVC_MODE +#endif +#endif + +#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses +#define STBSP__UNALIGNED(code) +#else +#define STBSP__UNALIGNED(code) code +#endif + +#ifndef STB_SPRINTF_NOFLOAT +// internal float utility functions +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits); +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value); +#define STBSP__SPECIAL 0x7000 +#endif + +static char stbsp__period = '.'; +static char stbsp__comma = ','; +static struct +{ + short temp; // force next field to be 2-byte aligned + char pair[201]; +} stbsp__digitpair = +{ + 0, + "00010203040506070809101112131415161718192021222324" + "25262728293031323334353637383940414243444546474849" + "50515253545556575859606162636465666768697071727374" + "75767778798081828384858687888990919293949596979899" +}; + +STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod) +{ + stbsp__period = pperiod; + stbsp__comma = pcomma; +} + +#define STBSP__LEFTJUST 1 +#define STBSP__LEADINGPLUS 2 +#define STBSP__LEADINGSPACE 4 +#define STBSP__LEADING_0X 8 +#define STBSP__LEADINGZERO 16 +#define STBSP__INTMAX 32 +#define STBSP__TRIPLET_COMMA 64 +#define STBSP__NEGATIVE 128 +#define STBSP__METRIC_SUFFIX 256 +#define STBSP__HALFWIDTH 512 +#define STBSP__METRIC_NOSPACE 1024 +#define STBSP__METRIC_1024 2048 +#define STBSP__METRIC_JEDEC 4096 + +static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) +{ + sign[0] = 0; + if (fl & STBSP__NEGATIVE) { + sign[0] = 1; + sign[1] = '-'; + } else if (fl & STBSP__LEADINGSPACE) { + sign[0] = 1; + sign[1] = ' '; + } else if (fl & STBSP__LEADINGPLUS) { + sign[0] = 1; + sign[1] = '+'; + } +} + +static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit) +{ + char const * sn = s; + + // get up to 4-byte alignment + for (;;) { + if (((stbsp__uintptr)sn & 3) == 0) + break; + + if (!limit || *sn == 0) + return (stbsp__uint32)(sn - s); + + ++sn; + --limit; + } + + // scan over 4 bytes at a time to find terminating 0 + // this will intentionally scan up to 3 bytes past the end of buffers, + // but becase it works 4B aligned, it will never cross page boundaries + // (hence the STBSP__ASAN markup; the over-read here is intentional + // and harmless) + while (limit >= 4) { + stbsp__uint32 v = *(stbsp__uint32 *)sn; + // bit hack to find if there's a 0 byte in there + if ((v - 0x01010101) & (~v) & 0x80808080UL) + break; + + sn += 4; + limit -= 4; + } + + // handle the last few characters to find actual size + while (limit && *sn) { + ++sn; + --limit; + } + + return (stbsp__uint32)(sn - s); +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va) +{ + static char hex[] = "0123456789abcdefxp"; + static char hexu[] = "0123456789ABCDEFXP"; + char *bf; + char const *f; + int tlen = 0; + + bf = buf; + f = fmt; + for (;;) { + stbsp__int32 fw, pr, tz; + stbsp__uint32 fl; + + // macros for the callback buffer stuff + #define stbsp__chk_cb_bufL(bytes) \ + { \ + int len = (int)(bf - buf); \ + if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ + tlen += len; \ + if (0 == (bf = buf = callback(buf, user, len))) \ + goto done; \ + } \ + } + #define stbsp__chk_cb_buf(bytes) \ + { \ + if (callback) { \ + stbsp__chk_cb_bufL(bytes); \ + } \ + } + #define stbsp__flush_cb() \ + { \ + stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ + } // flush if there is even one byte in the buffer + #define stbsp__cb_buf_clamp(cl, v) \ + cl = v; \ + if (callback) { \ + int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ + if (cl > lg) \ + cl = lg; \ + } + + // fast copy everything up to the next % (or end of string) + for (;;) { + while (((stbsp__uintptr)f) & 3) { + schk1: + if (f[0] == '%') + goto scandd; + schk2: + if (f[0] == 0) + goto endfmt; + stbsp__chk_cb_buf(1); + *bf++ = f[0]; + ++f; + } + for (;;) { + // Check if the next 4 bytes contain %(0x25) or end of string. + // Using the 'hasless' trick: + // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord + stbsp__uint32 v, c; + v = *(stbsp__uint32 *)f; + c = (~v) & 0x80808080; + if (((v ^ 0x25252525) - 0x01010101) & c) + goto schk1; + if ((v - 0x01010101) & c) + goto schk2; + if (callback) + if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) + goto schk1; + #ifdef STB_SPRINTF_NOUNALIGNED + if(((stbsp__uintptr)bf) & 3) { + bf[0] = f[0]; + bf[1] = f[1]; + bf[2] = f[2]; + bf[3] = f[3]; + } else + #endif + { + *(stbsp__uint32 *)bf = v; + } + bf += 4; + f += 4; + } + } + scandd: + + ++f; + + // ok, we have a percent, read the modifiers first + fw = 0; + pr = -1; + fl = 0; + tz = 0; + + // flags + for (;;) { + switch (f[0]) { + // if we have left justify + case '-': + fl |= STBSP__LEFTJUST; + ++f; + continue; + // if we have leading plus + case '+': + fl |= STBSP__LEADINGPLUS; + ++f; + continue; + // if we have leading space + case ' ': + fl |= STBSP__LEADINGSPACE; + ++f; + continue; + // if we have leading 0x + case '#': + fl |= STBSP__LEADING_0X; + ++f; + continue; + // if we have thousand commas + case '\'': + fl |= STBSP__TRIPLET_COMMA; + ++f; + continue; + // if we have kilo marker (none->kilo->kibi->jedec) + case '$': + if (fl & STBSP__METRIC_SUFFIX) { + if (fl & STBSP__METRIC_1024) { + fl |= STBSP__METRIC_JEDEC; + } else { + fl |= STBSP__METRIC_1024; + } + } else { + fl |= STBSP__METRIC_SUFFIX; + } + ++f; + continue; + // if we don't want space between metric suffix and number + case '_': + fl |= STBSP__METRIC_NOSPACE; + ++f; + continue; + // if we have leading zero + case '0': + fl |= STBSP__LEADINGZERO; + ++f; + goto flags_done; + default: goto flags_done; + } + } + flags_done: + + // get the field width + if (f[0] == '*') { + fw = va_arg(va, stbsp__uint32); + ++f; + } else { + while ((f[0] >= '0') && (f[0] <= '9')) { + fw = fw * 10 + f[0] - '0'; + f++; + } + } + // get the precision + if (f[0] == '.') { + ++f; + if (f[0] == '*') { + pr = va_arg(va, stbsp__uint32); + ++f; + } else { + pr = 0; + while ((f[0] >= '0') && (f[0] <= '9')) { + pr = pr * 10 + f[0] - '0'; + f++; + } + } + } + + // handle integer size overrides + switch (f[0]) { + // are we halfwidth? + case 'h': + fl |= STBSP__HALFWIDTH; + ++f; + if (f[0] == 'h') + ++f; // QUARTERWIDTH + break; + // are we 64-bit (unix style) + case 'l': + fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); + ++f; + if (f[0] == 'l') { + fl |= STBSP__INTMAX; + ++f; + } + break; + // are we 64-bit on intmax? (c99) + case 'j': + fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit on size_t or ptrdiff_t? (c99) + case 'z': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + case 't': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit (msft style) + case 'I': + if ((f[1] == '6') && (f[2] == '4')) { + fl |= STBSP__INTMAX; + f += 3; + } else if ((f[1] == '3') && (f[2] == '2')) { + f += 3; + } else { + fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); + ++f; + } + break; + default: break; + } + + // handle each replacement + switch (f[0]) { + #define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 + char num[STBSP__NUMSZ]; + char lead[8]; + char tail[8]; + char *s; + char const *h; + stbsp__uint32 l, n, cs; + stbsp__uint64 n64; +#ifndef STB_SPRINTF_NOFLOAT + double fv; +#endif + stbsp__int32 dp; + char const *sn; + + case 's': + // get the string + s = va_arg(va, char *); + if (s == 0) + s = (char *)"null"; + // get the length, limited to desired precision + // always limit to ~0u chars since our counts are 32b + l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + // copy the string in + goto scopy; + + case 'c': // char + // get the character + s = num + STBSP__NUMSZ - 1; + *s = (char)va_arg(va, int); + l = 1; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + + case 'n': // weird write-bytes specifier + { + int *d = va_arg(va, int *); + *d = tlen + (int)(bf - buf); + } break; + +#ifdef STB_SPRINTF_NOFLOAT + case 'A': // float + case 'a': // hex float + case 'G': // float + case 'g': // float + case 'E': // float + case 'e': // float + case 'f': // float + va_arg(va, double); // eat it + s = (char *)"No float"; + l = 8; + lead[0] = 0; + tail[0] = 0; + pr = 0; + cs = 0; + STBSP__NOTUSED(dp); + goto scopy; +#else + case 'A': // hex float + case 'a': // hex float + h = (f[0] == 'A') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) + fl |= STBSP__NEGATIVE; + + s = num + 64; + + stbsp__lead_sign(fl, lead); + + if (dp == -1023) + dp = (n64) ? -1022 : 0; + else + n64 |= (((stbsp__uint64)1) << 52); + n64 <<= (64 - 56); + if (pr < 15) + n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); +// add leading chars + +#ifdef STB_SPRINTF_MSVC_MODE + *s++ = '0'; + *s++ = 'x'; +#else + lead[1 + lead[0]] = '0'; + lead[2 + lead[0]] = 'x'; + lead[0] += 2; +#endif + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + if (pr) + *s++ = stbsp__period; + sn = s; + + // print the bits + n = pr; + if (n > 13) + n = 13; + if (pr > (stbsp__int32)n) + tz = pr - n; + pr = 0; + while (n--) { + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + } + + // print the expo + tail[1] = h[17]; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; + n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + + dp = (int)(s - sn); + l = (int)(s - (num + 64)); + s = num + 64; + cs = 1 + (3 << 24); + goto scopy; + + case 'G': // float + case 'g': // float + h = (f[0] == 'G') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; + else if (pr == 0) + pr = 1; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) + fl |= STBSP__NEGATIVE; + + // clamp the precision and delete extra zeros after clamp + n = pr; + if (l > (stbsp__uint32)pr) + l = pr; + while ((l > 1) && (pr) && (sn[l - 1] == '0')) { + --pr; + --l; + } + + // should we use %e + if ((dp <= -4) || (dp > (stbsp__int32)n)) { + if (pr > (stbsp__int32)l) + pr = l - 1; + else if (pr) + --pr; // when using %e, there is one digit before the decimal + goto doexpfromg; + } + // this is the insane action to get the pr to match %g semantics for %f + if (dp > 0) { + pr = (dp < (stbsp__int32)l) ? l - dp : 0; + } else { + pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr); + } + goto dofloatfromg; + + case 'E': // float + case 'e': // float + h = (f[0] == 'E') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) + fl |= STBSP__NEGATIVE; + doexpfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + // handle leading chars + *s++ = sn[0]; + + if (pr) + *s++ = stbsp__period; + + // handle after decimal + if ((l - 1) > (stbsp__uint32)pr) + l = pr + 1; + for (n = 1; n < l; n++) + *s++ = sn[n]; + // trailing zeros + tz = pr - (l - 1); + pr = 0; + // dump expo + tail[1] = h[0xe]; + dp -= 1; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; +#ifdef STB_SPRINTF_MSVC_MODE + n = 5; +#else + n = (dp >= 100) ? 5 : 4; +#endif + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + cs = 1 + (3 << 24); // how many tens + goto flt_lead; + + case 'f': // float + fv = va_arg(va, double); + doafloat: + // do kilos + if (fl & STBSP__METRIC_SUFFIX) { + double divisor; + divisor = 1000.0f; + if (fl & STBSP__METRIC_1024) + divisor = 1024.0; + while (fl < 0x4000000) { + if ((fv < divisor) && (fv > -divisor)) + break; + fv /= divisor; + fl += 0x1000000; + } + } + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) + fl |= STBSP__NEGATIVE; + dofloatfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + + // handle the three decimal varieties + if (dp <= 0) { + stbsp__int32 i; + // handle 0.000*000xxxx + *s++ = '0'; + if (pr) + *s++ = stbsp__period; + n = -dp; + if ((stbsp__int32)n > pr) + n = pr; + i = n; + while (i) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + i -= 4; + } + while (i) { + *s++ = '0'; + --i; + } + if ((stbsp__int32)(l + n) > pr) + l = pr - n; + i = l; + while (i) { + *s++ = *sn++; + --i; + } + tz = pr - (n + l); + cs = 1 + (3 << 24); // how many tens did we write (for commas below) + } else { + cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; + if ((stbsp__uint32)dp >= l) { + // handle xxxx000*000.0 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= l) + break; + } + } + if (n < (stbsp__uint32)dp) { + n = dp - n; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (n) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --n; + } + while (n >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + n -= 4; + } + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = '0'; + --n; + } + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) { + *s++ = stbsp__period; + tz = pr; + } + } else { + // handle xxxxx.xxxx000*000 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= (stbsp__uint32)dp) + break; + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) + *s++ = stbsp__period; + if ((l - dp) > (stbsp__uint32)pr) + l = pr + dp; + while (n < l) { + *s++ = sn[n]; + ++n; + } + tz = pr - (l - dp); + } + } + pr = 0; + + // handle k,m,g,t + if (fl & STBSP__METRIC_SUFFIX) { + char idx; + idx = 1; + if (fl & STBSP__METRIC_NOSPACE) + idx = 0; + tail[0] = idx; + tail[1] = ' '; + { + if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. + if (fl & STBSP__METRIC_1024) + tail[idx + 1] = "_KMGT"[fl >> 24]; + else + tail[idx + 1] = "_kMGT"[fl >> 24]; + idx++; + // If printing kibits and not in jedec, add the 'i'. + if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { + tail[idx + 1] = 'i'; + idx++; + } + tail[0] = idx; + } + } + }; + + flt_lead: + // get the length that we copied + l = (stbsp__uint32)(s - (num + 64)); + s = num + 64; + goto scopy; +#endif + + case 'B': // upper binary + case 'b': // lower binary + h = (f[0] == 'B') ? hexu : hex; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[0xb]; + } + l = (8 << 4) | (1 << 8); + goto radixnum; + + case 'o': // octal + h = hexu; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 1; + lead[1] = '0'; + } + l = (3 << 4) | (3 << 8); + goto radixnum; + + case 'p': // pointer + fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; + pr = sizeof(void *) * 2; + fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros + // fall through - to X + + case 'X': // upper hex + case 'x': // lower hex + h = (f[0] == 'X') ? hexu : hex; + l = (4 << 4) | (4 << 8); + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[16]; + } + radixnum: + // get the number + if (fl & STBSP__INTMAX) + n64 = va_arg(va, stbsp__uint64); + else + n64 = va_arg(va, stbsp__uint32); + + s = num + STBSP__NUMSZ; + dp = 0; + // clear tail, and clear leading if value is zero + tail[0] = 0; + if (n64 == 0) { + lead[0] = 0; + if (pr == 0) { + l = 0; + cs = 0; + goto scopy; + } + } + // convert to string + for (;;) { + *--s = h[n64 & ((1 << (l >> 8)) - 1)]; + n64 >>= (l >> 8); + if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) + break; + if (fl & STBSP__TRIPLET_COMMA) { + ++l; + if ((l & 15) == ((l >> 4) & 15)) { + l &= ~15; + *--s = stbsp__comma; + } + } + }; + // get the tens and the comma pos + cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + // copy it + goto scopy; + + case 'u': // unsigned + case 'i': + case 'd': // integer + // get the integer and abs it + if (fl & STBSP__INTMAX) { + stbsp__int64 i64 = va_arg(va, stbsp__int64); + n64 = (stbsp__uint64)i64; + if ((f[0] != 'u') && (i64 < 0)) { + n64 = (stbsp__uint64)-i64; + fl |= STBSP__NEGATIVE; + } + } else { + stbsp__int32 i = va_arg(va, stbsp__int32); + n64 = (stbsp__uint32)i; + if ((f[0] != 'u') && (i < 0)) { + n64 = (stbsp__uint32)-i; + fl |= STBSP__NEGATIVE; + } + } + +#ifndef STB_SPRINTF_NOFLOAT + if (fl & STBSP__METRIC_SUFFIX) { + if (n64 < 1024) + pr = 0; + else if (pr == -1) + pr = 1; + fv = (double)(stbsp__int64)n64; + goto doafloat; + } +#endif + + // convert to string + s = num + STBSP__NUMSZ; + l = 0; + + for (;;) { + // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators) + char *o = s - 8; + if (n64 >= 100000000) { + n = (stbsp__uint32)(n64 % 100000000); + n64 /= 100000000; + } else { + n = (stbsp__uint32)n64; + n64 = 0; + } + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + do { + s -= 2; + *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + } while (n); + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = (char)(n % 10) + '0'; + n /= 10; + } + } + if (n64 == 0) { + if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) + ++s; + break; + } + while (s != o) + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = '0'; + } + } + + tail[0] = 0; + stbsp__lead_sign(fl, lead); + + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + if (l == 0) { + *--s = '0'; + l = 1; + } + cs = l + (3 << 24); + if (pr < 0) + pr = 0; + + scopy: + // get fw=leading/trailing space, pr=leading zeros + if (pr < (stbsp__int32)l) + pr = l; + n = pr + lead[0] + tail[0] + tz; + if (fw < (stbsp__int32)n) + fw = n; + fw -= n; + pr -= l; + + // handle right justify and leading zeros + if ((fl & STBSP__LEFTJUST) == 0) { + if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr + { + pr = (fw > pr) ? fw : pr; + fw = 0; + } else { + fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas + } + } + + // copy the spaces and/or zeros + if (fw + pr) { + stbsp__int32 i; + stbsp__uint32 c; + + // copy leading spaces (or when doing %8.4d stuff) + if ((fl & STBSP__LEFTJUST) == 0) + while (fw > 0) { + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = ' '; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leader + sn = lead + 1; + while (lead[0]) { + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leading zeros + c = cs >> 24; + cs &= 0xffffff; + cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0; + while (pr > 0) { + stbsp__cb_buf_clamp(i, pr); + pr -= i; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + } + while (i) { + if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { + cs = 0; + *bf++ = stbsp__comma; + } else + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + } + + // copy leader if there is still one + sn = lead + 1; + while (lead[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy the string + n = l; + while (n) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, n); + n -= i; + STBSP__UNALIGNED(while (i >= 4) { + *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; + bf += 4; + s += 4; + i -= 4; + }) + while (i) { + *bf++ = *s++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy trailing zeros + while (tz) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tz); + tz -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy tail if there is one + sn = tail + 1; + while (tail[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tail[0]); + tail[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // handle the left justify + if (fl & STBSP__LEFTJUST) + if (fw > 0) { + while (fw) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i--) + *bf++ = ' '; + stbsp__chk_cb_buf(1); + } + } + break; + + default: // unknown, just copy code + s = num + STBSP__NUMSZ - 1; + *s = f[0]; + l = 1; + fw = fl = 0; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + } + ++f; + } +endfmt: + + if (!callback) + *bf = 0; + else + stbsp__flush_cb(); + +done: + return tlen + (int)(bf - buf); +} + +// cleanup +#undef STBSP__LEFTJUST +#undef STBSP__LEADINGPLUS +#undef STBSP__LEADINGSPACE +#undef STBSP__LEADING_0X +#undef STBSP__LEADINGZERO +#undef STBSP__INTMAX +#undef STBSP__TRIPLET_COMMA +#undef STBSP__NEGATIVE +#undef STBSP__METRIC_SUFFIX +#undef STBSP__NUMSZ +#undef stbsp__chk_cb_bufL +#undef stbsp__chk_cb_buf +#undef stbsp__flush_cb +#undef stbsp__cb_buf_clamp + +// ============================================================================ +// wrapper functions + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); + va_end(va); + return result; +} + +typedef struct stbsp__context { + char *buf; + int count; + int length; + char tmp[STB_SPRINTF_MIN]; +} stbsp__context; + +static char *stbsp__clamp_callback(const char *buf, void *user, int len) +{ + stbsp__context *c = (stbsp__context *)user; + c->length += len; + + if (len > c->count) + len = c->count; + + if (len) { + if (buf != c->buf) { + const char *s, *se; + char *d; + d = c->buf; + s = buf; + se = buf + len; + do { + *d++ = *s++; + } while (s < se); + } + c->buf += len; + c->count -= len; + } + + if (c->count <= 0) + return c->tmp; + return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can +} + +static char * stbsp__count_clamp_callback( const char * buf, void * user, int len ) +{ + stbsp__context * c = (stbsp__context*)user; + (void) sizeof(buf); + + c->length += len; + return c->tmp; // go direct into buffer if you can +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) +{ + stbsp__context c; + + if ( (count == 0) && !buf ) + { + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); + } + else + { + int l; + + c.buf = buf; + c.count = count; + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); + + // zero-terminate + l = (int)( c.buf - buf ); + if ( l >= count ) // should never be greater, only equal (or less) than count + l = count - 1; + buf[l] = 0; + } + + return c.length; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + + result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); + va_end(va); + + return result; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va) +{ + return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); +} + +// ======================================================================= +// low level float utility functions + +#ifndef STB_SPRINTF_NOFLOAT + +// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) +#define STBSP__COPYFP(dest, src) \ + { \ + int cn; \ + for (cn = 0; cn < 8; cn++) \ + ((char *)&dest)[cn] = ((char *)&src)[cn]; \ + } + +// get float info +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value) +{ + double d; + stbsp__int64 b = 0; + + // load value and round at the frac_digits + d = value; + + STBSP__COPYFP(b, d); + + *bits = b & ((((stbsp__uint64)1) << 52) - 1); + *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); + + return (stbsp__int32)((stbsp__uint64) b >> 63); +} + +static double const stbsp__bot[23] = { + 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011, + 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022 +}; +static double const stbsp__negbot[22] = { + 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011, + 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022 +}; +static double const stbsp__negboterr[22] = { + -5.551115123125783e-018, -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023, + 4.5251888174113739e-024, -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028, 2.0113352370744385e-029, + -3.0373745563400371e-030, 1.1806906454401013e-032, -7.7705399876661076e-032, 2.0902213275965398e-033, -7.1542424054621921e-034, -7.1542424054621926e-035, + 2.4754073164739869e-036, 5.4846728545790429e-037, 9.2462547772103625e-038, -4.8596774326570872e-039 +}; +static double const stbsp__top[13] = { + 1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299 +}; +static double const stbsp__negtop[13] = { + 1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299 +}; +static double const stbsp__toperr[13] = { + 8388608, + 6.8601809640529717e+028, + -7.253143638152921e+052, + -4.3377296974619174e+075, + -1.5559416129466825e+098, + -3.2841562489204913e+121, + -3.7745893248228135e+144, + -1.7356668416969134e+167, + -3.8893577551088374e+190, + -9.9566444326005119e+213, + 6.3641293062232429e+236, + -5.2069140800249813e+259, + -5.2504760255204387e+282 +}; +static double const stbsp__negtoperr[13] = { + 3.9565301985100693e-040, -2.299904345391321e-063, 3.6506201437945798e-086, 1.1875228833981544e-109, + -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178, -5.7778912386589953e-201, + 7.4997100559334532e-224, -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293, + 8.0970921678014997e-317 +}; + +#if defined(_MSC_VER) && (_MSC_VER <= 1200) +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000U +}; +#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) +#else +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000ULL, + 100000000000ULL, + 1000000000000ULL, + 10000000000000ULL, + 100000000000000ULL, + 1000000000000000ULL, + 10000000000000000ULL, + 100000000000000000ULL, + 1000000000000000000ULL, + 10000000000000000000ULL +}; +#define stbsp__tento19th (1000000000000000000ULL) +#endif + +#define stbsp__ddmulthi(oh, ol, xh, yh) \ + { \ + double ahi = 0, alo, bhi = 0, blo; \ + stbsp__int64 bt; \ + oh = xh * yh; \ + STBSP__COPYFP(bt, xh); \ + bt &= ((~(stbsp__uint64)0) << 27); \ + STBSP__COPYFP(ahi, bt); \ + alo = xh - ahi; \ + STBSP__COPYFP(bt, yh); \ + bt &= ((~(stbsp__uint64)0) << 27); \ + STBSP__COPYFP(bhi, bt); \ + blo = yh - bhi; \ + ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ + } + +#define stbsp__ddtoS64(ob, xh, xl) \ + { \ + double ahi = 0, alo, vh, t; \ + ob = (stbsp__int64)xh; \ + vh = (double)ob; \ + ahi = (xh - vh); \ + t = (ahi - xh); \ + alo = (xh - (ahi - t)) - (vh + t); \ + ob += (stbsp__int64)(ahi + alo + xl); \ + } + +#define stbsp__ddrenorm(oh, ol) \ + { \ + double s; \ + s = oh + ol; \ + ol = ol - (s - oh); \ + oh = s; \ + } + +#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); + +#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); + +static void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350 +{ + double ph, pl; + if ((power >= 0) && (power <= 22)) { + stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); + } else { + stbsp__int32 e, et, eb; + double p2h, p2l; + + e = power; + if (power < 0) + e = -e; + et = (e * 0x2c9) >> 14; /* %23 */ + if (et > 13) + et = 13; + eb = e - (et * 23); + + ph = d; + pl = 0.0; + if (power < 0) { + if (eb) { + --eb; + stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); + stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]); + ph = p2h; + pl = p2l; + } + } else { + if (eb) { + e = eb; + if (eb > 22) + eb = 22; + e -= eb; + stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); + if (e) { + stbsp__ddrenorm(ph, pl); + stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); + stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); + ph = p2h; + pl = p2l; + } + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); + ph = p2h; + pl = p2l; + } + } + } + stbsp__ddrenorm(ph, pl); + *ohi = ph; + *olo = pl; +} + +// given a float value, returns the significant bits in bits, and the position of the +// decimal point in decimal_pos. +/-INF and NAN are specified by special values +// returned in the decimal_pos parameter. +// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000 +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits) +{ + double d; + stbsp__int64 bits = 0; + stbsp__int32 expo, e, ng, tens; + + d = value; + STBSP__COPYFP(bits, d); + expo = (stbsp__int32)((bits >> 52) & 2047); + ng = (stbsp__int32)((stbsp__uint64) bits >> 63); + if (ng) + d = -d; + + if (expo == 2047) // is nan or inf? + { + *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; + *decimal_pos = STBSP__SPECIAL; + *len = 3; + return ng; + } + + if (expo == 0) // is zero or denormal + { + if (((stbsp__uint64) bits << 1) == 0) // do zero + { + *decimal_pos = 1; + *start = out; + out[0] = '0'; + *len = 1; + return ng; + } + // find the right expo for denormals + { + stbsp__int64 v = ((stbsp__uint64)1) << 51; + while ((bits & v) == 0) { + --expo; + v >>= 1; + } + } + } + + // find the decimal exponent as well as the decimal bits of the value + { + double ph, pl; + + // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046 + tens = expo - 1023; + tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); + + // move the significant bits into position and stick them into an int + stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); + + // get full as much precision from double-double as possible + stbsp__ddtoS64(bits, ph, pl); + + // check if we undershot + if (((stbsp__uint64)bits) >= stbsp__tento19th) + ++tens; + } + + // now do the rounding in integer land + frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits); + if ((frac_digits < 24)) { + stbsp__uint32 dg = 1; + if ((stbsp__uint64)bits >= stbsp__powten[9]) + dg = 10; + while ((stbsp__uint64)bits >= stbsp__powten[dg]) { + ++dg; + if (dg == 20) + goto noround; + } + if (frac_digits < dg) { + stbsp__uint64 r; + // add 0.5 at the right position and round + e = dg - frac_digits; + if ((stbsp__uint32)e >= 24) + goto noround; + r = stbsp__powten[e]; + bits = bits + (r / 2); + if ((stbsp__uint64)bits >= stbsp__powten[dg]) + ++tens; + bits /= r; + } + noround:; + } + + // kill long trailing runs of zeros + if (bits) { + stbsp__uint32 n; + for (;;) { + if (bits <= 0xffffffff) + break; + if (bits % 1000) + goto donez; + bits /= 1000; + } + n = (stbsp__uint32)bits; + while ((n % 1000) == 0) + n /= 1000; + bits = n; + donez:; + } + + // convert to string + out += 64; + e = 0; + for (;;) { + stbsp__uint32 n; + char *o = out - 8; + // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned) + if (bits >= 100000000) { + n = (stbsp__uint32)(bits % 100000000); + bits /= 100000000; + } else { + n = (stbsp__uint32)bits; + bits = 0; + } + while (n) { + out -= 2; + *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + e += 2; + } + if (bits == 0) { + if ((e) && (out[0] == '0')) { + ++out; + --e; + } + break; + } + while (out != o) { + *--out = '0'; + ++e; + } + } + + *decimal_pos = tens; + *start = out; + *len = e; + return ng; +} + +#undef stbsp__ddmulthi +#undef stbsp__ddrenorm +#undef stbsp__ddmultlo +#undef stbsp__ddmultlos +#undef STBSP__SPECIAL +#undef STBSP__COPYFP + +#endif // STB_SPRINTF_NOFLOAT + +// clean up +#undef stbsp__uint16 +#undef stbsp__uint32 +#undef stbsp__int32 +#undef stbsp__uint64 +#undef stbsp__int64 +#undef STBSP__UNALIGNED + +#endif // STB_SPRINTF_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/vendor/stb/src/stb_truetype_wasm.c b/vendor/stb/src/stb_truetype_wasm.c deleted file mode 100644 index e0b1fdc77..000000000 --- a/vendor/stb/src/stb_truetype_wasm.c +++ /dev/null @@ -1,46 +0,0 @@ -#include - -void *stbtt_malloc(size_t size); -void stbtt_free(void *ptr); - -void stbtt_qsort(void* base, size_t num, size_t size, int (*compare)(const void*, const void*)); - -double stbtt_floor(double x); -double stbtt_ceil(double x); -double stbtt_sqrt(double x); -double stbtt_pow(double x, double y); -double stbtt_fmod(double x, double y); -double stbtt_cos(double x); -double stbtt_acos(double x); -double stbtt_fabs(double x); - -unsigned long stbtt_strlen(const char *str); - -void *memcpy(void *dst, const void *src, size_t count); -void *memset(void *dst, int x, size_t count); - -#define STBRP_SORT stbtt_qsort -#define STBRP_ASSERT(condition) ((void)0) - -#define STBTT_malloc(x,u) ((void)(u),stbtt_malloc(x)) -#define STBTT_free(x,u) ((void)(u),stbtt_free(x)) - -#define STBTT_assert(condition) ((void)0) - -#define STBTT_ifloor(x) ((int) stbtt_floor(x)) -#define STBTT_iceil(x) ((int) stbtt_ceil(x)) -#define STBTT_sqrt(x) stbtt_sqrt(x) -#define STBTT_pow(x,y) stbtt_pow(x,y) -#define STBTT_fmod(x,y) stbtt_fmod(x,y) -#define STBTT_cos(x) stbtt_cos(x) -#define STBTT_acos(x) stbtt_acos(x) -#define STBTT_fabs(x) stbtt_fabs(x) -#define STBTT_strlen(x) stbtt_strlen(x) -#define STBTT_memcpy memcpy -#define STBTT_memset memset - -#define STB_RECT_PACK_IMPLEMENTATION -#include "stb_rect_pack.h" - -#define STB_TRUETYPE_IMPLEMENTATION -#include "stb_truetype.h" diff --git a/vendor/stb/truetype/stb_truetype.odin b/vendor/stb/truetype/stb_truetype.odin index e6defff5f..f1dcdf2a2 100644 --- a/vendor/stb/truetype/stb_truetype.odin +++ b/vendor/stb/truetype/stb_truetype.odin @@ -8,6 +8,7 @@ LIB :: ( "../lib/stb_truetype.lib" when ODIN_OS == .Windows else "../lib/stb_truetype.a" when ODIN_OS == .Linux else "../lib/darwin/stb_truetype.a" when ODIN_OS == .Darwin + else "../lib/stb_truetype_wasm.o" when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else "" ) @@ -15,10 +16,12 @@ when LIB != "" { when !#exists(LIB) { #panic("Could not find the compiled STB libraries, they can be compiled by running `make -C \"" + ODIN_ROOT + "vendor/stb/src\"`") } +} - foreign import stbtt { LIB } -} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { +when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { foreign import stbtt "../lib/stb_truetype_wasm.o" +} else when LIB != "" { + foreign import stbtt { LIB } } else { foreign import stbtt "system:stb_truetype" } diff --git a/vendor/stb/truetype/stb_truetype_wasm.odin b/vendor/stb/truetype/stb_truetype_wasm.odin index 472419ccb..d15f29f18 100644 --- a/vendor/stb/truetype/stb_truetype_wasm.odin +++ b/vendor/stb/truetype/stb_truetype_wasm.odin @@ -1,82 +1,4 @@ //+build wasm32, wasm64p32 package stb_truetype -import "base:builtin" -import "base:intrinsics" -import "base:runtime" - -import "core:c" -import "core:math" -import "core:slice" -import "core:sort" - -@(require, linkage="strong", link_name="stbtt_malloc") -malloc :: proc "c" (size: uint) -> rawptr { - context = runtime.default_context() - ptr, _ := runtime.mem_alloc_non_zeroed(int(size)) - return raw_data(ptr) -} - -@(require, linkage="strong", link_name="stbtt_free") -free :: proc "c" (ptr: rawptr) { - context = runtime.default_context() - builtin.free(ptr) -} - -@(require, linkage="strong", link_name="stbtt_qsort") -qsort :: proc "c" (base: rawptr, num: uint, size: uint, cmp: proc "c" (a, b: rawptr) -> i32) { - context = runtime.default_context() - - Inputs :: struct { - base: rawptr, - num: uint, - size: uint, - cmp: proc "c" (a, b: rawptr) -> i32, - } - - sort.sort({ - collection = &Inputs{base, num, size, cmp}, - len = proc(it: sort.Interface) -> int { - inputs := (^Inputs)(it.collection) - return int(inputs.num) - }, - less = proc(it: sort.Interface, i, j: int) -> bool { - inputs := (^Inputs)(it.collection) - a := rawptr(uintptr(inputs.base) + (uintptr(i) * uintptr(inputs.size))) - b := rawptr(uintptr(inputs.base) + (uintptr(j) * uintptr(inputs.size))) - return inputs.cmp(a, b) < 0 - }, - swap = proc(it: sort.Interface, i, j: int) { - inputs := (^Inputs)(it.collection) - - a := rawptr(uintptr(inputs.base) + (uintptr(i) * uintptr(inputs.size))) - b := rawptr(uintptr(inputs.base) + (uintptr(j) * uintptr(inputs.size))) - - slice.ptr_swap_non_overlapping(a, b, int(inputs.size)) - }, - }) -} - -@(require, linkage="strong", link_name="stbtt_floor") -floor :: proc "c" (x: f64) -> f64 { return math.floor(x) } -@(require, linkage="strong", link_name="stbtt_ceil") -ceil :: proc "c" (x: f64) -> f64 { return math.ceil(x) } -@(require, linkage="strong", link_name="stbtt_sqrt") -sqrt :: proc "c" (x: f64) -> f64 { return math.sqrt(x) } -@(require, linkage="strong", link_name="stbtt_pow") -pow :: proc "c" (x, y: f64) -> f64 { return math.pow(x, y) } -@(require, linkage="strong", link_name="stbtt_fmod") -fmod :: proc "c" (x, y: f64) -> f64 { return math.mod(x, y) } -@(require, linkage="strong", link_name="stbtt_cos") -cos :: proc "c" (x: f64) -> f64 { return math.cos(x) } -@(require, linkage="strong", link_name="stbtt_acos") -acos :: proc "c" (x: f64) -> f64 { return math.acos(x) } -@(require, linkage="strong", link_name="stbtt_fabs") -fabs :: proc "c" (x: f64) -> f64 { return math.abs(x) } - -@(require, linkage="strong", link_name="stbtt_strlen") -strlen :: proc "c" (str: cstring) -> c.ulong { return c.ulong(len(str)) } - -// NOTE: defined in runtime. -// void *memcpy(void *dst, const void *src, size_t count); -// void *memset(void *dst, int x, size_t count); +@(require) import _ "vendor:libc" From 053425e8d7a29fee378437fce02d0db5ca2f7a90 Mon Sep 17 00:00:00 2001 From: Thomas la Cour Date: Mon, 9 Sep 2024 19:29:43 +0200 Subject: [PATCH 057/320] trim version digits, release=YYYY.MM.0.0 else YYYY.MM.DD.0 --- build.bat | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/build.bat b/build.bat index 6eeeaf9d5..0b70d867d 100644 --- a/build.bat +++ b/build.bat @@ -45,7 +45,19 @@ if "%2" == "1" ( set nightly=0 ) -set odin_version_raw="dev-%curr_year%-%curr_month%" +if %release_mode% equ 0 ( + set V1=%curr_year% + set V2=%curr_month% + set V3=%curr_day% +) else ( + set V1=%curr_year% + set V2=%curr_month% + set V3=0 +) +set V4=0 +set odin_version_full="%V1%.%V2%.%V3%.%V4%" +set odin_version_raw="dev-%V1%-%V2%" + set compiler_flags= -nologo -Oi -TP -fp:precise -Gm- -MP -FC -EHsc- -GR- -GF rem Parse source code as utf-8 even on shift-jis and other codepages @@ -54,9 +66,9 @@ set compiler_flags= %compiler_flags% /utf-8 set compiler_defines= -DODIN_VERSION_RAW=\"%odin_version_raw%\" rem fileversion is defined as {Major,Minor,Build,Private: u16} so a bit limited -set rc_flags=-nologo -v ^ --DV1=%curr_year% -DV2=%curr_month% -DV3=%curr_day% -DV4=%nightly% ^ --DVF=%curr_year%.%curr_month%.%curr_day%.%nightly% +set rc_flags=-nologo ^ +-DV1=%V1% -DV2=%V2% -DV3=%V3% -DV4=%V4% ^ +-DVF=%odin_version_full% if not exist .git\ goto skip_git_hash for /f "tokens=1,2" %%i IN ('git show "--pretty=%%cd %%h" "--date=format:%%Y-%%m" --no-patch --no-notes HEAD') do ( @@ -122,7 +134,7 @@ del *.ilk > NUL 2> NUL rc %rc_flags% %odin_rc% cl %compiler_settings% "src\main.cpp" "src\libtommath.cpp" /link %linker_settings% -OUT:%exe_name% -mt -nologo -inputresource:%exe_name%;#1 -manifest misc\odin.manifest -outputresource:%exe_name%;#1 -validate_manifest -identity:"odin, processorArchitecture=amd64, version=%curr_year%.%curr_month%.%curr_day%.%nightly%, type=win32" +mt -nologo -inputresource:%exe_name%;#1 -manifest misc\odin.manifest -outputresource:%exe_name%;#1 -validate_manifest -identity:"odin, processorArchitecture=amd64, version=%odin_version_full%, type=win32" if %errorlevel% neq 0 goto end_of_build call build_vendor.bat From 6298b23e07f36862003d98c0197e581f29492c70 Mon Sep 17 00:00:00 2001 From: Thomas la Cour Date: Mon, 9 Sep 2024 19:34:19 +0200 Subject: [PATCH 058/320] tag nightly builds --- build.bat | 2 +- misc/odin.rc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build.bat b/build.bat index 0b70d867d..b7191f94b 100644 --- a/build.bat +++ b/build.bat @@ -68,7 +68,7 @@ set compiler_defines= -DODIN_VERSION_RAW=\"%odin_version_raw%\" rem fileversion is defined as {Major,Minor,Build,Private: u16} so a bit limited set rc_flags=-nologo ^ -DV1=%V1% -DV2=%V2% -DV3=%V3% -DV4=%V4% ^ --DVF=%odin_version_full% +-DVF=%odin_version_full% -Dnightly=%nightly% if not exist .git\ goto skip_git_hash for /f "tokens=1,2" %%i IN ('git show "--pretty=%%cd %%h" "--date=format:%%Y-%%m" --no-patch --no-notes HEAD') do ( diff --git a/misc/odin.rc b/misc/odin.rc index e45d6661b..9e605f6dc 100644 --- a/misc/odin.rc +++ b/misc/odin.rc @@ -30,6 +30,9 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT #ifndef GIT_SHA #define GIT_SHA 0 #endif +#ifndef NIGHTLY +#define NIGHTLY 0 +#endif #define Q(x) #x #define QUOTE(x) Q(x) @@ -62,6 +65,7 @@ BEGIN VALUE "Comments", QUOTE(git-sha: GIT_SHA) // custom values VALUE "GitSha", QUOTE(GIT_SHA) + VALUE "NightlyBuild", QUOTE(NIGHTLY) END END BLOCK "VarFileInfo" From 954dd86f7a1ca5adabbb45238bc050905b34be05 Mon Sep 17 00:00:00 2001 From: Thomas la Cour Date: Mon, 9 Sep 2024 19:54:48 +0200 Subject: [PATCH 059/320] nightly define fix --- build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bat b/build.bat index b7191f94b..33dd53cb8 100644 --- a/build.bat +++ b/build.bat @@ -68,7 +68,7 @@ set compiler_defines= -DODIN_VERSION_RAW=\"%odin_version_raw%\" rem fileversion is defined as {Major,Minor,Build,Private: u16} so a bit limited set rc_flags=-nologo ^ -DV1=%V1% -DV2=%V2% -DV3=%V3% -DV4=%V4% ^ --DVF=%odin_version_full% -Dnightly=%nightly% +-DVF=%odin_version_full% -DNIGHTLY=%nightly% if not exist .git\ goto skip_git_hash for /f "tokens=1,2" %%i IN ('git show "--pretty=%%cd %%h" "--date=format:%%Y-%%m" --no-patch --no-notes HEAD') do ( From 3637dcbd04d328a110f0626171f2d49f7a96b09b Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 9 Sep 2024 21:03:23 +0200 Subject: [PATCH 060/320] Simplified error messages in parse_build_tag, removed the idea of making multiple notted operating systems since it was misinformed. --- src/parser.cpp | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 7f2fa9b70..2df876d73 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6106,12 +6106,13 @@ gb_internal bool parse_build_tag(Token token_for_pos, String s) { } bool any_correct = false; - bool any_notted_os_seen = false; - bool any_os_seen = false; while (s.len > 0) { bool this_kind_correct = true; + bool this_kind_os_seen = false; + bool this_kind_arch_seen = false; + int num_tokens = 0; do { String p = string_trim_whitespace(build_tag_get_token(s, &s)); @@ -6136,34 +6137,29 @@ gb_internal bool parse_build_tag(Token token_for_pos, String s) { continue; } - TargetOsKind os = get_target_os_from_string(p); TargetArchKind arch = get_target_arch_from_string(p); + num_tokens += 1; + + // Catches 'windows linux', which is an impossible combination. + // Also catches usage of more than two things within a comma separated group. + if (num_tokens > 2 || (this_kind_os_seen && os != TargetOs_Invalid) || (this_kind_arch_seen && arch != TargetArch_Invalid)) { + syntax_error(token_for_pos, "Invalid build tag: Missing ',' before '%.*s'. Format: '#+build linux, windows amd64, darwin'", LIT(p)); + break; + } + if (os != TargetOs_Invalid) { - // Catches cases where you have multiple !notted operating systems on a line. This never does what you think since - // you need a new build line to get a logical AND. - if (any_notted_os_seen && is_notted) { - syntax_error(token_for_pos, "Invalid build tag: Use a separate '#+build' line for each platform that has '!' in front."); - break; - } - - // Catches 'windows linux', which is an impossible combination. - if (this_kind_os_seen) { - syntax_error(token_for_pos, "Invalid build tag: Missing ',' before '%.*s'. Format: '#+build linux, windows, darwin' or '#+build linux amd64, darwin, windows i386'", LIT(p)); - break; - } - this_kind_os_seen = true; - any_os_seen = true; GB_ASSERT(arch == TargetArch_Invalid); if (is_notted) { this_kind_correct = this_kind_correct && (os != build_context.metrics.os); - any_notted_os_seen = true; } else { this_kind_correct = this_kind_correct && (os == build_context.metrics.os); } } else if (arch != TargetArch_Invalid) { + this_kind_arch_seen = true; + if (is_notted) { this_kind_correct = this_kind_correct && (arch != build_context.metrics.arch); } else { From 957cd64699f1f8f1d1f689025c708aebc3c32476 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 9 Sep 2024 21:06:43 +0200 Subject: [PATCH 061/320] Rename process_file_tag -> parse_file_tag --- src/parser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 2df876d73..3634da7fa 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6348,7 +6348,7 @@ gb_internal bool parse_build_project_directory_tag(Token token_for_pos, String s return any_correct; } -gb_internal bool process_file_tag(const String &lc, const Token &tok, AstFile *f) { +gb_internal bool parse_file_tag(const String &lc, const Token &tok, AstFile *f) { if (string_starts_with(lc, str_lit("build-project-name"))) { if (!parse_build_project_directory_tag(tok, lc)) { return false; @@ -6483,7 +6483,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { if (string_starts_with(lc, str_lit("+"))) { syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); String lt = substring(lc, 1, lc.len); - if (process_file_tag(lt, tok, f) == false) { + if (parse_file_tag(lt, tok, f) == false) { return false; } } @@ -6497,7 +6497,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { if (string_starts_with(str, str_lit("#+"))) { String lt = string_trim_whitespace(substring(str, 2, str.len)); - if (process_file_tag(lt, tok, f) == false) { + if (parse_file_tag(lt, tok, f) == false) { return false; } } From cc724ff5d2ecc358f36c6c0ed3a25db6373ac95c Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 9 Sep 2024 21:13:39 +0200 Subject: [PATCH 062/320] Made error handling code in parse_file clearer. --- src/parser.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 3634da7fa..aaaf02cee 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6405,8 +6405,8 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { Array tags = array_make(ast_allocator(f)); - bool has_first_invalid_pre_package_token = false; - Token first_invalid_pre_package_token; + bool first_invalid_token_set = false; + Token first_invalid_token = {}; while (f->curr_token.kind != Token_package && f->curr_token.kind != Token_EOF) { if (f->curr_token.kind == Token_Comment) { @@ -6415,9 +6415,9 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { array_add(&tags, f->curr_token); advance_token(f); } else { - if (!has_first_invalid_pre_package_token) { - has_first_invalid_pre_package_token = true; - first_invalid_pre_package_token = f->curr_token; + if (!first_invalid_token_set) { + first_invalid_token_set = true; + first_invalid_token = f->curr_token; } advance_token(f); @@ -6431,7 +6431,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { // The while loop above scanned until it found the package token. If we never // found one, then make this error appear on the first invalid token line. - Token t = has_first_invalid_pre_package_token ? first_invalid_pre_package_token : f->curr_token; + Token t = first_invalid_token_set ? first_invalid_token : f->curr_token; syntax_error(t, "Expected a package declaration at the beginning of the file"); // IMPORTANT NOTE(bill): this is technically a race condition with the suggestion, but it's ony a suggession @@ -6443,8 +6443,8 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } // There was an OK package declaration. But there some invalid token was hit before the package declaration. - if (has_first_invalid_pre_package_token) { - syntax_error(first_invalid_pre_package_token, "There can only be lines starting with '#+' or '//' before package declaration"); + if (first_invalid_token_set) { + syntax_error(first_invalid_token, "There can only be lines starting with '#+' or '//' before package declaration"); return false; } @@ -6481,7 +6481,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { if (string_starts_with(str, str_lit("//"))) { String lc = string_trim_whitespace(substring(str, 2, str.len)); if (string_starts_with(lc, str_lit("+"))) { - syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); + //syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); String lt = substring(lc, 1, lc.len); if (parse_file_tag(lt, tok, f) == false) { return false; From 580f0599cde713f5e1c7495174821abe6dc4a2a1 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 9 Sep 2024 21:24:41 +0200 Subject: [PATCH 063/320] parse_file: Removed some nesting and removed probable incorrect safety check. --- src/parser.cpp | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index aaaf02cee..c2a9ff138 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6452,14 +6452,6 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { if (f->package_token.kind != Token_package) { return false; } - if (docs != nullptr) { - TokenPos end = token_pos_end(docs->list[docs->list.count-1]); - if (end.line == f->package_token.pos.line || end.line+1 == f->package_token.pos.line) { - // Okay - } else { - docs = nullptr; - } - } Token package_name = expect_token_after(f, Token_Ident, "package"); if (package_name.kind == Token_Ident) { @@ -6478,14 +6470,17 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { for (Token const &tok : docs->list) { GB_ASSERT(tok.kind == Token_Comment); String str = tok.string; - if (string_starts_with(str, str_lit("//"))) { - String lc = string_trim_whitespace(substring(str, 2, str.len)); - if (string_starts_with(lc, str_lit("+"))) { - //syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); - String lt = substring(lc, 1, lc.len); - if (parse_file_tag(lt, tok, f) == false) { - return false; - } + + if (!string_starts_with(str, str_lit("//"))) { + continue; + } + + String lc = string_trim_whitespace(substring(str, 2, str.len)); + if (string_starts_with(lc, str_lit("+"))) { + syntax_warning(tok, "'//+' is deprecated: Use '#+' instead"); + String lt = substring(lc, 1, lc.len); + if (parse_file_tag(lt, tok, f) == false) { + return false; } } } From f9de8fdaba12746b9c458e916ba6bb9d7c5b7aa7 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 9 Sep 2024 21:51:29 +0200 Subject: [PATCH 064/320] Documentation typo fix in tokenizer. --- src/tokenizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index e9bad390e..53f6135d0 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -943,7 +943,7 @@ gb_internal void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { } else if (t->curr_rune == '+') { token->kind = Token_FileTag; - // Skip the line or until it ends or until we hit was is probably a comment. + // Skip until end of line or until we hit what is probably a comment. // The parsing of tags happens in `parse_file`. while (t->curr_rune != GB_RUNE_EOF) { if (t->curr_rune == '\n') { From 9d6f71fd2ed0a290781e547c7573e86010ff660f Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 15:27:28 -0400 Subject: [PATCH 065/320] Fix `sync.Benaphore` The calls to `atomic_add*` return the value before adding, not after, so the previous code was causing the occasional data race. --- core/sync/extended.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index b446fefa0..ffba40ef8 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -355,7 +355,7 @@ from entering any critical sections associated with the same benaphore, until until the lock is released. */ benaphore_lock :: proc "contextless" (b: ^Benaphore) { - if atomic_add_explicit(&b.counter, 1, .Acquire) > 1 { + if atomic_add_explicit(&b.counter, 1, .Acquire) > 0 { sema_wait(&b.sema) } } @@ -384,7 +384,7 @@ are waiting on the lock, exactly one thread is allowed into a critical section associated with the same banaphore. */ benaphore_unlock :: proc "contextless" (b: ^Benaphore) { - if atomic_sub_explicit(&b.counter, 1, .Release) > 0 { + if atomic_sub_explicit(&b.counter, 1, .Release) > 1 { sema_post(&b.sema) } } @@ -740,4 +740,4 @@ Make event available. one_shot_event_signal :: proc "contextless" (e: ^One_Shot_Event) { atomic_store_explicit(&e.state, 1, .Release) futex_broadcast(&e.state) -} \ No newline at end of file +} From 74b28f1ff91d4776475f4009fa2bcda71c655cd5 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 17:25:48 -0400 Subject: [PATCH 066/320] Fix rare double-join possibility in POSIX `thread._join` This was occuring about 1/100 times with the test runner's thread pool. --- core/thread/thread_unix.odin | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index ddc47244c..d165560ac 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -9,8 +9,6 @@ import "core:time" _IS_SUPPORTED :: true -CAS :: sync.atomic_compare_exchange_strong - // NOTE(tetra): Aligned here because of core/unix/pthread_linux.odin/pthread_t. // Also see core/sys/darwin/mach_darwin.odin/semaphore_t. Thread_Os_Specific :: struct #align(16) { @@ -140,24 +138,18 @@ _is_done :: proc(t: ^Thread) -> bool { } _join :: proc(t: ^Thread) { - // sync.guard(&t.mutex) - if unix.pthread_equal(unix.pthread_self(), t.unix_thread) { return } - // Preserve other flags besides `.Joined`, like `.Started`. - unjoined := sync.atomic_load(&t.flags) - {.Joined} - joined := unjoined + {.Joined} - - // Try to set `t.flags` from unjoined to joined. If it returns joined, - // it means the previous value had that flag set and we can return. - if res, ok := CAS(&t.flags, unjoined, joined); res == joined && !ok { + // If the previous value was already `Joined`, then we can return. + if .Joined in sync.atomic_or(&t.flags, {.Joined}) { return } + // Prevent non-started threads from blocking main thread with initial wait // condition. - if .Started not_in unjoined { + if .Started not_in sync.atomic_load(&t.flags) { _start(t) } unix.pthread_join(t.unix_thread, nil) From cbd4d5e765646ef07c4133ab65e06652a87a1916 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 17:54:45 -0400 Subject: [PATCH 067/320] Fix data race in `atomic_sema_wait_with_timeout` --- core/sync/primitives_atomic.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/primitives_atomic.odin b/core/sync/primitives_atomic.odin index 1d8e423db..076a74b20 100644 --- a/core/sync/primitives_atomic.odin +++ b/core/sync/primitives_atomic.odin @@ -361,7 +361,7 @@ atomic_sema_wait_with_timeout :: proc "contextless" (s: ^Atomic_Sema, duration: if !futex_wait_with_timeout(&s.count, u32(original_count), remaining) { return false } - original_count = s.count + original_count = atomic_load_explicit(&s.count, .Relaxed) } if original_count == atomic_compare_exchange_strong_explicit(&s.count, original_count, original_count-1, .Acquire, .Acquire) { return true From 4d14b4257e7570216826c5cbcee94aa51116e3b3 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 18:05:34 -0400 Subject: [PATCH 068/320] Convert POSIX `Thread` to use semaphore instead One less value to store, and it should be less of a hack too. Semaphores will not wait around if they have the go-ahead; they depend on an internal value being non-zero, instead of whatever was loaded when they started waiting, which is the case with a `Cond`. --- core/thread/thread_unix.odin | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index d165560ac..3d3b419b0 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -5,7 +5,6 @@ package thread import "base:runtime" import "core:sync" import "core:sys/unix" -import "core:time" _IS_SUPPORTED :: true @@ -13,8 +12,7 @@ _IS_SUPPORTED :: true // Also see core/sys/darwin/mach_darwin.odin/semaphore_t. Thread_Os_Specific :: struct #align(16) { unix_thread: unix.pthread_t, // NOTE: very large on Darwin, small on Linux. - cond: sync.Cond, - mutex: sync.Mutex, + start_ok: sync.Sema, } // // Creates a thread which will run the given procedure. @@ -27,14 +25,10 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { // We need to give the thread a moment to start up before we enable cancellation. can_set_thread_cancel_state := unix.pthread_setcancelstate(unix.PTHREAD_CANCEL_ENABLE, nil) == 0 - sync.lock(&t.mutex) - t.id = sync.current_thread_id() - for (.Started not_in sync.atomic_load(&t.flags)) { - // HACK: use a timeout so in the event that the condition is signalled at THIS comment's exact point - // (after checking flags, before starting the wait) it gets itself out of that deadlock after a ms. - sync.wait_with_timeout(&t.cond, &t.mutex, time.Millisecond) + if .Started not_in sync.atomic_load(&t.flags) { + sync.wait(&t.start_ok) } if .Joined in sync.atomic_load(&t.flags) { @@ -64,8 +58,6 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { sync.atomic_or(&t.flags, { .Done }) - sync.unlock(&t.mutex) - if .Self_Cleanup in sync.atomic_load(&t.flags) { res := unix.pthread_detach(t.unix_thread) assert_contextless(res == 0) @@ -130,7 +122,7 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { _start :: proc(t: ^Thread) { sync.atomic_or(&t.flags, { .Started }) - sync.signal(&t.cond) + sync.post(&t.start_ok) } _is_done :: proc(t: ^Thread) -> bool { From 45da0093774276223e3724a89e5b0a9f8ef7c9f7 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 18:21:55 -0400 Subject: [PATCH 069/320] Use more atomic handling of thread flags This can prevent a data race on Linux with `Self_Cleanup`. --- core/thread/thread.odin | 12 ++++++------ core/thread/thread_windows.odin | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/thread/thread.odin b/core/thread/thread.odin index 17ba1a0a2..c1cbceb42 100644 --- a/core/thread/thread.odin +++ b/core/thread/thread.odin @@ -272,7 +272,7 @@ create_and_start :: proc(fn: proc(), init_context: Maybe(runtime.Context) = nil, t := create(thread_proc, priority) t.data = rawptr(fn) if self_cleanup { - t.flags += {.Self_Cleanup} + intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) } t.init_context = init_context start(t) @@ -307,7 +307,7 @@ create_and_start_with_data :: proc(data: rawptr, fn: proc(data: rawptr), init_co t.user_index = 1 t.user_args[0] = data if self_cleanup { - t.flags += {.Self_Cleanup} + intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) } t.init_context = init_context start(t) @@ -347,7 +347,7 @@ create_and_start_with_poly_data :: proc(data: $T, fn: proc(data: T), init_contex mem.copy(&t.user_args[0], &data, size_of(T)) if self_cleanup { - t.flags += {.Self_Cleanup} + intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) } t.init_context = init_context @@ -394,7 +394,7 @@ create_and_start_with_poly_data2 :: proc(arg1: $T1, arg2: $T2, fn: proc(T1, T2), _ = copy(user_args[n:], mem.ptr_to_bytes(&arg2)) if self_cleanup { - t.flags += {.Self_Cleanup} + intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) } t.init_context = init_context @@ -443,7 +443,7 @@ create_and_start_with_poly_data3 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, fn: pr _ = copy(user_args[n:], mem.ptr_to_bytes(&arg3)) if self_cleanup { - t.flags += {.Self_Cleanup} + intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) } t.init_context = init_context @@ -494,7 +494,7 @@ create_and_start_with_poly_data4 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, arg4: _ = copy(user_args[n:], mem.ptr_to_bytes(&arg4)) if self_cleanup { - t.flags += {.Self_Cleanup} + intrinsics.atomic_or(&t.flags, {.Self_Cleanup}) } t.init_context = init_context diff --git a/core/thread/thread_windows.odin b/core/thread/thread_windows.odin index 50a4e5fbc..22c3eae65 100644 --- a/core/thread/thread_windows.odin +++ b/core/thread/thread_windows.odin @@ -27,7 +27,7 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { __windows_thread_entry_proc :: proc "system" (t_: rawptr) -> win32.DWORD { t := (^Thread)(t_) - if .Joined in t.flags { + if .Joined in sync.atomic_load(&t.flags) { return 0 } @@ -48,9 +48,9 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { t.procedure(t) } - intrinsics.atomic_store(&t.flags, t.flags + {.Done}) + intrinsics.atomic_or(&t.flags, {.Done}) - if .Self_Cleanup in t.flags { + if .Self_Cleanup in sync.atomic_load(&t.flags) { win32.CloseHandle(t.win32_thread) t.win32_thread = win32.INVALID_HANDLE // NOTE(ftphikari): It doesn't matter which context 'free' received, right? From dbb783fbf20df1bba899b7a2bcbd65f71eb32fef Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 18:59:55 -0400 Subject: [PATCH 070/320] Fix atomic memory order for `sync.ticket_mutex_unlock` --- core/sync/extended.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index ffba40ef8..fd2bda08a 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -297,7 +297,7 @@ waiting to acquire the lock, exactly one of those threads is unblocked and allowed into the critical section. */ ticket_mutex_unlock :: #force_inline proc "contextless" (m: ^Ticket_Mutex) { - atomic_add_explicit(&m.serving, 1, .Relaxed) + atomic_add_explicit(&m.serving, 1, .Release) } /* From c3f363cfbcee453c7d90b37429c92115e91216af Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 21:59:55 -0400 Subject: [PATCH 071/320] Fix data race when `pool_stop_task` is called --- core/thread/thread_pool.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/thread/thread_pool.odin b/core/thread/thread_pool.odin index 9bcc42968..d9166b450 100644 --- a/core/thread/thread_pool.odin +++ b/core/thread/thread_pool.odin @@ -60,6 +60,7 @@ pool_thread_runner :: proc(t: ^Thread) { if task, ok := pool_pop_waiting(pool); ok { data.task = task pool_do_work(pool, task) + sync.guard(&pool.mutex) data.task = {} } } From 92ff04629e083e78c8d19d531b4ea6075c642130 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Mon, 9 Sep 2024 22:17:42 -0600 Subject: [PATCH 072/320] Fix some compilation errors on POSIX linux. --- core/sys/posix/sys_times.odin | 2 +- core/sys/posix/sys_uio.odin | 2 +- core/sys/posix/sys_un.odin | 7 +++++++ core/sys/posix/ulimit.odin | 2 +- core/sys/posix/utime.odin | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/sys/posix/sys_times.odin b/core/sys/posix/sys_times.odin index 685ced515..d38f3efc4 100644 --- a/core/sys/posix/sys_times.odin +++ b/core/sys/posix/sys_times.odin @@ -24,7 +24,7 @@ when ODIN_OS == .NetBSD { @(private) LTIMES :: "times" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { tms :: struct { tms_utime: clock_t, /* [PSX] user CPU time */ diff --git a/core/sys/posix/sys_uio.odin b/core/sys/posix/sys_uio.odin index 01664e576..6755fe2ae 100644 --- a/core/sys/posix/sys_uio.odin +++ b/core/sys/posix/sys_uio.odin @@ -30,7 +30,7 @@ foreign libc { writev :: proc(fildes: FD, iov: [^]iovec, iovcnt: c.int) -> c.ssize_t --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { iovec :: struct { iov_base: rawptr, /* [PSX] base address of I/O memory region */ diff --git a/core/sys/posix/sys_un.odin b/core/sys/posix/sys_un.odin index 146882051..15eb7b5fc 100644 --- a/core/sys/posix/sys_un.odin +++ b/core/sys/posix/sys_un.odin @@ -12,6 +12,13 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS sun_path: [104]c.char, /* [PSX] socket pathname */ } +} else when ODIN_OS == .Linux { + + sockaddr_un :: struct { + sun_family: sa_family_t, /* [PSX] address family */ + sun_path: [108]c.char, /* [PSX] socket pathname */ + } + } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/ulimit.odin b/core/sys/posix/ulimit.odin index 067b83271..782756f6e 100644 --- a/core/sys/posix/ulimit.odin +++ b/core/sys/posix/ulimit.odin @@ -31,7 +31,7 @@ Ulimit_Cmd :: enum c.int { SETFSIZE = UL_SETFSIZE, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { UL_GETFSIZE :: 1 UL_SETFSIZE :: 2 diff --git a/core/sys/posix/utime.odin b/core/sys/posix/utime.odin index 591a6db06..1207cb402 100644 --- a/core/sys/posix/utime.odin +++ b/core/sys/posix/utime.odin @@ -24,7 +24,7 @@ when ODIN_OS == .NetBSD { @(private) LUTIME :: "utime" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { utimbuf :: struct { actime: time_t, /* [PSX] access time (seconds since epoch) */ From fdd488256896ab40025ebd394735d5a6a30bd8ee Mon Sep 17 00:00:00 2001 From: flysand7 Date: Tue, 10 Sep 2024 19:51:20 +1100 Subject: [PATCH 073/320] [mem]: Adjust docs for alloc --- core/mem/alloc.odin | 166 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 150 insertions(+), 16 deletions(-) diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index c2e55541c..1ede92837 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -35,7 +35,6 @@ functions: `old_size` to be `size` bytes in length and have the specified `alignment`, in case a re-alllocation occurs. - `Resize_Non_Zeroed`: Same as `Resize`, without explicit zero-initialization. - */ Allocator_Mode :: runtime.Allocator_Mode @@ -123,7 +122,11 @@ Currently the type is defined as follows: ) -> ([]byte, Allocator_Error); The function of this procedure and the meaning of parameters depends on the -value of the `mode` parameter. +value of the `mode` parameter. For any operation the following constraints +apply: + +- The `alignment` must be a power of two. +- The `size` must be a positive integer. ## 1. `.Alloc`, `.Alloc_Non_Zeroed` @@ -142,10 +145,11 @@ Allocates a memory region of size `size`, aligned on a boundary specified by 1. The memory region, if allocated successfully, or `nil` otherwise. 2. An error, if allocation failed. -**Note**: Some allocators may return `nil`, even if no error is returned. +**Note**: The nil allocator may return `nil`, even if no error is returned. Always check both the error and the allocated buffer. -Same as `.Alloc`. +**Note**: The `.Alloc` mode is required to be implemented for an allocator +and can not return a `.Mode_Not_Implemented` error. ## 2. `Free` @@ -200,6 +204,10 @@ If `new_size` is `nil`, the procedure acts just like `.Free`, freeing the memory region `old_size` bytes in length, located at the address specified by `old_memory`. +If the `old_memory` pointer is not aligned to the boundary specified by +`alignment`, the procedure relocates the buffer such that the reallocated +buffer is aligned to the boundary specified by `alignment`. + **Inputs**: - `allocator_data`: Pointer to the allocator data. - `mode`: `.Resize` or `.Resize_All`. @@ -216,6 +224,9 @@ memory region `old_size` bytes in length, located at the address specified by **Note**: Some allocators may return `nil`, even if no error is returned. Always check both the error and the allocated buffer. + +**Note**: if `old_size` is `0` and `old_memory` is `nil`, this operation is a +no-op, and should not return errors. */ Allocator_Proc :: runtime.Allocator_Proc @@ -259,6 +270,8 @@ Allocate memory. This function allocates `size` bytes of memory, aligned to a boundary specified by `alignment` using the allocator specified by `allocator`. +If the `size` parameter is `0`, the operation is a no-op. + **Inputs**: - `size`: The desired size of the allocated memory region. - `alignment`: The desired alignment of the allocated memory region. @@ -267,6 +280,14 @@ by `alignment` using the allocator specified by `allocator`. **Returns**: 1. Pointer to the allocated memory, or `nil` if allocation failed. 2. Error, if the allocation failed. + +**Errors**: +- `None`: If no error occurred. +- `Out_Of_Memory`: Occurs when the allocator runs out of space in any of its + backing buffers, the backing allocator has ran out of space, or an operating + system failure occurred. +- `Invalid_Argument`: If the supplied `size` is negative, alignment is not a + power of two. */ @(require_results) alloc :: proc( @@ -293,6 +314,14 @@ by `alignment` using the allocator specified by `allocator`. **Returns**: 1. Slice of the allocated memory region, or `nil` if allocation failed. 2. Error, if the allocation failed. + +**Errors**: +- `None`: If no error occurred. +- `Out_Of_Memory`: Occurs when the allocator runs out of space in any of its + backing buffers, the backing allocator has ran out of space, or an operating + system failure occurred. +- `Invalid_Argument`: If the supplied `size` is negative, alignment is not a + power of two. */ @(require_results) alloc_bytes :: proc( @@ -319,6 +348,14 @@ does not explicitly zero-initialize allocated memory region. **Returns**: 1. Slice of the allocated memory region, or `nil` if allocation failed. 2. Error, if the allocation failed. + +**Errors**: +- `None`: If no error occurred. +- `Out_Of_Memory`: Occurs when the allocator runs out of space in any of its + backing buffers, the backing allocator has ran out of space, or an operating + system failure occurred. +- `Invalid_Argument`: If the supplied `size` is negative, alignment is not a + power of two. */ @(require_results) alloc_bytes_non_zeroed :: proc( @@ -339,6 +376,16 @@ allocated from the allocator specified by `allocator`. **Inputs**: - `ptr`: Pointer to the memory region to free. - `allocator`: The allocator to free to. + +**Returns**: +- The error, if freeing failed. + +**Errors**: +- `None`: When no error has occurred. +- `Invalid_Pointer`: The specified pointer is not owned by the specified allocator, + or does not point to a valid allocation. +- `Mode_Not_Implemented`: If the specified allocator does not support the `.Free` +mode. */ free :: proc( ptr: rawptr, @@ -354,6 +401,8 @@ Free a memory region. This procedure frees `size` bytes of memory region located at the address, specified by `ptr`, allocated from the allocator specified by `allocator`. +If the `size` parameter is `0`, this call is equivalent to `free()`. + **Inputs**: - `ptr`: Pointer to the memory region to free. - `size`: The size of the memory region to free. @@ -361,6 +410,13 @@ specified by `ptr`, allocated from the allocator specified by `allocator`. **Returns**: - The error, if freeing failed. + +**Errors**: +- `None`: When no error has occurred. +- `Invalid_Pointer`: The specified pointer is not owned by the specified allocator, + or does not point to a valid allocation. +- `Mode_Not_Implemented`: If the specified allocator does not support the `.Free` +mode. */ free_with_size :: proc( ptr: rawptr, @@ -377,12 +433,22 @@ Free a memory region. This procedure frees memory region, specified by `bytes`, allocated from the allocator specified by `allocator`. +If the length of the specified slice is zero, the `.Invalid_Argument` error +is returned. + **Inputs**: - `bytes`: The memory region to free. - `allocator`: The allocator to free to. **Returns**: - The error, if freeing failed. + +**Errors**: +- `None`: When no error has occurred. +- `Invalid_Pointer`: The specified pointer is not owned by the specified allocator, + or does not point to a valid allocation. +- `Mode_Not_Implemented`: If the specified allocator does not support the `.Free` +mode. */ free_bytes :: proc( bytes: []byte, @@ -397,6 +463,14 @@ Free all allocations. This procedure frees all allocations made on the allocator specified by `allocator` to that allocator, making it available for further allocations. + +**Inputs**: +- `allocator`: The allocator to free to. + +**Errors**: +- `None`: When no error has occurred. +- `Mode_Not_Implemented`: If the specified allocator does not support the `.Free` +mode. */ free_all :: proc(allocator := context.allocator, loc := #caller_location) -> Allocator_Error { return runtime.mem_free_all(allocator, loc) @@ -416,6 +490,10 @@ If the `new_size` parameter is `0`, `resize()` acts just like `free()`, freeing the memory region `old_size` bytes in length, located at the address specified by `ptr`. +If the `old_memory` pointer is not aligned to the boundary specified by +`alignment`, the procedure relocates the buffer such that the reallocated +buffer is aligned to the boundary specified by `alignment`. + **Inputs**: - `ptr`: Pointer to the memory region to resize. - `old_size`: Size of the memory region to resize. @@ -427,9 +505,20 @@ by `ptr`. 1. The pointer to the resized memory region, if successfull, `nil` otherwise. 2. Error, if resize failed. -**Note**: The `alignment` parameter is used to preserve the original alignment -of the allocation, if `resize()` needs to relocate the memory region. Do not -use `resize()` to change the alignment of the allocated memory region. +**Errors**: +- `None`: No error. +- `Out_Of_Memory`: When the allocator's backing buffer or it's backing + allocator does not have enough space to fit in an allocation with the new + size, or an operating system failure occurs. +- `Invalid_Pointer`: The pointer referring to a memory region does not belong + to any of the allocators backing buffers or does not point to a valid start + of an allocation made in that allocator. +- `Invalid_Argument`: When `size` is negative, alignment is not a power of two, + or the `old_size` argument is incorrect. +- `Mode_Not_Implemented`: The allocator does not support the `.Realloc` mode. + +**Note**: if `old_size` is `0` and `old_memory` is `nil`, this operation is a +no-op, and should not return errors. */ @(require_results) resize :: proc( @@ -458,6 +547,10 @@ If the `new_size` parameter is `0`, `resize()` acts just like `free()`, freeing the memory region `old_size` bytes in length, located at the address specified by `ptr`. +If the `old_memory` pointer is not aligned to the boundary specified by +`alignment`, the procedure relocates the buffer such that the reallocated +buffer is aligned to the boundary specified by `alignment`. + Unlike `resize()`, this procedure does not explicitly zero-initialize any new memory. @@ -472,9 +565,20 @@ memory. 1. The pointer to the resized memory region, if successfull, `nil` otherwise. 2. Error, if resize failed. -**Note**: The `alignment` parameter is used to preserve the original alignment -of the allocation, if `resize()` needs to relocate the memory region. Do not -use `resize()` to change the alignment of the allocated memory region. +**Errors**: +- `None`: No error. +- `Out_Of_Memory`: When the allocator's backing buffer or it's backing + allocator does not have enough space to fit in an allocation with the new + size, or an operating system failure occurs. +- `Invalid_Pointer`: The pointer referring to a memory region does not belong + to any of the allocators backing buffers or does not point to a valid start + of an allocation made in that allocator. +- `Invalid_Argument`: When `size` is negative, alignment is not a power of two, + or the `old_size` argument is incorrect. +- `Mode_Not_Implemented`: The allocator does not support the `.Realloc` mode. + +**Note**: if `old_size` is `0` and `old_memory` is `nil`, this operation is a +no-op, and should not return errors. */ @(require_results) resize_non_zeroed :: proc( @@ -503,6 +607,10 @@ by `alignment`. If the `new_size` parameter is `0`, `resize_bytes()` acts just like `free_bytes()`, freeing the memory region specified by `old_data`. +If the `old_memory` pointer is not aligned to the boundary specified by +`alignment`, the procedure relocates the buffer such that the reallocated +buffer is aligned to the boundary specified by `alignment`. + **Inputs**: - `old_data`: Pointer to the memory region to resize. - `new_size`: The desired size of the resized memory region. @@ -513,9 +621,20 @@ If the `new_size` parameter is `0`, `resize_bytes()` acts just like 1. The resized memory region, if successfull, `nil` otherwise. 2. Error, if resize failed. -**Note**: The `alignment` parameter is used to preserve the original alignment -of the allocation, if `resize()` needs to relocate the memory region. Do not -use `resize()` to change the alignment of the allocated memory region. +**Errors**: +- `None`: No error. +- `Out_Of_Memory`: When the allocator's backing buffer or it's backing + allocator does not have enough space to fit in an allocation with the new + size, or an operating system failure occurs. +- `Invalid_Pointer`: The pointer referring to a memory region does not belong + to any of the allocators backing buffers or does not point to a valid start + of an allocation made in that allocator. +- `Invalid_Argument`: When `size` is negative, alignment is not a power of two, + or the `old_size` argument is incorrect. +- `Mode_Not_Implemented`: The allocator does not support the `.Realloc` mode. + +**Note**: if `old_size` is `0` and `old_memory` is `nil`, this operation is a +no-op, and should not return errors. */ @(require_results) resize_bytes :: proc( @@ -542,6 +661,10 @@ by `alignment`. If the `new_size` parameter is `0`, `resize_bytes()` acts just like `free_bytes()`, freeing the memory region specified by `old_data`. +If the `old_memory` pointer is not aligned to the boundary specified by +`alignment`, the procedure relocates the buffer such that the reallocated +buffer is aligned to the boundary specified by `alignment`. + Unlike `resize_bytes()`, this procedure does not explicitly zero-initialize any new memory. @@ -555,9 +678,20 @@ any new memory. 1. The resized memory region, if successfull, `nil` otherwise. 2. Error, if resize failed. -**Note**: The `alignment` parameter is used to preserve the original alignment -of the allocation, if `resize()` needs to relocate the memory region. Do not -use `resize()` to change the alignment of the allocated memory region. +**Errors**: +- `None`: No error. +- `Out_Of_Memory`: When the allocator's backing buffer or it's backing + allocator does not have enough space to fit in an allocation with the new + size, or an operating system failure occurs. +- `Invalid_Pointer`: The pointer referring to a memory region does not belong + to any of the allocators backing buffers or does not point to a valid start + of an allocation made in that allocator. +- `Invalid_Argument`: When `size` is negative, alignment is not a power of two, + or the `old_size` argument is incorrect. +- `Mode_Not_Implemented`: The allocator does not support the `.Realloc` mode. + +**Note**: if `old_size` is `0` and `old_memory` is `nil`, this operation is a +no-op, and should not return errors. */ @(require_results) resize_bytes_non_zeroed :: proc( From 564c7821c59c0ea8244f281587920e42ce701009 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 10 Sep 2024 04:27:16 +0200 Subject: [PATCH 074/320] Allow ExactValue_Invalid in assert. Fixes #4225 --- src/check_expr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 6ab87da09..27ba2448e 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3615,7 +3615,7 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type if (is_type_integer(src_t) && is_type_integer(dst_t)) { if (types_have_same_internal_endian(src_t, dst_t)) { ExactValue src_v = exact_value_to_integer(o->value); - GB_ASSERT(src_v.kind == ExactValue_Integer); + GB_ASSERT(src_v.kind == ExactValue_Integer || src_v.kind == ExactValue_Invalid); BigInt v = src_v.value_integer; BigInt smax = {}; From beb10cce638e093074d208fef059f2f402658ea9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 10 Sep 2024 15:31:57 +0200 Subject: [PATCH 075/320] Fix #4227 --- core/math/math.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/math/math.odin b/core/math/math.odin index f5e904da6..0e21afa67 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -444,11 +444,11 @@ bias :: proc "contextless" (t, b: $T) -> T where intrinsics.type_is_numeric(T) { return t / (((1/b) - 2) * (1 - t) + 1) } @(require_results) -gain :: proc "contextless" (t, g: $T) -> T where intrinsics.type_is_numeric(T) { +gain :: proc "contextless" (t, g: $T) -> T where intrinsics.type_is_float(T) { if t < 0.5 { - return bias(t*2, g)*0.5 + return bias(t*2, g) * 0.5 } - return bias(t*2 - 1, 1 - g)*0.5 + 0.5 + return bias(t*2 - 1, 1 - g) * 0.5 + 0.5 } From ff82396e7c518378654436abbec01c16237bceb9 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Tue, 10 Sep 2024 07:32:58 -0600 Subject: [PATCH 076/320] Add Linux support for POSIX sys ipc, mman, time, utsname. --- core/sys/posix/sys_ipc.odin | 2 +- core/sys/posix/sys_mman.odin | 11 ++++++++--- core/sys/posix/sys_time.odin | 2 +- core/sys/posix/sys_utsname.odin | 11 ++++++++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/core/sys/posix/sys_ipc.odin b/core/sys/posix/sys_ipc.odin index f8778ee15..0ba9d2d5d 100644 --- a/core/sys/posix/sys_ipc.odin +++ b/core/sys/posix/sys_ipc.odin @@ -36,7 +36,7 @@ IPC_Flag_Bits :: enum c.int { } IPC_Flags :: bit_set[IPC_Flag_Bits; c.int] -when ODIN_OS == .Darwin { +when ODIN_OS == .Darwin || ODIN_OS == .Linux { key_t :: distinct c.int32_t diff --git a/core/sys/posix/sys_mman.odin b/core/sys/posix/sys_mman.odin index 217d321ac..d71a92639 100644 --- a/core/sys/posix/sys_mman.odin +++ b/core/sys/posix/sys_mman.odin @@ -163,7 +163,7 @@ when ODIN_OS == .NetBSD { @(private) LMSYNC :: "msync" } -when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { PROT_EXEC :: 0x04 _PROT_NONE :: 0x00 @@ -174,7 +174,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { MAP_PRIVATE :: 0x0002 MAP_SHARED :: 0x0001 - when ODIN_OS == .Darwin { + when ODIN_OS == .Darwin || ODIN_OS == .Linux { MS_INVALIDATE :: 0x0002 _MS_SYNC :: 0x0010 } else when ODIN_OS == .NetBSD { @@ -184,13 +184,18 @@ when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { MS_INVALIDATE :: 0x0004 _MS_SYNC :: 0x0002 } + MS_ASYNC :: 0x0001 MS_SYNC :: Sync_Flags{Sync_Flags_Bits(log2(_MS_SYNC))} MCL_CURRENT :: 0x0001 MCL_FUTURE :: 0x0002 - MAP_FAILED :: rawptr(~uintptr(0)) + when ODIN_OS == .Linux { + MAP_FAILED :: rawptr(~uintptr(-1)) + } else { + MAP_FAILED :: rawptr(~uintptr(0)) + } POSIX_MADV_DONTNEED :: 4 POSIX_MADV_NORMAL :: 0 diff --git a/core/sys/posix/sys_time.odin b/core/sys/posix/sys_time.odin index 093fdd688..fd2e58121 100644 --- a/core/sys/posix/sys_time.odin +++ b/core/sys/posix/sys_time.odin @@ -66,7 +66,7 @@ when ODIN_OS == .NetBSD { @(private) LUTIMES :: "utimes" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { itimerval :: struct { it_interval: timeval, /* [PSX] timer interval */ diff --git a/core/sys/posix/sys_utsname.odin b/core/sys/posix/sys_utsname.odin index 803f40ffd..4786eb4fd 100644 --- a/core/sys/posix/sys_utsname.odin +++ b/core/sys/posix/sys_utsname.odin @@ -37,10 +37,15 @@ foreign lib { uname :: proc(uname: ^utsname) -> c.int --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { - @(private) - _SYS_NAMELEN :: 256 + when ODIN_OS == .Linux { + @(private) + _SYS_NAMELEN :: 65 + } else { + @(private) + _SYS_NAMELEN :: 256 + } utsname :: struct { sysname: [_SYS_NAMELEN]c.char `fmt:"s,0"`, /* [PSX] name of OS */ From 0a594147afbfdacece1d221d2dee744e612362c6 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 00:23:30 -0400 Subject: [PATCH 077/320] Use `contextless` procs in `core:sync` instead --- core/sync/extended.odin | 10 +++++----- core/sync/futex_darwin.odin | 12 ++++++------ core/sync/futex_freebsd.odin | 8 ++++---- core/sync/futex_linux.odin | 8 ++++---- core/sync/futex_netbsd.odin | 8 ++++---- core/sync/futex_openbsd.odin | 8 ++++---- core/sync/futex_wasm.odin | 8 ++++---- core/sync/primitives.odin | 18 +----------------- core/sync/primitives_atomic.odin | 2 +- 9 files changed, 33 insertions(+), 49 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index fd2bda08a..83cc648b4 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -48,12 +48,12 @@ wait_group_add :: proc "contextless" (wg: ^Wait_Group, delta: int) { atomic_add(&wg.counter, delta) if wg.counter < 0 { - _panic("sync.Wait_Group negative counter") + panic_contextless("sync.Wait_Group negative counter") } if wg.counter == 0 { cond_broadcast(&wg.cond) if wg.counter != 0 { - _panic("sync.Wait_Group misuse: sync.wait_group_add called concurrently with sync.wait_group_wait") + panic_contextless("sync.Wait_Group misuse: sync.wait_group_add called concurrently with sync.wait_group_wait") } } } @@ -81,7 +81,7 @@ wait_group_wait :: proc "contextless" (wg: ^Wait_Group) { if wg.counter != 0 { cond_wait(&wg.cond, &wg.mutex) if wg.counter != 0 { - _panic("sync.Wait_Group misuse: sync.wait_group_add called concurrently with sync.wait_group_wait") + panic_contextless("sync.Wait_Group misuse: sync.wait_group_add called concurrently with sync.wait_group_wait") } } } @@ -105,7 +105,7 @@ wait_group_wait_with_timeout :: proc "contextless" (wg: ^Wait_Group, duration: t return false } if wg.counter != 0 { - _panic("sync.Wait_Group misuse: sync.wait_group_add called concurrently with sync.wait_group_wait") + panic_contextless("sync.Wait_Group misuse: sync.wait_group_add called concurrently with sync.wait_group_wait") } } return true @@ -494,7 +494,7 @@ for other threads for entering. */ recursive_benaphore_unlock :: proc "contextless" (b: ^Recursive_Benaphore) { tid := current_thread_id() - _assert(tid == b.owner, "tid != b.owner") + assert_contextless(tid == b.owner, "tid != b.owner") b.recursion -= 1 recursion := b.recursion if recursion == 0 { diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin index fca9aadfe..daefd6699 100644 --- a/core/sync/futex_darwin.odin +++ b/core/sync/futex_darwin.odin @@ -48,7 +48,7 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati case -ETIMEDOUT: return false case: - _panic("darwin.os_sync_wait_on_address_with_timeout failure") + panic_contextless("darwin.os_sync_wait_on_address_with_timeout failure") } } else { @@ -63,7 +63,7 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati case ETIMEDOUT: return false case: - _panic("futex_wait failure") + panic_contextless("futex_wait failure") } return true @@ -83,7 +83,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { case -ENOENT: return case: - _panic("darwin.os_sync_wake_by_address_any failure") + panic_contextless("darwin.os_sync_wake_by_address_any failure") } } } else { @@ -99,7 +99,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { case ENOENT: return case: - _panic("futex_wake_single failure") + panic_contextless("futex_wake_single failure") } } @@ -119,7 +119,7 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { case -ENOENT: return case: - _panic("darwin.os_sync_wake_by_address_all failure") + panic_contextless("darwin.os_sync_wake_by_address_all failure") } } } else { @@ -135,7 +135,7 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { case ENOENT: return case: - _panic("futex_wake_all failure") + panic_contextless("futex_wake_all failure") } } diff --git a/core/sync/futex_freebsd.odin b/core/sync/futex_freebsd.odin index ac6e2400a..82021a71a 100644 --- a/core/sync/futex_freebsd.odin +++ b/core/sync/futex_freebsd.odin @@ -21,7 +21,7 @@ _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { continue } - _panic("_futex_wait failure") + panic_contextless("_futex_wait failure") } unreachable() @@ -44,14 +44,14 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati return false } - _panic("_futex_wait_with_timeout failure") + panic_contextless("_futex_wait_with_timeout failure") } _futex_signal :: proc "contextless" (f: ^Futex) { errno := freebsd._umtx_op(f, .WAKE, 1, nil, nil) if errno != nil { - _panic("_futex_signal failure") + panic_contextless("_futex_signal failure") } } @@ -59,6 +59,6 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { errno := freebsd._umtx_op(f, .WAKE, cast(c.ulong)max(i32), nil, nil) if errno != nil { - _panic("_futex_broadcast failure") + panic_contextless("_futex_broadcast failure") } } diff --git a/core/sync/futex_linux.odin b/core/sync/futex_linux.odin index fe57c12ed..4d9101b9f 100644 --- a/core/sync/futex_linux.odin +++ b/core/sync/futex_linux.odin @@ -15,7 +15,7 @@ _futex_wait :: proc "contextless" (futex: ^Futex, expected: u32) -> bool { return true case: // TODO(flysand): More descriptive panic messages based on the vlaue of `errno` - _panic("futex_wait failure") + panic_contextless("futex_wait failure") } } @@ -34,7 +34,7 @@ _futex_wait_with_timeout :: proc "contextless" (futex: ^Futex, expected: u32, du case .NONE, .EINTR, .EAGAIN: return true case: - _panic("futex_wait_with_timeout failure") + panic_contextless("futex_wait_with_timeout failure") } } @@ -44,7 +44,7 @@ _futex_signal :: proc "contextless" (futex: ^Futex) { case .NONE: return case: - _panic("futex_wake_single failure") + panic_contextless("futex_wake_single failure") } } @@ -57,6 +57,6 @@ _futex_broadcast :: proc "contextless" (futex: ^Futex) { case .NONE: return case: - _panic("_futex_wake_all failure") + panic_contextless("_futex_wake_all failure") } } diff --git a/core/sync/futex_netbsd.odin b/core/sync/futex_netbsd.odin index d12409f32..f81a12675 100644 --- a/core/sync/futex_netbsd.odin +++ b/core/sync/futex_netbsd.odin @@ -35,7 +35,7 @@ _futex_wait :: proc "contextless" (futex: ^Futex, expected: u32) -> bool { case EINTR, EAGAIN: return true case: - _panic("futex_wait failure") + panic_contextless("futex_wait failure") } } return true @@ -55,7 +55,7 @@ _futex_wait_with_timeout :: proc "contextless" (futex: ^Futex, expected: u32, du case ETIMEDOUT: return false case: - _panic("futex_wait_with_timeout failure") + panic_contextless("futex_wait_with_timeout failure") } } return true @@ -63,12 +63,12 @@ _futex_wait_with_timeout :: proc "contextless" (futex: ^Futex, expected: u32, du _futex_signal :: proc "contextless" (futex: ^Futex) { if _, ok := intrinsics.syscall_bsd(unix.SYS___futex, uintptr(futex), FUTEX_WAKE_PRIVATE, 1, 0, 0, 0); !ok { - _panic("futex_wake_single failure") + panic_contextless("futex_wake_single failure") } } _futex_broadcast :: proc "contextless" (futex: ^Futex) { if _, ok := intrinsics.syscall_bsd(unix.SYS___futex, uintptr(futex), FUTEX_WAKE_PRIVATE, uintptr(max(i32)), 0, 0, 0); !ok { - _panic("_futex_wake_all failure") + panic_contextless("_futex_wake_all failure") } } diff --git a/core/sync/futex_openbsd.odin b/core/sync/futex_openbsd.odin index 4883a0841..1ffe4a9a5 100644 --- a/core/sync/futex_openbsd.odin +++ b/core/sync/futex_openbsd.odin @@ -36,7 +36,7 @@ _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { return false } - _panic("futex_wait failure") + panic_contextless("futex_wait failure") } _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, duration: time.Duration) -> bool { @@ -62,14 +62,14 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati return false } - _panic("futex_wait_with_timeout failure") + panic_contextless("futex_wait_with_timeout failure") } _futex_signal :: proc "contextless" (f: ^Futex) { res := _unix_futex(f, FUTEX_WAKE_PRIVATE, 1, nil) if res == -1 { - _panic("futex_wake_single failure") + panic_contextless("futex_wake_single failure") } } @@ -77,6 +77,6 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { res := _unix_futex(f, FUTEX_WAKE_PRIVATE, u32(max(i32)), nil) if res == -1 { - _panic("_futex_wake_all failure") + panic_contextless("_futex_wake_all failure") } } diff --git a/core/sync/futex_wasm.odin b/core/sync/futex_wasm.odin index de88e8198..27532587c 100644 --- a/core/sync/futex_wasm.odin +++ b/core/sync/futex_wasm.odin @@ -10,7 +10,7 @@ import "core:time" _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { when !intrinsics.has_target_feature("atomics") { - _panic("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") + panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { s := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) return s != 0 @@ -19,7 +19,7 @@ _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, duration: time.Duration) -> bool { when !intrinsics.has_target_feature("atomics") { - _panic("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") + panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { s := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, i64(duration)) return s != 0 @@ -28,7 +28,7 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati _futex_signal :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { - _panic("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") + panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { loop: for { s := intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) @@ -41,7 +41,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { _futex_broadcast :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { - _panic("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") + panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { loop: for { s := intrinsics.wasm_memory_atomic_notify32((^u32)(f), ~u32(0)) diff --git a/core/sync/primitives.odin b/core/sync/primitives.odin index a22824481..8187c904b 100644 --- a/core/sync/primitives.odin +++ b/core/sync/primitives.odin @@ -1,6 +1,5 @@ package sync -import "base:runtime" import "core:time" /* @@ -560,7 +559,7 @@ futex_wait :: proc "contextless" (f: ^Futex, expected: u32) { return } ok := _futex_wait(f, expected) - _assert(ok, "futex_wait failure") + assert_contextless(ok, "futex_wait failure") } /* @@ -597,18 +596,3 @@ Wake up multiple threads waiting on a futex. futex_broadcast :: proc "contextless" (f: ^Futex) { _futex_broadcast(f) } - - -@(private) -_assert :: proc "contextless" (cond: bool, msg: string) { - if !cond { - _panic(msg) - } -} - -@(private) -_panic :: proc "contextless" (msg: string) -> ! { - runtime.print_string(msg) - runtime.print_byte('\n') - runtime.trap() -} diff --git a/core/sync/primitives_atomic.odin b/core/sync/primitives_atomic.odin index 076a74b20..3c4324eb7 100644 --- a/core/sync/primitives_atomic.odin +++ b/core/sync/primitives_atomic.odin @@ -240,7 +240,7 @@ atomic_recursive_mutex_lock :: proc "contextless" (m: ^Atomic_Recursive_Mutex) { atomic_recursive_mutex_unlock :: proc "contextless" (m: ^Atomic_Recursive_Mutex) { tid := current_thread_id() - _assert(tid == m.owner, "tid != m.owner") + assert_contextless(tid == m.owner, "tid != m.owner") m.recursion -= 1 recursion := m.recursion if recursion == 0 { From 73f5ab473c4129ae209838d7967286684ac3f462 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:18:01 -0400 Subject: [PATCH 078/320] Keep `chan.can_recv` from deadlocking --- core/sync/chan/chan.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index 53a3bff4b..aca08d82e 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -423,7 +423,7 @@ raw_queue_pop :: proc "contextless" (q: ^Raw_Queue) -> (data: rawptr) { can_recv :: proc "contextless" (c: ^Raw_Chan) -> bool { sync.guard(&c.mutex) if is_buffered(c) { - return len(c) > 0 + return c.queue.len > 0 } return sync.atomic_load(&c.w_waiting) > 0 } From 026aef69e3a42021c5d9666737c7401dc75dc89a Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:42:50 -0400 Subject: [PATCH 079/320] Fix deadlock on sending to full, buffered, closed `Chan` This will also keep messages from being sent to closed, buffered channels in general. --- core/sync/chan/chan.odin | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index aca08d82e..cb299f23f 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -164,12 +164,17 @@ send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) { } if c.queue != nil { // buffered sync.guard(&c.mutex) - for c.queue.len == c.queue.cap { + for !sync.atomic_load(&c.closed) && + c.queue.len == c.queue.cap { sync.atomic_add(&c.w_waiting, 1) sync.wait(&c.w_cond, &c.mutex) sync.atomic_sub(&c.w_waiting, 1) } + if sync.atomic_load(&c.closed) { + return false + } + ok = raw_queue_push(c.queue, msg_in) if sync.atomic_load(&c.r_waiting) > 0 { sync.signal(&c.r_cond) From e9a6a344809daf5c0a3b725dd52e1527382d8c41 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:04:18 -0400 Subject: [PATCH 080/320] Forbid `chan.try_send` on closed buffered channels --- core/sync/chan/chan.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index cb299f23f..f0b04f3b4 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -260,6 +260,10 @@ try_send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) return false } + if sync.atomic_load(&c.closed) { + return false + } + ok = raw_queue_push(c.queue, msg_in) if sync.atomic_load(&c.r_waiting) > 0 { sync.signal(&c.r_cond) From 8a14a656fbd8843628b61e5a20877b40b772482c Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:05:29 -0400 Subject: [PATCH 081/320] Fix `chan.can_send` for unbuffered channels `w_waiting` is the signal that says a caller is waiting to be able to send something. It is incremented upon send and - in the case of an unbuffered channel - it can only hold one message. Therefore, check that `w_waiting` is zero instead. --- core/sync/chan/chan.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index f0b04f3b4..5b9a764b4 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -444,7 +444,7 @@ can_send :: proc "contextless" (c: ^Raw_Chan) -> bool { if is_buffered(c) { return c.queue.len < c.queue.cap } - return sync.atomic_load(&c.r_waiting) > 0 + return sync.atomic_load(&c.w_waiting) == 0 } From 074314b8874886f8956e9a7e9a773ac059051030 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 18:38:29 -0400 Subject: [PATCH 082/320] Fix data race in `test_core_flags` --- tests/core/flags/test_core_flags.odin | 33 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/tests/core/flags/test_core_flags.odin b/tests/core/flags/test_core_flags.odin index f8305f2ea..8fcd6a8a7 100644 --- a/tests/core/flags/test_core_flags.odin +++ b/tests/core/flags/test_core_flags.odin @@ -12,6 +12,26 @@ import "core:strings" import "core:testing" import "core:time/datetime" +Custom_Data :: struct { + a: int, +} + +@(init) +init_custom_type_setter :: proc() { + // NOTE: This is done here so it can be out of the flow of the + // multi-threaded test runner, to prevent any data races that could be + // reported by using `-sanitize:thread`. + // + // Do mind that this means every test here acknowledges the `Custom_Data` type. + flags.register_type_setter(proc (data: rawptr, data_type: typeid, _, _: string) -> (string, bool, runtime.Allocator_Error) { + if data_type == Custom_Data { + (cast(^Custom_Data)data).a = 32 + return "", true, nil + } + return "", false, nil + }) +} + @(test) test_no_args :: proc(t: ^testing.T) { S :: struct { @@ -1230,9 +1250,6 @@ test_net :: proc(t: ^testing.T) { @(test) test_custom_type_setter :: proc(t: ^testing.T) { Custom_Bool :: distinct bool - Custom_Data :: struct { - a: int, - } S :: struct { a: Custom_Data, @@ -1240,16 +1257,6 @@ test_custom_type_setter :: proc(t: ^testing.T) { } s: S - // NOTE: Mind that this setter is global state, and the test runner is multi-threaded. - // It should be fine so long as all type setter tests are in this one test proc. - flags.register_type_setter(proc (data: rawptr, data_type: typeid, _, _: string) -> (string, bool, runtime.Allocator_Error) { - if data_type == Custom_Data { - (cast(^Custom_Data)data).a = 32 - return "", true, nil - } - return "", false, nil - }) - defer flags.register_type_setter(nil) args := [?]string { "-a:hellope", "-b:true" } result := flags.parse(&s, args[:]) testing.expect_value(t, result, nil) From 3a6010918033e1548e84d57a07074cdbf802ff9b Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:09:16 -0400 Subject: [PATCH 083/320] Fix signalling test child threads crashing test 0 A thread made inside a test does not share the test index of its parent, so any time one of those threads failed an assert, it would tell the runner to shutdown test index zero. --- core/testing/signal_handler_libc.odin | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index 27d1a0735..e2d170595 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -26,6 +26,8 @@ import "core:os" @(private="file", thread_local) local_test_index: libc.sig_atomic_t +@(private="file", thread_local) +local_test_index_set: bool // Windows does not appear to have a SIGTRAP, so this is defined here, instead // of in the libc package, just so there's no confusion about it being @@ -45,6 +47,13 @@ stop_runner_callback :: proc "c" (sig: libc.int) { @(private="file") stop_test_callback :: proc "c" (sig: libc.int) { + if !local_test_index_set { + // We're a thread created by a test thread. + // + // There's nothing we can do to inform the test runner about who + // signalled, so hopefully the test will handle their own sub-threads. + return + } if local_test_index == -1 { // We're the test runner, and we ourselves have caught a signal from // which there is no recovery. @@ -114,6 +123,7 @@ This is a dire bug and should be reported to the Odin developers. _setup_signal_handler :: proc() { local_test_index = -1 + local_test_index_set = true // Catch user interrupt / CTRL-C. libc.signal(libc.SIGINT, stop_runner_callback) @@ -135,6 +145,7 @@ _setup_signal_handler :: proc() { _setup_task_signal_handler :: proc(test_index: int) { local_test_index = cast(libc.sig_atomic_t)test_index + local_test_index_set = true } _should_stop_runner :: proc() -> bool { From b2c2235e587bb8902dbf35ef84373bb5f616a814 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:11:44 -0400 Subject: [PATCH 084/320] Fix `recursive_benaphore_try_lock` Previously, if the owner called this, it would fail. --- core/sync/extended.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index 83cc648b4..d5521935a 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -474,10 +474,10 @@ recursive_benaphore_try_lock :: proc "contextless" (b: ^Recursive_Benaphore) -> tid := current_thread_id() if b.owner == tid { atomic_add_explicit(&b.counter, 1, .Acquire) - } - - if v, _ := atomic_compare_exchange_strong_explicit(&b.counter, 0, 1, .Acquire, .Acquire); v != 0 { - return false + } else { + if v, _ := atomic_compare_exchange_strong_explicit(&b.counter, 0, 1, .Acquire, .Acquire); v != 0 { + return false + } } // inside the lock b.owner = tid From 5c4f241f22314d063d5f0568ca7c450941385425 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 10 Sep 2024 22:21:50 +0200 Subject: [PATCH 085/320] upload v4 --- .github/workflows/nightly.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e29aceef7..62cdbd00c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -36,7 +36,7 @@ jobs: cp -r bin dist cp -r examples dist - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: windows_artifacts path: dist @@ -69,7 +69,7 @@ jobs: # Zipping so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 zip -r dist.zip dist - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: ubuntu_artifacts path: dist.zip @@ -103,7 +103,7 @@ jobs: - name: Odin run run: ./dist/odin run examples/demo - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: macos_artifacts path: dist.zip @@ -137,7 +137,7 @@ jobs: - name: Odin run run: ./dist/odin run examples/demo - name: Upload artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: macos_arm_artifacts path: dist.zip From f16ed256eaf90fb0fed1e795f6c62cd356180422 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Wed, 11 Sep 2024 08:00:27 +1100 Subject: [PATCH 086/320] [mem]: Fix handling of default resize to check alignment --- base/runtime/internal.odin | 11 +++++++---- core/mem/alloc.odin | 2 +- core/mem/mem.odin | 11 +++++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index ff60cf547..a0bda9d40 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -118,16 +118,15 @@ mem_copy_non_overlapping :: proc "contextless" (dst, src: rawptr, len: int) -> r DEFAULT_ALIGNMENT :: 2*align_of(rawptr) mem_alloc_bytes :: #force_inline proc(size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { - if size == 0 { - return nil, nil - } - if allocator.procedure == nil { + assert(is_power_of_two_int(alignment), "Alignment must be a power of two", loc) + if size == 0 || allocator.procedure == nil{ return nil, nil } return allocator.procedure(allocator.data, .Alloc, size, alignment, nil, 0, loc) } mem_alloc :: #force_inline proc(size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { + assert(is_power_of_two_int(alignment), "Alignment must be a power of two", loc) if size == 0 || allocator.procedure == nil { return nil, nil } @@ -135,6 +134,7 @@ mem_alloc :: #force_inline proc(size: int, alignment: int = DEFAULT_ALIGNMENT, a } mem_alloc_non_zeroed :: #force_inline proc(size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> ([]byte, Allocator_Error) { + assert(is_power_of_two_int(alignment), "Alignment must be a power of two", loc) if size == 0 || allocator.procedure == nil { return nil, nil } @@ -174,6 +174,7 @@ mem_free_all :: #force_inline proc(allocator := context.allocator, loc := #calle } _mem_resize :: #force_inline proc(ptr: rawptr, old_size, new_size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, should_zero: bool, loc := #caller_location) -> (data: []byte, err: Allocator_Error) { + assert(is_power_of_two_int(alignment), "Alignment must be a power of two", loc) if allocator.procedure == nil { return nil, nil } @@ -215,9 +216,11 @@ _mem_resize :: #force_inline proc(ptr: rawptr, old_size, new_size: int, alignmen } mem_resize :: proc(ptr: rawptr, old_size, new_size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Allocator_Error) { + assert(is_power_of_two_int(alignment), "Alignment must be a power of two", loc) return _mem_resize(ptr, old_size, new_size, alignment, allocator, true, loc) } non_zero_mem_resize :: proc(ptr: rawptr, old_size, new_size: int, alignment: int = DEFAULT_ALIGNMENT, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Allocator_Error) { + assert(is_power_of_two_int(alignment), "Alignment must be a power of two", loc) return _mem_resize(ptr, old_size, new_size, alignment, allocator, false, loc) } diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index 1ede92837..5f65e9ebc 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -1096,7 +1096,7 @@ _default_resize_bytes_align :: #force_inline proc( err := free_bytes(old_data, allocator, loc) return nil, err } - if new_size == old_size { + if new_size == old_size && is_aligned(old_memory, alignment) { return old_data, .None } new_memory : []byte diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 0554cee23..b57b18ffc 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -456,6 +456,17 @@ is_power_of_two :: proc "contextless" (x: uintptr) -> bool { return (x & (x-1)) == 0 } +/* +Check if a pointer is aligned. + +This procedure checks whether a pointer `x` is aligned to a boundary specified +by `align`, and returns `true` if the pointer is aligned, and false otherwise. +*/ +is_aligned :: proc "contextless" (x: rawptr, align: int) -> bool { + p := uintptr(x) + return (p & (1< Date: Wed, 11 Sep 2024 01:55:33 +0200 Subject: [PATCH 087/320] ci: fix run step --- .github/workflows/nightly.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 6c5200c7c..a53c3e2d7 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -75,6 +75,10 @@ jobs: cp -r examples $FILE # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 tar -czvf dist.tar.gz $FILE + - name: Odin run + run: | + FILE="odin-linux-amd64-nightly+$(date -I)" + $FILE/odin run examples/demo - name: Upload artifact uses: actions/upload-artifact@v4 with: @@ -109,7 +113,9 @@ jobs: # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 tar -czvf dist.tar.gz $FILE - name: Odin run - run: ./dist/odin run examples/demo + run: | + FILE="odin-macos-amd64-nightly+$(date -I)" + $FILE/odin run examples/demo - name: Upload artifact uses: actions/upload-artifact@v4 with: @@ -144,7 +150,9 @@ jobs: # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 tar -czvf dist.tar.gz $FILE - name: Odin run - run: ./dist/odin run examples/demo + run: | + FILE="odin-macos-arm64-nightly+$(date -I)" + $FILE/odin run examples/demo - name: Upload artifact uses: actions/upload-artifact@v4 with: From 90ba78cdfc7ab58740dfb3dbad4d1e00b63964aa Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:01:14 +0200 Subject: [PATCH 088/320] ci: no UTC on this python --- ci/nightly.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/nightly.py b/ci/nightly.py index 779a04d96..080d2f2c4 100644 --- a/ci/nightly.py +++ b/ci/nightly.py @@ -2,7 +2,7 @@ import os import sys from zipfile import ZipFile, ZIP_DEFLATED from b2sdk.v2 import InMemoryAccountInfo, B2Api -from datetime import datetime, UTC +from datetime import datetime, timezone import json UPLOAD_FOLDER = "nightly/" @@ -32,7 +32,7 @@ def remove_prefix(text: str, prefix: str) -> str: return text[text.startswith(prefix) and len(prefix):] def create_and_upload_artifact_zip(platform: str, artifact: str) -> int: - now = datetime.now(UTC).replace(hour=0, minute=0, second=0, microsecond=0) + now = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) source_archive: str destination_name = f'odin-{platform}-nightly+{now.strftime("%Y-%m-%d")}' @@ -71,7 +71,7 @@ def prune_artifacts(): for file, _ in bucket.ls(UPLOAD_FOLDER, latest_only=False): # Timestamp is in milliseconds date = datetime.fromtimestamp(file.upload_timestamp / 1_000.0).replace(hour=0, minute=0, second=0, microsecond=0) - now = datetime.now(UTC).replace(hour=0, minute=0, second=0, microsecond=0) + now = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) delta = now - date if delta.days > int(days_to_keep): @@ -105,7 +105,7 @@ def update_nightly_json(): 'sizeInBytes': size, }) - now = datetime.now(UTC).isoformat() + now = datetime.now(timezone.utc).isoformat() nightly = json.dumps({ 'last_updated' : now, From 005cadb52cef3646551bdc29b57391bca2619e88 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:10:55 +0200 Subject: [PATCH 089/320] ci: what's in there? --- .github/workflows/nightly.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index a53c3e2d7..a21a136c4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -205,6 +205,7 @@ jobs: BUCKET: ${{ secrets.B2_BUCKET }} DAYS_TO_KEEP: ${{ secrets.B2_DAYS_TO_KEEP }} run: | + tree python3 ci/nightly.py artifact windows-amd64 windows_artifacts/ python3 ci/nightly.py artifact linux-amd64 linux_artifacts/dist.tar.gz python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.tar.gz From f4322886f3686cd699be8f7a777a723741554133 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:19:39 +0200 Subject: [PATCH 090/320] ci: really, what's in there? --- .github/workflows/nightly.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index a21a136c4..afc2f0739 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -162,7 +162,6 @@ jobs: runs-on: [ubuntu-latest] needs: [build_windows, build_macos, build_macos_arm, build_linux] steps: - - uses: actions/checkout@v4 - uses: actions/setup-python@v2 with: python-version: '3.8.x' @@ -205,7 +204,7 @@ jobs: BUCKET: ${{ secrets.B2_BUCKET }} DAYS_TO_KEEP: ${{ secrets.B2_DAYS_TO_KEEP }} run: | - tree + tree -d -L 2 python3 ci/nightly.py artifact windows-amd64 windows_artifacts/ python3 ci/nightly.py artifact linux-amd64 linux_artifacts/dist.tar.gz python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.tar.gz From 7ff424d148d953c1c7a950537d82dd49f9e2dbc8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:26:39 +0200 Subject: [PATCH 091/320] ci: specify path --- .github/workflows/nightly.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index afc2f0739..2b04d3aed 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -180,21 +180,31 @@ jobs: uses: actions/download-artifact@v4.1.7 with: name: windows_artifacts + path: windows_artifacts - name: Download Ubuntu artifacts uses: actions/download-artifact@v4.1.7 with: name: linux_artifacts + path: linux_artifacts - name: Download macOS artifacts uses: actions/download-artifact@v4.1.7 with: name: macos_artifacts + path: macos_artifacts - name: Download macOS arm artifacts uses: actions/download-artifact@v4.1.7 with: name: macos_arm_artifacts + path: macos_arm_artifacts + + - name: Debug + run: | + tree -d -L 2 + + - uses: actions/checkout@v4 - name: Create archives and upload shell: bash @@ -204,7 +214,6 @@ jobs: BUCKET: ${{ secrets.B2_BUCKET }} DAYS_TO_KEEP: ${{ secrets.B2_DAYS_TO_KEEP }} run: | - tree -d -L 2 python3 ci/nightly.py artifact windows-amd64 windows_artifacts/ python3 ci/nightly.py artifact linux-amd64 linux_artifacts/dist.tar.gz python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.tar.gz From 26db1c88600111a54978fefb3155e874a902e2f0 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:30:43 +0200 Subject: [PATCH 092/320] ci: show me files --- .github/workflows/nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 2b04d3aed..5d1dcebfc 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -202,7 +202,7 @@ jobs: - name: Debug run: | - tree -d -L 2 + tree -L 2 - uses: actions/checkout@v4 From 496d732aaf41492099ef0bbada4b43d99e2b7942 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:41:28 +0200 Subject: [PATCH 093/320] ci: does backblaze not like tar archives? --- .github/workflows/nightly.yml | 1 + ci/nightly.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 5d1dcebfc..4520e0ccf 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -214,6 +214,7 @@ jobs: BUCKET: ${{ secrets.B2_BUCKET }} DAYS_TO_KEEP: ${{ secrets.B2_DAYS_TO_KEEP }} run: | + file linux_artifacts/dist.tar.gz python3 ci/nightly.py artifact windows-amd64 windows_artifacts/ python3 ci/nightly.py artifact linux-amd64 linux_artifacts/dist.tar.gz python3 ci/nightly.py artifact macos-amd64 macos_artifacts/dist.tar.gz diff --git a/ci/nightly.py b/ci/nightly.py index 080d2f2c4..5930783e8 100644 --- a/ci/nightly.py +++ b/ci/nightly.py @@ -52,9 +52,9 @@ def create_and_upload_artifact_zip(platform: str, artifact: str) -> int: zip_path = os.path.join("dist", os.path.relpath(file_path, artifact)) z.write(file_path, zip_path) - if not os.path.exists(source_archive): - print(f"Error: Newly created ZIP archive {source_archive} not found.") - return 1 + if not os.path.exists(source_archive): + print(f"Error: archive {source_archive} not found.") + return 1 print("Uploading {} to {}".format(source_archive, UPLOAD_FOLDER + destination_name)) bucket = get_bucket() From 1632f198265147dcfd9c3a7dc717e5a6647aeff4 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Tue, 10 Sep 2024 18:43:09 -0600 Subject: [PATCH 094/320] In-progress support for POSIX on Linux for sys/socket. --- core/sys/posix/sys_socket.odin | 103 ++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 28 deletions(-) diff --git a/core/sys/posix/sys_socket.odin b/core/sys/posix/sys_socket.odin index 36c3c1467..1f228c396 100644 --- a/core/sys/posix/sys_socket.odin +++ b/core/sys/posix/sys_socket.odin @@ -321,16 +321,27 @@ when ODIN_OS == .NetBSD { @(private) LSOCKET :: "socket" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { - socklen_t :: distinct c.uint + when ODIN_OS == .Linux { + socklen_t :: distinct c.uint32_t + } else { + socklen_t :: distinct c.uint + } _sa_family_t :: distinct c.uint8_t - sockaddr :: struct { - sa_len: c.uint8_t, /* total length */ - sa_family: sa_family_t, /* [PSX] address family */ - sa_data: [14]c.char, /* [PSX] socket address */ + when ODIN_OS == .Linux { + sockaddr :: struct { + sa_family: sa_family_t, /* [PSX] address family */ + sa_data: [14]c.char, /* [PSX] socket address */ + } + } else { + sockaddr :: struct { + sa_len: c.uint8_t, /* total length */ + sa_family: sa_family_t, /* [PSX] address family */ + sa_data: [14]c.char, /* [PSX] socket address */ + } } @@ -339,6 +350,11 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS _SS_PAD1SIZE :: 6 @(private) _SS_PAD2SIZE :: 240 + } else when ODIN_OS == .Linux { + @(private) + _SS_SIZE :: 128 + @(private) + _SS_PADSIZE :: _SS_SIZE - size_of(c.uint16_t) - size_of(c.uint64_t) } else { @(private) _SS_MAXSIZE :: 128 @@ -350,23 +366,42 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS _SS_PAD2SIZE :: _SS_MAXSIZE - size_of(c.uint8_t) - size_of(sa_family_t) - _SS_PAD1SIZE - _SS_ALIGNSIZE } - sockaddr_storage :: struct { - ss_len: c.uint8_t, /* address length */ - ss_family: sa_family_t, /* [PSX] address family */ - __ss_pad1: [_SS_PAD1SIZE]c.char, - __ss_align: c.int64_t, /* force structure storage alignment */ - __ss_pad2: [_SS_PAD2SIZE]c.char, + when ODIN_OS == .Linux { + sockaddr_storage :: struct { + ss_family: sa_family_t, /* [PSX] address family */ + __ss_padding: [_SS_PADSIZE]c.char, + __ss_align: c.uint64_t, /* force structure storage alignment */ + } + + msghdr :: struct { + msg_name: rawptr, /* [PSX] optional address */ + msg_namelen: socklen_t, /* [PSX] size of address */ + msg_iov: [^]iovec, /* [PSX] scatter/gather array */ + msg_iovlen: c.size_t, /* [PSX] members in msg_iov */ + msg_control: rawptr, /* [PSX] ancillary data */ + msg_controllen: c.size_t, /* [PSX] ancillary data buffer length */ + msg_flags: Msg_Flags, /* [PSX] flags on received message */ + } + } else { + sockaddr_storage :: struct { + ss_len: c.uint8_t, /* address length */ + ss_family: sa_family_t, /* [PSX] address family */ + __ss_pad1: [_SS_PAD1SIZE]c.char, + __ss_align: c.int64_t, /* force structure storage alignment */ + __ss_pad2: [_SS_PAD2SIZE]c.char, + } + + msghdr :: struct { + msg_name: rawptr, /* [PSX] optional address */ + msg_namelen: socklen_t, /* [PSX] size of address */ + msg_iov: [^]iovec, /* [PSX] scatter/gather array */ + msg_iovlen: c.int, /* [PSX] members in msg_iov */ + msg_control: rawptr, /* [PSX] ancillary data */ + msg_controllen: socklen_t, /* [PSX] ancillary data buffer length */ + msg_flags: Msg_Flags, /* [PSX] flags on received message */ + } } - msghdr :: struct { - msg_name: rawptr, /* [PSX] optional address */ - msg_namelen: socklen_t, /* [PSX] size of address */ - msg_iov: [^]iovec, /* [PSX] scatter/gather array */ - msg_iovlen: c.int, /* [PSX] members in msg_iov */ - msg_control: rawptr, /* [PSX] ancillary data */ - msg_controllen: socklen_t, /* [PSX] ancillary data buffer length */ - msg_flags: Msg_Flags, /* [PSX] flags on received message */ - } cmsghdr :: struct { cmsg_len: socklen_t, /* [PSX] data byte count, including cmsghdr */ @@ -458,13 +493,23 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS // The maximum backlog queue length for listen(). SOMAXCONN :: 128 - MSG_CTRUNC :: 0x20 - MSG_DONTROUTE :: 0x4 - MSG_EOR :: 0x8 - MSG_OOB :: 0x1 - MSG_PEEK :: 0x2 - MSG_TRUNC :: 0x10 - MSG_WAITALL :: 0x40 + when ODIN_OS == .Linux { + MSG_CTRUNC :: 0x007 + MSG_DONTROUTE :: 0x004 + MSG_EOR :: 0x080 + MSG_OOB :: 0x001 + MSG_PEEK :: 0x002 + MSG_TRUNC :: 0x020 + MSG_WAITALL :: 0x100 + } else { + MSG_CTRUNC :: 0x20 + MSG_DONTROUTE :: 0x4 + MSG_EOR :: 0x8 + MSG_OOB :: 0x1 + MSG_PEEK :: 0x2 + MSG_TRUNC :: 0x10 + MSG_WAITALL :: 0x40 + } when ODIN_OS == .Darwin { MSG_NOSIGNAL :: 0x80000 @@ -472,6 +517,8 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS MSG_NOSIGNAL :: 0x00020000 } else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { MSG_NOSIGNAL :: 0x0400 + } else when ODIN_OS == .Linux { + MSG_NOSIGNAL :: 0x4000 } AF_INET :: 2 From 83b5f82a92634fe9f91f2b9c162f42669c9e701d Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:45:58 +0200 Subject: [PATCH 095/320] ci: ohhh, I am dumb --- .github/workflows/nightly.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 4520e0ccf..8b98fb93a 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -162,6 +162,7 @@ jobs: runs-on: [ubuntu-latest] needs: [build_windows, build_macos, build_macos_arm, build_linux] steps: + - uses: actions/checkout@v4 - uses: actions/setup-python@v2 with: python-version: '3.8.x' @@ -204,8 +205,6 @@ jobs: run: | tree -L 2 - - uses: actions/checkout@v4 - - name: Create archives and upload shell: bash env: From a15afccd3659b4b6e030e397a43e849d8059f343 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 02:56:24 +0200 Subject: [PATCH 096/320] ci: aware --- ci/nightly.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/nightly.py b/ci/nightly.py index 5930783e8..923c4e36d 100644 --- a/ci/nightly.py +++ b/ci/nightly.py @@ -70,7 +70,7 @@ def prune_artifacts(): bucket = get_bucket() for file, _ in bucket.ls(UPLOAD_FOLDER, latest_only=False): # Timestamp is in milliseconds - date = datetime.fromtimestamp(file.upload_timestamp / 1_000.0).replace(hour=0, minute=0, second=0, microsecond=0) + date = datetime.fromtimestamp(file.upload_timestamp / 1_000.0, tz=timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) now = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) delta = now - date From b379d25a12b4eee1e48d18f7ed5f65a018086f5d Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 03:05:56 +0200 Subject: [PATCH 097/320] ci: try updating deprecated setup-python --- .github/workflows/nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 8b98fb93a..6243d1922 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -163,7 +163,7 @@ jobs: needs: [build_windows, build_macos, build_macos_arm, build_linux] steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v2 + - uses: actions/setup-python@v5 with: python-version: '3.8.x' From 9b06ea5bfd57c386194438a6a1afd34aa18bb229 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Sep 2024 12:01:01 +0100 Subject: [PATCH 098/320] Fix #4229 for edge case `os.Error`/`os.Errno` legacy bodge --- src/check_expr.cpp | 2 +- src/llvm_backend_expr.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 27ba2448e..45c3e9a3c 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4602,7 +4602,7 @@ gb_internal void convert_to_typed(CheckerContext *c, Operand *operand, Type *tar (operand->value.kind == ExactValue_Integer || operand->value.kind == ExactValue_Float)) { operand->mode = Addressing_Value; - target_type = t_untyped_nil; + // target_type = t_untyped_nil; operand->value = empty_exact_value; update_untyped_expr_value(c, operand->expr, operand->value); break; diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index f20c52e88..58467db2e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3451,8 +3451,14 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { switch (expr->kind) { case_ast_node(bl, BasicLit, expr); + if (type != nullptr && type->Named.name == "Error") { + Entity *e = type->Named.type_name; + if (e->pkg && e->pkg->name == "os") { + return lb_const_nil(p->module, type); + } + } TokenPos pos = bl->token.pos; - GB_PANIC("Non-constant basic literal %s - %.*s", token_pos_to_string(pos), LIT(token_strings[bl->token.kind])); + GB_PANIC("Non-constant basic literal %s - %.*s (%s)", token_pos_to_string(pos), LIT(token_strings[bl->token.kind]), type_to_string(type)); case_end; case_ast_node(bd, BasicDirective, expr); From fec1ccd7a3f0946a84b9914875845cc9f902ee74 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 19:15:06 -0400 Subject: [PATCH 099/320] Fix data races in `sync.Recursive_Benaphore` --- core/sync/extended.odin | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index d5521935a..924ba92a6 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -449,13 +449,15 @@ recursive benaphore, until the lock is released. */ recursive_benaphore_lock :: proc "contextless" (b: ^Recursive_Benaphore) { tid := current_thread_id() - if atomic_add_explicit(&b.counter, 1, .Acquire) > 1 { - if tid != b.owner { - sema_wait(&b.sema) + check_owner: if tid != atomic_load_explicit(&b.owner, .Acquire) { + atomic_add_explicit(&b.counter, 1, .Relaxed) + if _, ok := atomic_compare_exchange_strong_explicit(&b.owner, 0, tid, .Release, .Relaxed); ok { + break check_owner } + sema_wait(&b.sema) + atomic_store_explicit(&b.owner, tid, .Release) } // inside the lock - b.owner = tid b.recursion += 1 } @@ -472,15 +474,14 @@ benaphore, until the lock is released. */ recursive_benaphore_try_lock :: proc "contextless" (b: ^Recursive_Benaphore) -> bool { tid := current_thread_id() - if b.owner == tid { - atomic_add_explicit(&b.counter, 1, .Acquire) - } else { - if v, _ := atomic_compare_exchange_strong_explicit(&b.counter, 0, 1, .Acquire, .Acquire); v != 0 { - return false + check_owner: if tid != atomic_load_explicit(&b.owner, .Acquire) { + if _, ok := atomic_compare_exchange_strong_explicit(&b.owner, 0, tid, .Release, .Relaxed); ok { + atomic_add_explicit(&b.counter, 1, .Relaxed) + break check_owner } + return false } // inside the lock - b.owner = tid b.recursion += 1 return true } @@ -494,14 +495,14 @@ for other threads for entering. */ recursive_benaphore_unlock :: proc "contextless" (b: ^Recursive_Benaphore) { tid := current_thread_id() - assert_contextless(tid == b.owner, "tid != b.owner") + assert_contextless(tid == atomic_load_explicit(&b.owner, .Relaxed), "tid != b.owner") b.recursion -= 1 recursion := b.recursion + if recursion == 0 { - b.owner = 0 - } - if atomic_sub_explicit(&b.counter, 1, .Release) > 0 { - if recursion == 0 { + if atomic_sub_explicit(&b.counter, 1, .Relaxed) == 1 { + atomic_store_explicit(&b.owner, 0, .Release) + } else { sema_post(&b.sema) } } From a1435a6a904b2eb2b154a463c5d60f6c1f55abbc Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:51:00 -0400 Subject: [PATCH 100/320] Fix deadlock in `Auto_Reset_Event` --- core/sync/extended.odin | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index 924ba92a6..0971516a3 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -228,15 +228,14 @@ thread. */ auto_reset_event_signal :: proc "contextless" (e: ^Auto_Reset_Event) { old_status := atomic_load_explicit(&e.status, .Relaxed) + new_status := old_status + 1 if old_status < 1 else 1 for { - new_status := old_status + 1 if old_status < 1 else 1 if _, ok := atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok { break } - - if old_status < 0 { - sema_post(&e.sema) - } + } + if old_status < 0 { + sema_post(&e.sema) } } From b1db33b519bf52e2d0e6e42ca9daccc7470d6b8b Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Tue, 10 Sep 2024 19:04:44 -0400 Subject: [PATCH 101/320] Add `cpu_relax` to `sync.auto_reset_event_signal` --- core/sync/extended.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index 0971516a3..0b1f79df2 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -233,6 +233,7 @@ auto_reset_event_signal :: proc "contextless" (e: ^Auto_Reset_Event) { if _, ok := atomic_compare_exchange_weak_explicit(&e.status, old_status, new_status, .Release, .Relaxed); ok { break } + cpu_relax() } if old_status < 0 { sema_post(&e.sema) From 2938655a3d8801d1327b0076812edcf357d760df Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Wed, 11 Sep 2024 07:07:09 -0400 Subject: [PATCH 102/320] Fix CPU count detection in FreeBSD & NetBSD --- core/os/os_freebsd.odin | 2 +- core/os/os_netbsd.odin | 2 +- src/gb/gb.h | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index c05a06129..241f42c0b 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -920,7 +920,7 @@ get_page_size :: proc() -> int { _processor_core_count :: proc() -> int { count : int = 0 count_size := size_of(count) - if _sysctlbyname("hw.logicalcpu", &count, &count_size, nil, 0) == 0 { + if _sysctlbyname("hw.ncpu", &count, &count_size, nil, 0) == 0 { if count > 0 { return count } diff --git a/core/os/os_netbsd.odin b/core/os/os_netbsd.odin index a56c0b784..ba9b40fc3 100644 --- a/core/os/os_netbsd.odin +++ b/core/os/os_netbsd.odin @@ -978,7 +978,7 @@ get_page_size :: proc() -> int { _processor_core_count :: proc() -> int { count : int = 0 count_size := size_of(count) - if _sysctlbyname("hw.logicalcpu", &count, &count_size, nil, 0) == 0 { + if _sysctlbyname("hw.ncpu", &count, &count_size, nil, 0) == 0 { if count > 0 { return count } diff --git a/src/gb/gb.h b/src/gb/gb.h index 0e65696e2..1fef4b4f5 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -3195,11 +3195,11 @@ void gb_affinity_init(gbAffinity *a) { a->core_count = 1; a->threads_per_core = 1; - if (sysctlbyname("hw.logicalcpu", &count, &count_size, NULL, 0) == 0) { + if (sysctlbyname("kern.smp.cpus", &count, &count_size, NULL, 0) == 0) { if (count > 0) { a->thread_count = count; // Get # of physical cores - if (sysctlbyname("hw.physicalcpu", &count, &count_size, NULL, 0) == 0) { + if (sysctlbyname("kern.smp.cores", &count, &count_size, NULL, 0) == 0) { if (count > 0) { a->core_count = count; a->threads_per_core = a->thread_count / count; @@ -3210,6 +3210,14 @@ void gb_affinity_init(gbAffinity *a) { } } } + } else if (sysctlbyname("hw.ncpu", &count, &count_size, NULL, 0) == 0) { + // SMP disabled or unavailable. + if (count > 0) { + a->is_accurate = true; + a->thread_count = count; + a->core_count = count; + a->threads_per_core = 1; + } } } From 16cd16b91e9cabfba2d12e271712ca55cb16fa7d Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 8 Sep 2024 18:23:28 -0400 Subject: [PATCH 103/320] Fix comments --- core/sync/extended.odin | 18 +++++++++--------- core/sync/primitives.odin | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/sync/extended.odin b/core/sync/extended.odin index 0b1f79df2..30b1b2770 100644 --- a/core/sync/extended.odin +++ b/core/sync/extended.odin @@ -8,7 +8,7 @@ _ :: vg Wait group. Wait group is a synchronization primitive used by the waiting thread to wait, -until a all working threads finish work. +until all working threads finish work. The waiting thread first sets the number of working threads it will expect to wait for using `wait_group_add` call, and start waiting using `wait_group_wait` @@ -35,7 +35,7 @@ Wait_Group :: struct #no_copy { /* Increment an internal counter of a wait group. -This procedure atomicaly increments a number to the specified wait group's +This procedure atomically increments a number to the specified wait group's internal counter by a specified amount. This operation can be done on any thread. */ @@ -121,7 +121,7 @@ When `barrier_wait` procedure is called by any thread, that thread will block the execution, until all threads associated with the barrier reach the same point of execution and also call `barrier_wait`. -when barrier is initialized, a `thread_count` parameter is passed, signifying +When a barrier is initialized, a `thread_count` parameter is passed, signifying the amount of participant threads of the barrier. The barrier also keeps track of an internal atomic counter. When a thread calls `barrier_wait`, the internal counter is incremented. When the internal counter reaches `thread_count`, it is @@ -208,7 +208,7 @@ Represents a thread synchronization primitive that, when signalled, releases one single waiting thread and then resets automatically to a state where it can be signalled again. -When a thread calls `auto_reset_event_wait`, it's execution will be blocked, +When a thread calls `auto_reset_event_wait`, its execution will be blocked, until the event is signalled by another thread. The call to `auto_reset_event_signal` wakes up exactly one thread waiting for the event. */ @@ -331,8 +331,8 @@ Benaphore. A benaphore is a combination of an atomic variable and a semaphore that can improve locking efficiency in a no-contention system. Acquiring a benaphore -lock doesn't call into an internal semaphore, if no other thread in a middle of -a critical section. +lock doesn't call into an internal semaphore, if no other thread is in the +middle of a critical section. Once a lock on a benaphore is acquired by a thread, no other thread is allowed into any critical sections, associted with the same benaphore, until the lock @@ -381,7 +381,7 @@ Release a lock on a benaphore. This procedure releases a lock on the specified benaphore. If any of the threads are waiting on the lock, exactly one thread is allowed into a critical section -associated with the same banaphore. +associated with the same benaphore. */ benaphore_unlock :: proc "contextless" (b: ^Benaphore) { if atomic_sub_explicit(&b.counter, 1, .Release) > 1 { @@ -418,8 +418,8 @@ benaphore_guard :: proc "contextless" (m: ^Benaphore) -> bool { /* Recursive benaphore. -Recurisve benaphore is just like a plain benaphore, except it allows reentrancy -into the critical section. +A recursive benaphore is just like a plain benaphore, except it allows +reentrancy into the critical section. When a lock is acquired on a benaphore, all other threads attempting to acquire a lock on the same benaphore will be blocked from any critical sections, diff --git a/core/sync/primitives.odin b/core/sync/primitives.odin index 8187c904b..f091de045 100644 --- a/core/sync/primitives.odin +++ b/core/sync/primitives.odin @@ -389,7 +389,7 @@ recursive_mutex_guard :: proc "contextless" (m: ^Recursive_Mutex) -> bool { A condition variable. `Cond` implements a condition variable, a rendezvous point for threads waiting -for signalling the occurence of an event. Condition variables are used on +for signalling the occurence of an event. Condition variables are used in conjuction with mutexes to provide a shared access to one or more shared variable. From 7f7cfebc91cc319918bc0042789b0c7a931e56e2 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:17:08 -0400 Subject: [PATCH 104/320] Add tests for `core:sync` and `core:sync/chan` --- tests/core/normal.odin | 2 + tests/core/sync/chan/test_core_sync_chan.odin | 274 +++++++ tests/core/sync/test_core_sync.odin | 718 ++++++++++++++++++ 3 files changed, 994 insertions(+) create mode 100644 tests/core/sync/chan/test_core_sync_chan.odin create mode 100644 tests/core/sync/test_core_sync.odin diff --git a/tests/core/normal.odin b/tests/core/normal.odin index 6174f2d5c..0670842ac 100644 --- a/tests/core/normal.odin +++ b/tests/core/normal.odin @@ -39,6 +39,8 @@ download_assets :: proc() { @(require) import "slice" @(require) import "strconv" @(require) import "strings" +@(require) import "sync" +@(require) import "sync/chan" @(require) import "sys/posix" @(require) import "sys/windows" @(require) import "text/i18n" diff --git a/tests/core/sync/chan/test_core_sync_chan.odin b/tests/core/sync/chan/test_core_sync_chan.odin new file mode 100644 index 000000000..9b8d9b354 --- /dev/null +++ b/tests/core/sync/chan/test_core_sync_chan.odin @@ -0,0 +1,274 @@ +package test_core_sync_chan + +import "base:runtime" +import "base:intrinsics" +import "core:log" +import "core:math/rand" +import "core:sync/chan" +import "core:testing" +import "core:thread" +import "core:time" + + +Message_Type :: enum i32 { + Result, + Add, + Multiply, + Subtract, + Divide, + End, +} + +Message :: struct { + type: Message_Type, + i: i64, +} + +Comm :: struct { + host: chan.Chan(Message), + client: chan.Chan(Message), + manual_buffering: bool, +} + +BUFFER_SIZE :: 8 +MAX_RAND :: 32 +FAIL_TIME :: 1 * time.Second +SLEEP_TIME :: 1 * time.Millisecond + +comm_client :: proc(th: ^thread.Thread) { + data := cast(^Comm)th.data + manual_buffering := data.manual_buffering + + n: i64 + + for manual_buffering && !chan.can_recv(data.host) { + thread.yield() + } + + recv_loop: for msg in chan.recv(data.host) { + #partial switch msg.type { + case .Add: n += msg.i + case .Multiply: n *= msg.i + case .Subtract: n -= msg.i + case .Divide: n /= msg.i + case .End: + break recv_loop + case: + panic("Unknown message type for client.") + } + + for manual_buffering && !chan.can_recv(data.host) { + thread.yield() + } + } + + for manual_buffering && !chan.can_send(data.host) { + thread.yield() + } + + chan.send(data.client, Message{.Result, n}) + chan.close(data.client) +} + +send_messages :: proc(t: ^testing.T, host: chan.Chan(Message), manual_buffering: bool = false) -> (expected: i64) { + expected = 1 + for manual_buffering && !chan.can_send(host) { + thread.yield() + } + chan.send(host, Message{.Add, 1}) + log.debug(Message{.Add, 1}) + + for _ in 0..<1+2*BUFFER_SIZE { + msg: Message + msg.i = 1 + rand.int63_max(MAX_RAND) + switch rand.int_max(4) { + case 0: + msg.type = .Add + expected += msg.i + case 1: + msg.type = .Multiply + expected *= msg.i + case 2: + msg.type = .Subtract + expected -= msg.i + case 3: + msg.type = .Divide + expected /= msg.i + } + + for manual_buffering && !chan.can_send(host) { + thread.yield() + } + if manual_buffering { + testing.expect(t, chan.len(host) == 0) + } + + chan.send(host, msg) + log.debug(msg) + } + + for manual_buffering && !chan.can_send(host) { + thread.yield() + } + chan.send(host, Message{.End, 0}) + log.debug(Message{.End, 0}) + chan.close(host) + + return +} + +@test +test_chan_buffered :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + comm: Comm + alloc_err: runtime.Allocator_Error + comm.host, alloc_err = chan.create_buffered(chan.Chan(Message), BUFFER_SIZE, context.allocator) + assert(alloc_err == nil, "allocation failed") + comm.client, alloc_err = chan.create_buffered(chan.Chan(Message), BUFFER_SIZE, context.allocator) + assert(alloc_err == nil, "allocation failed") + defer { + chan.destroy(comm.host) + chan.destroy(comm.client) + } + + testing.expect(t, chan.is_buffered(comm.host)) + testing.expect(t, chan.is_buffered(comm.client)) + testing.expect(t, !chan.is_unbuffered(comm.host)) + testing.expect(t, !chan.is_unbuffered(comm.client)) + testing.expect_value(t, chan.len(comm.host), 0) + testing.expect_value(t, chan.len(comm.client), 0) + testing.expect_value(t, chan.cap(comm.host), BUFFER_SIZE) + testing.expect_value(t, chan.cap(comm.client), BUFFER_SIZE) + + reckoner := thread.create(comm_client) + defer thread.destroy(reckoner) + reckoner.data = &comm + thread.start(reckoner) + + expected := send_messages(t, comm.host, manual_buffering = false) + + // Sleep so we can give the other thread enough time to buffer its message. + time.sleep(SLEEP_TIME) + + testing.expect_value(t, chan.len(comm.client), 1) + result, ok := chan.try_recv(comm.client) + + // One more sleep to ensure it has enough time to close. + time.sleep(SLEEP_TIME) + + testing.expect_value(t, chan.is_closed(comm.client), true) + testing.expect_value(t, ok, true) + testing.expect_value(t, result.i, expected) + log.debug(result, expected) + + // Make sure sending to closed channels fails. + testing.expect_value(t, chan.send(comm.host, Message{.End, 0}), false) + testing.expect_value(t, chan.send(comm.client, Message{.End, 0}), false) + testing.expect_value(t, chan.try_send(comm.host, Message{.End, 0}), false) + testing.expect_value(t, chan.try_send(comm.client, Message{.End, 0}), false) + _, ok = chan.recv(comm.host); testing.expect_value(t, ok, false) + _, ok = chan.recv(comm.client); testing.expect_value(t, ok, false) + _, ok = chan.try_recv(comm.host); testing.expect_value(t, ok, false) + _, ok = chan.try_recv(comm.client); testing.expect_value(t, ok, false) +} + +@test +test_chan_unbuffered :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + comm: Comm + comm.manual_buffering = true + alloc_err: runtime.Allocator_Error + comm.host, alloc_err = chan.create_unbuffered(chan.Chan(Message), context.allocator) + assert(alloc_err == nil, "allocation failed") + comm.client, alloc_err = chan.create_unbuffered(chan.Chan(Message), context.allocator) + assert(alloc_err == nil, "allocation failed") + defer { + chan.destroy(comm.host) + chan.destroy(comm.client) + } + + testing.expect(t, !chan.is_buffered(comm.host)) + testing.expect(t, !chan.is_buffered(comm.client)) + testing.expect(t, chan.is_unbuffered(comm.host)) + testing.expect(t, chan.is_unbuffered(comm.client)) + testing.expect_value(t, chan.len(comm.host), 0) + testing.expect_value(t, chan.len(comm.client), 0) + testing.expect_value(t, chan.cap(comm.host), 0) + testing.expect_value(t, chan.cap(comm.client), 0) + + reckoner := thread.create(comm_client) + defer thread.destroy(reckoner) + reckoner.data = &comm + thread.start(reckoner) + + for !chan.can_send(comm.client) { + thread.yield() + } + + expected := send_messages(t, comm.host) + testing.expect_value(t, chan.is_closed(comm.host), true) + + for !chan.can_recv(comm.client) { + thread.yield() + } + + result, ok := chan.try_recv(comm.client) + testing.expect_value(t, ok, true) + testing.expect_value(t, result.i, expected) + log.debug(result, expected) + + // Sleep so we can give the other thread enough time to close its side + // after we've received its message. + time.sleep(SLEEP_TIME) + + testing.expect_value(t, chan.is_closed(comm.client), true) + + // Make sure sending and receiving on closed channels fails. + testing.expect_value(t, chan.send(comm.host, Message{.End, 0}), false) + testing.expect_value(t, chan.send(comm.client, Message{.End, 0}), false) + testing.expect_value(t, chan.try_send(comm.host, Message{.End, 0}), false) + testing.expect_value(t, chan.try_send(comm.client, Message{.End, 0}), false) + _, ok = chan.recv(comm.host); testing.expect_value(t, ok, false) + _, ok = chan.recv(comm.client); testing.expect_value(t, ok, false) + _, ok = chan.try_recv(comm.host); testing.expect_value(t, ok, false) + _, ok = chan.try_recv(comm.client); testing.expect_value(t, ok, false) +} + +@test +test_full_buffered_closed_chan_deadlock :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + ch, alloc_err := chan.create_buffered(chan.Chan(int), 1, context.allocator) + assert(alloc_err == nil, "allocation failed") + defer chan.destroy(ch) + + testing.expect(t, chan.can_send(ch)) + testing.expect(t, chan.send(ch, 32)) + testing.expect(t, chan.close(ch)) + testing.expect(t, !chan.send(ch, 32)) +} + +// This test guarantees a buffered channel's messages can still be received +// even after closing. This is currently how the API works. If that changes, +// this test will need to change. +@test +test_accept_message_from_closed_buffered_chan :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + ch, alloc_err := chan.create_buffered(chan.Chan(int), 2, context.allocator) + assert(alloc_err == nil, "allocation failed") + defer chan.destroy(ch) + + testing.expect(t, chan.can_send(ch)) + testing.expect(t, chan.send(ch, 32)) + testing.expect(t, chan.send(ch, 64)) + testing.expect(t, chan.close(ch)) + result, ok := chan.recv(ch) + testing.expect_value(t, result, 32) + testing.expect(t, ok) + result, ok = chan.try_recv(ch) + testing.expect_value(t, result, 64) + testing.expect(t, ok) +} diff --git a/tests/core/sync/test_core_sync.odin b/tests/core/sync/test_core_sync.odin new file mode 100644 index 000000000..32c08f935 --- /dev/null +++ b/tests/core/sync/test_core_sync.odin @@ -0,0 +1,718 @@ +// NOTE(Feoramund): These tests should be run a few hundred times, with and +// without `-sanitize:thread` enabled, to ensure maximum safety. +// +// Keep in mind that running with the debug logs uncommented can result in +// failures disappearing due to the delay of sending the log message causing +// different synchronization patterns. +// +// These tests are temporarily disabled on Darwin, as there is currently a +// stall occurring which I cannot debug. + +//+build !darwin +package test_core_sync + +import "base:intrinsics" +// import "core:log" +import "core:sync" +import "core:testing" +import "core:thread" +import "core:time" + +FAIL_TIME :: 1 * time.Second +SLEEP_TIME :: 1 * time.Millisecond +SMALL_SLEEP_TIME :: 10 * time.Microsecond + +// This needs to be high enough to cause a data race if any of the +// synchronization primitives fail. +THREADS :: 8 + +// Manually wait on all threads to finish. +// +// This reduces a dependency on a `Wait_Group` or similar primitives. +// +// It's also important that we wait for every thread to finish, as it's +// possible for a thread to finish after the test if we don't check, despite +// joining it to the test thread. +wait_for :: proc(threads: []^thread.Thread) { + wait_loop: for { + count := len(threads) + for v in threads { + if thread.is_done(v) { + count -= 1 + } + } + if count == 0 { + break wait_loop + } + thread.yield() + } + for t in threads { + thread.join(t) + thread.destroy(t) + } +} + +// +// core:sync/primitives.odin +// + +@test +test_mutex :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + m: sync.Mutex, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("MUTEX-%v> locking", th.id) + sync.mutex_lock(&data.m) + data.number += 1 + // log.debugf("MUTEX-%v> unlocking", th.id) + sync.mutex_unlock(&data.m) + // log.debugf("MUTEX-%v> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + wait_for(threads[:]) + + testing.expect_value(t, data.number, THREADS) +} + +@test +test_rw_mutex :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + m1: sync.RW_Mutex, + m2: sync.RW_Mutex, + number1: int, + number2: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + sync.rw_mutex_shared_lock(&data.m1) + n := data.number1 + sync.rw_mutex_shared_unlock(&data.m1) + + sync.rw_mutex_lock(&data.m2) + data.number2 += n + sync.rw_mutex_unlock(&data.m2) + } + + data: Data + threads: [THREADS]^thread.Thread + + sync.rw_mutex_lock(&data.m1) + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + data.number1 = 1 + sync.rw_mutex_unlock(&data.m1) + + wait_for(threads[:]) + + testing.expect_value(t, data.number2, THREADS) +} + +@test +test_recursive_mutex :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + m: sync.Recursive_Mutex, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("REC_MUTEX-%v> locking", th.id) + tried1 := sync.recursive_mutex_try_lock(&data.m) + for _ in 0..<3 { + sync.recursive_mutex_lock(&data.m) + } + tried2 := sync.recursive_mutex_try_lock(&data.m) + // log.debugf("REC_MUTEX-%v> locked", th.id) + data.number += 1 + // log.debugf("REC_MUTEX-%v> unlocking", th.id) + for _ in 0..<3 { + sync.recursive_mutex_unlock(&data.m) + } + if tried1 { sync.recursive_mutex_unlock(&data.m) } + if tried2 { sync.recursive_mutex_unlock(&data.m) } + // log.debugf("REC_MUTEX-%v> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + wait_for(threads[:]) + + testing.expect_value(t, data.number, THREADS) +} + +@test +test_cond :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + c: sync.Cond, + m: sync.Mutex, + i: int, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + sync.mutex_lock(&data.m) + + for intrinsics.atomic_load(&data.i) != 1 { + sync.cond_wait(&data.c, &data.m) + } + + data.number += intrinsics.atomic_load(&data.i) + + sync.mutex_unlock(&data.m) + } + + data: Data + threads: [THREADS]^thread.Thread + data.i = -1 + + sync.mutex_lock(&data.m) + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + time.sleep(SLEEP_TIME) + data.i = 1 + sync.mutex_unlock(&data.m) + sync.cond_broadcast(&data.c) + + wait_for(threads[:]) + + testing.expect_value(t, data.number, THREADS) +} + +@test +test_cond_with_timeout :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + c: sync.Cond + m: sync.Mutex + sync.mutex_lock(&m) + sync.cond_wait_with_timeout(&c, &m, SLEEP_TIME) +} + +@test +test_semaphore :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + s: sync.Sema, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("SEM-%v> waiting", th.id) + sync.sema_wait(&data.s) + data.number += 1 + // log.debugf("SEM-%v> posting", th.id) + sync.sema_post(&data.s) + // log.debugf("SEM-%v> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + sync.sema_post(&data.s) + + wait_for(threads[:]) + + testing.expect_value(t, data.number, THREADS) +} + +@test +test_semaphore_with_timeout :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + s: sync.Sema + sync.sema_wait_with_timeout(&s, SLEEP_TIME) +} + +@test +test_futex :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + f: sync.Futex, + i: int, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("FUTEX-%v> waiting", th.id) + sync.futex_wait(&data.f, 3) + // log.debugf("FUTEX-%v> done", th.id) + + n := data.i + intrinsics.atomic_add(&data.number, n) + } + + data: Data + data.i = -1 + data.f = 3 + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + data.i = 1 + // Change the futex variable to keep late-starters from stalling. + data.f = 0 + sync.futex_broadcast(&data.f) + + wait_for(threads[:]) + + testing.expect_value(t, data.number, THREADS) +} + +@test +test_futex_with_timeout :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + f: sync.Futex = 1 + sync.futex_wait_with_timeout(&f, 1, SLEEP_TIME) +} + +// +// core:sync/extended.odin +// + +@test +test_wait_group :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + step1: sync.Wait_Group, + step2: sync.Wait_Group, + i: int, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + sync.wait_group_wait(&data.step1) + + n := data.i + intrinsics.atomic_add(&data.number, n) + + sync.wait_group_done(&data.step2) + } + + data: Data + data.i = -1 + threads: [THREADS]^thread.Thread + + sync.wait_group_add(&data.step1, 1) + sync.wait_group_add(&data.step2, THREADS) + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + time.sleep(SMALL_SLEEP_TIME) + data.i = 1 + sync.wait_group_done(&data.step1) + + sync.wait_group_wait(&data.step2) + + wait_for(threads[:]) + + testing.expect_value(t, data.step1.counter, 0) + testing.expect_value(t, data.step2.counter, 0) + testing.expect_value(t, data.number, THREADS) +} + +@test +test_wait_group_with_timeout :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + wg: sync.Wait_Group + sync.wait_group_wait_with_timeout(&wg, SLEEP_TIME) +} + +@test +test_barrier :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + b: sync.Barrier, + i: int, + number: int, + + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + sync.barrier_wait(&data.b) + + intrinsics.atomic_add(&data.number, data.i) + } + + data: Data + data.i = -1 + threads: [THREADS]^thread.Thread + + sync.barrier_init(&data.b, THREADS + 1) // +1 for this thread, of course. + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + time.sleep(SMALL_SLEEP_TIME) + data.i = 1 + sync.barrier_wait(&data.b) + + wait_for(threads[:]) + + testing.expect_value(t, data.b.index, 0) + testing.expect_value(t, data.b.generation_id, 1) + testing.expect_value(t, data.b.thread_count, THREADS + 1) + testing.expect_value(t, data.number, THREADS) +} + +@test +test_auto_reset :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + a: sync.Auto_Reset_Event, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("AUR-%v> entering", th.id) + sync.auto_reset_event_wait(&data.a) + // log.debugf("AUR-%v> adding", th.id) + data.number += 1 + // log.debugf("AUR-%v> signalling", th.id) + sync.auto_reset_event_signal(&data.a) + // log.debugf("AUR-%v> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + // There is a chance that this test can stall if a signal is sent before + // all threads are queued, because it's possible for some number of threads + // to get to the waiting state, the signal to fire, all of the waited + // threads to pass successfully, then the other threads come in with no-one + // to run a signal. + // + // So we'll just test a fully-waited queue of cascading threads. + for { + status := intrinsics.atomic_load(&data.a.status) + if status == -THREADS { + // log.debug("All Auto_Reset_Event threads have queued.") + break + } + intrinsics.cpu_relax() + } + + sync.auto_reset_event_signal(&data.a) + + wait_for(threads[:]) + + // The last thread should leave this primitive in a signalled state. + testing.expect_value(t, data.a.status, 1) + testing.expect_value(t, data.number, THREADS) +} + +@test +test_auto_reset_already_signalled :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + a: sync.Auto_Reset_Event + sync.auto_reset_event_signal(&a) + sync.auto_reset_event_wait(&a) + testing.expect_value(t, a.status, 0) +} + +@test +test_ticket_mutex :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + m: sync.Ticket_Mutex, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("TIC-%i> entering", th.id) + // intrinsics.debug_trap() + sync.ticket_mutex_lock(&data.m) + // log.debugf("TIC-%i> locked", th.id) + data.number += 1 + // log.debugf("TIC-%i> unlocking", th.id) + sync.ticket_mutex_unlock(&data.m) + // log.debugf("TIC-%i> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + wait_for(threads[:]) + + testing.expect_value(t, data.m.ticket, THREADS) + testing.expect_value(t, data.m.serving, THREADS) + testing.expect_value(t, data.number, THREADS) +} + +@test +test_benaphore :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + b: sync.Benaphore, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + sync.benaphore_lock(&data.b) + data.number += 1 + sync.benaphore_unlock(&data.b) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + wait_for(threads[:]) + + testing.expect_value(t, data.b.counter, 0) + testing.expect_value(t, data.number, THREADS) +} + +@test +test_recursive_benaphore :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + b: sync.Recursive_Benaphore, + number: int, + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + + // log.debugf("REC_BEP-%i> entering", th.id) + tried1 := sync.recursive_benaphore_try_lock(&data.b) + for _ in 0..<3 { + sync.recursive_benaphore_lock(&data.b) + } + tried2 := sync.recursive_benaphore_try_lock(&data.b) + // log.debugf("REC_BEP-%i> locked", th.id) + data.number += 1 + for _ in 0..<3 { + sync.recursive_benaphore_unlock(&data.b) + } + if tried1 { sync.recursive_benaphore_unlock(&data.b) } + if tried2 { sync.recursive_benaphore_unlock(&data.b) } + // log.debugf("REC_BEP-%i> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + wait_for(threads[:]) + + // The benaphore should be unowned at the end. + testing.expect_value(t, data.b.counter, 0) + testing.expect_value(t, data.b.owner, 0) + testing.expect_value(t, data.b.recursion, 0) + testing.expect_value(t, data.number, THREADS) +} + +@test +test_once :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + once: sync.Once, + number: int, + } + + write :: proc "contextless" (data: rawptr) { + data := cast(^Data)data + data.number += 1 + } + + p :: proc(th: ^thread.Thread) { + data := cast(^Data)th.data + // log.debugf("ONCE-%v> entering", th.id) + sync.once_do_with_data_contextless(&data.once, write, data) + // log.debugf("ONCE-%v> leaving", th.id) + } + + data: Data + threads: [THREADS]^thread.Thread + + for &v in threads { + v = thread.create(p) + v.data = &data + v.init_context = context + thread.start(v) + } + + wait_for(threads[:]) + + testing.expect_value(t, data.once.done, true) + testing.expect_value(t, data.number, 1) +} + +@test +test_park :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + car: sync.Parker, + number: int, + } + + data: Data + + th := thread.create_and_start_with_data(&data, proc(data: rawptr) { + data := cast(^Data)data + time.sleep(SLEEP_TIME) + sync.unpark(&data.car) + data.number += 1 + }) + + sync.park(&data.car) + + wait_for([]^thread.Thread{ th }) + + PARKER_EMPTY :: 0 + testing.expect_value(t, data.car.state, PARKER_EMPTY) + testing.expect_value(t, data.number, 1) +} + +@test +test_park_with_timeout :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + car: sync.Parker + sync.park_with_timeout(&car, SLEEP_TIME) +} + +@test +test_one_shot_event :: proc(t: ^testing.T) { + testing.set_fail_timeout(t, FAIL_TIME) + + Data :: struct { + event: sync.One_Shot_Event, + number: int, + } + + data: Data + + th := thread.create_and_start_with_data(&data, proc(data: rawptr) { + data := cast(^Data)data + time.sleep(SLEEP_TIME) + sync.one_shot_event_signal(&data.event) + data.number += 1 + }) + + sync.one_shot_event_wait(&data.event) + + wait_for([]^thread.Thread{ th }) + + testing.expect_value(t, data.event.state, 1) + testing.expect_value(t, data.number, 1) +} From 788e4b2b6a381cb19e34ba659d517ac442eb55f1 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 15:56:18 +0200 Subject: [PATCH 105/320] core/encoding/cbor: allow unmarshalling non-string map keys --- core/encoding/cbor/unmarshal.odin | 38 +++++++++---------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/core/encoding/cbor/unmarshal.odin b/core/encoding/cbor/unmarshal.odin index c54660839..bf27171f4 100644 --- a/core/encoding/cbor/unmarshal.odin +++ b/core/encoding/cbor/unmarshal.odin @@ -675,10 +675,6 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, return case reflect.Type_Info_Map: - if !reflect.is_string(t.key) { - return _unsupported(v, hdr) - } - raw_map := (^mem.Raw_Map)(v.data) if raw_map.allocator.procedure == nil { raw_map.allocator = context.allocator @@ -695,43 +691,31 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, new_len := uintptr(min(scap, runtime.map_len(raw_map^)+length)) runtime.map_reserve_dynamic(raw_map, t.map_info, new_len) or_return } - - // Temporary memory to unmarshal keys into before inserting them into the map. + + // Temporary memory to unmarshal values into before inserting them into the map. elem_backing := mem.alloc_bytes_non_zeroed(t.value.size, t.value.align, context.temp_allocator) or_return defer delete(elem_backing, context.temp_allocator) - map_backing_value := any{raw_data(elem_backing), t.value.id} - for idx := 0; unknown || idx < length; idx += 1 { - // Decode key, keys can only be strings. - key: string - if keyv, kerr := decode_key(d, v); unknown && kerr == .Break { - break - } else if kerr != nil { - err = kerr - return - } else { - key = keyv - } + // Temporary memory to unmarshal keys into. + key_backing := mem.alloc_bytes_non_zeroed(t.key.size, t.key.align, context.temp_allocator) or_return + defer delete(key_backing, context.temp_allocator) + key_backing_value := any{raw_data(key_backing), t.key.id} + for idx := 0; unknown || idx < length; idx += 1 { if unknown || idx > scap { // Reserve space for new element so we can return allocator errors. new_len := uintptr(runtime.map_len(raw_map^)+1) runtime.map_reserve_dynamic(raw_map, t.map_info, new_len) or_return } + mem.zero_slice(key_backing) + _unmarshal_value(d, key_backing_value, _decode_header(r) or_return) or_return + mem.zero_slice(elem_backing) _unmarshal_value(d, map_backing_value, _decode_header(r) or_return) or_return - key_ptr := rawptr(&key) - key_cstr: cstring - if reflect.is_cstring(t.key) { - assert_safe_for_cstring(key) - key_cstr = cstring(raw_data(key)) - key_ptr = &key_cstr - } - - set_ptr := runtime.__dynamic_map_set_without_hash(raw_map, t.map_info, key_ptr, map_backing_value.data) + set_ptr := runtime.__dynamic_map_set_without_hash(raw_map, t.map_info, key_backing_value.data, map_backing_value.data) // We already reserved space for it, so this shouldn't fail. assert(set_ptr != nil) } From 1025b9e6c067edfbb43f8119ec68d5684d1b18ca Mon Sep 17 00:00:00 2001 From: InKryption Date: Wed, 11 Sep 2024 18:56:49 +0200 Subject: [PATCH 106/320] Enable -out: for doc subcommand The logic for writing the .odin-doc file to the value assigned to out_filepath already exists, this just enables it on the CLI frontend. --- src/main.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 3f458364f..06c200442 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -509,7 +509,7 @@ gb_internal bool parse_build_flags(Array args) { auto build_flags = array_make(heap_allocator(), 0, BuildFlag_COUNT); add_flag(&build_flags, BuildFlag_Help, str_lit("help"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_SingleFile, str_lit("file"), BuildFlagParam_None, Command__does_build | Command__does_check); - add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String, Command__does_build | Command_test); + add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String, Command__does_build | Command_test | Command_doc); add_flag(&build_flags, BuildFlag_OptimizationMode, str_lit("o"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None, Command__does_check); @@ -2164,6 +2164,12 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(1, "-doc-format"); print_usage_line(2, "Generates documentation as the .odin-doc format (useful for external tooling)."); print_usage_line(0, ""); + + print_usage_line(1, "-out:"); + print_usage_line(2, "Sets the base name of the resultig .odin-doc file."); + print_usage_line(2, "The extension can be optionally included; the resulting file will always have an extension of '.odin-doc'."); + print_usage_line(2, "Example: -out:foo"); + print_usage_line(0, ""); } if (run_or_build) { From 3b22c0854c0a64ae27ca43f59b5f6cdffcae56ab Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 11 Sep 2024 22:45:16 +0200 Subject: [PATCH 107/320] fix some LLVM assertions --- src/llvm_backend_const.cpp | 4 ++-- src/llvm_backend_type.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 6a6b119aa..754bbfca2 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -154,7 +154,7 @@ gb_internal LLVMValueRef llvm_const_named_struct(lbModule *m, Type *t, LLVMValue GB_ASSERT(value_count_ == bt->Struct.fields.count); auto field_remapping = lb_get_struct_remapping(m, t); - unsigned values_with_padding_count = LLVMCountStructElementTypes(struct_type); + unsigned values_with_padding_count = elem_count; LLVMValueRef *values_with_padding = gb_alloc_array(permanent_allocator(), LLVMValueRef, values_with_padding_count); for (unsigned i = 0; i < value_count; i++) { @@ -722,7 +722,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bo } case ExactValue_Integer: - if (is_type_pointer(type) || is_type_multi_pointer(type)) { + if (is_type_pointer(type) || is_type_multi_pointer(type) || is_type_proc(type)) { LLVMTypeRef t = lb_type(m, original_type); LLVMValueRef i = lb_big_int_to_llvm(m, t_uintptr, &value.value_integer); res.value = LLVMConstIntToPtr(i, t); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 638170bfc..9d4505bb0 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -826,7 +826,7 @@ gb_internal void lb_setup_type_info_data_giant_array(lbModule *m, i64 global_typ if (t->Struct.soa_kind != StructSoa_None) { - Type *kind_type = get_struct_field_type(tag_type, 10); + Type *kind_type = get_struct_field_type(tag_type, 7); lbValue soa_kind = lb_const_value(m, kind_type, exact_value_i64(t->Struct.soa_kind)); LLVMValueRef soa_type = get_type_info_ptr(m, t->Struct.soa_elem); From 27ed10746db72fd3e5ba9aea922cb064aa3f8995 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 11 Sep 2024 23:08:38 +0100 Subject: [PATCH 108/320] Allow `transmute(Bit_Set)~T(0)` --- src/check_expr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 45c3e9a3c..760551a72 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3612,7 +3612,8 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type if (are_types_identical(src_bt, dst_bt)) { return true; } - if (is_type_integer(src_t) && is_type_integer(dst_t)) { + if ((is_type_integer(src_t) && is_type_integer(dst_t)) || + is_type_integer(src_t) && is_type_bit_set(dst_t)) { if (types_have_same_internal_endian(src_t, dst_t)) { ExactValue src_v = exact_value_to_integer(o->value); GB_ASSERT(src_v.kind == ExactValue_Integer || src_v.kind == ExactValue_Invalid); From 201a7b90bb52facf9bd364a96061fc6c19e19031 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 12 Sep 2024 00:11:27 +0200 Subject: [PATCH 109/320] fix EventMaskAny definition --- core/sys/darwin/Foundation/NSEvent.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sys/darwin/Foundation/NSEvent.odin b/core/sys/darwin/Foundation/NSEvent.odin index f20afd3ab..548c5c172 100644 --- a/core/sys/darwin/Foundation/NSEvent.odin +++ b/core/sys/darwin/Foundation/NSEvent.odin @@ -5,8 +5,8 @@ Event :: struct {using _: Object} -EventMask :: distinct bit_set[EventType; UInteger] -EventMaskAny :: ~EventMask{} +EventMask :: distinct bit_set[EventType; UInteger] +EventMaskAny :: transmute(EventMask)(max(UInteger)) when size_of(UInteger) == 4 { // We don't support a 32-bit darwin system but this is mostly to shut up the type checker for the time being From 387f56634d337152d7aba07b740cf5821db9e67f Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 12 Sep 2024 02:16:04 +0200 Subject: [PATCH 110/320] fix reuse of slice for varargs with poly types --- src/check_expr.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 760551a72..f1bf86992 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6204,22 +6204,6 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A Entity *vt = pt->params->Tuple.variables[pt->variadic_index]; o.type = vt->type; - - // NOTE(bill, 2024-07-14): minimize the stack usage for variadic parameters with the backing array - if (c->decl) { - bool found = false; - for (auto &vr : c->decl->variadic_reuses) { - if (are_types_identical(vt->type, vr.slice_type)) { - vr.max_count = gb_max(vr.max_count, variadic_operands.count); - found = true; - break; - } - } - if (!found) { - array_add(&c->decl->variadic_reuses, VariadicReuseData{vt->type, variadic_operands.count}); - } - } - } else { dummy_argument_count += 1; o.type = t_untyped_nil; @@ -6413,6 +6397,23 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A } score += eval_param_and_score(c, o, t, err, true, var_entity, show_error); } + + if (!vari_expand && variadic_operands.count != 0) { + // NOTE(bill, 2024-07-14): minimize the stack usage for variadic parameters with the backing array + if (c->decl) { + bool found = false; + for (auto &vr : c->decl->variadic_reuses) { + if (are_types_identical(slice, vr.slice_type)) { + vr.max_count = gb_max(vr.max_count, variadic_operands.count); + found = true; + break; + } + } + if (!found) { + array_add(&c->decl->variadic_reuses, VariadicReuseData{slice, variadic_operands.count}); + } + } + } } if (data) { From 55a9ba1fc00a68fb83ad0b24878db815e68b546a Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Wed, 11 Sep 2024 22:25:38 -0600 Subject: [PATCH 111/320] Finish sys/socket POSIX support for Linux. --- core/sys/posix/sys_socket.odin | 126 +++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 47 deletions(-) diff --git a/core/sys/posix/sys_socket.odin b/core/sys/posix/sys_socket.odin index 1f228c396..185bb7722 100644 --- a/core/sys/posix/sys_socket.odin +++ b/core/sys/posix/sys_socket.odin @@ -382,6 +382,12 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS msg_controllen: c.size_t, /* [PSX] ancillary data buffer length */ msg_flags: Msg_Flags, /* [PSX] flags on received message */ } + + cmsghdr :: struct { + cmsg_len: c.size_t, /* [PSX] data byte count, including cmsghdr */ + cmsg_level: c.int, /* [PSX] originating protocol */ + cmsg_type: c.int, /* [PSX] protocol-specific type */ + } } else { sockaddr_storage :: struct { ss_len: c.uint8_t, /* address length */ @@ -400,13 +406,12 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS msg_controllen: socklen_t, /* [PSX] ancillary data buffer length */ msg_flags: Msg_Flags, /* [PSX] flags on received message */ } - } - - cmsghdr :: struct { - cmsg_len: socklen_t, /* [PSX] data byte count, including cmsghdr */ - cmsg_level: c.int, /* [PSX] originating protocol */ - cmsg_type: c.int, /* [PSX] protocol-specific type */ + cmsghdr :: struct { + cmsg_len: socklen_t, /* [PSX] data byte count, including cmsghdr */ + cmsg_level: c.int, /* [PSX] originating protocol */ + cmsg_type: c.int, /* [PSX] protocol-specific type */ + } } SCM_RIGHTS :: 0x01 @@ -456,51 +461,78 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS SOCK_STREAM :: 1 // Options to be accessed at socket level, not protocol level. - SOL_SOCKET :: 0xffff + when ODIN_OS == .Linux { + SOL_SOCKET :: 1 - SO_ACCEPTCONN :: 0x0002 - SO_BROADCAST :: 0x0020 - SO_DEBUG :: 0x0001 - SO_DONTROUTE :: 0x0010 - SO_ERROR :: 0x1007 - SO_KEEPALIVE :: 0x0008 - SO_OOBINLINE :: 0x0100 - SO_RCVBUF :: 0x1002 - SO_RCVLOWAT :: 0x1004 - SO_REUSEADDR :: 0x0004 - SO_SNDBUF :: 0x1001 - SO_SNDLOWAT :: 0x1003 - SO_TYPE :: 0x1008 + SO_ACCEPTCONN :: 30 + SO_BROADCAST :: 6 + SO_DEBUG :: 1 + SO_DONTROUTE :: 5 + SO_ERROR :: 4 + SO_KEEPALIVE :: 9 + SO_OOBINLINE :: 10 + SO_RCVBUF :: 8 + SO_RCVLOWAT :: 18 + SO_REUSEADDR :: 2 + SO_SNDBUF :: 7 + SO_SNDLOWAT :: 19 + SO_TYPE :: 3 + SO_LINGER :: 13 - when ODIN_OS == .Darwin { - SO_LINGER :: 0x1080 - SO_RCVTIMEO :: 0x1006 - SO_SNDTIMEO :: 0x1005 - } else when ODIN_OS == .FreeBSD { - SO_LINGER :: 0x0080 - SO_RCVTIMEO :: 0x1006 - SO_SNDTIMEO :: 0x1005 - } else when ODIN_OS == .NetBSD { - SO_LINGER :: 0x0080 - SO_RCVTIMEO :: 0x100c - SO_SNDTIMEO :: 0x100b - } else when ODIN_OS == .OpenBSD { - SO_LINGER :: 0x0080 - SO_RCVTIMEO :: 0x1006 - SO_SNDTIMEO :: 0x1005 + SO_RCVTIMEO :: 66 + SO_SNDTIMEO :: 67 + } else { + SOL_SOCKET :: 0xffff + + SO_ACCEPTCONN :: 0x0002 + SO_BROADCAST :: 0x0020 + SO_DEBUG :: 0x0001 + SO_DONTROUTE :: 0x0010 + SO_ERROR :: 0x1007 + SO_KEEPALIVE :: 0x0008 + SO_OOBINLINE :: 0x0100 + SO_RCVBUF :: 0x1002 + SO_RCVLOWAT :: 0x1004 + SO_REUSEADDR :: 0x0004 + SO_SNDBUF :: 0x1001 + SO_SNDLOWAT :: 0x1003 + SO_TYPE :: 0x1008 + + when ODIN_OS == .Darwin { + SO_LINGER :: 0x1080 + SO_RCVTIMEO :: 0x1006 + SO_SNDTIMEO :: 0x1005 + } else when ODIN_OS == .FreeBSD { + SO_LINGER :: 0x0080 + SO_RCVTIMEO :: 0x1006 + SO_SNDTIMEO :: 0x1005 + } else when ODIN_OS == .NetBSD { + SO_LINGER :: 0x0080 + SO_RCVTIMEO :: 0x100c + SO_SNDTIMEO :: 0x100b + } else when ODIN_OS == .OpenBSD { + SO_LINGER :: 0x0080 + SO_RCVTIMEO :: 0x1006 + SO_SNDTIMEO :: 0x1005 + } } // The maximum backlog queue length for listen(). - SOMAXCONN :: 128 + when ODIN_OS == .Linux { + SOMAXCONN :: 4096 + } else { + SOMAXCONN :: 128 + } when ODIN_OS == .Linux { - MSG_CTRUNC :: 0x007 + MSG_CTRUNC :: 0x008 MSG_DONTROUTE :: 0x004 MSG_EOR :: 0x080 MSG_OOB :: 0x001 MSG_PEEK :: 0x002 MSG_TRUNC :: 0x020 MSG_WAITALL :: 0x100 + MSG_NOSIGNAL :: 0x4000 } else { MSG_CTRUNC :: 0x20 MSG_DONTROUTE :: 0x4 @@ -509,16 +541,14 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS MSG_PEEK :: 0x2 MSG_TRUNC :: 0x10 MSG_WAITALL :: 0x40 - } - when ODIN_OS == .Darwin { - MSG_NOSIGNAL :: 0x80000 - } else when ODIN_OS == .FreeBSD { - MSG_NOSIGNAL :: 0x00020000 - } else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { - MSG_NOSIGNAL :: 0x0400 - } else when ODIN_OS == .Linux { - MSG_NOSIGNAL :: 0x4000 + when ODIN_OS == .Darwin { + MSG_NOSIGNAL :: 0x80000 + } else when ODIN_OS == .FreeBSD { + MSG_NOSIGNAL :: 0x00020000 + } else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { + MSG_NOSIGNAL :: 0x0400 + } } AF_INET :: 2 @@ -530,6 +560,8 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS AF_INET6 :: 28 } else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { AF_INET6 :: 24 + } else when ODIN_OS == .Linux { + AF_INET6 :: 10 } SHUT_RD :: 0 From 3166c7bef921dcf48ac233738ec2064362bcbbd8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Sep 2024 10:07:09 +0100 Subject: [PATCH 112/320] Add `Suggested Example` for using an inline procedure which enables a target feature --- src/check_expr.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index f1bf86992..7f82fb58a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8087,7 +8087,10 @@ gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *c GB_ASSERT(c->curr_proc_decl->entity->type->kind == Type_Proc); String scope_features = c->curr_proc_decl->entity->type->Proc.enable_target_feature; if (!check_target_feature_is_superset_of(scope_features, pt->Proc.enable_target_feature, &invalid)) { + ERROR_BLOCK(); error(call, "Inlined procedure enables target feature '%.*s', this requires the calling procedure to at least enable the same feature", LIT(invalid)); + + error_line("\tSuggested Example: @(enable_target_feature=\"%.*s\")\n", LIT(invalid)); } } } From 18a63037d1d3e887ea2f2ac16feea926f61df3c1 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 13 Sep 2024 20:51:06 +0200 Subject: [PATCH 113/320] vendor/box2d: build in release mode --- vendor/box2d/build_box2d.sh | 14 +++++++------- vendor/box2d/lib/box2d_darwin_amd64_avx2.a | Bin 913288 -> 355808 bytes vendor/box2d/lib/box2d_darwin_amd64_sse2.a | Bin 913288 -> 355808 bytes vendor/box2d/lib/box2d_darwin_arm64.a | Bin 875336 -> 290152 bytes 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/vendor/box2d/build_box2d.sh b/vendor/box2d/build_box2d.sh index 4fa64faa0..3e74c0218 100755 --- a/vendor/box2d/build_box2d.sh +++ b/vendor/box2d/build_box2d.sh @@ -11,7 +11,7 @@ tar -xzvf "v$VERSION.tar.gz" cd "box2d-$VERSION" -DISABLE_FLAGS="-DBOX2D_SAMPLES=OFF -DBOX2D_VALIDATE=OFF -DBOX2D_UNIT_TESTS=OFF" +FLAGS="-DCMAKE_BUILD_TYPE=Release -DBOX2D_SAMPLES=OFF -DBOX2D_VALIDATE=OFF -DBOX2D_UNIT_TESTS=OFF" case "$(uname -s)" in Darwin) @@ -21,20 +21,20 @@ Darwin) "x86_64" | "amd64") rm -rf build mkdir build - cmake $DISABLE_FLAGS -DBOX2D_AVX2=ON -DCMAKE_OSX_ARCHITECTURES=x86_64 -S . -B build + cmake $FLAGS -DBOX2D_AVX2=ON -DCMAKE_OSX_ARCHITECTURES=x86_64 -S . -B build cmake --build build cp build/src/libbox2d.a ../lib/box2d_darwin_amd64_avx2.a rm -rf build mkdir build - cmake $DISABLE_FLAGS -DBOX2D_AVX2=OFF -DCMAKE_OSX_ARCHITECTURES=x86_64 -S . -B build + cmake $FLAGS -DBOX2D_AVX2=OFF -DCMAKE_OSX_ARCHITECTURES=x86_64 -S . -B build cmake --build build cp build/src/libbox2d.a ../lib/box2d_darwin_amd64_sse2.a ;; *) rm -rf build mkdir build - cmake $DISABLE_FLAGS -DCMAKE_OSX_ARCHITECTURES=arm64 -S . -B build + cmake $FLAGS -DCMAKE_OSX_ARCHITECTURES=arm64 -S . -B build cmake --build build cp build/src/libbox2d.a ../lib/box2d_darwin_arm64.a ;; @@ -45,20 +45,20 @@ Darwin) "x86_64" | "amd64") rm -rf build mkdir build - cmake $DISABLE_FLAGS -DBOX2D_AVX2=ON -S . -B build + cmake $FLAGS -DBOX2D_AVX2=ON -S . -B build cmake --build build cp build/src/libbox2d.a ../lib/box2d_other_amd64_avx2.a rm -rf build mkdir build - cmake $DISABLE_FLAGS -DBOX2D_AVX2=OFF -S . -B build + cmake $FLAGS -DBOX2D_AVX2=OFF -S . -B build cmake --build build cp build/src/libbox2d.a ../lib/box2d_other_amd64_sse2.a ;; *) rm -rf build mkdir build - cmake $DISABLE_FLAGS -DCMAKE_OSX_ARCHITECTURES=arm64 -S . -B build + cmake $FLAGS -DCMAKE_OSX_ARCHITECTURES=arm64 -S . -B build cmake --build build cp build/src/libbox2d.a ../lib/box2d_other.a ;; diff --git a/vendor/box2d/lib/box2d_darwin_amd64_avx2.a b/vendor/box2d/lib/box2d_darwin_amd64_avx2.a index 2e2b72cb18dc44999ac7fa1f03779375f2381de3..269de02fa8850748b04f9ca4a9340f376833c58e 100644 GIT binary patch literal 355808 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

    _VFlsV(Wo+%?I??$Otn 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 z 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�LpL^=AZ?bR1=cT;3zv=#SKSo2| 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

    0F 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�Uyc8(v?^fN6=|n$j_{yq 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

    5L8oGGFck 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�}Fhl-IDl{S=4y23UzC`&SX5vSbU!0-; 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

    yMVI&d!0TByeltt+pAi(o&^-?+8~{$5cc0E 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 literal 913288 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�FNNGO@#$q@zZ~{!hRH9=8RctPIVgXW$N7{iVr?^Gtz+VoKIE;C zJ0?DUM*fA!H~C>S{iRU#@~v!D`GTgLMk8-1P%>7|N5C{1J)=EfR>QOvm86~}VO%Cj zx)i33Ms75wn_+q(OdGAH5$&cY%`_u)WMMQ(CnDCCBi1@5J~1lf)sQEvq2mqOk&IcJR_XHDpPI$Fi_;9KlQ&k#F?*p1k2 zeC)d(m^Ru?&xf}u3!_O|e2*tB2r=oH_>?;2rI0%&KHe+# zasqh_X5@}oys}Cx?!J*SX}yzqarDv&L*~Om{Bfj}LcTEK`89;dEgeO5JM^ZI*GztB z$nl8t(f4%p8q=8b& zCO�FNNGO@oCMlUk>{;-xTcG;*Uc-3-$U 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�LpL^=AZ?bR1=cT;3zv=#SKSo2|@m=qJ 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

    )QyqyN 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%0AVH{1?KlESP^U-(yVJZQY6mra8BP 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 X;l#KLa&ok zzPst{y~h5t6{4-u@69V;;LTg+_2%t1L{$Xt^$QB5I|pvWxwlt{x!!;`&%k~5-oXBo zQ;yVujyJqwtF^l~t@;=F+r|F;iJ}|t_7DDS!PLAD7F?cpQ#s-)^ybaEVRqgq{C4B_ ztQ%(L?Y-T&Bv?2%FN`!|Nc-J%QRVke&3hK;dRJWK8QC$~Yh0P<8TtI^*+9HTmpf+U zjJ&2vv-1Sv7Vg=Qdum=ePKjy>QN>@;(Xu;OU1&gS7HPzT`$u{!JTj6 z(@%2ibPM3Nu;VXoS?0IYvs%Y*+e5#)mQ9Vb1pUX`VzU29dQMNu{%1Cw)R_Tt7x{m=qi1|-@1H5Q7u3j9d3dG%7jtOy+?1!|I#njFr`!y|Bj6=jA9OW&Bf7JKjlH#hLLZs@~ z@T#KBPY1%0Y!ry_5Zu|ob%+eZjIE!e`1OrfMePZ}eIXaZ?Qt8T4V~$JYB$>LF}#O7 z>Efp1QDSyMh8X3_@DJ|9Q3HKxMwgKuTkRM5zYsvAk?VDdgQsu&?ta~0eh5D*9{*qj zVT7^h7swC#Lb10$ZOrv}-E|MnlxZt6iVjiVc>2a8ojPq{_`9v`SC(;-tTA28RhhKu zm`IBiT`U8lOi4|)>rr-Ltfea<{2mYyZUy-RF5JTI7IxPGkq_UkK*;heA^Bg&ZbAy@ z2SOKgM2qB;+(ajVKu1@u=m6;^Bz{m~rk~Nv2q1oDmP@2(xkl!?TLxpl4BGhnrqyymtLD18hV`L3X*8(DL z4Zj7&#-+rE|J;u^{@eb6YGeOLx46(3rJ)~7-+wmEXrq4YbeiZIEBu4sDilBc_L1sC z{h43Psf3*Y`|ZvNhj&eyh`7W?!%Vl;B?iX_Me)h|##~ys-T!$?<9OOwN@s5;!W-c+ zNOv6MT8y+RkY+j34($JU_$SDCXy?<1j%I$r zlx-qpn?yRPjmy>#*~Zm~V%Pn1+7sl8l3ckd<@$n4bSIP9+E+t<*&m}Sag`y8y11W~ zbpsSzT_PVVls7^B$|Xs{A7lQ(6#P0QiZDTtrZ%LtHk*>A#wzGT0NTvbEf%y8Own1*K7wUH{Y_Zhg zCZ3fqsyBr7`(!5zEiH2bxf!Hk@EF@)vfaSe_{`M(f#Mu3;4LmVD@?}f`wb` z9q9kG|2)PuNB5uF{nz%Nb1m`F&md|p^;M|BF#>%JHNRcJ@pN#2UUX{IuN^{sWIN+x zAIdRQ|JlcK(AkTv2$HP-q< zAGW_veE}lf`$zOG$N6_3`my6_W6(#GBWwVD*GtlFv-iaU;b8Y=`@4-hFIz)#+<%`y zI&nL1p!x-bH4q2Vz8C%NO9FkZ=;}{1qzvOAgWK)Lu`T|=d}Ca#3-ilAlHG~;v|JQt zXXe@*l6gG*|53`U`dR9;b)VbvX|eyV5u*Dr=jrUd6-c)n=?Bp7zT64O)Wf}8Y2v>0fIo0JY7N8kH- z$l=tTdzinwC_~IGL0&zS-vV(bj>xIXK|IrqoZZ*sUS#CFUp{Na#}7b`oIAHaHhqU^ zTZ#MkX*pdT8TTL9H~h$R501V6z{8jM55y*S-0;lgXKpw$dEX81O#aFZv5Z9rb`Ib9 z+)oO`e?Rk=b5-{n?)O8OyAMOYb42WCbx3EqF>H4+Znu&1qw62?4@@`wgS(BKu4xa6 z0e6P@@6fq(a(<6InHTkQsNV@yPxpT_!AF0Uz~9C(P(O^io4_B&ogDc~7Qb%yE9 zZHh=V4!Eg52WA6T0Le}-1JXF)X7{`BOLXd=iT(nR!bKQKe&SDMehi49nL$QBqn8mN z`P+e3`}=NkLrUF06v3Tr9MF2h(P@&e^>8!0b-ov{TkEkNZpdX`w>#W7I^5*f>OaXi z5oFCmtq$3&_5bNObBG3L zTw3qiP5mw1y5e1^oxXqq;iC8`tREdZj(MXN5F^mnkmC%;6Jr5-QE6$MnK?{Nu<=ui zCZil`oOuo5$TkU%5TXOJB^zgQ!5@d4(z)0xKV95OYo^XIqIEdz=520iH;3*EzHS{K z1o|ZdH`$gHzBWmC5xG>3EklJ(mbQEBg{Pe?eCtJoPbzy$-jK4pX*|H#@Cfu&usz$H zt7v*b^iqt4YW|{W*^n!l-$zo=3pVGOaU_m`qKn3+PM4S)#W=UfaMu=KTpGJIe~sr- z=x@76mK}|?A&hg85wY$sKvviGdF`kpdxMgO@p1b&>8}Oj-)4+|XjZx67{bF3g$;u4 zcEwglz(d8&ZJ}`4vF=?|KW-{+$M`cUf^pY5Zl;nqVv+Ya#!He{geOUTTV-{fyjPCf zrkv0x$z+q$KeU{&aqit0D`QffmL%8dIF#K5>2%eOA$97Zdiz)CG^xDPlFR#r3zc`> z(DLs3E9FgE2iR`2)qy|WXRiZj4+(X^eF1eK+r8T(Vxv*FyHnK#k2^+o-c9+2QTt=m z%WSmo-KgW!i>9>~7f);V2L7Y0An?nw!oaV}cI*-dVn%GCH}Do{zXt6$WmAl|%N{uV zP}vTT>p*OHY@r9XX))sSxJ5Vh1JqZZ1iDEM3(cDDXVH&Ry3@A#KY#t$oZXdUJ-fZI zAA=d_S3U>UWtZ>Jh@qFw!2HJms_RF#&U0CF{G=Agsi{5=OG z{!>8Ww=#VKV>Uv+rZe7oF*{$m}wJ-9o>*=464!L!`zKh+IK3!kMO?*E&a8=?a_crMg zf(BA@pJ6x6ZOHusyQ|r)`;AB0t@{a@r;vZ$FZ8fmw{x0~$@Jidu0kNWbvp{MTeq7u zcI$RR>jLCo*ZY3NL2lhncHuYv%!}l(y6Lyoon+oDcUzmQu4=Yyr}089?`(2-byC?g zZT-S)@(#~Vs?{?c9GA?yjm`nohH!^(2hni^s6M}pp2^wHAR_{poR2u0Wo5R-r9w-B zKI{(RZEn44puEPnufw0kA)f`>H$+_QeyrIu=koputXo6ndez#wjzHb+QK|@D+_;9? z2hliR`RnJ(quqKP0o|dzE_5AX%Zzw@X#QedsSq^bf`t$x&{uUe&e8}sh3aO_lO*T< zt{BHNk^@9$+Kmh>2iUHm)+P3Ee0^Atplb`_qrA<$R*35)g?iHXm1c9G%txrPUPI;;nNDQuCqq&=q~5WQo2Nqcehjscp_ zyDu-X`S&2LqI5ATyYu?3IS5lc6?1|w`L`}x82s0wg{%Hm+xPAi=?9TMrCWqK0X>&I zjP+ge>kjz`i-*O!1?+s{3tm%6w*Gz^>+52h|1s!oulv?pO3^>!(Nyeb&h>JNht}#_ z|I1&Bv1abBKln=*8RE|VtfwcvLT(qW6^J`e!u{U(rzb5l+$GEK$(XA#55EHDVCxBg zY2+{G=3<_*n!@h-%ekwsrst{P1y5YkM(NYqdL$FN-htuP?$g((!T~U&bL2hd>;{bwKn!RMuMVA3!x6Y&`-@ z7lXUt_IQo`o{?fOe;J+=#2zRUv7Ke`gZ(xBL1FlN+~Sedk%7)81AFd-8++hZh@Sja zqB}O)e^&T2&csUmJ>pi;GcG8)TYv8_b?-GwTR#RqWt8T3;NFA#38VDIY?LwP7M=I` zKTmbm9YXyJU=I)Upk-|>4@mi9d5F_3dfXrU(`xrHF&Oz6^&EP7+okln<;W$h*Ku8M zn|hsK>eZcg;d+&RAAnzwcPyhYFe{sK*HqeUtH0~?zVyZXpPe32<0T)3JUlChd zKf>?pl|E>ltq;$p^m89K+JgHk(d`~%w24>z!$q$+Q-pfv&ZYVC7+J2pnOIxux_+w% za$(2Kzk1QulGS(JuKG})ss3BnGUp(j`$u4n67`XujZqogkMikz^XW;}HO*9e3}`(< zybzS@5U~;BAhj*(dv;~2zGngIaPF19!p0mNrq73*Ge^ig7T#rdE0XWgVBd>@=ddn3k4?jKS?s&HHv@aFY442- zdvDa<7BkK)agfFaiua@?-U-lWewLVpIyt{F8ZR; z?mNHJJ^?b2-`>${?ztla`oG^8(}^}vR#4i$>qCF(D}TwF=ea-d`2x5*sa}75anyr) z?JmgP{m3P;)xTO@(q4i+il`5xicbc%Vh>LD-8o`w^b)bv13K2^M!7+c=74^w*c!=4 zU&qgbh5zL;!~as5%YUS7J^H-hC9#FV|9#MYQ0DUXE===(uWbEG50?c$<2tZmOl;vV z&_Dg`+_~|TFSTcA33Rj=x~hQA%Avc!{xc2VPyP&^`xI}wy&Q^B4kZ&~vTcA@~x{CISr{Si3=2l+ul2~^(Y!#}jMFpsB^mBiG+kg#GOT&({BIJlPgv?|+T=A9(g!f6s$O-n?h86+M{~ zjQosTSANG*e@_s!j-{gK6zW4K+IuJZ!`9`HDFe1ZHu?a_gx|A*_#H)BZj{~J0{3pM zd);U3`&^~Zk97Sj5Fhdu#9sa&_U3o27Cp3of#NVwegVkd3V%OFA7x+g$y*5zVnkDAGxKwm^E*Cvt8<*kRx6{Ar8JGWTfxBZw1@6V^!#@3> zzaVdC`mp-)Jr7;7e&oZK6ueP5q7b}&+2SniqaeHWIQlZO`^au>HL!0O{9Pkr-ENEr zE|0&*`$oqI!+@={XXhn_`0aheJHj<}SiQ?Y96JA~x1>+24k+)vesA70xV4_GdLSKy zNCyvld{!Nty*J+8PEIM`g!DCP1e0cMbNVcw{<+YnEcZ`YHBIor711Q^SYAEQ}Y&&^yG`8sd+9>VcvSTC%>Sm5dDwZ`}Frn z-|z%{0%>`LC*SZCG_dY;h}eEIL-9LG=DeeJDc90W^78<*WQ70z8<$O zbE`c|Wv=a58vi{$>f1}&slV6#dlYlwVng&4Wr&_>9??@WT=aM|miWp81$e&)diRL@ z!s5cb5cJ{C5c#4Q@BQFCAn#b*J9^8!J9d=0C#rs{H;eYeiY}}b;{5{uU;*Y_`@i(1 z)w{a?si_ciuFB(2u8y|+Q_~du_K4fRTyi$}dI^5##zfn6q(ybj7+IJ%9Cht_(6O$N z+sS=mANqaWr(BJGmBw^0zwcEJ+<=?<7O}vG_n&-u`ylgIil^jt6pEf_t`I%@N<`0B zW{93=$1U}JE$=#C%-S!n_sSW(-?U&l!cNcIiLeh)*x3j>4`HuC zSd0hHpuZ;@H~8msnCmDT@EH0WXFv7+w7{m{&H27;A4B#Za@mvViEe`5ZSdT zqhj>KG;Z%ATW&a>Uyj9if^`mS+b6!&{nw;-oa|su&z2VYd~4h%r@Vl%-o9@zS-qn= zFcx*M6*gin#zEmJ%JUkYd>XTcBX2anZ-xC!_WGh>YVM}zIGRWLAYG7bQH)8X3#)9N z0s%e5_Y$6*@-p{Fi88v;KCJD+DWAIlb?0v+mm6&;nOx_yl_HR@68G^Oakei_oFyAu z+uS7UIOwtyx*Q8#;yJ=x(oyH9QtOX+T7R^5BlY)5tOuYDnKs=-|JiqP{0BnVqZoi) zKw~);Q_qTwa-Wy`{sQz(A+$x2?#eexG5*5_5~Y;Cyz2ht zZ&@bKP+PyCJi`7^dA#7h=I>F5b~xnK<>5hjc%k=YC?oWxJtEzW<=W)^&xMW)C`a2G z!MO_8PqpoFrXdY;-gL};GcX6v#9TNF>jiGStK({;{o&R=)@pmqh3)YLjGb@0#@2?A zm$UaSL)hyO$5O<#1aU6LJh}q!Y?q@x1U4Z}*+!}FlXDZAV%4uB))_-iGHlzousuptUDOR3$S+A-98@c5;O+6cN|2_fREC_onfV&WP8ty5qS4!_V-X;GLWWEc1%$rACZ6xDy ztXrPIdgVK8R}n41VQ4LR*Jz{7i*@AI8Ccu5tR;U5`d@@NgXp&=LI3U0eGcm*9_Iup zUlFZAh5oI5BFclpP@O2k`co9;G2!xS+TA(+?qzs3LUZ9~xa^NZrW26uoir84d#p#T zJMWnP_jR`o`J;8oZ<)FqYt!A188K<6%5{&D^1(-DC$7alI?uiqy9;iri@m5{7qb@o z$WpZyYe1KJEjEDPWZUVwhxMIY>zeB>$m3jdjU7>IuC4P#_Y){nswaN5mx(A-YEPG< zZqj-V(PJoUS~sLMMOuHKUtHSmx$Qgc3s9~nshy&~=tcQO(T3cHSnUQ6dyc!^mw%!? zm*t{0a#i2dGp4Gu=jN({NFUF_&2}&Ou=P68zw9@k zOUy&x_U-nu&`S~N0l!HPQZJV;P&OiT<%OhXc*q+_DR1J=2QJ#5?_HrFwbe+nnCPI*z`hFbqwXrJ>8DaTOpE%_VAhq?LR zG{3O-t?|7-?FDIfTHg($`3c#ZCAgjIN?5~=KW7+17umiHpMFkHYdke_jR$rl)_B&# zR$TASmTNpB!v%loK7n;TV?uFWQ32MTG0!c)`6!-;vV3AfQJ$Q$!R_ARHf=LyPpWy~ z|G3;x4-C%|U)lwhALfs7J)mwDz~<3=<`n%@i6mnglsc9)R8Tw}S&w#8*7u&$6=X8Rc2!R_7F*OVHi z9||#_>^CYO(zA}w*^gbwo(eD0pgzVqAJp?YTHmv-&*-xlsJtE@t?Zs&*ppwt+>PuW z)4q{&H@0th?xy!$kS%1JyZ!&%9;WA=ZzE5B=t0|+)@Pa8rX)WFc%Di2=`Os(H4b&6 zuwY*M*pR_hdJJo9ufzuZ8VOZB*|;AwT_WSE4TMRqZ~$9;C~j>e>6#x}_cR@kSTc2-2`t zkd8G2>`k~g6Yt9#ZPvAh-eIba(LTOM(9h8N=(@{`+H)|UyPwt$azxc~tesYXM){iy zeN4O_GNy?;-$NT;i@kBrT+u1>e1i2e343j-X%0d*H~eawKl`fG^W(eO=C8#3n4U9F z!gFRl2Tf(;QyL-YY%BUhr7JZ*IN$!MaoCSUWi7DJVm!+336veJJLu=#SdXhZig~~* zJP#OKJionY?V1q~!k%%K7ZQOHpP^P|Z|W!rF!bzqGf^$gK@PUIBeL%gLLBhIr(4jxTc1PenD)VRLD>M%p7!SE~2xrYg25 zQkW2a1@o~@pRNQx*7)R=D*Us|_bN;X|1$Gag+Il7dLIny$9U9kzv%rkx;UQ+@lR(y zHmRd4NDLoj{xO71cAk`eZ>lUs_!bC77rjS@z3B<^^|}@RG$2{}2Vu<6wHN8*U8IEY z%Z4fbDnPREPYl8DXFe)g((q-&Rs2+rSQ|}9{}A(IDfkPpft9XC+{wasGQTASe=?L# z*9*v8T2^BE$GBi+{7Lk?j1Dfubt~><`gxZ5&w`&+zoRL%I@d56zmNIv!cQ{(%jmS} zdJZ?LXoCJ4b0u4J5I>22M~+qe4~U!OX*Ub5RPirk{wnxMn*I>{{vr4a(CFw&6@M%9kHQb087Gv_ zDldgr=j|qwuhT2pVlf~Y{}l86DfrV1z`&JCKQ+t`!cVgH^D^^O$ipZe)vhIpM%VQ9{jWAiuYMyEwGW@bAcrP0O~v8A;v9?tAMwIz5uuZI1EVPUz?)hYXwrc z1&n=Y_moa6kmxhneGL5#xnn@$``Mk&?zg;3e=h)uUjron2lJJC1(4il&~Fny$9O9v z-VBiRQ%SpNq>tOhXFUj{rm()e+o!)KMJIB zs{)eTuVOsC4cNly22wo7FisPF9gy5b>~6vMFVg`M|K(ie-U}r6WOko|ok8x!K=Pl< z?x$d%kUIh-emc94!tNpWt&FEeD)&L)ji4_EqR;TXhDKS3zgHFBwhBn$j>2vuT*r89 zILF6$W|(q6$9OAae~u70A>6y!3S+?4a0?)%bH*d_wm00Wz662)3;d2Ou0M=(fuvtI z@KeAunL?}wJ`W559|TgluK-fHKbN8WJq7$E+_$oO6>uHg*!Lpi8wsTHdM#auTYxbj z)#GJA(&Gnd%HOL%svlc`E|~W%3K!-AZvg#eA_8v(QoiW?1mJCS9>w*bQ=pYVvTMnI zE0ElH&M!Uf7)c*Q_cMAK1!EudLHu4u(i^#Bj6p^}qnA-I_Ca4VJYxrA zj4{aQXY?`(#y;pzhG*I~0y^Mmf5Bitk89Nwb zj6p^}qnA-I_Mu#4c*YLK7-Nvp&*)_ojC}|!!!vd;#u$T)enu~&VC)kdp0R^5#u#Mu zGkO^T6h&rw+OhPv()-d~uG5(VaGey!}xszMZgC2%oa_e~ywKsC>dCUgp>v;?5o%o%U5nQG0 zU(bssA${Wa0_l2Fr+>L}|5nFeq}(%+7xJ&|nr@C?+i|}`Jt4lfdp9E(x%E8p=Nw+! zwL(lvtfukGOFoZb@{$LN}cxXHh^gYr0jZTC?9C%(4hyAX!ldR|-4 z{`EZPHjYov%O`VsdY=7h_OItvzhQaxJm$yjU#}ZrPqR!y3yfTx^PtOB)b9{PU*39YYb%Z%Ak6ss8%KFvwi1*mPwreM|JbIom zg5}Y6^9<(edBW?=*YhHb9WwvRFfP*d0?T*GE1lwMPG8Scj&b_h?*1dotL^xYba@u4 z@LBBE^SC`AQ~Bz3haa+hdLG)(>FIgPH7u`Q2l+O~r|0E=;P84L?qT^(spQ4moL&&| z(Di%Vl)k?1=I|KqF*?fQev z*Xvy4S$@4P_WT@joAeGd6yCffKnJN)AvNE^S+5q_6L-nSg#!;bJv9PV#A!Z$hMzs;fFFFE2L zbjbg>BR;If+vNY6gJ13l|3ioWWe$D**%AI3v^S9A7Y++5Z)ynDtcrx1!__Mr?h2cq zo#wNN8>PSc+V#F0a`&k52ILi9ax{{H99VH^<5UmBDwe1Ies3!&5(J(C4W z&EZ3jDnjv(HCv8kqN9)aD}MA-f1a0QAvYha%r5#euja^unard6we0dxsfq@C;g3RV zs#Hw^6<=oz)tR3e)_&!8?@TI0vwSHyRNs7ixXC1}t*?vL*P2eKAnr*1-F2A=9S*&@ zu1%KT)u^e>Z8Rkw0e&fn-8@-}6xSdeh zY`XP{acd$Co9pN>xoEh#q5+@nu8D__S9gk%OF4d?+?qz5ofdZ{emq@u*l{1a2Z~dm z57|boBFoRf+CCtvRhNQO*{swiKfo*fRyIqo7P3wV9R+`dcO{P>_OJBXzS~Q2Ek*CF zypYD!FZnGk^;3(+4PtSqB}92y+gO9s1&K+0mZnP2s1gY@NS8o^zqQTbCRyoaX@Q zc(BYVuhT3iJ7wJZH{np{02Z-ay`0aHSU04+Z5e?%w~C0wHLuzDMQJPV@XX(NC3~Ib zHvI@hdw&WFk<%n1s!^Wn1fJ3mtGa3(g@343U{U{yvIMd19?@v zbV2JUp+X}Ddu4cr3h#=rOD+@JHuv~=t(QhVs!p4e)y=xjfZ zJx3?f(xg1EXN!`LP@R8{TkXxW@1u@Ez6kaX8Q4EXvi1EXYkup98wWha_ZQQ-T8FXZ zPv;|O*;^fF1CIHR;zP;ewd#iUl2h5^L!NC#IGa(Y<;V90BG3z+p|=S86n}($XxZ5B zl(Y4YL-%9vPY2S**-&ke<9*tPhB}#>^GfmVTAW=-=e6g2vgD8l=MzSL>6ho?MSh91 z{xZer9rwA$c%Tcha=-1p4XaH0T@A=Hx?mgoH}z*sDrsIeiZ0Z%o*I@)F1pT`&-N1ZNvW zw;rPXY8}}7<;n0rmc89IrvFNu8@2rt?X7o229_0+wPT-|FWVRJxeKu8ZJJQ$OW-Vz zBFKgItYpDEvgecKoc2figwG@MD{}wqa_FoQx?2VvUI$$+#e2?6um^TA_P|zbg05ws zaK3ZcmQ5`$9_tY$FXFt&81^yibJ=dex&KA9XV{hAhP4B;eZ+8XXk;Ar&AZ&SIXH_d zg1zIkC(iSYy_4LBaih%|J3L)|M^t~(=N9uLUn?&r{|n&fOaHQKQVZH^E8bl!#y;k3 z+?Qf6^Ici~?n&4yxfV$8aeK2wRq&<71EE{|-Q~avAeB`x6Y2k|qBH_ImI3=Ss1M1- z9&q)JFzsnnZnaPNgy~j%thddLBK@LQ$_G2KM;7UfdIV=g8oFt0^hiep>OE_m-M!|C{MR>`q0UefZS*JL-YwJAM+1pr=fl0yqkQ#D8=$k zt{^vL&V_p-z8M+Gqsc4hGvAV(ssGx6?~h^Z z+*2;pI28OG&JC-dye3j&px?>OF+vkfKJ|%GhmYZ$P~?NgvdAyW2Wx&)PRmDoaJSK3 zdKcb>c!&HV&yio24~B?OzkjwwegEQT8FVh=ozrOVI{L=DQI?cnoM+eewk!92j1RI6 zjoo_Jz~e%E^JCQ2KjQu73Fpoo?7YGsJznVEeWH-gl2r0^mitQ&K{wcIi9PCLyA0Ob zhX_Y)FCYCW#vnO9g`j60?tbJWgtltBk$3uSJs(AX1I|gKeWldT7NehC4!j;X4E>0E z`*ZE?NMv9*`jespUwb9oo=9{cdby9z^gUaE^U3I(GI6wHM0VM*5jo}k(8W;K9ghe@TQ@D9^T}!i&j>b^5sTtnmS08@Dc0=*n zuReCR0F&{nK%}b^H_W(%@MoC67yM-5_n=bKwFP%FKHkliS1Nvt`7H>XY=7Komgo@i zlgRfR8JoC*;KP1TkbfA~tLci#|AM7e4*LHn^J%t{O#T;`KUD=u2#khJ>wuUC z_{tbxMh2lH-&2eu8Q(>s(Cdmmg$r*5Vrz!442ZdbZ#u9L_%4JXIz9I%`a$3n;G@6- z;ACJ4@HIq6{+eg3=_dLg%NCui}So=5BXh-OlJcBIIAU%a_=V zVDkEZ*xkqO#q8Go#48-1Zud`U|7b6CO+|hve%fYq=?|fc_ zJ)k!KkC-F< zHy!Rd4)>J~`A0h3I3L=U-rElMzdHQOg}V6jC|(mZpFS<#S|8dJ-B5+4vT7$U z9F~Vfdg0an=!X|6&C*;YtrjF|5omRI{pM(04Ham!sH>iVMKVg-;-f0u+;Zbx;ikG! zqZF7vGD4!Xgf`SxwuI#a1zI|_6QcDsGP$ZyvwR{z4ypHwP+i@61f{sFwMiATld3aD zbp2b(CRZh;Z;02_ur)3)5mjV%ntefBJz}yfh^JU5w~ENRvdVHp16MS;HZ9kU<+sDl z1zD-l8M7pjY#dsTUEqyhv*yp9H~Z?@v**wEdas^23k>!7m02@q&YL^e>zzM;&TQp7 zn7yH)9(fH#>szWfHia4^=Ata(b$*`(!@r17N94tg3uCG1m%oz#+XG{Uu2u?zOS@sd zkO^ZNZWp>P`#g*Ux+p$$Ibs3?xQ+;k>#_}-@UXb0dUO5Vs5I5pD;ASCed&1mn6Lmw z54udT3Pu9Sg^Qv$ui5woFWl$F*HNVmptm9%>??5;9rr58W?eTWKXg;PG+Yz!VlU?! zpI$#Rs?>bNjd$vvE);j}J<>Xf=HG~)=IZ-tKBnK#*7Saw_kA{PAVh1Vc;7K8e|XkF z=-Tt}Kbt)e`c!g$F!OV^bT^-%H6WJh;WY5*JLk&1`3SwcuI0_L^Y+o%VLDv4org6_ zlZQ29Tb%3D_CcSm*z#?PVdw#g@I+EEI`7Zcr?%ESh{tWQX1z~AX^i_9pO;n%}$<@XYQy{9d5yW*d4@clEvFVAj^d|C1L!EFuipAUXv zP8-&OWc&k{i0*RGoPGwqi6lmc`44$UW2G+CS~=($`C%`;`T+ zJUJP^R}>t5GIB!z-|cYMp1ktuN&7I>_#xKXmT#>cs5XYbcO34gq5C5^PfyXefsV3) zTbG?JEXpq-Y#zc&I){Z@m+Mer_u&jgYgjMby3B_P>vDvRO-5L*4?~89Uu(LtOA(gq z%8+5<*A{jX!g4(tGA#Vs!cIh3u46-nggq>mKUg2goiJR?mEZD}eTch+>hTKHW2%Qy z^da=_`g-&=x-C#2;>Fs$u4}Rnaq{8T^@;fVhTFsU5#QQ}jIi@N;9u7Z3SW4MosZL- z&9ay2k9F|j{{0-+eqF}o#|0f&^MC~w)i+rBkQ0`8ber!5&Dn?SOX4r6`We@C zN`{%(CHr$3*JQ*S*nbq~SH6P2^^X7E{`xe0N3Yfx-Zd>+GVnC&(K~nsy93W>NQOTr zNuSb6jQ7$mimzz+Nu*c0f$nPMYdn64rr+mMA_{81x45`={ z)`dOggKnH#)_P56y9eiz2z>A9;MZtbRqQ>!(|_QEt9PL*9p9dD#}@WITz=r4M*;`L zgRTQo!%OGVB|pDepW95j>4A=%bCM6S?|{y2a>KTZ;v4AqPZxJ$QdN}=9hKnhmg(Cv z*IbYDR-QI;YF(&PK9u=^g2PYV0DV5Xef#VG9<3Yro#A`r$IBi@x3EMH-zbYY)Cx9=(sgC%OO7t~{KVi|1?f zjmR* z<%9WTPv-V!wz*$855FU;&3*bj{FuAVJ-s|>{4)KZr_Eh+9=<=j&Ha?(AA$T<`TAx- zK5tH&`whk42e*|UB)%Bd<{nld(=T-J`(*yXU#$3KFWbV){10z)Z{zSz{%pkGF`~_V zki$=nhrb(jmvsCLWZnY1pp@;{PhtF@fZt}hK=0a)?Sk%?V=hr`OpxWyH=TKo!g=5iewD(p_!vDUD7@KTk_^=GKC>tV-Q!}h^8)pcvAut#8fTEqI`*7a_v zu=`+(TElwb&h1lma;UIm16jk8J(b(5>g!NpPvqLe2I1CqIaS!hunqH3=V)%F)1`V& z^)iG!e+gs2c=S1^G4_7}zn5F=-+?q`|K5!H??HbgZC}{BotFM42Dh%;l+I4Lt?jXw z_?G@CDc{l`CFNWCBPU;`Z|RSc@-6*QxkJ7n`e0pWNd7{&t@4v?uImNy_rY!D2Z_&R zFT*?deKP;?{%D^g{XR-XoBXU{dL{4{@X0Q^ z8#tBeSo@Up0Pu^Tq>^`V_cH&iy!3RM}W+y{;AZHgv z$9Vm&wM6X^ynCNfoa&5Hiud=hb?kdZ=$kjLF0%7Nu=Cbi?7SfCybTsRZ$0e1(2-Zl zHo(p^dUut%VCSX5&eMBAXdlS`Rd&>l)OOS^s~v^&L9=l-rL?2)eO2rFDdh>ekyoRU zeE$j2>6#0~A3avEUC+{jIj#>pcZNZw5b61jp@9)T$2cAGU=HJZ4wDUJ$+rzi z{AG+!AuzdTGIk*UsP{g4-j1NYRv@zMi!pr*(;Jx{VS141>zKZZ>Gb{}#p7rC0;bPo zdJ)sTOvk)J`X9-3H`4{v2cR^P=K~77jP zVEPkG-@|lz-b4OlOs@l?pYW{$LWRD??56re?jm+iVD~U~pFw#O{{tX}?_)QWGr3=8 z_aSz7vb%%bt?Z7mJHqZDyO*)s&u+|jWqRn3<-V3)AVkURV2m*a8U2i2Mu7BRi9pu< zAr<6CS?K3jZ^9q#kI?Og@vnRG-Hq%AXGu!`x}9OZCf&MSkRB}2 z>2uC>^mOKnjZb>9`bYDzxrt}xf70Q;+u`;(++T3G4>;VGN4oNLGxH%jKN{zU-X>W+ zoHt*~#N&DMH-{*Xw(w)~>zW$wj=T67vB_02Sstn*E{h9sAgp|^G*DktL67Dk>pkJ7 z28+meX{#|pZY@VugO$Y5S%^vqezDHZcC^_rf!(v2}fUKjeDc`7;yx+p$0GePJ3 zTuX$6=gjMyn~Ba>b@k!^ecV@HS`O;Z^rdAXw}mX(L%#pRa#24{*GP1V6rUf15&AE> zn4=uC0m+_Q&j20ck$4T^Rsksx`ST)@tAKPa37zRf$q}C}@=rJHEi5IgXa9hUy4=_T z;5PiF{n(eTev3AYhxnc-FhdL$!>05EL@9>BJ34ztu%X~g>Jy# zCeU|){#grs2jclErI%5feYu4mfIJ7tKjAkHp4F=wENPb?sdT&8=6_12X4ZBe5b`a~%wWIyr(~I5hkB-XO{b+`N z@Ki3H=WcWrgH{aM^nkzgB-XEwr%mj76noG^ne@E}H8=PZ))NcxPJ(vR`vv{keBLnT z5x1hgps&b1%CsW5Cy#BN^aR#V`_m?u(EBQ}eIrSadvPX7S1Z>4=-ncGNU!!V_Q}&) z`V%Kcwq@h}p_7;&zv$BMH%;i;fptO(=T7s>FeO-r&&FPOT0f*UM|xKa4fsHQ0Bfg) zae({{V14`^m%sZHX_)`O-~Phl_8hFgmia_+Hr5GGWnn!xl-<6f6gt8B^DirQ`i7qjb?i(Ovt?iqcxVpEV8dSODklM!u$jUiX`d(mK$mzb$cYtucAF zq@Q5=JDPr}q^~SLdSyax(q zw0{nB9$L>_0lR)V-VfP?`}cU~rO;K}xnojS<&I0cs?#p5HNLUy$=DIKx1kT^K{_X$ z2){U!-)juy`*CB9T9S|a@yNa^z7nj$qsi{4&K9|^_0Ljc0Vb4RsIfPUfhj$cGSKcl~?u74DHjI zDDzHrz7x8o_nrJGpD5~VHuSn1r?>Bh|LO4mNb$6Goafa2oonzNynFN4{19nW<9R)XtEyK!!9w zZFB~M** zo!O#0h`!`F+BntGz2-L^)Vobep7D79CHXfmlF_NJN1r9nPu~H#iqm6eInuMGBBQ9? z9l)~ydgkO-@_Lak3P;~`rhL*I+>LxD^K%$|$0Cs?zmtHqpga5Ce0mavt&aKM>&Le- z@?+)iodgQQlTGw<4`luHe}7^uzHdDa@34)>dx8`2p5R2h-!=*Fxm}9)-6rE5!OQla zt;oVRLDTT;(bW~fcczx(o`!q4{N|L=_1u*ezJLBixo_FAiqZjm?=ylvs}p_NvJ5e| zWv8pHA2j)1AoSS(fLe1PogPoaGqMNpZf;IF@ZmDo19&fY4&F`r2RtKt;K8!rO)+}j zztZS=Z<^85f0fbmzvmb|zn^dPoce^(b8?ZT+BVQKXUif<)^@!Twe~u9cg5}>U3zdJrY<>9; z%8u{OJP<0xI?hWEfp!G6mq1HD5GsEe?-^$tIEp&GA2+Rwz;4=83;V_G%Wij%^6bVt zi-YSa-!iY`x;pS~VF-6Q?lj!=EtYqI-^2Yd?kjP7@y^%rv~tKm`ltZnJ>~Mxl=Z#z zgR)>Do+;)8K-&r01CZyzvMrxOyTLn@U&lL}Esu$|{v+jsnD-xy-cw%caTU#b#pUnD zxoV?M;(fa={0`vvJKrxK{Na25hqE_mZkzi*PJd(#$LDBHbB7uteB%GxcGv@Au+ z1)(hJC@rfD5M)tVR8lC*SZAbcDmYR$1)PjJipprl6cqL6S}mUy?yT4pYxn^p7T7|cSBF&k_w@a9FzMROnrxSzX?AoBt_A|7{A77O! z44j#|oixaOaT$+W*JSiEY%=b%U6b}{u0{V{%9_FX-X)rZ(;m)(#*)W_cNsQGOWnCr z%~n-f>c~}yqvUBXEBiE;rF*Ok8(8m7l&lLUa22J4@0w(A4$kD3Dkf-RPun;nEWUN< z#dl#u8?j9@jIx*fN!p9d8yCPm5H9*a%X*x-(p=QC4!{4KRAJS)Edm#-#$lQ8tdupO zO2emZG?(vW401l_oQ5+0@NIKnwC_=&3!~eJJg+alkFoPR#?ZZtrF%FhdN=1p$1}#p zG1kV;`aWmOEXJPqyeR$j#xKpMAPDjNrk~$m*kHu(mT;l(i{Gz>!vp_oxVV>J{C+L{ z_}>Vh{2So`JHxN#|LAX|U-cW|@aF%Df8}q4|K&Hr-|~ltq9gs1ebVi>I2O?|sE&S@ z4=3?IPAH}Pg#D4BigR;4f!N->=f+T#3xjY2EoY%CeXsD04_dwk!m|s79S~@7 z1H*B@;ATS8G z)dwxN0cpy@G#|7GT^v#sBGU+Hi2;IoVWbaQNb7Y21hg251Pm6D1@!PwK(`-O`k})Q zi~Z2*hekh?{LtgeH`wimm44{(!(uvKf7dD7^N;#bZi?6(2FGtTc0 z@EPV@Z+L*OyzLJMczLO7C;DMa_gCQ3(mk|Qcn!sBM6_E4_0n_e<=`l2cRD5IuKqYhIz+%8U0`K}8aIeX^9 zX&gP`&ZFT|IBz$3$jsRjOJ=r=l3(&5r{g(6_McSw)8|gQ*=O{u*|X5^ z4c(t_i!{F&#*sNcayQ*x=l8qW3hqO=bwPgYezBli!~AFoBfqa!Ez`BCg0GS-BiyLn zEkP~v^^&GVDt|$u$Qwbv^Ju?tOs(X>DS>__vS?jde=);L?9->tp6NZ7b_-cs2L4j~ z*0uD}p=GN7Wa-DfWnhb%-kS0k;sly*y4Yr?incWWuPUI2IN z-Del*ddh@(vuARi@}^~#UtCuaYrB$>haWQ9jk9@Pk5>OK z3qggSST7d8fE!sy$U8R#&;NN{B~Rqy%THw4bBGXH_}#Lu!X1HA=9bLN=qEzq5k-T> z3n9w?>*>#@r{DbmcnX;)@G}Hn{P4HdRf_%jS^Z4>8S-OFkcz<%IZ*rrx;K6kCQNx? z!qmAXv!?jGTH{xl@AD7H6JHPV<@XBtg%ZTHE=0o{KQZ43na@`|p{?#|J4-shOz4H7 z1>XG!QUVjPka2~WAY@DN3-Lb!Z$zj6Uq5k{>-!unx~UEwH3&P9e%9p)!RW6c=&_-@ zBGU%$Dj06NGPE>r@0}Lgm54O!m8cl&m2bH>DvIy_ecMUe8|BWs{H+dmAKVer-X}}O zWo^bb;Qj79dy$QiMj4ysoEb?{Q6zf)@K-ezhBoZu2?|o9vCFO2J4VG~E71O^iDZIj zy%)c>PCqzaO21$&xLngyx^lF@dVPPcbp5<8WcQ>$+1`2oNolVhe1ds`ctUvI<@>7+ z?2M1Z$Co$BR`c<2tLs9X)%Bx0-z>h(>LKjm_;%&h?X2c62@~Tmiq@q+L!3#?9)@??2iwMvp+B;&i+zIhvkWOZp#FHXZz5U&h~;S zo$b5#t;*f7kMDhI?|Y{lT<;&$+5YrWO~uFHe0q&_`2W?tt41E&r9N5l+K6x0t{Bmy zV#Nrx?yu^Z&$_9W|! zD(y3~o-mjz){gk}vjJ)-ZUgV1eRhZX7lU;DFBQv1L@RHpFMoQQ`bov=5uXFkd{n7M z{iqv}P9Eu>4^S20fY0wx|8f0xdm8Z##P9KGntF2W>Ji_4o~9mAZd2>-`V)@3BD}QeH>f*VDdlHV!iH{bsPaE?jbbZIE35 zY$Lh;)lPEd8#BR{(4&(ZI+c{=*BHP1)8 z+B_Tm{Mu#F|L!QcHsuw|n?Aq8@Xp%R(QkjAYk2hIO2fU^a(dK-_Lsj7&6J}ClB0}27gNz{7uidWJ|19 znpsQa@qRyfSeVbg8F`mf5e3isuD4Y2eUemhmV4~r#c?LBnu&5T1OV$;4~YlxT?V%;+ubXV6lM~ zptT;F2Q#09u&xlwdU6!FYui8x6cPa(MC?59sYLmu!maAOADD(dJM2m9~*Bd9~~cE-pqQ}h4WIy zO6}T>v*D}3+NUjykLcs?UPJAR*&-&5q*?}#cR-O``eHyFl9FLTlD0`A5mnAbpzGDb|gR$A?bJc9pjWl~!YR!l8jPggc z@7uuLz`o0dn-gbPU1OnZd!9@5oy(jBGnUgPZ6z17OPoisy0omjhQ{=eBbfK4oOz71m~Gel2+ie zFHEBx@2FK?$&-{9WsR~Gf3ZI7&}fw9?Ih*W-+VTEV~|vIrr#3t*06LrFCtPYh%n2m zk|LGw?s(jMI;@)jq=P(%|#8Yznxr`XBN14UbdO7_~(6Ml;2`(1ZXABWxbC367#et_%Ubg4DYJMy{ zN4`5EOMaHIyXc7=*_dRJ-~K!cm@VHuB1g_9-IZX;l?DI2hqU_*9iUf7MbO>^4W*!t z&`W||9iUf7MWSyQBaE_D>Ue`*+%tHt>Zj(Sp5T0a@o>g%A>(%#X-^HA0{3gE3n z80Ui-?}Om216kY9`T2lUeJV*a>zBrOaTsH}C68s_ycpABJV(yCna_&85a6|mj9+AR zS2E9Fo@qR*c>?@a@LKwdm)E}ksMWQTHZZbAGv~3WO|jEoeXAw!P1IUl0p6=)oCWxA zGVl9Xn;i&m_VMDfjf3%92LC+@U!KN$8T>a$TefjE?*abX9sXNgP-w0#RLuuR4mS&a zTFWE&uaFf3{L;g?{hD-A68#3;>fm=L6OFRO`#(=UX8!lt$IV@6TRA*eK9YHdd_Bz~ zZ-z&&3eA=aGSlQGjIkp*X|gM4fP7!LMLzsUta2pA>UwK_f^s;>>iRk&Q+|tiGGT^E z?vi7XzYdaIo~%Ol&rOVIgEK!=m;}t!$OUw zA`00aoiC2P1{E{lvrlf(a-VPL=}OkWd!$Eg`s|O^z28Hhv+N0iPtN&ReDC|fzFf&D z***GYx$HwZR|;LuQnpyL{Nif1F_|cxC9W zq3A04F$2wm5(b%vSO=TKIjh*6C+bPZsK}n?O;Hba8Es(gU*IV28h)}gw!&$WVkc-K zPFFI|L{q1jPtE12gjZ;y%X?_0y*(0{hqM}=puGbUfq6U=dG_Jo$djkV&9jwfsdxz6 zD#Cdhd9?T?iih-hI^yzdvLn~~-YZpqcrBe~MnaCTKctMqH;lR8&FW12bmE68VgC5JBEC`UdX91P=kPn^`?4+aqup}l zJD3Xwgr~{xW-}(cF;>C<5PbJ{5xH{iye>*-W01?lTK#}fY0eg8z+7;({4|XE7n-}c zwJzC19VDGA)Tnc%+kdV8gv|}qpZA9Y_195<-LKaFTk5`hR=5&H-FK%)Dv=4@_>mFZZGD8PxsN>onB@9ID#=Ap4NTSouvjLr>}mLwfs)(;}g92 zPR2Pr>0I$hsc2ZKp?aRiu@{@bY=`oWx&+z0m~j#j-?n_J#_Ak4$51_uaBKy$87H%! zB2F{o#1|)|{9y}mN(|LgiSsAI>TiSvmru(g>@Gv~6vCoN%XpmqByrxo5l3G>KZ7_n zL-l0htRigljj*8dSti0V4AqkeLw1;ryfypUW`|`7al}}Th}V_R&|94i_zg1|swWcf z+BWto+z8i}PZZ(!HI61utf9JuILxWDMSj;_bXW!ux6+%JhPZA^BYqR1RbzjL#i}t> zGcWI53tmf*V|{gwC@&dqb>4L@s=7P-uS7mNo+nzxnUrpIj%##H|c34JKM^&E&r;g+y@Y>ueZpmZdKgnSkUKLgS67kAfg)fS=ItyQosxBu?_UG|T zt2iYkoY8-T@|Hk@Em75W;yz6rA)AXj8Ibdj+-G&ZpSeNplKGTcwP1r9yWlCcLr|o; zFY8Hl@3csJm!Kf~eL)HK{rGL09BDtBxlVl_KYeh5{qBJYcHQ6v_P)fa2Nyo6#sqa% zdrpnC-$nSVgzv-u#DaC|m-zQ0tquPM@_L0dKaf_fh^npur_J=e%k^!XKc9|uo@$P9 zezVMB5p5F}A6LG#BX#H`Igx+j1kD@gNzUnAUQ&xnBdW(}BC5A8vN~6GvpVP3y@+3E z^@{tg<}{_4<3P&L8V_PA+z+etM$t3#s0~Ikq1sggG|^1CK`Gr?1}dd#m%(p?>!9 zn(ExkGqld}nlEziIh1MtsWw|3i~rL{GVNd2_9ySi>J8+5sguKUfbcy>vh4?I_NWJr zbhVpmULZWGdOf&ao)PMNldv5%Z>n#Sb^)+R6Is2CvX2gMSe8-t(P<7#ktV9z`#u9d z5tieyjGO+r^TeV4_IsnO&IyNd?9DX;)FI}D&OH3q9m%oZd*34GrQ0>mqMANx)x5Kja$N+HJs^)3F&TUL}Sn@Rg z%xxSe{QKCobz9XpGMB1-GuNoE=RB*XX0P`00gSXoj;@h*4{h~U=N;D|z-vjB?XSCaL zw!hn=WUf}fd(mwP9vG1!-wM#XL>c09Ed&;3y`}mp^ z^;mg6?U`xcamYy9?NER0o1;voI`aJKzmeUkmz+P-Q{eYV|n zD9QfkT9bM-#O5>|ve+jb%A%dOsZ~czc3aIBbsz4nwDo?%j^baGxlB#X{G%G2y+%!e zR-65GUJt#-K%a}?{vq_=2@Hx4DqnAuoJ)xF)6;HC^WwXlr;JDhvMsw*otXUx z^~FV{>eNMlP)o28+lZ^r+N@5bt+$f*rAcnf7uip%uM#$gux();Yct0iJD&O-;Q*%PXc}k%&6_9{&4RgZ`_N$-IfcfZc89dApWSseZBEV z9q#9i|8Qo7dXc_elv%2NnYmn*#J*X7o2~5{X&((Pk96Lq*75!(@7&2y-o8+BW-!+X z+nNL&=h0SQ(N?d4?;n6efw9=$dUutaa~4#deb znB=^$*3G=*wk)H)mS%2LSJGa~7i?5Z!B4c;0orFNW$YvGi#pmXXT4hCZ?C!3aSgO@ zLmjKgQ?%I%@LEQBU(hyU9tzAsYiY9;v{}vK_3Cl_r;%BPLWg6I7H;m#QN@Vp~N zdra+X>V?k>ovV-Zq`i8o(xKjVYpqd@sqby?S=&=RH^FVmIAXE?FwSimbtH>6`I}mC zB!jpa>KxpX7h1?CLye=I&S$PrN6}WVGR~aPuIBhz+)gV85k8GRlX-y za&lf^?`D6zAZSqr{U(FwJ-}>WWPD_K*>uSnLpwDsSmAA}EsU=jq+3Ed(MCFGp_gA# zr$E2u&~I#Vq`e<7B0i#g%H5LlV}D%7E9jNbOd@XwbQ}kL`U6G0;`=1$qt~%tE(@=? zFk%q)je*!S@{u|7kUeeKG!FP>(Kl|AMX${c!Um$p7V@99vg?b(kWJ&On?^{;xSAQe zcd*|W+4N5AoYRxjHWi?cc1K3FV%rq9j-fr-zxt7NxWt-`Cq&~6$gbf+cD=0|vTO7W z+4Wk8L+k~+A-lS_N=3HP=<4o_4IwxEv9-+8*Xqol6J0%naCE@g;!MTLR&k2ESe>Iw zh(rGua;czeK*pPkTsru!=<1J2@0B;Yms-$8XRl}#Z%zlRbC4~%`X%CBODeU9JltM+ zGQuZM;^&noNk1eby85&~KOr-2YL(ZdS;!}*=<0Itxu*E?67r8|C$DUZpEs`&rIz8b zlu7$~aZ4?=u&y`zS|?u`hd<4fFd;LQS_(DfNn9bH3;Y7%6OqpwNt<`hP(2L1V#tGa z!P!e&;We3jnr<((SQ~uuaBCU#L1fUgy-O{3RU5oAaVU8RS$}n_eCFGbiL1zi`n8sG zxfjzp;#GrJ7Div6jb1+c`Bv#4T4;4%>|bg*+rHG&)V9>p7+q>nw-~BLKmT*9xbq&e zI?v~nTDoOA)HkzMs_6?H>WL(WW$(h3>genWbwkz)^&oT7@$OZYe=%;qPpYyMD{re; zvo@(8FwQ*4cOGPpSCALZGH%X}E46fIoSv26REHraY)5uTMkZ()U1~{YY$fB@ln+kC zpNM}QamN8K4Jfq?RQ|4BB7S?u-KAlrmX7d+6E7j>Evit@eBiKLR2-IP7Oqz#8O!HJ zR9SjvFIPQEmE~xsDoZ@Lr7T*m9@CXtbl~+DWSDtf}WDoYhSsDV1q5D=U+ z$U6;`b&5ErP7r4_e#kxz)W0FW%F-a>QUA9IzZy|$2?92)bXW#<-l}dFVFQTog{79+ z@Ti7iRhANXPy_Tho?2x&b~|M<*EL30S@vfwRsYSr^!~!7>JPoEEF-hmsf}%`Ea%!+ zSw=HA-o0p@dJsB41U(;Sj;N*H4^!Tk&^(X1P3RaIowumf)H@dchbXrVPZf0ef_8X? z@NfE8S#()Xs42u51U|>=sZ-AL=rnQaJo>?F_>Tm?ORVSiC;rx)=hRH{yc`l_A5Z*K zIaL-DvZ)?Cgp8sCha~*Rkw(ZX4XgqG#2Rqp;^)bKkM{5`#_X8Vu<9M?H^*i>EMqlc)dzS#j*fDgzEzBj z+(>`29qP*5x<$1eO0kcCJ`)cMohnfshdy_V_~X&%+94zS_;jQ*5m|aFZ9fU!EDsrX zKWS3x`yofAsMeZFRboCbA+N2-$-~gu9z-7>hW<4dn}UQ4kcVz0Wb$F9!POJTSe@1y zqq^^~(SEhP&6(fywtb><)UNxmQmsT5pR}`5wRS#g-(rAnAzhr!=oLbL_aKK?^+P|u zgw5cHnf$={NRs`;Au~9os%L@;!|t#Wxjby1)p;g0#QA4r?xOl!WC;OH_BVK6SKCkZ zfb-JYt?K3acFq$K^a1o(4>(;IQf0Y-e7UqXQMH1f_OK7{O6u2ye6ke$#(43)Xpi^f zyJxq+_oCf1M6_{G_2abZIP}@#!*|#(9_|mGd(?}(Kg|1S_}L!Hw`so29igeo?FUYE zhiu^Tx&cMEfJqZ4YHWLc26?c33W> z?}#$ax}Nx;^R%aOhk2rn(MY zX~^MJd)(nZ_V!(N;@?O8pf*)qhyJx5yyhzx?H9r8Mcjg3TV?9gdA_|d-(fjsNBRz2l?a9J@$!&>+54~FRs#?KQ zhW|j)dA@gB+TcG5y>3m--@G_l;X9ra4og*ihCTLBFL+gkT8MqA0@|7w^TV-C-GgoE zF519UyG5;xhkwBT;t%z-zj1tveT)2~eGGUCnM=4oqkaD>m)MWx1UpZ^s5(my=h{sN zx2V@=k96*-H`^bgt|sE2#s2Zo;hy$p^s0+>ec?rJ%NvY?^USdiGnV(%zMQC%1s3>AhsNFJ&~qJIV+f3oY;N zvRmCq+b*j6yLzy`uYDiwyNNW5Yu{EM2X3QJ?62FV))0Rg<9HkI4=|s|_;)*ahboiD znYugF7ED_st)%(2a|xk z?au|XFuc`0Ai~o4yHTzoS zTl??GPrO%lajFhwp54QIRDJMO^}C~P%U6dp?4HwZOB8uE%y3(BYn*Ds3AZKvkm#rB zb`Sb(6n$ItX}xfJ`+RTggZRP6^vtDSVv{;Xde1z!C73zc+dn20;gZ3)5c$?>Nh z;I_0S-VSKsfj5e@ZR=9h?~!{w(CS1dgHw#@tHZG6)c3M4$F3!j_j&A{$C}-i9i%-* ze&)uk0jP<5z4$JfS{iF6D>K@#GKAdhZMAkTs z+_Iq@_WWC`0$NgOII8! z&!_#1!L^~c+oEHv7HAIVN(U>|hpBUM=O69+4{r0nzhNI%s%M=9`XCcL+_c4>MEJv` zZye&b{OkBu``FGu*-a6Wa}ss|o917+Nlh=?8@e2|=WG6*`*71Mb{)KEge});i?TQy z`nxT*A(C?o^T{C19nMDj)FAp^BYkL~fb=aPqm|ZeQS%Qa+qZ$o#3RY}smNq`@ayCB zp?%ad4|ygP{pAw+!QjlN)$ZsYXORi#WUYpWA=e=LtroUszdhr}RJWyH*GPLiWcEJH zCl`_>z!R`!674*C0P1Poj;`*MgDvz3Dng z&Q$cK!3&;N8!3AdI)#um&r-H_(Nb0D{vyw7A=tkD?Y4aPmD_T)eU;_gwpEtqX!M#T zwkxNQ$G$-x7G?EBKM;21SnNyH;Px;$j`ia>N7!8aIEuI?^uh-461J=33Uev%gLxNt zm4H`6cXSBiG`<8q32Q|5w-GMY>{OT17ha^F9i1ln05V@)C9*Cu0Db8={pJAgXX#%t z@V^5!uc&7k7s1TcFVww&O==l-!&3DuvSS9cKE2s(c@SOar53ntKn`t({xKF>UrwsB zWJ31@-UV(Cmq^aj{cY#& z`Y&SNulJQ5uwl8O(eX}IUV3)rU8F09o}N_3pP>0u#D|_oS7Ns&yoA1b{1LaMs>TEj zlkLahX=3~xhyT1M+{~Nr6Q@k@Jb2i4{Eoplx7Q@A8PIYyHiY1;4eI$#Zc9qmT2jm8cw5kWUcl~(J#YUO}&C0M(=oW5J zjSJVR5iQ!OEA)B=+35?~YBlA|qP!@eDC5DtlC!&?wxSHtm$s01DS0mjcJh}|GK(>f zF6w!jGyV8`)&dDT`n|7jH7#*l9PlsEznb82%b-mYys8ZMF?iZm`rlG?o2E-b-$=AK zEe0abhCrLa^s^s680#E_P38P+ZcAA<__x3*23yBjaQ*_E{|fvQ(2IK(eXIo?W1x?) zwSNI#ZvmeHdgIX-gP>17eJT%oN$H}s=&?Tf8>zD%`m8{<6?W>Wf0{Okyv`jMzavAr4Ex26|)tUK8uJ zfzE@spVzgrflii+Mr&fd_Df-#d;mFJ^vhzu{cjGs?vQgaUYnzkeS};+wN;#n*e?e+ z#CYwTvs;A~Td-|b$9Qd<;iMIE>a7EtRwi`@L9ue+oJ2)flfGR_HYe zJgws`5b@TsCb=cXYlnQSRX&rj<=HA?ytZD2^kN^tqpjl1z>Z}tjq$G6&u^PBZM{k+f=Nn{CJ<$*(-ag z8kV&}?ZNzYvXjQCS-3*gW|pZkwx~O>LmtaosfJ;X+Qm2sT2Q8TWj$pud|L3_QTY9X zK7Z(nue*CEqIsu9%tEH=BBD8D+pR28;`quAy=OB|L+ zc+*U9a4#xV^NG8S`VA+p86N)AYv3v3jf-*iB~Cmz{%*<==TFE9Hstrwby=zj`#}xL@t)2ROjW%xgMQ!}< zez^PNUI1JOY{y>X{(ReFJod2;Nm50}N$iP_uwJ*Vv<}zntk+Y3uX28-LQYUKo~X2+ z=lv_*Epm!F1@}KXo4_NYdQ&^r5wPuT2A?8qdw+svMcCgeut#}949<1v2X7!x#-Y2v zaqtbb{ow)j5yFupi+$_PUz>>OTD6Kqh&(rk^?v zn_c_5{_02g6=6>(WluyOYzJeoIc#UoMILi#(@LE)4}Jf_k=yO*=t1e&N{TFxJD{Z8TVyca-X}?3*pOLli zLr!0V`&smfBZN-{UcvtW?_*i(_$TqYVowM?_yV@W=<2JurxG4h+Z8>;!Fw2j*?fGX%uOA#M*rc z^4AvZj4u(l3Ati9eoe?4E0`yDAPY}DjJyw=cGzfdgH2E9gr!1%L9cHT@5FoUph?xz zubR+39HgJlTx?_SN8=+7ixs)#UF;LqI+Mz`z|}bVQapXh8n(zOeO;-x!`)uE(LF_Y z9)1b<-ObYx|9g1?{cUW6rh1%a{N+meje~yE2;8@V^|w`(cByls+J`&I9^%fYv0FsE zyDtaAw-c|7_+`XfO1vU;jWO62w?o&a+Z~qoumfGq4|N9BZdWVDTAh0O*ADbNAy4g~ zj>kqsI**|nOsPfhL(l#ST~X+ZMcBT^U>|vfy*J=SASsEauR_0#@*XAnBbJoem7#$NL+ zwvS`jn|@4nSmvQ;PpM5ozPX*f6Me9UB&*wyag5MAl{nhW4~- z*5nGEYasSe2m06+|Hlq_*!GSxAR58blgU9s;kH)rc%hu#b_Hz05;?$AX4${3# zx+`z` zjIY7i1V;g1XH1H{7^@lAC(w!dvMzst^`g1i>~Y9>S}mg%M2bibC`cO4<)SAVtSt8$ukiI8#{7C9@4)=NF`Z@TWM_!); z-h!?}fagChaN6j=By}O~0al2W79kX>ZEoT_f$!gHu2H@*BJh+KRm??H1g;H>D*_9|ONXgO}Kw((hr( z*=xZXRqRiBkN&G$wDQK@6hYGzXgU}>w~+O_lJ|4a^ij(5?n#*|IX^>ws7F@1*vV}P z(9}l$qMvSpW{W9D>~*X{A4<-7M(w)z8MPsMy_y6~ml2)}O_Rw_=maL{ngR_4txqgk zuZp!gu@B}LVMFk5Sn0N;5+-aysrU)~TSNalH%-`jP1rgU?dN8=E#Cbk_cEsm_aw#- zajfu~M&<}B{HKvQL#(It&Rngw$y}*cWG++pLED!5NQ5n9KJ+Z2&RM{_!9(mLd40;w z`$&WxWIpvRqQ05H@!%!)k*q_9>bYRG8nR%ex^%%Z)eUWDKr5ju2)ZUg*C2HA$<(ol zyoC>n0{c+Fh!2h}CoBHY)Xb?|1B5uhT$@$M~;w)Swdr5vvfBML)KQ-$# z)jy8YqHpPTi9I9T_=ZivUxw}q=t1F}QHW$eNW^WoZJJRUR&i#YRPilx(RZUchnUZ~ zx89t4LssH^7WWlO71~d`l@}FScMVCf?HUx5w<|w1e^)VQ!PaXv6`Qrvx%Ha$8!NS( zue0ITMpLmT;5Ok-)KnY{xT|cg^}RF|7Xxk$?tPkycx@m(?k_c*Ve`99xEl$V{O$&u zYuyi;iayf1jSf+s-s+kU4okpcoyPAs2tROmJ>X8k4GuK{_xm>2d~moBaO-h{L!35{ z9yd7j3Aj^mgF{@P%wsm!JaFhOt=(8Ga0s)y&P$q#W=T4?R^#{M+gayhG!?G}-08TD znu@Oi?vHG)^F1{c=L7CA+-^-pTh0P{^Bju%3(5$%({XzU50rVz<~ng!Q;{mI+~|?O zAxfO>hktkn4ZhT{hgF9zIZ+~Dv*!2PMs^#M4X2)LtggF}cmkRCTUqz2q(+~5!r zDDzvJ>i{@(l~!zY3mjstt{1@JU2s^T@%!C{A2_@aaA)8KhXVn3waxVcI2;eSV{wB+ zur`n$H#l?+xHE8rLvWzXb2irwa7dAsZ>$tJ#9KKlOP>UX za38d}mV?8wfIA*HIOw&3^tizxCE)Ih8yxh3GB4U(W#Eu3m2Gqg96E5W795s z4oT9ojl}|oF5-NzreXp(EaQBc*Y7_3z+qd!ZNUu=`vdO7Hdj74i1TQ^JaB`9I1}tk zj~g740&WX#aL@(Hyl!*lfkUFSbfXmq_UTf#?jI7|FOeeqCxZ~l$b+_ngy~ZCQ|X<|B*nlre@#IPa8=ZXz*wrcwX~o?ONTsp!NC< z!B2-g6Z&k}#_&xM&qeABqVz)z`a7fb!(#M>vHIa{^lDrEh&W&Q0|7I6R{Qhx*H`3O zT(nlRPP<;WAxK}K*AETW-x;DG7OF1{(+>~Vs}cGUkpm4}9qRiP0bb|fJdgM1r;Es^ zQZxDg6*n^Ww@)E?M$*P-fA;0;r>DqwwWc_L;M4kNf}ai97`iF!xo~|!gnnqG{>~`< zFoV7@T0cBSug2;}v;mP2N!m%fK=Q)vK4{raJJL9Xocj~dauUMRSqhtcP^^7O`~{1D z0(!tlK(`-O`k})Qi~Z2*hekgHc+C z<86Q-fqQeV2sebQ%=g8g0TB1g1;$~6-yP`pd;IReIP33s1H8XV{)_a1aU}cQfpPzd z-yIkyqx|l`xL)aZ2gWH`dGibK6>-JYxRSZEM$a#qJAVY%CQY3=`w{=$U*7A+MvKdo zekow&+$j&1%>Bin(er2jCt&ET2OpX_Z;CfF+k+3zTo}k~)RcMir_X46FK zL&?a)uLDou4n?m=tACl^l>fPpD&S`5O5&jldVl}xeN@H%_?h4!(0GtO9VYyOB!>Wj z--HR1OXimZT;e{eo4@l>><@x1cz@538Cgkh@z0O4Kg0*Pk80lhxzp{_{JyR4j}qfs z{1SaY+9{B0@oVJ-pGmW4J;+y8COl++WV(Iwgb9TMTSS+h@jEL0@C!eFZtxRr!0)Ck zd*LDG5+Ckxo>uo!og|&O$4Vp;@x(kSrZP7T;OAA|`3Nt;zivFV{V&o(#QSeQ%34iA zmpK3Fd$)SuoA*oA*B5JdU0;TtQ!efDaNiX9tmg54^TEg+%;MW*#PiB5{(P>8e2NLv zaF$!VOVZ79O5TX^y#^X>qel-KRWx*jnr%#(cboT_Io&?Rm@?TfUfe)g)QjIuG!!0w z{{XxtT+mMZ`~xk}eSMz%FYv$pTK-~Q6~A8#FC+~57m9pFr<6yD~8-uq=~ zW$*p6K=1vs!cDN4cP!9Nw41@aq~*yhcfGIxGKiGA`+UnWEy%XOLlIbz_HsU;81obQV@c#?PC;KNZZ+z-M_ z=1=wV^DTyoMo&KjFAksVzkW2p!v!sViH|Q3gffayA0I#Id;P`#JyU$% z&-jTOa0mD}P2m0guYCN;r2ph6(tg<0dk^$4@bUl7Cs+IPsr2KO2A(?dt4#IrH(mp% zc?po zerS?BFf>`#C*+xTaDU7Jo+)W5a#>neS(h--JPCJ*HQ$^c8KSs(w@NX}MAB$OB_+>o zl1&M|du&)AzuojnqCAoNXLLNlovmhRl}Yw^(*!FG+*MN&6s%NIZYlTu2!5)BNmoYV zo`ZW|X0m)VGevF#>;vo?o*@T!j8Udh){xFxWo>wpJX+N%eZu?5qejIjVKF;K_2JtL zZet%g@P4wWk35L)^#t4^jPLOju}*xu@asx^kFl#P?yY!9+^f|wRStm`AB<0xKjgj_ z;s3gtD))u_eJHQpD6JAVDp9GS%$kuQ$|~+O7{|RVmE2i!kvqo@j%};F-m#AyPaf;< z=_`wHQPz63ul$u7ugoWZ;rBi`9q-unrm}qTQe|YBxFO=MmxNyqkB^mHZHOaqYnf*m zcV`LQ9f_%O6n4ljxkF(vWd!OX?kPN2m@3B+N8}L~FS#nUG0K+USWJa{!(A`AmbTF< z%i8G_Z5VgsL`g0yZBas7m}oyKNKz2Ayz}R&B-gA9BQ)H*<(or8tw#AgcPobS&6ok) zL)hn)RUNU%&q04EI>k3JScjgo>cHlXTE5rr``$^|ZhGgs`FYab2L_98$NRpgek#d# zS3~GbzDW@#%`uXmwaeRCGrV2lP8SVylY;Wh;=G%@^_^)mZ#xY$$1#?ZGgIXs;W2y0$0;LmKZ5%Q#?Pw-G0INHhv+wHz>jI8&|fIG zD{0#%#3^O8Z%}x$yrNBerAfTwzdc5ylu^$INFPNVMSky-pQtlBLQ&=TK1xY;-y3zF z$o*fxR_8G47mBTHKDZT)j8PtWi1m2;*VFC(zK<_|1 z82$84YeDb1q#aeD_wpx^wt%z+KyO3-`3q?-~Ro4~OV~mHrpNqlQa7gBMRZw#T6@r^+4apBpe zYj;_BOxmS%;JZ=WH_N!al1kg&)@PKtN7`s}Mskt4|7~N;p?nkO9bnf{ZFTtBH%E0}_`u~zDYX2LVb-i!UAVJ0 z-kLR&_B2OEl~?Mm<};CzhNDsg9>UQ#O4;jy7ymlvYVhPn46G|Ga!SOkzcoGuL!D-Thi~QI<~XYYeiQ z6C;QIY8g$sNOS9Q0%bHrM43(gavF37v*=?dmqe#$L4WS(+It0h=y~^W&)O!9^!gHb zyXcFakU`Gk5UtbGo4t?h9rA?my`d2H;_3!EQ;1)p(>OZgxLhoIk zNxF)^>f$bkau3?c7qz=ypQo!{#eIg~ZPV=P$2sQQk*s+b9HZiyqc4q?T<7xX8;Zmg zbW+^O&#ikq@C_n?(}dCRVD9I-tn1Ki0N*f*;66S9O9bDbeYnRsE_CsdHK$+9+x1Ob zz9GmQW!}4F*UNkI(??V(Z+*TOxLkT`*4_c>GfYxNx{Z6g!lZKz+#RN95>7j)WBA3# zzY3GW%b(DOmv=XWmWS#>Kc2bVdijs9=BE!IB)xST5AAWTguBHCL~wr?bHFLSEjA#U z`2bnNL*37FFX}~|p1V;)yz|}(zEjwsSg#!8`%R*bqW*#=f<~7{bKhdV)pe9_APO3s zqP_!|Yf8!YW$NRJP|ZzGkNQO({|)%w#N*rkGLIKyv~e+axo!51Q&c1GH;ugQzL>rb zZQrJy-<5PTe(!JRoilrHlJvf|mOA*_8e!Ah);ofvSPkDY9Kc-YCVpVf9>APfN?UkB z)EjelqL^cl6}M?qWvemC%TpGLdaWE~Zj4s{r+K_}9?9JK*Uic|q$vNi;8pawB=}ff zSdzT&50bJUm>(r6$#GWmlu%^ZIIVJ;{b9EeZ_2Yv%v0fWI})@?rIGpLlVo{S)vAu- zj%d**CTJp0i~fL&9Vhbb_OI!e3mD_+pQM#1#ahiv8Pog1bjni3>U&|ya(=8%*_NIp z=S4~8?yIa~U3ku?;1ovM$&C4?Hj>f+uY`7rDQ>7)4?d>2Amxm%^KLV7mV-~Q7oQ;T zG09s#G0D5C{?O4W?vw+cC7P%k_=r4*!e>r@l3rd6pGk&~i2RegCCj3WV#+YWUj`!2 zVdHj*xn2@767ruF`R|?(DOQY^8ONH7zM=oUL_gG1&pWvnZU&F|E|sIHxoD;ac}EjD z!$u!3IwQuDE(XTkexHrezR|haW7=9^AX&606pQ~bKHyx&d1*##>0Nv+r@p{LJqUR2TpY# zylZ+lX;=5_#b2c$=Rd$Rl=p$abRHpRdlp+=4V$@pb3fy)xAl5ce!;b4rg=F(}3{Vv5#b*-6~( zL2>u*3hI2n1KGxul_m%JtI&@oa_{J(4SdT|BP|qjjF?~k!rUV87Cd!Vyi~E9d1V+p zW@Z<@_gSrE&M@)K%y=nN@EOqtY3{tN51E6OP1Qt;F|?d?m1)T==-kFVr6xHsJxxX? zb%}YrgnK*L|Kut$aDOo0OhliI>o(Bp>i#71Xl6HA+)Jv1Zg~YsUfhng)r!x$tjh~C z%K7xyVql5rx9nwF%DtsJ`u0Tfo{k+VlPQaM{xWvz#$IkY?}|Gbw}9XE#lK^I zzL$CW9_H)2nYYKY4}2W=V~k}!AH%#}#QhkfxlcJHuuiz{`<(yno{Z~!Bd$3=xZ10O zFz1Id--~A_bN-T_rCsb3xU!@pvgupgJv#(?&<0YF%~=_eKBm+6fE zWRyAX$~K7-x5C9{*bkG6d z%&`&3D?4BAvnv#NWhZ^=4PDV&_26}}ljIUSNbs+&F-b~DT$1w2kYaO2c&Z#TI9S=G z3#v}nKmNCFglBxT#5@ZBj5~uBV`5La=Vv|T0{Ef0(^BA4uMPL|pU}swYyCX&%gd>f zOUwPWU1M}gc%06gUs_aXxdcx-k$=B0bJ<_n+e%vT6Y ziw-Lf(xb=0?}TiFPUh_wI`*#=G;AF8!2B2I2Ehj=LBl-a6dM!e$=EBjjG;*}$X@<= zN{rc~Ys0vMH%b0uyi{~{bBOsga!>*|Z;L24H$D|?-Uaz4tg+SpOt zdm8Gcf0&p4o5}Ab+O!jC8lM_sPQ;!vk$IKx7w;DNaEm+hK{9ob6j8T{)GeoK(~W$Z zwZ41=zZW=({B~nQ5czrQ^J#W@gvn}7`#h&SGR111m35mOos}+@)Ydh^5453CiVb*l z7&Jy#Xh3eU3A+va!bo|;1%F3Z7|M4CdLZL_hG2W=&d5(LbECP_DP4MmNnqVY_H-@34q@=hU`*^XZrJ%xBtK zT~)%rzxBEZ6LVdor~~*n;dg9*!L@CxmqjmQUOY;8%X9&ojG$3dDruM-mQvqI%!kXc zK}-(qE(gVGy}FMMc`OnACJ&iua=3=R+g--y#AlC9vJshu`NeF9M~iVI>ifV%DeKqf z75M)D(-|XyU-N$PosygHmH%;EDDzVo`eQijLR$ZKYBk90(rz)YXriQDLN~O9TAd|N zNY0^rw`6)p=}M_^FI|>9acNoZAB0~I>59<%^XY@9&_RlPe&e}TBaJgdT> zU%fnf`6n5M6E!;wc?n7KP;FOP#Lpw{+%-$1hY@!=aTBxF81h%Ih)(*Xmm#=zn?dxE z26)YqxzgTM;nu7V(StP9Mex#9?W|claR=enf(G`48-)E# z(7*Wi$Rl>-kzUf3N%XNFI!VrRipKc|@?K@IW+5}oD50Mgh_)AH`pXER&SUv3Auk@x|uP4n_R~DUXk8Iejhlw zU8MO1;;tax3*EZPfqI45tmatmqP;M}<~$d(Zo-^y8Qev?!SG5@q{`Y8YVAVZxE(=F@OCYJU=pom3Ie6K_4G}-G2c;U*1~sPFlTgg3wDQ|0;fI;J0qV zRDqwL20r|Jbvy^|uY%u~+3RlL_r;=hH}KoOXsw~FCdH7F-Bn%@6v_JwhDoc-CTxw= zdToNs1@D4(f_}x&?)u_883RL+(SG4B_WfF~Toz2<{(!!%3C%Y*Fh@4R&ve|2E!G9f zc#_hR-# zHvhsr^YT@+5pvVOm^RA1@I<*+VH;&K^SBPXc1%Hm`D|!UY=*t$wj+m{=kYy&bv!ZM zxHFjhgWHZA=Jksof2a9;VZ7oX?1a=#DGu)~d!!IWeCPcDV@AwR)s#DxwFOUT2I+>F z&#lUkSK|Jlb6aIycvt+|Dlyrq@(}JL4t)?E1m0OJct2yJnC}&@3X}SVCR=xferhUj zGo1PI)5P+)G3c4#J}9n@QkIq?=Y{sh#??kCNi%U*dWO6&G)~cWOO*FxOOztx6i*uW z`%^cGIZG2c+*}N;tdfQ+jVIK$DI9K|Pnw#MZIrLbrww#yTU2O%6~F3%;MOgJH5&3s zXzR@f9(6_F65PdVJ_aoZAy4^mNCk&rFAhsHdtxi64CrE&;#!oGf}OLCGMaJ(y+t`Y zy!B}7&!aDSwDsl@ihVnjx@xg&O@Vgrqf_gZJAJvejRwmgNZBfT-91lWebx zK(?25$1%=M!tbLzR#!Z>JE?4-Q(7M43>z=(d-0bg$H%!E$0xaxKG+#HQ~0&HETQXY z&~+qeAJ9uo@TsB5fYXry6OjRh?BsL5IX4NnQPL?^`o=KU4Wt-!B-*1nRdYq?43b{s z3`1uS`hrFyIVH#Yxl-x!T*+|&xB~bAaAj`zK+IE_>=FR|f7vt5Gh_N|Ze#Bv%M@3uElP z@bsKnqX-lFZb#s^?IqVmgPC(a%#AcC%pp5Er^FjUCNP^9{SG`4JPKB zhPE1H3e9z62c!I<)KwN~B+@umv$jDR!Glbh4uh@U)Wi0f(ZGFEhK5d>>mEgO{p5aq zg(oSDZ?gwiXp!}G^aH`~JS<%6N#5Q|D!RaT#7-X7dDCo#&fB4H z1NO9|*xNigZm~;pT?g`LXlrwM+ViaJXm02PM7Q#+>|kz40;Y=h1am`o;O*kQy}2O* z7%kr0nHzF|1H^m0xgj4oM7+nD8-@W#i1)VUhS9)r;=PTzp*OIfeCAU<7)~b>{i#5zp{^dkNd;y`-BU(gvA-%C}zsx2;(2%yXS5 zocZSzajwqGpXI{+O_KGx=qDoH|Hs~&fLB$W3;+8JNzTbc62c(Tb50V5a}qWLNFV`H zb`n5_7!gyaTfQVfFd-ozLItVi0MQ167AkG6>AePr8cD>k{8)PU5YB7#-4z5Pl+ zs$r^7r_f6C|Gj$%CzICuAHMJTKi_`NKJQ-hyQX)o^{#ilD_i(GDbOjuQuNo)w3dx>$o_9jK->bV#&4ae)!*iB9Nk&1t+XmdKN`F21n%2?)4Z0X{i<%2B=?Uie zHo}$4zCde|XT&we-Wq3_$JHE8h2D?wl<+R89pU-lSIqzTPKl25en2`A!{fa9tg#NT z&+|e3HyC$Ed7fr2e(9wmb$(>J=SFDRQGdGU1OIr>`}JDOEa>i~Cy*H*8t?t+x&^AZ z|CKrDFJ>foe?!=jgX6tVfx`sapv>(T97%-+PVkJ3L|^;^6FeV(Piy%;VcwiAv>RRW z#P>_SKggQkDTYVe2Hh@(?-h(xiZ0V0{t%~RmggI^{h2tWXfSQ#Bi1zu(815fX)P0G z5Ajaq`{9Bi-qp8g>Y7No+bF?%20pHg{h7btpni)xr1svP;B83G@H~Gc!*lcgA9k&o zy*6XbTx+J07ONBuA>7ArYmi<5K75_JB3xfA5^8OF- zesi`*A2Y1H&4W)WdD~m?b#EeLM#j+uZzgb1QG)kd#hUu7$jP4L|0A(0Us5)cPi|0~ zBDqIv5#vVeK-yAfR-Pp;$+N6k2a*2sr27`>zYW|=`akTJ zzLD>~((WtY0}DLfPkuK;eG>l6h`2=WVn6hbcok=&eg{zP8zo)W?2sv9Z5%0K6V&{69s1OCnv3bWc%d8htBO8R8ZGoYaw&*T0+j zGRFGEuCe|p_CEj2yh75KasD)YZA4tSneJ%P4cF5xWt>-7-%7qx$rt6HaB;wOj199G z8)hzVgJx>12@ANF?92`F9q>fcH})_Nv_U^l!XrP$8ERiX;~+Fs@dc0#Vg1gyBw-c8 z29TQ=1inI7W3m4bI@1~$*Tsu0h5vafdo1;l?8)O>kyPZXQ!?~K$$9*2JGj}`e_l$jgtmnhm1D+ROW&O`S*o$&k z+qGKr4*Z=4kH;1$cUtr?mvt@TJ&BgPxLIX!8r-EkWKDlzh{kxTU6%3oB4^GD>rjpGG8dBjXe6#6Wp{yZ%DL;QHNHf=r`u!N zEAWuz>E)ho+LYkP9Hp0h;5O48dLd7*@aIjN8U47YQvmWjVt`)Z4}FPyiHXq+BV@1e zPqNV`&&LRMc?a~y{}BWwa{1`f!JhS^rfAuiKeJB&gzT)4S ztjk%cBTRU4xGvYKJ`aRvqMj!_GCEc523)v=T7`$C9vp1IDifXuPk2D;v%om~HyUtZ z0Z{z=2kLTN>KGyuvz#N4c;y@caN$wPLBbt2;KCh1iLc1CpKsd70VRAD`9V%h{UhZj z;oddi!qt=mNvZ62D*VFXE9p=(q0fY3$uGQ(;t|+t!UhutO;}<=&4fM^0`zcB$Gb6q zjA@H;I*ty1YxujvosPp_JNmV^zUFkuIfU~`PDf+l*}!uFr=vadeCEZ>DiRBo2VE*= zaJJ;`QizxNq++$($4#@<&Tll$R=a)4G+XW9_of-3KSZU+XZ0iLZxX-Nu44EWv(*o& zPTg#^OP}d(wc~G?W~*P!FwIs!$Th=T?d~s_@zV8-#}H~3L#TOW5C2qmH+K;*m3!gm zuUfHool?BKZ297qK}bWi@KveH$H z%V$)qD(mtv^IN4=Yf3?|E4bi+%yXD1T-r(Ks=5i^Cs}`YA+_9!~m2q{soUJg6XQCcYh{Xh5jCQ>KpKjLN zSG}Km^5n_pafz$)v&GA#212E1`xO4C}7{TcI!Vw3~h`vn5As zl5a|Kb=lh0hF|&bdEUTs`50m%kHkl}R5Ut7s#x?o53zVfHI2=Bdd6qP<1;<{5h5q? z_4j<)`GuhnJ$cw8Fdm4Ud~SmtnHCp}{B?D0z?b3ne)EaF;;hFUVgC@Hrye zM#O~ZlFOALPF_hzCQr;CzVdS><=4xvtVhl=pS>UE2b?=tKqNa{=3bTpAH&+qvcb2o zvDR`a4=gC}Xk2B-EO%BaKEFpP@H2*<`kG&v3egd9k_OyEDPxHx~5xy3AwFM*8e=4uYW?Fdm%7b>*?OfVEprNLw}dMV*P3;| zltqAdE^j4oDffQ2v9=VqC4=+SrSRls%{=QGr#Cz>$|L)vO9nZ;BakC2^W>{5nJWuF zbiNkmRai&ov9?|WuQiD^hLSZ(-~UXaZO|Zf-e;fq^jF8}UsA{Eeb;ff_L?CwzE|5? zXj|y!FRQ!1UUiXiwJv(OWnFdauf4jm^0?!1U}Xt>?}1tNZ11f`ALzIJ;@@f){o*|P zOK_guA709CWuMVjq%DYCwAGG+ug+|--OBokIt%Sz{o*j=OK^Y(YUQJ^HY|Nwa7c3g zf7c$RZ7+Igj+zJ0Y4P{xs4$GUwpdCwCbGPFz9jD5A$&X;WL-`S8EvD2R%^hqau zGK@YM&fXn59>|aMMc0#BMJl}7d6&6MlsloLqmW%z$JECp2;uwLZ7^US! z_5@tE$8O&M3;Gp{Xoo2H5!>KA9>rKnX5idKem&nv94(EIM(|OInmzOB}xki zky>OwB|mc?*`eDl1KxoQgjQz(nM(Jt>i+Cq}*@*+3fVq2-SYHDuP+&T0D|1rTsnn#{=RX6{~BYw5*%dj!yf1J zaQq%zDKBtvl9#-p$lid9w2NNpecqY5Aup_B!vSZV2BmYc|FeS$eSAzxj7e}TG5_Eo_>7P*N552C3=S1=2cppu9?VZiyV(xKiqR<)lZPR*pjMUo)l6) z??u_v(-E{y(`_%{UKzMzdvQ=b$?CNIfQ}Z*d;+q5%p=Oaf1N7wsZMxQ<&&_pD;Wo}k=;Wk=d^naa{|@#(QA3? zEcXP@2kwcUm*KV7kWQX|lt=iXi={8IFSjN_$yhvrx<=MxGdSJ%{XF#v@^YU?Yne>B zETV7Erf>iKqdavpcg!y0-2;E{Wzvcut&5~}BWZEy!}F1QDtEX}^u%%2;blMR3J;%j z!iR@@?;wqfq!Gd1>B^UHP$Q5jOGlP&)ywnMba?(R`;o;d)LL%D?h<_2aOBWF0M|PT z+3RAiBl2(;y;@7u&mz3;pN4xcg5z_!;oi=_YwFo&;=D(uMtBdU5QesR|JTC3S7?Vn zpC0a&vT1ZGncK;W6WSrNjUpF%(VMGYqJ7Jmk);o4EeEN`Jo?dMaFG3~GWJS0v4^?X zpNt)4PrTB1PJzR`XBF?9CvDz5a1~nmIJ7i%x7`~%Me(|lZQe!Li~k^f;=^f*_a~(N zkGpf#PSVrsDn`k$%5R%{oaYzZ4gdY9RL@=94If&55vij+qnW!!P=4=IcE6$i8mWud znXlX*tF=5wnaKXTz(KD1geVb{6kGeBG>!UI~KZ%;)S+CzaKgIJ| z>Qv9rv}{inchnCl8RG3Ak3Y`J^7vDH9)wPdYRF?&6m6V5vKH0rZz%ZvfPDUtcA6D6 z$@4?E|L!A!KgO<*Prp`guwhvhjheMa;=yb?9*?k`M=`CS|WgfLY z0y=zkE|oqbPhCYhPGFC10q3+_^mmPRRl@nt0JO~K%vVq0E@RvQ#*D3g`25gJUc*X$!FYL=1%q$Qa;u?Sk}GbE;5KG*-zL5?JpmuU4E}lQ#ItB zOS8t(?}1aa%ZvSEJ<6N^xyvU4i8F_jS`Jy&&0}6JgAI~R!iErcAuddTW@jFX8G3M}T*8KDXZGE^uXS(+n{;=u3RbU_K-%6zN^cQ~h zm$+{;-Tz1&Hb-y#tAqi?(;xmjO!xlMe=a0^U--ZKCGI*Cjr9AAf4D)7s zeU<;pFA2ZZbeH`1h5z$k68@;^uJx0CoY`Xfi$BYB?=Sx%d@IjE-oEN@sL2fUQO>qL z_NTIh5zF%v3a79AtG8T+J7<)Xh(5xX$OZt9w1d9FJJ}>kX8%Vvi+~H?!haI`KMKMm z0%hNeqze$N7ntKGJ+WU4UShx6fH@kA9b#6Mox-1t#>HFxrH&za#M-G+~1YgC-QltfYS$Bn37BC7ox15-w=MB_=#i86{H= z?FL+U8YuquneZnjTx&w9Z}Bg@U*JMvqlSCM+?bW_JbBN4cMThVI9Ofw%0(S^WE;xQCeU5i_sFkAH-8ydYRB z3Gy(H)y)=N_yca@ZqYftzA#&K@vQ0JqBA(@{-ylo*=dD0jLIz2Y|-6^z)j+}`td%~ z-J;tCAw&JkUYWJGHdnT@irKZBjqaLzdb^;Z<|ffgbH`QpRi$@#3oU`V)Ufq( z(RHx(vNctp^|J3~Q9QG{bWv4VLB;Y4eUGy*$Lm+1uT3!MZ-=vcATm0mboom1vp{w{ zzaYOoy%92R#gcU)`OW=q?Gh(>&FKO{1ZN;-n$|o$So^YRq5Np-H<4rbC=$HjB@DHT}R~$+>OHP z*8>Hi$8giiva&wnm&^#NhI4O~ebTAFvRPgmb>Bz{rIx|?OHQFYusxkJ{ba= z(v1CSKD$N#W&7J}#~3=*B#_K;+A&Mj+&WHC+OQ1W-;Ty!UbfU_4y5b#1AL{Y`#zm( zw^Cy4Z_8d(iCwvDGtF`atd_H2?VXP;sGX~_qX_tw5{7B-#_Jh znQh%J`999~tG0Eo$alD{xi;0l?u>j-;`;&nIyd@?wk+lQtbJWTzJJK~T*taO^8GU3 zyB+H);Bc1EE$oD8a@jKV;lJA@Oe$~0|75ToO@6@n$XXN_@z8?r%=SJRg%lmwv z4O_<)8eN2~IVGEd)AX~*+>cRWx9!=04y4dMzV2nh9wFyB$`dqnez>A+%ZJ}Y0q-bD zz%EZ~wyp6P=E0`fa)&3NyWjaW!`;)}|Au7cGW*hc`jqpY(Dcux{inXiZRwG}vfhbY zfatI=`0?fNAm;F<@<#D~LR|??p8^}<)wsjiWAg>-nX|M+hAAy>x6@^)uil7 zgT|!h)uij?{s+#w7peWu{nVLVGHY4T@cz{ld3@chcNnZww!#m#ekk zUh#NtMO2t_Y`QI~av8jja^g-6bJxu!%ouRIKpPCmSzKFWUGyOISK%JT_j2-8nGkHQ zB<$S%=xV?(ah!X`)Ey!Iq-@HQ-1U*Pi%7x>-X)Lc2IMTY>&8I+8RB;5de@c=26rjP z`TlzMAg#FqGfOda*(lq6>`Ng`vd8D<9D_TUQyy!SU3sjuBSVkYr?xxK$5n6P7-iV>$>T3ZZw7a3^>o5^tL}%;e4HK+s5MLu;~Bc;GF?)UCx7ry}c`T zDf=H!`O&cfk5s~szD8Sq^mOCcqr=O`j{o!1V=oP_7#nx|7qM}FNdHcJDtiNOJstb< zyXoI~lQ6=|b;muI5CKfj^LfrAj|?43R8qd~shOkQQ)PQ#*rnLdp4V zc_w@QR;H<+FV9uAlz``!8<25HN%rL2z`jC?-}7&8pwl5G#k1j!6wfS>oGd0`OlJ<4p9M3=elRYnH<#;+t|4(VtJxX$x$Ns~wdm7;>`Y69E zxHqJvd!D-?-E%kPQN^C^*C^u{%KFzLJ7oIbMIX@1+O6GF@^NR;U8$KKId3QD>=pp; znv%pG#t2VQ+BE$PUS`@<&tB|zV80jp1@Md4&K>CeC1)o7ZEm9X`|Qu2p$?^e%?XRF zn?k>G*@o3!Gbl*kAE?t3y|4JP>a*!1(pOTU9g+Ca!nEb@ac_qG^b=!ChCe>mXH%}6 z;;tv{^vj4V z8t=x>mG!gfSJ%ux`7<-?gaiTASxHUa)A2dSZtArkI<&|`N zK;NTEcH57Y>{ioX8#3;((AGC{^D8bT1?mTozK?sOPBO08xqmI0yF*gA-^2l2boz1b zK{{34Y76G1LlaL@9_burJ4$(^&uv|Il0M?K+bZJ@Y#bJcy!=thCjC(@n>B65IMRND zbc;Uk%z(v{_~DPW>`vP2hY^nr6Z;*1@5~tR?Ld7g^kJMbpzfl?CHf8ihJK2e{6OBf zwTI_B1NC*3@l7b5(_Xrv04f5ql^0FR<^^8lkBN2IQ&@ zKKSm)fVKHJQzhpI=)=iJkS(C^E~f9^!an+1&RTv(zm)#-D_%L<@{d~{8}@18B+ri) zYwC|HB_8y66yWB|@_bN`MLgM_@kg?WXNu>pBU3z+!EG(LS@G;8o(AG+CXTt3;Wu;t zZP=QB(bT&a=c>WvOpoY+)NsEUcO`kUXULJso>t<1_i&cyZ|J1E7J70!{pa?yDV|6D zQ#@Kqw&%7RvOVi_e=_X$6`J}@_7sDpy`vDfWcFSQrxMRJPu!7d#FOKB`EZVB80GR` zl#3Nl4exX?aLb>rV^itJc=qwtxL3?;AZzSW&T*j4ugZ*%Q#kaHm6ctm~ z>hK=#K-WStiHkX^*Ji8Sh^&B%ao6Qi4Be!xk!1V~FgB(Q3N}}SMb(XAUg5Sy*QM^w z3%p2}T*9d6(<(-mE66&bkh!9SIl?&l26KQ;=KJ4c{Ey=uVE^8uuUCv~+JoC}aE(dS znqx`h2=ToxX1h()qO8Vu@ zN059}-RSL+^^}~sw$p}s%5V}UQSgy4snnUqS}~WkVjgQn^kKBjW4^P2{Iya~sf3sL z&}RHpO1U!ssI=VC5mJR+4RY`bvQZZpzn^4&TZ7&wALfI6S5gNxZmlKASi?R=QO)bx zzD@hR`$Wgo67(INV?G)rZY#`v%*8f>i%PnoVP{}3VI|y?fA1^`#bwXmBPI*JytxtX;04E?3w}yOes8zTp~~TCY&odR-8Qz)1W_UAHm+w90G_ zakCColVeybFqaV>%`y*C7<1jw!0D{bk8AUpk zot=|qoiyVb?QaTr*<-Zji{3)=knuYY`Hdvrzsi|J;t*UUF5gh(59FJ^DD~KLO>W_s zNxe2Q*YhJcAnWv<^yyDJJAWj+ot+*{pX*=3TnimVfABz*|5UorbEwe1d#+;@%A%*8 z;9%volCo(RUI6}F=zWVs4_XxE=>$Jni%Xv2bD+DBeuRuJ`7SEh`<;qCNon=cx3&VM zpV6o11#QS*BF7@@Gv7X+CtAt!c$Mf%rFH8t<9w!3FCv5d`3f8Jd^_`f2lIX>^Z%V3j3!Fe@z{Nc>r$oS9O5WEc)2gfx+eg`71^zFFGQ3f9Qzbz5Sk_H;qrutWQbMmY1=%Od0;v*qNuF96JNZJ)W_P=^u;XZ&#csx#BLM*8e1bTugX~B&#L!9vqkrti!$B{?e)bVXKb3I#Vj;GD`2=&*3d)D ze%&06Ig&W$F^+Dq4O$jtoD9GNc!hNikLRA0JNr6*A8@WS{Mnxnp^Md^fkN zk1}`ID03%eF8YG)yFa7cdzbT&jeVEOioa5qfPlXOHwe zfj+s@$TpvfPWDP%c?HN&qO+t8U2+QJKJq7e{qKTLCiUOQc+s=|HOetk^Lebcc^*2! zc1q&eiOfrAzipe9?V^+U+(f&24u50dMSg?~qO@r#lkJ4RgZHDK=c?z?5#R!kR^go; zO!b^*jPDiyC-8EJ|5QZ2Y8zwo+SBdS3;M;Wi@T_cU{W&ml1#lMcf)H8Jh;ZqxAbbK zJFRvKuf8u{)R~lg+GHMWGZ%S$zWa7O_8^U7cu_pi3) zPif1aK{I^lDW5Lm4`p*`f<87MOQt*>yiRn0mN0KyO#Nv-WY-Hua=s6}Smqz=nEl9<9-@CtDHw~6cG0Ih#$!ic#S`dJR;ZH!)Ja29if7mL zDV|d7HS7<>=I)WYTTi{6`ksA{M)+^iw^|eEN8Vu0p#}6KbT_t&e&p}k_Owest26pl zM~Z#>HPFdn^eNlF{D|5^jQ<}(AeB{6Qn}YOH4+bpKiU)>!K9{AROny=3&Q zPi_iRKl>M_=xoXbGXTS#z?SHR!jTfJ<_z(Qpm;>0ELpqp4vfs9z zd1StAyE}Yq_i_1J#^slo6NQeuj$s`x)@?5M_ttqC8UJNIy@x*LWgZ*(RPC@qVGl&f zzG0F%A8q)Sxp$bLTrTOcU)Zq9+&4tOAu_S99Ubhpn8Z5K4W!RK@FVeXW&}RN zHBpC>g};N&TINlGjmq}Hqx|*QZGRPd|5_e*YCsp@bKQ8J`SxGXt@I1;<#oW`;&K`WRKz5d!BE4-5zZIS?RR;>9p?^j_r>ghF`N4 zGdh}^S?~3VKZ&wDPx(n6=TnE$&JMkBufF&C3UNge_C?~VB(6CXX-xsl!Z+~;@+(|? z&*fE^d*^-u|Hj99N7mH^yc^JwU%7wlFnB`oX{>Qv%thz&&bGNy{j7JIz@8~#0 zx7J#XtWC<SB z=sI;+4F7oclbePq_u2-^+5;W9Y~L|otlb9vAzr*$1HdqPUwCEXJ)QvEGw2frdUg}j$TkA{148}_E7R6Ab#<;hcyN5`k1Yva$jYVa!lfq_2om{A2Oi4x+%sLQ}-Ne*|_qt zO+V-Ek*$PP%d0xZmRItQ=}^nlI%GX;;rk5jd>Uy<9?>_>T?@el8uMX2k8$vExI5(n z`II&8dDgZUz)A3wcK0f4;|=f&C9h()3|!As7S9UKucy_OhUAqr^?NQJvqkE8J%>NZ ztN4|?o};Xm^Zfw${)IGXZ|5E)uZQ)#F55RZB(FawuW{uonqpnCb;rnSeEGPhqvUlD zVaJv)?-*CUj8`SUsU6ZULUFDmzr{9t<&0+Sp4s2F-K3#&UfPe;ZD01ZIapSmodQ|A z8qW`2c+vU{g~lz{GXc@;5U5riho4B;UIF~JiXlaneP4JchGcSOW?lBZ(4#LuZ4K8_%+l0 z+lIGZ?)yx4c!VO$)+_(R2N?m=`w3rQy36?ho?h{no9U7L`IWT8-OIO zt~AZFP4iDkHyQgKz!YH6G_N(y(|{6RmH`*~fds7@VZen7P}1E;!HK^n11>yFe#Lyq zfD4;|67G2eE(`)CoMyOJO*7!a+358df&Cbug!db8p%Wu(x6(f08>t=i6RJQx2&65mr|Gu>YjK25 z7t|OqClP~`XF7k3Qw3uTn6r(Vk@$l^cn@khP~vB=PmlMI%?P&|DE{PJguo&b&M;wy z2`?&oV=Optz#Pg(8Hs=9dV0KV#EaMPRueXuP|_Fs5)*1B^qEjGVH=+G@Fr|9VbFvn zCe%#mGofO_Ht^sxyw!vaCJdUe#Dtm&eI^9x;p}$ffXcJs&xJ?WYX;U1bUIqo4yGMS zbJ@41ZA)`HcBqf2KT**qH}=`F&yD5y%GjE*PRG6ptrHGTa5@f6JUsE}M3?>fiA@uo zj;8E=*{#{YDf_0hPI1|voYFYO>DZdTEq_P8q^Kw_lkZp%ww_io^J-GCJa6?d3*8t0 z0_8czx0p*DhFKGLzKhK8hfT93C;T5h%qPt77QNR@vqc~4#Xojde}7)gG{{;r{uJE2 zycWIvn`t(%QItu1h`TkOJz$y>v6DxDxLf1Vji%WeAMVCY+%0Y zQ;i?TK|wvItFLLD`}; z6;(^}R;*sVV)-{#lAU|XRvBk>LgEC=T*}Zqzk^JEdF5TJD~p$uuDZKIzf?Ok%A3k7 zmae{GRmC0R6skqgQbahXS}yG_C@WnmrMIALIrV0lx*e7Yjn$~bp2dAL3JsT-hiGQe zKEyq@s%phz>@?sPQ}Gac`VVjx1U^7yc}2&vWq}U%uD4e_6cj%7xq0wO zro;P-VlQEJf^B;y`EQ4>^5OyixyD~U_Gmfx=_ts%YmriGNVbuZjWD@Srci3)N{*50jxc=>@ zSN$}`S$F|nON1HcLmQQ2zuTe}{2=$hvy&DLtp3HYZH2ciO053n?b{01EQ+r_e*B5T zy}XYsN~r$q_>+Z0-+8id9p)*#4`VLk{rleh{1Z7RA>WC7Bm0k=*gdSf zW#A^?;wI2=`v|u@&KKli_YrOe9InHO5#pAuyG@KR+$KgCZhNSg+)t64K-K|X-8qO- zks~jzdKvdB!Dr&kjr%p>|5Z@tb13sNWQ~7{uDksEw9j9rJ=}r$MbnMQ!Z39FfmdH&c$^IdFh87J)&S~4G0Sfn@l;kN_dbVq6&o=J8 zwS_r&ZF@vE$cDU_4H+>OeJwWR)ljb8q735u8sOJx=ky()O}nDxIzPYq9rpPa`i^&` zYnSk~`s$;R^wHw~m-{HZ-#3@hAEmFNM`}gcV8@=a!FFC7ud?Sp@+W26;}-*f5w(#Ui3DA(d%eL3>~^yUB4 zm;aadWoZ2hyW76U?so9n_Sk9bDZF;>YF1)ws@ySY4|Awj`)o-64JcRK-1Y9hO=%A8 z#}49j#Mt*ZVjR5OVaHhFeh~R_;uU>?j(FmZH{y2m7k6&h=iXfI4cvmPzAmrTThDMg zdnR*uQ+cC!WlWblBV-Jed@YK!@8PalUfZ5LWEdoUrz_Pna$A&lWMHJOmn*zBO4lD; zHVmCCaZ$SdV7n{IYiHkE?qOVn{}jwA-0?et?=bv?5q9xlyP8bcWc)dZPrm~=)}hMS znS!1}XHBwqae_;AEO8DHU1cMXjT_0_B%JepONP1C5y51y-D&qOiHuZ5R<%K7R_#%$ z%q7ZaDVHmf%xhB+oMczn(d;ltmiyZ``Z%CU*h7Is3sM zEvWtUX}uk}X-CLWG0#;l)!KhJto(?-ZmoS#o$@v2uH5}4^BC)%&35eV12omg-Kt6G z4}{sQ9%qicm%aGM?1Rspq&=VFj+@6~l{=T2^I_=OIN02Yfupe0n;}v)^W({iB)Mp0$exRev;Wd*P244X*z9 z_U(ngV%|OUorc0cFz^2Cctc_KJ5Lq3qHL_iuc?@Yg3sSHE*& za`hihOsW3n+tUiyy^~#d{7>oC$BAd?iFDrV>dVZLll;@^zuBJ4%#jT!^L5Pne0{Rv zrq9>2J=vVMUXU8#Os;$<@-1+<4sRo_1*ubXx7&zI+?t7_hPiwV@ih~NK$-K4-Cq3H z_;YZ}^n7Bj1NIWma5MZYX07lxaV*Bq+k`jZa2*aJ{9@J@VmF9z0>8ohegWr(2LZ*r z71}Iw{Uqe6a>I?ezDB$E<;7Q@r5((TxjNsMes0b8E1CDtqaB2EMxm8CegrgMW9}b^ z`GalSisQj)bi)0`m+1dBoWGtxA0N;8<2SiuH#cGXfMb75AA9WZsMz=;>9I?3dmlPD znltAwMMrpLO^{1}2-5%MKIkWhj_};adG?xZJBxFn4Wd(9^ph{feHQe4)KHtZ23qhW z^!p$(he8Y6M~f`FoYTK5Kb%D02)$Reqxd>x!3^EV&`n(rr;OoF&J->sKR*ShS=?D2 z4!zcdjww!W3j6*}#)DSUDdpXSo6unyGpuk=6Ye_hww7^jCgGN#hjaw^hH1HKIQQSp zV%$>*m&aO2#;at%+}o%|vA*8V8oP$GnTyD~=ns~(!iF0- zo+d3B|D4!g2hA*F?36Lp4Luhg!!wM*E>qs)X=wj8-gxenzX?2UDv0+EWL>y``}*#j z9q%1aJq0<}S;M)`2F`gt#W_zU8J)sMxT_WO2i(spYYWEWOG2+4wVdSvx1GH9RL+f> zb;`uV(;m)mour6V>Fe!UDY=3+mt+< z8er(aE`cWHBQLxJy|wpIw@VWh?{Bv%-j}!8yi)e>4~_7CH&SbnIYz5*wC6nIWm%%n z`#yJWyxb~xppNo1QWqnz|0(>vS%hgt)`@+mq6Y3p-^m>Carh65xa(Zfh3}?rB0kNh zcymYCyd~i_)la#WbN_j${FUewIG2Vl{mq6hebMvr;Z!@a-45)X-6VF8< z_s-ep0a>ai4IQ|On>%Z5Zm(^h+iQQ;<^36c^JsfX+^=}Rjoy0bio_%Ho0*iU#0M)k zF$gczDswyYyOb^Hre7L1palP$NWbJ@vgaVOOv$Wge#`qC)$M&*WxYY)s2NJ%pXT?< zUGgb0Vcx~i;@{@@y%BD7XrmAOBIXiwERUq@f7{~nUW(FM%1Qqz%!msl+K5B)_d4b_ z+|E1f>R-s;$$VvdJ98aNA51)cf1Bg-x@1j-%>QpFpJe2jt@sX-uWjV_ecDVM{Z~Q9 zz*E%khVLl5M9M9>O{HwYl6liu^(B=&?AC+=if}HcPi% z8EKrq&aOU&%%Cz9{u8(-(dTO@vk`GIUZ2eOl}PVS@Cb7!(eINO|CrDES%X9(Ct&By z{?JjL6581YO5Fu%JF;ef(k<(!X#K1Qw4z9Kb1$VGzf7AO2|bjtyB7bVEB}7Vq!l^CC#mQA zM?`zS>yPms1+$_=I&RU}=-BSaeDa7AM*i!DgSVDO%jihff4&K2T>r&2K z(?=i+ z#My1?sDZWrPVNIPp^Qp@7)q-Q+WhG)S84Mn(DQ&fez4}@Y_OZH4r2_F@k9Ds&oQJS zWDIFw40)U}WG7>WHGat0A!ACzCg+|l;l|ic`MX!Pmz)F5{ixYvERk-mQ{Z*z4nz5w|tweHDBwMqS0XWI-sthMe|)3t#4Q z7QVUWc>KRJzSdkq%J+X)e9wSeXq!l)4g0oOe=YKs@^tX_C11TVQFm5mfLUMq&YwrVQ=a)!e-XXocMdh&MINlL_SeXSQJ&{` z`*Oe46iVpN-6aZ}dHQp2GTooYPhauN0G^55rXNW86pS!njwslli2ZrO3v2+2ztuqT zx6*()1*UtJ2`_@L_&W#`f2{`0`3X?ssWqVn6n}|^dqJE5bIwy9;_qD(ZUc(HB|wR< z#DF;>mn;7KCM-byc0A@ogADoBbfB1@r~U+H05gF51{&u1Kx7it5kQI8XTY2e+RH@j zPn$5E_RE4)Rexw)gaN)brijs|e4N&48j-ZFQ4>jPzD*81t9_kn%K?_9BJut@y zB#MIJ2Fy7MeL%*h;IIL64gzB^w;C`fgMKOTuchUZRDtNf2j)}(NvfdSfH@^Vx^lrc z4VZH)5YkZ~db)u*oGlZ1;eu!b<~V^QQ6McAm{U&slyu&roghM7aMXY~hk&3^aL|A` z`+&5gf+hpzJP)L66g+3ZoFZTrwZa->! z%Vx75v>mnC`9H*WlkFhiO}2e}KWA&=`#Ib5{BL!^r?3ZITU~bkYxw`z)qzdB>tnv# zUFZ4!qpO|oKf2oZe#`YozTa}a%m3j4M+eyKtpg4Zu=9VA|Himy<81by#5Km*`EQ7G zIvyGPlfeyxosQ4FL0^r};b@z1dP4gIhhtmDj*Le#9FEq^gPDgi9gd5WKAzMu$>Df1 zt1;`@EJY^kBIj#87pYv4L$>6^W{7);d9Y~?LNDa`gZRhJk^^h+VSdvzi#)zOqK{tu zx0+`8miLfp&JZ(UwwdN|)7)U1+sycmn&wwc^Sh>52A%FPMT(G+#O=#V~x|A>28g?|7n`7ar7h8Y>m5Nrr8=N*O=*B8s4k$-6Y*hu*?I=Pq567wKs$;0;Tc-X-e)*IE`Kp9>I{ zUQ&k8vhLVTw%U}xHm^6AuwBkwc1ZYER4-m}*HSJ?UsV=*mHYe^RqO6Rnz!^W{RVea zayq|s`OWXM#|JEcQDCHk(1xt=ZuZDa#aVKRam^3KeE6%8xq zhkBr)z_plViHn{<{mveYip(A5k#yvh1Q=pvs`{0m&X>aBJtx8!AH?3p;N=~~Ly#dE z%KpwZ>{AWnPUmp;sa(DEO^NP&{|Mzq_Hf3hB#B;YbhpKEo_sC(Ttsgh{L@OGArB<_ zD<~Fp-D;OL+k>CJkvEdF)s`-?sJMoNMfiE<3Hz~p z4W2SDb)8uCdPdz2bS2z(jUfX$9bHjA_|4JL?z;PsDH0xPjjq3jJpuL(OE53yOuNQj zVjla5=iz@|fZzJcmCom%-VYBK{k3sZ*#9$SecITYn8AK0`{bfa{*v5H`yPCHk=1w& z9qsUf7i?tj(~?n9*v}RDn8ycHa%XT7cLw{|s}>$S{9s37>Td9#J6_qIM!5X#8`Q=4 zsgXSd_DL4U!NXgUkqEWM;ThcoAM@4fe7DfeX+%k*?;V~OPZO*irZY3PpnK_t2>Z(Gyh2bWUw zZb`j-z=gd-bXo)#YzmB_jM6=u*(Z{G(2n7A+jr-o-}Y>ZV|x_sVczeNM<>5~!<9=u z_6eMWG_?j?p8{988#au+nVLlQW+iOQjn#=zlOP#*Ul@tIZ{mbGY_-JI!|j(MNh;7kxE7?@hzjBmyc3Z zk#D2ii_Q{%WnQqkiZk?8xE0)|byVGx)**Z3qOV{XJnA{PRp3@}B()CZeya2Z=9NWf zNPih&=iy$7dm3RY?@1MTd_C-H!b%y|A%EnetdT)lP)iwl_h+0#cD`sZ_4G>YTf-** zKJi-ac8E`nd2865rxLFf8GUy^Q_Bk{*F}vN7|><*MMqnb>=BapMbyz|_Gx5)NZP8V z*u09*?`a1w%JIfddt&8WzRP2W)SW?2DKZRQj?`^AI3*&#{~3MeF}u4mnmn!scR44Z zheyAO3!R*MVHa39i(FY1It2t4!1@zf(U*R=T++L;{&r~1ZP1)s(QR=H@)xK7b#^VcXj8<9vWrVa~~}RTx-$)(td+-S@M2@yuC`^B+mp+ zl)4hTI?4yT1zV8wlJ;|s_IBPeI2HPwD0?~q+Pdg_fM^$`#3MIHdNrgc_v$)zdcfYZ zNe^bDhoRhuTpI0NrLQdieP##!BwpIP+*?6^(&b%z(9}85)Cy>767*7+cSLqVBdn9Q zR7?Aa&eT-BZ-7q;?LC)wlivOZ?S2B-h(1uOe*`h_Rlx7i;=UM@OQQKgUlvwfofc2h*%-$WZQ8Tk zROg2tzw#aJ`*KcZ@-O6^%n-BB$v$jAZ%D-?vWbUhkF}LIC*3~ z*jM=3WSY5x+Rh)JRi_QO@K&JM|B>+2f!YY0t9I2$PGR)Mp`Uv5C1|0nVKF-v$2i2rb(2?4s< z>F|$9cRI?eRyrN$T^C`3IUR@HN8N9^Ia43i8g($r>3A}xG3MDAr{na1_5tT%qRO*@ zH<-1PI;AYKZWgZ^NFA==N+y-*;T*r&C>si{vd|MB*_zm?hYoz|xtk!{H zmJQ;~I%7NAG%qMyyk^y1Wri{Iw5+w_3|Ux)Iva~QbD^X!fWYaipMTBL*EzDTsaR6H za>a_Sr46wuO3(ET%|R)bjQeOW1dq`2@fikbe%&6QX-WsuBzn19 zYf5qF=~ky=5tKikmArk0zo@%*Mcga=Vce-xRp<}%7Bvp&0tSJ^7hYmQ&4fM^0(AFp z14HT9x5P{;R{N~PEOcr_kI#K$lVfD86phin~KR&sj1bQX&?H@2h5u{E2#jIr=I8t6%zg ze=K_tHE{Z>bZt^*2wl4iRRl{cj*XG^o^(z6=1{3!pW!Za&7xU`P51vpQgA#nj>}`2 zExKkk#DA8qjgf}KBk}1`vSB85ON$N)u%51S`2E~3Df^c4`1F5hbwXF$)ol!}jOhq~ z4+PVeyJStPp6B}KoAC`c-D`<2^f9yFW%XrzrE)XA60?yt5TDS)m4ghL$!E7HCtxA; z)$k5g?ZH=)eP5p$Nc^>%=5}UcO#}+1!}Lq(o4Os_zOvu?m7ktxY%LjJc9XXg*$$a! zH>T!Yc0=2|io0?n^UfFY;L4F`g{T$_SS zTf>2k)0Fok#x)$UfBxbmrCD&L40L^-JC#q90V^7TxRMUepNAuY_}!cipb02Pl^)!n*=#^{k!1GnjA)eA_;VSkY=% zt_1Dz`kA0me26R2O4moaGA{IoA9A0~=r7gtCUV&_-iV%3!AEqSH=-li%UOc`j79tT zo*oS^&m5P;&!G_aoqf1Bj@6o@$m^>>xk2)%u6VYt1LHFF}uUJ31Q=lkO4h-@v{T`!?dQ92rx;V!YCP z1iN$STNMAo4=V=JA&R6<>PDv3i~dQ8_o0yR%xj87N8?$?fZgYD{}8u}#N*{&M~V9g zaUUh_53v(}lBUG{noZe@Xh)*pD)lUBm4LhG^zAF1ldPi%^Sq@0AZeg$@|;Hdk+%K- zWjmWR=o?>1M-C%00BK#s5>R(L@)l;FF8a=$_$nIX@)#S)3K# zFzL-6$$gpB>vSnA`ZDX>hbzo_tq7^t3hLEOy+(!9tDAatQ?KptWVaBf_z(4y#9H_> z?EM+RW;cB+b&Sz|q+F%_L=Vrqtfp(t59w`ZZ2fY|06qQ2JvR8MlKR4rxNprITmJw! zNPgtbmq>69WDy^FN~MiO$(aOj6LTr%0BPy?CE<_tznl9I-I@A#ygSqAoBj-=Z~9v8 zpG*7u!oHVywcnK{YtR)#=G5wUoL|xVUMcd{)6wg?92_h^d+ATRxVP^(@J0LJ%9FIY zTC-nGf)4H8g(RjJ(P;wFO}_X`V)DJchjHN zP-i{+li=ZU=ihUZy50@1?@!dli?r(o>e)(v4C&X!(rKd-A3Tc$v184tpC^8mJWJoZp1We6C5^`jx05s& zy5P@5?H0d2%1i1r03Ln$7o1|j=>c&1UUpjjr{Eyrg!aAwPUkUSpzliDg3}g7*~^%i z_$hrgK!20;=aIggMQ)(%gucsNK$)~P2I9nB_z}AoxQEHAhm#+57D?HMmitEf*5j0) z@La_I+xXvU)>|vM^i^+-)Z4C*dTXTK8mTwoO>HMGNh8#c)nEFf|AXj5lbo{x$0=87 zFOr|GwnE=?Whu?2z+P^XjCLgb{m{++`pA*ok4xHCUlBSIIg}!Jzo~&=3cDaGENu3M7?ILaI zFSLP6&;`{_n-zQNB*v~ZkHdV?5wFv2z0IQQHwaHp;x+EK;hrMQ%V|sROPw%Aw>xaR zt|9Gu=*~&*_F+z$C}zp4tN|tOOzN(*q0{@MIUi^nz&CoM$;+kB9K&~CkB;Tf!^I`aYP;RyNhcm?q_hW#XEu7lhm~g6=MEJ5Wys-6`Zl41 zrg`@0ya4AAn-8Vt1p>CnsM(|KfjQUG7ryJ(v*HFJkn+0Gwnp0|58|EzXxg?sMb4fZ^VGJ1 z=*Teb1lKP6D9#iPFxrpw6`AXvr9ID{sWiDN0`=aRwrm&uUFu2Nj*B)R-_pLe&@WtN z__5(9qz&4rV`*!lZP4qpWrwywsRN;(pFlsQ4tCqG*1_a%bztbpmpV|uuf0bd2we}I zXIuS}vF%EUKF>Dlu$?{$-giDT*cg+Bkk21*-~0~p&;cJV8F(i*g= zow7JHK)LK@Uhl7%Tpu|zH~ZCpbY`9%s9l}|t(Z#KYbhfs(_E7eC369ni@nHkO0&ef zAws$HZ`|7?X-ZnJF$Y}FeX{Mu;lAxZ^?1*YgZ9!_UQK{5NWY?dWo}eSnicf%Nct1| z4+)WczmkAI`m6YpGI?dNG5&LJOtU-Q=vztHXOs3TvH0)9U1MyPJ}daW#yp07>-g7_ z6}@lE{51_7^r}rss0w7%?;5|iJ}`*+nJqUvwzD(yp&YIGh;3-(3CeRL^y?w&e~(RB zum^v8Vz^rXoZq0F2H2F$H{4qD8;IV1NM0}eergl>j#nvz*D13L?|%`5O6skn)hb79QmLHILGK7~1m~dEUt0_gOL2leF#Cl_sWwnO0_yuJ0V zLBVF}3vSwXDtVx+?<|3?q>--;+;yP2^X}OXzS0h6oB5JB{N$^he7Pnn&HGc0e$a|P zNnc^@H3YhL2z!}x$T;GH9_etZ()vE-(X`Lwj(2={9o+73wTx4wdlY0BgxK#BtU>j=~_DvAORMJ zrvyP(b^-(lh=|qp)UrboNaQJE)ni*XPeG^!MQhbtqk2`^USZCpMzDrX|Y%QK?x98Vmsd{=XCh{tcr-)%N;DtO!K#-=6O!WGST z1>2f$6VK{91%y9BGbVoGF5fmxD*S4XjTYT=`KZ>!k8_Fk_ZpZ~;bj3J-yR3_2!CGT z73hK26cc@Yn)ufXqm1tmCRO_N0UNF5fizN-pN*vbZ6yP#@SOz?9yvXvplAK%Q8B3c zntmYb7xM%Bv+g$E0A2xnLBaVzjyRaF<4NEIm_}sHJep_orOd5BRD{h2px{rDFIZ6K z>p-fY;g|y_A64#$fMmI$!-13M0uid30ieVKownn-Q$e}xjeWHFo`Oe!l1@a~#{%Jd znR1>$++R@8Qg9QQ5cj!2>d71dl=ucIc$Uf$_tzDC0VsGmw<1vP6PEbPfs(%?)F*r+ z^93MHW9$C|Crdw}sT+1WaPnMWfBcC$HLOh2B0T>yg9?g8?495Rb|~1cU_`;Nf|i0o z1p#(AN3GuD-RXHA<@%kTJ)SJ@u>r3S$ntg!I7EX!L*()N^{DKIs1tJocLvezUT>c;1w?^~7C1=M?P1e|JBxvY%28rONJ(SCI#Ze|LP& zR(5wheN)-p@zGa>cgMr~3h(y+CCcuO=WCSR9e>xV@a}kS#LoZNcW09QhhXCIMq$G;`Xeq~a8;y2#^=aTI40@vCV%a^w_t#12b+iF`a8cp61 z6j!_?$}m98T+!y-AAQ5}rESZX#HsNB~uM^k&#@m*NA0@zX9K|8dk66i8H_o{~y4$YgH+JU4vn#*p_EFQ^ z+-*rM%!#S_#?*SNL~YkD>BxBf-M{%B=W$nE<>>Qr>Et~V1S#^G#Cw;!R6L3tX~9yPE<2w2 z>*mXK5c$mV+g7{Q9`T)3@qJ$Ts3JbdW!mpj@}8T5PS8%3k!>n})(B0b$nqsbe<^v- zou;PMt3V>}>A=1U*g2N93KKKaXiQehlr3|+yn7*M+%%zmm;Ko?7|%Y< z_3+ym7r$L5K-c59O(3&7b|GRvpXt0q^-(SQU4m zkiBkBWS%S6sR%@D9&rtOG~vZn=0)I5R6G_~gAOEhU0E1;@xFfehZid475-QbdlBJx z2jH`(@{_2yfL_B(;a|`Pb_70uV>N3Qx`pUa)WDxOXzNi(p4!l5$RS@MgUim2*!NEz zV6P(k@*MVYGdz`#Rgx!YNKp=X5FSY-GObGTAbldx+sUU!zT)Hl^WuMl|KWiT;w3#F zdko%X^m))z^X%2WWIf>KE5JS8PQL2!SBw7;;cDQUykh53c!LMn?~8wV|MUR&RJi*n z*|WVo%sTfg>Y3pFb zyDu2=VLbafO67iVNB`6lr)TFy&#pw>1;yhadaz21b`0ZgnX$l;zzM+d&fQ8jeiHVL z(@YH=blYxW58ywyhz0>=XX0G!~ho?>O3ozmeydxSEz@}6QB z`}XVs><5u$WPkVTk9K|Mkw@h%JlP)x;hBw}YQ6Y%_!p1B$AIh<+3)Ylz8Ah)4*U09 z_V21jkvbF|Y^ghWuidTd zJ@8Ihm-TMlJL|5^*YJCC_`AW$bHDrX-KpD6c)q90Jm~nQ=lh=XW$gVkZ`=mZd@0on6I@Dg|%=A4v!ICUUA-$*93 ziM@LSzW3&lS(TeYTJ+Ir+Kb;9;;DY3)Kk5AmACRJ`}obHeU;z(N8@_oS#*+@uhJ%a z8Eapqy|#L+2kxshADeXryd3xeA`kuXUVr5|`tKt{{FUzz{yz8tZ60kjya$`lGmG$f z#CiDyW!U_79q+yAi45$Ic&pQQ_8-K!k5m~$IKUF?Ykk19kw!R8K z$d+^S+vN8Y&AX%%{)wC4BRP>5Z9cC{Lwm!=?c>m{3AD!{@^YMXyXE8#ucn^5viXTN zztoY%eGk8<%l?(O$y2{On@rp;T#Zeau2nr7ZxtA=&J+w8z@CMB&)x4&I=Z;5kiLmMu zVd)dhS7GTB%u|&b_wztQHbdtF@OXpJdCjKtiE@qjJG# z@KpOq?Sm)t!-Jk08SKb7Z?6v+d-nQZzFHrI)%u`Stq+=kl==UTv6*^Z@ZZ))MnXqJ zHPv^;##whCY5v50Wb>q;=HD08SRZQilf1~}j?6lCVcL%N(OUG$@w6B1-o8+a{@_vV z#UFgd|LhNR`od`3=7D2P*!~&dHNZtc)`0D|0O`B!p99VTeu1|Bj#a(qDcbe~@EKsA zn(94!f#m=Hwe^BuU2@LUY3rX`)i0)K>z$vpt?fNPH!ZN&_{@(9YkV2w&`N1vp_NlQ zSgSX)uORLJ*G`|Horcj)(69eY(N2dxK|4*EtM+W^#$;xu`GflzhYw?}!TdE)*)fqZ z=8i!bbL_v`=cq9#W0d`yj6r+MGLB{Kv*!WE9&NhkQJ|Nx_%QJQr*!uN_FQMxo@?9) z>&22H>%{?Omc1Vk8MZsO3eA)Kw=4U%;9In@_p__yiz z8_3?n*1@?2{~}YC{mU(t&i-YDy$2fpSUvlfJ?xWyG(`5Kfh9HUJAOFC(RCA@y&tj< z$`+jh;*zv47FRBMB(q362e?3`y@a$INV^wlZ!yiswvyM`r2Q>(#A9uw4Ig6kY0^gK zZ>RkZX{-IzbzP+G)I+f?A4M1W#Vh(c`y&r|@vuMlQfEH)5903>a(<~VWJg8udyawZ zdpeO-A6Ix=r-bko=;F-qS?7e`6ZrD5$12+P?6>Qdyb8bPirz{-+?RZazEKvsR_GOk zLxnNjjt|&lIC*r|o$>7^zfCM>*GuWK+aMfYyC*T4PtkbgUJg`#2X zJLG)S0M19jqqF^l(UWPrCUj2DN{=rIZ29#}TSssd3I_AL(0$|`F~*d$FAM)Q>#9A% z-%;nV))2qw=&w<8i;aUZz8o468$0kn<9XP_;9+OercINZ+b^4@q^TE~W2f}H zyt;AADQ%UiUfej{x^ewWd%C|R?B)IrNWN}qj+$+_Iz<`#{g}Y_6u`q9iJ5_syGR_Iqf^)m`v}Z5Ob5I> zFK-@{A~!09FL#2s-%8-kAww}bDhZeCF*`DA&4t_vI3Oew~P*@@YJk$ks)6FtXVZQK_rZ!0|J#)-($z=?l& z_2iZJBQTxYzdo{72x)bow-m z@P{s4hkMXxMLpsZr&I6K#%`j&$$F=gcJ%NblSMx`nOkF8n#T~nZX@q}ETj(H_6^?E zx?kGIyRB4D*5N!|R>yd$W!!{#{{k6HEq5Vl2K2O^_1$#F&otI%Q@Mkur$0px=?)PK zLv=-_j2Sa#idI-uJSbSM74+#>{3*@r^JipcC4sz(+H3P}CM24jnzjpbK}-y2zgzn| z?Z+J#G`;QTT5#9@)aKp;GU=;#?A|12O}T4TY4CTd00@fZ>kT=qcD=Fb$ryvHeX-ga5q3E4`E+@h??)*-;?-L#dh@C(lp^8SNLKgPZj?QS2*E6 zNE3b!%C+*Q0}L10WJkL16zSjz-Hh=U>Mj4{5&uWoDW<8w15ohhDi>bJOa29 z_X^+&U^#F(FbG@*90a6qm`o1Z5?~?l7T|f>jXA5~tOF-^0Y8uXDd0ZVTF6{st_Ds6P5{y;%t1iL zO+&E*Cm*3dUW@xq;B4Ry;4I*J;0)ku;B=tew~wsXln1S9fknU&Py@0qY&cK92Tpz- zDDiCtwgT@|unu?~_B@3@#yAsyk0=-cF2>#rtOmZ(-?< zly?Fa0SEPQ@|CCH9_X*c^Egn-@e&i=4ZsM{54;Iz0qYek2F}HPsK5!gA1LAET!Hw1 z9w`3X6OmuoGTDm4ix`I3ZA7?ivJxziGLGN;@^|yg#Qvy{4Z5-E>QfJ11A6r zfo;IoGue0m<$kiUzzX1EU=WB>l6js^ChnbN>MG!K!12Ihp!mxJO1c5)&#eqa-sKW_ zvz%uEWj+U#d_1n;QlRAHn8)cqbwGkNSPq=LRkIf%4VxS|8S-MsOEFsz`ZU{FC#!A|mRhgYy&!H9xk1uX@G3Tg^=64(x} zV7r151;Ywj3I-L_6zrt@{LJi7uwB83f?)+M1%nC#>~MY`%V@86lV>Z(GdjG7ynf&M z%uShFGqb$sM@2?wc^?`3_}DD(3*+{W%krKbcb>m5jqezr$dvU^1HONt zpXHMg_q##tl+o3HUY}&YMcL07PKehCE8!bx7x}&^cKdq&U> zuHCKddCI;@+50Mcqp}ZF_7c*S^vacehTw6#N!jnEEOPF{UDrOOId*rQnyv8ey7aTe zCH~!Y=9ByuySpy^jq>lVGykmObJvwuGrq*X`@K$H#9pr)$`t-iWnZT3&nY`Pb+-T4 zmHjhrd@9Z}Dn98?@>O9Zes^7Zm%_X2SWDsEb;SZ@clQyuDF3m219U>->rnA?IkRnd z*R6kq&IsOJr^-bkVt3b#1(XmfdE9m8Xw_csy70eL`?~A6IpkgP@2>lfD7?E)V@|j6?z(ZG!n^Cd z4D1Ateeyfr{_o^3-d>u7M|n5_|5#FdA@Uy|zIPH{+A$vg?@95?xwUvaYrzEj(@A)_ z#5CUjtF%YFeQA>YVftr0{@Y3T-z4EbOv2|T*&j)=A4&?}nS}o^3BNW8zb^?tJh{9{ z_FI$eqbXc``PL=jh1SI5Hz%d{&7}5wHmUwUorJ$NseSh+rT_aR|3Z7?)1Q)L??}qu ztx4h6Cgta&r0}7n{A@|WA5Dty?WFk1lKjI{AZFQ>}?}%A$Y+SXB zV`Zzl55mPCii=@quUNfeRVHg{FaN*=~Ybd=O@Y;9>-8jCHKNTRcy zNTQRINTQocB+>C=hxwdyZ?V+vWMVeS-Mp4Bu2_2e>Xw*eEQ38TcHkbaPBwcutDN?5 zcf9vZZT5=WZ|ly4s`Gd!x6b3;Vs)OvF_wgs(tS82<`^qw4~(634_7Dk9?mKQJ=|l_ z-`KLWIhLp$b%Ki%ZGw~A#PIQtzm;*90fS2eC|m4l^m18~}^70Y7obuEh;Z(q8)n_S=^{*`<82v2lR z7*C0)?h%yep3pfHQL&Df=$zR03Kw@@vwgOy%?ov%#v8u`S-Cd}7 z*Mu^~Bf5(e@0!pK@rYPa;~f)A8pEV0XbdN{zhc!=`}SGKAH$}01t+tcTc{T~CEgN; zv}>y;(v78IMbi?;yS(}&U4Dig*u_h4j=2bW8aIDC4n0px)3IYYy5Y8#RdtQ48>P3$ zij&e&Vzu9Cig_bbjZ15mH?^)1sd9AUp-c35K?L4kDbN-Am6Vxk8;{}R? z{mhd5NO)&S9P9^|T*%RGL=P8I(6Wq)#Z^8Kq5bt97R%oF{+rRW6A z#^hi`?@r!$k~2Trfen+KGs@06=H=)ZbOc7~bG0mEA#c||m7Qsv8lai$c(deqt`^)Nse5>n zrgMyQKhVw`E4mJIqQHuVCUDkeLYc5C?Dt$U;?C1%a*k#f@noV4AkgA%CwNu!$+fY* z++!?yPBWU?Jw_I?^26kJS8d1e^5c25RwW%`Ke?*^?e@*10h z=!U?S9!}qp^K10iq88dSllDA}pIyaXV-J1~;im=rRKlz;9;|Qi6ISyXoz=tj65g(g zwSAwzz3q=m+mE2_gS7oiwEfOc*!Jk_hdEc%qy2NVXk)$>P2UH!XmfupD*Yhr)uQcA zUx@zgeZh-9h7Y|AKYC0V%i{00+(F&mj*)RX3eyLZZk)PfMT;9N^2Uq21>|9@c!6KE z$MSgnNsluop6-=tte-Gie}2L!{Tbdqd*%wi@qBibzVo2p7-Ko(SIeQCT3_RbGG+r+ zdXV3n_}zDt6|D+b(L07!>DgOt-TGVKMMovaes2a{{zA|8Jl=16ggi8Dzr!qJJo&53 z^~K+~$6U|2J!!vtHbKAh=mcHfIpX}XdV?(IUAYr(X2n&yRyIuUg`U_h`d5H4mP33u z5ub~DuP^DL_q%}e-KTeN8klpmV#~GFmYIFDa?5bu!3x?mW~9ClxUPDnUPfQ^@+Mn- zkhhN(c?$f~OZ7bNu`8!PW>$~TPXJ#AzKp-MN&cSW-so(NGtcM}SM&;O@%FOJ=D>L9 ziPv}r+VRXluhBd(&nzdbzmVS(%k_K9>GwgO;eEzy_@43^nb4#VWj_(fgeDDvCS@9K z98VL+Q~89;@tCy}$LfP8@@8EHbd|T|n)-Xq+F|8-=`eohAY;7xDm@JCLH<_s`vE?) zAr#cNV7M>A{9~=hyqeDsYwle2r#&8@lTRx)-LF?Q~y9*2^*2>tZ{M)G(q`MW*P>Guik(}(ur8B%xG(PAZ!3Ou;{f!miqWIzZN=J5TaW%N!(;BH zj<#UjIe8?%MORS9y05*))cls|Wvuy`pHDrQvG3G_nV777r=~|HcV-otCkpzR*|b|- zppw3qZL|Of7iAl#$~@6GhkBw`+#6?JXu$E@L1u|S->1zR7*`)&>3OkhxF@>qsTwnq zX_;%8hwZfbdiI^_>&5u?ohp;Gyrktbd!#d4H9b(m(%RLolj<+b&uKTBQRgic!Gn{e-6ef=`(*1j9y{j0xE{dS+zKEJ|` z{#s8x&iSUWEx}XBj2X?$UmJ4c~#jMj>rE0(yIz`Zc-xbi+69FkgjM z4;_?YOs^QK4`Cc<6lWMM6@&HNoVJcV0=^sVQCUfnVa3!m@f^A6R|aKHBNxpO(=(R<8YjJd-Ty7Sx4TaQmS zl<9@MAvOwKV7YfW95nT1M@@b8fgSc+nfG||-}R8U66lT8=@RHP_lNV|sLVm_eO8bc z_dU_hlA!+njG%r)%|kNZ^p^K_YS4q0G7MAxm*L+cE^%|?2&*_6fxYU{!wr_`^J{k4 zakSHC<&A?9;*om!3H2j$pyc6Q>SQT(BXzNly2&R$|3MtTqfXwZZst-i+f}`+>`^bh zF0)>))K?t6QorGVUAFBDRJ};KWPK)OkvzF|!d}C6lXAN5QucqQJZJu`Ci?d9nrPmz zp*sBhZNK7NOo!Ks&f<;1CA={x_28~6JkaI#k`lf1mnHgdMO6VB6+XCOQrPR=7xsEE z+P(oEt*E`^Nn0_yHBxy?>E&0i~Esfdr=DXC%d(_p|-k$Bf=pRp$&c=uC zF{knd=-{GEL;8c%yYvZJFG&Bqhqv>jU!cBI^dqk}HdgnyyN`Y-46}a{&V&DF6zVopSPdS{Leej zd;ED{sKso+yo%}adAFbPdG?+76nA4mBai#$nH53aa%2q?0D6F(k8zh!M~Qxb_Hy6) zbMGJ${ppe_uOa=nfqRTk_O031cx-3BmwQ4&#X-Gf+uDK?eLE(X7Xk-#OfH+dwxDse z_VMw>o`QvMl#DDrTAsgP3 z^PfWhUDhXGh2Bb@chSGrW8OA8Cb!<==-Cg;*XG|(9Cle4KawB0|A2MOCoa!X?n(C$ zu7q-&%<7nYs-R=?LdsUNZH--q!<&(BM0FC>k?VLydi`7eCYv13J zkF(_C&bWQ9wB4J1XPaG&S9?yNomij$ypulKnA2d^GG~?b@))Jrya}D{F`6>-%*N`$ zdWiKuZ-Q(u;|=7K6|9q4-)_L~V0Z`R@D6;vea7IgPBF`wr>21~{|5SRm4o%#N`8O! z8WUZL?YG<#d9m_<+~c3~uDq$q+`c_ofBpQ5I&|1;S(k-aAJnie`=Ncu$i@1o^i8*1 zZoj;RJAk^V|5R(a^D8cYEoZOe@@mYBt>XgrI5)v@>%~CuvRYQ z?l=GTw+poB51}FH*UB1i{08=xv0e_cUM_Xl%W2lIe(HHD@9kz3`He-u@?yX7X5Wji zW8FHCwXCy_EwazJcS6q&V4lLP!?vbZk5=Bw|rI3y5}x= zhkfsG?Ei$Fwa}7xcW)ke|4%BmbY#?f-{+|rna`@Ah`A@tdevm!uKmBC*mS4=U z%){`tZ z?}hauOx5VHn~TTf+@#%=H9?DJa>qtQ-0QVy+s(z-2R^O!32=v4V83>kv|pfAbMBc` zab*!#CUMzeh%1-4a*3;uxO~KAr$Jox#8sIlu0qaj7E(982aeYZq0z+?N9l8^x5C=K z#;w5K)B70lb=2!m7v^uo|KZ~CdKUiQp1`~GtkF*d`r3SflX-n&?Xgej&&%4++^Ip9KFB(THBD!h#y-%)o#3g)P+^L_U_k8!vrU^$P1iV+DEmOh4`U>L z>>Ov^5I=shz&qn-4&!GwW2b>~&7yoW89Ot0Biv_?oeM8}dhoqJxHf}w^H$6{&vtij zEqpZLd0&jzT@%Oa7C!fP;E!$0hEH~d4_?P;ecd;F#^?n8b|0f)n8V)=YJCjhp$h-h zn-?;#=Y8*0yy3hk#2Q)gJ!QW&ZJ=fx3GzNSZ#4-&UiP9x0;Bas%KeA%(xy+iQeVm2 z&vW6;Ee>TFUHH#tuAQ4Rn(^1y2rwppi#<$yom#-C0Ur0~8qRvIN}t7Av_8OERHa)a z>zX_ZzHTXe-7=dW7Ru9Xe%K!Nx0AtZ{#rAO@iPS8M<@PD@F)3wtJul!Eb317(G9FM zMGo+LWB@K7x0`?8&Aa!<@gp->&##9jWUvkuD0f=rvA$|neA^8Alejnc&R`r2)_uJ) zpdBNTEp+qjTVgzWzv9{Z|4yF0^L};@em!psb#Mka)!g*ajfr#9A30}wsrkvdbML=< ze(Gnx?Uy{p;>VYqw@sd-KDsge9QFRy-(&10@?8GBI0L>*CcK&~#%O>smkoc*yZyqt z?4Nx|-TaCEE#;R!?((SvoT1;duK!tR=Zcl=r&fl%`&NcL7;WE5X#JVo4ET3d`aCNO z8ah;;R+njX-kW8f`g*3h9)8x7@I%7%@2SX^Ea1s8@Z}?Zqa<&xX<0*!PH0t_zTcsF zj5iz&^ON$oluQ9pXA=*(rjJ|)R zetaEw;W2;b(&sBM!XLAcg&apFBJL(`dE{5-s7CmsokO*#<_{S5-fR8tRlT5k>5E@^;MPq4oHdvb=4s4n zuV?!^OY|vh+-EdFLkBeUj zt`Xc!cnx1MT9Tlz%jy8oEeHB{T~`Tc)Pva&q;y1r(e z>-sKp-nySoI==2FlaBkc_er>R@+e_r_oFJjwQj>CHx94Fv2Np}(7Jmk+41~ZJ6E%A zz5QNkz{C8{o2Aw||Go>gS=AEfaoS1Fm3wIipPQd|FMc<%@C8nO%Zf^$k$v~p>uGy< zJ+1U#;T=RuO7)xeRp@Whx6bV|^$#Ar!HnSV(SNGY{}*=YJAUZ+9{3=e;DfmQ2I=p! zX`4M>>n_y;Jwi= z`?!3-4+&qh`5v=`c|C;uE5vw^eJaWmda!|UUbAVS@NcE9pYUeC`y~Br2KCWKeU#Ys zQKJ88s1@DYM@w|4yzh{%cyr#>g4+DGU%kg{hBjodKc2cH+m@@giA;>}9i@ZyCFE@?_+2@J_4WPz zhPX$Ni9bjGM1P=Yr=8z&eK__yWK4C117d!*az9Qp{Ix}_#j{v@FBUqB+@~D-RO~Vb zhw}V}(2j%LMQKsK8Qh~>!#&o&WL>&9$EyBTK6jn52bBc zKd_FFF+Xc|#g>KaKU^8ytl5=YntEGi341Ti??WaP)cX;4{p@jDIMrr$eiwR4xf-EY zr^^PI?+hq5Ke+k|^K7lJ`rLG1^@ZJ@yE;$8XM(mKhqmU_vKPV3!K}c@IJ72fW8b1~ zH*tRr_hsE$6Vm4Yz#CZ71+PuoWmvC%TdWMrtR!!xoB-Q$h#H|^c&6Drta_E7rx{WeS@XV-^Tcuj@ghsT%Rhuc`t9wsd1#) z?GV(5)Ayw>X2ahM;^rX@>5tN%&|xW(d{xpJZZ5XA^f3xpYXz5^E?zqODry0k{(-z7)jyjHL`No>S zaJ|u=Z?EItd~mvX;%n2)r|3KD=sO|i>86SjePO=WZ0GkHeuvS$=!B*nhh}NA4nQ`y zhrakM{V<#TTU#8jim_6(mpYw=%r;D0pO__KO7#=ah!W|ajC~Gj8Z&!kZ>hYb&Q`S?C%$`zkio8){2`(8AnYl)8{dU zL(FX%f!@Y#*o&~Q#a_rBvy?J>xmTn;Sf%emhF+D6d#z?XPTru?qax7QZ0_`dUwxf{ zOk>=E`vywJp^?+rD{R07F^!lLU#lhF3VkJWf_K6sy==nOx*r-g4;kkn z?7OjNAsgF1h&hA3P~bD8^ug?#7+>?KM_Yd5Wq$QxGB7gN${kDa->wW`dSO2NkLl*0 z{?|0~+{vltpNCuAVNCl3xo?X2u4f;=9==BNv~v9r<8(LXqZ_B2XBSK}|Gaprxs|y| z_zTbK+8C>}N`FB79v-bf_i5zTwUmWCzC|7nQ{TIa1MF!`eOg|?5Prc2^xfXbp-Z8& zec1QZviDmE&#!4vFX-%9^PP|HQnK)h_0?&3gIth!An=eLgUIL$X z7vr)qM7-1Rhn~VhSyv%PM^=EnOb@d+Mvf2-kJq9bsNa>uJ(vEbm6qz|g$@ll%vgV$ z^1aQx{+jTk&^sCZsK?j{ycOuS@0-kh@$D;Zn~9M+m3Ga-NL&B$$J5OZe=&`=oob$? zU9TbC3hK^n*Nt|&4$(h)x86JqAL~PC`)=Sl=)!E$kT?%Rb6+hUgRa>~{TOn|X}QRw z2KG0G0`JxP85Pi)8SsVT+kPKmGw3(F2q(OtLfZGb+`;<5Y5i$~!TJ^b`x#TOF4L>7 zF4wEr-|T|-m7Ld?sf$z8MLBch%0kWf3w@>O>MD4`BlKHwD}zTcME4kruO3W&mFuTk zHRJ7OkI|bv-#Q$=lcZ1HrLU|^(N|j1^pyk9hvOT$Zz!i!@3>Dh8lll0feCu2*Jm8h z8KNIxoh~~@+*%w0V-aXz+o6r6c-u?{sl=bW_r?bbL z#@ilK;h`q;_kU#b_oe;UQ|^1Idp~u*gEsTCrdi)7(-;c8SI;m~jn{oAF3k5*XCcD* z2-n2Cps^1NYng_;-O=dJh|!-M);;bTLgtkjtRaMU&14NBv`lE*Pyc#hz#mu#{0#FZ zYk^l-3$(-QXrX`YeX7~cJZbOcG_P@dw-r6WeEK9hbz#PIBV#(8S!14}ub0v%4x;BH_;#6V z8QWpTc4Pi@be5nag&sq6oSw|{pr?d8JtNn_Yw$mH!^R$c#)aN{`!A~h5e=@g~rdZ{}KCbIivI&e_Ch+%7Xfl&s?Ri zM_%2`e-E7KZZu9r_l_~8`4RQz zl<76Vrx+u(q$7G(q64ouQ~oRGL9?$PSk3%0QWu{40|Cs;Oyj%22j^rN$@yN! z+ZP836DqEbjf3^{|K`F><0)WEAS+g9N1S%1spX4IabWk~b`N^fDeeOjclq+XsqxRT zK$7nbpeIH6O<4}UIZgcU!C;cF6*wS8`1!pZe3 z{!0$%k$?Yi2f?_LuLpiT;i&@i7z-r|XTDUy#LB%A`yF_5pv2afH}|sxgAka5fL!^q zwAg_+7Xrzm`5sInB5&w&;N<;4if%>}e1Sj`eyM_T|BTq>eiuov-GMjDJuWnv*+spe zUvJ;DBI#|y0=!x7TcJtJV?>S~jJXvk{?6b?S2A}{7;&!$+Tn>z>~%n~pQ67AoB*Us z%*XQ`*wstZNYb2-XGw3a18+V=zmxD0poANw;Bzd7CI0~h&(pspoSdJPe9F07u^(~Z z&CdfR->=aK;(pYDH@^TB_YN|{|IBs;BMOEUv=j^~s43VIz#%mdV-`TA5S&=}%`&#j_V!v~2$L$=qXPn>n z$fU<7wNLW-x~_ij>N8jSefzI_>AH^VG;Ipy%O@l5HXzdtg%n%XT1HRB)s6_ z@da4o?M71gt|a_llI%h+;={|qC^^M7ch!nJ?K9K!S2ZrbZPAKV%NB4pZ24;SbZG6; zww2enEMA6-eNs~Fb5|_AYcYrFBnowwEQM2T^hY2$6TwJo~KIjSfw99C;+S-yC6 zE72w#U`(*2$%iUb%6#<1sa%s#Ph4^dYwfy89dR-$F5YC6N=TB7p;T45hYcl->suRF zwsbqh*WBXU8&}z<`eOBAABg1K-%`%Ujkf=~51G=ZZ;M>M~@pl`YIg9 zRgJ=Vbd}&nRaK22I~F*m%C-mXb8f3!7c9DcIZxHnof021O+N3&T&3A_T96-nGL3fG zzf%9HXMD)FNp*VHF3S%w3eCHqt6T0|Ek2zu`Q1_1eZ7iD;&a2=xD@BzmaXJf+y%EU zzoTt=^MVBpLTX~4o1YHlQV5OXzxEn`m|EmZh<-E<%tLDIcArlZPvS0_5EhtLi#{tgqLx-jBfN6duG* z;upDlZE-n%9ND^MQ3i~i&;LzfX{PAqrXAmI<&GtxkBF0UmpcdL>wyp3&dje4?17i{ ziG1n82UP!0hp$t3%Z{aI`t7*mB{QO6SV2p{pn?F~-x6T_`U0M$y*_Zqk0dAatDEjL zWe3Q^kV0RUxTqDUzdd8bL}o2 z71|}=C#9pWNkBe{Pded#2o_6op<@vN?sutk!)`o56<|O4?9r*+$bgqRH+)9rt5cQp zb>fqZk_V;6Mv`6{(afU zcYDy=(6)=7LpDbER79{NyGn}&c&}FO+CN=((B`#$eD@E~%ha~Jel-6y-VHfm-yLN z`}{rfm}c>N2ETJg_{~6h zhWP{T$q#s*_}o3fN?>4TPNn7#nFo7Kjmd%!_NuYv*}~gyfVV9?y=Cwy^Ipj1oE!3< zIKQDdzjKt|75L46DbKXBt&b02v|~@^dx{;Xb!48e$*wV9?pPy}W4_t)aDk~+R_bet=|lLFejY^LyKrrxx#Q=6Xz2~6s>^;0C{PEq+`=*I{@Xq_DK7XC*)ux)P={R4nZTI)H_MIB=gMESd&Rz3C zc(s)kymQ?zuqFGZi2ZIBlj{6oxXtL7y@mB4Z$(M^;9i49O zEF6NIjI#jweGNbTTKLZXZ1g?0agH`yi7(J(bACV5Yj_D$ zLYtKmMng9wNSF)jG)I@uC%Um2jE_uoNVCw54J`ZU#%$yZIgF89-Zt{a#)v0K_?PN9 zOY1XpN4WYk=-Xsi`#SIS#OlhTUN-YK-8ky1^>f|zCvM|$`>EH8GBp%^__DU$#miZ- zkFe*{eoumLe+qqvd;Mm|Gr%jg=z*MC^XWdd>HF{(t*E!6yAKOJwdfDX*5*5XcaL1N zS>*O>7mq@@!tdvehM~I1)+5Lan(v>1Ocz-@W3h~L`7QUMS3@28Xa}3``)Iu_kN0mX zx8?dxM@1I|c{1m)7EaT+uVJwM4t@RoC%p#xInma^UgN3!TC@4#S>|H;!fyJ&j6r_J z;b47fz;7J1aSbutEQMQU<3i@n{vq@oxOahgo4He97iY59lAot5kR?4l+jM`++ZU2= zA2Jp{WAJwawCEwun7ln;swsZoWW2pe9P2S}W>@NOqhs-A1$r&mC5}ewFrV=izJL0% zM$QR&IFr+Su=aceni4+fv(I0ZZfjrQEsQL9nK3Im4Zo!hPoaM;wB!_LdpbCec>uko z@Ww1?9CgAO7||;@`Kem-)RsDP;U;9L+dRg4>c>xgmiP7;b(1-3Fn~8`(TRWiN_0vF zd5qoQHR>ts@fc4bQ+Ya*yETy8p#L5{UWQCOh>kpN9k_jb_bmGCOk`p+n2+n}%hT!8 z)6j>W%K2kQA3FWSpUA7P5|1hF^|#$Y4RRuq z&-Rxte3indOTR(kCrK@JAHfsbE+^sZYVnnpI#2;rRdG&Zo}uevoxGi|dhd7)5-i$VB{pP|7F# zVs{_#n6yHF$`AB7V z`>mz?yW{L%T|55d`wB+VbHDpl_!pD|^QnVZeum>N{@s2j?IU)#ABi`yyZ!F3*u~BL zgg+f`&rGt*)-`rlU-y+~HnVWW(k~`mVyW)vOZ3-mTfi-2HOm*@zO-@GwTl+r*0Nfn zi9^GKy%?I%4Q*1q3t)haGFgQqwRKHQ2`Jrl28k?e!Z$Ci(_Z`+G)(vyM_ z@$AMsyRVQ-EKUN7;&o%YL&O;CA#Nt)&e7HGU2^taX300tb;lsJN&K-(-QqBkQXD2B zVaI<;rY)V~a`_CSCybBdGjO@)CHM?N-dd%@1u=Y=Fk|*Z16ev+sBJ-hlvTli61fV_#j#zFOX@4Ddc=&ZwHU z`Y#XXZQjYN7{4MPDM{Wpm|pbDS8XH_}jWpDN@ zdj6Y#xO>%L>@BjMW?e7(LemH<_k4+7i+^jbnThU-k8=7c<6y$=VxPN_a%6%ZDt>T_ zaQ>`h6X(__)06D&L&YU}1?8w2B zUC%QZ!v8QV|5>9!o$)NUq8|2c73^EHTO%(9*t>e!7y5eFni-GGHt!|wS6Oo}=AIPi zKBmEjpZ4UwxsNlgy7R9TMhe2)HZJHad}cv}y;2a~e+GL_2ticRy40CNo7WPTei7-j zFEk@L`JCsI`(;8E z-1$%;d=Yf~G0hLpG-W@e(T-0MU(>Z+zrJ-SpBRJm}33ETH(`$-*$=c`!5mx*d@ZB zzeMfrk{_sbECGu!55ml=Z3jk4XINAHoV+3I-JvB>yuz@h`AL!FB~B3WgQ56bvc| zu)}?Y!14QoJH<{Nxbycy?6N*~>-_@Z#O~H}y~4Zg_EUv-`vGcCwtu%@J)rD%|K+#4 z{&)MuUWIr28PVI}-G2Lz$_}u<7XC_p+;$bly`4YRPFE|t+phibD{;EtANUb(cUG_N zCFrt*ynf}Xw&jcKTUM?9$0Q`n#w29iPQZ;q!r0ercVA^JPO+UpyuWTQlJNY-Rg2v% zfa_}kX{L0KWwfqw*-G*|k2}p*q|0xzpMt2Q9oMyf4`t7;ij$tIu|Srji}YljeL4CO<0rV@!#OmVbEkXKT3g!u@0II4ZwuYJ<$A8&U2m&y_lf0tTSeiE zuZvD7q~{Ts5h8=VT)CbbPf)`0t%eBoAZ`xI{(C98-t#J7u2Ag};*+wqLU@Hn@g+o` zZv8$Ij|9~!V9E%TKoWie_MkwN18*YY`1QO@T4KbX%tP|~a=*kkzCC*z)mlE#9;!Ax zeV2q;d-QGhRvVVc44n7VWo_fi_gw!P{?p0bTt9&{vMd*`#mTag*W|9B!2Hx}au<(g zbxi)3wro4&%C?iTm22lNS~mQDXS(@xWvpq-w zUDm{WX?wMo!oQ$j?vOM7a(2OuGxDRUQBNJ^Wvv=t|7r8Uek0YM&W%sIDP10%`vpq; z){BylaOSj_jImD14a4j$){vit$p1uc(DZP<*~H$ZWe)3Y8WM`{vw>Capf1Sg#|{KeQ2klMep+z7=bTw z_BJB^rzf<-G9f9*<(zb{v!n!}iod%7_ z>ZI)&7gD##XTuK@XSJ!&f zk!_qnt`cI;a}t?PlkA(>yPe={jL5iZG}2s5PAk;R8N)4cFeE!s5Cing-dni(yM+Cj^dH%``=wm$yBo=i^tm4Coxd>dp1=B@y=RDa?gVEp(#md^cFP`P zvfGsxk=-g>qU?5#ExY|avfJ(4w{b6f<7YSzK6FN{+4r?;%^Q&4KE(Y@AI|TK{C2E9 zU+-&-zd2+Uw}i}JO`M?rX=1freCj&$SHt){tXkjCnW}Gama+fv@%mN6uL3vMtjZO+ za4~Y>YJF#6u`zhqc>OSUJ^zgU(3^8N->&l;)Acb%7H7+L>wcq8L%lhVd!YK>G{c7T zID>eY{d1EH-Mj+~kE;HAhTOY#a0q(i{+>D?#o4Do9p{a}od$MfhRpBG2|*)9 z!+RQ|ulnhArdGl4iZOa0?(iE^&7J$4`)cH@*Q%e+HJfRJn+y9ehR5i)1o{}Ifnoa2 zT+P1k|7Znwjj+FeDz{W$n4M#stgAAf=Dew|SB}y8lrxqV^}pVx8@nf7qo0{Lh4ve! z@2=%8>1p%L#e@1A(;qK33h8%;>60S6T^!=xaqOaB@QRgTyoKAMkQRN0vz601Pd*nK z)PniSUowq*E@T<6A1^d+xG~eXaY2^x(PuM^*1e(XfL|NCi}cD|#<=Dr4dm(t3MSmEIm4rC0rQFmR~;Wo*@sp+Srywaz=Qtz6W~q6V?M8^R1}dxh*`rEZP$mZ_!imweEd1WIoSWyjO>p zhMS9*Gq1PKw4zd$KTwu=+)cG>mQ$8_l%<8T?4peiQ;xZeg}3=VlyP-wcWMKd+-HDK)J4k3;q)Zq~QHq4^G^fne>=wrM_9bR{1Z)4tqKE@wE+t;}L7AyKa z#@7+f#O)*B>&f>o=?9|2!ur2Rp!CPJz|#iv!^6-L#>blbLgvX_E85KX%fPIop4w^8giWihtXw`?u>fo91f#ws@mM zCLEpL1LA^g2JQq5FYMnBSj7hv8EERp;I`ZEsaw$XrF=9>W}PJ!dI% zp;Z=iEvyw9SCY>l{PZ*6<-GN4mS$|OsL~Hm*PYP9=WP5m?(H9~^9Hp|BX7YyP;8y^ zOt8*{X|Lm$Qp`F`$I-3xI`Z1lpPBNjO^oAB^ry(i1{1kyG;c(}=rt+F7zuoz`zkvN ztmu^*v~Hkvu5qGuE<*SxF$XaxG2t&hJTKheiA((0e0A>6d3U#FR?RrA~gm+gP)ZPbq(VUKhsUgW%R+I*rJ@kMB;; zv!&X9#W+dxMW!SpCg9*nvE>za`D8!L*JDdO-*MN{@pZqX@ae)oa*6OAmk9rc!l%o> z=uya*E`3-2pAPTpt)#=Zs`%}CNWs^BN#WDw?}JO^uh8q{KVAJ!Q22EDo3HQ|(U4S+ z_SvQriJQzOZ+p);su)?ndlZvnX8u~Nx*?jY0itxe!WMlB1NX8Z3X z9iqtWP_SLWh=O4SEd_%LY6^A|*bc8?yMhq~!wOmo1{Ks4>?9xj%{l< z6}vl*n^k-rD#B6~-2VdGOXs4>?$Q+2K@_AMKF5McY{JV5OQ~8m4 zl27`j7dfaEi-It*M>>;IoN=4oFisWNr*eCEu+zGj2dC!J`=Ish zIIdsW(vm6(DU#&Z!Cy?DETx>QI`ui=tHz8~-orVo)PvJ0#9S%mT*X35f(```y|PUS z1Ke?U|DIKHE|(s~$5N%qQ{{5}*9s zhP+GaoG&5DOUcb{;_#cSIVDgrCW3t^@C+7svI%lCQT-Dm=?GIffVtc+QO4ofyT+B9 zh2vx|VPr28Qp;Xk{~G?&$zEJPf%?>P4;Qc1cgsDJWhbtmK*J^CK(DDgA5ml!ob|ig z%iZW2cf$9S;kfY%&VyW~lY1zs!yWa=jM^}bIo)m+d+Q*2K4I>wE8*Nz4QHIhZ{z12 zUcPe0hcv zwUwBQoQX{EkKB$69Bf(J0d+1?>&UwFdB_xF)ETdi-0E`ALxwj}2b@t%DPOw}`5OFc zSH4yw^0oVsuRVZ#4SAo)*D7rJTH;u@yQ^!YRP8OeR08j*NLvOR0^zJRJTOUbq5JY*~HH_08dLFIN8 zZkug#gJo%khUt{yV z<;-ma-f+`IXbJOMBm80uzHlRMjT5!#H~*p;U%o>#S{EV5;!ZkrlkW}4c7p-@pi{7B6SRptx}W0guACzda<_K)8pbdBv9Wk>L8m#-iC5#! zX36`-%4W~E8)*;9?gTdbe?jK6Zexfyz<5I!SqAIlBGPFrNT8E5&5i-3HZU?EOr#Pp5 zu%gtK`_zft2ie{_WNT|*_8Cov&sen3ioQx6iu^;?2@&%27WFFhhV^)nz)aG4hntvBCVu7{E5N&9^hIp&wYMw_pl zjh^)!^H9F^@rJYQBXlULn`v7hq$-0>{xsLp&aYu zH!(YTi>~Qdd4BW3>F1k)8}1L88@6pISg-0xWK)v9=;99vwCBIN?SB+x0$=!g`AmPj~2kE{8;2arwYGOz?s93 zkK3{!=WU;lZfxL=*IBIbcoXYo_gx>+uSqI=F#a)KOuS4ag1oVVHE__=%aC)(2RLv1TXbaBWc0Gv!oA3sjL{PAv(_*( z&|g`K9*Zj*a^o!}-gQZFx87e<&D(clBh1z9ygd>>zJ-4LE$it`i}pBoDKVa18ey-$ zMGvK;RPXd@AG6om7Sgosolo4CWiaf4eJIh={KC_`i zLF!S;Jc9D}!iaydSMvM)T=a~9QvOgSccE6Awk*oRkJN9xTr0$SqN#EuVUU|5uX6o} zOiR+1dWo-FCr-{VP``=(DFgmbAb)-H!5Y(I{Ga3;c9=J0j-w}3K|70HQadyvgj;8s zl!Ln;$fLv~ZR4}^_UJs)wq<}WPRi!NgfLBM{B+`e{8P}n6n?sfaz=&vuB4BOnZg~& zCD7cD@1Dv0o8p`|cNK`Pk(3*g=8H@bL~!uPQHz4jE$-f5+=Tz?5w1hhC+_kgTad2@ z-ep0^UYrPe;9b6Oy6}%kIKFh@J8W$F^xshULqJc8^xG+veCf*fy27W+pUbCChj;nV z>F^`GPWpB|rO01I;nU@Bzrv@B|Cqw3tH1M?2w&`T@@D~3wZG^f%a<AHULY3 zuaU0AchrG5KOb=1UuV%G_z6G{;m0~~vY&E@T^L!w$)_lZ_}fap%YjQ3oTT6g;9%SX z%HBn0#NQzWMV=ydkpl`Gq@ZM4>~cO{;0p>`z*6iLz%ro7a|BAgi@y)3LrL$b)Ftpa z1ve?!s$iXh(jUa1Fae1ovy*fMb|~1cU_`;Nf|i0o1vLdb32cW~uwB83f?)+M1%nD| z3U-noer9$k*sfqi!LWjsf<&BpYE+hXUA9VS*gUN)*2VMT_BjP^}|A5%z@Y4SIe&mIUzgk0nL>}h$ z>wh7v*xhmXTYih(9d{d*|D(hs-y0agw`1fRq5MaPN4}`CJ2p*wOvNwZf{L!UDD^>g*5*c3!M*M%twvoQFyL9)rDt(uZ_fqk@bkkIJcOJ`8 z@w;?6ONDpo+#KcKrK>ZPe|Mh3YUjtM=lou&>@J=8jIz6Q=^SBrl7 z&mzGt_Xfw~*ZqIYy$gI))wTG4&P*ON2@paO2mzA`QOE>Gc}p}YXA)4}@`&|OH3<(* zNO)sQipm5~gQ2~oVynhmgW@frraxP~x0zn}HK1*=wGYH=ZELUL(KZ2Xv7lxY%Ky90 z*(aHqBw+35|M~yVXU?p%-+QmU_S$Q|){gRjEXw?cDF3nmwn(jqnCF!GSe}e@XMLuR z)yW7y5^495u3j$YsjgnOYH6~UeT0Q9jYcj^_HvF~myC3_7Nyj(BuZ#2S1nz={vOo$ zuCvaIMf&bprmQZ#20y(~WyNQ%R`qu5_heaQD&6S3{8DAO+FV=VaAagwhU~S=^{dvf zg0lfN6A`PJ5kYzuF(a(Q*B<-xA`5kD?eS7xWG%19{hwPZjm#4XqQ;}zR$~$2s8%<_ zQPizjm~h<-o)Ll2n;E^{8SNgu+!^iOYqc}dL$AfoNM}J|lmkL-xG^}a-GwTXQqVZY0tIdvrN7JFSjmfjIqMBNx^t>z1F(qZBsPu z3zn5+xBI!=y5vkc8tD@xP&#ib<}b^)!M7`NU2+Ka^2%AD>2`x^FdnO^?3#WjUKAcPo?Nt}gSORx0Ln(=2Oy@_pPnY~Km) zu{_EBk>c+|{JG}%^Xr&Pv;By@y%xCFVFa0%NNzsmuUYYhvTx)SE_lh%UHdLE1&a0+Q(9>gsoQ={~esZq^J11^2`02TyIpmDl_X+v`nEY2TS2Bw?k2jImp3Bk7 zk{j%NeffBDL**BWLbi`N|JGsLgl zot{^l)#~CNvfOO$OOrd-b>@Y2o!7zZBm zWAD>~w8>QQBlbhXzCHej3yepMmZE?2x8(RAEg0qBUXbmtEAaRq!M+IlV(h<;{nxPH zfqi`e#$1b^cNDLa_n33IN!yN_jiA%XdBOM_eU7A?SX0QL4Gf3& zhnemg<*3Ur;~n1wEy=xgKL=i5+6(>B zt<$0RV(zUfVqVkFd9k0F>(@?eKS3(GDY@I-(!1-|4Cc+z$H?6C4Cc6>XMSoM_fLWs z^mG~_^pYGf?>^e_opo{S2Nzu~;z#cLY$lI6#3^g7qVJM?a1KN67(&MfcX-Nq361ki z$DEqakoiyM-;O)A29=Lpb~u?+TB`D9#Bi@4cP|;_rJOuvGgk=z?#_=MmLFM@6P>iC zALb-0$xpG0N8=t=iT9Ix{~KKBw0#F{AD*=d-Ly`<;Um@V?RGv{GlID;3-@gb_m2)T zf>pHlO7NdIPz!FyENgF4H+j^JxUHZq&7^KRs5iNz%a2=U24<^{7ItK6!CL5JT8tI0 z3_6kea#5Fcv$f#ILyX|XIBk3zbo7KPu;@uWut;c8>h(ChMEsiW(00dzdP=858?qv^ zD5QI*Hs;0#8;7Nl?<>i-o>o=Hy{zb+F~2pw|IXRHvL(q4#}sch({#`tiTlE)>ENRn zycB^SKeY0by`+^IzQ@5e)51qPWfI=r&YjxFxL486e+BsuUuXa5)&s=Zv&TdDzkNA z!+##_H-SFE3mu7$AiGZx_h$J1Fzi00uIk{U9dST-V@CpXb-iKoppNUcn#V_BrVkce z9bRHIcZ|?NZAJd`?OED|!-xD`9mO$Shes3cW-WNJRL{S-ICkS7ptr;D&JMRW>C2mq z$3BHt%f6DiSmJ0;&_Xqd+S(TSwG7%%MZC6fM6uT3`a?w*>z$!HD(dV_t z2MRw=TweFk`rLzA^!r+BO_H`S6ot3V^goHE%{V zX-&`38r~YBHB563J-r(oHN|Pk75nDYbV37KVcAO_WS=P4ME$-#4r_bj8^Z(>d*TY-xZl!+?9^QiNM8A2O zu)_pbA3k{Wu%oogRr$kKk*%_kk1XET!v{VF2U*Txrw_u@BzznG_4_QEeb{n_d7y+rz2wb8vV#$3On zkG9h`;WqS)?U=`Y1WT8k-G^&!tmAL!32XP?az0%{w_JEw#w@9>GxQJdDP3@!Y0sv= zm;F^jKZ)>KH+6w*y)gUs73Z`3+S)B zsF;}f34@&ta#!%&TK&kj?Z(`>x_;zgfwkI^oxnx0ufDLjEM`?vM(z9!WwEP@@2H*s zjk35^|5G-2)zBr5RX;3?U)5EXyefZ*bJb&SzBK=hH-9ic?XCZu|HU`|YyO@$U!MP` zH-9*P^jod-?|m~kf7?4(u6q8Rt5*H=ozbiQ^3Ir5%YHR+{)}HunExNYnmqq!znU_C zTi5PYJ7Y%P-4K&{_cy55=P|#8`DM)iDQoYT-@^P`%x`1<3+52!PcVOqSDPgt|CYJWl#P>nIw;}T`9qi1qX}-*ZydZmS zqT-7Pk6u8p(7Tek9mu#Y?a@UQU6$^D*%u^jL2xvOF<{KDJALjZM}y#S^uK?__ZxJ8 zf54gU3BTOz8;>r61vd`PGPq~Eh;!mUC0~CbUw`2&_fOHQP{zISOJ5&t-r+9wq{CCC zjfq}%sl)8BGCOz9>nY{qqfU4mN0PVx;*~SD?@x5lKRJ=rV%QhlGbWz}zVmn! zdC!_OK%dRtE8$BWj3qV32inxJ=n3E~DZF45cZz3o9=U8Ax;7YRXfb|YZ+qRh`5#*I zW``EqOuwB=TtXMzi&!G#{%RvTvp@RCh929IZ93FAi>>6T(ROTukFawf?<7RoNna{* zeK!2wj&GEbi{uX7QRpL)vMlk!GbxY8{qP2R36?l?Us;^!g|OUhH}1gY?vvhUU%{<) z@4zb#aNKj}K=}TZ=(!HTvmWrb9NVh5=m7($wYV05@5SI-v+&Why+zt6{q_L% zp122V4af%#v$=!V^U&t*dU23{yIum6qo{V84_a$DU5u_$WCf8Ivh>8$RnQ)DSg8`1 z7BkBi9qzc(-Dkbk(FQ(ieI@r%4+E5)%wI&;B}=^#btLt6$@*b0k=%3KPaT=}6!*2C z;-cD15j|!)%eeF$^HCo%M)}AblQ_)r)}i@E@D+yD_DMyTZRS|4 zXM7|)tKU7yiq9~2+HPtmi;esmqJ-wjBm-HSl=@aZS9@` z^l9+9Y~C%nm&L{T0{B_th^HMy?x%IrzNgW?>nIcLaOZ61%j%gAnp;^pwaPu9zD&=0 zOJoO;W7_HSv#oZRnw71EtZ|sk%V{m9j3EAyS;U`T`7>oY_?vB(xb!oYtRntI&eUk< z(zn@u!pGI&^Q1jv;*@$9V`4ql=pIu`Jdxod$E`hKQ_Zj`zQ}V2kzspe{hn}En#|6y zC%H!t+h-2o!`un)=)EZ-KBRl#@_ z+BD^cChAlAKph?=bQWIkf~(JJ$J`KeR*^Jw(J6cW9OzYY(l5o(FU8U?#W81qUM+ZP zHRX_fe%J6O@ya;J?4Oh#vL2kK)~8agT2(G7zu;juuj|Zr7BNN-wo}%FlvVnvB6z;P zyZ_RC0nV}*?B}aR??(Byfm!YG4vPoUZ%O}E2R@|lLf3eS%tiFa2W!DkdroA(6>TT| zR=AzrZ-v_l|C4^JmbPriXZKqbON@LM`;g1v-{lE1kLbxP9*Ax&H#()FuidcKiqG`%SnZw%;?eygy z+$(xcW4;-Ece|Olimqo@nw(jRtozSQ@5Fm4dXLVV>&{#A_cDJKonCZ)UBmx{JPrSU zDNk4Y3wgRCGEbiwzXzvx>9_RoKjFW<`$y|6fUFbQ^LK5~!1jNX9TmKuVt#RUZCbrv z{%C#f-dWyK<{>n_6%y~bDKT= zsqmNn=aPHQC)oM`KPG>V(_g2HtQl|3?>@==?o(m&yLLM=-N~P8v!3F1+Vi{l%t~kRM&_Mm9(oGxRn{n^U2j3A2p~^vG3AML zer+CoO#iaYIT>U2>cdq(;{R!Z?*CaqAdd0SLk4s3!V^A!Tmc8;*!zfQ z$iEWLFUZsD1rGl&3u+UbExP|#1+}9Bg_2K)|8RlR|60M8L3)eB|MP+^4%U__gXF*e zd`Gp7i2gJcKDxcWf;EZC1lEwN89N(sUDF0@LE&9?obUkVRr|wBWc=-Y#9!uUD-<~| zcY_x67!McZ5_j&ukOp#Mm`q@mLDG=8Xa0+Ed)U{|L)$9uhmDpcUuWIiVBOqc-P~Z^ z+<2s*?BOEpSvNOWH#b-}H&{0}>I>|=RQ%I<>A#)0XU`{`m zwI;bk(VK77cncRCm3Mk?2JHb z)gLz=omn|{zszyfvJPSQ<@QDbJXwEWMaV%a7iM(U;QAt_s2qx@*5FH<@zPki}o!cmAR&TQ#$8KJ2RN8#_h^n9CYo6_B<1JlYN4e&Xx= zJ9|q05kIAwbtu`Vb1F~fs}kx@#T%jeq`;y#^SD<>H-fWe4@jrK=23?hY)sH<>IP{w zx!6N%$zJU1Sf_2w&}z14YBkn8jU|I=#;XOo@k)WiI8?CZVXY-FC{U;w^f3m!+tXI) zG=5UB<`6ft6!s!`qg5&XO(+=!rQey$1ZcSGAADHc5!Pg zYv##}cZYBuT0ciHP<>f@F= zlkt$3SH`|FR_!31Ek{nI9y=JHHsx67ZL={;nD(s)3yy7VD`?vC5bMl`3XX4mh3|(8 zp55|Dft*+BSgnP2Z`sE8NZ+Yzujsx{R@0fMoE9iN>x{|2$Xd0;E%U6$NRx5x8}^=) z_IST+*EaV6$(;U$O}9|y64p-_GX`D67<3_Prm@yJr?|vHnFze`Zp}4da4J(t0|#ra zVHsX+U}nxuT5Lj6Dt`l#wK#X;AT1#&CEc>49O|*oLfIzf$>fo3dl8Sa*IvXH8fK?` z9NzUHxhq0HZzxaQn+;>^tdd0s?+4L8_TDdQ2dw=0yxJ-Ct8uRHd zyrJCt!|(mdUFf^7`ge`6;-3V5`f8sABQ19W&}aQB_x|$t@@2xGyG;12uefyj)yloU z^!HpQ{K?CNA1Nnr!V~Myo~$n%6)D>;n9|CJ~R7qFH`Po`f>k_axd%0 zeVhje9+Uq2XurEWrn5!geYl@d?m}OEmH+;1D|~k_^X{`2N#+?#T&@OMi1 zKJs^7xo^V}RP^FcfvYYZ{vG8m{fD!U{^js!Ot1YW7&&TK1uHIVk}a{bE&C^c5-t_E5_q0_kE(%h0#^XrfK|XIAYJv` zr!810_al{I?*U4=UZl3uw*d!|ul*J*ECAjv;efXSM*`Wv>5Bp00(_7DegOX2FCnn-P2hbL z`8O84s|hIh4*&)4=NW{r1$F@8F}~MKyZU9R9cLF7SL%9zIF2vjsYvub@pyd00ptO?(KyiPO%A|?;>VSgpZ5F(% zLfMxnn5!UXa!h}W^90@{=W``|6HxH83@CIm9Y_%0iw;x1nEQeS3wMG9KIiVRV4=tt zQeHuhl($Z^;t2qyd=)^Pe8g$u!2k*##sQZBNkc0G3jXjH7f`TFK|?{0f|`Qu;79zo zDcGc7K*2Hv4Fx?4Y6`Z4KQp|7O$xGi#k4O|&`{8$pr&9u88^c#*rZ@U!7>F61w9IC z3bun^GrWR=e=!FXEK|@>(4(NHU^|syhF7pj!GMBg3K|M}6x0-KC$Je_!6pR*3YIBo zDCkj8Q?Q+S<1?;J!6pR*3YIBoDCkiTV1|o#>~QXM#yeh!eKD4k?D1Xk=i_6X+uU{T z9qxF?xwNjdct_XJ^F#R`cAgXOuU>KZiWp}{=6jiEGUFX5vpcfUm3`F{SH(DgGv>`P zZ;y$0bc}hA|NY)JZ@lB_Yn!fhI-j1`G;a@$Q=Z#sui@w84^j_eZnd1{aE5sv-aZGo zK$$O$wmiHI-c0}SPkClX`F~oO9b+u_dS#AR<}J!RK$&ZlIa!(4DDzNdzFV0`DD(G} z*`v(QEAv&#e6KR+DKl-_%&$ETctOmRVVrUo{w3%A4P}0kZ#fTd%WVsl*_P8{@h|T7 zxOyeuVz$S*PZGD7?Q!uI+KHI$c?f9_Vz$TiPbhbL9^)=$w&x{oQf7M|V!bkx4f9#c zzr<&cgQu$a?RkMT<=>uXXjbm_yal}93~$d8;G0^d;K z?Q!%~Dm{B#KUtaWas2;P@!8{|-O6l_Q#kKqrH6ba&%4Tezf>g8P=#N6+;xGxNPg^b z(9O!-9#>7Y>qCYA-+0TvEf>eB@b)5ds#X5&aq|I{AA1~jM49bzSBxr;J~Ys2?8N{5$d~f`L&ay0%fF}cYtJM6 zLz&NbOz&EyGTZY6%_{v}%Kh6azxF)K9m?IF7r7UAthyi0=|q@E;TY~-gwJrZe21I! zqRhi-XyNYc0gW(U8|D5=l>6VJ@)NCJ;&7Dv2h?|XdZ#gjn=8P7xLGFt!_C8@{QINa zS4YMFc9i*vD06L8df8F&O^h->6otP}p`Y;l-5M3&=&1BsqWlkx^8YsU5+2{ysPg_e zDtu;Cc=qf@ghy{+gn3Pr|GKF1t&FPQ{HXXuk44eC)#b|;RFtn@UOIg_iZ52zELgXC zV~wTaV!f!rSEewJ^HzU(d0+O$>z0>q=y6f;Ef$Rg-QF!fk#_USt9m?$!E~Npxqd_W zs--nk^yIk)UkxX_nf@#<9@%9m~^E?-l=G}^!17a)-m z)c*9ZTUTCFdegeqU+GD0QF%>qISSajlgEE?_3HH?aKUP{aP&Bogj*G_Ub*JJ4OZ!9 zY}~Ni@~9$Py!_sk%ErvTBoJ+9>T8MeXWk&um)*+Mt2b1H#h|J~6~8BomL8Frl^bS! zne@$j8Z7)-4$6Puj*G$h>UDj)q2$HX{?g<6#q#RPWl)G|y^bm~6H{1Ou)4bD-qow- zm9G!CHFFYWN6oFjuX=g3ZRNV9J(jnuF%uHf^ZSd6!b&x3y_M-61dx#%E2}pwH}O0_atD} zPq=k-LJRM!Tv}ztb5Hqw)mDX0UyiyQn}ZOdq-Kq&Zzen~@nE-5p{DKtX8W{l6j!sF zp_v)+r}&{o*ip7oMn%)nwkAz?TdI60zY#f!wv$TjWk(Ui>{O+O+1T-$sYXU0X=TP9 zWhIe!TiJ1UTim#Ac@OGr&Mrw1tXp3X-)32hp`dlEE6oc-Op8+gy5-#r%3@2AjuA|% zFAw32sxS9QW)G|38mvrtw!UtYE0v&mRcVZu2Uc5yFaGbHk0g+iMD6kVuEck-u@WJ z$LG+GG_FTK((39jFJBj_AnDhiy#Ej8UrkX>{t(Nw3S=kE!^^`owPx#-GcBV2+9z5T zbrOchHY1M7)R!5b*nd|2NGHdOZ}j#NpF~+PMbrL|Sj1=n0rpc`T3rbzEUzAq2cGDA zTh6F>Jf^FrZJcDz4=NLL3Ef}Thv-MT)V(r;Cs_WNUNxU5i0@L*6xOW==NeLACZ9%z12yCn8GmE<-`fJCo3{7DleYZZL0d0dpTf z2_*i0gLw`x;McS+#sY+pc~|pci9?fD{L1kCTHb&5xmfIE4_7>UxLoK6aI@DXfjuvY z?DIhs%=njr)n56tMH&Bu_ob&zcry`$Br3Ds6`_b5s_Y68u%1X47x-V!$wmvv` z@sb#(u!p(oKO(+kVfvuXvR^+uAMKxBEct*vQNP=V9*a@z2O7qiE!j5|AJ?3Mo}&*5 zdzSreo8veqL|z>1-ID$8wtj$=iAM0OLz@g9Q}p#2Wc%ewSod3JgJKpelvPxJSTV5!qxHBk1fCcTz1tJ6JV8s};!e*c*a z@H1ZMrkFHKo!VM9x0OgcOn+eTV%CrrR;(J^$l7m1Cv77ALMJqtT2+qDk&*ZjoL8VX z#<4Q7F*>hL$D=ody@XkMM%CHxJeDE;Dv8TWT&IX@>V;EvrNreS-!oT}MzVG!JPr7s zEV-siI(@m9!y6V${w|Te)cvfN9?O`Bz6SBW`tjh zUb?;DIs{L3RN8c5=^~Tzknd#X;Gv6QRUdxm@eJ|XOq_kuMTevnMHiCBhwQ<}-=o6A(PU&Ab@ab3{cNkyg{c#@rbT_ZpXS_z?0Nqdfe-p(g-b3w?<`xC+OxJTY@AnAy+v&~@5Ao2K`6^W5~R0DI>} z=4tNcx#=cN|1WVp?iijJLD%JquFGQ&h#V*MDd|dGq$1lr7S{HTk-sfw{!;hZGN1Sr zSzxatX+qz5OzqBNU3VUP+THf>cn=O7!; zMn;~6tUMDvS~oQ#JDYpK&#(Rwb~GoMEh*L;K1Pq|IrKKjJyoJx?ks!Y z(_@U#aL#__zJN^RbXC1idA&)8Gjjjr8X^4F_5E*UT$ep;1XJg!)11Sq=Fyfe!tWW_ zl{C`sJC@v_`ua50meNca9KCFdI>6_7+P9;81bw~eT(j_e2YnE8_3-oIRp-C+bVeQe z-L@~iLGkl6)ppXV4BC$LkrEeauFZYvTN&(i48- zeW@|y2IbFNeqFD4B)tmi#-)GKdSTNHa5o(s7K6(oaOwxoKQ+(acIE`p+t>eDlZ#t( zj)=a-PvvY$j}D8_Ugz*Gp`G^lI%hS&q^Qvhdd}OAa+rSlbT86E70%cOIg?Pq*s1Os z;1XaSu*x5-e9j+S@dtk}S9c|Ho+`02r6{;!PEn6}E9Uo8xqh-FG z@D+24LLHB3q4upY4SH-~(Q*0eC9sG0{~%pt93|@bMj$$oP#hIvHJ<%pJeIYKM&J_ zf1*$Oa13Lm>*(9IY9amJj0pOXIuRZanutE!^;h(AlXEq$9f3t%$d>wM*NAZ1GU<3T z^z%wF<1SaCzH(%*@a;)jsO)cg2p*94F?UNz8$SDp7CN^{3ndPv49LM};0wr#ZwNi4 z@>Xm?7X)MFT!F}lu3Ger4s^|LqV8Q^h-JLj645RX=dh!1`y9h`Y)MvK&w)Z3qLXe<0+lMy;Y*snN- zCEEF_I(Mz-gyRfZyEo3#70%M5aCQcq z{RN!;xf^HM+deSyCFke_U&a}$kFjx+XW}NkH*UV)gPZ%nWhdjLTyW%iz>y;3;*Q_e zWt>8<^)x-9s*5>^f#9oy`J71u-_BrGEw$`KQApz)T*V)XLgnwu_q4Y*pKydKemz6Z z<1MWCb!@O~tA)ocPAzp8ZJ`r6x8o(PS2~i$Ddr|t!UrZ3zx2(Ib4T%>kbV(7Wog<69r4d(R8Ab$;NhOn z>=-RczanP7wr%$y#{3uFOEH3fy>5E*VcOz9XsccD6p>ej?=oBYMqlprxXT<i0#nzYvta?+}f;->;+kScD)e_ zEj2=OsB4KUkGRGH-*aZ>Nqn~u-<*i}(h_&5_@r*#&!>%elsH|>_cglRTFr;xoN?}2 zJH8d8w1zomd}(HUCB5QH?THV1bU&YJ#W&B2uYHadVvohzUm&YV-`lx$B=abl4X5cV ztBLo0`pvJC{@>_JU!+f!zO#w`_1Iz~#Pn_|bcz16k*C|xW0qZ$+vPw9YH{U~*3I-m zRg^gv|I09s_Gk@%L9YBsAglG&wyce>w`Xm9_xv+;KOLtvJg>zh{w2o3;qx^Wt@qH6 zzPc-B#7|IW@AO`a^ie;r(?t(;$+XF8Rrq&D05T6+d1<~*@xVnS{uMm_pRJA~18PUMu6fAlTA1XnA2&q{y;xb~9PiiLoDdIUzeD4wW*T~af(LX$pIRA|}A^fh@GmO>+yh)Cv#H89Q zTCbJwgIBaB5$8q9CvpBt_&D)Fmv8JNjs(J|6LtW&5Py%J-gNZ4q@|6&!TTQRy)XGE zJqiD7{14XM^+{VYTaS=tGP-NOPZ|MUhJ}gATe4c$%J(7k3{wU#=}G=2J@jsJhFUuk zU5@vOlexs;*NJaXtQJ~D_?vnEst-yWl&l4>;d@Y;793QrHN30Jz+9DC29b%H2~Yh6 zZ$p+bat2Xndc#a~FG+o#qF*^p|Kf(0-K3F1{FHl0+EorOc`@bU4*K#BuQNh>M{A+) z=DC|Y=*Rai;*9PcY2J>lw7VZ^!5`hBg=DThi#WSw@#5G6@6sl#;8V;Eys-fu6hf|L zjbrE2POV|GQwvQ@)Pgn-Yp1Sy_!o0n@Gnmya)RPv9(b1q@2cg_UeC6sK>_ahlzF-Q zrIg!|a=I4%$?bC(ld?@UysrrFCxo6WK8*=VzCPS)gc7B%Ax|lOtwGxD`X%PL`vU_W zSB6fEz{QLG#`PiXq`Ry)#U7|YCKs7T+P9P!ne2_=C#+YXuc+dtqR>!1rM|6*^U93t zq|a~LBHz|r-T!20Ap|F%P^+(lx)~z1`pN;_h#yH^}sZ{_bx3q%c3!f44of)BO!Cncr$G zCheze8hDAHao|&A*NPKE8an9T1|Ua%jq%Ed^tmEGc9OmqemQNt_JNT=eL!!W^pgq5 zK)Klojl-V3Ml95u-Pzg!#?TFKJ?m&Fbq+u6fp5-SKcLZFQ=GHUval$Wu-jjmmz_{AItUEi2ySeiQ?mfQ0x5hC16JIH z&Ux=C=+!0k>_$eXtY3z1CsCeZZu(r@bbS~) zysbG2p<5Sp`>~>18UIyeB7ZSf;atrmp@RUJpWiNpLc4NngYEXqg> zED}2C7;|&8Ne9T5P4v5+jFCE^jntaTu1T~*;X5OiXDpU_sEgB%Fzz^22CnNIZNGOV zxBb3z?1E&!$VOLrAn5X5-{^vdXq)3j#+S9lJZMIA^QZsL+gdTm zaw~&>$o(x7bGT3Zuf_Ql=&>kAFIE})vz91*oPzhwe|6^DVQNYLkHlB;_u~A+7cNfP zI6Dy3p)VUZo(u8Ubx6Iay7WVD?X>?|a4B(_Zq(U3QfCVHcDp?X&H`U$o{hGClzEJb zf4p1A9^|zmAJ@HwER1>E|Jt&j)*xdCxo1cCLfsn{U#NS-;tO@ZFACL)U)&x)%V>rD3De5MLx)FS*Qzp^RZotdyzGQ@6`)Vug z?fORdZhyX4<|B9O`6jL(nAn(GRUy~rrB)!v3eG*?NbuS?3cUWUIDe+BnfwhL&M|^I zV}LU5N?Bswm15DJ%wd{kW?sfFv*6-iEq8aBi+alZ|CjQfrH;$V*T@)K6>46~rj_;wV-IxPach1@yf&%h*%`qPZ!8K4t*oRzo8Mq;gdPl8f0eqF zxf}GGn0?$>_|0bOsEjt7eXw-D2mUpX@6(^epr^@`DSh0_^i$O1+ON@eCPKGEp@|OS z*Y%4!U>eJJ=AJYX|@m+*kc;7yyMtDiI0;&^4M#ADk@ANfuC4w>&hc*lBl z`CDaX4O7zkppvwR^GL;mHy&-i20B8=-y!H|J8dcV_KGgoRY#xN`;YkRq%GTFyK%9O zb#dqIa>Os<-eW&;GQWsU(cX9Hh)$Z$9P17p!9Dkc_qrea{AxFInF-8kCNj4n|U{n7Iqho=;7DVC+a|#?$z9hW9!@%`+=fU z6~FD=KW@Yt2Yw4JBymsAAlJ2->GyO0h>QZ_n%KO~>C!UT3oIv-PK&deezxCjPSLj>>c_ zG!A$)M^^U0BHvQt%O0R-WfNZxIwzOmuL6Ht=jLRVbDzLL(WC9j&ODyjRyZm)P$+tF zVjeeEKHSxG%}+fs*SxZGYtq)iTewI5xj_!byKee}Q_O=TLc?C~*v6@TEttSOYr^V; zMhEyQ(gTHwHZ>B9LCezQOqo`i5e`>&B#sq@`i(b%o zJoP@b_FX-(zDf_ZzED}+^~CSSwhku`V|_-j8oui(6kVy;W^RLbzmFU@2wK}Q`I^QZ zla1grwCk~?Q$9ibWM}>oKUGt-VA%xizzEu=R@+vf)z%hBJGH+hJ~O}Qk@pm82Sm<^ zPU|Q1bEipbAZgY6e2rD;d8!^_gnT)_c&h3`@zJW~4}9b6l~r9W`k;MZs~p?q6&X+X z(CLdM1vzg&m9hE8qd#ZP(4Fn~C3+1|!8nF~TKpKNxFdwVOYYT4%XY(q(t6#;C2d%n zdNsPFug=_pzV)r%oXn=(2HL6HHFWoDgy;Alc+W!G$d7XB}6nh!6T2Tz#`Zr~PDQiboVfVYWW@znbte2lGYb1LXB^vVsbWuq*aoO9g`%+ap(ldi2N&DM$f znc|~w`n>TaXwZAMwstRkM)ZTSFKOSb0Y;6X1%kJ@0yVmpR?mL8usiQobl-XRWAc1D zgL$sm$bkd3`oP0Rmwn%$l&6;R{2JOg&b(E4xv2kC37a^au%l-*uK*9TKS*hSM_wrZ zf^lH!qlRzAr?rdnI={1SI{Z`k(v|Sg}*_XDZX(fZEkp1va=y+><3v>$0wKWUznauyyG(`B;UP%k!wQc#N@loILFN%oRyp~F4HsW zs?2$;nOvDn(G;L}OJ5OeVE{W0J__Q}n@M|Q7vs-5Z_WoHJIFl1Z0bnz%LZCAzX!>;onM(Ji_Wi< zX*XjI+fTH6U-&TT3!d&u3j`}iv$g@Rb6u6k9vUOGo$*+z$IDu(+<}?0Pv&HWC++%y zqq`kuD;hlw&;2ZM$U0SY9PBkU>HHV8|IZRfczEGK;pG$^fft=|$UTG5(Vc{zw87|% zOJ==x2s|kT-joWDN`qGoMeZ4f&h*#@R}AAs#$4NJD^n@&aCFASKjvQ<7`bP@qtRH| z#@#!yNi%$ZN=ow`8~L62e$4HU#J03Abv2v1(vKqRbooQ>rGa1qee(6$d5vEhf!v5b z<#yU`NG2rzcGJy?^}-?tvJ#&%^wKpV!GNb=Xc{c8tF4IDOd(`m&DS7w5ZZ z^JUCMRL%2b2C}m=cg)MqY|0*$+49R#nQhrQnZNoa`C{Hr_7jv5Pc84Wysz-eJ%l=Q zV-oi}T^A=={!%aL&+=pSz5T`Y61?WvQG>f~dgNJKZgs+U2Y{==@Bt5Z+00;$*m-?+ z=5+9|3>h*O+3q-aTb}C3dKmujAMk~r!Ver7qcab~58~h*Mci{!hb-L8dosSQa2sL& zoYYphY;auGpA(G(2Tikapgbln>)E)2fib?B&?4iJ@onU7*0HA+RdPqBeMgm!94>OV%!>$p*mDA9%wgH{ z2!d+^{Fd`Ncyo9K$1!2@MH6+ujQT96K9^9RWz^?VWRrW4P0Bo1cFQIXWRp&0ldWNL z%~H7|!@NT#-nRjnB=tExU-s?vg>M-r3?RQ6x)-&rwFR>&TPbC0NB-+z?!c?cF&i00 z?3r&Zku}-8oP_$KD~t>NWaENSd#GR(ZMf*9XH`*d`Jg!kjzMz^;s))|wITI-*2K95 z3F8sA0ZwFCai+JWMH?SPcSK%SiSK6k#V za$MMSEBxk*@SR)WKPB*?#mGjB7^^LWKP`Yy-OODA^SMhP&bkw)IPSwS%=7y^i3j5?u|2o+j(WYiSC?|8ul** z4o&Z>{h|?k7Wf=c>aS^tHfb+yu40Hbxr4D?bDYJ$roz9Zz1nvmyLS2WXC`Zt<(?Pu z=T&?zTlqV#=371V!yP|oJjgm{GkNqd_UL4+_$c3gzK{Q^D726JkPYqw^l&fWqkQ}M z&gR>kCm%$9*n1^FRrw%zG^R(WoA z=6@WT?~6|u!#FN3t0;F2ee1Z)J+z&rxmRWu!7rD>AD0a+_HE<)dA^?~t{Kt?r#iFh zXoJh3^<_h+`-Hdd#yuN%laIwXvs}1W!z;U32l|+|gV&zp>L`{uGHdSO*jA%O+lnsG zdOz^t0>@VLfU@VUgLy)I>$ZZ!)WN|m_%XCq?OVT&?$CcLDBE%f8mlxpq4=`nulv5E;+T$2`6(7NHlL zcrI+Z4Vt|b+WjIld<*nm!u~Xiwkb=mNAG2$^pPeceR1ike|zfLdpNe~S+aUrA>e?>2E@M-DT4*2uBrwL+-z#Zw z4$ZTK(`!}hHQSdmTJbBxz3a-?RM;MS3Nf950P8)l)5u5c(yc+v-p!jPYXPzVSy`bQJ;^(B7Zx@iP_^N@| z0aJ-g;u&ngyI$~FdhYfRnbP(5aHfLqjkWyW24s$JZixj8b4g?d{yV&y zmJi&c;2K~d<~xB@iLU@S6}W@Q1(pG)0|$>m2M6#Bc%1-z70ABPxos9KtOiomzL5$J zrvCVu`t;blFxN9m(}0CXqtL3*O}dl69YCsu=jHhusvw z`+=aucOIe>chR#)mVKfZM4((2OICed^y&ytbI)0@@Gwy9HDEIK=Sd7$_#2?aa~S9c zz6>O*zFk1P`YM1|0yjz~`OO6u0XdjqhC9QgjQHQlVGW6=4k-B$JtP9xD7Z|)+Z3Fu zprPO-1#=Zl2TFV=hgCpoIGkh0%ec_fG8Z2YvyFOlrDct=waj z`^ywkNPL%qE}(>Ce~Ag(DU_IB1YR%pz#D+$4M3Mu&zJ$GUjy>xeQ)d`%dpy-3X5i=V*wVQzFaTNcDfs*diK-0gnKZ&Kd zzXO~Id=oecxChA37vN9)PgQ1@GPi3Mo?C(9ZzFIfPz?Oy#9d&Uf=vnr6f9HFP|%|w zzzi4Td~^8Q!`~T>X0wdL8S#!i8GHF}%X&2{-qDn`hyOs*| z^9~x$TF30?|A{eA^WQc4{Alb)zcbq92;^?dMW5RE7stmt+9#fz81FcLL!ba%YK2{e zG0t5@PZT{}wA!+xOlcEj6PgLe+WuC6gPbu?aWv*A|dz5*LGH+4l8fD(D%xjeSab><&nfEC3UzPd$$}Dsy z<+bI7Cn%ekZTVoYGTZXN|4Ml5q?3~8FTCR4?(g3ccjC0qKmQ=gyk4be_y6pDjlkC~ zG1FGsRQ%t@Kk|)c%R70>Y$nd%!{i0$?uUK!5#|lJgu9nT`5zr+o*EVY!KmA;IX)R zdAV4Bb@{s05{ZA!n(7+6+))aXP)}4{zH~VXnJk4%N->L4A7tuc5!F+aylU2l<)%&{ zQPmP=QCiCIcWG7W(u%6md&(oj^M^hbR1QFRg}#z@V9L(Z2QG)Pz_?$f^9Wpa&|D)X ztvG_|(^iRN>i|>4cul_jG1dOK&i!sf?@SVgAy5Y%{|G85hZ%i1~b0JvJqbqvVnJVELM7h;_FNgSdd$+t20n z&e-vIRDc4;gA!kV&*k*QY*hJbQxTLApIJ7>y9{;YiHKgrHipKkPfhHlCuSVs1a%Tf z{27>YfNNNMx(!Q0bnA(sYm_mpnGVA@vrYj2)DykdZ{OD`>v(R~-zJ-DmexMJrXuT1 zP17L-*}p|%yP6!=Tc;W7S+^ zEWWg^ni1qBm-+Z(&uPsr@|0Vh+t|)NsgWa@AD_sX1h*0FxR$*)vUdet3~u%-u6V`K zz`2=_i+!IR-;HUmK<5p2E`+|4<7n8({w#*G?586Cu|^B?yDf63*f&}8NMW6pdP{BI zdPkS+J?*&G2%+EPbQ$y39TSO<{XWfGGrD9iz-0C!?_I)L?|-vrXY2H4*+Vp(Jw!8^ zx6K`+d#6p)f`W_P%vC?jU4)JptwnPM3ZHcpwd_9hlY-|4wH4}Z4;45xM~ibnps=02 zR^p%gs#>VnmdPnbkTvD;O|0QJJG3EtAJkJ^Yp>^Q?|(H;W=-DBUcG6Q`561)hJ%C3 zn~cz;F%uhSk-l5@J)g!8`<+G4jl^3^KDLDABfwpSTOTE@ZKPkPx70eOx6~~%LR&K1 z3SA4BYu93093#n>xqe~oOXoc2_%ia7%X()gd+%Jbzq4|0tK@4qX}!r>Q!04qsPZ?b zten)yz7tt5TRWEheVl23!wr6iJ>YJ90({?2J}WZV3&6g?T=ssXt)0qRNya|=j4Mh# zg0e6BqGRakgOrhd17=*ZSMWUkB)(fyip;h3bmAPI5Lk4F#L2#*?l|wtC(e=GasG&V z+TLQ#J|h?}w*=3-*`!*h6rsc%|(M zzmR+XQfC&0wDu&EAA~UfXw=|_y_8$_pJ!?AsMA2)_(OowHI5~|8rRv6FvgNY~doA7A+Zi{1Ym%yxIlRKYk|WcpEn>epALB zdS$G!$hkEwX-mPUvbLSHwcv;3r3PHJ4Yk(m%Hp)m-#x^#=yGEklOUiMK zHh(;<%^!#N9E10qh~_=iiLIMS+PFb_qQk*UoaX*d*~h|ONjq;Y@|HFb+8fcM(`j$< z9j&hQx_2ae>lyY&7@V=L<9_SyazEp|>l^dnTX({@65v~<@Pu~SM*{l*`5rI(=DoVM zNO+rfptW}DeIT!K`-;leY3z**uwI-dJdXS%z(am0XNJLn8$Q=QW=6BO!Qyp&mAM^0 zcOs0>9fQwxz~_$l;&Y-0!0PJ+2kqovaA2qDB0natqbzCgx}U-8K6(y5cSTVsNZAi( zSoJ9TK{`|5#d>VRH{o-`;2r7Y8Qzd8{-n;H%+b7!iCVC3q7{aD)sm6(rZm>YQ{O)H zwXg@sz3{rmdg`_M!i`7sSc89tvmfkPE%8zA?`HqvDLHSvvgJ^hyPNKs3%tjVhW!tb2kGIOyJD$0uPFVH`t&M}$&1?N?yzi2l5i>V5S zQ_TKiKR7h|>8mU}G%4Io1b3{8BJk&b<+Xxh@Ta$JM-GT-ahmk91Zy7DyqDtt&`9d#?}|n5fs!Tj=v!v-&ZHfW z<;~I)t15QaWn8!W(Wh?Nz5S_KO|==FNm_7f)0PbQp?OYF`uG}n=yrHx#skfbBjAl4 zXPhYG3(D!B+MGh09xS{Xpl;*HH7E zV23TIu=YQkG`|YJ|1bJwkyl0_TRcrW?m$*a)rZ&DIY_s%pfMfZ(@Z!^#neO?(W z|2ap)X3n1-V?R%al5=Dqwwae9L4PDEbdN6mzDLlgE{qs!%G3w*Hl z&}#)-;e+Aym;X{&UX)xkhrZj)OCEVaJ{f^bG!j}lC-TsWV5{Jx8NcbKJY?abZbgkL z59OzD286PSJX9ev0d;r|zV`Si*$?^I#ujDf*uvT$a;dR}?62zYJcrydEHwMcz5mT# z3Y|R_4)#_!*$;$XAE(|R`=v#nkDS+#yN$m*fb;+C2NK%*9eJHfpW2R_@WyOtY*ZMH zje^Fqp|PAO8k6$bx@GKs^)PKtcwu%5{SA&`FcddgE5;i?^Rg?ZpXm z-NrZb1u~3}c*I_wWjL~4+{>Lk^X79KgVny=4G2Y^mzgu@%l#bd#qz}HeeW;nV%=Gu zJNt28z`RGc#(ill@bKx|2J`@z0hzz>y-s+7&OL0w!dHRJUHD!AvTp6G0J4R_C+ps1 z)pv&ci~_z0WFLWV4{$i}X&_q>e7k_mhxm2?*;nG*24qUacN>r-eQy)F(`R+cM#kq z{!}3QP<*mzPsRJrQB!O+Fz;hyipsYDb23oYc_bfufKt9EfKtAlKq+4xP|6noO8GVb zrF=7il3%&6M(`@@kD$zVHBj=`0g@$uaxa_Uw+txxI#1p4Ik(G#g(W~qcP3EMHGq=t zRG_3g4k+p70wvuhAmQTz3YIBoDCkiTVESV%T0gJHI}VR{on$mk*5zc~(|%s#Th>MG z`M0^^9%jB#%#_uhPrE=sS=Y3mTlp5VP1oWiW}A+WD6>ts4&oDcyPYKSEoQr2ZQ`3> z_w)BC^Ta6g(^2Lti9bC22gDR^-X7)uhA989MEQR(%DgbjJUYsJZ@D06C5_~TLWe?Q87*5m!jS(*VmYH^UA^suL>kSh#|~muU&M9=~+pOw6fw+ zWmWM+n#_EatiDM$Wkx0xW*JtT8`rH~+3mUeP8~B&L7PMomZ)t-_9MLXUaPSJ^{m|x zqQ}ttdW47@1XxJ1)jqKW^NVNvw#BpE^Z( zXI;cx!ecFK_0n?IDSH-2pzY}O5$T{SplQv+%L9+qI?S)W|70J9JarO=$2QyRBQz)T z`K;?BlT-kSPd?ko5M7%{4gmr7bGh}5sdmCDUv1=5vWos9+23(Eso$wCQ zW$f^Zq$@f=wSBqhPI4t{6Oaj#6Fh#eocVC03r}=*tYoZh?{Am+((6PX9$n;h;Vx$j z4iC|S)%XEFsiME{=Zp_-L3i70n9?+crXDN7M$@-seowHHo081IMB66+_fFXmh?Zzp-p2P~Wwz_*kC?@e{Y>H`+jmJZb`xt zN4kxXf`u(CNF-`E%4&1VixtX@Ji=bK6_sxcx9{26(ub`I8@{1s$%LpKE);`%?99MY zCUG?d1?esAO$=ra3<7v^#$Ri7w5lt$qr>T%BkMD{*@rXSj=-WULtC42aC=7T{r5i>-VYvAXTI#Ypy>0* zz4~YR0CXt?MMo}~+_m{ZjefYN56K$9920)r@c!)g??0;grc@VZ>5~$5M}iyoydz`l zXEO)=bNa6p^waI=jh&7Eyvh|!4eF=c=}!~TC1&WZgaq~;j6LG1ufjiiz$Qx{BK`&D zZu9@V`N@Vin)e;}d*>(r^LOv5i+^`9U+j8l=Fcl1{r5MT7d-d(*QWjU@2@@CW!k$h zlpjUc>ukv%`wJG1C4R}Tcx(M{6w#@PB6aDdLV$yLY=7vmDE z4s)iyL8&;WWkhn@B?N7+2Yh3;L}6wyDGKs@_atmvwOwyLR@uY>CA{THKTPt_js%%4tQFsk2-EbM~~-s z`wD(c*k@ReIYqm)=}G+A;l573enmW`tT}y+wq2?Zs(KVC`mE%8AM4BS;#LhjgPq`5 z@WE1)9RYsAoczU@@r1HFAfnM$}DE9&V zxVI{Ik@x5ddgZT8F@5Sto?h`^iMz;y+i)Qb-v*$_g?sQU=KF!-K3$oo0>!-@NR#fXo&f>52;OD}@G^sr6|Z2JI5Vh0MMIEOlO|0`|kp_)TX=2Z-i7}oWdoo^{18Q5-ngm)s{=Uy%YY)Q!!L}M^w~MB zkYcrup z#$8;_HN}~1Ls1*|DUd@|ch$0@5?KPIO!SyMNLFFyq98ugV+>61GV{xEL2rd)ONFdI zt!Oz9H7)zb^Rko~GpG6HWu$5SPo9_6@fxVi%M==Qm+G&tg5IfIgw{9oQ|4vys6X=5 z?;FZR6n~mz->|MjyP&3HQ~c|VnrvgJd6^6D&`xBz3e{P(p?-1^iYKL+!uh7Z+dG8Q zid@927Vue$=L7h$+pC7YPN+wgX}}IUBjFw4^o@HVL)i+M2Fz#<5R+Mxb3<$@^LOjQ z__Y?}SXU_Y4k6Rfp^kk4QESaHqa`u)eKPMtJTMP>Ul0>t%oh{&olB~6T-p1}RQN7G0q1dKKGU2-?*h(r zQ|5%XA#0&N8Tbw3>-mS{dj;`bJ3(l{ogRN*oc+qf^^2W3nPGd&q{mDR+FRQ{ly0ql z4re`wYB65vwqc*MQa4(M{J(OQR>HJ_QHEf#Z>+l zTqX|TKbk~8{&{Zo@F4s;-i{t(_WHTM#`&DVTQT<(Kzzs}thmpUdMBTPzgGWdS zAoKuXHQ33~#?i^NUN$ z>B|NouY9Gea8=$G<+}#H0fmW=ik+8+Tck57Ez4U)4bwWW8H1&7%D1F|Y_VbzCAM%g9#yV8ii$_iOfb{)_y5}~V`$OYB{YWnF zU)doG>+>5*p6=xSwR2arpG#>=RpNJt*fA9aKyw%WafISc z4@3y^Si_?N>KptN-COA0YR4VP(Lyf_?N~lXmGp6qI1dFI+-+#wZDJ(OLZS0eh6!zC zCjoPF(O#LZ-O`++oRNe>8QRQ7=xyF7Z0V|cHpi@LD$_26UM|hGm9XHiAwlTTUf-XC zF|uwEbWF6zgl-$cI`E?(Ft+JmRaK85zKY#7aU+)g*PiXw3 zFzCHcSXz&D;q>Qn%$N3;kscR?Njg+ru&1?)-7K!E&Azx={Nh?kI>~VT0=F{b_lKPuKfKW;7zwmvw)ZHF=J=l&GuqtB&ZKmIvpu0*6CKb}{b zsmxwKel^TdMnxWm52piRDJzwsmFg(*secDP+ysP|!5)rIjy8@)jsV%7N|lMvH|+^d4;ReRVuufbrSH*$-#V~STl zrx`9B#?#kG{;sXB(ejeAqE%$nf0MKbpOeYAp?`BZ?ey8Red~cu_^vK*Eq&pxzjvINK@Ra##tAPfrQE0Y8z)wN?fvD7KStR%=mep|>(@9qk6@^A zg3isLUlXr1Huy*5L^e9~VKS$$_k*o3lyTw++|hVJaiTWZ0XiDkjgI0F!T{-8Z)osN z4~0W|Azzmcum}8gCH-=}vfhwvIQt9o6Ik3W%@EpXuG*D!yombUTU+0TuBA|~@P!#R z@Q=y+j)VG0*5PqcJfgiRZ{IK=gt!Lyh2WAPYFkWKZ zBDyQ7ZN2}xOOd}y`)uxHBhHn^w`+@n96e#A7iyW@Ff76D{{Oa3ZZPA0(s;YO2=7bX z#oddb|Gx`5s^Mvq8`|x*wvL6iwq*0<20Pvt;$1LeY#t}HNhXYylZCdop`$5@FFgoZ z+XgdG8aK>*Ol!Af47Xcw+n?p#vGXlL>I9tcHc`I-=eNCv^Wi4M3x@GH=gk%)7=lYN z-dEs>$*?T&v->2syBc;2Vb?=;H^bgzLYoceh5rhVaOTx;!6w{t!mbT@;}JxI17|tr zOCr=1h1~_g3lMgq-ubl9rZSuL0-XsPkM$tVWmDmN$AXiI`hxEZZ6?r_&`EYhiS;`j z_U@>NcPe8m1kcRxHC5v;Z(58gzgj_h^VQZ`M z^NY^56yT2v?$z)sK~f{#33#8PpNBI+SHeFbp3cfk(mR87mX!|*Z4}SWzuum?{diFK z_SGc6bzrZa+7gSeS~Jh066W)>>2P07tnH12;Ua8wI8rqyto_juqe!eE=$Z8J8<^~cSGMTeF-`q zbu-ZZZXBtm)QLAxSC8p3EU!dmSd7S559*CgpgMqhgu3vztKu8C{zBiad1xuRyL*%E z4ctNS#$Th`t@%$Q4@?RAg5X6K2i!Ryw6&qXjuBCJFlYW2wTp~2vwYU#s_)y{Dp9Wr zkasIr!yUqM!p%6GpYKE&I9KCbQPoo1UvjVI)o|Ob*W`2YgQm3Cc_Nxn7Qceo%P>nY z22Dx8S@|#Htb9sG!7N)FwZZQpj}p%`g}b!Bv^z#W*f^g<1okw}2&XYGD?{uEzTXmIr zKM0+v|KYdC8g_r%YWN6s?JUeENKN4%BTm7FBTIX5$K!;Mu;TcSe;)qvnc3mp6T*t) z!2jym>WGma{X9JGquJp-WcG1ucuKG){Jy9kM{I~{jJSSwYWU2kH}j$pr<_qU_02dB zJ4ZiLAFXQ&FMoD-MD)L>gqJ@1Y{Z7+^KVXj_JlY+7?8;5b-YFkKx__` zEXNvfAe9aK>xt8R5^a};={`T%942F!X+QovZhJ8I%KUdQ_ccSfKg9Wixj#9C`x`^J zkL2?qT0h{|Z)!4*^J%U#5Pt^e+u%|hApc0untt8%&)DC8oCzxbI^bTd?w|izn9yR* zWTA5;5meS5hE@;!CHgUj)_HJG_Q)^_=!LI@M>#ffq;&+Dui!X?Bc-3rJ#de|U?)c# zM`-JTrn>cznIyu@n8aV=FcQ`#P*b{(6oM1%9G9sB3dcG282PhQeHbbt>k|>r{uQT{_H!4f0rJlZ2joWiZ3v)gdA1zuAz6_&4?8pV z;x!wK^2;&{%PJo2%Y^iAa3)-4xr=dh&A<)=dCGA^zMv^6S^2k*2|qffkC~6~i|xGp z^`-9OH97eeZu!uhUOT;!9^8&E?t@!_H!KN#t>jna7f+LyxUk?0G`FN|!$w)lXkZOv z*p;&zYTX&G!j%=)ZT}OW)Bb{-N0l&FG9s#(^HqL!kUmvolA0s!S?|#U? z!G1%nd)s-uRnLQy+$l@{nx!yK~vul z87l~0_%zVEm;9sgt4~0n@8s84KS?}rOj-BVInoSb^g1W@zM|_?X$Bk3-+T3xly$IT zA2-pb4Ym$e>_`s{y#7@9!b835&%m{`Vn=cg;fJ%=k3rM6r#Ef5Wy2i3M}@e5P1;~z zNn5{k=k|uzkGG z)>$a7{<4Tc)3@6%ed)LZb@veIgMB4^{_!L^h!RIBdx(6`?oDgoctP*^sFQ}f-8ZnV zq3>H2KRxfwZxbQ6AbEm+{tp_5tRdo%)f)$6^}QAq5tjLoYn;XN>Y1N~2ic^XKSNm0&zY(}n>=3sD%Lc=2bL$#(gy))P5lI9 zBZVWP44=iP7@pFN)9=?u8SXQYYykN>FUXLDwf0IW#6at&`SD457uH>Bte;-ReK$e7 zgtqy(+oy1Z#;`y)LBDU5#t;m5zk<67D3cSoBWFIpV{ISoYjz85A?O!6;YSespgW7` z?lp9Fx#J{TTM*j2BJT)>jN&uMdg$)95XdNA#hn{Z!EX)RT*un6I)1ADSGarUGw_4< z2yMZQLYt;Zkk_X6c%yutz7b*KX1O-gbw^qzrgK#GhMVdZLnhld8B}JmY5 zEI6-^%%X9LEVK9=GK>0o!HD}r{cE_#VB*3IOZ2Iwmir;MpmO~pHyUz_8Twp(v|-l6 z4oiHY!*X^`s{X4vY5Mrf*_N}(cu!8#ADNS)|IwTY`Vo_6>1R)x4c@($si7nfiAVXT zq5R_w<58~fnr7=yqg;pMKBYJ3X$<%1ryJ-Fh5dRB>d!dbc^7GT66O5bs7OOpR;DE< z88Q>Jqa4(eXw;|OxVtHK#XXit#I0JIsb4i`oW3r3s{U2oc>Vkl!wtVey?G5~yg9J+g$xm?CNgw%% zT7>*W1^J13y$UiUbw3%B@P@?8!^UMIvJ8pmxe;cH3~8chYr~v`$&olefyPBOY8#~7R~M@mXA>muc7_?8|p5l@jUAC_$?V0!=9y<6B+F8z$INIe$=bR4^P%bbF=^@gyLZmjdy z?_B+ubfK;BE|b2jV~iovHpXz&6>s?DkywKcV|znUtlTjn`*PG_d z&`a8x`nQb+gS2m%W&8F>L*DHugM>Sa{wvg^zctCKH$bLr0^JGvcS&On{{u6&|&ON4i#pM#TfbGT~>Vu()e49 zjn*(*+oy0h7HwOPa>61nW-r?7+#3$dr=fH8caLH68-;IxoleBrj5xRG%=+eWlEIY} zX~=vf%Fu!`8@t=q))H#g8_aX{(mY$+f5A+zy<30x7K6cHMn1y*?R9tS4f7z!Lmo9t zbK%ci{UU_59nZ3p65_8#{B?-Gg!pR_f4IeX-g#HLUP>^^_n@UC-Ucno0P&`JM@Vt2 zLfr4Z?ywjrOvK$aXQF;5+OHDV%%muT>y=1DBjR-wWjGe`G@uPqJpU*3Zhhm{v4)$I zU=F_;*ID&rGN~-*qOPRtf2m8?KL|Hl@hr<4Ysk&k8_F_A874N4HKd%-8zS3B8-9U$ zbrEq$3mvatu_oSd*JX!gbm(3BRGyC`5l@m4j>hv9+WFb<;_f1}b-LT^Gvw<`rRYe>M@5Uizs0)4ejW0;73f%=24qzuTT9Jnh-`w$iwi*n*FcGp6e11ZLOU{Q zGA!4@pNf9?lua<~G)>hX!yLtn`>qbk`~{YA=<_lo1%n;tYhfFdv!!Sa%k3u^cT{S z^#x{=p8U9EPVO6*L>6CF9ripBPfELgTnqg8M(`@}w4dCS(;n7Trkr!ql{63Km4R|| z;O-;)`rGe_^~iRg?lR_%0l)t8#Z=f3`>MLgZpfT|v_8TQ(yhKfWoanORR)l+J;tpM z=6(<759Ypo2>0hXf3Wz+AW`%iEc~fM@Uw>CyEtFYhXK-ml=BCR-;E*sk5sYv50*d5 zcXETJFPFQw!5akCul#lo;r~(2AI$%Ae*Pl}PO&)C|9CZfA51=L;(XFi$FHAz(rcn$ zHRY4BKmRZ(H{lmgDa+{3KZ*T)`kjJ%ae#Y%PQpD{S@_0;(3+0$h)!i_CAlxsZh>rH z#?2gEz_BnVxi0bPdqP5r0U?D)=;646V>(A8$Lok2*&{h5;X#fy99UML6&x zxSeAYM-N9QM;k{YM}eakj%D{8n>cznIyu@n8aWCay@&^1gWEYaarAI>aF} z!!FrZ`h#b#P}QlCJ4S!o$W%e`XlUMA$V z0nB-2`J0yeEXaQOB;9?CnW(#uks|BvW7z9i9zx41*;H7TP$7w)5a$rb4C8*c&Hn1heHs`u zSN_+mU~e_#20w*X_7C{53i*CT;pPfvhyDl3`xQ>^z3h$rBQGQIA^smJ{C@ifxGbQs zEWapamh2$VKPUHx&j*Cg`}$5wm^7b-MgND|k0|B-WpXFo@Q)|C*Au@t_=j60(D87y z!1x{E{+YQawj4jlcn$P>sQnE}AN`v6Jf##JCQW%fYvp^?h}Fl-q4qaSMc5mG2jnOo zPfZE?HZb#1(AeDY-`_|FpB^)wLOl22`KCX}KAzPc^>96Gp`OnD6)NLS%Q9Vl<{r3H4JoL0B#b4Z8-i0-F zdv3~ zG2C+fIl6u)l`C`-JyEtcXK+xP2l`}A9dH6L92gFa3TkuZ#MFBn$I=CSPf)Yhmgage zF3t7bxO&{@w58@X(5vIpwqI2B)J(zIH#i#?-_z&rgnYq``+=eR*pmzlMSkHNfDPiC zwWIR)2DQ4+s(RLb0ymH$U>OvHIDU|Tye6I&ZOn}O56F)19d=#+h4do--gSU;BK4+D8JPRU!m86F7~6#KtDq9!}siHnkr zE(kh30(GPYWiR2JVxdxy-T7#HFD(!sewHI&npKTQ&LUs7BVQ&#ukfc;ai^Q%mw@kI zL|!J%4o;&^le^|bPV+viSrtHEL>$Sz!ap8B?`3o)KOgIGRnTcUo^)^~)%JH}EZe^YIWC2c@su z%j3w)*#mz>9)9!QVA*aZ>av_Z6?cpFF4GRiSMuX$1tF)~;XcljcjR_3i!asFc-Y4r zCuTSDHGZXtILFB65Oh$PxHnVUQjCZ*jT6clBy<)4`K9#9O;u5>yj5`=C5DNJ1J#3z zNQaD^b|9`qS8;kTqbUqBKkUfe>_0Ab-hL^k*J6;lIO4yU`a0Hzuy9S)U)sg7;uJU_F zz46&Wo$nU$$9hz?0E5zdHeC0qs@t8y@)WxppZAjpx`(1tDZ^E zulhco@8Q{nrxwrCcy{8c!SfWJC(|ijFQGovy!+B9Z%D`+q$7(lxaX@9p@-r|`>CA` zkcR`||F=3{7g}jwgz1}`^di1V7DgsOFFiqjX-Bl>!hWIcSe5>$Ix<;54tw3d`u=K5 zlM#D+S=e(uzU*jlB=ig*d-oWz2cDH6@0m7Z&ou;c|6usvj`pJLv(k6Xd$DJ}0D8H! z&$=c)#Bd6Gm9#fI95VfP<5TpG_=)-u$n!56;w+!NBed-|jhFS`JK-n!M|-*cev+>G zW!jg;6AV9B#snMoBc4I<^E0@8HGYErN$e$G#(wT+&&69v@7x5xXfOEp{}=Le#P7H& z_oxy_(pQ)F^pSow{BuB8nfCh0od$c=tFXtM2>o|8!n^oPtmX30g|_ypoSWWt!mTfH zFGfdIUTWvEpfpy#AuZh{sGlD@dNiLpX#B6kQ=fo(k%;FKopn$B@+DOdJ_7i>GvuXF z+UariM(BtqXoLuHtY)cD{c^Ywdg9V|?5*18?5(=@?XCEJJX8{Op<1=0Rd<)8mA;{t z>2lDo`_Y#`kIv}jFUx4v)%wxzfDUo=EbGEqDez;27(Jala*D4kz*P^kX>(l-)>&+QmH@^EJn@+&t~)V+T&Tvs~` z;Vv9MtYPO9Lbv&4RXx7f|NLe2f0UQ#zc(z#89TaP+j_$At@&J}r3z^YMOr%5VFxHZ zlaLOV7*=~QJgjzCrBFW%X=*~6$X`3+8;Dex7<@A_wegNem&KPJo@TjR9XWP^-LV9qP z(&v?w9@Gn8dM^D7qz84|m!8}I0_j0J^`&RD{eORbLto=d&+LDJ^q}ALrDxf{Kzh*k z`_fbLFOVLLW4`p%{tKiBW3ewi`~L;fgL#E7J@5Prqz7{&UwS_M-=CiCDq+KV%yqPw z@0mB)dO|VZ*`CPeJ0u^W^W$i~<0{+stWFHAeLXz1b{*zBVVLiDFyFcJ`J40)&EKFq zF3)$?sU&&6BaIJhXu&+rg!!A~H-G!00qdDpn2d&GLL`5n^>5ttd9Bhtm}`sCwHNr> ziq^u?D^IkRL&oqDWDKFSW)GN?U&7jp?wV22`Wtg{>BIT*`GL}hL9HHKCnEi)qerAU zJa{x8R_>I#jd;W&JUK4-t{CS4=1#}lJ_d3NiiZe!k#ZIy$vP+=Bm*K@2gRc~9QW6m zgc&sF)T)E(bp}Vz72NHqn+wE!dNe;@RH?4Nau?p;iK@SXJNtAiqw2$6iK@T$x~e5? zM^yb6)5R9EU8wKguW8Y~zIaR5Jwhw#h<$-O9?Ac!xbq70-umsB8y_Es^B=L+pS5LO z_anD&AHEum^CSyLE$b}7U3ze%oSQA3HrGN1*V=WDjqZ8c5p85Jbw>v?q-IRd3 zfP3_CPuKA2UG^=VDqAa^JKl4}F2_mt67D1oshNF1TQ~c?zr8eT(U!0%-Ah8N6c;&L zi})@?e4ACKSzqCcA1Xg?;NC)Z_s=MKJ--b1JUxIr>1ycS zC&)+_h6t?!%2C2vD>D@D$R`nZDXIMKQW9`KkJ|5k9ufER;4YpXRlj@YVo?90amUa| z+{rTrck+yu!`urwjv4Z#xuR+9SBQ`Jm)p7BNT;OkO{e%d$$sK}>6Cd$XBFJKLLz5( zP~PC4#eZhrP+ciUIme+aE4I&WkVIh`)tfKmJfnM}Se|vF+)2igpGbCMYPCPc`K4Qi zMQMLbbu1R?W%lTP%~8lpxGDKhy1H>cp42a0{mcGN z+dQSqbm8`lui)=LGhH|S=XRX;61%_e#=W){rz-ZSw*mUckkeSupHf@#J{8h(fn;RL zxyjtV(-C`gJ7jF$Bqlp^R>d4u>@=$%=+GZ+1z9sWUfSU-^b9N(SejDcUv zXChFTw|4|VFEkALg~Om{7!JMA2*@NOA(I>qnR^uW@uIPh7Xv-fSlq)9#P3#Sb+}nQ zqMtl62KBE7@<{Aw&uCVEyMNr)(7m(w!_Qp!y$oUGAgudZZkA*tUiTsnOA(hP&~?mO zkGRRQe!7SDhmb9rJodC3aYE0RvxOdMiZG+*V#sL`{p9min$wDmu_lq3{lGzH?0nvu z{*3`0lRcjLY7=^xa7V1e?66ETl_JHe$_OuS@-qIb$ zoexS4(n9P(VT@0}9d2ZH0cPIW>~4l0l8udXSag%^78mxVoX~j{ptG8Q$AM=h9-2Ee zL;tp>_2;k--@ot=JYZKZN^f&@ghWt#vNO zYHY~kj#DvuH2RrY+wITAZ3|vjqsIBwDrwzCjQ1Hx#FlRmDvBf zNMp_m_Ovh2PiFq*cAt1^k=JvP*Oh;UY)i}D6X<<7-m!<#j&V#vKG1l9eV(?=3oqoj zDp)@1AiIr_>jrC!l+G*PLL3s_d*RA-j0xMeeHe-}#@#4mtvk8fggZmKaF>UH&I$R` z?c7P*#AuT!M7@W2@4~pT31`Ysx<@{Ipn>e7j<)6@ZuzJ`SAsqAJ-!0oi;(uKsK@J$ zWgoF@6PLXthORpfd14pFA-NBFps3qC{VSZ+EySlq{ zxc?VpS2FG^dGLD(BShG66?gH5!pyvFQp4ibY)c8giGZxOcJ${suLNn_`i@ZlV2JQ} z6YiRIy=YHEInC%qoN$-!=X-}u*1HpJvyG zoF*;TH;4bGTeoKpha2~Iu$Sv+w+s3WWM9#9r?_jNt98s5~{E*X~SO-u&moNwEM1O^Py5VXV)^fbx zj7PsY^5vk@4LA#l@~;bZocctXS5v>}3B@_`sQ=_g7p*POccmxj8g_@`Ze{Eh)uQgw zeY5gDC)OyRV$aZv_PG;nn&uB5PZ-^BrNGk~3U?1COlru)yq4NZ6Wsju~i#%w8`vaJhJdL_kaJC_5ufD15BKTL(Z@&jK zx&MGW)u_fCmDE)BpWrRZu&1pB?;^_VW3v0KU3TvXugh^5n#w+aSqJ!(#~0u>G5vcv ziEw)o=Bo0Sa#YbxWxv5Y`Q7pH^En-HO=a$pdvdzqHc_k@bsRkEcfUek+KF+V$}k3F zSq=IUDnIg<_LfPXK+;OJBXC|k<@;MWujx}&>{T1u6xmgYv9*~J%O@k&i7Y?)ULl2n zc-LtC>Ill!S4U7^D4bfUe;pZxGNgJEgFXQ|uk~_$L0skff;vL=1$qs+ov1@{eZhPp zJz-SC50K|?qprN(udc*irM?e+e$U5=qZ>L=hMj7mM;WUw^7)!?oCXj*BP6O?oBhD#K)H|h4%toE?PP4ULKpnW~$hhgy#20(Zg|>?sPo-bj5ox*bjL_yn zUadr*=EeM@68*f&`$7)t3C7pCXFGX4qp{{A$}`jpljN6YG*?2K7=d#66lq(GyU1|| z)d#=882tjq=zjw?;9D6buc(~9Li->+059eMoya$GPxt!XOw=~iAde{DabJOaXYfws zb3E?EpuCC2{mIP}9F_x9zJ7jSQ?q$NK5(GPZ2&BFa|UaGwS!iF4e`e@FV^e zRXx?ePaz|r`XJ{s^ebpx_Z#?^jA(U>-=&zL6L9binW5rvtf;HK-r-Z72r zYSG>U$219M#LGZ=9>=(PX^?R>0saM!dzt79Y23@ixYw1u&EgHl7=$rTZR#C^j7SUh zugbVbb`lWQKx5uO^+a(m=Ld~&(QtO$ z?kvk{d}~K%^eu?j7zEP<{e0~4ufliW38r!SD%{65t_Wv>QQv^ENYOFrO0r`eb)v{7 z7@#M`?toLwNGD41cR&2SXN<-WVw&jlcRc(Z*S^FO4E+QOGZS(Y_O!wKj>%!>>%XyE?>gj=d& zFAvO=2fLSAlzi98c`#nigGtDP8XhkJb<%(BLwP{uUxT(t@m579>TR%-Pj#2`s^C^x z57GL_j`dLozWM98#^$9ev>jSAC7~UWA4(Vk#$^HHa$tE<83*bFkqk(?Aun|&#(2_) z!+KRdA6c?<-7M%+Q9aN?|5pb+TGC-yhx%u>BsV0(9nCci+k_U(PkP8+azfB)I;VLt z#t^d@beiV*lku(_FSLZFsLWsI*8%ctxX{D(Cf|_#yP)y;H~E<6^e*`KJ@WfyjqLXn z@;gOn(IWiNnQC)*0y|$oN*AKEL8|-aimH@%Fo)3M9vMmQ*M)jYhbiGegRW)q7DWeF z`&jme(!xccrFF{vNyrcR?iUH?ZWwNf8_+jmj>+1e?xyp@Q1~N_f4xCV{v;%?lO+42 zp_t1^IIoj*c%kpSj^y83+=WGRObSz8yU}_Lb1Ci3(hsE{*|yNVkAsC-Lt!E;9m1tG ziyWr;bvf>N3FdWl_9bL}8x~WzR>)R)xbIWAkUeMxZLN8m?b+ntZKivqj^rV1FT&PQ z*a_NN2{PlnuSxSa3g7-U;X`k*U-&qCQcAP^^THoKc=&X0ya{uBt%a|bmHfA&j~yWY z??e|=X*+I=ncDok)Va8$Qb2i$`G(YEDq(gk)+#NSkIh1vd>X~(xzW&>uRy(uOYGH4 z{HlQFx=b&z8TKXjCN?kj&2wYWG=$xxm#DO9|9d(IYtswSo~R9pm4;NpA??-QnLTaf zp(r}XU0i{+w-Iv(=#B}{brUM1j^0T)gSxlhnR}Hctk~As6i)sm4by~=LtMtK7^gQO zE~LYk09`z>GWw|f#w+2*G0t%8echyZ4b+DjE6=7URDPT;1mO((%5&)g&bLple4rcJ z>pjNGGvIv$o*?%{1Jwz-Yc?=nJJ& zm29- zE*tWO_T8wCDf#tsKz?-`?@d=M#z1LX?C8z`^5{$fmkCfl4q~T6)$12z1)&n|FdWFQ zj=g^A8xDJem5Za-o)$83(=ciA!2bE=#l!Ifhgs!k$31#LI|JocWk7zl^EM3mcE5Vm z&fD{VJhXQzhXHw2(K4?iC;Ien3Zkigw3_jB?ic7Tp?=|XIAl9tTc_KPGoAR3XQNL4 zW^dGxe)^|lQaU!26E`GYplJoo`#G7kNHiuhBoJm^^nvAzJl;-9A-)MsP-&|x1U6my&~yRCKD z{kGQdLR)LZ7F+91^y6K4!XPU+fWGr-JYhe!wZ1QghSuT8U8a4)(K-j|lYZc69gVapWto6)U;O)W`VJtl zuXb%`<>X&JncG>}_?Jnayf288>;FJ~2f6vW`iHp1(6^AvIb4C?LI%z)==-B)+B4M% zGhJBgF2s|JClt?gtP`3s7r;JZ%Y}PY<|gzdmm-87rOsV~T#D&QuyMZ${Rx>lvF21{ z(!^JTR%9bh=vRiagY+v-MMDysw6M5wJwgawQd)6Yn!k} zSp*r!B+M^}Hi9G`yPgN9**`Nf$=^PXTfXg1M@H*c_@|VrJ6#7nK#s$17E4t2fl=S zB``m~z+Un)83)uG{pI^pv9M2^@{$(RvLfHh^AwJnt%0_qxWiy1GTU)b{ z7xyAhmLhMKpzq7V-uYtW*&^iKLhPN>Ipi9-tZrunp&mvcFC($9KOAnN;5Hihh&_Gi zV&$SNYwm`=9Lh2lYscoLm;<6Lv1VTDg^ZkJRGBExmK1UKZZbOo!qi>KWEqtpfC< zY7Q*k;)X0JAM%p}(3zsTWt?y|pzL`LPW7l7sQ%KICII^6_5e zUl7l~|3~X2zB#2lv;VKGlmBn#>C4}@wKhG?@)dpf|E_kvL&UwA8nkPCbDx3v)d1i2 zlT5G$@`GDj=cCTg!yS{XKc_K93mJwtB*=0xBG{tCJ!#Oz#9g3l%(*gJXpIpu?nDbv z0TJp}Vr_K+ZSk_2<}@*~jFs|BX^R5(CA@bDZ618z7igd4vHo_OuwNtFb*Kil8yH{2 z`*e4n3T;-6bo8c~`g>XjZbF~di9T(iU!UgYeVPYz)4yPBaPdA(?&mNMW&Ii3du06? zd&l@Mr%};`?Ocid5bSqg|8RIG?`JMNXSd`>_3dje?XX!cLWh9*9IVB0R|L!RFPCSa z&&E8J=RJKpJ{XVE>7PD)&sU-uF1#_2%!A~%$k+kPHrcOiLs7O@QMRP>ybH2N=;6xq zimNE&87O1YK?*Fhfy$WfN59iDcK#h@Y!o1?(TJABFqLIoJkFd&KW8cx(r7P0o-6E7 zA#WtqcP;9>YKZ#25cMPzdCt}b6UNvqrI7v8{WsaT|3<(Wh7Rmc6iC6?SAo6;+5ycG z%m}k<9dr|se@2`U>V0mQ<@cL}Ho1LlMf->lS}tNvM(yJ=@{QWao#dT|@?-0rwGZQ8 zx!tdAAAQsJFV#MBzOH@z<8^?}6TT1U2@f}==dx6O0G}esE+*oc}H!7(w)3ZUb}CY1f2rfOUp|T zHWWYxPkR1|m}4!*ccu4eG)p7#Y``-O&ozu2yDEixi$|!Z??(SmrEvN$J8fBS;d%bq zC+|InXVbq=TzUl0$g{JTKL2bL=#-@o;ywCo>e7!vKLa;CJB6&D!#o$}&*6QSDAvD$ zhrTJz$M}P_$5kixPriq;S-)-DPbUk*YX69^e=82FT`Y#a|J1SVmf_gryl-BJT=v8{!qq`CW_AM>;^5yca`TFvu_D}u5o%8{u$9boHfN#ISCPLq@>^EP+yU6u${r$YH z4#s+CIMzE+Snot*tc}4uAr}4r2#ghRkQE2jFT?!6#n(I|u;y|7)!y?P=o8X@-c0Bv zHZNj2F2-SW#(_#cmtPtGn{h`v_C+_?p_}&AN?Nxt9Wa{HXb~q99%b#*Df36j^Bqs3 zP@jsr*qH&jH0@{Lo!nf&_YvNzC(^z6Cc=xe4KCu01JY^hEEjq%R8^;UC5^>8NbkD` zPQZ6c-W|`RcPDAmZX@r=KW`G|V+gCyx+n>I^q5-+#svK}tk)zX_Mx#xQqCAEfIbPG z?eEYE(7{c_J~Z@kgK$J!?WoQ@E5K z7OoX0=;^zm4z)159sHO5_`(X~6hAwnh-B7KM7DZ?96t$fz2f&??|ObdO$W6L5An+Dn@^ z7<1@wJMJsA;l2mE<@bx`TUMbS%)@#6q)U>6bEXS3gK+NteBZr=F*#9&Xx()Ew53so zKgS7epX2=K>!Cv1e}@QdpW$rj8`1C=c|>yBi&#HjLLL7?t(Efz=TmGDM%x~>p`E;~ ziY)7ldufy;NXdWrsiTF;*3=y`Th1$S*tDNP2F>2Xz*z_kn8gTkH@^1c)D4qKM3MM`IKnHbcY8pvC;PP8AyV-fVrLvLk# zxUO*9vy;I^Jo@M%Lf1|!j}4IT zAq`kpU9H5tfVI!wwU4syp|~AD+%gxk`gjcWLP%$_9I7Lv2TS^l3#r~Vr#M9QFLP8gIVZqd)jtU*kBy#c(e)j7ulJPEa|}>2Vc>VeH-t(y1qKGzkpc> z{GkHSH zlx>+(fdd~m3GP+K(vp&*a-C3s8>NlzRpoPx<5%f~@{*!Q3d@Y;g%!PKYw1$wUJ_SC zRphVqGjNv|jPSJDO5y`+5Jr7^#(EPo3N-Cfu(Y;GV2%-?yaoMJ&L z?kGIP8U@DR3(89JS6ND3`Q?R3SOu;zTWPE)D=cIwU5AU+)(4oa+ESdqzK^Z-C65&1 zfKYN`G>u<18EDoCWNN1rFt1AU-DUkP^=74#%jNF%%z>Qe6eAuNmcu@_lEXd&p2I#` zzNM=SDXlQBDa$W)@lq^sS5V0**@9A9XUs1uDp{G2<4xs|b%K(Qs2M4%`&1neW0(QD z-o8I>E+4uGPCx!sZr#YRA3vM(={`SvlY;+!e@D5=IA+|B@8u>O`uTsEGaA9cH^2Sd zdtgYvYHW(&+@5}X4Nu@hP~JBTa89_>%-p-+zc|1>kR6j4Kb1kh_z9C4BWn3KVg z%oYZVUmfS?BK(K}>gQ#AkVHSsON8hF>gPBs;}7P3^W9(1KRK82uK^H5zxH#)#`v9p zf%2!x&iFS01G#T>FusvNzxH#K^T)vPK<>|FFo%PM-#(A=>HPhH+~1tf_})SI=kH;B z-c9t2U-uCFn9Q$tKXnLx7U$P6Z~Eo`8P1PK%;E+p|7(l-IP4ey>qGEw48iZ_e2E3q z&wpVtW6=Ex1GSIMOBnw=@*lF1e(B4;S3bkolDkw8FlZHJGkh2)!wF%yH=z^mkvEn) zAn|uGd^il)1oP_%pZH#mHxb_=&`#hFf#ZPB0J|3o!uNsafQ`UIKs4Q~gAA=6ASQ4Y z7w`wbEZ|PyRN%|N6DWr&U^5V7LDoKo)>XiLpq&h@shpm{X(Oj`?-1FuYB()$8f!V( z{bh#M4q!FHIRcywe-AUXHgfY_+`NXHmvZxmxcLfh9>0M38^h4riFQE#o&%D;DicX9Jo+&qh$r*iWd+`JS0 zE`@iQp|ufMMd{+0%W(#92JB5`XdMHjdU_50dI|6lko-Bw(3%M(f5veXIC?QokU!@c zT04N`&mQ1<;6p(2X9YuRdpc_;bwFwl*+9yNc|gjC!x)z+oH~w09J7EFP9{U^3?PN0 z0Tu&0Fy2u(Cm34ef#lB(G)BTx9NU4At7IKzXsrg4I}bza3gBz7KLgkdoD9TJon>NZ zjR&^CJdE?Z(P+uuWsc{882Yo$F|?in9ss``h$%zXQHIt=R9^C@4oL26fS9smRWr11 z=H^AfDKK|2w65UhSwIWSGZ|V_x%pJ!WSCE8Xf<;4cp#>nSuqT)8X(2%1}bYZ%&#-F zW&$Z*=|GCt44@hOsSK@9au8}^9>)0^pb31c^gwGTDlfV70w==!JVR?cklY>N{6oMA z;2&gY-3Ro5-^ls9f#boiV`#16d=KYu295*2f}ypD^H%{WUAe#{@Ut0Ovw)N?8<66c z3QPol21Dx@ZXN?nfO#ZCYd0z#*}o1n!u%RT>nU#D0W`q;1Vd{xH*W&!Vcy8l>fz>_ zfn#A_!O;2;H_ru*fq6DV>kJ^JV;pca%#94KV}O*7NFc>a0*(S-!_aySm7B~j14qK# z%h1}v&D(+TFh9!Bx{sST0^?x5hoRNO%{K!_z`TN?^&xJK!KM@!^vo@I@mKYw2lFWgN|oty^hBE3Z_8U7(RRm zNbVznTG$I?Xw5>SCG*SU1YsD=y$r2;fZJid0*x{Z_z)T&*;@e&g}q#c)=o4&**%cV zy$r3V(D*2RCmC9s(dZ~X`xrjljmAd)?*o$iCLqPDk)d@mu!h1z&jy z54ewGBk;$dcL5&(R&euF;5yJ=G|aKsCp-lF z5zq--155|L2)v2LPyAHiqrhx5`g-6v;FG{>XzU?KXD35z2k-@$hXFM(ml#^p(fEl@ zWoRuzBPZI$(AtQ`P4pgy)|0~--NDd$Gm_EW46TznZQ}GpsLbSk1w-pDR8pdA7+Q~_ z(h+@xq4gRn8_}H%tz$SH&*{ui#-GQ~8VOvBbV)t<6BH2m2U4yaM}LWW2iky-0aH0n

    >A+1$tx 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 Date: Sat, 14 Sep 2024 10:03:04 +1100 Subject: [PATCH 114/320] [mem]: Adjust the docs on the buddy allocator --- core/mem/allocators.odin | 205 ++++++++++++++++++++++++++++++++++++--- core/mem/doc.odin | 5 + 2 files changed, 197 insertions(+), 13 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index f1e45d1a1..4b5efbacb 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -112,6 +112,12 @@ allocation occupies the next adjacent region of memory in the buffer. Since arena allocator does not keep track of any metadata associated with the allocations and their locations, it is impossible to free individual allocations. + +The arena allocator can be used for temporary allocations in frame-based memory +management. Games are one example of such applications. A global arena can be +used for any temporary memory allocations, and at the end of each frame all +temporary allocations are freed. Since no temporary object is going to live +longer than a frame, no lifetimes are violated. */ @(require_results) arena_allocator :: proc(arena: ^Arena) -> Allocator { @@ -423,7 +429,7 @@ scratch_alloc_bytes :: proc( } /* -Allocate memory from scratch allocator. +Allocate non-initialized memory from scratch allocator. This procedure allocates `size` bytes of memory aligned on a boundary specified by `alignment`. The allocated memory region is not explicitly zero-initialized. @@ -441,7 +447,7 @@ scratch_alloc_non_zeroed :: proc( } /* -Allocate memory from scratch allocator. +Allocate non-initialized memory from scratch allocator. This procedure allocates `size` bytes of memory aligned on a boundary specified by `alignment`. The allocated memory region is not explicitly zero-initialized. @@ -499,7 +505,7 @@ scratch_alloc_bytes_non_zeroed :: proc( } /* -Free memory to scratch allocator. +Free memory to the scratch allocator. This procedure frees the memory region allocated at pointer `ptr`. @@ -1176,14 +1182,6 @@ Each subsequent allocation will get the next adjacent memory region. The metadata is stored in the allocation headers, that are located before the start of each allocated memory region. Each header contains the amount of padding bytes between that header and end of the previous allocation. - -## Properties - -**Performance characteristics**: TODO - -**Has a backing allocator**: No - -**Saves metadata**: Allocation header before each allocation. */ @(require_results) small_stack_allocator :: proc(stack: ^Small_Stack) -> Allocator { @@ -1608,6 +1606,9 @@ dynamic_arena_allocator :: proc(a: ^Dynamic_Arena) -> Allocator { /* Destroy a dynamic arena. + +This procedure frees all allocations, made on a dynamic arena, including the +unused blocks, as well as the arrays for storing blocks. */ dynamic_arena_destroy :: proc(a: ^Dynamic_Arena) { dynamic_arena_free_all(a) @@ -1646,12 +1647,28 @@ _dynamic_arena_cycle_new_block :: proc(a: ^Dynamic_Arena, loc := #caller_locatio return } +/* +Allocate memory from a dynamic arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from a dynamic arena `a`. The allocated memory is +zero-initialized. This procedure returns a pointer to the newly allocated memory +region. +*/ @(private, require_results) dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { data, err := dynamic_arena_alloc_bytes(a, size, loc) return raw_data(data), err } +/* +Allocate memory from a dynamic arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from a dynamic arena `a`. The allocated memory is +zero-initialized. This procedure returns a slice of the newly allocated memory +region. +*/ @(require_results) dynamic_arena_alloc_bytes :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { bytes, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) @@ -1661,12 +1678,28 @@ dynamic_arena_alloc_bytes :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_l return bytes, err } +/* +Allocate non-initialized memory from a dynamic arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from a dynamic arena `a`. The allocated memory is not explicitly +zero-initialized. This procedure returns a pointer to the newly allocated +memory region. +*/ @(require_results) dynamic_arena_alloc_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) return raw_data(data), err } +/* +Allocate non-initialized memory from a dynamic arena. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment` from a dynamic arena `a`. The allocated memory is not explicitly +zero-initialized. This procedure returns a slice of the newly allocated +memory region. +*/ @(require_results) dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { n := align_formula(size, a.alignment) @@ -1696,6 +1729,12 @@ dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc : return ([^]byte)(memory)[:size], nil } +/* +Reset the dynamic arena. + +This procedure frees all the allocations, owned by the dynamic arena, excluding +the unused blocks. +*/ dynamic_arena_reset :: proc(a: ^Dynamic_Arena, loc := #caller_location) { if a.current_block != nil { append(&a.unused_blocks, a.current_block, loc=loc) @@ -1712,6 +1751,12 @@ dynamic_arena_reset :: proc(a: ^Dynamic_Arena, loc := #caller_location) { a.bytes_left = 0 // Make new allocations call `_dynamic_arena_cycle_new_block` again. } +/* +Free all memory from a dynamic arena. + +This procedure frees all the allocations, owned by the dynamic arena, including +the unused blocks. +*/ dynamic_arena_free_all :: proc(a: ^Dynamic_Arena, loc := #caller_location) { dynamic_arena_reset(a) for block in a.unused_blocks { @@ -1720,6 +1765,22 @@ dynamic_arena_free_all :: proc(a: ^Dynamic_Arena, loc := #caller_location) { clear(&a.unused_blocks) } +/* +Resize an allocation. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `dynamic_arena_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `dynamic_arena_free()`, freeing +the memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) dynamic_arena_resize :: proc( a: ^Dynamic_Arena, @@ -1732,6 +1793,22 @@ dynamic_arena_resize :: proc( return raw_data(bytes), err } +/* +Resize an allocation. + +This procedure resizes a memory region, specified by `old_data`, to have a size +`size` and alignment `alignment`. The newly allocated memory, if any is +zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `dynamic_arena_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `dynamic_arena_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) dynamic_arena_resize_bytes :: proc( a: ^Dynamic_Arena, @@ -1750,6 +1827,22 @@ dynamic_arena_resize_bytes :: proc( return bytes, err } +/* +Resize an allocation without zero-initialization. + +This procedure resizes a memory region, defined by its location, `old_memory`, +and its size, `old_size` to have a size `size` and alignment `alignment`. The +newly allocated memory, if any is not explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `dynamic_arena_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `dynamic_arena_free()`, freeing the +memory region located at an address specified by `old_memory`. + +This procedure returns the pointer to the resized memory region. +*/ @(require_results) dynamic_arena_resize_non_zeroed :: proc( a: ^Dynamic_Arena, @@ -1762,6 +1855,22 @@ dynamic_arena_resize_non_zeroed :: proc( return raw_data(bytes), err } +/* +Resize an allocation. + +This procedure resizes a memory region, specified by `old_data`, to have a size +`size` and alignment `alignment`. The newly allocated memory, if any is not +explicitly zero-initialized. + +If `old_memory` is `nil`, this procedure acts just like `dynamic_arena_alloc()`, +allocating a memory region `size` bytes in size, aligned on a boundary specified +by `alignment`. + +If `size` is 0, this procedure acts just like `dynamic_arena_free()`, freeing +the memory region located at an address specified by `old_memory`. + +This procedure returns the slice of the resized memory region. +*/ @(require_results) dynamic_arena_resize_bytes_non_zeroed :: proc( a: ^Dynamic_Arena, @@ -1823,17 +1932,25 @@ dynamic_arena_allocator_proc :: proc( } - +/* +Header of the buddy block. +*/ Buddy_Block :: struct #align(align_of(uint)) { size: uint, is_free: bool, } +/* +Obtain the next buddy block. +*/ @(require_results) buddy_block_next :: proc(block: ^Buddy_Block) -> ^Buddy_Block { return (^Buddy_Block)(([^]byte)(block)[block.size:]) } +/* +Split the block into two, by truncating the given block to a given size. +*/ @(require_results) buddy_block_split :: proc(block: ^Buddy_Block, size: uint) -> ^Buddy_Block { block := block @@ -1854,6 +1971,9 @@ buddy_block_split :: proc(block: ^Buddy_Block, size: uint) -> ^Buddy_Block { return nil } +/* +Coalesce contiguous blocks in a range of blocks into one. +*/ buddy_block_coalescence :: proc(head, tail: ^Buddy_Block) { for { // Keep looping until there are no more buddies to coalesce @@ -1887,6 +2007,9 @@ buddy_block_coalescence :: proc(head, tail: ^Buddy_Block) { } } +/* +Find the best block for storing a given size in a range of blocks. +*/ @(require_results) buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Block { assert(size != 0) @@ -1945,6 +2068,9 @@ buddy_block_find_best :: proc(head, tail: ^Buddy_Block, size: uint) -> ^Buddy_Bl return nil } +/* +The buddy allocator data. +*/ Buddy_Allocator :: struct { head: ^Buddy_Block, tail: ^Buddy_Block, @@ -1954,7 +2080,12 @@ Buddy_Allocator :: struct { /* Buddy allocator. -TODO +The buddy allocator is a type of allocator that splits the backing buffer into +multiple regions called buddy blocks. Initially, the allocator only has one +block with the size of the backing buffer. Upon each allocation, the allocator +finds the smallest block that can fit the size of requested memory region, and +splits the block according to the allocation size. If no block can be found, +the contiguous free blocks are coalesced and the search is performed again. */ @(require_results) buddy_allocator :: proc(b: ^Buddy_Allocator) -> Allocator { @@ -1964,6 +2095,12 @@ buddy_allocator :: proc(b: ^Buddy_Allocator) -> Allocator { } } +/* +Initialize the buddy allocator. + +This procedure initializes the buddy allocator `b` with a backing buffer `data` +and block alignment specified by `alignment`. +*/ buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint, loc := #caller_location) { assert(data != nil) assert(is_power_of_two(uintptr(len(data))), "Size of the backing buffer must be power of two", loc) @@ -1981,6 +2118,9 @@ buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint, b.alignment = alignment } +/* +Get required block size to fit in the allocation as well as the alignment padding. +*/ @(require_results) buddy_block_size_required :: proc(b: ^Buddy_Allocator, size: uint) -> uint { size := size @@ -1993,12 +2133,26 @@ buddy_block_size_required :: proc(b: ^Buddy_Allocator, size: uint) -> uint { return actual_size } +/* +Allocate memory from a buddy allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is zero-initialized. This procedure +returns a pointer to the allocated memory region. +*/ @(require_results) buddy_allocator_alloc :: proc(b: ^Buddy_Allocator, size: uint) -> (rawptr, Allocator_Error) { bytes, err := buddy_allocator_alloc_bytes(b, size) return raw_data(bytes), err } +/* +Allocate memory from a buddy allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is zero-initialized. This procedure +returns a slice of the allocated memory region. +*/ @(require_results) buddy_allocator_alloc_bytes :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { bytes, err := buddy_allocator_alloc_bytes_non_zeroed(b, size) @@ -2008,12 +2162,26 @@ buddy_allocator_alloc_bytes :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, return bytes, err } +/* +Allocate non-initialized memory from a buddy allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is not explicitly zero-initialized. +This procedure returns a pointer to the allocated memory region. +*/ @(require_results) buddy_allocator_alloc_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) -> (rawptr, Allocator_Error) { bytes, err := buddy_allocator_alloc_bytes_non_zeroed(b, size) return raw_data(bytes), err } +/* +Allocate non-initialized memory from a buddy allocator. + +This procedure allocates `size` bytes of memory aligned on a boundary specified +by `alignment`. The allocated memory region is not explicitly zero-initialized. +This procedure returns a slice of the allocated memory region. +*/ @(require_results) buddy_allocator_alloc_bytes_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) -> ([]byte, Allocator_Error) { if size != 0 { @@ -2034,6 +2202,14 @@ buddy_allocator_alloc_bytes_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint) return nil, nil } +/* +Free memory to the buddy allocator. + +This procedure frees the memory region allocated at pointer `ptr`. + +If `ptr` is not the latest allocation and is not a leaked allocation, this +operation is a no-op. +*/ buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Error { if ptr != nil { if !(b.head <= ptr && ptr <= b.tail) { @@ -2046,6 +2222,9 @@ buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Erro return nil } +/* +Free all memory to the buddy allocator. +*/ buddy_allocator_free_all :: proc(b: ^Buddy_Allocator) { alignment := b.alignment head := ([^]byte)(b.head) diff --git a/core/mem/doc.odin b/core/mem/doc.odin index 5e8bcce6a..98755d797 100644 --- a/core/mem/doc.odin +++ b/core/mem/doc.odin @@ -48,6 +48,11 @@ Operations such as `new`, `free` and `delete` by default will use happens all called procedures will inherit the new context and use the same allocator. +We will define one concept to simplify the description of some allocator-related +procedures, which is ownership. If the memory was allocated via a specific +allocator, that allocator is said to be the *owner* of that memory region. To +note, unlike Rust, in Odin the memory ownership model is not strict. + ## Alignment An address is said to be *aligned to `N` bytes*, if the addresses's numeric From 3ed2ab6e2c18081d80961168a57155e6f31ac573 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 14 Sep 2024 10:18:51 +1100 Subject: [PATCH 115/320] [mem]: Adjust the docs for calc_padding_with_header --- core/mem/alloc.odin | 3 +-- core/mem/mem.odin | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index 5f65e9ebc..fac58daaf 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -1019,8 +1019,7 @@ Default resize procedure. When allocator does not support resize operation, but supports `.Alloc_Non_Zeroed` and `.Free`, this procedure is used to implement allocator's -default behavior on -resize. +default behavior on resize. Unlike `default_resize_align` no new memory is being explicitly zero-initialized. diff --git a/core/mem/mem.odin b/core/mem/mem.odin index b57b18ffc..67ed56c39 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -644,10 +644,26 @@ align_formula :: proc "contextless" (size, align: int) -> int { } /* -Calculate the padding after the pointer with a header. +Calculate the padding for header preceding aligned data. -This procedure returns the next address, following `ptr` and `header_size` -bytes of space that is aligned to a boundary specified by `align`. +This procedure returns the padding, following the specified pointer `ptr` that +will be able to fit in a header of the size `header_size`, immediately +preceding the memory region, aligned on a boundary specified by `align`. See +the following diagram for a visual representation. + + header size + |<------>| + +---+--------+------------- - - - + | HEADER | DATA... + +---+--------+------------- - - - + ^ ^ + |<---------->| + | padding | + ptr aligned ptr + +The function takes in `ptr` and `header_size`, as well as the required +alignment for `DATA`. The return value of the function is the padding between +`ptr` and `aligned_ptr` that will be able to fit the header. */ @(require_results) calc_padding_with_header :: proc "contextless" (ptr: uintptr, align: uintptr, header_size: int) -> int { From 016d1a84d4e09ea06491d9e5a4661e313906e3aa Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 14 Sep 2024 10:46:35 +1100 Subject: [PATCH 116/320] [mem]: Document mutex, rollback stack and tracking allocators --- core/mem/mutex_allocator.odin | 15 +++ core/mem/raw.odin | 46 ++++++--- core/mem/rollback_stack_allocator.odin | 135 ++++++++++++++----------- core/mem/tracking_allocator.odin | 114 ++++++++++++++------- 4 files changed, 197 insertions(+), 113 deletions(-) diff --git a/core/mem/mutex_allocator.odin b/core/mem/mutex_allocator.odin index 1cccc7dac..d2c527fdb 100644 --- a/core/mem/mutex_allocator.odin +++ b/core/mem/mutex_allocator.odin @@ -3,16 +3,31 @@ package mem import "core:sync" +/* +The data for mutex allocator. +*/ Mutex_Allocator :: struct { backing: Allocator, mutex: sync.Mutex, } +/* +Initialize the mutex allocator. + +This procedure initializes the mutex allocator using `backin_allocator` as the +allocator that will be used to pass all allocation requests through. +*/ mutex_allocator_init :: proc(m: ^Mutex_Allocator, backing_allocator: Allocator) { m.backing = backing_allocator m.mutex = {} } +/* +Mutex allocator. + +The mutex allocator is a wrapper for allocators that is used to serialize all +allocator requests across multiple threads. +*/ @(require_results) mutex_allocator :: proc(m: ^Mutex_Allocator) -> Allocator { return Allocator{ diff --git a/core/mem/raw.odin b/core/mem/raw.odin index ab1148cea..41c91555e 100644 --- a/core/mem/raw.odin +++ b/core/mem/raw.odin @@ -4,68 +4,82 @@ import "base:builtin" import "base:runtime" /* -Mamory layout of the `any` type. +Memory layout of the `any` type. */ Raw_Any :: runtime.Raw_Any /* -Mamory layout of the `string` type. +Memory layout of the `string` type. */ Raw_String :: runtime.Raw_String + /* -Mamory layout of the `cstring` type. +Memory layout of the `cstring` type. */ Raw_Cstring :: runtime.Raw_Cstring + /* -Mamory layout of `[]T` types. +Memory layout of `[]T` types. */ Raw_Slice :: runtime.Raw_Slice + /* -Mamory layout of `[dynamic]T` types. +Memory layout of `[dynamic]T` types. */ Raw_Dynamic_Array :: runtime.Raw_Dynamic_Array + /* -Mamory layout of `map[K]V` types. +Memory layout of `map[K]V` types. */ Raw_Map :: runtime.Raw_Map + /* -Mamory layout of `#soa []T` types. +Memory layout of `#soa []T` types. */ Raw_Soa_Pointer :: runtime.Raw_Soa_Pointer + /* -Mamory layout of the `complex32` type. +Memory layout of the `complex32` type. */ Raw_Complex32 :: runtime.Raw_Complex32 + /* -Mamory layout of the `complex64` type. +Memory layout of the `complex64` type. */ Raw_Complex64 :: runtime.Raw_Complex64 + /* -Mamory layout of the `complex128` type. +Memory layout of the `complex128` type. */ Raw_Complex128 :: runtime.Raw_Complex128 + /* -Mamory layout of the `quaternion64` type. +Memory layout of the `quaternion64` type. */ Raw_Quaternion64 :: runtime.Raw_Quaternion64 + /* -Mamory layout of the `quaternion128` type. +Memory layout of the `quaternion128` type. */ Raw_Quaternion128 :: runtime.Raw_Quaternion128 + /* -Mamory layout of the `quaternion256` type. +Memory layout of the `quaternion256` type. */ Raw_Quaternion256 :: runtime.Raw_Quaternion256 + /* -Mamory layout of the `quaternion64` type. +Memory layout of the `quaternion64` type. */ Raw_Quaternion64_Vector_Scalar :: runtime.Raw_Quaternion64_Vector_Scalar + /* -Mamory layout of the `quaternion128` type. +Memory layout of the `quaternion128` type. */ Raw_Quaternion128_Vector_Scalar :: runtime.Raw_Quaternion128_Vector_Scalar + /* -Mamory layout of the `quaternion256` type. +Memory layout of the `quaternion256` type. */ Raw_Quaternion256_Vector_Scalar :: runtime.Raw_Quaternion256_Vector_Scalar diff --git a/core/mem/rollback_stack_allocator.odin b/core/mem/rollback_stack_allocator.odin index 761435552..61ec73546 100644 --- a/core/mem/rollback_stack_allocator.odin +++ b/core/mem/rollback_stack_allocator.odin @@ -1,39 +1,15 @@ package mem -/* -The Rollback Stack Allocator was designed for the test runner to be fast, -able to grow, and respect the Tracking Allocator's requirement for -individual frees. It is not overly concerned with fragmentation, however. - -It has support for expansion when configured with a block allocator and -limited support for out-of-order frees. - -Allocation has constant-time best and usual case performance. -At worst, it is linear according to the number of memory blocks. - -Allocation follows a first-fit strategy when there are multiple memory -blocks. - -Freeing has constant-time best and usual case performance. -At worst, it is linear according to the number of memory blocks and number -of freed items preceding the last item in a block. - -Resizing has constant-time performance, if it's the last item in a block, or -the new size is smaller. Naturally, this becomes linear-time if there are -multiple blocks to search for the pointer's owning block. Otherwise, the -allocator defaults to a combined alloc & free operation internally. - -Out-of-order freeing is accomplished by collapsing a run of freed items -from the last allocation backwards. - -Each allocation has an overhead of 8 bytes and any extra bytes to satisfy -the requested alignment. -*/ import "base:runtime" +/* +Rollback stack default block size. +*/ ROLLBACK_STACK_DEFAULT_BLOCK_SIZE :: 4 * Megabyte /* +Rollback stack max head block size. + This limitation is due to the size of `prev_ptr`, but it is only for the head block; any allocation in excess of the allocator's `block_size` is valid, so long as the block allocator can handle it. @@ -43,12 +19,18 @@ within is freed; they are immediately returned to the block allocator. */ ROLLBACK_STACK_MAX_HEAD_BLOCK_SIZE :: 2 * Gigabyte +/* +Allocation header of the rollback stack allocator. +*/ Rollback_Stack_Header :: bit_field u64 { prev_offset: uintptr | 32, is_free: bool | 1, prev_ptr: uintptr | 31, } +/* +Block header of the rollback stack allocator. +*/ Rollback_Stack_Block :: struct { next_block: ^Rollback_Stack_Block, last_alloc: rawptr, @@ -56,6 +38,9 @@ Rollback_Stack_Block :: struct { buffer: []byte, } +/* +Rollback stack allocator data. +*/ Rollback_Stack :: struct { head: ^Rollback_Stack_Block, block_size: int, @@ -111,6 +96,9 @@ rb_rollback_block :: proc(block: ^Rollback_Stack_Block, header: ^Rollback_Stack_ } } +/* +Free memory to a rollback stack allocator. +*/ @(private="file", require_results) rb_free :: proc(stack: ^Rollback_Stack, ptr: rawptr) -> Allocator_Error { parent, block, header := rb_find_ptr(stack, ptr) or_return @@ -129,6 +117,9 @@ rb_free :: proc(stack: ^Rollback_Stack, ptr: rawptr) -> Allocator_Error { return nil } +/* +Free all memory owned by the rollback stack allocator. +*/ @(private="file") rb_free_all :: proc(stack: ^Rollback_Stack) { for block := stack.head.next_block; block != nil; /**/ { @@ -142,14 +133,16 @@ rb_free_all :: proc(stack: ^Rollback_Stack) { stack.head.offset = 0 } +/* +Resize an allocation made on a rollback stack allocator. +*/ @(private="file", require_results) -rb_resize :: proc(stack: ^Rollback_Stack, ptr: rawptr, old_size, size, alignment: int) -> (result: []byte, err: Allocator_Error) { +rb_resize_non_zeroed :: proc(stack: ^Rollback_Stack, ptr: rawptr, old_size, size, alignment: int) -> (result: []byte, err: Allocator_Error) { if ptr != nil { if block, _, ok := rb_find_last_alloc(stack, ptr); ok { // `block.offset` should never underflow because it is contingent // on `old_size` in the first place, assuming sane arguments. assert(block.offset >= cast(uintptr)old_size, "Rollback Stack Allocator received invalid `old_size`.") - if block.offset + cast(uintptr)size - cast(uintptr)old_size < cast(uintptr)len(block.buffer) { // Prevent singleton allocations from fragmenting by forbidding // them to shrink, removing the possibility of overflow bugs. @@ -160,27 +153,26 @@ rb_resize :: proc(stack: ^Rollback_Stack, ptr: rawptr, old_size, size, alignment } } } - - result = rb_alloc(stack, size, alignment) or_return + result = rb_alloc_non_zeroed(stack, size, alignment) or_return runtime.mem_copy_non_overlapping(raw_data(result), ptr, old_size) err = rb_free(stack, ptr) - return } +/* +Allocate memory using the rollback stack allocator. +*/ @(private="file", require_results) -rb_alloc :: proc(stack: ^Rollback_Stack, size, alignment: int) -> (result: []byte, err: Allocator_Error) { +rb_alloc_non_zeroed :: proc(stack: ^Rollback_Stack, size, alignment: int) -> (result: []byte, err: Allocator_Error) { parent: ^Rollback_Stack_Block for block := stack.head; /**/; block = block.next_block { when !ODIN_DISABLE_ASSERT { allocated_new_block: bool } - if block == nil { if stack.block_allocator.procedure == nil { return nil, .Out_Of_Memory } - minimum_size_required := size_of(Rollback_Stack_Header) + size + alignment - 1 new_block_size := max(minimum_size_required, stack.block_size) block = rb_make_block(new_block_size, stack.block_allocator) or_return @@ -189,10 +181,8 @@ rb_alloc :: proc(stack: ^Rollback_Stack, size, alignment: int) -> (result: []byt allocated_new_block = true } } - start := raw_data(block.buffer)[block.offset:] padding := cast(uintptr)calc_padding_with_header(cast(uintptr)start, cast(uintptr)alignment, size_of(Rollback_Stack_Header)) - if block.offset + padding + cast(uintptr)size > cast(uintptr)len(block.buffer) { when !ODIN_DISABLE_ASSERT { if allocated_new_block { @@ -202,54 +192,50 @@ rb_alloc :: proc(stack: ^Rollback_Stack, size, alignment: int) -> (result: []byt parent = block continue } - header := cast(^Rollback_Stack_Header)(start[padding - size_of(Rollback_Stack_Header):]) ptr := start[padding:] - header^ = { prev_offset = block.offset, prev_ptr = uintptr(0) if block.last_alloc == nil else cast(uintptr)block.last_alloc - cast(uintptr)raw_data(block.buffer), is_free = false, } - block.last_alloc = ptr block.offset += padding + cast(uintptr)size - if len(block.buffer) > stack.block_size { // This block exceeds the allocator's standard block size and is considered a singleton. // Prevent any further allocations on it. block.offset = cast(uintptr)len(block.buffer) } - #no_bounds_check return ptr[:size], nil } - return nil, .Out_Of_Memory } @(private="file", require_results) rb_make_block :: proc(size: int, allocator: Allocator) -> (block: ^Rollback_Stack_Block, err: Allocator_Error) { buffer := runtime.mem_alloc(size_of(Rollback_Stack_Block) + size, align_of(Rollback_Stack_Block), allocator) or_return - block = cast(^Rollback_Stack_Block)raw_data(buffer) #no_bounds_check block.buffer = buffer[size_of(Rollback_Stack_Block):] return } - +/* +Initialize the rollback stack allocator using a fixed backing buffer. +*/ rollback_stack_init_buffered :: proc(stack: ^Rollback_Stack, buffer: []byte, location := #caller_location) { MIN_SIZE :: size_of(Rollback_Stack_Block) + size_of(Rollback_Stack_Header) + size_of(rawptr) assert(len(buffer) >= MIN_SIZE, "User-provided buffer to Rollback Stack Allocator is too small.", location) - block := cast(^Rollback_Stack_Block)raw_data(buffer) block^ = {} #no_bounds_check block.buffer = buffer[size_of(Rollback_Stack_Block):] - stack^ = {} stack.head = block stack.block_size = len(block.buffer) } +/* +Initialize the rollback stack alocator using a backing block allocator. +*/ rollback_stack_init_dynamic :: proc( stack: ^Rollback_Stack, block_size : int = ROLLBACK_STACK_DEFAULT_BLOCK_SIZE, @@ -262,22 +248,25 @@ rollback_stack_init_dynamic :: proc( // size is insufficient; check only on platforms with big enough ints. assert(block_size <= ROLLBACK_STACK_MAX_HEAD_BLOCK_SIZE, "Rollback Stack Allocators cannot support head blocks larger than 2 gigabytes.", location) } - block := rb_make_block(block_size, block_allocator) or_return - stack^ = {} stack.head = block stack.block_size = block_size stack.block_allocator = block_allocator - return nil } +/* +Initialize the rollback stack. +*/ rollback_stack_init :: proc { rollback_stack_init_buffered, rollback_stack_init_dynamic, } +/* +Destroy a rollback stack. +*/ rollback_stack_destroy :: proc(stack: ^Rollback_Stack) { if stack.block_allocator.procedure != nil { rb_free_all(stack) @@ -286,6 +275,37 @@ rollback_stack_destroy :: proc(stack: ^Rollback_Stack) { stack^ = {} } +/* +Rollback stack allocator. + +The Rollback Stack Allocator was designed for the test runner to be fast, +able to grow, and respect the Tracking Allocator's requirement for +individual frees. It is not overly concerned with fragmentation, however. + +It has support for expansion when configured with a block allocator and +limited support for out-of-order frees. + +Allocation has constant-time best and usual case performance. +At worst, it is linear according to the number of memory blocks. + +Allocation follows a first-fit strategy when there are multiple memory +blocks. + +Freeing has constant-time best and usual case performance. +At worst, it is linear according to the number of memory blocks and number +of freed items preceding the last item in a block. + +Resizing has constant-time performance, if it's the last item in a block, or +the new size is smaller. Naturally, this becomes linear-time if there are +multiple blocks to search for the pointer's owning block. Otherwise, the +allocator defaults to a combined alloc & free operation internally. + +Out-of-order freeing is accomplished by collapsing a run of freed items +from the last allocation backwards. + +Each allocation has an overhead of 8 bytes and any extra bytes to satisfy +the requested alignment. +*/ @(require_results) rollback_stack_allocator :: proc(stack: ^Rollback_Stack) -> Allocator { return Allocator { @@ -309,38 +329,31 @@ rollback_stack_allocator_proc :: proc( case .Alloc, .Alloc_Non_Zeroed: assert(size >= 0, "Size must be positive or zero.", location) assert(is_power_of_two(cast(uintptr)alignment), "Alignment must be a power of two.", location) - result = rb_alloc(stack, size, alignment) or_return - + result = rb_alloc_non_zeroed(stack, size, alignment) or_return if mode == .Alloc { zero_slice(result) } - case .Free: err = rb_free(stack, old_memory) case .Free_All: rb_free_all(stack) - case .Resize, .Resize_Non_Zeroed: assert(size >= 0, "Size must be positive or zero.", location) assert(old_size >= 0, "Old size must be positive or zero.", location) assert(is_power_of_two(cast(uintptr)alignment), "Alignment must be a power of two.", location) - result = rb_resize(stack, old_memory, old_size, size, alignment) or_return - + result = rb_resize_non_zeroed(stack, old_memory, old_size, size, alignment) or_return #no_bounds_check if mode == .Resize && size > old_size { zero_slice(result[old_size:]) } - case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { set^ = {.Alloc, .Alloc_Non_Zeroed, .Free, .Free_All, .Resize, .Resize_Non_Zeroed} } return nil, nil - case .Query_Info: return nil, .Mode_Not_Implemented } - return } diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index e75844130..e436fcb6d 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -4,50 +4,38 @@ package mem import "base:runtime" import "core:sync" +/* +Allocation entry for the tracking allocator. + +This structure stores the data related to an allocation. +*/ Tracking_Allocator_Entry :: struct { - memory: rawptr, - size: int, + // Pointer to an allocated region. + memory: rawptr, + // Size of the allocated memory region. + size: int, + // Requested alignment. alignment: int, - mode: Allocator_Mode, - err: Allocator_Error, + // Mode of the operation. + mode: Allocator_Mode, + // Error. + err: Allocator_Error, + // Location of the allocation. location: runtime.Source_Code_Location, } +/* +Bad free entry for a tracking allocator. +*/ Tracking_Allocator_Bad_Free_Entry :: struct { - memory: rawptr, + // Pointer, on which free operation was called. + memory: rawptr, + // The source location of where the operation was called. location: runtime.Source_Code_Location, } /* -An example of how to use the `Tracking_Allocator` to track subsequent allocations -in your program and report leaks and bad frees: - -Example: - - package foo - - import "core:mem" - import "core:fmt" - - _main :: proc() { - // do stuff - } - - main :: proc() { - track: mem.Tracking_Allocator - mem.tracking_allocator_init(&track, context.allocator) - defer mem.tracking_allocator_destroy(&track) - context.allocator = mem.tracking_allocator(&track) - - _main() - - for _, leak in track.allocation_map { - fmt.printf("%v leaked %m\n", leak.location, leak.size) - } - for bad_free in track.bad_free_array { - fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) - } - } +Tracking allocator data. */ Tracking_Allocator :: struct { backing: Allocator, @@ -63,6 +51,13 @@ Tracking_Allocator :: struct { current_memory_allocated: i64, } +/* +Initialize the tracking allocator. + +This procedure initializes the tracking allocator `t` with a backing allocator +specified with `backing_allocator`. The `internals_allocator` will used to +allocate the tracked data. +*/ tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Allocator, internals_allocator := context.allocator) { t.backing = backing_allocator t.allocation_map.allocator = internals_allocator @@ -72,12 +67,22 @@ tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Alloc } } +/* +Destroy the tracking allocator. +*/ tracking_allocator_destroy :: proc(t: ^Tracking_Allocator) { delete(t.allocation_map) delete(t.bad_free_array) } -// Clear only the current allocation data while keeping the totals intact. +/* +Clear the tracking allocator. + +This procedure clears the tracked data from a tracking allocator. + +**Note**: This procedure clears only the current allocation data while keeping +the totals intact. +*/ tracking_allocator_clear :: proc(t: ^Tracking_Allocator) { sync.mutex_lock(&t.mutex) clear(&t.allocation_map) @@ -86,7 +91,11 @@ tracking_allocator_clear :: proc(t: ^Tracking_Allocator) { sync.mutex_unlock(&t.mutex) } -// Reset all of a Tracking Allocator's allocation data back to zero. +/* +Reset the tracking allocator. + +Reset all of a Tracking Allocator's allocation data back to zero. +*/ tracking_allocator_reset :: proc(t: ^Tracking_Allocator) { sync.mutex_lock(&t.mutex) clear(&t.allocation_map) @@ -100,6 +109,39 @@ tracking_allocator_reset :: proc(t: ^Tracking_Allocator) { sync.mutex_unlock(&t.mutex) } +/* +Tracking allocator. + +The tracking allocator is an allocator wrapper that tracks memory allocations. +This allocator stores all the allocations in a map. Whenever a pointer that's +not inside of the map is freed, the `bad_free_array` entry is added. + +An example of how to use the `Tracking_Allocator` to track subsequent allocations +in your program and report leaks and bad frees: + +Example: + + package foo + + import "core:mem" + import "core:fmt" + + main :: proc() { + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + defer mem.tracking_allocator_destroy(&track) + context.allocator = mem.tracking_allocator(&track) + + do_stuff() + + for _, leak in track.allocation_map { + fmt.printf("%v leaked %m\n", leak.location, leak.size) + } + for bad_free in track.bad_free_array { + fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) + } + } +*/ @(require_results) tracking_allocator :: proc(data: ^Tracking_Allocator) -> Allocator { return Allocator{ From 466e29bb38040ce8737e125a8a13c97cd4e74252 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 14 Sep 2024 12:13:56 +1100 Subject: [PATCH 117/320] [mem]: Rollback allocator API consistency --- core/mem/rollback_stack_allocator.odin | 205 ++++++++++++++++++++----- 1 file changed, 163 insertions(+), 42 deletions(-) diff --git a/core/mem/rollback_stack_allocator.odin b/core/mem/rollback_stack_allocator.odin index 61ec73546..43ef10fe9 100644 --- a/core/mem/rollback_stack_allocator.odin +++ b/core/mem/rollback_stack_allocator.odin @@ -134,36 +134,65 @@ rb_free_all :: proc(stack: ^Rollback_Stack) { } /* -Resize an allocation made on a rollback stack allocator. +Allocate memory using the rollback stack allocator. */ -@(private="file", require_results) -rb_resize_non_zeroed :: proc(stack: ^Rollback_Stack, ptr: rawptr, old_size, size, alignment: int) -> (result: []byte, err: Allocator_Error) { - if ptr != nil { - if block, _, ok := rb_find_last_alloc(stack, ptr); ok { - // `block.offset` should never underflow because it is contingent - // on `old_size` in the first place, assuming sane arguments. - assert(block.offset >= cast(uintptr)old_size, "Rollback Stack Allocator received invalid `old_size`.") - if block.offset + cast(uintptr)size - cast(uintptr)old_size < cast(uintptr)len(block.buffer) { - // Prevent singleton allocations from fragmenting by forbidding - // them to shrink, removing the possibility of overflow bugs. - if len(block.buffer) <= stack.block_size { - block.offset += cast(uintptr)size - cast(uintptr)old_size - } - #no_bounds_check return (cast([^]byte)ptr)[:size], nil - } - } +@(require_results) +rb_alloc :: proc( + stack: ^Rollback_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := rb_alloc_bytes_non_zeroed(stack, size, alignment, loc) + if bytes != nil { + zero_slice(bytes) } - result = rb_alloc_non_zeroed(stack, size, alignment) or_return - runtime.mem_copy_non_overlapping(raw_data(result), ptr, old_size) - err = rb_free(stack, ptr) - return + return raw_data(bytes), err } /* Allocate memory using the rollback stack allocator. */ -@(private="file", require_results) -rb_alloc_non_zeroed :: proc(stack: ^Rollback_Stack, size, alignment: int) -> (result: []byte, err: Allocator_Error) { +@(require_results) +rb_alloc_bytes :: proc( + stack: ^Rollback_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]byte, Allocator_Error) { + bytes, err := rb_alloc_bytes_non_zeroed(stack, size, alignment, loc) + if bytes != nil { + zero_slice(bytes) + } + return bytes, err +} + +/* +Allocate non-initialized memory using the rollback stack allocator. +*/ +@(require_results) +rb_alloc_non_zeroed :: proc( + stack: ^Rollback_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := rb_alloc_bytes_non_zeroed(stack, size, alignment, loc) + return raw_data(bytes), err +} + +/* +Allocate non-initialized memory using the rollback stack allocator. +*/ +@(require_results) +rb_alloc_bytes_non_zeroed :: proc( + stack: ^Rollback_Stack, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (result: []byte, err: Allocator_Error) { + assert(size >= 0, "Size must be positive or zero.", loc) + assert(is_power_of_two(cast(uintptr)alignment), "Alignment must be a power of two.", loc) parent: ^Rollback_Stack_Block for block := stack.head; /**/; block = block.next_block { when !ODIN_DISABLE_ASSERT { @@ -211,6 +240,106 @@ rb_alloc_non_zeroed :: proc(stack: ^Rollback_Stack, size, alignment: int) -> (re return nil, .Out_Of_Memory } +/* +Resize an allocation owned by rollback stack allocator. +*/ +@(require_results) +rb_resize :: proc( + stack: ^Rollback_Stack, + old_ptr: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := rb_resize_bytes_non_zeroed(stack, byte_slice(old_ptr, old_size), size, alignment, loc) + if bytes != nil { + if old_ptr == nil { + zero_slice(bytes) + } else if size > old_size { + zero_slice(bytes[old_size:]) + } + } + return raw_data(bytes), err +} + +/* +Resize an allocation owned by rollback stack allocator. +*/ +@(require_results) +rb_resize_bytes :: proc( + stack: ^Rollback_Stack, + old_memory: []byte, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> ([]u8, Allocator_Error) { + bytes, err := rb_resize_bytes_non_zeroed(stack, old_memory, size, alignment, loc) + if bytes != nil { + if old_memory == nil { + zero_slice(bytes) + } else if size > len(old_memory) { + zero_slice(bytes[len(old_memory):]) + } + } + return bytes, err +} + +/* +Resize an allocation owned by rollback stack allocator without explicit +zero-initialization. +*/ +@(require_results) +rb_resize_non_zeroed :: proc( + stack: ^Rollback_Stack, + old_ptr: rawptr, + old_size: int, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (rawptr, Allocator_Error) { + bytes, err := rb_resize_bytes_non_zeroed(stack, byte_slice(old_ptr, old_size), size, alignment, loc) + return raw_data(bytes), err +} + +/* +Resize an allocation owned by rollback stack allocator without explicit +zero-initialization. +*/ +@(require_results) +rb_resize_bytes_non_zeroed :: proc( + stack: ^Rollback_Stack, + old_memory: []byte, + size: int, + alignment := DEFAULT_ALIGNMENT, + loc := #caller_location, +) -> (result: []byte, err: Allocator_Error) { + old_size := len(old_memory) + ptr := raw_data(old_memory) + assert(size >= 0, "Size must be positive or zero.", loc) + assert(old_size >= 0, "Old size must be positive or zero.", loc) + assert(is_power_of_two(cast(uintptr)alignment), "Alignment must be a power of two.", loc) + if ptr != nil { + if block, _, ok := rb_find_last_alloc(stack, ptr); ok { + // `block.offset` should never underflow because it is contingent + // on `old_size` in the first place, assuming sane arguments. + assert(block.offset >= cast(uintptr)old_size, "Rollback Stack Allocator received invalid `old_size`.") + if block.offset + cast(uintptr)size - cast(uintptr)old_size < cast(uintptr)len(block.buffer) { + // Prevent singleton allocations from fragmenting by forbidding + // them to shrink, removing the possibility of overflow bugs. + if len(block.buffer) <= stack.block_size { + block.offset += cast(uintptr)size - cast(uintptr)old_size + } + #no_bounds_check return (ptr)[:size], nil + } + } + } + result = rb_alloc_bytes_non_zeroed(stack, size, alignment) or_return + runtime.mem_copy_non_overlapping(raw_data(result), ptr, old_size) + err = rb_free(stack, ptr) + return +} + @(private="file", require_results) rb_make_block :: proc(size: int, allocator: Allocator) -> (block: ^Rollback_Stack_Block, err: Allocator_Error) { buffer := runtime.mem_alloc(size_of(Rollback_Stack_Block) + size, align_of(Rollback_Stack_Block), allocator) or_return @@ -321,31 +450,23 @@ rollback_stack_allocator_proc :: proc( size, alignment: int, old_memory: rawptr, old_size: int, - location := #caller_location, + loc := #caller_location, ) -> (result: []byte, err: Allocator_Error) { stack := cast(^Rollback_Stack)allocator_data - switch mode { - case .Alloc, .Alloc_Non_Zeroed: - assert(size >= 0, "Size must be positive or zero.", location) - assert(is_power_of_two(cast(uintptr)alignment), "Alignment must be a power of two.", location) - result = rb_alloc_non_zeroed(stack, size, alignment) or_return - if mode == .Alloc { - zero_slice(result) - } + case .Alloc: + return rb_alloc_bytes(stack, size, alignment, loc) + case .Alloc_Non_Zeroed: + return rb_alloc_bytes_non_zeroed(stack, size, alignment, loc) case .Free: - err = rb_free(stack, old_memory) - + return nil, rb_free(stack, old_memory) case .Free_All: rb_free_all(stack) - case .Resize, .Resize_Non_Zeroed: - assert(size >= 0, "Size must be positive or zero.", location) - assert(old_size >= 0, "Old size must be positive or zero.", location) - assert(is_power_of_two(cast(uintptr)alignment), "Alignment must be a power of two.", location) - result = rb_resize_non_zeroed(stack, old_memory, old_size, size, alignment) or_return - #no_bounds_check if mode == .Resize && size > old_size { - zero_slice(result[old_size:]) - } + return nil, nil + case .Resize: + return rb_resize_bytes(stack, byte_slice(old_memory, old_size), size, alignment, loc) + case .Resize_Non_Zeroed: + return rb_resize_bytes_non_zeroed(stack, byte_slice(old_memory, old_size), size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { From 8b84b9a4a26d7f2fb07a7e5dcd49b678d1c9be91 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 14 Sep 2024 14:32:46 +0200 Subject: [PATCH 118/320] Docs are generated as expected again. --- src/parser.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 51da21e9d..523dad8b8 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6388,9 +6388,13 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { String filepath = f->tokenizer.fullpath; String base_dir = dir_from_path(filepath); + if (f->curr_token.kind == Token_Comment) { + consume_comment_groups(f, f->prev_token); + } - Array tags = array_make(ast_allocator(f)); + CommentGroup *docs = f->lead_comment; + Array tags = array_make(temporary_allocator()); bool first_invalid_token_set = false; Token first_invalid_token = {}; @@ -6410,8 +6414,6 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } } - CommentGroup *docs = f->lead_comment; - if (f->curr_token.kind != Token_package) { ERROR_BLOCK(); @@ -6451,6 +6453,8 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } f->package_name = package_name.string; + // TODO: Shouldn't single file only matter for build tags? no-instrumentation for example + // should be respected even when in single file mode. if (!f->pkg->is_single_file) { if (docs != nullptr && docs->list.count > 0) { for (Token const &tok : docs->list) { @@ -6485,8 +6489,6 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { } } - array_free(&tags); - Ast *pd = ast_package_decl(f, f->package_token, package_name, docs, f->line_comment); expect_semicolon(f); f->pkg_decl = pd; From c24e18bf1063cd86c200d51d585059f8aa099615 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 14 Sep 2024 14:36:33 +0200 Subject: [PATCH 119/320] Fix incorrect syntax error in parse_file --- src/parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.cpp b/src/parser.cpp index 523dad8b8..22d92e87b 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6432,7 +6432,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) { // There was an OK package declaration. But there some invalid token was hit before the package declaration. if (first_invalid_token_set) { - syntax_error(first_invalid_token, "There can only be lines starting with '#+' or '//' before package declaration"); + syntax_error(first_invalid_token, "Expected only comments or lines starting with '#+' before the package declaration"); return false; } From 4f3f256375e3ae7e9ac0420fa41a7e6cead4ad72 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 14 Sep 2024 15:52:37 +0200 Subject: [PATCH 120/320] improve bit field debug info --- src/llvm_backend_debug.cpp | 80 +++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 68e1efc1c..bb6a1ba4f 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -552,6 +552,48 @@ gb_internal LLVMMetadataRef lb_debug_bitset(lbModule *m, Type *type, String name return final_decl; } +gb_internal LLVMMetadataRef lb_debug_bitfield(lbModule *m, Type *type, String name, LLVMMetadataRef scope, LLVMMetadataRef file, unsigned line) { + Type *bt = base_type(type); + GB_ASSERT(bt->kind == Type_BitField); + + lb_debug_file_line(m, bt->BitField.node, &file, &line); + + u64 size_in_bits = 8*type_size_of(bt); + u32 align_in_bits = 8*cast(u32)type_align_of(bt); + + unsigned element_count = cast(unsigned)bt->BitField.fields.count; + LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count); + + u64 offset_in_bits = 0; + for (unsigned i = 0; i < element_count; i++) { + Entity *f = bt->BitField.fields[i]; + u8 bit_size = bt->BitField.bit_sizes[i]; + GB_ASSERT(f->kind == Entity_Variable); + String name = f->token.string; + elements[i] = LLVMDIBuilderCreateBitFieldMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, line, + bit_size, offset_in_bits, offset_in_bits, + LLVMDIFlagZero, lb_debug_type(m, f->type) + ); + + offset_in_bits += bit_size; + } + + LLVMMetadataRef final_decl = LLVMDIBuilderCreateStructType( + m->debug_builder, scope, + cast(char const *)name.text, cast(size_t)name.len, + file, line, + size_in_bits, align_in_bits, + LLVMDIFlagZero, + nullptr, + elements, element_count, + 0, + nullptr, + "", 0 + ); + lb_set_llvm_metadata(m, type, final_decl); + return final_decl; +} + gb_internal LLVMMetadataRef lb_debug_enum(lbModule *m, Type *type, String name, LLVMMetadataRef scope, LLVMMetadataRef file, unsigned line) { Type *bt = base_type(type); GB_ASSERT(bt->kind == Type_Enum); @@ -816,6 +858,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { case Type_Union: return lb_debug_union( m, type, make_string_c(type_to_string(type, temporary_allocator())), nullptr, nullptr, 0); case Type_BitSet: return lb_debug_bitset( m, type, make_string_c(type_to_string(type, temporary_allocator())), nullptr, nullptr, 0); case Type_Enum: return lb_debug_enum( m, type, make_string_c(type_to_string(type, temporary_allocator())), nullptr, nullptr, 0); + case Type_BitField: return lb_debug_bitfield( m, type, make_string_c(type_to_string(type, temporary_allocator())), nullptr, nullptr, 0); case Type_Tuple: if (type->Tuple.variables.count == 1) { @@ -901,42 +944,6 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) { lb_debug_type(m, type->Matrix.elem), subscripts, gb_count_of(subscripts)); } - - case Type_BitField: { - LLVMMetadataRef parent_scope = nullptr; - LLVMMetadataRef scope = nullptr; - LLVMMetadataRef file = nullptr; - unsigned line = 0; - u64 size_in_bits = 8*cast(u64)type_size_of(type); - u32 align_in_bits = 8*cast(u32)type_align_of(type); - LLVMDIFlags flags = LLVMDIFlagZero; - - unsigned element_count = cast(unsigned)type->BitField.fields.count; - LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count); - - u64 offset_in_bits = 0; - for (unsigned i = 0; i < element_count; i++) { - Entity *f = type->BitField.fields[i]; - u8 bit_size = type->BitField.bit_sizes[i]; - GB_ASSERT(f->kind == Entity_Variable); - String name = f->token.string; - unsigned field_line = 0; - LLVMDIFlags field_flags = LLVMDIFlagZero; - elements[i] = LLVMDIBuilderCreateBitFieldMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, field_line, - bit_size, offset_in_bits, offset_in_bits, - field_flags, lb_debug_type(m, f->type) - ); - - offset_in_bits += bit_size; - } - - - return LLVMDIBuilderCreateStructType(m->debug_builder, parent_scope, "", 0, file, line, - size_in_bits, align_in_bits, flags, - nullptr, elements, element_count, 0, nullptr, - "", 0 - ); - } } GB_PANIC("Invalid type %s", type_to_string(type)); @@ -1022,6 +1029,7 @@ gb_internal LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) { case Type_Union: return lb_debug_union(m, type, name, scope, file, line); case Type_BitSet: return lb_debug_bitset(m, type, name, scope, file, line); case Type_Enum: return lb_debug_enum(m, type, name, scope, file, line); + case Type_BitField: return lb_debug_bitfield(m, type, name, scope, file, line); } } From b12d3124085058bc36f2e8feb5666a0c1f162343 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 14 Sep 2024 17:59:50 +0200 Subject: [PATCH 121/320] core/odin: Added new file tag syntax as token. parse_file stores a list of tags that the file tag parser can use later. --- core/odin/ast/ast.odin | 1 + core/odin/parser/file_tags.odin | 39 ++++++++++++++++++++++-------- core/odin/parser/parse_files.odin | 4 +-- core/odin/parser/parser.odin | 31 +++++++++++++++++++++--- core/odin/tokenizer/token.odin | 2 ++ core/odin/tokenizer/tokenizer.odin | 20 +++++++++++++++ 6 files changed, 81 insertions(+), 16 deletions(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 9088da0ea..d67eb31f3 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -69,6 +69,7 @@ File :: struct { fullpath: string, src: string, + tags: [dynamic]tokenizer.Token, docs: ^Comment_Group, pkg_decl: ^Package_Decl, diff --git a/core/odin/parser/file_tags.odin b/core/odin/parser/file_tags.odin index b12c3b5fd..e2a07f8fb 100644 --- a/core/odin/parser/file_tags.odin +++ b/core/odin/parser/file_tags.odin @@ -51,7 +51,7 @@ get_build_arch_from_string :: proc(str: string) -> runtime.Odin_Arch_Type { parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags: File_Tags) { context.allocator = allocator - if file.docs == nil { + if file.docs == nil && file.tags == nil { return } @@ -95,11 +95,9 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags build_project_names: [dynamic][]string defer shrink(&build_project_names) - for comment in file.docs.list { - if len(comment.text) < 3 || comment.text[:2] != "//" { - continue - } - text := comment.text[2:] + parse_tag :: proc(text: string, tags: ^File_Tags, build_kinds: ^[dynamic]Build_Kind, + build_project_name_strings: ^[dynamic]string, + build_project_names: ^[dynamic][]string) { i := 0 skip_whitespace(text, &i) @@ -124,7 +122,7 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags groups_loop: for { index_start := len(build_project_name_strings) - defer append(&build_project_names, build_project_name_strings[index_start:]) + defer append(build_project_names, build_project_name_strings[index_start:]) for { skip_whitespace(text, &i) @@ -143,10 +141,10 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags } scan_value(text, &i) - append(&build_project_name_strings, text[name_start:i]) + append(build_project_name_strings, text[name_start:i]) } - append(&build_project_names, build_project_name_strings[index_start:]) + append(build_project_names, build_project_name_strings[index_start:]) } case "build": kinds_loop: for { @@ -156,7 +154,7 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags arch_positive: runtime.Odin_Arch_Types arch_negative: runtime.Odin_Arch_Types - defer append(&build_kinds, Build_Kind{ + defer append(build_kinds, Build_Kind{ os = (os_positive == {} ? runtime.ALL_ODIN_OS_TYPES : os_positive) -os_negative, arch = (arch_positive == {} ? runtime.ALL_ODIN_ARCH_TYPES : arch_positive)-arch_negative, }) @@ -200,6 +198,27 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags } } + if file.docs != nil { + for comment in file.docs.list { + if len(comment.text) < 3 || comment.text[:2] != "//" { + continue + } + text := comment.text[2:] + + parse_tag(text, &tags, &build_kinds, &build_project_name_strings, &build_project_names) + } + } + + for tag in file.tags { + if len(tag.text) < 3 || tag.text[:2] != "#+" { + continue + } + // Only skip # because parse_tag skips the plus + text := tag.text[1:] + + parse_tag(text, &tags, &build_kinds, &build_project_name_strings, &build_project_names) + } + tags.build = build_kinds[:] tags.build_project_name = build_project_names[:] diff --git a/core/odin/parser/parse_files.odin b/core/odin/parser/parse_files.odin index 5f455c749..d4e532ec7 100644 --- a/core/odin/parser/parse_files.odin +++ b/core/odin/parser/parse_files.odin @@ -77,9 +77,7 @@ parse_package :: proc(pkg: ^ast.Package, p: ^Parser = nil) -> bool { if !parse_file(p, file) { ok = false } - if file.pkg_decl == nil { - error(p, p.curr_tok.pos, "Expected a package declaration at the start of the file") - } else if pkg.name == "" { + if pkg.name == "" { pkg.name = file.pkg_decl.name } else if pkg.name != file.pkg_decl.name { error(p, file.pkg_decl.pos, "different package name, expected '%s', got '%s'", pkg.name, file.pkg_decl.name) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index aab59c29d..9dfca40b5 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -161,11 +161,36 @@ parse_file :: proc(p: ^Parser, file: ^ast.File) -> bool { docs := p.lead_comment - p.file.pkg_token = expect_token(p, .Package) - if p.file.pkg_token.kind != .Package { - return false + invalid_pre_package_token: Maybe(tokenizer.Token) + + for p.curr_tok.kind != .Package && p.curr_tok.kind != .EOF { + if p.curr_tok.kind == .Comment { + consume_comment_groups(p, p.prev_tok) + } else if p.curr_tok.kind == .File_Tag { + append(&p.file.tags, p.curr_tok) + advance_token(p) + } else { + if invalid_pre_package_token == nil { + invalid_pre_package_token = p.curr_tok + } + + advance_token(p) + } } + if p.curr_tok.kind != .Package { + t := invalid_pre_package_token.? or_else p.curr_tok + error(p, t.pos, "Expected a package declaration at the start of the file") + return false + } + + p.file.pkg_token = expect_token(p, .Package) + + if ippt, ok := invalid_pre_package_token.?; ok { + error(p, ippt.pos, "Expected only comments or lines starting with '#+' before the package declaration") + return false + } + pkg_name := expect_token_after(p, .Ident, "package") if pkg_name.kind == .Ident { switch name := pkg_name.text; { diff --git a/core/odin/tokenizer/token.odin b/core/odin/tokenizer/token.odin index cd8953841..48d08f127 100644 --- a/core/odin/tokenizer/token.odin +++ b/core/odin/tokenizer/token.odin @@ -32,6 +32,7 @@ Token_Kind :: enum u32 { Invalid, EOF, Comment, + File_Tag, B_Literal_Begin, Ident, // main @@ -166,6 +167,7 @@ tokens := [Token_Kind.COUNT]string { "Invalid", "EOF", "Comment", + "FileTag", "", "identifier", diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index 62170aa10..c3a30581c 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -206,6 +206,23 @@ scan_comment :: proc(t: ^Tokenizer) -> string { return string(lit) } +scan_file_tag :: proc(t: ^Tokenizer) -> string { + offset := t.offset - 1 + + for t.ch != '\n' { + if t.ch == '/' { + next := peek_byte(t, 0) + + if next == '/' || next == '*' { + break + } + } + advance_rune(t) + } + + return string(t.src[offset : t.offset]) +} + scan_identifier :: proc(t: ^Tokenizer) -> string { offset := t.offset @@ -636,6 +653,9 @@ scan :: proc(t: ^Tokenizer) -> Token { if t.ch == '!' { kind = .Comment lit = scan_comment(t) + } else if t.ch == '+' { + kind = .File_Tag + lit = scan_file_tag(t) } case '/': kind = .Quo From af94c4ab32c4a5efa68124804ce003a2ded0b8a4 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 14 Sep 2024 10:06:25 -0600 Subject: [PATCH 122/320] Add initial POSIX support for Linux for wordexp. --- core/sys/posix/wordexp.odin | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/sys/posix/wordexp.odin b/core/sys/posix/wordexp.odin index d730db0f7..6bb362625 100644 --- a/core/sys/posix/wordexp.odin +++ b/core/sys/posix/wordexp.odin @@ -102,6 +102,27 @@ when ODIN_OS == .Darwin { WRDE_NOSPACE :: 4 WRDE_SYNTAX :: 6 +} else when ODIN_OS == .Linux { + + wordexp_t :: struct { + we_wordc: c.size_t, /* [PSX] count of words matched by words */ + we_wordv: [^]cstring, /* [PSX] pointer to list of expanded words */ + we_offs: c.size_t, /* [PSX] slots to reserve at the beginning of we_wordv */ + } + + WRDE_DOOFFS :: 1 << 0 /* Insert PWORDEXP->we_offs NULLs. */ + WRDE_APPEND :: 1 << 1 /* Append to results of a previous call. */ + WRDE_NOCMD :: 1 << 2 /* Don't do command substitution. */ + WRDE_REUSE :: 1 << 3 /* Reuse storage in PWORDEXP. */ + WRDE_SHOWERR :: 1 << 4 /* Don't redirect stderr to /dev/null. */ + WRDE_UNDEF :: 1 << 5 /* Error for expanding undefined variables. */ + + WRDE_NOSPACE :: 1 + WRDE_BADCHAR :: 2 + WRDE_BADVAL :: 3 + WRDE_CMDSUB :: 4 + WRDE_SYNTAX :: 5 + } else { #panic("posix is unimplemented for the current target") } From 19f0127e553940bb333f61ab7e8dab6f7455115e Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 14 Sep 2024 18:27:49 +0200 Subject: [PATCH 123/320] Moved all packages in core, base, vendor, tests and examples to use new #+ file tag syntax. --- base/intrinsics/intrinsics.odin | 2 +- base/runtime/core.odin | 2 +- base/runtime/entry_unix.odin | 6 ++--- base/runtime/entry_wasm.odin | 6 ++--- base/runtime/entry_windows.odin | 6 ++--- base/runtime/heap_allocator_orca.odin | 4 ++-- base/runtime/heap_allocator_other.odin | 4 ++-- base/runtime/heap_allocator_unix.odin | 4 ++-- base/runtime/internal.odin | 2 +- base/runtime/os_specific_bsd.odin | 4 ++-- base/runtime/os_specific_darwin.odin | 4 ++-- base/runtime/os_specific_freestanding.odin | 4 ++-- base/runtime/os_specific_haiku.odin | 4 ++-- base/runtime/os_specific_js.odin | 4 ++-- base/runtime/os_specific_linux.odin | 2 +- base/runtime/os_specific_orca.odin | 4 ++-- base/runtime/os_specific_wasi.odin | 4 ++-- base/runtime/os_specific_windows.odin | 4 ++-- base/runtime/procs_darwin.odin | 2 +- base/runtime/procs_js.odin | 2 +- base/runtime/procs_wasm.odin | 2 +- base/runtime/procs_windows_amd64.odin | 4 ++-- base/runtime/procs_windows_i386.odin | 4 ++-- base/runtime/wasm_allocator.odin | 2 +- core/compress/zlib/zlib.odin | 2 +- core/crypto/_aes/hw_intel/api.odin | 2 +- core/crypto/_aes/hw_intel/ghash.odin | 2 +- .../_aes/hw_intel/hw_intel_keysched.odin | 2 +- .../_chacha20/simd256/chacha20_simd256.odin | 2 +- .../simd256/chacha20_simd256_stub.odin | 2 +- core/crypto/aes/aes_ctr_hw_intel.odin | 2 +- core/crypto/aes/aes_ecb_hw_intel.odin | 2 +- core/crypto/aes/aes_gcm_hw_intel.odin | 2 +- core/crypto/aes/aes_impl_hw_gen.odin | 2 +- core/crypto/aes/aes_impl_hw_intel.odin | 2 +- core/crypto/rand_bsd.odin | 2 +- core/crypto/rand_generic.odin | 14 ++++++------ core/debug/trace/trace_cpp.odin | 4 ++-- core/debug/trace/trace_nil.odin | 6 ++--- core/debug/trace/trace_windows.odin | 4 ++-- core/dynlib/lib_js.odin | 4 ++-- core/dynlib/lib_unix.odin | 4 ++-- core/dynlib/lib_windows.odin | 4 ++-- core/flags/errors_bsd.odin | 2 +- core/flags/errors_nonbsd.odin | 4 ++-- core/flags/internal_assignment.odin | 2 +- core/flags/internal_parsing.odin | 2 +- core/flags/internal_rtti.odin | 2 +- core/flags/internal_rtti_nonbsd.odin | 6 ++--- core/flags/internal_validation.odin | 2 +- core/fmt/example.odin | 2 +- core/fmt/fmt_js.odin | 2 +- core/fmt/fmt_os.odin | 6 ++--- core/image/bmp/bmp_js.odin | 2 +- core/image/bmp/bmp_os.odin | 2 +- core/image/general_js.odin | 2 +- core/image/general_os.odin | 2 +- core/image/netpbm/netpbm.odin | 2 +- core/image/netpbm/netpbm_js.odin | 2 +- core/image/netpbm/netpbm_os.odin | 2 +- core/image/png/png.odin | 2 +- core/image/png/png_js.odin | 2 +- core/image/png/png_os.odin | 2 +- core/image/qoi/qoi_js.odin | 2 +- core/image/qoi/qoi_os.odin | 2 +- core/image/tga/tga_js.odin | 2 +- core/image/tga/tga_os.odin | 2 +- core/log/file_console_logger.odin | 4 ++-- core/math/big/tune.odin | 2 +- core/math/math_basic.odin | 2 +- core/math/math_basic_js.odin | 2 +- core/math/noise/internal.odin | 2 +- core/mem/mutex_allocator.odin | 2 +- core/mem/tracking_allocator.odin | 2 +- core/mem/virtual/virtual_linux.odin | 4 ++-- core/mem/virtual/virtual_other.odin | 14 ++++++------ core/mem/virtual/virtual_platform.odin | 2 +- core/mem/virtual/virtual_posix.odin | 4 ++-- core/mem/virtual/virtual_windows.odin | 4 ++-- core/net/addr.odin | 2 +- core/net/common.odin | 2 +- core/net/dns.odin | 2 +- core/net/dns_unix.odin | 2 +- core/net/dns_windows.odin | 2 +- core/net/errors_darwin.odin | 2 +- core/net/errors_freebsd.odin | 2 +- core/net/errors_linux.odin | 2 +- core/net/errors_windows.odin | 2 +- core/net/interface.odin | 2 +- core/net/interface_darwin.odin | 2 +- core/net/interface_freebsd.odin | 2 +- core/net/interface_linux.odin | 2 +- core/net/interface_windows.odin | 2 +- core/net/socket.odin | 2 +- core/net/socket_darwin.odin | 2 +- core/net/socket_freebsd.odin | 2 +- core/net/socket_linux.odin | 2 +- core/net/socket_windows.odin | 2 +- core/os/dir_unix.odin | 2 +- core/os/os2/allocators.odin | 2 +- core/os/os2/dir_linux.odin | 2 +- core/os/os2/dir_posix.odin | 4 ++-- core/os/os2/dir_windows.odin | 2 +- core/os/os2/env_linux.odin | 2 +- core/os/os2/env_posix.odin | 4 ++-- core/os/os2/env_windows.odin | 2 +- core/os/os2/errors_linux.odin | 2 +- core/os/os2/errors_posix.odin | 4 ++-- core/os/os2/errors_windows.odin | 2 +- core/os/os2/file_linux.odin | 2 +- core/os/os2/file_posix.odin | 4 ++-- core/os/os2/file_posix_darwin.odin | 2 +- core/os/os2/file_posix_freebsd.odin | 2 +- core/os/os2/file_posix_netbsd.odin | 2 +- core/os/os2/file_posix_other.odin | 4 ++-- core/os/os2/file_windows.odin | 2 +- core/os/os2/heap_linux.odin | 2 +- core/os/os2/heap_posix.odin | 4 ++-- core/os/os2/heap_windows.odin | 2 +- core/os/os2/internal_util.odin | 2 +- core/os/os2/path_linux.odin | 2 +- core/os/os2/path_posix.odin | 4 ++-- core/os/os2/path_windows.odin | 2 +- core/os/os2/pipe_linux.odin | 2 +- core/os/os2/pipe_posix.odin | 4 ++-- core/os/os2/pipe_windows.odin | 2 +- core/os/os2/process_linux.odin | 4 ++-- core/os/os2/process_posix.odin | 4 ++-- core/os/os2/process_posix_darwin.odin | 2 +- core/os/os2/process_posix_other.odin | 4 ++-- core/os/os2/process_windows.odin | 2 +- core/os/os2/stat_linux.odin | 2 +- core/os/os2/stat_posix.odin | 4 ++-- core/os/os2/stat_windows.odin | 2 +- core/os/os2/temp_file_linux.odin | 2 +- core/os/os2/temp_file_posix.odin | 4 ++-- core/os/os2/temp_file_windows.odin | 2 +- core/os/os_freestanding.odin | 2 +- core/os/os_js.odin | 2 +- core/os/os_windows.odin | 2 +- core/os/stat_unix.odin | 2 +- core/path/filepath/path_unix.odin | 2 +- core/prof/spall/spall_linux.odin | 4 ++-- core/prof/spall/spall_unix.odin | 4 ++-- core/prof/spall/spall_windows.odin | 4 ++-- core/simd/x86/abm.odin | 2 +- core/simd/x86/adx.odin | 2 +- core/simd/x86/aes.odin | 2 +- core/simd/x86/cmpxchg16b.odin | 2 +- core/simd/x86/fxsr.odin | 2 +- core/simd/x86/pclmulqdq.odin | 2 +- core/simd/x86/rdtsc.odin | 2 +- core/simd/x86/sha.odin | 2 +- core/simd/x86/sse.odin | 2 +- core/simd/x86/sse2.odin | 2 +- core/simd/x86/sse3.odin | 2 +- core/simd/x86/sse41.odin | 2 +- core/simd/x86/sse42.odin | 2 +- core/simd/x86/ssse3.odin | 2 +- core/simd/x86/types.odin | 2 +- core/slice/sort_private.odin | 2 +- core/sync/futex_darwin.odin | 4 ++-- core/sync/futex_freebsd.odin | 4 ++-- core/sync/futex_haiku.odin | 2 +- core/sync/futex_linux.odin | 4 ++-- core/sync/futex_netbsd.odin | 2 +- core/sync/futex_openbsd.odin | 4 ++-- core/sync/futex_wasm.odin | 4 ++-- core/sync/futex_windows.odin | 4 ++-- core/sync/primitives_darwin.odin | 4 ++-- core/sync/primitives_freebsd.odin | 4 ++-- core/sync/primitives_haiku.odin | 2 +- core/sync/primitives_internal.odin | 2 +- core/sync/primitives_linux.odin | 4 ++-- core/sync/primitives_netbsd.odin | 2 +- core/sync/primitives_openbsd.odin | 4 ++-- core/sync/primitives_wasm.odin | 4 ++-- core/sync/primitives_windows.odin | 4 ++-- core/sys/darwin/darwin.odin | 2 +- core/sys/haiku/errors.odin | 2 +- core/sys/haiku/find_directory.odin | 2 +- core/sys/haiku/os.odin | 2 +- core/sys/haiku/types.odin | 2 +- core/sys/info/cpu_arm.odin | 2 +- core/sys/info/cpu_intel.odin | 2 +- core/sys/info/cpu_linux_arm.odin | 4 ++-- core/sys/info/cpu_linux_riscv64.odin | 4 ++-- core/sys/info/platform_bsd.odin | 2 +- core/sys/kqueue/kqueue.odin | 2 +- core/sys/linux/helpers.odin | 4 ++-- core/sys/linux/sys.odin | 2 +- core/sys/linux/syscall_amd64.odin | 2 +- core/sys/linux/syscall_arm32.odin | 2 +- core/sys/linux/syscall_arm64.odin | 2 +- core/sys/linux/syscall_i386.odin | 2 +- core/sys/linux/syscall_riscv64.odin | 2 +- core/sys/linux/wrappers.odin | 2 +- core/sys/unix/pthread_darwin.odin | 2 +- core/sys/unix/pthread_freebsd.odin | 2 +- core/sys/unix/pthread_linux.odin | 2 +- core/sys/unix/pthread_openbsd.odin | 2 +- core/sys/unix/pthread_unix.odin | 2 +- core/sys/unix/sysctl_darwin.odin | 2 +- core/sys/unix/sysctl_freebsd.odin | 2 +- core/sys/unix/sysctl_openbsd.odin | 2 +- core/sys/valgrind/callgrind.odin | 2 +- core/sys/valgrind/helgrind.odin | 2 +- core/sys/valgrind/memcheck.odin | 2 +- core/sys/valgrind/valgrind.odin | 2 +- core/sys/wasm/wasi/wasi_api.odin | 2 +- core/sys/windows/advapi32.odin | 2 +- core/sys/windows/bcrypt.odin | 2 +- core/sys/windows/bluetooth.odin | 2 +- core/sys/windows/codepage.odin | 2 +- core/sys/windows/comctl32.odin | 2 +- core/sys/windows/comdlg32.odin | 2 +- core/sys/windows/dbghelp.odin | 2 +- core/sys/windows/dnsapi.odin | 2 +- core/sys/windows/dwmapi.odin | 2 +- core/sys/windows/gdi32.odin | 2 +- core/sys/windows/hidpi.odin | 2 +- core/sys/windows/hidusage.odin | 2 +- core/sys/windows/ip_helper.odin | 2 +- core/sys/windows/kernel32.odin | 2 +- core/sys/windows/key_codes.odin | 2 +- core/sys/windows/known_folders.odin | 2 +- core/sys/windows/netapi32.odin | 2 +- core/sys/windows/ntdll.odin | 2 +- core/sys/windows/shcore.odin | 2 +- core/sys/windows/shell32.odin | 2 +- core/sys/windows/shlwapi.odin | 2 +- core/sys/windows/synchronization.odin | 2 +- core/sys/windows/system_params.odin | 2 +- core/sys/windows/tlhelp.odin | 2 +- core/sys/windows/user32.odin | 2 +- core/sys/windows/userenv.odin | 2 +- core/sys/windows/util.odin | 2 +- core/sys/windows/ux_theme.odin | 2 +- core/sys/windows/wgl.odin | 2 +- core/sys/windows/wglext.odin | 2 +- core/sys/windows/window_messages.odin | 2 +- core/sys/windows/winerror.odin | 2 +- core/sys/windows/winmm.odin | 2 +- core/sys/windows/winnls.odin | 2 +- core/sys/windows/winver.odin | 2 +- core/sys/windows/wow64_apiset.odin | 2 +- core/sys/windows/ws2_32.odin | 2 +- core/testing/events.odin | 2 +- core/testing/logging.odin | 2 +- core/testing/reporting.odin | 2 +- core/testing/runner.odin | 2 +- core/testing/signal_handler.odin | 2 +- core/testing/signal_handler_libc.odin | 4 ++-- core/testing/signal_handler_other.odin | 16 +++++++------- core/thread/thread_other.odin | 2 +- core/thread/thread_unix.odin | 4 ++-- core/thread/thread_windows.odin | 4 ++-- core/time/datetime/internal.odin | 2 +- core/time/time_essence.odin | 2 +- core/time/time_js.odin | 4 ++-- core/time/time_orca.odin | 4 ++-- core/time/time_other.odin | 22 +++++++++---------- core/time/time_unix.odin | 4 ++-- core/time/time_wasi.odin | 4 ++-- core/time/time_windows.odin | 2 +- core/time/tsc_darwin.odin | 2 +- core/time/tsc_freebsd.odin | 4 ++-- core/time/tsc_linux.odin | 4 ++-- examples/all/all_experimental.odin | 2 +- examples/all/all_linux.odin | 2 +- examples/all/all_posix.odin | 2 +- examples/demo/demo.odin | 2 +- tests/core/net/test_core_net.odin | 4 ++-- tests/core/net/test_core_net_freebsd.odin | 2 +- tests/core/odin/test_file_tags.odin | 16 +++++++------- tests/core/sys/posix/posix.odin | 2 +- tests/core/sys/posix/structs.odin | 2 +- tests/core/sys/windows/test_clipboard.odin | 2 +- tests/core/sys/windows/test_kernel32.odin | 2 +- tests/core/sys/windows/test_ole32.odin | 2 +- tests/core/sys/windows/test_user32.odin | 2 +- tests/core/sys/windows/test_windows.odin | 2 +- .../sys/windows/test_windows_generated.odin | 2 +- tests/core/sys/windows/test_winerror.odin | 2 +- tests/vendor/glfw/test_vendor_glfw.odin | 2 +- tests/vendor/lua/5.4/test_vendor_lua.5.4.odin | 2 +- vendor/ENet/unix.odin | 2 +- vendor/ENet/win32.odin | 2 +- vendor/commonmark/doc.odin | 2 +- vendor/directx/dxc/dxcdef_unix.odin | 2 +- vendor/directx/dxc/dxcdef_windows.odin | 2 +- vendor/egl/egl.odin | 2 +- vendor/fontstash/fontstash.odin | 2 +- vendor/fontstash/fontstash_os.odin | 2 +- vendor/fontstash/fontstash_other.odin | 2 +- vendor/glfw/native_darwin.odin | 2 +- vendor/glfw/native_linux.odin | 2 +- vendor/glfw/native_windows.odin | 2 +- vendor/miniaudio/common_unix.odin | 2 +- vendor/nanovg/gl/gl.odin | 2 +- vendor/nanovg/nanovg.odin | 2 +- vendor/stb/truetype/stb_truetype_wasm.odin | 2 +- vendor/wasm/js/dom.odin | 2 +- vendor/wasm/js/dom_all_targets.odin | 2 +- vendor/wasm/js/events.odin | 2 +- vendor/wasm/js/events_all_targets.odin | 2 +- vendor/wasm/js/general.odin | 2 +- vendor/wasm/js/memory_all_targets.odin | 2 +- vendor/wasm/js/memory_js.odin | 2 +- vendor/wgpu/examples/glfw/os_glfw.odin | 2 +- vendor/wgpu/examples/sdl2/os_sdl2.odin | 2 +- vendor/wgpu/glfwglue/glue.odin | 6 ++--- vendor/wgpu/sdl2glue/glue.odin | 6 ++--- vendor/x11/xlib/xlib_const.odin | 2 +- vendor/x11/xlib/xlib_keysym.odin | 2 +- vendor/x11/xlib/xlib_procs.odin | 2 +- vendor/x11/xlib/xlib_types.odin | 2 +- 317 files changed, 433 insertions(+), 433 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 3cf99bbd2..744a899c0 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -1,5 +1,5 @@ // This is purely for documentation -//+build ignore +#+build ignore package intrinsics // Package-Related diff --git a/base/runtime/core.odin b/base/runtime/core.odin index 90e049b0c..a5a3a4d8c 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -18,7 +18,7 @@ // This could change at a later date if the all these data structures are // implemented within the compiler rather than in this "preload" file // -//+no-instrumentation +#+no-instrumentation package runtime import "base:intrinsics" diff --git a/base/runtime/entry_unix.odin b/base/runtime/entry_unix.odin index 5dfd37f99..e2223d5d6 100644 --- a/base/runtime/entry_unix.odin +++ b/base/runtime/entry_unix.odin @@ -1,6 +1,6 @@ -//+private -//+build linux, darwin, freebsd, openbsd, netbsd, haiku -//+no-instrumentation +#+private +#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+no-instrumentation package runtime import "base:intrinsics" diff --git a/base/runtime/entry_wasm.odin b/base/runtime/entry_wasm.odin index 99cd8201d..52bb0e072 100644 --- a/base/runtime/entry_wasm.odin +++ b/base/runtime/entry_wasm.odin @@ -1,6 +1,6 @@ -//+private -//+build wasm32, wasm64p32 -//+no-instrumentation +#+private +#+build wasm32, wasm64p32 +#+no-instrumentation package runtime import "base:intrinsics" diff --git a/base/runtime/entry_windows.odin b/base/runtime/entry_windows.odin index 1e2dcc21a..8eb4cc7d1 100644 --- a/base/runtime/entry_windows.odin +++ b/base/runtime/entry_windows.odin @@ -1,6 +1,6 @@ -//+private -//+build windows -//+no-instrumentation +#+private +#+build windows +#+no-instrumentation package runtime import "base:intrinsics" diff --git a/base/runtime/heap_allocator_orca.odin b/base/runtime/heap_allocator_orca.odin index 9e719bcd0..be032a207 100644 --- a/base/runtime/heap_allocator_orca.odin +++ b/base/runtime/heap_allocator_orca.odin @@ -1,5 +1,5 @@ -//+build orca -//+private +#+build orca +#+private package runtime foreign { diff --git a/base/runtime/heap_allocator_other.odin b/base/runtime/heap_allocator_other.odin index 8a7ad1a47..507dbf318 100644 --- a/base/runtime/heap_allocator_other.odin +++ b/base/runtime/heap_allocator_other.odin @@ -1,5 +1,5 @@ -//+build js, wasi, freestanding, essence -//+private +#+build js, wasi, freestanding, essence +#+private package runtime _heap_alloc :: proc "contextless" (size: int, zero_memory := true) -> rawptr { diff --git a/base/runtime/heap_allocator_unix.odin b/base/runtime/heap_allocator_unix.odin index 60af9e761..d4590d2dd 100644 --- a/base/runtime/heap_allocator_unix.odin +++ b/base/runtime/heap_allocator_unix.odin @@ -1,5 +1,5 @@ -//+build linux, darwin, freebsd, openbsd, netbsd, haiku -//+private +#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+private package runtime when ODIN_OS == .Darwin { diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index ff60cf547..6905317fc 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -1,4 +1,4 @@ -//+vet !cast +#+vet !cast package runtime import "base:intrinsics" diff --git a/base/runtime/os_specific_bsd.odin b/base/runtime/os_specific_bsd.odin index 46ce51166..5d198484b 100644 --- a/base/runtime/os_specific_bsd.odin +++ b/base/runtime/os_specific_bsd.odin @@ -1,5 +1,5 @@ -//+build freebsd, openbsd, netbsd -//+private +#+build freebsd, openbsd, netbsd +#+private package runtime foreign import libc "system:c" diff --git a/base/runtime/os_specific_darwin.odin b/base/runtime/os_specific_darwin.odin index 1bf29e785..907899d7c 100644 --- a/base/runtime/os_specific_darwin.odin +++ b/base/runtime/os_specific_darwin.odin @@ -1,5 +1,5 @@ -//+build darwin -//+private +#+build darwin +#+private package runtime import "base:intrinsics" diff --git a/base/runtime/os_specific_freestanding.odin b/base/runtime/os_specific_freestanding.odin index 08ca4aa55..f975f61b8 100644 --- a/base/runtime/os_specific_freestanding.odin +++ b/base/runtime/os_specific_freestanding.odin @@ -1,5 +1,5 @@ -//+build freestanding -//+private +#+build freestanding +#+private package runtime // TODO(bill): reimplement `os.write` diff --git a/base/runtime/os_specific_haiku.odin b/base/runtime/os_specific_haiku.odin index f8dafac3d..0d1ec7a03 100644 --- a/base/runtime/os_specific_haiku.odin +++ b/base/runtime/os_specific_haiku.odin @@ -1,5 +1,5 @@ -//+build haiku -//+private +#+build haiku +#+private package runtime foreign import libc "system:c" diff --git a/base/runtime/os_specific_js.odin b/base/runtime/os_specific_js.odin index d35753604..f1d12c808 100644 --- a/base/runtime/os_specific_js.odin +++ b/base/runtime/os_specific_js.odin @@ -1,5 +1,5 @@ -//+build js -//+private +#+build js +#+private package runtime foreign import "odin_env" diff --git a/base/runtime/os_specific_linux.odin b/base/runtime/os_specific_linux.odin index 146e647fb..d7b7371a7 100644 --- a/base/runtime/os_specific_linux.odin +++ b/base/runtime/os_specific_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package runtime import "base:intrinsics" diff --git a/base/runtime/os_specific_orca.odin b/base/runtime/os_specific_orca.odin index b6f5930ab..876d7d44b 100644 --- a/base/runtime/os_specific_orca.odin +++ b/base/runtime/os_specific_orca.odin @@ -1,5 +1,5 @@ -//+build orca -//+private +#+build orca +#+private package runtime import "base:intrinsics" diff --git a/base/runtime/os_specific_wasi.odin b/base/runtime/os_specific_wasi.odin index b85d7adea..aa562050c 100644 --- a/base/runtime/os_specific_wasi.odin +++ b/base/runtime/os_specific_wasi.odin @@ -1,5 +1,5 @@ -//+build wasi -//+private +#+build wasi +#+private package runtime foreign import wasi "wasi_snapshot_preview1" diff --git a/base/runtime/os_specific_windows.odin b/base/runtime/os_specific_windows.odin index 6da569aee..b966193ca 100644 --- a/base/runtime/os_specific_windows.odin +++ b/base/runtime/os_specific_windows.odin @@ -1,5 +1,5 @@ -//+build windows -//+private +#+build windows +#+private package runtime foreign import kernel32 "system:Kernel32.lib" diff --git a/base/runtime/procs_darwin.odin b/base/runtime/procs_darwin.odin index 497978a76..4f4903d47 100644 --- a/base/runtime/procs_darwin.odin +++ b/base/runtime/procs_darwin.odin @@ -1,4 +1,4 @@ -//+private +#+private package runtime foreign import "system:Foundation.framework" diff --git a/base/runtime/procs_js.odin b/base/runtime/procs_js.odin index d3e12410c..58bed808d 100644 --- a/base/runtime/procs_js.odin +++ b/base/runtime/procs_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package runtime init_default_context_for_js: Context diff --git a/base/runtime/procs_wasm.odin b/base/runtime/procs_wasm.odin index 9f2e9befc..8da1564c6 100644 --- a/base/runtime/procs_wasm.odin +++ b/base/runtime/procs_wasm.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package runtime @(private="file") diff --git a/base/runtime/procs_windows_amd64.odin b/base/runtime/procs_windows_amd64.odin index ea495f5fa..81d2cfb5d 100644 --- a/base/runtime/procs_windows_amd64.odin +++ b/base/runtime/procs_windows_amd64.odin @@ -1,5 +1,5 @@ -//+private -//+no-instrumentation +#+private +#+no-instrumentation package runtime foreign import kernel32 "system:Kernel32.lib" diff --git a/base/runtime/procs_windows_i386.odin b/base/runtime/procs_windows_i386.odin index 10422cf07..99c314228 100644 --- a/base/runtime/procs_windows_i386.odin +++ b/base/runtime/procs_windows_i386.odin @@ -1,5 +1,5 @@ -//+private -//+no-instrumentation +#+private +#+no-instrumentation package runtime @require foreign import "system:int64.lib" diff --git a/base/runtime/wasm_allocator.odin b/base/runtime/wasm_allocator.odin index 6bafaa489..574f3dd06 100644 --- a/base/runtime/wasm_allocator.odin +++ b/base/runtime/wasm_allocator.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package runtime import "base:intrinsics" diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index 2dc9e81df..be8a7d7d3 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -1,4 +1,4 @@ -//+vet !using-param +#+vet !using-param package compress_zlib /* diff --git a/core/crypto/_aes/hw_intel/api.odin b/core/crypto/_aes/hw_intel/api.odin index 1796bb093..52669cb35 100644 --- a/core/crypto/_aes/hw_intel/api.odin +++ b/core/crypto/_aes/hw_intel/api.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package aes_hw_intel import "core:sys/info" diff --git a/core/crypto/_aes/hw_intel/ghash.odin b/core/crypto/_aes/hw_intel/ghash.odin index d61e71b3a..4320dd59b 100644 --- a/core/crypto/_aes/hw_intel/ghash.odin +++ b/core/crypto/_aes/hw_intel/ghash.odin @@ -20,7 +20,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//+build amd64 +#+build amd64 package aes_hw_intel import "base:intrinsics" diff --git a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin index 911dffbd5..bdf0d3066 100644 --- a/core/crypto/_aes/hw_intel/hw_intel_keysched.odin +++ b/core/crypto/_aes/hw_intel/hw_intel_keysched.odin @@ -20,7 +20,7 @@ // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -//+build amd64 +#+build amd64 package aes_hw_intel import "base:intrinsics" diff --git a/core/crypto/_chacha20/simd256/chacha20_simd256.odin b/core/crypto/_chacha20/simd256/chacha20_simd256.odin index 10f2d75fe..ccb02a947 100644 --- a/core/crypto/_chacha20/simd256/chacha20_simd256.odin +++ b/core/crypto/_chacha20/simd256/chacha20_simd256.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package chacha20_simd256 import "base:intrinsics" diff --git a/core/crypto/_chacha20/simd256/chacha20_simd256_stub.odin b/core/crypto/_chacha20/simd256/chacha20_simd256_stub.odin index 039d6cb96..ce673b42b 100644 --- a/core/crypto/_chacha20/simd256/chacha20_simd256_stub.odin +++ b/core/crypto/_chacha20/simd256/chacha20_simd256_stub.odin @@ -1,4 +1,4 @@ -//+build !amd64 +#+build !amd64 package chacha20_simd256 import "base:intrinsics" diff --git a/core/crypto/aes/aes_ctr_hw_intel.odin b/core/crypto/aes/aes_ctr_hw_intel.odin index 1c9e815ad..415758b24 100644 --- a/core/crypto/aes/aes_ctr_hw_intel.odin +++ b/core/crypto/aes/aes_ctr_hw_intel.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package aes import "base:intrinsics" diff --git a/core/crypto/aes/aes_ecb_hw_intel.odin b/core/crypto/aes/aes_ecb_hw_intel.odin index b2ff36a0c..f1d44a25f 100644 --- a/core/crypto/aes/aes_ecb_hw_intel.odin +++ b/core/crypto/aes/aes_ecb_hw_intel.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package aes import "base:intrinsics" diff --git a/core/crypto/aes/aes_gcm_hw_intel.odin b/core/crypto/aes/aes_gcm_hw_intel.odin index ffd8ed642..4cb5ab3b2 100644 --- a/core/crypto/aes/aes_gcm_hw_intel.odin +++ b/core/crypto/aes/aes_gcm_hw_intel.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package aes import "base:intrinsics" diff --git a/core/crypto/aes/aes_impl_hw_gen.odin b/core/crypto/aes/aes_impl_hw_gen.odin index 3557b1aae..0c9ec6edc 100644 --- a/core/crypto/aes/aes_impl_hw_gen.odin +++ b/core/crypto/aes/aes_impl_hw_gen.odin @@ -1,4 +1,4 @@ -//+build !amd64 +#+build !amd64 package aes @(private = "file") diff --git a/core/crypto/aes/aes_impl_hw_intel.odin b/core/crypto/aes/aes_impl_hw_intel.odin index 39ea2dc8d..0f1fa6143 100644 --- a/core/crypto/aes/aes_impl_hw_intel.odin +++ b/core/crypto/aes/aes_impl_hw_intel.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package aes import "core:crypto/_aes/hw_intel" diff --git a/core/crypto/rand_bsd.odin b/core/crypto/rand_bsd.odin index 641b72933..78a6fcaaf 100644 --- a/core/crypto/rand_bsd.odin +++ b/core/crypto/rand_bsd.odin @@ -1,4 +1,4 @@ -//+build freebsd, openbsd, netbsd +#+build freebsd, openbsd, netbsd package crypto foreign import libc "system:c" diff --git a/core/crypto/rand_generic.odin b/core/crypto/rand_generic.odin index 46fb881b3..ef578f5c0 100644 --- a/core/crypto/rand_generic.odin +++ b/core/crypto/rand_generic.odin @@ -1,10 +1,10 @@ -//+build !linux -//+build !windows -//+build !openbsd -//+build !freebsd -//+build !netbsd -//+build !darwin -//+build !js +#+build !linux +#+build !windows +#+build !openbsd +#+build !freebsd +#+build !netbsd +#+build !darwin +#+build !js package crypto HAS_RAND_BYTES :: false diff --git a/core/debug/trace/trace_cpp.odin b/core/debug/trace/trace_cpp.odin index dc723184a..8ef377cef 100644 --- a/core/debug/trace/trace_cpp.odin +++ b/core/debug/trace/trace_cpp.odin @@ -1,5 +1,5 @@ -//+private file -//+build linux, darwin +#+private file +#+build linux, darwin package debug_trace import "base:intrinsics" diff --git a/core/debug/trace/trace_nil.odin b/core/debug/trace/trace_nil.odin index ca8bd7817..8ee96720e 100644 --- a/core/debug/trace/trace_nil.odin +++ b/core/debug/trace/trace_nil.odin @@ -1,6 +1,6 @@ -//+build !windows -//+build !linux -//+build !darwin +#+build !windows +#+build !linux +#+build !darwin package debug_trace import "base:runtime" diff --git a/core/debug/trace/trace_windows.odin b/core/debug/trace/trace_windows.odin index de1461e96..c9868e338 100644 --- a/core/debug/trace/trace_windows.odin +++ b/core/debug/trace/trace_windows.odin @@ -1,5 +1,5 @@ -//+private -//+build windows +#+private +#+build windows package debug_trace import "base:intrinsics" diff --git a/core/dynlib/lib_js.odin b/core/dynlib/lib_js.odin index bfc724c12..698cfee9c 100644 --- a/core/dynlib/lib_js.odin +++ b/core/dynlib/lib_js.odin @@ -1,5 +1,5 @@ -//+build js -//+private +#+build js +#+private package dynlib _load_library :: proc(path: string, global_symbols := false) -> (Library, bool) { diff --git a/core/dynlib/lib_unix.odin b/core/dynlib/lib_unix.odin index 8adaadb2d..f467d730d 100644 --- a/core/dynlib/lib_unix.odin +++ b/core/dynlib/lib_unix.odin @@ -1,5 +1,5 @@ -//+build linux, darwin, freebsd, openbsd, netbsd -//+private +#+build linux, darwin, freebsd, openbsd, netbsd +#+private package dynlib import "core:os" diff --git a/core/dynlib/lib_windows.odin b/core/dynlib/lib_windows.odin index b41abe3b2..6c41a1a75 100644 --- a/core/dynlib/lib_windows.odin +++ b/core/dynlib/lib_windows.odin @@ -1,5 +1,5 @@ -//+build windows -//+private +#+build windows +#+private package dynlib import win32 "core:sys/windows" diff --git a/core/flags/errors_bsd.odin b/core/flags/errors_bsd.odin index 1fe6de90b..4d98d2ee4 100644 --- a/core/flags/errors_bsd.odin +++ b/core/flags/errors_bsd.odin @@ -1,4 +1,4 @@ -//+build netbsd, openbsd +#+build netbsd, openbsd package flags import "base:runtime" diff --git a/core/flags/errors_nonbsd.odin b/core/flags/errors_nonbsd.odin index e129aff74..28912b57f 100644 --- a/core/flags/errors_nonbsd.odin +++ b/core/flags/errors_nonbsd.odin @@ -1,5 +1,5 @@ -//+build !netbsd -//+build !openbsd +#+build !netbsd +#+build !openbsd package flags import "base:runtime" diff --git a/core/flags/internal_assignment.odin b/core/flags/internal_assignment.odin index be3997ef1..12ddb876f 100644 --- a/core/flags/internal_assignment.odin +++ b/core/flags/internal_assignment.odin @@ -1,4 +1,4 @@ -//+private +#+private package flags import "base:intrinsics" diff --git a/core/flags/internal_parsing.odin b/core/flags/internal_parsing.odin index 7a769b17c..4e49f45b0 100644 --- a/core/flags/internal_parsing.odin +++ b/core/flags/internal_parsing.odin @@ -1,4 +1,4 @@ -//+private +#+private package flags import "core:container/bit_array" diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index 4c1db5d0b..1c559ca55 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -1,4 +1,4 @@ -//+private +#+private package flags import "base:intrinsics" diff --git a/core/flags/internal_rtti_nonbsd.odin b/core/flags/internal_rtti_nonbsd.odin index 0044898d5..e1286186b 100644 --- a/core/flags/internal_rtti_nonbsd.odin +++ b/core/flags/internal_rtti_nonbsd.odin @@ -1,6 +1,6 @@ -//+private -//+build !netbsd -//+build !openbsd +#+private +#+build !netbsd +#+build !openbsd package flags import "core:net" diff --git a/core/flags/internal_validation.odin b/core/flags/internal_validation.odin index b71cf9fe7..afd05331c 100644 --- a/core/flags/internal_validation.odin +++ b/core/flags/internal_validation.odin @@ -1,4 +1,4 @@ -//+private +#+private package flags @require import "base:runtime" diff --git a/core/fmt/example.odin b/core/fmt/example.odin index 503e64f2b..6929e9be7 100644 --- a/core/fmt/example.odin +++ b/core/fmt/example.odin @@ -1,4 +1,4 @@ -//+build ignore +#+build ignore package custom_formatter_example import "core:fmt" import "core:io" diff --git a/core/fmt/fmt_js.odin b/core/fmt/fmt_js.odin index acf218eb5..ce90fbfe7 100644 --- a/core/fmt/fmt_js.odin +++ b/core/fmt/fmt_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package fmt import "core:bufio" diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin index 9de0d43be..a481061f1 100644 --- a/core/fmt/fmt_os.odin +++ b/core/fmt/fmt_os.odin @@ -1,6 +1,6 @@ -//+build !freestanding -//+build !js -//+build !orca +#+build !freestanding +#+build !js +#+build !orca package fmt import "base:runtime" diff --git a/core/image/bmp/bmp_js.odin b/core/image/bmp/bmp_js.odin index d87a7d2d5..fa5d59095 100644 --- a/core/image/bmp/bmp_js.odin +++ b/core/image/bmp/bmp_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package core_image_bmp load :: proc{load_from_bytes, load_from_context} diff --git a/core/image/bmp/bmp_os.odin b/core/image/bmp/bmp_os.odin index d20abc685..70a85a784 100644 --- a/core/image/bmp/bmp_os.odin +++ b/core/image/bmp/bmp_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package core_image_bmp import "core:os" diff --git a/core/image/general_js.odin b/core/image/general_js.odin index 841d9c200..abf9812c0 100644 --- a/core/image/general_js.odin +++ b/core/image/general_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package image load :: proc{ diff --git a/core/image/general_os.odin b/core/image/general_os.odin index e1fe440a4..98eb5bdbe 100644 --- a/core/image/general_os.odin +++ b/core/image/general_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package image import "core:os" diff --git a/core/image/netpbm/netpbm.odin b/core/image/netpbm/netpbm.odin index ab3945ad7..a9dc6599a 100644 --- a/core/image/netpbm/netpbm.odin +++ b/core/image/netpbm/netpbm.odin @@ -1,4 +1,4 @@ -//+vet !using-stmt +#+vet !using-stmt package netpbm import "core:bytes" diff --git a/core/image/netpbm/netpbm_js.odin b/core/image/netpbm/netpbm_js.odin index 7db17a05d..7d475cf62 100644 --- a/core/image/netpbm/netpbm_js.odin +++ b/core/image/netpbm/netpbm_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package netpbm load :: proc { diff --git a/core/image/netpbm/netpbm_os.odin b/core/image/netpbm/netpbm_os.odin index 609f1ea1f..2cf2439ac 100644 --- a/core/image/netpbm/netpbm_os.odin +++ b/core/image/netpbm/netpbm_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package netpbm import "core:os" diff --git a/core/image/png/png.odin b/core/image/png/png.odin index 02aef1087..2d3665e94 100644 --- a/core/image/png/png.odin +++ b/core/image/png/png.odin @@ -8,7 +8,7 @@ */ -//+vet !using-stmt +#+vet !using-stmt package png import "core:compress" diff --git a/core/image/png/png_js.odin b/core/image/png/png_js.odin index 57c27fc64..dd9e74526 100644 --- a/core/image/png/png_js.odin +++ b/core/image/png/png_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package png load :: proc{load_from_bytes, load_from_context} diff --git a/core/image/png/png_os.odin b/core/image/png/png_os.odin index cc65e7b42..8e0706206 100644 --- a/core/image/png/png_os.odin +++ b/core/image/png/png_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package png import "core:os" diff --git a/core/image/qoi/qoi_js.odin b/core/image/qoi/qoi_js.odin index 2c23cc17a..4a69e98a0 100644 --- a/core/image/qoi/qoi_js.odin +++ b/core/image/qoi/qoi_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package qoi save :: proc{save_to_buffer} diff --git a/core/image/qoi/qoi_os.odin b/core/image/qoi/qoi_os.odin index efcec6c52..c85fdd839 100644 --- a/core/image/qoi/qoi_os.odin +++ b/core/image/qoi/qoi_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package qoi import "core:os" diff --git a/core/image/tga/tga_js.odin b/core/image/tga/tga_js.odin index d98b241a7..9261be8c6 100644 --- a/core/image/tga/tga_js.odin +++ b/core/image/tga/tga_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package tga save :: proc{save_to_buffer} diff --git a/core/image/tga/tga_os.odin b/core/image/tga/tga_os.odin index 12747a684..a78998105 100644 --- a/core/image/tga/tga_os.odin +++ b/core/image/tga/tga_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package tga import "core:os" diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index f05f7a258..e45f99523 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -1,5 +1,5 @@ -//+build !freestanding -//+build !orca +#+build !freestanding +#+build !orca package log import "core:encoding/ansi" diff --git a/core/math/big/tune.odin b/core/math/big/tune.odin index 5938dafde..eab36b951 100644 --- a/core/math/big/tune.odin +++ b/core/math/big/tune.odin @@ -7,7 +7,7 @@ The code started out as an idiomatic source port of libTomMath, which is in the public domain, with thanks. */ -//+build ignore +#+build ignore package math_big import "core:time" diff --git a/core/math/math_basic.odin b/core/math/math_basic.odin index 041efd272..2584df71f 100644 --- a/core/math/math_basic.odin +++ b/core/math/math_basic.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package math import "base:intrinsics" diff --git a/core/math/math_basic_js.odin b/core/math/math_basic_js.odin index 5b9adabcd..2604ebc8b 100644 --- a/core/math/math_basic_js.odin +++ b/core/math/math_basic_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package math import "base:intrinsics" diff --git a/core/math/noise/internal.odin b/core/math/noise/internal.odin index bd97bd45c..f75c0ee87 100644 --- a/core/math/noise/internal.odin +++ b/core/math/noise/internal.odin @@ -4,7 +4,7 @@ Ported from https://github.com/KdotJPG/OpenSimplex2. Copyright 2022 Yuki2 (https://github.com/NoahR02) */ -//+private +#+private package math_noise /* diff --git a/core/mem/mutex_allocator.odin b/core/mem/mutex_allocator.odin index 591703eab..6ede219ac 100644 --- a/core/mem/mutex_allocator.odin +++ b/core/mem/mutex_allocator.odin @@ -1,4 +1,4 @@ -//+build !freestanding +#+build !freestanding package mem import "core:sync" diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index 1b57e5fb4..7a95888dc 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -1,4 +1,4 @@ -//+build !freestanding +#+build !freestanding package mem import "base:runtime" diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 0b4532baa..3e0d7668b 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -1,5 +1,5 @@ -//+build linux -//+private +#+build linux +#+private package mem_virtual import "core:sys/linux" diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index 4fcb61b04..a57856975 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -1,10 +1,10 @@ -//+private -//+build !darwin -//+build !freebsd -//+build !openbsd -//+build !netbsd -//+build !linux -//+build !windows +#+private +#+build !darwin +#+build !freebsd +#+build !openbsd +#+build !netbsd +#+build !linux +#+build !windows package mem_virtual _reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { diff --git a/core/mem/virtual/virtual_platform.odin b/core/mem/virtual/virtual_platform.odin index c2b505cd2..54c42ce4b 100644 --- a/core/mem/virtual/virtual_platform.odin +++ b/core/mem/virtual/virtual_platform.odin @@ -1,4 +1,4 @@ -//+private +#+private package mem_virtual Platform_Memory_Block :: struct { diff --git a/core/mem/virtual/virtual_posix.odin b/core/mem/virtual/virtual_posix.odin index 035763466..105849774 100644 --- a/core/mem/virtual/virtual_posix.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -1,5 +1,5 @@ -//+build darwin, netbsd, freebsd, openbsd -//+private +#+build darwin, netbsd, freebsd, openbsd +#+private package mem_virtual import "core:sys/posix" diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index ee47a01a8..acd30ae33 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -1,5 +1,5 @@ -//+build windows -//+private +#+build windows +#+private package mem_virtual foreign import Kernel32 "system:Kernel32.lib" diff --git a/core/net/addr.odin b/core/net/addr.odin index 1972d8c22..c47c6f55e 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -1,4 +1,4 @@ -// +build windows, linux, darwin, freebsd +#+build windows, linux, darwin, freebsd package net /* diff --git a/core/net/common.odin b/core/net/common.odin index ed255356e..263fc770f 100644 --- a/core/net/common.odin +++ b/core/net/common.odin @@ -1,4 +1,4 @@ -// +build windows, linux, darwin, freebsd +#+build windows, linux, darwin, freebsd package net /* diff --git a/core/net/dns.odin b/core/net/dns.odin index e82b54262..ffb97fc5b 100644 --- a/core/net/dns.odin +++ b/core/net/dns.odin @@ -1,4 +1,4 @@ -// +build windows, linux, darwin, freebsd +#+build windows, linux, darwin, freebsd package net /* diff --git a/core/net/dns_unix.odin b/core/net/dns_unix.odin index 0448b8d9e..e4336e410 100644 --- a/core/net/dns_unix.odin +++ b/core/net/dns_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd +#+build linux, darwin, freebsd package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/dns_windows.odin b/core/net/dns_windows.odin index 1b7fe7196..2f3831767 100644 --- a/core/net/dns_windows.odin +++ b/core/net/dns_windows.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package net /* diff --git a/core/net/errors_darwin.odin b/core/net/errors_darwin.odin index f2a0d6262..b75336570 100644 --- a/core/net/errors_darwin.odin +++ b/core/net/errors_darwin.odin @@ -1,5 +1,5 @@ package net -// +build darwin +#+build darwin /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/errors_freebsd.odin b/core/net/errors_freebsd.odin index 4830d1c03..486732a95 100644 --- a/core/net/errors_freebsd.odin +++ b/core/net/errors_freebsd.odin @@ -1,4 +1,4 @@ -//+build freebsd +#+build freebsd package net /* diff --git a/core/net/errors_linux.odin b/core/net/errors_linux.odin index 9047b4020..f53a47d15 100644 --- a/core/net/errors_linux.odin +++ b/core/net/errors_linux.odin @@ -1,5 +1,5 @@ package net -// +build linux +#+build linux /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/errors_windows.odin b/core/net/errors_windows.odin index ae928a05c..c4a880e10 100644 --- a/core/net/errors_windows.odin +++ b/core/net/errors_windows.odin @@ -1,5 +1,5 @@ package net -// +build windows +#+build windows /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/interface.odin b/core/net/interface.odin index 90444fb63..775a812f3 100644 --- a/core/net/interface.odin +++ b/core/net/interface.odin @@ -1,4 +1,4 @@ -// +build windows, linux, darwin, freebsd +#+build windows, linux, darwin, freebsd package net /* diff --git a/core/net/interface_darwin.odin b/core/net/interface_darwin.odin index 7a33682de..6931f5188 100644 --- a/core/net/interface_darwin.odin +++ b/core/net/interface_darwin.odin @@ -1,5 +1,5 @@ package net -//+build darwin +#+build darwin /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/interface_freebsd.odin b/core/net/interface_freebsd.odin index a9a125299..50e2d1a96 100644 --- a/core/net/interface_freebsd.odin +++ b/core/net/interface_freebsd.odin @@ -1,4 +1,4 @@ -//+build freebsd +#+build freebsd package net /* diff --git a/core/net/interface_linux.odin b/core/net/interface_linux.odin index c6df8f0a2..85bbfd43b 100644 --- a/core/net/interface_linux.odin +++ b/core/net/interface_linux.odin @@ -1,5 +1,5 @@ package net -//+build linux +#+build linux /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/interface_windows.odin b/core/net/interface_windows.odin index 67da6d034..02b936b0a 100644 --- a/core/net/interface_windows.odin +++ b/core/net/interface_windows.odin @@ -1,5 +1,5 @@ package net -//+build windows +#+build windows /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/socket.odin b/core/net/socket.odin index e36c67d21..83a9f0168 100644 --- a/core/net/socket.odin +++ b/core/net/socket.odin @@ -1,4 +1,4 @@ -// +build windows, linux, darwin, freebsd +#+build windows, linux, darwin, freebsd package net /* diff --git a/core/net/socket_darwin.odin b/core/net/socket_darwin.odin index a56d36de6..c7b5b2761 100644 --- a/core/net/socket_darwin.odin +++ b/core/net/socket_darwin.odin @@ -1,5 +1,5 @@ package net -// +build darwin +#+build darwin /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/socket_freebsd.odin b/core/net/socket_freebsd.odin index 00da5ec06..8ac69907f 100644 --- a/core/net/socket_freebsd.odin +++ b/core/net/socket_freebsd.odin @@ -1,4 +1,4 @@ -//+build freebsd +#+build freebsd package net /* diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin index 52f328814..1800a4a89 100644 --- a/core/net/socket_linux.odin +++ b/core/net/socket_linux.odin @@ -1,5 +1,5 @@ package net -// +build linux +#+build linux /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/socket_windows.odin b/core/net/socket_windows.odin index 8ee75bc3b..d67f5ada1 100644 --- a/core/net/socket_windows.odin +++ b/core/net/socket_windows.odin @@ -1,5 +1,5 @@ package net -// +build windows +#+build windows /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/os/dir_unix.odin b/core/os/dir_unix.odin index b472e89b7..26e865204 100644 --- a/core/os/dir_unix.odin +++ b/core/os/dir_unix.odin @@ -1,4 +1,4 @@ -//+build darwin, linux, netbsd, freebsd, openbsd +#+build darwin, linux, netbsd, freebsd, openbsd package os import "core:strings" diff --git a/core/os/os2/allocators.odin b/core/os/os2/allocators.odin index ddfe230be..7b4f37189 100644 --- a/core/os/os2/allocators.odin +++ b/core/os/os2/allocators.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/dir_linux.odin b/core/os/os2/dir_linux.odin index d4f62e213..6a097e192 100644 --- a/core/os/os2/dir_linux.odin +++ b/core/os/os2/dir_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 Read_Directory_Iterator_Impl :: struct { diff --git a/core/os/os2/dir_posix.odin b/core/os/os2/dir_posix.odin index 75f620d90..14fddde50 100644 --- a/core/os/os2/dir_posix.odin +++ b/core/os/os2/dir_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "core:sys/posix" diff --git a/core/os/os2/dir_windows.odin b/core/os/os2/dir_windows.odin index 1b9675064..09990aeec 100644 --- a/core/os/os2/dir_windows.odin +++ b/core/os/os2/dir_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/env_linux.odin b/core/os/os2/env_linux.odin index 99dd00d90..c248a323c 100644 --- a/core/os/os2/env_linux.odin +++ b/core/os/os2/env_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/env_posix.odin b/core/os/os2/env_posix.odin index 93524fb0c..e2080485d 100644 --- a/core/os/os2/env_posix.odin +++ b/core/os/os2/env_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/env_windows.odin b/core/os/os2/env_windows.odin index ac30eb1d4..a1e8c969d 100644 --- a/core/os/os2/env_windows.odin +++ b/core/os/os2/env_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import win32 "core:sys/windows" diff --git a/core/os/os2/errors_linux.odin b/core/os/os2/errors_linux.odin index ed55ea15e..09492110d 100644 --- a/core/os/os2/errors_linux.odin +++ b/core/os/os2/errors_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "core:sys/linux" diff --git a/core/os/os2/errors_posix.odin b/core/os/os2/errors_posix.odin index 9e3424a4a..59f0ba5f1 100644 --- a/core/os/os2/errors_posix.odin +++ b/core/os/os2/errors_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "core:sys/posix" diff --git a/core/os/os2/errors_windows.odin b/core/os/os2/errors_windows.odin index 8a9a47ca6..56acd503f 100644 --- a/core/os/os2/errors_windows.odin +++ b/core/os/os2/errors_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin index ad6ddbf17..e9ce13447 100644 --- a/core/os/os2/file_linux.odin +++ b/core/os/os2/file_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/file_posix.odin b/core/os/os2/file_posix.odin index dae85d224..b7dc43287 100644 --- a/core/os/os2/file_posix.odin +++ b/core/os/os2/file_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/file_posix_darwin.odin b/core/os/os2/file_posix_darwin.odin index 056d775e6..920a63a71 100644 --- a/core/os/os2/file_posix_darwin.odin +++ b/core/os/os2/file_posix_darwin.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/file_posix_freebsd.odin b/core/os/os2/file_posix_freebsd.odin index e5007f8fe..05d031930 100644 --- a/core/os/os2/file_posix_freebsd.odin +++ b/core/os/os2/file_posix_freebsd.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/file_posix_netbsd.odin b/core/os/os2/file_posix_netbsd.odin index a9cc77a41..f96c227ba 100644 --- a/core/os/os2/file_posix_netbsd.odin +++ b/core/os/os2/file_posix_netbsd.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/file_posix_other.odin b/core/os/os2/file_posix_other.odin index 929622578..74b6374ec 100644 --- a/core/os/os2/file_posix_other.odin +++ b/core/os/os2/file_posix_other.odin @@ -1,5 +1,5 @@ -//+private -//+build openbsd +#+private +#+build openbsd package os2 import "base:runtime" diff --git a/core/os/os2/file_windows.odin b/core/os/os2/file_windows.odin index 382156420..511935d74 100644 --- a/core/os/os2/file_windows.odin +++ b/core/os/os2/file_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/heap_linux.odin b/core/os/os2/heap_linux.odin index e765c320b..ede5eb2ac 100644 --- a/core/os/os2/heap_linux.odin +++ b/core/os/os2/heap_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "core:sys/linux" diff --git a/core/os/os2/heap_posix.odin b/core/os/os2/heap_posix.odin index fcae267fa..1b52aed75 100644 --- a/core/os/os2/heap_posix.odin +++ b/core/os/os2/heap_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/heap_windows.odin b/core/os/os2/heap_windows.odin index 4afc016a0..7fd4529a0 100644 --- a/core/os/os2/heap_windows.odin +++ b/core/os/os2/heap_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "core:mem" diff --git a/core/os/os2/internal_util.odin b/core/os/os2/internal_util.odin index 041cd531b..164e1e1be 100644 --- a/core/os/os2/internal_util.odin +++ b/core/os/os2/internal_util.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:intrinsics" diff --git a/core/os/os2/path_linux.odin b/core/os/os2/path_linux.odin index ba2f7235c..7be4121ae 100644 --- a/core/os/os2/path_linux.odin +++ b/core/os/os2/path_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "core:strings" diff --git a/core/os/os2/path_posix.odin b/core/os/os2/path_posix.odin index 0b9a52532..6f358c58d 100644 --- a/core/os/os2/path_posix.odin +++ b/core/os/os2/path_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/path_windows.odin b/core/os/os2/path_windows.odin index 4aa695ee2..3e92cb6f3 100644 --- a/core/os/os2/path_windows.odin +++ b/core/os/os2/path_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import win32 "core:sys/windows" diff --git a/core/os/os2/pipe_linux.odin b/core/os/os2/pipe_linux.odin index 42315cf4e..ac3382bc3 100644 --- a/core/os/os2/pipe_linux.odin +++ b/core/os/os2/pipe_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "core:sys/linux" diff --git a/core/os/os2/pipe_posix.odin b/core/os/os2/pipe_posix.odin index 13c1f8aec..487e32aea 100644 --- a/core/os/os2/pipe_posix.odin +++ b/core/os/os2/pipe_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "core:sys/posix" diff --git a/core/os/os2/pipe_windows.odin b/core/os/os2/pipe_windows.odin index 59615e306..ee93fb683 100644 --- a/core/os/os2/pipe_windows.odin +++ b/core/os/os2/pipe_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import win32 "core:sys/windows" diff --git a/core/os/os2/process_linux.odin b/core/os/os2/process_linux.odin index b6db46423..ea5ee41b1 100644 --- a/core/os/os2/process_linux.odin +++ b/core/os/os2/process_linux.odin @@ -1,5 +1,5 @@ -//+build linux -//+private file +#+build linux +#+private file package os2 import "base:runtime" diff --git a/core/os/os2/process_posix.odin b/core/os/os2/process_posix.odin index ea4ada81e..5ac6babc1 100644 --- a/core/os/os2/process_posix.odin +++ b/core/os/os2/process_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/process_posix_darwin.odin b/core/os/os2/process_posix_darwin.odin index 648c4d389..0ea1f643c 100644 --- a/core/os/os2/process_posix_darwin.odin +++ b/core/os/os2/process_posix_darwin.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/process_posix_other.odin b/core/os/os2/process_posix_other.odin index 02f78b9ac..77dbfa7eb 100644 --- a/core/os/os2/process_posix_other.odin +++ b/core/os/os2/process_posix_other.odin @@ -1,5 +1,5 @@ -//+private -//+build netbsd, openbsd, freebsd +#+private +#+build netbsd, openbsd, freebsd package os2 import "base:runtime" diff --git a/core/os/os2/process_windows.odin b/core/os/os2/process_windows.odin index edb321509..0c32373f3 100644 --- a/core/os/os2/process_windows.odin +++ b/core/os/os2/process_windows.odin @@ -1,4 +1,4 @@ -//+private file +#+private file package os2 import "base:runtime" diff --git a/core/os/os2/stat_linux.odin b/core/os/os2/stat_linux.odin index 6ccac1be0..0433c1a61 100644 --- a/core/os/os2/stat_linux.odin +++ b/core/os/os2/stat_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "core:time" diff --git a/core/os/os2/stat_posix.odin b/core/os/os2/stat_posix.odin index a817a862b..88029c1f5 100644 --- a/core/os/os2/stat_posix.odin +++ b/core/os/os2/stat_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/stat_windows.odin b/core/os/os2/stat_windows.odin index 566417c84..8ed2a6fed 100644 --- a/core/os/os2/stat_windows.odin +++ b/core/os/os2/stat_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/temp_file_linux.odin b/core/os/os2/temp_file_linux.odin index d6f90fbaf..4eacbc54a 100644 --- a/core/os/os2/temp_file_linux.odin +++ b/core/os/os2/temp_file_linux.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os2/temp_file_posix.odin b/core/os/os2/temp_file_posix.odin index 67ec4d3e8..b44ea13a7 100644 --- a/core/os/os2/temp_file_posix.odin +++ b/core/os/os2/temp_file_posix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, netbsd, freebsd, openbsd +#+private +#+build darwin, netbsd, freebsd, openbsd package os2 import "base:runtime" diff --git a/core/os/os2/temp_file_windows.odin b/core/os/os2/temp_file_windows.odin index d888eda52..3e3e1285c 100644 --- a/core/os/os2/temp_file_windows.odin +++ b/core/os/os2/temp_file_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package os2 import "base:runtime" diff --git a/core/os/os_freestanding.odin b/core/os/os_freestanding.odin index c908e3738..c22a6d7d5 100644 --- a/core/os/os_freestanding.odin +++ b/core/os/os_freestanding.odin @@ -1,4 +1,4 @@ -//+build freestanding +#+build freestanding package os #panic("package os does not support a freestanding target") diff --git a/core/os/os_js.odin b/core/os/os_js.odin index eb434c727..5a544c3f7 100644 --- a/core/os/os_js.odin +++ b/core/os/os_js.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package os import "base:runtime" diff --git a/core/os/os_windows.odin b/core/os/os_windows.odin index 6fb0631cd..552508f3b 100644 --- a/core/os/os_windows.odin +++ b/core/os/os_windows.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package os import win32 "core:sys/windows" diff --git a/core/os/stat_unix.odin b/core/os/stat_unix.odin index 8e89bee4f..7f7985e83 100644 --- a/core/os/stat_unix.odin +++ b/core/os/stat_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd, haiku package os import "core:time" diff --git a/core/path/filepath/path_unix.odin b/core/path/filepath/path_unix.odin index 7137ad844..a18dc739e 100644 --- a/core/path/filepath/path_unix.odin +++ b/core/path/filepath/path_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd, netbsd +#+build linux, darwin, freebsd, openbsd, netbsd package filepath when ODIN_OS == .Darwin { diff --git a/core/prof/spall/spall_linux.odin b/core/prof/spall/spall_linux.odin index b25d2b336..8060af448 100644 --- a/core/prof/spall/spall_linux.odin +++ b/core/prof/spall/spall_linux.odin @@ -1,10 +1,10 @@ -//+private +#+private package spall // Only for types and constants. import "core:os" -// Package is `//+no-instrumentation`, safe to use. +// Package is `#+no-instrumentation`, safe to use. import "core:sys/linux" MAX_RW :: 0x7fffffff diff --git a/core/prof/spall/spall_unix.odin b/core/prof/spall/spall_unix.odin index fc05b8525..455245aad 100644 --- a/core/prof/spall/spall_unix.odin +++ b/core/prof/spall/spall_unix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, freebsd, openbsd, netbsd +#+private +#+build darwin, freebsd, openbsd, netbsd package spall // Only for types. diff --git a/core/prof/spall/spall_windows.odin b/core/prof/spall/spall_windows.odin index c8b044963..11e216b63 100644 --- a/core/prof/spall/spall_windows.odin +++ b/core/prof/spall/spall_windows.odin @@ -1,10 +1,10 @@ -//+private +#+private package spall // Only for types. import "core:os" -// Package is `//+no-instrumentation`, safe to use. +// Package is `#+no-instrumentation`, safe to use. import win32 "core:sys/windows" MAX_RW :: 1<<30 diff --git a/core/simd/x86/abm.odin b/core/simd/x86/abm.odin index 9018a835a..4b07086ce 100644 --- a/core/simd/x86/abm.odin +++ b/core/simd/x86/abm.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "base:intrinsics" diff --git a/core/simd/x86/adx.odin b/core/simd/x86/adx.odin index 5750ae627..9c6ae063a 100644 --- a/core/simd/x86/adx.odin +++ b/core/simd/x86/adx.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 @(require_results) diff --git a/core/simd/x86/aes.odin b/core/simd/x86/aes.odin index a2cd2e4d3..338381422 100644 --- a/core/simd/x86/aes.odin +++ b/core/simd/x86/aes.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 @(require_results, enable_target_feature = "aes") diff --git a/core/simd/x86/cmpxchg16b.odin b/core/simd/x86/cmpxchg16b.odin index 1307a9cf2..78ebd182f 100644 --- a/core/simd/x86/cmpxchg16b.odin +++ b/core/simd/x86/cmpxchg16b.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package simd_x86 import "base:intrinsics" diff --git a/core/simd/x86/fxsr.odin b/core/simd/x86/fxsr.odin index a9213fed2..ab8cdca7d 100644 --- a/core/simd/x86/fxsr.odin +++ b/core/simd/x86/fxsr.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 @(enable_target_feature="fxsr") diff --git a/core/simd/x86/pclmulqdq.odin b/core/simd/x86/pclmulqdq.odin index e827bf6b9..14e633c06 100644 --- a/core/simd/x86/pclmulqdq.odin +++ b/core/simd/x86/pclmulqdq.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 @(require_results, enable_target_feature="pclmul") diff --git a/core/simd/x86/rdtsc.odin b/core/simd/x86/rdtsc.odin index 8a8b13c4b..84c762274 100644 --- a/core/simd/x86/rdtsc.odin +++ b/core/simd/x86/rdtsc.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 @(require_results) diff --git a/core/simd/x86/sha.odin b/core/simd/x86/sha.odin index bc58e8504..8caa3a268 100644 --- a/core/simd/x86/sha.odin +++ b/core/simd/x86/sha.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 @(require_results, enable_target_feature="sha") diff --git a/core/simd/x86/sse.odin b/core/simd/x86/sse.odin index 4dac50234..1b4a863b6 100644 --- a/core/simd/x86/sse.odin +++ b/core/simd/x86/sse.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "base:intrinsics" diff --git a/core/simd/x86/sse2.odin b/core/simd/x86/sse2.odin index 2e3eb8523..aaddbe6b4 100644 --- a/core/simd/x86/sse2.odin +++ b/core/simd/x86/sse2.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "base:intrinsics" diff --git a/core/simd/x86/sse3.odin b/core/simd/x86/sse3.odin index a905a7726..0e074c946 100644 --- a/core/simd/x86/sse3.odin +++ b/core/simd/x86/sse3.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "base:intrinsics" diff --git a/core/simd/x86/sse41.odin b/core/simd/x86/sse41.odin index c2c1abc2d..81089ed63 100644 --- a/core/simd/x86/sse41.odin +++ b/core/simd/x86/sse41.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "core:simd" diff --git a/core/simd/x86/sse42.odin b/core/simd/x86/sse42.odin index 7a674176b..1a5cb3f50 100644 --- a/core/simd/x86/sse42.odin +++ b/core/simd/x86/sse42.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "core:simd" diff --git a/core/simd/x86/ssse3.odin b/core/simd/x86/ssse3.odin index 2026c7f53..07c846e7b 100644 --- a/core/simd/x86/ssse3.odin +++ b/core/simd/x86/ssse3.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "base:intrinsics" diff --git a/core/simd/x86/types.odin b/core/simd/x86/types.odin index 06a2cd41e..ea0eff534 100644 --- a/core/simd/x86/types.odin +++ b/core/simd/x86/types.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package simd_x86 import "core:simd" diff --git a/core/slice/sort_private.odin b/core/slice/sort_private.odin index 487b51907..36637c4cd 100644 --- a/core/slice/sort_private.odin +++ b/core/slice/sort_private.odin @@ -1,4 +1,4 @@ -//+private +#+private package slice import "base:intrinsics" diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin index fca9aadfe..5b5f53c20 100644 --- a/core/sync/futex_darwin.odin +++ b/core/sync/futex_darwin.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin +#+private +#+build darwin package sync import "core:c" diff --git a/core/sync/futex_freebsd.odin b/core/sync/futex_freebsd.odin index ac6e2400a..4fbb33ee0 100644 --- a/core/sync/futex_freebsd.odin +++ b/core/sync/futex_freebsd.odin @@ -1,5 +1,5 @@ -//+private -//+build freebsd +#+private +#+build freebsd package sync import "core:c" diff --git a/core/sync/futex_haiku.odin b/core/sync/futex_haiku.odin index 6fe5894a0..21d07b801 100644 --- a/core/sync/futex_haiku.odin +++ b/core/sync/futex_haiku.odin @@ -1,4 +1,4 @@ -//+private +#+private package sync import "core:c" diff --git a/core/sync/futex_linux.odin b/core/sync/futex_linux.odin index fe57c12ed..846a82486 100644 --- a/core/sync/futex_linux.odin +++ b/core/sync/futex_linux.odin @@ -1,5 +1,5 @@ -//+private -//+build linux +#+private +#+build linux package sync import "core:time" diff --git a/core/sync/futex_netbsd.odin b/core/sync/futex_netbsd.odin index d12409f32..b98346434 100644 --- a/core/sync/futex_netbsd.odin +++ b/core/sync/futex_netbsd.odin @@ -1,4 +1,4 @@ -//+private +#+private package sync import "base:intrinsics" diff --git a/core/sync/futex_openbsd.odin b/core/sync/futex_openbsd.odin index 4883a0841..83055b950 100644 --- a/core/sync/futex_openbsd.odin +++ b/core/sync/futex_openbsd.odin @@ -1,5 +1,5 @@ -//+private -//+build openbsd +#+private +#+build openbsd package sync import "core:c" diff --git a/core/sync/futex_wasm.odin b/core/sync/futex_wasm.odin index de88e8198..013c425e8 100644 --- a/core/sync/futex_wasm.odin +++ b/core/sync/futex_wasm.odin @@ -1,5 +1,5 @@ -//+private -//+build wasm32, wasm64p32 +#+private +#+build wasm32, wasm64p32 package sync import "base:intrinsics" diff --git a/core/sync/futex_windows.odin b/core/sync/futex_windows.odin index 6a26baf5b..bb9686a1a 100644 --- a/core/sync/futex_windows.odin +++ b/core/sync/futex_windows.odin @@ -1,5 +1,5 @@ -//+private -//+build windows +#+private +#+build windows package sync import "core:time" diff --git a/core/sync/primitives_darwin.odin b/core/sync/primitives_darwin.odin index 146f69e86..141cea744 100644 --- a/core/sync/primitives_darwin.odin +++ b/core/sync/primitives_darwin.odin @@ -1,5 +1,5 @@ -//+build darwin -//+private +#+build darwin +#+private package sync import "core:c" diff --git a/core/sync/primitives_freebsd.odin b/core/sync/primitives_freebsd.odin index 2d7cbf18d..fe6b11e72 100644 --- a/core/sync/primitives_freebsd.odin +++ b/core/sync/primitives_freebsd.odin @@ -1,5 +1,5 @@ -//+build freebsd -//+private +#+build freebsd +#+private package sync import "core:c" diff --git a/core/sync/primitives_haiku.odin b/core/sync/primitives_haiku.odin index 4b8f6b02d..69d005206 100644 --- a/core/sync/primitives_haiku.odin +++ b/core/sync/primitives_haiku.odin @@ -1,4 +1,4 @@ -//+private +#+private package sync import "core:sys/haiku" diff --git a/core/sync/primitives_internal.odin b/core/sync/primitives_internal.odin index 23483aef5..4478a77d2 100644 --- a/core/sync/primitives_internal.odin +++ b/core/sync/primitives_internal.odin @@ -1,4 +1,4 @@ -//+private +#+private package sync import "core:time" diff --git a/core/sync/primitives_linux.odin b/core/sync/primitives_linux.odin index aa7a8b4b2..bf04f8d99 100644 --- a/core/sync/primitives_linux.odin +++ b/core/sync/primitives_linux.odin @@ -1,5 +1,5 @@ -//+build linux -//+private +#+build linux +#+private package sync import "core:sys/linux" diff --git a/core/sync/primitives_netbsd.odin b/core/sync/primitives_netbsd.odin index 594f2ff5c..66da0745a 100644 --- a/core/sync/primitives_netbsd.odin +++ b/core/sync/primitives_netbsd.odin @@ -1,4 +1,4 @@ -//+private +#+private package sync foreign import libc "system:c" diff --git a/core/sync/primitives_openbsd.odin b/core/sync/primitives_openbsd.odin index ff3ff837f..1f6efd8f7 100644 --- a/core/sync/primitives_openbsd.odin +++ b/core/sync/primitives_openbsd.odin @@ -1,5 +1,5 @@ -//+build openbsd -//+private +#+build openbsd +#+private package sync foreign import libc "system:c" diff --git a/core/sync/primitives_wasm.odin b/core/sync/primitives_wasm.odin index f8d9ab657..8906d96be 100644 --- a/core/sync/primitives_wasm.odin +++ b/core/sync/primitives_wasm.odin @@ -1,5 +1,5 @@ -//+private -//+build wasm32, wasm64p32 +#+private +#+build wasm32, wasm64p32 package sync _current_thread_id :: proc "contextless" () -> int { diff --git a/core/sync/primitives_windows.odin b/core/sync/primitives_windows.odin index 9f5bfc280..744bc248b 100644 --- a/core/sync/primitives_windows.odin +++ b/core/sync/primitives_windows.odin @@ -1,5 +1,5 @@ -//+build windows -//+private +#+build windows +#+private package sync import "core:time" diff --git a/core/sys/darwin/darwin.odin b/core/sys/darwin/darwin.odin index ddd25a76c..d109f5544 100644 --- a/core/sys/darwin/darwin.odin +++ b/core/sys/darwin/darwin.odin @@ -1,4 +1,4 @@ -//+build darwin +#+build darwin package darwin import "core:c" diff --git a/core/sys/haiku/errors.odin b/core/sys/haiku/errors.odin index 023045001..febe647ea 100644 --- a/core/sys/haiku/errors.odin +++ b/core/sys/haiku/errors.odin @@ -1,4 +1,4 @@ -//+build haiku +#+build haiku package sys_haiku import "core:c" diff --git a/core/sys/haiku/find_directory.odin b/core/sys/haiku/find_directory.odin index 103e677d7..758c4dff4 100644 --- a/core/sys/haiku/find_directory.odin +++ b/core/sys/haiku/find_directory.odin @@ -1,4 +1,4 @@ -//+build haiku +#+build haiku package sys_haiku import "core:c" diff --git a/core/sys/haiku/os.odin b/core/sys/haiku/os.odin index 883072c2d..6ab3ef573 100644 --- a/core/sys/haiku/os.odin +++ b/core/sys/haiku/os.odin @@ -1,4 +1,4 @@ -//+build haiku +#+build haiku package sys_haiku import "core:c" diff --git a/core/sys/haiku/types.odin b/core/sys/haiku/types.odin index 0440d5a98..47755b0b7 100644 --- a/core/sys/haiku/types.odin +++ b/core/sys/haiku/types.odin @@ -1,4 +1,4 @@ -//+build haiku +#+build haiku package sys_haiku import "core:c" diff --git a/core/sys/info/cpu_arm.odin b/core/sys/info/cpu_arm.odin index aa4bb368a..960e55a56 100644 --- a/core/sys/info/cpu_arm.odin +++ b/core/sys/info/cpu_arm.odin @@ -1,4 +1,4 @@ -//+build arm32, arm64 +#+build arm32, arm64 package sysinfo import "core:sys/unix" diff --git a/core/sys/info/cpu_intel.odin b/core/sys/info/cpu_intel.odin index 73d4c15e7..d6fa98507 100644 --- a/core/sys/info/cpu_intel.odin +++ b/core/sys/info/cpu_intel.odin @@ -1,4 +1,4 @@ -//+build i386, amd64 +#+build i386, amd64 package sysinfo import "base:intrinsics" diff --git a/core/sys/info/cpu_linux_arm.odin b/core/sys/info/cpu_linux_arm.odin index dcc252971..6408decb7 100644 --- a/core/sys/info/cpu_linux_arm.odin +++ b/core/sys/info/cpu_linux_arm.odin @@ -1,5 +1,5 @@ -//+build arm32, arm64 -//+build linux +#+build arm32, arm64 +#+build linux package sysinfo import "core:sys/linux" diff --git a/core/sys/info/cpu_linux_riscv64.odin b/core/sys/info/cpu_linux_riscv64.odin index 0b64c3725..84f6134d4 100644 --- a/core/sys/info/cpu_linux_riscv64.odin +++ b/core/sys/info/cpu_linux_riscv64.odin @@ -1,5 +1,5 @@ -//+build riscv64 -//+build linux +#+build riscv64 +#+build linux package sysinfo import "base:intrinsics" diff --git a/core/sys/info/platform_bsd.odin b/core/sys/info/platform_bsd.odin index e2273d253..6bb32cd3d 100644 --- a/core/sys/info/platform_bsd.odin +++ b/core/sys/info/platform_bsd.odin @@ -1,4 +1,4 @@ -//+build openbsd, netbsd +#+build openbsd, netbsd package sysinfo import sys "core:sys/unix" diff --git a/core/sys/kqueue/kqueue.odin b/core/sys/kqueue/kqueue.odin index 27d1ecaae..56be1cf7a 100644 --- a/core/sys/kqueue/kqueue.odin +++ b/core/sys/kqueue/kqueue.odin @@ -1,4 +1,4 @@ -//+build darwin, netbsd, openbsd, freebsd +#+build darwin, netbsd, openbsd, freebsd package kqueue when ODIN_OS == .Darwin { diff --git a/core/sys/linux/helpers.odin b/core/sys/linux/helpers.odin index f1abbbf61..aefc1179e 100644 --- a/core/sys/linux/helpers.odin +++ b/core/sys/linux/helpers.odin @@ -1,5 +1,5 @@ -//+build linux -//+no-instrumentation +#+build linux +#+no-instrumentation package linux import "base:intrinsics" diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 5ee07a93d..2caa3ab65 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -1,4 +1,4 @@ -//+no-instrumentation +#+no-instrumentation package linux import "base:intrinsics" diff --git a/core/sys/linux/syscall_amd64.odin b/core/sys/linux/syscall_amd64.odin index ee4e16280..31c8ed61c 100644 --- a/core/sys/linux/syscall_amd64.odin +++ b/core/sys/linux/syscall_amd64.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package linux // AMD64 uses the new way to define syscalls, i.e. one that diff --git a/core/sys/linux/syscall_arm32.odin b/core/sys/linux/syscall_arm32.odin index 74640a1a3..731ce36a5 100644 --- a/core/sys/linux/syscall_arm32.odin +++ b/core/sys/linux/syscall_arm32.odin @@ -1,4 +1,4 @@ -//+build arm32 +#+build arm32 package linux // This file was taken and transformed from diff --git a/core/sys/linux/syscall_arm64.odin b/core/sys/linux/syscall_arm64.odin index 61b5a31b7..da8eb45da 100644 --- a/core/sys/linux/syscall_arm64.odin +++ b/core/sys/linux/syscall_arm64.odin @@ -1,4 +1,4 @@ -//+build arm64 +#+build arm64 package linux // Syscalls for arm64 are defined using the new way, i.e. differently from diff --git a/core/sys/linux/syscall_i386.odin b/core/sys/linux/syscall_i386.odin index 4609fc99c..affdff02c 100644 --- a/core/sys/linux/syscall_i386.odin +++ b/core/sys/linux/syscall_i386.odin @@ -1,4 +1,4 @@ -//+build i386 +#+build i386 package linux // The numbers are taken from diff --git a/core/sys/linux/syscall_riscv64.odin b/core/sys/linux/syscall_riscv64.odin index d2fd0c2ff..17845c5ed 100644 --- a/core/sys/linux/syscall_riscv64.odin +++ b/core/sys/linux/syscall_riscv64.odin @@ -1,4 +1,4 @@ -//+build riscv64 +#+build riscv64 package linux // https://github.com/riscv-collab/riscv-gnu-toolchain/blob/master/linux-headers/include/asm-generic/unistd.h diff --git a/core/sys/linux/wrappers.odin b/core/sys/linux/wrappers.odin index 7a30c3bde..4f6118c80 100644 --- a/core/sys/linux/wrappers.odin +++ b/core/sys/linux/wrappers.odin @@ -1,4 +1,4 @@ -//+build linux +#+build linux package linux /// Low 8 bits of the exit code diff --git a/core/sys/unix/pthread_darwin.odin b/core/sys/unix/pthread_darwin.odin index 378fa9309..eb2cc4c9f 100644 --- a/core/sys/unix/pthread_darwin.odin +++ b/core/sys/unix/pthread_darwin.odin @@ -1,4 +1,4 @@ -//+build darwin +#+build darwin package unix import "core:c" diff --git a/core/sys/unix/pthread_freebsd.odin b/core/sys/unix/pthread_freebsd.odin index 5f4dac289..38fe7db55 100644 --- a/core/sys/unix/pthread_freebsd.odin +++ b/core/sys/unix/pthread_freebsd.odin @@ -1,4 +1,4 @@ -//+build freebsd +#+build freebsd package unix import "core:c" diff --git a/core/sys/unix/pthread_linux.odin b/core/sys/unix/pthread_linux.odin index f4ded7464..d67add24b 100644 --- a/core/sys/unix/pthread_linux.odin +++ b/core/sys/unix/pthread_linux.odin @@ -1,4 +1,4 @@ -//+build linux +#+build linux package unix import "core:c" diff --git a/core/sys/unix/pthread_openbsd.odin b/core/sys/unix/pthread_openbsd.odin index 855e7d99c..2c6d9e598 100644 --- a/core/sys/unix/pthread_openbsd.odin +++ b/core/sys/unix/pthread_openbsd.odin @@ -1,4 +1,4 @@ -//+build openbsd +#+build openbsd package unix import "core:c" diff --git a/core/sys/unix/pthread_unix.odin b/core/sys/unix/pthread_unix.odin index 26a21e629..43c4866ed 100644 --- a/core/sys/unix/pthread_unix.odin +++ b/core/sys/unix/pthread_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd, haiku package unix foreign import "system:pthread" diff --git a/core/sys/unix/sysctl_darwin.odin b/core/sys/unix/sysctl_darwin.odin index 92222bdfe..32dd720b0 100644 --- a/core/sys/unix/sysctl_darwin.odin +++ b/core/sys/unix/sysctl_darwin.odin @@ -1,4 +1,4 @@ -//+build darwin +#+build darwin package unix import "base:intrinsics" diff --git a/core/sys/unix/sysctl_freebsd.odin b/core/sys/unix/sysctl_freebsd.odin index 8ca40ef1b..f5fee6c6c 100644 --- a/core/sys/unix/sysctl_freebsd.odin +++ b/core/sys/unix/sysctl_freebsd.odin @@ -1,4 +1,4 @@ -//+build freebsd +#+build freebsd package unix import "base:intrinsics" diff --git a/core/sys/unix/sysctl_openbsd.odin b/core/sys/unix/sysctl_openbsd.odin index b93e8f9bd..49c9b6336 100644 --- a/core/sys/unix/sysctl_openbsd.odin +++ b/core/sys/unix/sysctl_openbsd.odin @@ -1,4 +1,4 @@ -//+build openbsd +#+build openbsd package unix import "core:c" diff --git a/core/sys/valgrind/callgrind.odin b/core/sys/valgrind/callgrind.odin index b1ba8c6e9..5cd58753a 100644 --- a/core/sys/valgrind/callgrind.odin +++ b/core/sys/valgrind/callgrind.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package sys_valgrind import "base:intrinsics" diff --git a/core/sys/valgrind/helgrind.odin b/core/sys/valgrind/helgrind.odin index 2f0114522..3f5e7a531 100644 --- a/core/sys/valgrind/helgrind.odin +++ b/core/sys/valgrind/helgrind.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package sys_valgrind import "base:intrinsics" diff --git a/core/sys/valgrind/memcheck.odin b/core/sys/valgrind/memcheck.odin index dfbe4c3be..bc77444be 100644 --- a/core/sys/valgrind/memcheck.odin +++ b/core/sys/valgrind/memcheck.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package sys_valgrind import "base:intrinsics" diff --git a/core/sys/valgrind/valgrind.odin b/core/sys/valgrind/valgrind.odin index d0c46af53..b5c71664f 100644 --- a/core/sys/valgrind/valgrind.odin +++ b/core/sys/valgrind/valgrind.odin @@ -1,4 +1,4 @@ -//+build amd64 +#+build amd64 package sys_valgrind import "base:intrinsics" diff --git a/core/sys/wasm/wasi/wasi_api.odin b/core/sys/wasm/wasi/wasi_api.odin index 38d95e754..8d50f1690 100644 --- a/core/sys/wasm/wasi/wasi_api.odin +++ b/core/sys/wasm/wasi/wasi_api.odin @@ -1,4 +1,4 @@ -//+build wasm32 +#+build wasm32 package sys_wasi foreign import wasi "wasi_snapshot_preview1" diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index 1e34f1fd6..f834511d4 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import advapi32 "system:Advapi32.lib" diff --git a/core/sys/windows/bcrypt.odin b/core/sys/windows/bcrypt.odin index d891aa92b..f15f1e305 100644 --- a/core/sys/windows/bcrypt.odin +++ b/core/sys/windows/bcrypt.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import bcrypt "system:Bcrypt.lib" diff --git a/core/sys/windows/bluetooth.odin b/core/sys/windows/bluetooth.odin index 7bfb7ea96..86c66b9a1 100644 --- a/core/sys/windows/bluetooth.odin +++ b/core/sys/windows/bluetooth.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import "system:bthprops.lib" diff --git a/core/sys/windows/codepage.odin b/core/sys/windows/codepage.odin index 90040f1ee..527289f03 100644 --- a/core/sys/windows/codepage.odin +++ b/core/sys/windows/codepage.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows // https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index 9c4404a9d..477800413 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import "system:Comctl32.lib" diff --git a/core/sys/windows/comdlg32.odin b/core/sys/windows/comdlg32.odin index 30d9b169c..a9800b47a 100644 --- a/core/sys/windows/comdlg32.odin +++ b/core/sys/windows/comdlg32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import "system:Comdlg32.lib" diff --git a/core/sys/windows/dbghelp.odin b/core/sys/windows/dbghelp.odin index cb5458248..336992b4a 100644 --- a/core/sys/windows/dbghelp.odin +++ b/core/sys/windows/dbghelp.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import "system:Dbghelp.lib" diff --git a/core/sys/windows/dnsapi.odin b/core/sys/windows/dnsapi.odin index dd2d1acee..4fd9f7a19 100644 --- a/core/sys/windows/dnsapi.odin +++ b/core/sys/windows/dnsapi.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import "system:Dnsapi.lib" diff --git a/core/sys/windows/dwmapi.odin b/core/sys/windows/dwmapi.odin index d0ffc6b46..11a46f53a 100644 --- a/core/sys/windows/dwmapi.odin +++ b/core/sys/windows/dwmapi.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import dwmapi "system:Dwmapi.lib" diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 5cbafddba..1d7a93d85 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows import "core:math/fixed" diff --git a/core/sys/windows/hidpi.odin b/core/sys/windows/hidpi.odin index bea03694e..5e9787527 100644 --- a/core/sys/windows/hidpi.odin +++ b/core/sys/windows/hidpi.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows import "core:c" diff --git a/core/sys/windows/hidusage.odin b/core/sys/windows/hidusage.odin index a32aa7b9f..eb2a85f2e 100644 --- a/core/sys/windows/hidusage.odin +++ b/core/sys/windows/hidusage.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows USAGE :: distinct USHORT diff --git a/core/sys/windows/ip_helper.odin b/core/sys/windows/ip_helper.odin index 4c2534c10..7a6e545ac 100644 --- a/core/sys/windows/ip_helper.odin +++ b/core/sys/windows/ip_helper.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import "system:iphlpapi.lib" diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 81db67185..2771581e6 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import kernel32 "system:Kernel32.lib" diff --git a/core/sys/windows/key_codes.odin b/core/sys/windows/key_codes.odin index 284b0e437..0991ca4b3 100644 --- a/core/sys/windows/key_codes.odin +++ b/core/sys/windows/key_codes.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows // https://docs.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input diff --git a/core/sys/windows/known_folders.odin b/core/sys/windows/known_folders.odin index 439d65faf..cbaf5eeeb 100644 --- a/core/sys/windows/known_folders.odin +++ b/core/sys/windows/known_folders.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows FOLDERID_NetworkFolder :: GUID {0xD20BEEC4, 0x5CA8, 0x4905, {0xAE, 0x3B, 0xBF, 0x25, 0x1E, 0xA0, 0x9B, 0x53}} diff --git a/core/sys/windows/netapi32.odin b/core/sys/windows/netapi32.odin index d9f75c623..9442193ca 100644 --- a/core/sys/windows/netapi32.odin +++ b/core/sys/windows/netapi32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import netapi32 "system:Netapi32.lib" diff --git a/core/sys/windows/ntdll.odin b/core/sys/windows/ntdll.odin index 23444ff34..747130749 100644 --- a/core/sys/windows/ntdll.odin +++ b/core/sys/windows/ntdll.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import ntdll_lib "system:ntdll.lib" diff --git a/core/sys/windows/shcore.odin b/core/sys/windows/shcore.odin index 54f67989e..08a76ebe6 100644 --- a/core/sys/windows/shcore.odin +++ b/core/sys/windows/shcore.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin index 7340ae4d4..54cee718c 100644 --- a/core/sys/windows/shell32.odin +++ b/core/sys/windows/shell32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import shell32 "system:Shell32.lib" diff --git a/core/sys/windows/shlwapi.odin b/core/sys/windows/shlwapi.odin index bf9d2d1e8..095fff304 100644 --- a/core/sys/windows/shlwapi.odin +++ b/core/sys/windows/shlwapi.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import shlwapi "system:shlwapi.lib" diff --git a/core/sys/windows/synchronization.odin b/core/sys/windows/synchronization.odin index 79efaab34..bcaeb3f5f 100644 --- a/core/sys/windows/synchronization.odin +++ b/core/sys/windows/synchronization.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import Synchronization "system:Synchronization.lib" diff --git a/core/sys/windows/system_params.odin b/core/sys/windows/system_params.odin index e94d777bf..e463feb7e 100644 --- a/core/sys/windows/system_params.odin +++ b/core/sys/windows/system_params.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows // Parameter for SystemParametersInfo. diff --git a/core/sys/windows/tlhelp.odin b/core/sys/windows/tlhelp.odin index 45d5a3ff9..006c9c330 100644 --- a/core/sys/windows/tlhelp.odin +++ b/core/sys/windows/tlhelp.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package sys_windows foreign import kernel32 "system:Kernel32.lib" diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index e13dcd55f..514592e7b 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows import "base:intrinsics" diff --git a/core/sys/windows/userenv.odin b/core/sys/windows/userenv.odin index a31e363e1..2a2209d2c 100644 --- a/core/sys/windows/userenv.odin +++ b/core/sys/windows/userenv.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import userenv "system:Userenv.lib" diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 929df1765..b3eb800bc 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows import "base:runtime" diff --git a/core/sys/windows/ux_theme.odin b/core/sys/windows/ux_theme.odin index 7af399361..527abd62f 100644 --- a/core/sys/windows/ux_theme.odin +++ b/core/sys/windows/ux_theme.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import uxtheme "system:UxTheme.lib" diff --git a/core/sys/windows/wgl.odin b/core/sys/windows/wgl.odin index d0d96d90b..8fea55c3d 100644 --- a/core/sys/windows/wgl.odin +++ b/core/sys/windows/wgl.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows import "core:c" diff --git a/core/sys/windows/wglext.odin b/core/sys/windows/wglext.odin index 0c4b51d65..4c76b39ec 100644 --- a/core/sys/windows/wglext.odin +++ b/core/sys/windows/wglext.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows // WGL_ARB_buffer_region diff --git a/core/sys/windows/window_messages.odin b/core/sys/windows/window_messages.odin index 888c5ccf9..d69771bdf 100644 --- a/core/sys/windows/window_messages.odin +++ b/core/sys/windows/window_messages.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows WM_NULL :: 0x0000 diff --git a/core/sys/windows/winerror.odin b/core/sys/windows/winerror.odin index d3df3b815..b3b470619 100644 --- a/core/sys/windows/winerror.odin +++ b/core/sys/windows/winerror.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows // https://learn.microsoft.com/en-us/windows/win32/api/winerror/ diff --git a/core/sys/windows/winmm.odin b/core/sys/windows/winmm.odin index a1786c27a..3c7ec80e7 100644 --- a/core/sys/windows/winmm.odin +++ b/core/sys/windows/winmm.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import winmm "system:Winmm.lib" diff --git a/core/sys/windows/winnls.odin b/core/sys/windows/winnls.odin index 292d2fad2..ffb2638d5 100644 --- a/core/sys/windows/winnls.odin +++ b/core/sys/windows/winnls.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows LCTYPE :: distinct DWORD diff --git a/core/sys/windows/winver.odin b/core/sys/windows/winver.odin index 091d53d3a..47751dab7 100644 --- a/core/sys/windows/winver.odin +++ b/core/sys/windows/winver.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows foreign import version "system:version.lib" diff --git a/core/sys/windows/wow64_apiset.odin b/core/sys/windows/wow64_apiset.odin index 28558e9ca..3d29b786e 100644 --- a/core/sys/windows/wow64_apiset.odin +++ b/core/sys/windows/wow64_apiset.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package sys_windows foreign import kernel32 "system:Kernel32.lib" diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index e9bf8abc9..5b2952495 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -1,4 +1,4 @@ -// +build windows +#+build windows package sys_windows // Define flags to be used with the WSAAsyncSelect() call. diff --git a/core/testing/events.odin b/core/testing/events.odin index c9c4b0271..1a47e2d68 100644 --- a/core/testing/events.odin +++ b/core/testing/events.odin @@ -1,4 +1,4 @@ -//+private +#+private package testing /* diff --git a/core/testing/logging.odin b/core/testing/logging.odin index 1c3fc4603..041489dab 100644 --- a/core/testing/logging.odin +++ b/core/testing/logging.odin @@ -1,4 +1,4 @@ -//+private +#+private package testing /* diff --git a/core/testing/reporting.odin b/core/testing/reporting.odin index 81f1d0646..6752cd79b 100644 --- a/core/testing/reporting.odin +++ b/core/testing/reporting.odin @@ -1,4 +1,4 @@ -//+private +#+private package testing /* diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 386ba8cb5..683db9d15 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -1,4 +1,4 @@ -//+private +#+private package testing /* diff --git a/core/testing/signal_handler.odin b/core/testing/signal_handler.odin index 047ea0b3a..2f1f7c89a 100644 --- a/core/testing/signal_handler.odin +++ b/core/testing/signal_handler.odin @@ -1,4 +1,4 @@ -//+private +#+private package testing /* diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index 27d1a0735..b665b047c 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -1,5 +1,5 @@ -//+private -//+build windows, linux, darwin, freebsd, openbsd, netbsd, haiku +#+private +#+build windows, linux, darwin, freebsd, openbsd, netbsd, haiku package testing /* diff --git a/core/testing/signal_handler_other.odin b/core/testing/signal_handler_other.odin index d6d494fa4..81f575495 100644 --- a/core/testing/signal_handler_other.odin +++ b/core/testing/signal_handler_other.odin @@ -1,11 +1,11 @@ -//+private -//+build !windows -//+build !linux -//+build !darwin -//+build !freebsd -//+build !openbsd -//+build !netbsd -//+build !haiku +#+private +#+build !windows +#+build !linux +#+build !darwin +#+build !freebsd +#+build !openbsd +#+build !netbsd +#+build !haiku package testing /* diff --git a/core/thread/thread_other.odin b/core/thread/thread_other.odin index 34bbfda08..dde2a8e48 100644 --- a/core/thread/thread_other.odin +++ b/core/thread/thread_other.odin @@ -1,4 +1,4 @@ -//+build js, wasi, orca +#+build js, wasi, orca package thread import "base:intrinsics" diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index ddc47244c..2e196c3e6 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -1,5 +1,5 @@ -// +build linux, darwin, freebsd, openbsd, netbsd, haiku -// +private +#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+private package thread import "base:runtime" diff --git a/core/thread/thread_windows.odin b/core/thread/thread_windows.odin index 50a4e5fbc..300673191 100644 --- a/core/thread/thread_windows.odin +++ b/core/thread/thread_windows.odin @@ -1,5 +1,5 @@ -//+build windows -//+private +#+build windows +#+private package thread import "base:intrinsics" diff --git a/core/time/datetime/internal.odin b/core/time/datetime/internal.odin index e7129548e..3477a47f3 100644 --- a/core/time/datetime/internal.odin +++ b/core/time/datetime/internal.odin @@ -1,4 +1,4 @@ -//+private +#+private package datetime // Internal helper functions for calendrical conversions diff --git a/core/time/time_essence.odin b/core/time/time_essence.odin index b7bc616d8..89883f0b9 100644 --- a/core/time/time_essence.odin +++ b/core/time/time_essence.odin @@ -1,4 +1,4 @@ -//+private +#+private package time import "core:sys/es" diff --git a/core/time/time_js.odin b/core/time/time_js.odin index c5090df90..9175fbfe9 100644 --- a/core/time/time_js.odin +++ b/core/time/time_js.odin @@ -1,5 +1,5 @@ -//+private -//+build js +#+private +#+build js package time foreign import "odin_env" diff --git a/core/time/time_orca.odin b/core/time/time_orca.odin index b2598fd6e..f529790a5 100644 --- a/core/time/time_orca.odin +++ b/core/time/time_orca.odin @@ -1,5 +1,5 @@ -//+private -//+build orca +#+private +#+build orca package time import "base:intrinsics" diff --git a/core/time/time_other.odin b/core/time/time_other.odin index 164d23f25..d89bcbd42 100644 --- a/core/time/time_other.odin +++ b/core/time/time_other.odin @@ -1,14 +1,14 @@ -//+private -//+build !essence -//+build !js -//+build !linux -//+build !openbsd -//+build !freebsd -//+build !netbsd -//+build !darwin -//+build !wasi -//+build !windows -//+build !orca +#+private +#+build !essence +#+build !js +#+build !linux +#+build !openbsd +#+build !freebsd +#+build !netbsd +#+build !darwin +#+build !wasi +#+build !windows +#+build !orca package time _IS_SUPPORTED :: false diff --git a/core/time/time_unix.odin b/core/time/time_unix.odin index 0d7a43aba..61c4e91d3 100644 --- a/core/time/time_unix.odin +++ b/core/time/time_unix.odin @@ -1,5 +1,5 @@ -//+private -//+build darwin, freebsd, openbsd, netbsd +#+private +#+build darwin, freebsd, openbsd, netbsd package time import "core:sys/posix" diff --git a/core/time/time_wasi.odin b/core/time/time_wasi.odin index 88bebe2e3..c16c40cce 100644 --- a/core/time/time_wasi.odin +++ b/core/time/time_wasi.odin @@ -1,5 +1,5 @@ -//+private -//+build wasi +#+private +#+build wasi package time import "base:intrinsics" diff --git a/core/time/time_windows.odin b/core/time/time_windows.odin index 378b914b0..553ea6d4e 100644 --- a/core/time/time_windows.odin +++ b/core/time/time_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package time import win32 "core:sys/windows" diff --git a/core/time/tsc_darwin.odin b/core/time/tsc_darwin.odin index 841c0b692..3726cff49 100644 --- a/core/time/tsc_darwin.odin +++ b/core/time/tsc_darwin.odin @@ -1,4 +1,4 @@ -//+private +#+private package time import "core:sys/unix" diff --git a/core/time/tsc_freebsd.odin b/core/time/tsc_freebsd.odin index f4d6ccc3a..dabcb69cb 100644 --- a/core/time/tsc_freebsd.odin +++ b/core/time/tsc_freebsd.odin @@ -1,5 +1,5 @@ -//+private -//+build freebsd +#+private +#+build freebsd package time import "core:c" diff --git a/core/time/tsc_linux.odin b/core/time/tsc_linux.odin index 77a79fe52..a83634414 100644 --- a/core/time/tsc_linux.odin +++ b/core/time/tsc_linux.odin @@ -1,5 +1,5 @@ -//+private -//+build linux +#+private +#+build linux package time import linux "core:sys/linux" diff --git a/examples/all/all_experimental.odin b/examples/all/all_experimental.odin index cd60c269c..1d4eb4bb9 100644 --- a/examples/all/all_experimental.odin +++ b/examples/all/all_experimental.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package all import c_tokenizer "core:c/frontend/tokenizer" diff --git a/examples/all/all_linux.odin b/examples/all/all_linux.odin index 18bba951c..ca51d6562 100644 --- a/examples/all/all_linux.odin +++ b/examples/all/all_linux.odin @@ -1,4 +1,4 @@ -//+build linux +#+build linux package all import linux "core:sys/linux" diff --git a/examples/all/all_posix.odin b/examples/all/all_posix.odin index 819dd6dd3..76fac0b87 100644 --- a/examples/all/all_posix.odin +++ b/examples/all/all_posix.odin @@ -1,4 +1,4 @@ -//+build darwin, openbsd, freebsd, netbsd +#+build darwin, openbsd, freebsd, netbsd package all import posix "core:sys/posix" diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index d66d1ceb0..4b761f0e2 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1,4 +1,4 @@ -//+vet !using-stmt !using-param +#+vet !using-stmt !using-param package main import "core:fmt" diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin index 8a9272882..a6e299bcc 100644 --- a/tests/core/net/test_core_net.odin +++ b/tests/core/net/test_core_net.odin @@ -10,8 +10,8 @@ A test suite for `core:net` */ -//+build !netbsd -//+build !openbsd +#+build !netbsd +#+build !openbsd package test_core_net import "core:testing" diff --git a/tests/core/net/test_core_net_freebsd.odin b/tests/core/net/test_core_net_freebsd.odin index 61e801f2b..39e364e80 100644 --- a/tests/core/net/test_core_net_freebsd.odin +++ b/tests/core/net/test_core_net_freebsd.odin @@ -10,7 +10,7 @@ A test suite for `core:net` */ -//+build freebsd +#+build freebsd package test_core_net import "core:net" diff --git a/tests/core/odin/test_file_tags.odin b/tests/core/odin/test_file_tags.odin index 4af1afc75..dc004dfe3 100644 --- a/tests/core/odin/test_file_tags.odin +++ b/tests/core/odin/test_file_tags.odin @@ -34,8 +34,8 @@ package main }, }, {// [2] src = ` -//+build linux, darwin, freebsd, openbsd, netbsd, haiku -//+build arm32, arm64 +#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build arm32, arm64 package main `, tags = { @@ -57,10 +57,10 @@ package main }, }, {// [3] src = ` -// +private -//+lazy -// +no-instrumentation -//+ignore +#+private +#+lazy +#+no-instrumentation +#+ignore // some other comment package main `, @@ -75,8 +75,8 @@ package main }, }, {// [4] src = ` -//+build-project-name foo !bar, baz -//+build js wasm32, js wasm64p32 +#+build-project-name foo !bar, baz +#+build js wasm32, js wasm64p32 package main `, tags = { diff --git a/tests/core/sys/posix/posix.odin b/tests/core/sys/posix/posix.odin index fa30d1601..760ddc1fb 100644 --- a/tests/core/sys/posix/posix.odin +++ b/tests/core/sys/posix/posix.odin @@ -1,4 +1,4 @@ -//+build darwin, freebsd, openbsd, netbsd +#+build darwin, freebsd, openbsd, netbsd package tests_core_posix import "base:runtime" diff --git a/tests/core/sys/posix/structs.odin b/tests/core/sys/posix/structs.odin index bdb1c24e3..0234e41c0 100644 --- a/tests/core/sys/posix/structs.odin +++ b/tests/core/sys/posix/structs.odin @@ -1,4 +1,4 @@ -//+build darwin, freebsd, openbsd, netbsd +#+build darwin, freebsd, openbsd, netbsd package tests_core_posix import "core:log" diff --git a/tests/core/sys/windows/test_clipboard.odin b/tests/core/sys/windows/test_clipboard.odin index 67fa6e4a2..dc482f2f8 100644 --- a/tests/core/sys/windows/test_clipboard.odin +++ b/tests/core/sys/windows/test_clipboard.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows import "core:testing" diff --git a/tests/core/sys/windows/test_kernel32.odin b/tests/core/sys/windows/test_kernel32.odin index 81331fc9f..f6a88c769 100644 --- a/tests/core/sys/windows/test_kernel32.odin +++ b/tests/core/sys/windows/test_kernel32.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows import "base:intrinsics" diff --git a/tests/core/sys/windows/test_ole32.odin b/tests/core/sys/windows/test_ole32.odin index 30bf5bc80..8be231e1f 100644 --- a/tests/core/sys/windows/test_ole32.odin +++ b/tests/core/sys/windows/test_ole32.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows import "base:intrinsics" diff --git a/tests/core/sys/windows/test_user32.odin b/tests/core/sys/windows/test_user32.odin index 0778fdf41..2fe849a6b 100644 --- a/tests/core/sys/windows/test_user32.odin +++ b/tests/core/sys/windows/test_user32.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows import "core:testing" diff --git a/tests/core/sys/windows/test_windows.odin b/tests/core/sys/windows/test_windows.odin index 724b1b7af..cab36af36 100644 --- a/tests/core/sys/windows/test_windows.odin +++ b/tests/core/sys/windows/test_windows.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows import "base:intrinsics" diff --git a/tests/core/sys/windows/test_windows_generated.odin b/tests/core/sys/windows/test_windows_generated.odin index 13d09f4e1..3d8184a8b 100644 --- a/tests/core/sys/windows/test_windows_generated.odin +++ b/tests/core/sys/windows/test_windows_generated.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows // generated by win32gen import "core:testing" diff --git a/tests/core/sys/windows/test_winerror.odin b/tests/core/sys/windows/test_winerror.odin index adbdb7ce1..baabae52b 100644 --- a/tests/core/sys/windows/test_winerror.odin +++ b/tests/core/sys/windows/test_winerror.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package test_core_sys_windows import "core:testing" diff --git a/tests/vendor/glfw/test_vendor_glfw.odin b/tests/vendor/glfw/test_vendor_glfw.odin index 8a7fb0d0a..c1a75f1a8 100644 --- a/tests/vendor/glfw/test_vendor_glfw.odin +++ b/tests/vendor/glfw/test_vendor_glfw.odin @@ -1,4 +1,4 @@ -//+build darwin, windows +#+build darwin, windows package test_vendor_glfw import "core:testing" diff --git a/tests/vendor/lua/5.4/test_vendor_lua.5.4.odin b/tests/vendor/lua/5.4/test_vendor_lua.5.4.odin index e331200ea..e5edca540 100644 --- a/tests/vendor/lua/5.4/test_vendor_lua.5.4.odin +++ b/tests/vendor/lua/5.4/test_vendor_lua.5.4.odin @@ -1,4 +1,4 @@ -//+build windows, linux, darwin +#+build windows, linux, darwin package test_vendor_lua_54 import "core:testing" diff --git a/vendor/ENet/unix.odin b/vendor/ENet/unix.odin index 1cbda5974..210e64394 100644 --- a/vendor/ENet/unix.odin +++ b/vendor/ENet/unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd, netbsd +#+build linux, darwin, freebsd, openbsd, netbsd package ENet // When we implement the appropriate bindings for Unix, the section separated diff --git a/vendor/ENet/win32.odin b/vendor/ENet/win32.odin index 0a1997ff9..f5a1c8985 100644 --- a/vendor/ENet/win32.odin +++ b/vendor/ENet/win32.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package ENet // When we implement the appropriate bindings for Windows, the section separated diff --git a/vendor/commonmark/doc.odin b/vendor/commonmark/doc.odin index 736048e56..ef788fb8f 100644 --- a/vendor/commonmark/doc.odin +++ b/vendor/commonmark/doc.odin @@ -1,4 +1,4 @@ -//+build ignore +#+build ignore /* Bindings against CMark (https://github.com/commonmark/cmark) diff --git a/vendor/directx/dxc/dxcdef_unix.odin b/vendor/directx/dxc/dxcdef_unix.odin index 530d03ff0..9f8afc0e8 100644 --- a/vendor/directx/dxc/dxcdef_unix.odin +++ b/vendor/directx/dxc/dxcdef_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd, netbsd +#+build linux, darwin, freebsd, openbsd, netbsd package directx_dxc import "core:c" diff --git a/vendor/directx/dxc/dxcdef_windows.odin b/vendor/directx/dxc/dxcdef_windows.odin index 16e6f6566..45b2f9558 100644 --- a/vendor/directx/dxc/dxcdef_windows.odin +++ b/vendor/directx/dxc/dxcdef_windows.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package directx_dxc import win32 "core:sys/windows" import dxgi "vendor:directx/dxgi" diff --git a/vendor/egl/egl.odin b/vendor/egl/egl.odin index e455a3d42..985d58457 100644 --- a/vendor/egl/egl.odin +++ b/vendor/egl/egl.odin @@ -1,4 +1,4 @@ -//+build linux +#+build linux package egl NativeDisplayType :: distinct rawptr diff --git a/vendor/fontstash/fontstash.odin b/vendor/fontstash/fontstash.odin index 2c692db06..8563277b1 100644 --- a/vendor/fontstash/fontstash.odin +++ b/vendor/fontstash/fontstash.odin @@ -1,4 +1,4 @@ -//+vet !using-param +#+vet !using-param package fontstash import "base:runtime" diff --git a/vendor/fontstash/fontstash_os.odin b/vendor/fontstash/fontstash_os.odin index 6182573bd..ed453926f 100644 --- a/vendor/fontstash/fontstash_os.odin +++ b/vendor/fontstash/fontstash_os.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package fontstash import "core:log" diff --git a/vendor/fontstash/fontstash_other.odin b/vendor/fontstash/fontstash_other.odin index 1c2ca3f28..edb76d9db 100644 --- a/vendor/fontstash/fontstash_other.odin +++ b/vendor/fontstash/fontstash_other.odin @@ -1,4 +1,4 @@ -//+build js +#+build js package fontstash AddFontPath :: proc( diff --git a/vendor/glfw/native_darwin.odin b/vendor/glfw/native_darwin.odin index b5191a913..61b2a9cb1 100644 --- a/vendor/glfw/native_darwin.odin +++ b/vendor/glfw/native_darwin.odin @@ -1,4 +1,4 @@ -//+build darwin +#+build darwin package glfw diff --git a/vendor/glfw/native_linux.odin b/vendor/glfw/native_linux.odin index acae8a27e..e1aebbbf7 100644 --- a/vendor/glfw/native_linux.odin +++ b/vendor/glfw/native_linux.odin @@ -1,4 +1,4 @@ -//+build linux +#+build linux package glfw diff --git a/vendor/glfw/native_windows.odin b/vendor/glfw/native_windows.odin index ce0dbf66f..66ed04dd7 100644 --- a/vendor/glfw/native_windows.odin +++ b/vendor/glfw/native_windows.odin @@ -1,4 +1,4 @@ -//+build windows +#+build windows package glfw diff --git a/vendor/miniaudio/common_unix.odin b/vendor/miniaudio/common_unix.odin index 89699a30d..8afcc0b5a 100644 --- a/vendor/miniaudio/common_unix.odin +++ b/vendor/miniaudio/common_unix.odin @@ -1,4 +1,4 @@ -//+build !windows +#+build !windows package miniaudio import "core:sys/unix" diff --git a/vendor/nanovg/gl/gl.odin b/vendor/nanovg/gl/gl.odin index 48998bda5..5af7ed4bc 100644 --- a/vendor/nanovg/gl/gl.odin +++ b/vendor/nanovg/gl/gl.odin @@ -1,4 +1,4 @@ -//+build windows, linux, darwin +#+build windows, linux, darwin package nanovg_gl import "core:log" diff --git a/vendor/nanovg/nanovg.odin b/vendor/nanovg/nanovg.odin index 15611cfef..540ca47cf 100644 --- a/vendor/nanovg/nanovg.odin +++ b/vendor/nanovg/nanovg.odin @@ -1,4 +1,4 @@ -//+build windows, linux, darwin +#+build windows, linux, darwin package nanovg // TODO rename structs to old nanovg style! diff --git a/vendor/stb/truetype/stb_truetype_wasm.odin b/vendor/stb/truetype/stb_truetype_wasm.odin index 472419ccb..0b5ff24bd 100644 --- a/vendor/stb/truetype/stb_truetype_wasm.odin +++ b/vendor/stb/truetype/stb_truetype_wasm.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package stb_truetype import "base:builtin" diff --git a/vendor/wasm/js/dom.odin b/vendor/wasm/js/dom.odin index 3a8bd0ac4..e19be3078 100644 --- a/vendor/wasm/js/dom.odin +++ b/vendor/wasm/js/dom.odin @@ -1,4 +1,4 @@ -//+build js wasm32, js wasm64p32 +#+build js wasm32, js wasm64p32 package wasm_js_interface foreign import dom_lib "odin_dom" diff --git a/vendor/wasm/js/dom_all_targets.odin b/vendor/wasm/js/dom_all_targets.odin index ef629b347..171deed2f 100644 --- a/vendor/wasm/js/dom_all_targets.odin +++ b/vendor/wasm/js/dom_all_targets.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package wasm_js_interface import "base:runtime" diff --git a/vendor/wasm/js/events.odin b/vendor/wasm/js/events.odin index 4e786e2be..77a8085f4 100644 --- a/vendor/wasm/js/events.odin +++ b/vendor/wasm/js/events.odin @@ -1,4 +1,4 @@ -//+build js wasm32, js wasm64p32 +#+build js wasm32, js wasm64p32 package wasm_js_interface foreign import dom_lib "odin_dom" diff --git a/vendor/wasm/js/events_all_targets.odin b/vendor/wasm/js/events_all_targets.odin index 19a004250..ccf39015d 100644 --- a/vendor/wasm/js/events_all_targets.odin +++ b/vendor/wasm/js/events_all_targets.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package wasm_js_interface diff --git a/vendor/wasm/js/general.odin b/vendor/wasm/js/general.odin index 513c60a6f..4ed2ae298 100644 --- a/vendor/wasm/js/general.odin +++ b/vendor/wasm/js/general.odin @@ -1,4 +1,4 @@ -//+build js wasm32, js wasm64p32 +#+build js wasm32, js wasm64p32 package wasm_js_interface foreign import "odin_env" diff --git a/vendor/wasm/js/memory_all_targets.odin b/vendor/wasm/js/memory_all_targets.odin index e1de6a696..e80d13c0b 100644 --- a/vendor/wasm/js/memory_all_targets.odin +++ b/vendor/wasm/js/memory_all_targets.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package wasm_js_interface import "core:mem" diff --git a/vendor/wasm/js/memory_js.odin b/vendor/wasm/js/memory_js.odin index c513cc4a1..8232cd0c9 100644 --- a/vendor/wasm/js/memory_js.odin +++ b/vendor/wasm/js/memory_js.odin @@ -1,4 +1,4 @@ -//+build js wasm32, js wasm64p32 +#+build js wasm32, js wasm64p32 package wasm_js_interface import "core:mem" diff --git a/vendor/wgpu/examples/glfw/os_glfw.odin b/vendor/wgpu/examples/glfw/os_glfw.odin index 2b1817fa5..211b1ce97 100644 --- a/vendor/wgpu/examples/glfw/os_glfw.odin +++ b/vendor/wgpu/examples/glfw/os_glfw.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package vendor_wgpu_example_triangle import "core:time" diff --git a/vendor/wgpu/examples/sdl2/os_sdl2.odin b/vendor/wgpu/examples/sdl2/os_sdl2.odin index 0e6c5b57a..6ed70452f 100644 --- a/vendor/wgpu/examples/sdl2/os_sdl2.odin +++ b/vendor/wgpu/examples/sdl2/os_sdl2.odin @@ -1,4 +1,4 @@ -//+build !js +#+build !js package vendor_wgpu_example_triangle import "core:c" diff --git a/vendor/wgpu/glfwglue/glue.odin b/vendor/wgpu/glfwglue/glue.odin index 83c497543..0da7d72b8 100644 --- a/vendor/wgpu/glfwglue/glue.odin +++ b/vendor/wgpu/glfwglue/glue.odin @@ -1,6 +1,6 @@ -//+build !linux -//+build !windows -//+build !darwin +#+build !linux +#+build !windows +#+build !darwin package wgpu_glfw_glue #panic("package wgpu/glfwglue is not supported on the current target") diff --git a/vendor/wgpu/sdl2glue/glue.odin b/vendor/wgpu/sdl2glue/glue.odin index 9da9a0738..726569f4f 100644 --- a/vendor/wgpu/sdl2glue/glue.odin +++ b/vendor/wgpu/sdl2glue/glue.odin @@ -1,6 +1,6 @@ -//+build !linux -//+build !windows -//+build !darwin +#+build !linux +#+build !windows +#+build !darwin package wgpu_sdl2_glue #panic("package wgpu/sdl2glue is not supported on the current target") diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index 0466df76d..27af6a2d8 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -1,4 +1,4 @@ -//+build linux, freebsd, openbsd +#+build linux, freebsd, openbsd package xlib /* ---- X11/extensions/XKB.h ---------------------------------------------------------*/ diff --git a/vendor/x11/xlib/xlib_keysym.odin b/vendor/x11/xlib/xlib_keysym.odin index acb16c530..61284c723 100644 --- a/vendor/x11/xlib/xlib_keysym.odin +++ b/vendor/x11/xlib/xlib_keysym.odin @@ -1,4 +1,4 @@ -//+build linux, freebsd, openbsd +#+build linux, freebsd, openbsd package xlib KeySym :: enum u32 { diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index b5365e73d..2d35ab179 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1,4 +1,4 @@ -//+build linux, openbsd, freebsd +#+build linux, openbsd, freebsd package xlib foreign import xlib "system:X11" diff --git a/vendor/x11/xlib/xlib_types.odin b/vendor/x11/xlib/xlib_types.odin index 5344d9aae..a73b8e8b8 100644 --- a/vendor/x11/xlib/xlib_types.odin +++ b/vendor/x11/xlib/xlib_types.odin @@ -1,4 +1,4 @@ -//+build linux, freebsd, openbsd +#+build linux, freebsd, openbsd package xlib // Since this is a unix-only library we make a few simplifying assumptions From 3d7b92426081cd9f3197b13f7384a52dbac5379a Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 14 Sep 2024 18:41:05 +0200 Subject: [PATCH 124/320] Fix a few incorrectly placed build tags. --- core/net/errors_darwin.odin | 2 +- core/net/errors_linux.odin | 2 +- core/net/errors_windows.odin | 2 +- core/net/interface_darwin.odin | 2 +- core/net/interface_linux.odin | 2 +- core/net/interface_windows.odin | 2 +- core/net/socket_darwin.odin | 2 +- core/net/socket_linux.odin | 2 +- core/net/socket_windows.odin | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/net/errors_darwin.odin b/core/net/errors_darwin.odin index b75336570..2905b44bc 100644 --- a/core/net/errors_darwin.odin +++ b/core/net/errors_darwin.odin @@ -1,5 +1,5 @@ -package net #+build darwin +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/errors_linux.odin b/core/net/errors_linux.odin index f53a47d15..3cd51e6fd 100644 --- a/core/net/errors_linux.odin +++ b/core/net/errors_linux.odin @@ -1,5 +1,5 @@ -package net #+build linux +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/errors_windows.odin b/core/net/errors_windows.odin index c4a880e10..f41bcf888 100644 --- a/core/net/errors_windows.odin +++ b/core/net/errors_windows.odin @@ -1,5 +1,5 @@ -package net #+build windows +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/interface_darwin.odin b/core/net/interface_darwin.odin index 6931f5188..4921bc3fe 100644 --- a/core/net/interface_darwin.odin +++ b/core/net/interface_darwin.odin @@ -1,5 +1,5 @@ -package net #+build darwin +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/interface_linux.odin b/core/net/interface_linux.odin index 85bbfd43b..28724735b 100644 --- a/core/net/interface_linux.odin +++ b/core/net/interface_linux.odin @@ -1,5 +1,5 @@ -package net #+build linux +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/interface_windows.odin b/core/net/interface_windows.odin index 02b936b0a..a6eb72846 100644 --- a/core/net/interface_windows.odin +++ b/core/net/interface_windows.odin @@ -1,5 +1,5 @@ -package net #+build windows +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/socket_darwin.odin b/core/net/socket_darwin.odin index c7b5b2761..544b345ec 100644 --- a/core/net/socket_darwin.odin +++ b/core/net/socket_darwin.odin @@ -1,5 +1,5 @@ -package net #+build darwin +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin index 1800a4a89..27d3359b5 100644 --- a/core/net/socket_linux.odin +++ b/core/net/socket_linux.odin @@ -1,5 +1,5 @@ -package net #+build linux +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. diff --git a/core/net/socket_windows.odin b/core/net/socket_windows.odin index d67f5ada1..65c26b8a8 100644 --- a/core/net/socket_windows.odin +++ b/core/net/socket_windows.odin @@ -1,5 +1,5 @@ -package net #+build windows +package net /* Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures. From 603efa860a5631f1708f6761d753146b6d47b4ba Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 14 Sep 2024 21:43:25 +0200 Subject: [PATCH 125/320] add '#caller_expression' --- base/runtime/core_builtin.odin | 4 +-- core/odin/parser/parser.odin | 10 ++++++ core/testing/testing.odin | 12 ++++--- src/check_builtin.cpp | 16 +++++++++ src/check_expr.cpp | 7 +++- src/check_type.cpp | 32 ++++++++++++++++++ src/entity.cpp | 1 + src/llvm_backend.hpp | 2 +- src/llvm_backend_proc.cpp | 62 +++++++++++++++++++++++++++++++--- 9 files changed, 133 insertions(+), 13 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 8157afe09..67d249d11 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -913,7 +913,7 @@ card :: proc "contextless" (s: $S/bit_set[$E; $U]) -> int { @builtin @(disabled=ODIN_DISABLE_ASSERT) -assert :: proc(condition: bool, message := "", loc := #caller_location) { +assert :: proc(condition: bool, message := #caller_expression(condition), loc := #caller_location) { if !condition { // NOTE(bill): This is wrapped in a procedure call // to improve performance to make the CPU not @@ -952,7 +952,7 @@ unimplemented :: proc(message := "", loc := #caller_location) -> ! { @builtin @(disabled=ODIN_DISABLE_ASSERT) -assert_contextless :: proc "contextless" (condition: bool, message := "", loc := #caller_location) { +assert_contextless :: proc "contextless" (condition: bool, message := #caller_expression(condition), loc := #caller_location) { if !condition { // NOTE(bill): This is wrapped in a procedure call // to improve performance to make the CPU not diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index aab59c29d..6f42c17db 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2277,6 +2277,16 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { bd.name = name.text return bd + case "caller_expression": + bd := ast.new(ast.Basic_Directive, tok.pos, end_pos(name)) + bd.tok = tok + bd.name = name.text + + if peek_token_kind(p, .Open_Paren) { + return parse_call_expr(p, bd) + } + return bd + case "location", "exists", "load", "load_directory", "load_hash", "hash", "assert", "panic", "defined", "config": bd := ast.new(ast.Basic_Directive, tok.pos, end_pos(name)) bd.tok = tok diff --git a/core/testing/testing.odin b/core/testing/testing.odin index d5e7c6830..09bf6dc0e 100644 --- a/core/testing/testing.odin +++ b/core/testing/testing.odin @@ -105,9 +105,13 @@ cleanup :: proc(t: ^T, procedure: proc(rawptr), user_data: rawptr) { append(&t.cleanups, Internal_Cleanup{procedure, user_data, context}) } -expect :: proc(t: ^T, ok: bool, msg: string = "", loc := #caller_location) -> bool { +expect :: proc(t: ^T, ok: bool, msg := "", expr := #caller_expression(ok), loc := #caller_location) -> bool { if !ok { - log.error(msg, location=loc) + if msg == "" { + log.errorf("expected %v to be true", expr, location=loc) + } else { + log.error(msg, location=loc) + } } return ok } @@ -119,10 +123,10 @@ expectf :: proc(t: ^T, ok: bool, format: string, args: ..any, loc := #caller_loc return ok } -expect_value :: proc(t: ^T, value, expected: $T, loc := #caller_location) -> bool where intrinsics.type_is_comparable(T) { +expect_value :: proc(t: ^T, value, expected: $T, loc := #caller_location, value_expr := #caller_expression(value)) -> bool where intrinsics.type_is_comparable(T) { ok := value == expected || reflect.is_nil(value) && reflect.is_nil(expected) if !ok { - log.errorf("expected %v, got %v", expected, value, location=loc) + log.errorf("expected %v to be %v, got %v", value_expr, expected, value, location=loc) } return ok } diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 888aa074d..909eb668e 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1632,6 +1632,22 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o operand->type = t_source_code_location; operand->mode = Addressing_Value; + } else if (name == "caller_expression") { + if (ce->args.count > 1) { + error(ce->args[0], "'#caller_expression' expects either 0 or 1 arguments, got %td", ce->args.count); + } + if (ce->args.count > 0) { + Ast *arg = ce->args[0]; + Operand o = {}; + Entity *e = check_ident(c, &o, arg, nullptr, nullptr, true); + if (e == nullptr || (e->flags & EntityFlag_Param) == 0) { + error(ce->args[0], "'#caller_expression' expected a valid earlier parameter name"); + } + arg->Ident.entity = e; + } + + operand->type = t_string; + operand->mode = Addressing_Value; } else if (name == "exists") { if (ce->args.count != 1) { error(ce->close, "'#exists' expects 1 argument, got %td", ce->args.count); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 7f82fb58a..6776094bf 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7807,7 +7807,8 @@ gb_internal ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *c name == "load" || name == "load_directory" || name == "load_hash" || - name == "hash" + name == "hash" || + name == "caller_expression" ) { operand->mode = Addressing_Builtin; operand->builtin_id = BuiltinProc_DIRECTIVE; @@ -8725,6 +8726,10 @@ gb_internal ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, A error(node, "#caller_location may only be used as a default argument parameter"); o->type = t_source_code_location; o->mode = Addressing_Value; + } else if (name == "caller_expression") { + error(node, "#caller_expression may only be used as a default argument parameter"); + o->type = t_string; + o->mode = Addressing_Value; } else { if (name == "location") { init_core_source_code_location(c->checker); diff --git a/src/check_type.cpp b/src/check_type.cpp index 3767f7666..f0e0acb9b 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1605,6 +1605,25 @@ gb_internal bool is_expr_from_a_parameter(CheckerContext *ctx, Ast *expr) { return false; } +gb_internal bool is_caller_expression(Ast *expr) { + if (expr->kind == Ast_BasicDirective && expr->BasicDirective.name.string == "caller_expression") { + return true; + } + + Ast *call = unparen_expr(expr); + if (call->kind != Ast_CallExpr) { + return false; + } + + ast_node(ce, CallExpr, call); + if (ce->proc->kind != Ast_BasicDirective) { + return false; + } + + ast_node(bd, BasicDirective, ce->proc); + String name = bd->name.string; + return name == "caller_expression"; +} gb_internal ParameterValue handle_parameter_value(CheckerContext *ctx, Type *in_type, Type **out_type_, Ast *expr, bool allow_caller_location) { ParameterValue param_value = {}; @@ -1626,7 +1645,19 @@ gb_internal ParameterValue handle_parameter_value(CheckerContext *ctx, Type *in_ if (in_type) { check_assignment(ctx, &o, in_type, str_lit("parameter value")); } + } else if (is_caller_expression(expr)) { + if (expr->kind != Ast_BasicDirective) { + check_builtin_procedure_directive(ctx, &o, expr, t_string); + } + param_value.kind = ParameterValue_Expression; + o.type = t_string; + o.mode = Addressing_Value; + o.expr = expr; + + if (in_type) { + check_assignment(ctx, &o, in_type, str_lit("parameter value")); + } } else { if (in_type) { check_expr_with_type_hint(ctx, &o, expr, in_type); @@ -1858,6 +1889,7 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para case ParameterValue_Nil: break; case ParameterValue_Location: + case ParameterValue_Expression: case ParameterValue_Value: gbString str = type_to_string(type); error(params[i], "A default value for a parameter must not be a polymorphic constant type, got %s", str); diff --git a/src/entity.cpp b/src/entity.cpp index db6ffdd52..0c4a20df4 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -104,6 +104,7 @@ enum ParameterValueKind { ParameterValue_Constant, ParameterValue_Nil, ParameterValue_Location, + ParameterValue_Expression, ParameterValue_Value, }; diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 29d2ccfe6..68f95cb03 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -528,7 +528,7 @@ gb_internal lbAddr lb_store_range_stmt_val(lbProcedure *p, Ast *stmt_val, lbValu gb_internal lbValue lb_emit_source_code_location_const(lbProcedure *p, String const &procedure, TokenPos const &pos); gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String const &procedure, TokenPos const &pos); -gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TokenPos const &pos); +gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TypeProc *procedure_type, Ast *call_expression); gb_internal lbValue lb_equal_proc_for_type(lbModule *m, Type *type); gb_internal lbValue lb_hasher_proc_for_type(lbModule *m, Type *type); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index e850d3364..d84599eb0 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -699,7 +699,9 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) { } if (e->Variable.param_value.kind != ParameterValue_Invalid) { - lbValue c = lb_handle_param_value(p, e->type, e->Variable.param_value, e->token.pos); + GB_ASSERT(e->Variable.param_value.kind != ParameterValue_Location); + GB_ASSERT(e->Variable.param_value.kind != ParameterValue_Expression); + lbValue c = lb_handle_param_value(p, e->type, e->Variable.param_value, nullptr, nullptr); lb_addr_store(p, res, c); } @@ -3420,7 +3422,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu } -gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TokenPos const &pos) { +gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, ParameterValue const ¶m_value, TypeProc *procedure_type, Ast* call_expression) { switch (param_value.kind) { case ParameterValue_Constant: if (is_type_constant_type(parameter_type)) { @@ -3446,8 +3448,60 @@ gb_internal lbValue lb_handle_param_value(lbProcedure *p, Type *parameter_type, if (p->entity != nullptr) { proc_name = p->entity->token.string; } + + ast_node(ce, CallExpr, call_expression); + TokenPos pos = ast_token(ce->proc).pos; + return lb_emit_source_code_location_as_global(p, proc_name, pos); } + case ParameterValue_Expression: + { + Ast *orig = param_value.original_ast_expr; + if (orig->kind == Ast_BasicDirective) { + gbString expr = expr_to_string(call_expression, temporary_allocator()); + return lb_const_string(p->module, make_string_c(expr)); + } + + isize param_idx = -1; + String param_str = {0}; + { + Ast *call = unparen_expr(orig); + GB_ASSERT(call->kind == Ast_CallExpr); + ast_node(ce, CallExpr, call); + GB_ASSERT(ce->proc->kind == Ast_BasicDirective); + GB_ASSERT(ce->args.count == 1); + Ast *target = ce->args[0]; + GB_ASSERT(target->kind == Ast_Ident); + String target_str = target->Ident.token.string; + + param_idx = lookup_procedure_parameter(procedure_type, target_str); + param_str = target_str; + } + GB_ASSERT(param_idx >= 0); + + + Ast *target_expr = nullptr; + ast_node(ce, CallExpr, call_expression); + + if (ce->split_args->positional.count > param_idx) { + target_expr = ce->split_args->positional[param_idx]; + } + + for_array(i, ce->split_args->named) { + Ast *arg = ce->split_args->named[i]; + ast_node(fv, FieldValue, arg); + GB_ASSERT(fv->field->kind == Ast_Ident); + String name = fv->field->Ident.token.string; + if (name == param_str) { + target_expr = fv->value; + break; + } + } + + gbString expr = expr_to_string(target_expr, temporary_allocator()); + return lb_const_string(p->module, make_string_c(expr)); + } + case ParameterValue_Value: return lb_build_expr(p, param_value.ast_value); } @@ -3739,8 +3793,6 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { } } - TokenPos pos = ast_token(ce->proc).pos; - if (pt->params != nullptr) { isize min_count = pt->params->Tuple.variables.count; @@ -3764,7 +3816,7 @@ gb_internal lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) { args[arg_index] = lb_const_nil(p->module, e->type); break; case Entity_Variable: - args[arg_index] = lb_handle_param_value(p, e->type, e->Variable.param_value, pos); + args[arg_index] = lb_handle_param_value(p, e->type, e->Variable.param_value, pt, expr); break; case Entity_Constant: From d03d9e49a6290b29a3259f99c4cdf574988b5765 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 15 Sep 2024 00:03:20 +0200 Subject: [PATCH 126/320] fix #4243 --- src/llvm_backend_debug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index bb6a1ba4f..5cc79dcc8 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -571,7 +571,7 @@ gb_internal LLVMMetadataRef lb_debug_bitfield(lbModule *m, Type *type, String na GB_ASSERT(f->kind == Entity_Variable); String name = f->token.string; elements[i] = LLVMDIBuilderCreateBitFieldMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, line, - bit_size, offset_in_bits, offset_in_bits, + bit_size, offset_in_bits, 0, LLVMDIFlagZero, lb_debug_type(m, f->type) ); From aa91479870251894b36e723d2c29d771e9af64ba Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 14 Sep 2024 17:01:15 -0600 Subject: [PATCH 127/320] Fix O_NOFOLLOW typo. Add Linux support for POSIX fcntl. --- core/sys/posix/fcntl.odin | 152 +++++++++++++++++++++++++++----------- 1 file changed, 109 insertions(+), 43 deletions(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index ca030a9a5..bb2e6835b 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -107,11 +107,11 @@ O_Flag_Bits :: enum c.int { // If terminal device, do not make it the controlling terminal for the process. NOCTTY = log2(O_NOCTTY), // Don't follow symbolic links, fail with errno ELOOP. - NOFOLLOW = log2(O_NOFOLOW), + NOFOLLOW = log2(O_NOFOLLOW), // If exists and regular, truncate the length to 0. TRUNC = log2(O_TRUNC), - // NOTE: use with `posix.O_TTY_INIT + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // NOTE: use with `posix.O_TTY_INIT + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in // this bit set enum because it is 0 on some platforms and a value on others. // TTY_INIT = O_TTY_INIT, @@ -123,7 +123,7 @@ O_Flag_Bits :: enum c.int { NONBLOCK = log2(O_NONBLOCK), // Write I/O shall complete as defined by synchronized I/O file integrity completion. SYNC = log2(O_SYNC), - // NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in // this bit set enum because it is 0 on some platforms and a value on others. // RSYNC = O_RSYNC, @@ -135,7 +135,6 @@ O_Flag_Bits :: enum c.int { WRONLY = log2(O_WRONLY), // Reading only. // RDONLY = 0, // Default - } O_Flags :: bit_set[O_Flag_Bits; c.int] @@ -152,8 +151,8 @@ AT_Flags :: bit_set[AT_Flag_Bits; c.int] when ODIN_OS == .Darwin { - off_t :: distinct c.int64_t - pid_t :: distinct c.int32_t + off_t :: distinct c.int64_t + pid_t :: distinct c.int32_t F_DUPFD :: 0 F_DUPFD_CLOEXEC :: 67 @@ -178,7 +177,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x00100000 O_EXCL :: 0x00000800 O_NOCTTY :: 0x00020000 - O_NOFOLOW :: 0x00000100 + O_NOFOLLOW :: 0x00000100 O_TRUNC :: 0x00000400 _O_TTY_INIT :: 0 @@ -189,18 +188,18 @@ when ODIN_OS == .Darwin { O_NONBLOCK :: 0x00000004 O_SYNC :: 0x0080 - _O_RSYNC :: 0 - O_RSYNC :: O_Flags{} + _O_RSYNC :: 0 + O_RSYNC :: O_Flags{} - O_EXEC :: 0x40000000 - O_RDONLY :: 0 - O_RDWR :: 0x0002 - O_WRONLY :: 0x0001 + O_EXEC :: 0x40000000 + O_RDONLY :: 0 + O_RDWR :: 0x0002 + O_WRONLY :: 0x0001 _O_SEARCH :: O_EXEC | O_DIRECTORY - O_SEARCH :: O_Flags{ .EXEC, .DIRECTORY } + O_SEARCH :: O_Flags{.EXEC, .DIRECTORY} - AT_FDCWD: FD: -2 + AT_FDCWD: FD : -2 AT_EACCESS :: 0x0010 AT_SYMLINK_NOFOLLOW :: 0x0020 @@ -217,8 +216,8 @@ when ODIN_OS == .Darwin { } else when ODIN_OS == .FreeBSD { - off_t :: distinct c.int64_t - pid_t :: distinct c.int32_t + off_t :: distinct c.int64_t + pid_t :: distinct c.int32_t F_DUPFD :: 0 F_DUPFD_CLOEXEC :: 17 @@ -243,7 +242,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x00020000 O_EXCL :: 0x0800 O_NOCTTY :: 0x8000 - O_NOFOLOW :: 0x0100 + O_NOFOLLOW :: 0x0100 O_TRUNC :: 0x0400 _O_TTY_INIT :: 0x00080000 @@ -256,15 +255,15 @@ when ODIN_OS == .Darwin { _O_RSYNC :: 0 O_RSYNC :: O_Flags{} // NOTE: not defined in headers - O_EXEC :: 0x00040000 - O_RDONLY :: 0 - O_RDWR :: 0x0002 - O_WRONLY :: 0x0001 + O_EXEC :: 0x00040000 + O_RDONLY :: 0 + O_RDWR :: 0x0002 + O_WRONLY :: 0x0001 _O_SEARCH :: O_EXEC O_SEARCH :: O_Flags{ .EXEC } - AT_FDCWD: FD: -100 + AT_FDCWD: FD : -100 AT_EACCESS :: 0x0100 AT_SYMLINK_NOFOLLOW :: 0x0200 @@ -282,8 +281,8 @@ when ODIN_OS == .Darwin { } else when ODIN_OS == .NetBSD { - off_t :: distinct c.int64_t - pid_t :: distinct c.int32_t + off_t :: distinct c.int64_t + pid_t :: distinct c.int32_t F_DUPFD :: 0 F_DUPFD_CLOEXEC :: 12 @@ -308,7 +307,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x0020000 O_EXCL :: 0x0800 O_NOCTTY :: 0x8000 - O_NOFOLOW :: 0x0100 + O_NOFOLLOW :: 0x0100 O_TRUNC :: 0x0400 _O_TTY_INIT :: 0 @@ -319,19 +318,19 @@ when ODIN_OS == .Darwin { O_NONBLOCK :: 0x0004 O_SYNC :: 0x0080 - _O_RSYNC :: 0x0002 - O_RSYNC :: O_Flags{O_Flag_Bits(log2(_O_RSYNC))} + _O_RSYNC :: 0x0002 + O_RSYNC :: O_Flags{O_Flag_Bits(log2(_O_RSYNC))} - O_EXEC :: 0x04000000 - O_RDONLY :: 0 - O_RDWR :: 0x0002 - O_WRONLY :: 0x0001 + O_EXEC :: 0x04000000 + O_RDONLY :: 0 + O_RDWR :: 0x0002 + O_WRONLY :: 0x0001 _O_SEARCH :: 0x00800000 O_SEARCH :: O_Flags{O_Flag_Bits(log2(_O_SEARCH))} - AT_FDCWD: FD: -100 + AT_FDCWD: FD : -100 AT_EACCESS :: 0x100 AT_SYMLINK_NOFOLLOW :: 0x200 @@ -347,8 +346,8 @@ when ODIN_OS == .Darwin { } } else when ODIN_OS == .OpenBSD { - off_t :: distinct c.int64_t - pid_t :: distinct c.int32_t + off_t :: distinct c.int64_t + pid_t :: distinct c.int32_t F_DUPFD :: 0 F_DUPFD_CLOEXEC :: 10 @@ -373,7 +372,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x20000 O_EXCL :: 0x0800 O_NOCTTY :: 0x8000 - O_NOFOLOW :: 0x0100 + O_NOFOLLOW :: 0x0100 O_TRUNC :: 0x0400 _O_TTY_INIT :: 0 @@ -384,18 +383,18 @@ when ODIN_OS == .Darwin { O_NONBLOCK :: 0x0004 O_SYNC :: 0x0080 - _O_RSYNC :: O_SYNC - O_RSYNC :: O_Flags{ .SYNC } + _O_RSYNC :: O_SYNC + O_RSYNC :: O_Flags{.SYNC} - O_EXEC :: 0x04000000 // NOTE: not defined in the headers - O_RDONLY :: 0 - O_RDWR :: 0x0002 - O_WRONLY :: 0x0001 + O_EXEC :: 0x04000000 // NOTE: not defined in the headers + O_RDONLY :: 0 + O_RDWR :: 0x0002 + O_WRONLY :: 0x0001 _O_SEARCH :: 0 O_SEARCH :: O_Flags{} // NOTE: not defined in the headers - AT_FDCWD: FD: -100 + AT_FDCWD: FD : -100 AT_EACCESS :: 0x01 AT_SYMLINK_NOFOLLOW :: 0x02 @@ -410,6 +409,73 @@ when ODIN_OS == .Darwin { l_whence: c.short, /* [PSX] flag (Whence) of starting offset */ } +} else when ODIN_OS == .Linux { + + off_t :: distinct c.int64_t + pid_t :: distinct c.int + + F_DUPFD :: 0 // Duplicate file descriptor. + F_GETFD :: 1 /* Get file descriptor flags. */ + F_SETFD :: 2 /* Set file descriptor flags. */ + F_GETFL :: 3 /* Get file status flags. */ + F_SETFL :: 4 /* Set file status flags. */ + F_GETLK :: 5 /* Get record locking info. */ + F_SETLK :: 6 /* Set record locking info (non-blocking). */ + F_SETLKW :: 7 /* Set record locking info (blocking). */ + F_SETOWN :: 8 /* Get owner (process receiving SIGIO). */ + F_GETOWN :: 9 /* Set owner (process receiving SIGIO). */ + F_RDLCK :: 0 /* Read lock. */ + F_UNLCK :: 2 /* Remove lock. */ + F_WRLCK :: 1 /* Write lock. */ + + F_DUPFD_CLOEXEC :: 1030 /* Duplicate file descriptor with close-on-exit set. */ + + FD_CLOEXEC :: 1 + + O_CREAT :: 0o0_000_100 + O_EXCL :: 0o0_000_200 + O_NOCTTY :: 0o0_000_400 + O_TRUNC :: 0o0_001_000 + O_DIRECTORY :: 0o0_200_000 + O_NOFOLLOW :: 0o0_400_000 + O_CLOEXEC :: 0o2_000_000 + + _O_TTY_INIT :: 0 + O_TTY_INIT :: O_Flags{} + + O_APPEND :: 0o0_002_000 + O_NONBLOCK :: 0o0_004_000 + O_DSYNC :: 0o0_010_000 + O_SYNC :: 0o4_010_000 + + _O_RSYNC :: 0 + O_RSYNC :: O_Flags{} + + // NOTE: Not implemented in Linux + O_EXEC :: 0 + + O_RDONLY :: 0 + O_WRONLY :: 0o1 + O_RDWR :: 0o2 + + _O_SEARCH :: 0 + O_SEARCH :: O_Flags{} + + AT_FDCWD: FD : -100 // Special value used to indicate the *at functions should use the current working directory. + + AT_EACCESS :: 0x200 // Test access permitted for effective IDs, not real IDs. + AT_SYMLINK_NOFOLLOW :: 0x100 // Do not follow symbolic links. + AT_SYMLINK_FOLLOW :: 0x400 // Follow symbolic links. + AT_REMOVEDIR :: 0x200 // Remove directory instead of unlinking file. + + flock :: struct { + l_start: off_t, // [PSX] relative offset in bytes. + l_len: off_t, // [PSX] size; if 0 then until EOF. + l_pid: pid_t, // [PSX] process ID of the process holding the lock. + l_type: Lock_Type, // [PSX] type of lock. + l_whence: c.short, // [PSX] flag (Whence) of starting offset. + } + } else { #panic("posix is unimplemented for the current target") } From 8616842ec6694b14f3c3f534c92bda670304c4ed Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 14 Sep 2024 20:23:42 -0600 Subject: [PATCH 128/320] Implement Linux POSIX compliance for poll, sched, sys/select. Fix enum in fcntl. --- core/sys/posix/fcntl.odin | 10 +++++----- core/sys/posix/poll.odin | 6 +++--- core/sys/posix/sched.odin | 2 +- core/sys/posix/sys_select.odin | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index bb2e6835b..d48e39d02 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -128,7 +128,7 @@ O_Flag_Bits :: enum c.int { // RSYNC = O_RSYNC, // Execute only. - EXEC = log2(O_EXEC), + EXEC = O_EXEC when ODIN_OS == .Linux else log2(O_EXEC), // Reading and writing. RDWR = log2(O_RDWR), // Writing only. @@ -177,7 +177,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x00100000 O_EXCL :: 0x00000800 O_NOCTTY :: 0x00020000 - O_NOFOLLOW :: 0x00000100 + O_NOFOLLOW :: 0x00000100 O_TRUNC :: 0x00000400 _O_TTY_INIT :: 0 @@ -242,7 +242,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x00020000 O_EXCL :: 0x0800 O_NOCTTY :: 0x8000 - O_NOFOLLOW :: 0x0100 + O_NOFOLLOW :: 0x0100 O_TRUNC :: 0x0400 _O_TTY_INIT :: 0x00080000 @@ -307,7 +307,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x0020000 O_EXCL :: 0x0800 O_NOCTTY :: 0x8000 - O_NOFOLLOW :: 0x0100 + O_NOFOLLOW :: 0x0100 O_TRUNC :: 0x0400 _O_TTY_INIT :: 0 @@ -372,7 +372,7 @@ when ODIN_OS == .Darwin { O_DIRECTORY :: 0x20000 O_EXCL :: 0x0800 O_NOCTTY :: 0x8000 - O_NOFOLLOW :: 0x0100 + O_NOFOLLOW :: 0x0100 O_TRUNC :: 0x0400 _O_TTY_INIT :: 0 diff --git a/core/sys/posix/poll.odin b/core/sys/posix/poll.odin index 7f23de267..3d403d625 100644 --- a/core/sys/posix/poll.odin +++ b/core/sys/posix/poll.odin @@ -27,9 +27,9 @@ foreign lib { nfds_t :: c.uint Poll_Error :: enum c.int { - EAGAIN = Errno.EAGAIN, - EINTR = Errno.EINTR, - EINVAL = Errno.EINVAL, + EAGAIN = cast(c.int)Errno.EAGAIN, + EINTR = cast(c.int)Errno.EINTR, + EINVAL = cast(c.int)Errno.EINVAL, } Poll_Event_Bits :: enum c.short { diff --git a/core/sys/posix/sched.odin b/core/sys/posix/sched.odin index 6623ba6e6..3923257aa 100644 --- a/core/sys/posix/sched.odin +++ b/core/sys/posix/sched.odin @@ -94,7 +94,7 @@ when ODIN_OS == .Darwin { SCHED_RR :: 3 SCHED_OTHER :: 2 -} else when ODIN_OS == .NetBSD { +} else when ODIN_OS == .NetBSD || ODIN_OS == .Linux { SCHED_OTHER :: 0 SCHED_FIFO :: 1 diff --git a/core/sys/posix/sys_select.odin b/core/sys/posix/sys_select.odin index 3392e02bc..c20636b21 100644 --- a/core/sys/posix/sys_select.odin +++ b/core/sys/posix/sys_select.odin @@ -55,7 +55,7 @@ when ODIN_OS == .NetBSD { LSELECT :: "select" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { suseconds_t :: distinct (c.int32_t when ODIN_OS == .Darwin || ODIN_OS == .NetBSD else c.long) From 97e06cb98e890643d17f5ebca3b029f4dd21d6aa Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sun, 15 Sep 2024 18:43:51 -0600 Subject: [PATCH 129/320] Fix bit flags on fcntl linux POSIX implemention. Add sys/sem linux implementation. --- core/sys/posix/fcntl.odin | 9 +++++++-- core/sys/posix/sys_sem.odin | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index d48e39d02..3350238e4 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -123,12 +123,16 @@ O_Flag_Bits :: enum c.int { NONBLOCK = log2(O_NONBLOCK), // Write I/O shall complete as defined by synchronized I/O file integrity completion. SYNC = log2(O_SYNC), + // NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in // this bit set enum because it is 0 on some platforms and a value on others. // RSYNC = O_RSYNC, // Execute only. - EXEC = O_EXEC when ODIN_OS == .Linux else log2(O_EXEC), + // NOTE: use with `posix.O_ENTER + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + // EXEC = O_EXEC + // Reading and writing. RDWR = log2(O_RDWR), // Writing only. @@ -139,7 +143,8 @@ O_Flag_Bits :: enum c.int { O_Flags :: bit_set[O_Flag_Bits; c.int] // A mask of all the access mode bits. -O_ACCMODE :: O_Flags{ .EXEC, .RDWR, .WRONLY } +// NOTE: .EXEC and .RDONLY also belong here, but they are 0 on some platforms. +O_ACCMODE :: O_Flags{ .RDWR, .WRONLY } AT_Flag_Bits :: enum c.int { EACCESS = log2(AT_EACCESS), diff --git a/core/sys/posix/sys_sem.odin b/core/sys/posix/sys_sem.odin index 3fcde325b..9f45ab1fe 100644 --- a/core/sys/posix/sys_sem.odin +++ b/core/sys/posix/sys_sem.odin @@ -127,6 +127,36 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS sem_flg: c.short, /* [PSX] operation flags */ } +} else when ODIN_OS == .Linux { + + SEM_UNDO :: 0x1000 // undo the operation on exit + + // Commands for `semctl'. + GETPID :: 11 + GETVAL :: 12 + GETALL :: 13 + GETNCNT :: 14 + GETZCNT :: 15 + SETVAL :: 16 + SETALL :: 17 + + semid_ds :: struct { + sem_perm: ipc_perm, // [PSX] operation permission structure + sem_otime: time_t, // [PSX] last semop() + __sem_otime_high: c.ulong, + sem_ctime: time_t, // [PSX] last time changed by semctl() + __sem_ctime_high: c.ulong, + sem_nsems: c.ulong, // [PSX] number of semaphores in set + __glibc_reserved3: c.ulong, + __glibc_reserved4: c.ulong, + } + + sembuf :: struct { + sem_num: c.ushort, /* [PSX] semaphore number */ + sem_op: c.short, /* [PSX] semaphore operation */ + sem_flg: c.short, /* [PSX] operation flags */ + } + } else { #panic("posix is unimplemented for the current target") } From d38f5ffb49733b5084b9419412acf9381e3073d4 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 15 Sep 2024 22:00:53 -0400 Subject: [PATCH 130/320] Remove unneeded synchronizations in `Chan` Everything was already guarded by `c.mutex`. --- core/sync/chan/chan.odin | 78 ++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/core/sync/chan/chan.odin b/core/sync/chan/chan.odin index 5b9a764b4..c470d15f3 100644 --- a/core/sync/chan/chan.odin +++ b/core/sync/chan/chan.odin @@ -22,19 +22,17 @@ Raw_Chan :: struct { allocator: runtime.Allocator, allocation_size: int, msg_size: u16, - closed: b16, // atomic + closed: b16, // guarded by `mutex` mutex: sync.Mutex, r_cond: sync.Cond, w_cond: sync.Cond, - r_waiting: int, // atomic - w_waiting: int, // atomic + r_waiting: int, // guarded by `mutex` + w_waiting: int, // guarded by `mutex` // Buffered queue: ^Raw_Queue, // Unbuffered - r_mutex: sync.Mutex, - w_mutex: sync.Mutex, unbuffered_data: rawptr, } @@ -164,32 +162,30 @@ send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) { } if c.queue != nil { // buffered sync.guard(&c.mutex) - for !sync.atomic_load(&c.closed) && - c.queue.len == c.queue.cap { - sync.atomic_add(&c.w_waiting, 1) + for !c.closed && c.queue.len == c.queue.cap { + c.w_waiting += 1 sync.wait(&c.w_cond, &c.mutex) - sync.atomic_sub(&c.w_waiting, 1) + c.w_waiting -= 1 } - if sync.atomic_load(&c.closed) { + if c.closed { return false } ok = raw_queue_push(c.queue, msg_in) - if sync.atomic_load(&c.r_waiting) > 0 { + if c.r_waiting > 0 { sync.signal(&c.r_cond) } } else if c.unbuffered_data != nil { // unbuffered - sync.guard(&c.w_mutex) sync.guard(&c.mutex) - if sync.atomic_load(&c.closed) { + if c.closed { return false } mem.copy(c.unbuffered_data, msg_in, int(c.msg_size)) - sync.atomic_add(&c.w_waiting, 1) - if sync.atomic_load(&c.r_waiting) > 0 { + c.w_waiting += 1 + if c.r_waiting > 0 { sync.signal(&c.r_cond) } sync.wait(&c.w_cond, &c.mutex) @@ -206,13 +202,13 @@ recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> (ok: bool) { if c.queue != nil { // buffered sync.guard(&c.mutex) for c.queue.len == 0 { - if sync.atomic_load(&c.closed) { + if c.closed { return } - sync.atomic_add(&c.r_waiting, 1) + c.r_waiting += 1 sync.wait(&c.r_cond, &c.mutex) - sync.atomic_sub(&c.r_waiting, 1) + c.r_waiting -= 1 } msg := raw_queue_pop(c.queue) @@ -220,27 +216,26 @@ recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> (ok: bool) { mem.copy(msg_out, msg, int(c.msg_size)) } - if sync.atomic_load(&c.w_waiting) > 0 { + if c.w_waiting > 0 { sync.signal(&c.w_cond) } ok = true } else if c.unbuffered_data != nil { // unbuffered - sync.guard(&c.r_mutex) sync.guard(&c.mutex) - for !sync.atomic_load(&c.closed) && - sync.atomic_load(&c.w_waiting) == 0 { - sync.atomic_add(&c.r_waiting, 1) + for !c.closed && + c.w_waiting == 0 { + c.r_waiting += 1 sync.wait(&c.r_cond, &c.mutex) - sync.atomic_sub(&c.r_waiting, 1) + c.r_waiting -= 1 } - if sync.atomic_load(&c.closed) { + if c.closed { return } mem.copy(msg_out, c.unbuffered_data, int(c.msg_size)) - sync.atomic_sub(&c.w_waiting, 1) + c.w_waiting -= 1 sync.signal(&c.w_cond) ok = true @@ -260,25 +255,24 @@ try_send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) return false } - if sync.atomic_load(&c.closed) { + if c.closed { return false } ok = raw_queue_push(c.queue, msg_in) - if sync.atomic_load(&c.r_waiting) > 0 { + if c.r_waiting > 0 { sync.signal(&c.r_cond) } } else if c.unbuffered_data != nil { // unbuffered - sync.guard(&c.w_mutex) sync.guard(&c.mutex) - if sync.atomic_load(&c.closed) { + if c.closed { return false } mem.copy(c.unbuffered_data, msg_in, int(c.msg_size)) - sync.atomic_add(&c.w_waiting, 1) - if sync.atomic_load(&c.r_waiting) > 0 { + c.w_waiting += 1 + if c.r_waiting > 0 { sync.signal(&c.r_cond) } sync.wait(&c.w_cond, &c.mutex) @@ -303,21 +297,19 @@ try_recv_raw :: proc "contextless" (c: ^Raw_Chan, msg_out: rawptr) -> bool { mem.copy(msg_out, msg, int(c.msg_size)) } - if sync.atomic_load(&c.w_waiting) > 0 { + if c.w_waiting > 0 { sync.signal(&c.w_cond) } return true } else if c.unbuffered_data != nil { // unbuffered - sync.guard(&c.r_mutex) sync.guard(&c.mutex) - if sync.atomic_load(&c.closed) || - sync.atomic_load(&c.w_waiting) == 0 { + if c.closed || c.w_waiting == 0 { return false } mem.copy(msg_out, c.unbuffered_data, int(c.msg_size)) - sync.atomic_sub(&c.w_waiting, 1) + c.w_waiting -= 1 sync.signal(&c.w_cond) return true @@ -360,10 +352,10 @@ close :: proc "contextless" (c: ^Raw_Chan) -> bool { return false } sync.guard(&c.mutex) - if sync.atomic_load(&c.closed) { + if c.closed { return false } - sync.atomic_store(&c.closed, true) + c.closed = true sync.broadcast(&c.r_cond) sync.broadcast(&c.w_cond) return true @@ -375,7 +367,7 @@ is_closed :: proc "contextless" (c: ^Raw_Chan) -> bool { return true } sync.guard(&c.mutex) - return bool(sync.atomic_load(&c.closed)) + return bool(c.closed) } @@ -434,7 +426,7 @@ can_recv :: proc "contextless" (c: ^Raw_Chan) -> bool { if is_buffered(c) { return c.queue.len > 0 } - return sync.atomic_load(&c.w_waiting) > 0 + return c.w_waiting > 0 } @@ -444,7 +436,7 @@ can_send :: proc "contextless" (c: ^Raw_Chan) -> bool { if is_buffered(c) { return c.queue.len < c.queue.cap } - return sync.atomic_load(&c.w_waiting) == 0 + return c.w_waiting == 0 } @@ -493,4 +485,4 @@ select_raw :: proc "odin" (recvs: []^Raw_Chan, sends: []^Raw_Chan, send_msgs: [] ok = send_raw(sends[sel.idx], send_msgs[sel.idx]) } return -} \ No newline at end of file +} From 16ef59700b68989beff48039a450ef6153b2e6af Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 15 Sep 2024 23:58:03 -0400 Subject: [PATCH 131/320] Check for `EINTR` in `sys/posix` test --- tests/core/sys/posix/structs.odin | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/core/sys/posix/structs.odin b/tests/core/sys/posix/structs.odin index bdb1c24e3..95b6258f4 100644 --- a/tests/core/sys/posix/structs.odin +++ b/tests/core/sys/posix/structs.odin @@ -63,6 +63,9 @@ execute_struct_checks :: proc(t: ^testing.T) { waiting: for { status: i32 wpid := posix.waitpid(pid, &status, {}) + if status == posix.EINTR { + continue + } if !testing.expectf(t, wpid != -1, "waitpid() failure: %v", posix.strerror()) { return false } From fff99c726e53808b5b75a89ae66e5e84ab19268e Mon Sep 17 00:00:00 2001 From: pkova Date: Tue, 17 Sep 2024 01:52:51 +0300 Subject: [PATCH 132/320] Fix core sync test deadlock on darwin --- core/sync/futex_darwin.odin | 10 ++++++++-- core/sys/darwin/sync.odin | 7 +++++++ tests/core/sync/test_core_sync.odin | 1 - 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin index daefd6699..3915a414d 100644 --- a/core/sync/futex_darwin.odin +++ b/core/sync/futex_darwin.odin @@ -12,6 +12,7 @@ foreign System { // __ulock_wait is not available on 10.15 // See https://github.com/odin-lang/Odin/issues/1959 __ulock_wait :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_us: u32) -> c.int --- + __ulock_wait2 :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_ns: u64, value2: u64) -> c.int --- __ulock_wake :: proc "c" (operation: u32, addr: rawptr, wake_value: u64) -> c.int --- } @@ -52,8 +53,13 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati } } else { - timeout_ns := u32(duration) - s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns) + when darwin.ULOCK_WAIT_2_AVAILABLE { + timeout_ns := u64(duration) + s := __ulock_wait2(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns, 0) + } else { + timeout_us := u32(duration) + s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_us) + } if s >= 0 { return true } diff --git a/core/sys/darwin/sync.odin b/core/sys/darwin/sync.odin index 121d3edef..e90f30162 100644 --- a/core/sys/darwin/sync.odin +++ b/core/sys/darwin/sync.odin @@ -12,8 +12,15 @@ when ODIN_OS == .Darwin { } else { WAIT_ON_ADDRESS_AVAILABLE :: false } + when ODIN_MINIMUM_OS_VERSION >= 11_00_00 { + ULOCK_WAIT_2_AVAILABLE :: true + } else { + ULOCK_WAIT_2_AVAILABLE :: false + } + } else { WAIT_ON_ADDRESS_AVAILABLE :: false + ULOCK_WAIT_2_AVAILABLE :: false } os_sync_wait_on_address_flag :: enum u32 { diff --git a/tests/core/sync/test_core_sync.odin b/tests/core/sync/test_core_sync.odin index 32c08f935..fdd865686 100644 --- a/tests/core/sync/test_core_sync.odin +++ b/tests/core/sync/test_core_sync.odin @@ -8,7 +8,6 @@ // These tests are temporarily disabled on Darwin, as there is currently a // stall occurring which I cannot debug. -//+build !darwin package test_core_sync import "base:intrinsics" From aa25714d43716a857219d42796ade19de6c5ef70 Mon Sep 17 00:00:00 2001 From: pkova Date: Tue, 17 Sep 2024 02:11:41 +0300 Subject: [PATCH 133/320] Remove comment from core sync tests now that they're fixed --- tests/core/sync/test_core_sync.odin | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/core/sync/test_core_sync.odin b/tests/core/sync/test_core_sync.odin index fdd865686..d6a7a9517 100644 --- a/tests/core/sync/test_core_sync.odin +++ b/tests/core/sync/test_core_sync.odin @@ -4,9 +4,6 @@ // Keep in mind that running with the debug logs uncommented can result in // failures disappearing due to the delay of sending the log message causing // different synchronization patterns. -// -// These tests are temporarily disabled on Darwin, as there is currently a -// stall occurring which I cannot debug. package test_core_sync From 4d6f7dcac01061ee3060c14bb10e27f101998140 Mon Sep 17 00:00:00 2001 From: Pyry Kovanen Date: Tue, 17 Sep 2024 02:21:00 +0300 Subject: [PATCH 134/320] Fix code alignment in futex_darwin.odin Co-authored-by: Feoramund <161657516+Feoramund@users.noreply.github.com> --- core/sync/futex_darwin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin index 3915a414d..5567be963 100644 --- a/core/sync/futex_darwin.odin +++ b/core/sync/futex_darwin.odin @@ -12,7 +12,7 @@ foreign System { // __ulock_wait is not available on 10.15 // See https://github.com/odin-lang/Odin/issues/1959 __ulock_wait :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_us: u32) -> c.int --- - __ulock_wait2 :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_ns: u64, value2: u64) -> c.int --- + __ulock_wait2 :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_ns: u64, value2: u64) -> c.int --- __ulock_wake :: proc "c" (operation: u32, addr: rawptr, wake_value: u64) -> c.int --- } From 6e0f1cc866e8a566a46ccaf9f14879e7ac344fe2 Mon Sep 17 00:00:00 2001 From: pkova Date: Tue, 17 Sep 2024 02:35:00 +0300 Subject: [PATCH 135/320] Pass microseconds instead of nanoseconds to __ulock_wait --- core/sync/futex_darwin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin index 5567be963..32fdb1552 100644 --- a/core/sync/futex_darwin.odin +++ b/core/sync/futex_darwin.odin @@ -57,7 +57,7 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati timeout_ns := u64(duration) s := __ulock_wait2(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns, 0) } else { - timeout_us := u32(duration) + timeout_us := u32(duration) * 1000 s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_us) } if s >= 0 { From abf6ea7732b855dcb0ddb549a6454f99c40b7328 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Sep 2024 10:24:19 +0100 Subject: [PATCH 136/320] Fix minor bug with addressability --- src/check_stmt.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index c8717ba98..74a9e8825 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1641,6 +1641,8 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) Ast *expr = unparen_expr(rs->expr); + Operand rhs_operand = {}; + bool is_range = false; bool is_possibly_addressable = true; isize max_val_count = 2; @@ -1698,7 +1700,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) } } } - bool is_ptr = is_type_pointer(type_deref(operand.type)); + bool is_ptr = is_type_pointer(operand.type); Type *t = base_type(type_deref(operand.type)); switch (t->kind) { @@ -1750,16 +1752,19 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) break; case Type_DynamicArray: + is_possibly_addressable = true; array_add(&vals, t->DynamicArray.elem); array_add(&vals, t_int); break; case Type_Slice: + is_possibly_addressable = true; array_add(&vals, t->Slice.elem); array_add(&vals, t_int); break; case Type_Map: + is_possibly_addressable = true; is_map = true; array_add(&vals, t->Map.key); array_add(&vals, t->Map.value); @@ -1781,6 +1786,8 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) case Type_Tuple: { + is_possibly_addressable = false; + isize count = t->Tuple.variables.count; if (count < 1) { ERROR_BLOCK(); @@ -1810,8 +1817,6 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) array_add(&vals, e->type); } - is_possibly_addressable = false; - bool do_break = false; for (isize i = rs->vals.count-1; i >= 0; i--) { if (rs->vals[i] != nullptr && count < i+2) { @@ -1831,6 +1836,11 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) case Type_Struct: if (t->Struct.soa_kind != StructSoa_None) { + if (t->Struct.soa_kind == StructSoa_Fixed) { + is_possibly_addressable = operand.mode == Addressing_Variable || is_ptr; + } else { + is_possibly_addressable = true; + } is_soa = true; array_add(&vals, t->Struct.soa_elem); array_add(&vals, t_int); @@ -1907,7 +1917,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) if (is_possibly_addressable && i == addressable_index) { entity->flags &= ~EntityFlag_Value; } else { - char const *idx_name = is_map ? "key" : is_bit_set ? "element" : "index"; + char const *idx_name = is_map ? "key" : (is_bit_set || i == 0) ? "element" : "index"; error(token, "The %s variable '%.*s' cannot be made addressable", idx_name, LIT(str)); } } From 19c1ed154cc9e36433fe23e1e34810f9c53ec01d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Sep 2024 11:01:26 +0100 Subject: [PATCH 137/320] Add `-vet-packages:` --- src/build_settings.cpp | 3 +-- src/checker.cpp | 16 ++++------------ src/main.cpp | 30 +++++++++++++++++++++++++++++- src/parser.cpp | 31 ++++++++++++++++++++----------- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 1aca5d424..341cbe3e1 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -383,6 +383,7 @@ struct BuildContext { u64 vet_flags; u32 sanitizer_flags; + StringSet vet_packages; bool has_resource; String link_flags; @@ -1462,8 +1463,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->thread_count = gb_max(bc->affinity.thread_count, 1); } - string_set_init(&bc->custom_attributes); - bc->ODIN_VENDOR = str_lit("odin"); bc->ODIN_VERSION = ODIN_VERSION; bc->ODIN_ROOT = odin_root_dir(); diff --git a/src/checker.cpp b/src/checker.cpp index 64c66c8a6..deb83bf97 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -533,18 +533,13 @@ gb_internal u64 check_vet_flags(CheckerContext *c) { c->curr_proc_decl->proc_lit) { file = c->curr_proc_decl->proc_lit->file(); } - if (file && file->vet_flags_set) { - return file->vet_flags; - } - return build_context.vet_flags; + + return ast_file_vet_flags(file); } gb_internal u64 check_vet_flags(Ast *node) { AstFile *file = node->file(); - if (file && file->vet_flags_set) { - return file->vet_flags; - } - return build_context.vet_flags; + return ast_file_vet_flags(file); } enum VettedEntityKind { @@ -6497,10 +6492,7 @@ gb_internal void check_parsed_files(Checker *c) { TIME_SECTION("check scope usage"); for (auto const &entry : c->info.files) { AstFile *f = entry.value; - u64 vet_flags = build_context.vet_flags; - if (f->vet_flags_set) { - vet_flags = f->vet_flags; - } + u64 vet_flags = ast_file_vet_flags(f); check_scope_usage(c, f->scope, vet_flags); } diff --git a/src/main.cpp b/src/main.cpp index 06c200442..9b1dcf0fa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -346,6 +346,7 @@ enum BuildFlagKind { BuildFlag_VetSemicolon, BuildFlag_VetCast, BuildFlag_VetTabs, + BuildFlag_VetPackages, BuildFlag_CustomAttribute, BuildFlag_IgnoreUnknownAttributes, @@ -555,6 +556,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_VetSemicolon, str_lit("vet-semicolon"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetCast, str_lit("vet-cast"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetTabs, str_lit("vet-tabs"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_VetPackages, str_lit("vet-packages"), BuildFlagParam_String, Command__does_check); add_flag(&build_flags, BuildFlag_CustomAttribute, str_lit("custom-attribute"), BuildFlagParam_String, Command__does_check, true); add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None, Command__does_check); @@ -1221,6 +1223,29 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_VetCast: build_context.vet_flags |= VetFlag_Cast; break; case BuildFlag_VetTabs: build_context.vet_flags |= VetFlag_Tabs; break; + case BuildFlag_VetPackages: + { + GB_ASSERT(value.kind == ExactValue_String); + String val = value.value_string; + String_Iterator it = {val, 0}; + for (;;) { + String pkg = string_split_iterator(&it, ','); + if (pkg.len == 0) { + break; + } + + pkg = string_trim_whitespace(pkg); + if (!string_is_valid_identifier(pkg)) { + gb_printf_err("-%.*s '%.*s' must be a valid identifier\n", LIT(name), LIT(pkg)); + bad_flags = true; + continue; + } + + string_set_add(&build_context.vet_packages, pkg); + } + } + break; + case BuildFlag_CustomAttribute: { GB_ASSERT(value.kind == ExactValue_String); @@ -1234,7 +1259,7 @@ gb_internal bool parse_build_flags(Array args) { attr = string_trim_whitespace(attr); if (!string_is_valid_identifier(attr)) { - gb_printf_err("-custom-attribute '%.*s' must be a valid identifier\n", LIT(attr)); + gb_printf_err("-%.*s '%.*s' must be a valid identifier\n", LIT(name), LIT(attr)); bad_flags = true; continue; } @@ -3150,6 +3175,9 @@ int main(int arg_count, char const **arg_ptr) { build_context.command = command; + string_set_init(&build_context.custom_attributes); + string_set_init(&build_context.vet_packages); + if (!parse_build_flags(args)) { return 1; } diff --git a/src/parser.cpp b/src/parser.cpp index 88147d465..56bea8131 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1,10 +1,28 @@ #include "parser_pos.cpp" +gb_internal bool in_vet_packages(AstFile *file) { + if (file == nullptr) { + return true; + } + if (file->pkg == nullptr) { + return true; + } + if (build_context.vet_packages.entries.count == 0) { + return true; + } + return string_set_exists(&build_context.vet_packages, file->pkg->name); +} + gb_internal u64 ast_file_vet_flags(AstFile *f) { if (f != nullptr && f->vet_flags_set) { return f->vet_flags; } - return build_context.vet_flags; + + bool found = in_vet_packages(f); + if (found) { + return build_context.vet_flags; + } + return 0; } gb_internal bool ast_file_vet_style(AstFile *f) { @@ -5372,18 +5390,9 @@ gb_internal Ast *parse_stmt(AstFile *f) { } - -gb_internal u64 check_vet_flags(AstFile *file) { - if (file && file->vet_flags_set) { - return file->vet_flags; - } - return build_context.vet_flags; -} - - gb_internal void parse_enforce_tabs(AstFile *f) { // Checks to see if tabs have been used for indentation - if ((check_vet_flags(f) & VetFlag_Tabs) == 0) { + if ((ast_file_vet_flags(f) & VetFlag_Tabs) == 0) { return; } From 09588836e73d2def550cf5b1f6dab4d9de237e37 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Sep 2024 11:33:42 +0100 Subject: [PATCH 138/320] Add `-vet-unused-procedures` --- src/build_settings.cpp | 3 +++ src/checker.cpp | 55 ++++++++++++++++++++++++++++++++++++------ src/main.cpp | 21 +++++++++++++++- 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 341cbe3e1..7aff8e650 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -285,6 +285,7 @@ enum VetFlags : u64 { VetFlag_Deprecated = 1u<<7, VetFlag_Cast = 1u<<8, VetFlag_Tabs = 1u<<9, + VetFlag_UnusedProcedures = 1u<<10, VetFlag_Unused = VetFlag_UnusedVariables|VetFlag_UnusedImports, @@ -316,6 +317,8 @@ u64 get_vet_flag_from_name(String const &name) { return VetFlag_Cast; } else if (name == "tabs") { return VetFlag_Tabs; + } else if (name == "unused-procedures") { + return VetFlag_UnusedProcedures; } return VetFlag_NONE; } diff --git a/src/checker.cpp b/src/checker.cpp index deb83bf97..af1e0e675 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -676,20 +676,45 @@ gb_internal bool check_vet_unused(Checker *c, Entity *e, VettedEntity *ve) { return false; } -gb_internal void check_scope_usage(Checker *c, Scope *scope, u64 vet_flags) { - bool vet_unused = (vet_flags & VetFlag_Unused) != 0; - bool vet_shadowing = (vet_flags & (VetFlag_Shadowing|VetFlag_Using)) != 0; - +gb_internal void check_scope_usage_internal(Checker *c, Scope *scope, u64 vet_flags, bool per_entity) { + u64 original_vet_flags = vet_flags; Array vetted_entities = {}; array_init(&vetted_entities, heap_allocator()); + defer (array_free(&vetted_entities)); rw_mutex_shared_lock(&scope->mutex); for (auto const &entry : scope->elements) { Entity *e = entry.value; if (e == nullptr) continue; + + vet_flags = original_vet_flags; + if (per_entity) { + vet_flags = ast_file_vet_flags(e->file); + } + + bool vet_unused = (vet_flags & VetFlag_Unused) != 0; + bool vet_shadowing = (vet_flags & (VetFlag_Shadowing|VetFlag_Using)) != 0; + bool vet_unused_procedures = (vet_flags & VetFlag_UnusedProcedures) != 0; + VettedEntity ve_unused = {}; VettedEntity ve_shadowed = {}; - bool is_unused = vet_unused && check_vet_unused(c, e, &ve_unused); + bool is_unused = false; + if (vet_unused && check_vet_unused(c, e, &ve_unused)) { + is_unused = true; + } else if (vet_unused_procedures && + e->kind == Entity_Procedure) { + if (e->flags&EntityFlag_Used) { + is_unused = false; + } else if (e->flags & EntityFlag_Require) { + is_unused = false; + } else if (e->pkg && e->pkg->kind == Package_Init && e->token.string == "main") { + is_unused = false; + } else { + is_unused = true; + ve_unused.kind = VettedEntity_Unused; + ve_unused.entity = e; + } + } bool is_shadowed = vet_shadowing && check_vet_shadowing(c, e, &ve_shadowed); if (is_unused && is_shadowed) { VettedEntity ve_both = ve_shadowed; @@ -712,13 +737,18 @@ gb_internal void check_scope_usage(Checker *c, Scope *scope, u64 vet_flags) { } rw_mutex_shared_unlock(&scope->mutex); - gb_sort(vetted_entities.data, vetted_entities.count, gb_size_of(VettedEntity), vetted_entity_variable_pos_cmp); + array_sort(vetted_entities, vetted_entity_variable_pos_cmp); for (auto const &ve : vetted_entities) { Entity *e = ve.entity; Entity *other = ve.other; String name = e->token.string; + vet_flags = original_vet_flags; + if (per_entity) { + vet_flags = ast_file_vet_flags(e->file); + } + if (ve.kind == VettedEntity_Shadowed_And_Unused) { error(e->token, "'%.*s' declared but not used, possibly shadows declaration at line %d", LIT(name), other->token.pos.line); } else if (vet_flags) { @@ -727,6 +757,9 @@ gb_internal void check_scope_usage(Checker *c, Scope *scope, u64 vet_flags) { if (e->kind == Entity_Variable && (vet_flags & VetFlag_UnusedVariables) != 0) { error(e->token, "'%.*s' declared but not used", LIT(name)); } + if (e->kind == Entity_Procedure && (vet_flags & VetFlag_UnusedProcedures) != 0) { + error(e->token, "'%.*s' declared but not used", LIT(name)); + } if ((e->kind == Entity_ImportName || e->kind == Entity_LibraryName) && (vet_flags & VetFlag_UnusedImports) != 0) { error(e->token, "'%.*s' declared but not used", LIT(name)); } @@ -744,7 +777,11 @@ gb_internal void check_scope_usage(Checker *c, Scope *scope, u64 vet_flags) { } } - array_free(&vetted_entities); +} + + +gb_internal void check_scope_usage(Checker *c, Scope *scope, u64 vet_flags) { + check_scope_usage_internal(c, scope, vet_flags, false); for (Scope *child = scope->head_child; child != nullptr; child = child->next) { if (child->flags & (ScopeFlag_Proc|ScopeFlag_Type|ScopeFlag_File)) { @@ -6495,6 +6532,10 @@ gb_internal void check_parsed_files(Checker *c) { u64 vet_flags = ast_file_vet_flags(f); check_scope_usage(c, f->scope, vet_flags); } + for (auto const &entry : c->info.packages) { + AstPackage *pkg = entry.value; + check_scope_usage_internal(c, pkg->scope, 0, true); + } TIME_SECTION("add basic type information"); // Add "Basic" type information diff --git a/src/main.cpp b/src/main.cpp index 9b1dcf0fa..a969e32a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -340,6 +340,7 @@ enum BuildFlagKind { BuildFlag_VetUnused, BuildFlag_VetUnusedImports, BuildFlag_VetUnusedVariables, + BuildFlag_VetUnusedProcedures, BuildFlag_VetUsingStmt, BuildFlag_VetUsingParam, BuildFlag_VetStyle, @@ -548,6 +549,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetUnused, str_lit("vet-unused"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetUnusedVariables, str_lit("vet-unused-variables"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_VetUnusedProcedures, str_lit("vet-unused-procedures"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetUnusedImports, str_lit("vet-unused-imports"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetShadowing, str_lit("vet-shadowing"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_VetUsingStmt, str_lit("vet-using-stmt"), BuildFlagParam_None, Command__does_check); @@ -1222,6 +1224,13 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_VetSemicolon: build_context.vet_flags |= VetFlag_Semicolon; break; case BuildFlag_VetCast: build_context.vet_flags |= VetFlag_Cast; break; case BuildFlag_VetTabs: build_context.vet_flags |= VetFlag_Tabs; break; + case BuildFlag_VetUnusedProcedures: + build_context.vet_flags |= VetFlag_UnusedProcedures; + if (!set_flags[BuildFlag_VetPackages]) { + gb_printf_err("-%.*s must be used with -vet-packages\n", LIT(name)); + bad_flags = true; + } + break; case BuildFlag_VetPackages: { @@ -2389,7 +2398,7 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(0, ""); print_usage_line(1, "-vet-unused"); - print_usage_line(2, "Checks for unused declarations."); + print_usage_line(2, "Checks for unused declarations (variables and imports)."); print_usage_line(0, ""); print_usage_line(1, "-vet-unused-variables"); @@ -2431,6 +2440,16 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(1, "-vet-tabs"); print_usage_line(2, "Errs when the use of tabs has not been used for indentation."); print_usage_line(0, ""); + + print_usage_line(1, "-vet-packages:"); + print_usage_line(2, "Sets which packages by name will be vetted."); + print_usage_line(2, "Files with specific +vet tags will not be ignored if they are not in the packages set."); + print_usage_line(0, ""); + + print_usage_line(1, "-vet-unused-procedures"); + print_usage_line(2, "Checks for unused procedures."); + print_usage_line(2, "Must be used with -vet-packages or specified on a per file with +vet tags."); + print_usage_line(0, ""); } if (check) { From 0975820c48f8e876c2838a5ef94400fdb5db0f87 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 17 Sep 2024 15:52:35 +0200 Subject: [PATCH 139/320] fix wrong ulock timeout calculation, add version check for ios --- core/sync/futex_darwin.odin | 5 ++++- core/sys/darwin/sync.odin | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/sync/futex_darwin.odin b/core/sync/futex_darwin.odin index 32fdb1552..87b7b96e6 100644 --- a/core/sync/futex_darwin.odin +++ b/core/sync/futex_darwin.odin @@ -12,6 +12,7 @@ foreign System { // __ulock_wait is not available on 10.15 // See https://github.com/odin-lang/Odin/issues/1959 __ulock_wait :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_us: u32) -> c.int --- + // >= MacOS 11. __ulock_wait2 :: proc "c" (operation: u32, addr: rawptr, value: u64, timeout_ns: u64, value2: u64) -> c.int --- __ulock_wake :: proc "c" (operation: u32, addr: rawptr, wake_value: u64) -> c.int --- } @@ -57,12 +58,14 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati timeout_ns := u64(duration) s := __ulock_wait2(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_ns, 0) } else { - timeout_us := u32(duration) * 1000 + timeout_us := u32(duration / time.Microsecond) s := __ulock_wait(UL_COMPARE_AND_WAIT | ULF_NO_ERRNO, f, u64(expected), timeout_us) } + if s >= 0 { return true } + switch s { case EINTR, EFAULT: return true diff --git a/core/sys/darwin/sync.odin b/core/sys/darwin/sync.odin index e90f30162..58fc7c9e4 100644 --- a/core/sys/darwin/sync.odin +++ b/core/sys/darwin/sync.odin @@ -5,6 +5,7 @@ foreign import system "system:System.framework" // #define OS_WAIT_ON_ADDR_AVAILABILITY \ // __API_AVAILABLE(macos(14.4), ios(17.4), tvos(17.4), watchos(10.4)) when ODIN_OS == .Darwin { + when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 17_04_00 { WAIT_ON_ADDRESS_AVAILABLE :: true } else when ODIN_MINIMUM_OS_VERSION >= 14_04_00 { @@ -12,7 +13,10 @@ when ODIN_OS == .Darwin { } else { WAIT_ON_ADDRESS_AVAILABLE :: false } - when ODIN_MINIMUM_OS_VERSION >= 11_00_00 { + + when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 14_00_00 { + ULOCK_WAIT_2_AVAILABLE :: true + } else when ODIN_MINIMUM_OS_VERSION >= 11_00_00 { ULOCK_WAIT_2_AVAILABLE :: true } else { ULOCK_WAIT_2_AVAILABLE :: false @@ -20,7 +24,7 @@ when ODIN_OS == .Darwin { } else { WAIT_ON_ADDRESS_AVAILABLE :: false - ULOCK_WAIT_2_AVAILABLE :: false + ULOCK_WAIT_2_AVAILABLE :: false } os_sync_wait_on_address_flag :: enum u32 { From c794f853e943ba0f70c0e927c50ada1bf5136117 Mon Sep 17 00:00:00 2001 From: avanspector Date: Tue, 17 Sep 2024 16:57:02 +0200 Subject: [PATCH 140/320] init ansi on a standalone testing exe --- core/testing/runner.odin | 4 ++++ core/testing/runner_windows.odin | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 core/testing/runner_windows.odin diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 386ba8cb5..10d5dca5c 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -204,6 +204,10 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { } } + when ODIN_OS == .Windows { + console_ansi_init() + } + stdout := io.to_writer(os.stream_from_handle(os.stdout)) stderr := io.to_writer(os.stream_from_handle(os.stderr)) diff --git a/core/testing/runner_windows.odin b/core/testing/runner_windows.odin new file mode 100644 index 000000000..fa233ff84 --- /dev/null +++ b/core/testing/runner_windows.odin @@ -0,0 +1,22 @@ +//+private +package testing + +import win32 "core:sys/windows" + +console_ansi_init :: proc() { + stdout := win32.GetStdHandle(win32.STD_OUTPUT_HANDLE) + if stdout != win32.INVALID_HANDLE && stdout != nil { + old_console_mode: u32 + if win32.GetConsoleMode(stdout, &old_console_mode) { + win32.SetConsoleMode(stdout, old_console_mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING) + } + } + + stderr := win32.GetStdHandle(win32.STD_ERROR_HANDLE) + if stderr != win32.INVALID_HANDLE && stderr != nil { + old_console_mode: u32 + if win32.GetConsoleMode(stderr, &old_console_mode) { + win32.SetConsoleMode(stderr, old_console_mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING) + } + } +} From 6ef779cd5c8260b2e6979e676d28489fd53dd599 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 17 Sep 2024 17:46:30 +0200 Subject: [PATCH 141/320] add new macos releases to 'odin report' and sys/info --- core/sys/info/platform_darwin.odin | 4 ++++ src/bug_report.cpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/core/sys/info/platform_darwin.odin b/core/sys/info/platform_darwin.odin index 3fd857bfe..493f038f0 100644 --- a/core/sys/info/platform_darwin.odin +++ b/core/sys/info/platform_darwin.odin @@ -530,6 +530,10 @@ macos_release_map: map[string]Darwin_To_Release = { "23F79" = {{23, 5, 0}, "macOS", {"Sonoma", {14, 5, 0}}}, "23G80" = {{23, 6, 0}, "macOS", {"Sonoma", {14, 6, 0}}}, "23G93" = {{23, 6, 0}, "macOS", {"Sonoma", {14, 6, 1}}}, + "23H124" = {{23, 6, 0}, "macOS", {"Sonoma", {14, 7, 0}}}, + + // MacOS Sequoia + "24A335" = {{24, 0, 0}, "macOS", {"Sequoia", {15, 0, 0}}}, } @(private) diff --git a/src/bug_report.cpp b/src/bug_report.cpp index 5f768f57f..fa7e156ce 100644 --- a/src/bug_report.cpp +++ b/src/bug_report.cpp @@ -919,6 +919,8 @@ gb_internal void report_os_info() { {"23F79", {23, 5, 0}, "macOS", {"Sonoma", {14, 5, 0}}}, {"23G80", {23, 6, 0}, "macOS", {"Sonoma", {14, 6, 0}}}, {"23G93", {23, 6, 0}, "macOS", {"Sonoma", {14, 6, 1}}}, + {"23H124", {23, 6, 0}, "macOS", {"Sonoma", {14, 7, 0}}}, + {"24A335", {24, 0, 0}, "macOS", {"Sequoia", {15, 0, 0}}}, }; From 29fedc1808c347774971666ecc90b44e1900dc90 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Tue, 17 Sep 2024 19:39:48 +0200 Subject: [PATCH 142/320] Changed some recently added //+ usages to #+ and also fixed some //+ usages in some code generators. --- core/testing/runner_windows.odin | 2 +- src/parser.cpp | 2 +- tests/core/sys/windows/win32gen/win32gen.cpp | 2 +- tests/documentation/documentation_tester.odin | 2 +- vendor/box2d/box2d_wasm.odin | 2 +- vendor/cgltf/cgltf_wasm.odin | 2 +- vendor/stb/image/stb_image_wasm.odin | 2 +- vendor/stb/rect_pack/stb_rect_pack_wasm.odin | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/testing/runner_windows.odin b/core/testing/runner_windows.odin index fa233ff84..401804c71 100644 --- a/core/testing/runner_windows.odin +++ b/core/testing/runner_windows.odin @@ -1,4 +1,4 @@ -//+private +#+private package testing import win32 "core:sys/windows" diff --git a/src/parser.cpp b/src/parser.cpp index 242671af0..520a23c5a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4967,7 +4967,7 @@ gb_internal Ast *parse_import_decl(AstFile *f, ImportDeclKind kind) { } if (f->in_when_statement) { - syntax_error(import_name, "Cannot use 'import' within a 'when' statement. Prefer using the file suffixes (e.g. foo_windows.odin) or '//+build' tags"); + syntax_error(import_name, "Cannot use 'import' within a 'when' statement. Prefer using the file suffixes (e.g. foo_windows.odin) or '#+build' tags"); } if (kind != ImportDecl_Standard) { diff --git a/tests/core/sys/windows/win32gen/win32gen.cpp b/tests/core/sys/windows/win32gen/win32gen.cpp index 731173aa6..57a094cd5 100644 --- a/tests/core/sys/windows/win32gen/win32gen.cpp +++ b/tests/core/sys/windows/win32gen/win32gen.cpp @@ -902,7 +902,7 @@ static void verify_error_helpers(ofstream& out) { } static void test_core_sys_windows(ofstream& out) { - out << "//+build windows" << endl + out << "#+build windows" << endl << "package " << __func__ << " // generated by " << path(__FILE__).filename().replace_extension("").string() << endl << endl diff --git a/tests/documentation/documentation_tester.odin b/tests/documentation/documentation_tester.odin index ce1849e1c..7b125d4e4 100644 --- a/tests/documentation/documentation_tester.odin +++ b/tests/documentation/documentation_tester.odin @@ -264,7 +264,7 @@ write_test_suite :: proc(example_tests: []Example_Test) { test_runner := strings.builder_make() strings.write_string(&test_runner, -`//+private +`#+private package documentation_verification import "core:os" diff --git a/vendor/box2d/box2d_wasm.odin b/vendor/box2d/box2d_wasm.odin index eab369a0d..0fcaf753f 100644 --- a/vendor/box2d/box2d_wasm.odin +++ b/vendor/box2d/box2d_wasm.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package vendor_box2d @(require) import _ "vendor:libc" diff --git a/vendor/cgltf/cgltf_wasm.odin b/vendor/cgltf/cgltf_wasm.odin index f2da86a2c..fb612b2ac 100644 --- a/vendor/cgltf/cgltf_wasm.odin +++ b/vendor/cgltf/cgltf_wasm.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package cgltf @(require) import _ "vendor:libc" diff --git a/vendor/stb/image/stb_image_wasm.odin b/vendor/stb/image/stb_image_wasm.odin index 77bb44f02..f43012383 100644 --- a/vendor/stb/image/stb_image_wasm.odin +++ b/vendor/stb/image/stb_image_wasm.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package stb_image @(require) import _ "vendor:libc" diff --git a/vendor/stb/rect_pack/stb_rect_pack_wasm.odin b/vendor/stb/rect_pack/stb_rect_pack_wasm.odin index fb75552ec..c4e2e5160 100644 --- a/vendor/stb/rect_pack/stb_rect_pack_wasm.odin +++ b/vendor/stb/rect_pack/stb_rect_pack_wasm.odin @@ -1,4 +1,4 @@ -//+build wasm32, wasm64p32 +#+build wasm32, wasm64p32 package stb_rect_pack @(require) import _ "vendor:libc" From 652557bfcd64deccf018e96817a001fd9c4d69a1 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 17 Sep 2024 22:22:19 +0200 Subject: [PATCH 143/320] net: add `bound_endpoint` procedure --- core/net/socket.odin | 7 +++++ core/net/socket_darwin.odin | 14 +++++++++ core/net/socket_freebsd.odin | 14 +++++++++ core/net/socket_linux.odin | 13 ++++++++ core/net/socket_windows.odin | 15 +++++++++- core/os/os_darwin.odin | 2 +- core/sys/freebsd/syscalls.odin | 21 +++++++++++++ tests/core/net/test_core_net.odin | 49 +++++++++++++++++-------------- 8 files changed, 111 insertions(+), 24 deletions(-) diff --git a/core/net/socket.odin b/core/net/socket.odin index e36c67d21..0468ead00 100644 --- a/core/net/socket.odin +++ b/core/net/socket.odin @@ -134,6 +134,13 @@ listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (socket: TC return _listen_tcp(interface_endpoint, backlog) } +/* + Returns the endpoint that the given socket is listening / bound on. +*/ +bound_endpoint :: proc(socket: Any_Socket) -> (endpoint: Endpoint, err: Network_Error) { + return _bound_endpoint(socket) +} + accept_tcp :: proc(socket: TCP_Socket, options := default_tcp_options) -> (client: TCP_Socket, source: Endpoint, err: Network_Error) { return _accept_tcp(socket, options) } diff --git a/core/net/socket_darwin.odin b/core/net/socket_darwin.odin index a56d36de6..8323c3f27 100644 --- a/core/net/socket_darwin.odin +++ b/core/net/socket_darwin.odin @@ -22,6 +22,7 @@ package net import "core:c" import "core:os" +import "core:sys/posix" import "core:time" Socket_Option :: enum c.int { @@ -138,6 +139,19 @@ _listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (skt: TCP_ return } +@(private) +_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Network_Error) { + addr: posix.sockaddr_storage + addr_len := posix.socklen_t(size_of(addr)) + res := posix.getsockname(posix.FD(any_socket_to_socket(sock)), (^posix.sockaddr)(&addr), &addr_len) + if res != .OK { + err = Listen_Error(posix.errno()) + return + } + ep = _sockaddr_to_endpoint((^os.SOCKADDR_STORAGE_LH)(&addr)) + return +} + @(private) _accept_tcp :: proc(sock: TCP_Socket, options := default_tcp_options) -> (client: TCP_Socket, source: Endpoint, err: Network_Error) { sockaddr: os.SOCKADDR_STORAGE_LH diff --git a/core/net/socket_freebsd.odin b/core/net/socket_freebsd.odin index 00da5ec06..ade87f69f 100644 --- a/core/net/socket_freebsd.odin +++ b/core/net/socket_freebsd.odin @@ -149,6 +149,20 @@ _listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (socket: T return } +@(private) +_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Network_Error) { + sockaddr: freebsd.Socket_Address_Storage + + errno := freebsd.getsockname(cast(Fd)any_socket_to_socket(sock), &sockaddr) + if errno != nil { + err = cast(Listen_Error)errno + return + } + + ep = _sockaddr_to_endpoint(&sockaddr) + return +} + @(private) _accept_tcp :: proc(sock: TCP_Socket, options := default_tcp_options) -> (client: TCP_Socket, source: Endpoint, err: Network_Error) { sockaddr: freebsd.Socket_Address_Storage diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin index 52f328814..b630c8f1b 100644 --- a/core/net/socket_linux.odin +++ b/core/net/socket_linux.odin @@ -202,6 +202,19 @@ _listen_tcp :: proc(endpoint: Endpoint, backlog := 1000) -> (TCP_Socket, Network return cast(TCP_Socket) os_sock, nil } +@(private) +_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Network_Error) { + addr: linux.Sock_Addr_Any + errno := linux.getsockname(_unwrap_os_socket(sock), &addr) + if errno != .NONE { + err = Listen_Error(errno) + return + } + + ep = _wrap_os_addr(addr) + return +} + @(private) _accept_tcp :: proc(sock: TCP_Socket, options := default_tcp_options) -> (tcp_client: TCP_Socket, endpoint: Endpoint, err: Network_Error) { addr: linux.Sock_Addr_Any diff --git a/core/net/socket_windows.odin b/core/net/socket_windows.odin index 8ee75bc3b..d6d8cafd6 100644 --- a/core/net/socket_windows.odin +++ b/core/net/socket_windows.odin @@ -120,6 +120,19 @@ _listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (socket: T return } +@(private) +_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Network_Error) { + sockaddr: win.SOCKADDR_STORAGE_LH + sockaddrlen := c.int(size_of(sockaddr)) + if win.getsockname(win.SOCKET(any_socket_to_socket(sock)), &sockaddr, &sockaddrlen) == win.SOCKET_ERROR { + err = Listen_Error(win.WSAGetLastError()) + return + } + + ep = _sockaddr_to_endpoint(&sockaddr) + return +} + @(private) _accept_tcp :: proc(sock: TCP_Socket, options := default_tcp_options) -> (client: TCP_Socket, source: Endpoint, err: Network_Error) { for { @@ -368,4 +381,4 @@ _sockaddr_to_endpoint :: proc(native_addr: ^win.SOCKADDR_STORAGE_LH) -> (ep: End panic("native_addr is neither IP4 or IP6 address") } return -} \ No newline at end of file +} diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 2bb6c0c59..60cca52b3 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -204,7 +204,7 @@ ENOPROTOOPT :: _Platform_Error.ENOPROTOOPT EPROTONOSUPPORT :: _Platform_Error.EPROTONOSUPPORT ESOCKTNOSUPPORT :: _Platform_Error.ESOCKTNOSUPPORT ENOTSUP :: _Platform_Error.ENOTSUP -EOPNOTSUPP :: _Platform_Error.EOPNOTSUPP +EOPNOTSUPP :: _Platform_Error.EOPNOTSUPP EPFNOSUPPORT :: _Platform_Error.EPFNOSUPPORT EAFNOSUPPORT :: _Platform_Error.EAFNOSUPPORT EADDRINUSE :: _Platform_Error.EADDRINUSE diff --git a/core/sys/freebsd/syscalls.odin b/core/sys/freebsd/syscalls.odin index 8590df46e..83b51138a 100644 --- a/core/sys/freebsd/syscalls.odin +++ b/core/sys/freebsd/syscalls.odin @@ -21,6 +21,7 @@ SYS_close : uintptr : 6 SYS_getpid : uintptr : 20 SYS_recvfrom : uintptr : 29 SYS_accept : uintptr : 30 +SYS_getsockname: uintptr : 32 SYS_fcntl : uintptr : 92 SYS_fsync : uintptr : 95 SYS_socket : uintptr : 97 @@ -201,6 +202,26 @@ accept_nil :: proc "contextless" (s: Fd) -> (Fd, Errno) { accept :: proc { accept_T, accept_nil } +// Get socket name. +// +// The getsockname() system call appeared in 4.2BSD. +getsockname :: proc "contextless" (s: Fd, sockaddr: ^$T) -> Errno { + // sockaddr must contain a valid pointer, or this will segfault because + // we're telling the syscall that there's memory available to write to. + addrlen: socklen_t = size_of(T) + + result, ok := intrinsics.syscall_bsd(SYS_getsockname, + cast(uintptr)s, + cast(uintptr)sockaddr, + cast(uintptr)&addrlen) + + if !ok { + return cast(Errno)result + } + + return nil +} + // Synchronize changes to a file. // // The fsync() system call appeared in 4.2BSD. diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin index 8a9272882..2ba878080 100644 --- a/tests/core/net/test_core_net.odin +++ b/tests/core/net/test_core_net.odin @@ -217,32 +217,21 @@ IP_Address_Parsing_Test_Vectors :: []IP_Address_Parsing_Test_Vector{ { .IP6, "c0a8", "", ""}, } -ENDPOINT_TWO_SERVERS := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9991} -ENDPOINT_CLOSED_PORT := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9992} -ENDPOINT_SERVER_SENDS := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9993} -ENDPOINT_UDP_ECHO := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9994} -ENDPOINT_NONBLOCK := net.Endpoint{net.IP4_Address{127, 0, 0, 1}, 9995} - @(test) two_servers_binding_same_endpoint :: proc(t: ^testing.T) { - skt1, err1 := net.listen_tcp(ENDPOINT_TWO_SERVERS) + skt1, err1 := net.listen_tcp({address=net.IP4_Address{127, 0, 0, 1}, port=0}) defer net.close(skt1) - skt2, err2 := net.listen_tcp(ENDPOINT_TWO_SERVERS) + + ep, perr := net.bound_endpoint(skt1) + + skt2, err2 := net.listen_tcp(ep) defer net.close(skt2) testing.expect(t, err1 == nil, "expected first server binding to endpoint to do so without error") + testing.expect_value(t, perr, nil) testing.expect(t, err2 == net.Bind_Error.Address_In_Use, "expected second server to bind to an endpoint to return .Address_In_Use") } -@(test) -client_connects_to_closed_port :: proc(t: ^testing.T) { - - skt, err := net.dial_tcp(ENDPOINT_CLOSED_PORT) - defer net.close(skt) - testing.expect(t, err == net.Dial_Error.Refused, "expected dial of a closed endpoint to return .Refused") -} - - @(test) client_sends_server_data :: proc(t: ^testing.T) { CONTENT: string: "Hellope!" @@ -250,6 +239,9 @@ client_sends_server_data :: proc(t: ^testing.T) { SEND_TIMEOUT :: time.Duration(1 * time.Second) RECV_TIMEOUT :: time.Duration(1 * time.Second) + @static endpoint: net.Endpoint + endpoint.address = net.IP4_Address{127, 0, 0, 1} + Thread_Data :: struct { t: ^testing.T, skt: net.Any_Socket, @@ -266,7 +258,7 @@ client_sends_server_data :: proc(t: ^testing.T) { defer sync.wait_group_done(r.wg) - if r.skt, r.err = net.dial_tcp(ENDPOINT_SERVER_SENDS); r.err != nil { + if r.skt, r.err = net.dial_tcp(endpoint); r.err != nil { testing.expectf(r.t, false, "[tcp_client:dial_tcp] %v", r.err) return } @@ -281,12 +273,17 @@ client_sends_server_data :: proc(t: ^testing.T) { defer sync.wait_group_done(r.wg) - if r.skt, r.err = net.listen_tcp(ENDPOINT_SERVER_SENDS); r.err != nil { + if r.skt, r.err = net.listen_tcp(endpoint); r.err != nil { sync.wait_group_done(r.wg) testing.expectf(r.t, false, "[tcp_server:listen_tcp] %v", r.err) return } + endpoint, r.err = net.bound_endpoint(r.skt.(net.TCP_Socket)) + if !testing.expect_value(r.t, r.err, nil) { + return + } + sync.wait_group_done(r.wg) client: net.TCP_Socket @@ -524,17 +521,25 @@ join_url_test :: proc(t: ^testing.T) { @test test_udp_echo :: proc(t: ^testing.T) { + endpoint := net.Endpoint{address=net.IP4_Address{127, 0, 0, 1}, port=0} + server, make_server_err := net.make_unbound_udp_socket(.IP4) if !testing.expect_value(t, make_server_err, nil) { return } defer net.close(server) - bind_server_err := net.bind(server, ENDPOINT_UDP_ECHO) + bind_server_err := net.bind(server, endpoint) if !testing.expect_value(t, bind_server_err, nil) { return } + perr: net.Network_Error + endpoint, perr = net.bound_endpoint(server) + if !testing.expect_value(t, perr, nil) { + return + } + client, make_client_err := net.make_unbound_udp_socket(.IP4) if !testing.expect_value(t, make_client_err, nil) { return @@ -544,7 +549,7 @@ test_udp_echo :: proc(t: ^testing.T) { msg := "Hellope world!" buf: [64]u8 - bytes_written, send_err := net.send_udp(client, transmute([]u8)msg[:], ENDPOINT_UDP_ECHO) + bytes_written, send_err := net.send_udp(client, transmute([]u8)msg[:], endpoint) if !testing.expect_value(t, send_err, nil) { return } @@ -600,7 +605,7 @@ test_dns_resolve :: proc(t: ^testing.T) { @test test_nonblocking_option :: proc(t: ^testing.T) { - server, listen_err := net.listen_tcp(ENDPOINT_NONBLOCK) + server, listen_err := net.listen_tcp({address=net.IP4_Address{127, 0, 0, 1}, port=0}) if !testing.expect_value(t, listen_err, nil) { return } From 833157ecc9a69be8e9a452f60b9de1896628f3b7 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Wed, 18 Sep 2024 07:52:22 +1100 Subject: [PATCH 144/320] [sys/linux]: Fix the order of arguments for ptrace cont, singlestep and syscall --- core/sys/linux/sys.odin | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 5ee07a93d..05b40c06a 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -1443,8 +1443,9 @@ ptrace_traceme :: proc "contextless" (rq: PTrace_Traceme_Type) -> (Errno) { } ptrace_peek :: proc "contextless" (rq: PTrace_Peek_Type, pid: Pid, addr: uintptr) -> (uint, Errno) { - ret := syscall(SYS_ptrace, rq, pid, addr) - return errno_unwrap(ret, uint) + res: uint = --- + ret := syscall(SYS_ptrace, rq, pid, addr, &res) + return res, Errno(-ret) } ptrace_poke :: proc "contextless" (rq: PTrace_Poke_Type, pid: Pid, addr: uintptr, data: uint) -> (Errno) { @@ -1493,12 +1494,12 @@ ptrace_setregset :: proc "contextless" (rq: PTrace_Setregset_Type, pid: Pid, not } ptrace_getsiginfo :: proc "contextless" (rq: PTrace_Getsiginfo_Type, pid: Pid, si: ^Sig_Info) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, si) + ret := syscall(SYS_ptrace, rq, pid, si, rawptr(nil)) return Errno(-ret) } ptrace_peeksiginfo :: proc "contextless" (rq: PTrace_Peeksiginfo_Type, pid: Pid, si: ^Sig_Info) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, si) + ret := syscall(SYS_ptrace, rq, pid, si, rawptr(nil)) return Errno(-ret) } @@ -1518,52 +1519,52 @@ ptrace_setoptions :: proc "contextless" (rq: PTrace_Setoptions_Type, pid: Pid, o } ptrace_geteventmsg :: proc "contextless" (rq: PTrace_Geteventmsg_Type, pid: Pid, msg: ^uint) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, msg) + ret := syscall(SYS_ptrace, rq, pid, msg, rawptr(nil)) return Errno(-ret) } ptrace_cont :: proc "contextless" (rq: PTrace_Cont_Type, pid: Pid, sig: Signal) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, sig) + ret := syscall(SYS_ptrace, rq, pid, rawptr(nil), sig) return Errno(-ret) } ptrace_singlestep :: proc "contextless" (rq: PTrace_Singlestep_Type, pid: Pid, sig: Signal) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, sig) + ret := syscall(SYS_ptrace, rq, pid, rawptr(nil), sig) return Errno(-ret) } ptrace_syscall :: proc "contextless" (rq: PTrace_Syscall_Type, pid: Pid, sig: Signal) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, sig) + ret := syscall(SYS_ptrace, rq, pid, rawptr(nil), sig) return Errno(-ret) } ptrace_sysemu :: proc "contextless" (rq: PTrace_Sysemu_Type, pid: Pid, sig: Signal) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, sig) + ret := syscall(SYS_ptrace, rq, pid, rawptr(nil), sig) return Errno(-ret) } ptrace_sysemu_singlestep :: proc "contextless" (rq: PTrace_Sysemu_Singlestep_Type, pid: Pid, sig: Signal) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, sig) + ret := syscall(SYS_ptrace, rq, pid, rawptr(nil), sig) return Errno(-ret) } ptrace_listen :: proc "contextless" (rq: PTrace_Listen_Type, pid: Pid) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid) + ret := syscall(SYS_ptrace, rq, pid, 0, rawptr(nil)) return Errno(-ret) } ptrace_interrupt :: proc "contextless" (rq: PTrace_Interrupt_Type, pid: Pid) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid) + ret := syscall(SYS_ptrace, rq, pid, 0, rawptr(nil)) return Errno(-ret) } ptrace_attach :: proc "contextless" (rq: PTrace_Attach_Type, pid: Pid) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid) + ret := syscall(SYS_ptrace, rq, pid, 0, rawptr(nil)) return Errno(-ret) } ptrace_seize :: proc "contextless" (rq: PTrace_Seize_Type, pid: Pid, opt: PTrace_Options) -> (Errno) { - ret := syscall(SYS_ptrace, rq, pid, 0, transmute(u32) opt) + ret := syscall(SYS_ptrace, rq, pid, 0, transmute(u32) opt, rawptr(nil)) return Errno(-ret) } From 9973e0255c5397ff98fa044b1e5ce6a69ab0aa56 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 17 Sep 2024 23:19:20 +0200 Subject: [PATCH 145/320] fix error interrupt error check --- tests/core/sys/posix/structs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/sys/posix/structs.odin b/tests/core/sys/posix/structs.odin index 95b6258f4..1bc1af70f 100644 --- a/tests/core/sys/posix/structs.odin +++ b/tests/core/sys/posix/structs.odin @@ -63,7 +63,7 @@ execute_struct_checks :: proc(t: ^testing.T) { waiting: for { status: i32 wpid := posix.waitpid(pid, &status, {}) - if status == posix.EINTR { + if status == -1 && posix.errno() == .EINTR { continue } if !testing.expectf(t, wpid != -1, "waitpid() failure: %v", posix.strerror()) { From 80cc2f541628f91f7635272ec87147bd90509a96 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Tue, 17 Sep 2024 23:28:29 +0200 Subject: [PATCH 146/320] fix it more --- tests/core/sys/posix/structs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/sys/posix/structs.odin b/tests/core/sys/posix/structs.odin index 1bc1af70f..a4e9c8d90 100644 --- a/tests/core/sys/posix/structs.odin +++ b/tests/core/sys/posix/structs.odin @@ -63,7 +63,7 @@ execute_struct_checks :: proc(t: ^testing.T) { waiting: for { status: i32 wpid := posix.waitpid(pid, &status, {}) - if status == -1 && posix.errno() == .EINTR { + if wpid == -1 && posix.errno() == .EINTR { continue } if !testing.expectf(t, wpid != -1, "waitpid() failure: %v", posix.strerror()) { From e17dfcf7a2fa62525c7a02b7bf7b79c7556d49d1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 18 Sep 2024 00:13:34 +0100 Subject: [PATCH 147/320] Remove `distinct` from `core:math/linalg/(glsl|hlsl)` types --- core/math/linalg/glsl/linalg_glsl.odin | 70 +++++++------- core/math/linalg/hlsl/linalg_hlsl.odin | 128 ++++++++++++------------- 2 files changed, 99 insertions(+), 99 deletions(-) diff --git a/core/math/linalg/glsl/linalg_glsl.odin b/core/math/linalg/glsl/linalg_glsl.odin index 363a95887..5444f89e2 100644 --- a/core/math/linalg/glsl/linalg_glsl.odin +++ b/core/math/linalg/glsl/linalg_glsl.odin @@ -22,9 +22,9 @@ F32_EPSILON :: 1e-7 F64_EPSILON :: 1e-15 // Odin matrices are stored internally as Column-Major, which matches OpenGL/GLSL by default -mat2 :: distinct matrix[2, 2]f32 -mat3 :: distinct matrix[3, 3]f32 -mat4 :: distinct matrix[4, 4]f32 +mat2 :: matrix[2, 2]f32 +mat3 :: matrix[3, 3]f32 +mat4 :: matrix[4, 4]f32 mat2x2 :: mat2 mat3x3 :: mat3 mat4x4 :: mat4 @@ -33,52 +33,52 @@ mat4x4 :: mat4 // but they match how GLSL and OpenGL defines them in name // Odin: matrix[R, C]f32 // GLSL: matCxR -mat3x2 :: distinct matrix[2, 3]f32 -mat4x2 :: distinct matrix[2, 4]f32 -mat2x3 :: distinct matrix[3, 2]f32 -mat4x3 :: distinct matrix[3, 4]f32 -mat2x4 :: distinct matrix[4, 2]f32 -mat3x4 :: distinct matrix[4, 3]f32 +mat3x2 :: matrix[2, 3]f32 +mat4x2 :: matrix[2, 4]f32 +mat2x3 :: matrix[3, 2]f32 +mat4x3 :: matrix[3, 4]f32 +mat2x4 :: matrix[4, 2]f32 +mat3x4 :: matrix[4, 3]f32 -vec2 :: distinct [2]f32 -vec3 :: distinct [3]f32 -vec4 :: distinct [4]f32 +vec2 :: [2]f32 +vec3 :: [3]f32 +vec4 :: [4]f32 -ivec2 :: distinct [2]i32 -ivec3 :: distinct [3]i32 -ivec4 :: distinct [4]i32 +ivec2 :: [2]i32 +ivec3 :: [3]i32 +ivec4 :: [4]i32 -uvec2 :: distinct [2]u32 -uvec3 :: distinct [3]u32 -uvec4 :: distinct [4]u32 +uvec2 :: [2]u32 +uvec3 :: [3]u32 +uvec4 :: [4]u32 -bvec2 :: distinct [2]bool -bvec3 :: distinct [3]bool -bvec4 :: distinct [4]bool +bvec2 :: [2]bool +bvec3 :: [3]bool +bvec4 :: [4]bool -quat :: distinct quaternion128 +quat :: quaternion128 // Double Precision (f64) Floating Point Types -dmat2 :: distinct matrix[2, 2]f64 -dmat3 :: distinct matrix[3, 3]f64 -dmat4 :: distinct matrix[4, 4]f64 +dmat2 :: matrix[2, 2]f64 +dmat3 :: matrix[3, 3]f64 +dmat4 :: matrix[4, 4]f64 dmat2x2 :: dmat2 dmat3x3 :: dmat3 dmat4x4 :: dmat4 -dmat3x2 :: distinct matrix[2, 3]f64 -dmat4x2 :: distinct matrix[2, 4]f64 -dmat2x3 :: distinct matrix[3, 2]f64 -dmat4x3 :: distinct matrix[3, 4]f64 -dmat2x4 :: distinct matrix[4, 2]f64 -dmat3x4 :: distinct matrix[4, 3]f64 +dmat3x2 :: matrix[2, 3]f64 +dmat4x2 :: matrix[2, 4]f64 +dmat2x3 :: matrix[3, 2]f64 +dmat4x3 :: matrix[3, 4]f64 +dmat2x4 :: matrix[4, 2]f64 +dmat3x4 :: matrix[4, 3]f64 -dvec2 :: distinct [2]f64 -dvec3 :: distinct [3]f64 -dvec4 :: distinct [4]f64 +dvec2 :: [2]f64 +dvec3 :: [3]f64 +dvec4 :: [4]f64 -dquat :: distinct quaternion256 +dquat :: quaternion256 cos :: proc{ cos_f32, diff --git a/core/math/linalg/hlsl/linalg_hlsl.odin b/core/math/linalg/hlsl/linalg_hlsl.odin index f5e8bf147..a89fdddd3 100644 --- a/core/math/linalg/hlsl/linalg_hlsl.odin +++ b/core/math/linalg/hlsl/linalg_hlsl.odin @@ -21,89 +21,89 @@ LN10 :: 2.30258509299404568401799145468436421 FLOAT_EPSILON :: 1e-7 DOUBLE_EPSILON :: 1e-15 -// Aliases (not distinct) of types +// Aliases (not distict) of types float :: f32 double :: f64 int :: builtin.i32 uint :: builtin.u32 // Odin matrices are stored internally as Column-Major, which matches the internal layout of HLSL by default -float1x1 :: distinct matrix[1, 1]float -float2x2 :: distinct matrix[2, 2]float -float3x3 :: distinct matrix[3, 3]float -float4x4 :: distinct matrix[4, 4]float +float1x1 :: matrix[1, 1]float +float2x2 :: matrix[2, 2]float +float3x3 :: matrix[3, 3]float +float4x4 :: matrix[4, 4]float -float1x2 :: distinct matrix[1, 2]float -float1x3 :: distinct matrix[1, 3]float -float1x4 :: distinct matrix[1, 4]float -float2x1 :: distinct matrix[2, 1]float -float2x3 :: distinct matrix[2, 3]float -float2x4 :: distinct matrix[2, 4]float -float3x1 :: distinct matrix[3, 1]float -float3x2 :: distinct matrix[3, 2]float -float3x4 :: distinct matrix[3, 4]float -float4x1 :: distinct matrix[4, 1]float -float4x2 :: distinct matrix[4, 2]float -float4x3 :: distinct matrix[4, 3]float +float1x2 :: matrix[1, 2]float +float1x3 :: matrix[1, 3]float +float1x4 :: matrix[1, 4]float +float2x1 :: matrix[2, 1]float +float2x3 :: matrix[2, 3]float +float2x4 :: matrix[2, 4]float +float3x1 :: matrix[3, 1]float +float3x2 :: matrix[3, 2]float +float3x4 :: matrix[3, 4]float +float4x1 :: matrix[4, 1]float +float4x2 :: matrix[4, 2]float +float4x3 :: matrix[4, 3]float -float2 :: distinct [2]float -float3 :: distinct [3]float -float4 :: distinct [4]float +float2 :: [2]float +float3 :: [3]float +float4 :: [4]float -int2 :: distinct [2]int -int3 :: distinct [3]int -int4 :: distinct [4]int +int2 :: [2]int +int3 :: [3]int +int4 :: [4]int -uint2 :: distinct [2]uint -uint3 :: distinct [3]uint -uint4 :: distinct [4]uint +uint2 :: [2]uint +uint3 :: [3]uint +uint4 :: [4]uint -bool2 :: distinct [2]bool -bool3 :: distinct [3]bool -bool4 :: distinct [4]bool +bool2 :: [2]bool +bool3 :: [3]bool +bool4 :: [4]bool // Double Precision (double) Floating Point Types -double1x1 :: distinct matrix[1, 1]double -double2x2 :: distinct matrix[2, 2]double -double3x3 :: distinct matrix[3, 3]double -double4x4 :: distinct matrix[4, 4]double +double1x1 :: matrix[1, 1]double +double2x2 :: matrix[2, 2]double +double3x3 :: matrix[3, 3]double +double4x4 :: matrix[4, 4]double -double1x2 :: distinct matrix[1, 2]double -double1x3 :: distinct matrix[1, 3]double -double1x4 :: distinct matrix[1, 4]double -double2x1 :: distinct matrix[2, 1]double -double2x3 :: distinct matrix[2, 3]double -double2x4 :: distinct matrix[2, 4]double -double3x1 :: distinct matrix[3, 1]double -double3x2 :: distinct matrix[3, 2]double -double3x4 :: distinct matrix[3, 4]double -double4x1 :: distinct matrix[4, 1]double -double4x2 :: distinct matrix[4, 2]double -double4x3 :: distinct matrix[4, 3]double +double1x2 :: matrix[1, 2]double +double1x3 :: matrix[1, 3]double +double1x4 :: matrix[1, 4]double +double2x1 :: matrix[2, 1]double +double2x3 :: matrix[2, 3]double +double2x4 :: matrix[2, 4]double +double3x1 :: matrix[3, 1]double +double3x2 :: matrix[3, 2]double +double3x4 :: matrix[3, 4]double +double4x1 :: matrix[4, 1]double +double4x2 :: matrix[4, 2]double +double4x3 :: matrix[4, 3]double -double2 :: distinct [2]double -double3 :: distinct [3]double -double4 :: distinct [4]double +double2 :: [2]double +double3 :: [3]double +double4 :: [4]double -int1x1 :: distinct matrix[1, 1]int -int2x2 :: distinct matrix[2, 2]int -int3x3 :: distinct matrix[3, 3]int -int4x4 :: distinct matrix[4, 4]int +int1x1 :: matrix[1, 1]int +int2x2 :: matrix[2, 2]int +int3x3 :: matrix[3, 3]int +int4x4 :: matrix[4, 4]int -int1x2 :: distinct matrix[1, 2]int -int1x3 :: distinct matrix[1, 3]int -int1x4 :: distinct matrix[1, 4]int -int2x1 :: distinct matrix[2, 1]int -int2x3 :: distinct matrix[2, 3]int -int2x4 :: distinct matrix[2, 4]int -int3x1 :: distinct matrix[3, 1]int -int3x2 :: distinct matrix[3, 2]int -int3x4 :: distinct matrix[3, 4]int -int4x1 :: distinct matrix[4, 1]int -int4x2 :: distinct matrix[4, 2]int -int4x3 :: distinct matrix[4, 3]int +int1x2 :: matrix[1, 2]int +int1x3 :: matrix[1, 3]int +int1x4 :: matrix[1, 4]int +int2x1 :: matrix[2, 1]int +int2x3 :: matrix[2, 3]int +int2x4 :: matrix[2, 4]int +int3x1 :: matrix[3, 1]int +int3x2 :: matrix[3, 2]int +int3x4 :: matrix[3, 4]int +int4x1 :: matrix[4, 1]int +int4x2 :: matrix[4, 2]int +int4x3 :: matrix[4, 3]int cos :: proc{ cos_float, From 4ff836609c1ec2aa598a129bf01499b7076aae78 Mon Sep 17 00:00:00 2001 From: Yuriy Grynevych Date: Wed, 18 Sep 2024 21:03:48 +0300 Subject: [PATCH 148/320] [core/os] get_current_directory: Add allocator arg to targets where its missing --- core/os/os_darwin.odin | 2 +- core/os/os_freebsd.odin | 2 +- core/os/os_linux.odin | 2 +- core/os/os_netbsd.odin | 2 +- core/os/os_openbsd.odin | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 2bb6c0c59..5cef568dd 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -1095,7 +1095,7 @@ unset_env :: proc(key: string) -> Error { } @(require_results) -get_current_directory :: proc() -> string { +get_current_directory :: proc(allocator := context.allocator) -> string { page_size := get_page_size() // NOTE(tetra): See note in os_linux.odin/get_current_directory. buf := make([dynamic]u8, page_size) for { diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index 241f42c0b..9bf8ee50f 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -840,7 +840,7 @@ get_env :: proc(key: string, allocator := context.allocator) -> (value: string) } @(require_results) -get_current_directory :: proc() -> string { +get_current_directory :: proc(allocator := context.allocator) -> string { // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 9132edbfe..35799c3d9 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -985,7 +985,7 @@ unset_env :: proc(key: string) -> Error { } @(require_results) -get_current_directory :: proc() -> string { +get_current_directory :: proc(allocator := context.allocator) -> string { // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. diff --git a/core/os/os_netbsd.odin b/core/os/os_netbsd.odin index ba9b40fc3..a311cc200 100644 --- a/core/os/os_netbsd.odin +++ b/core/os/os_netbsd.odin @@ -894,7 +894,7 @@ get_env :: proc(key: string, allocator := context.allocator) -> (value: string) } @(require_results) -get_current_directory :: proc() -> string { +get_current_directory :: proc(allocator := context.allocator) -> string { // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index aff78dc60..16d873588 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -806,7 +806,7 @@ get_env :: proc(key: string, allocator := context.allocator) -> (value: string) } @(require_results) -get_current_directory :: proc() -> string { +get_current_directory :: proc(allocator := context.allocator) -> string { buf := make([dynamic]u8, MAX_PATH) for { cwd := _unix_getcwd(cstring(raw_data(buf)), c.size_t(len(buf))) From 7491b3c33210343f01ce1ea6aa27c9a49d8f447f Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 18 Sep 2024 22:45:27 +0200 Subject: [PATCH 149/320] Fix #4265 --- core/os/os2/allocators.odin | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/os/os2/allocators.odin b/core/os/os2/allocators.odin index ddfe230be..296be98a6 100644 --- a/core/os/os2/allocators.odin +++ b/core/os/os2/allocators.odin @@ -22,9 +22,14 @@ global_default_temp_allocator_index: uint @(require_results) temp_allocator :: proc() -> runtime.Allocator { + arena := &global_default_temp_allocator_arenas[global_default_temp_allocator_index] + if arena.backing_allocator.procedure == nil { + arena.backing_allocator = heap_allocator() + } + return runtime.Allocator{ procedure = temp_allocator_proc, - data = &global_default_temp_allocator_arenas[global_default_temp_allocator_index], + data = arena, } } From 6e979a96a186606b779177b06e409b1e6a57534e Mon Sep 17 00:00:00 2001 From: Yuriy Grynevych Date: Thu, 19 Sep 2024 00:10:53 +0300 Subject: [PATCH 150/320] Update core/os/os_darwin.odin Co-authored-by: Laytan --- core/os/os_darwin.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 5cef568dd..e00c63ccd 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -1096,6 +1096,7 @@ unset_env :: proc(key: string) -> Error { @(require_results) get_current_directory :: proc(allocator := context.allocator) -> string { + context.allocator = allocator page_size := get_page_size() // NOTE(tetra): See note in os_linux.odin/get_current_directory. buf := make([dynamic]u8, page_size) for { From 35f0dcbb92f2586a8708c8197fa4d61f17830e74 Mon Sep 17 00:00:00 2001 From: Yuriy Grynevych Date: Thu, 19 Sep 2024 00:11:00 +0300 Subject: [PATCH 151/320] Update core/os/os_freebsd.odin Co-authored-by: Laytan --- core/os/os_freebsd.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index 9bf8ee50f..f617cf973 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -841,6 +841,7 @@ get_env :: proc(key: string, allocator := context.allocator) -> (value: string) @(require_results) get_current_directory :: proc(allocator := context.allocator) -> string { + context.allocator = allocator // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. From cbf0471c72de90ae101b6524e1d7e015bff7f4fa Mon Sep 17 00:00:00 2001 From: Yuriy Grynevych Date: Thu, 19 Sep 2024 00:11:06 +0300 Subject: [PATCH 152/320] Update core/os/os_linux.odin Co-authored-by: Laytan --- core/os/os_linux.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 35799c3d9..8c8cd7f73 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -986,6 +986,7 @@ unset_env :: proc(key: string) -> Error { @(require_results) get_current_directory :: proc(allocator := context.allocator) -> string { + context.allocator = allocator // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. From 568705069c04376c282c21b17eb90c1253f9618f Mon Sep 17 00:00:00 2001 From: Yuriy Grynevych Date: Thu, 19 Sep 2024 00:11:12 +0300 Subject: [PATCH 153/320] Update core/os/os_netbsd.odin Co-authored-by: Laytan --- core/os/os_netbsd.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/os/os_netbsd.odin b/core/os/os_netbsd.odin index a311cc200..493527803 100644 --- a/core/os/os_netbsd.odin +++ b/core/os/os_netbsd.odin @@ -895,6 +895,7 @@ get_env :: proc(key: string, allocator := context.allocator) -> (value: string) @(require_results) get_current_directory :: proc(allocator := context.allocator) -> string { + context.allocator = allocator // NOTE(tetra): I would use PATH_MAX here, but I was not able to find // an authoritative value for it across all systems. // The largest value I could find was 4096, so might as well use the page size. From 18fd1fefc38c8813c412de16c01c7c1edeccb1cd Mon Sep 17 00:00:00 2001 From: Yuriy Grynevych Date: Thu, 19 Sep 2024 00:11:17 +0300 Subject: [PATCH 154/320] Update core/os/os_openbsd.odin Co-authored-by: Laytan --- core/os/os_openbsd.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index 16d873588..62872d9dc 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -807,6 +807,7 @@ get_env :: proc(key: string, allocator := context.allocator) -> (value: string) @(require_results) get_current_directory :: proc(allocator := context.allocator) -> string { + context.allocator = allocator buf := make([dynamic]u8, MAX_PATH) for { cwd := _unix_getcwd(cstring(raw_data(buf)), c.size_t(len(buf))) From 9456c366848226d300ea5064c225084e7f9d55ad Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:18:48 -0400 Subject: [PATCH 155/320] Specify integer-like only for some `atomic_*` intrinsics Fixes #4256 --- src/check_builtin.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 909eb668e..8c051cca2 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -4969,16 +4969,14 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As check_assignment(c, &x, elem, builtin_name); Type *t = type_deref(operand->type); - switch (id) { - case BuiltinProc_atomic_add: - case BuiltinProc_atomic_sub: - if (!is_type_numeric(t)) { + if (id != BuiltinProc_atomic_exchange) { + if (!is_type_integer_like(t)) { gbString str = type_to_string(t); - error(operand->expr, "Expected a numeric type for '%.*s', got %s", LIT(builtin_name), str); + error(operand->expr, "Expected an integer type for '%.*s', got %s", LIT(builtin_name), str); gb_string_free(str); } else if (is_type_different_to_arch_endianness(t)) { gbString str = type_to_string(t); - error(operand->expr, "Expected a numeric type of the same platform endianness for '%.*s', got %s", LIT(builtin_name), str); + error(operand->expr, "Expected an integer type of the same platform endianness for '%.*s', got %s", LIT(builtin_name), str); gb_string_free(str); } } @@ -5014,19 +5012,16 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } Type *t = type_deref(operand->type); - switch (id) { - case BuiltinProc_atomic_add_explicit: - case BuiltinProc_atomic_sub_explicit: - if (!is_type_numeric(t)) { + if (id != BuiltinProc_atomic_exchange_explicit) { + if (!is_type_integer_like(t)) { gbString str = type_to_string(t); - error(operand->expr, "Expected a numeric type for '%.*s', got %s", LIT(builtin_name), str); + error(operand->expr, "Expected an integer type for '%.*s', got %s", LIT(builtin_name), str); gb_string_free(str); } else if (is_type_different_to_arch_endianness(t)) { gbString str = type_to_string(t); - error(operand->expr, "Expected a numeric type of the same platform endianness for '%.*s', got %s", LIT(builtin_name), str); + error(operand->expr, "Expected an integer type of the same platform endianness for '%.*s', got %s", LIT(builtin_name), str); gb_string_free(str); } - break; } operand->type = elem; From e0bb07728d90c870abff6db8a3025b429b3bc37b Mon Sep 17 00:00:00 2001 From: flysand7 Date: Thu, 19 Sep 2024 20:55:52 +1100 Subject: [PATCH 156/320] Fix resize OOB when copying old data that's bigger than new data --- base/runtime/heap_allocator.odin | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/base/runtime/heap_allocator.odin b/base/runtime/heap_allocator.odin index a0a984f10..7347696f4 100644 --- a/base/runtime/heap_allocator.odin +++ b/base/runtime/heap_allocator.odin @@ -20,25 +20,28 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, // aligned_alloc :: proc(size, alignment: int, old_ptr: rawptr, old_size: int, zero_memory := true) -> ([]byte, Allocator_Error) { + // Not(flysand): We need to reserve enough space for alignment, which + // includes the user data itself, the space to store the pointer to + // allocation start, as well as the padding required to align both + // the user data and the pointer. a := max(alignment, align_of(rawptr)) - space := size + a - 1 - + space := a-1 + size_of(rawptr) + size allocated_mem: rawptr - force_copy := old_ptr != nil && a > align_of(rawptr) + force_copy := old_ptr != nil && alignment > align_of(rawptr) - if !force_copy && old_ptr != nil { + if old_ptr != nil && !force_copy { original_old_ptr := ([^]rawptr)(old_ptr)[-1] - allocated_mem = heap_resize(original_old_ptr, space+size_of(rawptr)) + allocated_mem = heap_resize(original_old_ptr, space) } else { - allocated_mem = heap_alloc(space+size_of(rawptr), zero_memory) + allocated_mem = heap_alloc(space, zero_memory) } aligned_mem := rawptr(([^]u8)(allocated_mem)[size_of(rawptr):]) ptr := uintptr(aligned_mem) - aligned_ptr := (ptr - 1 + uintptr(a)) & -uintptr(a) + aligned_ptr := (ptr + uintptr(a)-1) & ~(uintptr(a)-1) diff := int(aligned_ptr - ptr) - if (size + diff) > space || allocated_mem == nil { + if allocated_mem == nil { aligned_free(old_ptr) aligned_free(allocated_mem) return nil, .Out_Of_Memory @@ -48,7 +51,7 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, ([^]rawptr)(aligned_mem)[-1] = allocated_mem if force_copy { - mem_copy_non_overlapping(aligned_mem, old_ptr, old_size) + mem_copy_non_overlapping(aligned_mem, old_ptr, min(old_size, size)) aligned_free(old_ptr) } From acbf5c8d9775f66de69206b89390f2f966b53d73 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Thu, 19 Sep 2024 05:55:30 -0400 Subject: [PATCH 157/320] Forbid labelled or-branch expressions within `defer` --- src/check_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 6776094bf..fc1aa62e6 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9131,6 +9131,10 @@ gb_internal ExprKind check_or_branch_expr(CheckerContext *c, Operand *o, Ast *no } if (label != nullptr) { + if (c->in_defer) { + error(label, "A labelled '%.*s' cannot be used within a 'defer'", LIT(name)); + return Expr_Expr; + } if (label->kind != Ast_Ident) { error(label, "A branch statement's label name must be an identifier"); return Expr_Expr; From bec09d82df46d50cfa4e9cc5b3cc1c94b786b320 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Thu, 19 Sep 2024 21:07:08 +1100 Subject: [PATCH 158/320] Fix vet errors --- base/runtime/heap_allocator.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/base/runtime/heap_allocator.odin b/base/runtime/heap_allocator.odin index 7347696f4..4b04dffef 100644 --- a/base/runtime/heap_allocator.odin +++ b/base/runtime/heap_allocator.odin @@ -40,7 +40,6 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, ptr := uintptr(aligned_mem) aligned_ptr := (ptr + uintptr(a)-1) & ~(uintptr(a)-1) - diff := int(aligned_ptr - ptr) if allocated_mem == nil { aligned_free(old_ptr) aligned_free(allocated_mem) From 244907149aff369df9d63728ab42e6add4c83463 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Sep 2024 12:06:31 +0100 Subject: [PATCH 159/320] Move os stuff to OS specific files --- core/crypto/hash/hash.odin | 42 +++---------------------- core/crypto/hash/hash_freestanding.odin | 10 ++++++ core/crypto/hash/hash_os.odin | 37 ++++++++++++++++++++++ 3 files changed, 51 insertions(+), 38 deletions(-) create mode 100644 core/crypto/hash/hash_freestanding.odin create mode 100644 core/crypto/hash/hash_os.odin diff --git a/core/crypto/hash/hash.odin b/core/crypto/hash/hash.odin index f7671270a..d47f0ab46 100644 --- a/core/crypto/hash/hash.odin +++ b/core/crypto/hash/hash.odin @@ -1,16 +1,15 @@ package crypto_hash /* - Copyright 2021 zhibog - Made available under the BSD-3 license. + Copyright 2021 zhibog + Made available under the BSD-3 license. - List of contributors: - zhibog, dotbmp: Initial implementation. + List of contributors: + zhibog, dotbmp: Initial implementation. */ import "core:io" import "core:mem" -import "core:os" // hash_bytes will hash the given input and return the computed digest // in a newly allocated slice. @@ -87,36 +86,3 @@ hash_stream :: proc( return dst, io.Error.None } - -// hash_file will read the file provided by the given handle and return the -// computed digest in a newly allocated slice. -hash_file :: proc( - algorithm: Algorithm, - hd: os.Handle, - load_at_once := false, - allocator := context.allocator, -) -> ( - []byte, - io.Error, -) { - if !load_at_once { - return hash_stream(algorithm, os.stream_from_handle(hd), allocator) - } - - buf, ok := os.read_entire_file(hd, allocator) - if !ok { - return nil, io.Error.Unknown - } - defer delete(buf, allocator) - - return hash_bytes(algorithm, buf, allocator), io.Error.None -} - -hash :: proc { - hash_stream, - hash_file, - hash_bytes, - hash_string, - hash_bytes_to_buffer, - hash_string_to_buffer, -} diff --git a/core/crypto/hash/hash_freestanding.odin b/core/crypto/hash/hash_freestanding.odin new file mode 100644 index 000000000..15fd6ab4f --- /dev/null +++ b/core/crypto/hash/hash_freestanding.odin @@ -0,0 +1,10 @@ +//+build freestanding +package crypto_hash + +hash :: proc { + hash_stream, + hash_bytes, + hash_string, + hash_bytes_to_buffer, + hash_string_to_buffer, +} diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin new file mode 100644 index 000000000..d69f21237 --- /dev/null +++ b/core/crypto/hash/hash_os.odin @@ -0,0 +1,37 @@ +//+build !freestanding +package crypto_hash + +import "core:os" + +// hash_file will read the file provided by the given handle and return the +// computed digest in a newly allocated slice. +hash_file :: proc( + algorithm: Algorithm, + hd: os.Handle, + load_at_once := false, + allocator := context.allocator, +) -> ( + []byte, + io.Error, +) { + if !load_at_once { + return hash_stream(algorithm, os.stream_from_handle(hd), allocator) + } + + buf, ok := os.read_entire_file(hd, allocator) + if !ok { + return nil, io.Error.Unknown + } + defer delete(buf, allocator) + + return hash_bytes(algorithm, buf, allocator), io.Error.None +} + +hash :: proc { + hash_stream, + hash_file, + hash_bytes, + hash_string, + hash_bytes_to_buffer, + hash_string_to_buffer, +} From d560dad0d84f2a2c830810bb44b8e250a494511f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Sep 2024 12:09:30 +0100 Subject: [PATCH 160/320] Add missing import that was accidentally deleted before commit --- core/crypto/hash/hash_os.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin index d69f21237..1fbaab3fe 100644 --- a/core/crypto/hash/hash_os.odin +++ b/core/crypto/hash/hash_os.odin @@ -1,6 +1,7 @@ //+build !freestanding package crypto_hash +import "core:io" import "core:os" // hash_file will read the file provided by the given handle and return the From ee02d04a9b21fb9889b022be9d3ee285139c25c2 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Thu, 19 Sep 2024 22:18:46 +1100 Subject: [PATCH 161/320] [os2/process]: Don't quote arguments unless needed --- core/os/os2/process_windows.odin | 56 ++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/core/os/os2/process_windows.odin b/core/os/os2/process_windows.odin index edb321509..f2b889c72 100644 --- a/core/os/os2/process_windows.odin +++ b/core/os/os2/process_windows.odin @@ -638,6 +638,19 @@ _parse_command_line :: proc(cmd_line_w: [^]u16, allocator: runtime.Allocator) -> return } +@(private) +QUOTED_CHARS :: "()[]{}^=;!'+,`~\" " + +@(private) +_char_needs_escape :: proc(ch: u8) -> bool { + for r in transmute([]byte) string(QUOTED_CHARS) { + if ch == r { + return true + } + } + return false +} + _build_command_line :: proc(command: []string, allocator: runtime.Allocator) -> string { _write_byte_n_times :: #force_inline proc(builder: ^strings.Builder, b: byte, n: int) { for _ in 0 ..< n { @@ -650,26 +663,35 @@ _build_command_line :: proc(command: []string, allocator: runtime.Allocator) -> strings.write_byte(&builder, ' ') } j := 0 - strings.write_byte(&builder, '"') - for j < len(arg) { - backslashes := 0 - for j < len(arg) && arg[j] == '\\' { - backslashes += 1 + arg_needs_quoting := false + // Note(flysand): From documentation of `cmd.exe`, run "cmd /?" + if strings.contains_any(arg, QUOTED_CHARS) { + arg_needs_quoting = true + } + if !arg_needs_quoting { + strings.write_string(&builder, arg) + } else { + strings.write_byte(&builder, '"') + for j < len(arg) { + backslashes := 0 + for j < len(arg) && arg[j] == '\\' { + backslashes += 1 + j += 1 + } + if j == len(arg) { + _write_byte_n_times(&builder, '\\', 2*backslashes) + break + } else if arg[j] == '"' { + _write_byte_n_times(&builder, '\\', 2*backslashes+1) + strings.write_byte(&builder, arg[j]) + } else { + _write_byte_n_times(&builder, '\\', backslashes) + strings.write_byte(&builder, arg[j]) + } j += 1 } - if j == len(arg) { - _write_byte_n_times(&builder, '\\', 2*backslashes) - break - } else if arg[j] == '"' { - _write_byte_n_times(&builder, '\\', 2*backslashes+1) - strings.write_byte(&builder, '"') - } else { - _write_byte_n_times(&builder, '\\', backslashes) - strings.write_byte(&builder, arg[j]) - } - j += 1 + strings.write_byte(&builder, '"') } - strings.write_byte(&builder, '"') } return strings.to_string(builder) } From 68960e7d0a3cc9a0c3c8a7f5589ae5c0e5a966f1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Sep 2024 12:39:56 +0100 Subject: [PATCH 162/320] Use `#+` tags --- core/crypto/hash/hash_freestanding.odin | 2 +- core/crypto/hash/hash_os.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/crypto/hash/hash_freestanding.odin b/core/crypto/hash/hash_freestanding.odin index 15fd6ab4f..bec3c4eee 100644 --- a/core/crypto/hash/hash_freestanding.odin +++ b/core/crypto/hash/hash_freestanding.odin @@ -1,4 +1,4 @@ -//+build freestanding +#+build freestanding package crypto_hash hash :: proc { diff --git a/core/crypto/hash/hash_os.odin b/core/crypto/hash/hash_os.odin index 1fbaab3fe..d54e657ad 100644 --- a/core/crypto/hash/hash_os.odin +++ b/core/crypto/hash/hash_os.odin @@ -1,4 +1,4 @@ -//+build !freestanding +#+build !freestanding package crypto_hash import "core:io" From a4dd4892846c73d21793138f518fc4b877aebca8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 19 Sep 2024 17:12:47 +0100 Subject: [PATCH 163/320] Add fmt tags --- vendor/wasm/js/events.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/wasm/js/events.odin b/vendor/wasm/js/events.odin index 77a8085f4..442dc50b3 100644 --- a/vendor/wasm/js/events.odin +++ b/vendor/wasm/js/events.odin @@ -235,10 +235,10 @@ Event :: struct { repeat: bool, - _key_len: int, - _code_len: int, - _key_buf: [KEYBOARD_MAX_KEY_SIZE]byte, - _code_buf: [KEYBOARD_MAX_KEY_SIZE]byte, + _key_len: int `fmt:"-"`, + _code_len: int `fmt:"-"`, + _key_buf: [KEYBOARD_MAX_KEY_SIZE]byte `fmt:"-"`, + _code_buf: [KEYBOARD_MAX_KEY_SIZE]byte `fmt:"-"`, }, mouse: struct { From b116e8ff55c9250d29f63d7b91cb749bf0766c4f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 20 Sep 2024 01:29:39 +0100 Subject: [PATCH 164/320] Fix 128-bit integer support for wasm targets --- base/runtime/procs_wasm.odin | 60 ++++++++++++++++++++++++------------ src/llvm_abi.cpp | 9 +++--- vendor/wasm/js/events.odin | 6 +++- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/base/runtime/procs_wasm.odin b/base/runtime/procs_wasm.odin index 8da1564c6..7e03656ca 100644 --- a/base/runtime/procs_wasm.odin +++ b/base/runtime/procs_wasm.odin @@ -14,33 +14,57 @@ ti_uint :: struct #raw_union { } @(link_name="__ashlti3", linkage="strong") -__ashlti3 :: proc "contextless" (la, ha: u64, b_: u32) -> i128 { - bits_in_dword :: size_of(u32)*8 - b := u32(b_) +__ashlti3 :: proc "contextless" (a: i128, b: u32) -> i128 { + bits :: 64 - input, result: ti_int - input.lo, input.hi = la, ha - if b & bits_in_dword != 0 { + input: ti_int = --- + result: ti_int = --- + input.all = a + if b & bits != 0 { result.lo = 0 - result.hi = input.lo << (b-bits_in_dword) + result.hi = input.lo << (b-bits) } else { if b == 0 { - return input.all + return a } result.lo = input.lo<>(bits_in_dword-b)) + result.hi = (input.hi<>(bits-b)) } return result.all } +__ashlti3_unsigned :: proc "contextless" (a: u128, b: u32) -> u128 { + return cast(u128)__ashlti3(cast(i128)a, b) +} + +@(link_name="__mulddi3", linkage="strong") +__mulddi3 :: proc "contextless" (a, b: u64) -> i128 { + r: ti_int + bits :: 32 + + mask :: ~u64(0) >> bits + r.lo = (a & mask) * (b & mask) + t := r.lo >> bits + r.lo &= mask + t += (a >> bits) * (b & mask) + r.lo += (t & mask) << bits + r.hi = t >> bits + t = r.lo >> bits + r.lo &= mask + t += (b >> bits) * (a & mask) + r.lo += (t & mask) << bits + r.hi += t >> bits + r.hi += (a >> bits) * (b >> bits) + return r.all +} @(link_name="__multi3", linkage="strong") -__multi3 :: proc "contextless" (la, ha, lb, hb: u64) -> i128 { +__multi3 :: proc "contextless" (a, b: i128) -> i128 { x, y, r: ti_int - x.lo, x.hi = la, ha - y.lo, y.hi = lb, hb - r.all = i128(x.lo * y.lo) // TODO this is incorrect + x.all = a + y.all = b + r.all = __mulddi3(x.lo, y.lo) r.hi += x.hi*y.lo + x.lo*y.hi return r.all } @@ -54,18 +78,16 @@ udivti3 :: proc "c" (la, ha, lb, hb: u64) -> u128 { } @(link_name="__lshrti3", linkage="strong") -__lshrti3 :: proc "c" (la, ha: u64, b: u32) -> i128 { - bits :: size_of(u32)*8 +__lshrti3 :: proc "c" (a: i128, b: u32) -> i128 { + bits :: 64 input, result: ti_int - input.lo = la - input.hi = ha - + input.all = a if b & bits != 0 { result.hi = 0 result.lo = input.hi >> (b - bits) } else if b == 0 { - return input.all + return a } else { result.hi = input.hi >> b result.lo = (input.hi << (bits - b)) | (input.lo >> b) diff --git a/src/llvm_abi.cpp b/src/llvm_abi.cpp index aa5c4dc60..42086b09d 100644 --- a/src/llvm_abi.cpp +++ b/src/llvm_abi.cpp @@ -1257,11 +1257,12 @@ namespace lbAbiWasm { } gb_internal lbArgType non_struct(LLVMContextRef c, LLVMTypeRef type, bool is_return) { - if (!is_return && type == LLVMIntTypeInContext(c, 128)) { - LLVMTypeRef cast_type = LLVMVectorType(LLVMInt64TypeInContext(c), 2); + if (type == LLVMIntTypeInContext(c, 128)) { + // LLVMTypeRef cast_type = LLVMVectorType(LLVMInt64TypeInContext(c), 2); + LLVMTypeRef cast_type = nullptr; return lb_arg_type_direct(type, cast_type, nullptr, nullptr); } - + if (!is_return && lb_sizeof(type) > 8) { return lb_arg_type_indirect(type, nullptr); } @@ -1282,7 +1283,7 @@ namespace lbAbiWasm { case LLVMPointerTypeKind: return true; case LLVMIntegerTypeKind: - return lb_sizeof(type) <= 8; + return lb_sizeof(type) <= 16; } return false; } diff --git a/vendor/wasm/js/events.odin b/vendor/wasm/js/events.odin index 442dc50b3..258776fff 100644 --- a/vendor/wasm/js/events.odin +++ b/vendor/wasm/js/events.odin @@ -30,6 +30,8 @@ Event_Kind :: enum u32 { Wheel, Focus, + Focus_In, + Focus_Out, Submit, Blur, Change, @@ -110,6 +112,8 @@ event_kind_string := [Event_Kind]string{ .Wheel = "wheel", .Focus = "focus", + .Focus_In = "focusin", + .Focus_Out = "focusout", .Submit = "submit", .Blur = "blur", .Change = "change", @@ -332,7 +336,7 @@ remove_custom_event_listener :: proc(id: string, name: string, user_data: rawptr return _remove_event_listener(id, name, user_data, callback) } - +import "core:fmt" @(export, link_name="odin_dom_do_event_callback") From 02884207d56d7dafbf78465d53e10f0478aa493a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 20 Sep 2024 11:15:47 +0100 Subject: [PATCH 165/320] Update wasm's runtime.js --- vendor/wasm/js/dom.odin | 17 +++++ vendor/wasm/js/runtime.js | 152 +++++++++++++++++++++++++++----------- 2 files changed, 124 insertions(+), 45 deletions(-) diff --git a/vendor/wasm/js/dom.odin b/vendor/wasm/js/dom.odin index e19be3078..28dd32fed 100644 --- a/vendor/wasm/js/dom.odin +++ b/vendor/wasm/js/dom.odin @@ -8,9 +8,15 @@ foreign dom_lib { get_element_value_f64 :: proc(id: string) -> f64 --- set_element_value_f64 :: proc(id: string, value: f64) --- + get_element_key_f64 :: proc(id: string, key: string) -> f64 --- + set_element_key_f64 :: proc(id: string, key: string, value: f64) --- + set_element_value_string :: proc(id: string, value: string) --- get_element_value_string_length :: proc(id: string) -> int --- + set_element_key_string :: proc(id: string, key: string, value: string) --- + get_element_key_string_length :: proc(id: string, key: string, ) -> int --- + device_pixel_ratio :: proc() -> f64 --- window_set_scroll :: proc(x, y: f64) --- @@ -24,10 +30,21 @@ get_element_value_string :: proc "contextless" (id: string, buf: []byte) -> stri } n := _get_element_value_string(id, buf) return string(buf[:n]) +} + +get_element_key_string :: proc "contextless" (id: string, key: string, buf: []byte) -> string { + @(default_calling_convention="contextless") + foreign dom_lib { + @(link_name="get_element_key_string") + _get_element_key_string :: proc(id: string, key: string, buf: []byte) -> int --- + } + n := _get_element_key_string(id, key, buf) + return string(buf[:n]) } + get_element_min_max :: proc "contextless" (id: string) -> (min, max: f64) { @(default_calling_convention="contextless") foreign dom_lib { diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index 74ad7568e..2258f805b 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -108,7 +108,7 @@ class WasmMemoryInterface { const bytes = this.loadBytes(ptr, Number(len)); return new TextDecoder().decode(bytes); } - + loadCstring(ptr) { const start = this.loadPtr(ptr); if (start == 0) { @@ -1259,7 +1259,7 @@ class WebGLInterface { }; -function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { +function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory, eventQueue, event_temp) { const MAX_INFO_CONSOLE_LINES = 512; let infoConsoleLines = new Array(); let currentLine = {}; @@ -1377,10 +1377,8 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { info.scrollTop = info.scrollHeight; }; - let event_temp_data = {}; - let webglContext = new WebGLInterface(wasmMemoryInterface); - + const env = {}; if (memory) { @@ -1455,9 +1453,13 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { let wmi = wasmMemoryInterface; - let e = event_temp_data.event; + if (!event_temp.data) { + return; + } - wmi.storeU32(off(4), event_temp_data.name_code); + let e = event_temp.data.event; + + wmi.storeU32(off(4), event_temp.data.name_code); if (e.target == document) { wmi.storeU32(off(4), 1); } else if (e.target == window) { @@ -1475,8 +1477,8 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { align(W); - wmi.storeI32(off(W), event_temp_data.id_ptr); - wmi.storeUint(off(W), event_temp_data.id_len); + wmi.storeI32(off(W), event_temp.data.id_ptr); + wmi.storeUint(off(W), event_temp.data.id_len); align(8); wmi.storeF64(off(8), e.timeStamp*1e-3); @@ -1518,7 +1520,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } else if (e instanceof KeyboardEvent) { // Note: those strings are constructed // on the native side from buffers that - // are filled later, so skip them + // are filled later, so skip them const keyPtr = off(W*2, W); const codePtr = off(W*2, W); @@ -1552,12 +1554,30 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } let listener = (e) => { - const odin_ctx = wasmMemoryInterface.exports.default_context_ptr(); - event_temp_data.id_ptr = id_ptr; - event_temp_data.id_len = id_len; - event_temp_data.event = e; - event_temp_data.name_code = name_code; - wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx); + let event_data = {}; + event_data.id_ptr = id_ptr; + event_data.id_len = id_len; + event_data.event = e; + event_data.name_code = name_code; + + eventQueue.push({event_data: event_data, data: data, callback: callback}); + }; + wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; + element.addEventListener(name, listener, !!use_capture); + return true; + }, + + add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = window; + let listener = (e) => { + let event_data = {}; + event_data.id_ptr = 0; + event_data.id_len = 0; + event_data.event = e; + event_data.name_code = name_code; + + eventQueue.push({event_data: event_data, data: data, callback: callback}); }; wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; element.addEventListener(name, listener, !!use_capture); @@ -1579,24 +1599,6 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { element.removeEventListener(name, listener); return true; }, - - - add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { - let name = wasmMemoryInterface.loadString(name_ptr, name_len); - let element = window; - let listener = (e) => { - const odin_ctx = wasmMemoryInterface.exports.default_context_ptr(); - event_temp_data.id_ptr = 0; - event_temp_data.id_len = 0; - event_temp_data.event = e; - event_temp_data.name_code = name_code; - wasmMemoryInterface.exports.odin_dom_do_event_callback(data, callback, odin_ctx); - }; - wasmMemoryInterface.listenerMap[{data: data, callback: callback}] = listener; - element.addEventListener(name, listener, !!use_capture); - return true; - }, - remove_window_event_listener: (name_ptr, name_len, data, callback) => { let name = wasmMemoryInterface.loadString(name_ptr, name_len); let element = window; @@ -1612,18 +1614,18 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { }, event_stop_propagation: () => { - if (event_temp_data && event_temp_data.event) { - event_temp_data.event.stopPropagation(); + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.stopPropagation(); } }, event_stop_immediate_propagation: () => { - if (event_temp_data && event_temp_data.event) { - event_temp_data.event.stopImmediatePropagation(); + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.stopImmediatePropagation(); } }, event_prevent_default: () => { - if (event_temp_data && event_temp_data.event) { - event_temp_data.event.preventDefault(); + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.preventDefault(); } }, @@ -1696,6 +1698,55 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } }, + get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + return element ? element[key] : 0; + }, + get_element_key_string: (id_ptr, id_len, key_ptr, key_len, buf_ptr, buf_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element) { + let str = element[key]; + if (buf_len > 0 && buf_ptr) { + let n = Math.min(buf_len, str.length); + str = str.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(str)) + return n; + } + } + return 0; + }, + get_element_key_string_length: (id_ptr, id_len, key_ptr, key_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element && element[key]) { + return element[key].length; + } + return 0; + }, + + set_element_key_f64: (id_ptr, id_len, key_ptr, key_len, value) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element) { + element[key] = value; + } + }, + set_element_key_string: (id_ptr, id_len, key_ptr, key_len, value_ptr, value_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let value = wasmMemoryInterface.loadString(value_ptr, value_len); + let element = getElement(id); + if (element) { + element[key] = value; + } + }, + get_bounding_client_rect: (rect_ptr, id_ptr, id_len) => { let id = wasmMemoryInterface.loadString(id_ptr, id_len); @@ -1750,7 +1801,10 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory } wasmMemoryInterface.setIntSize(intSize); - let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory); + let eventQueue = new Array(); + let event_temp = {}; + + let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory, eventQueue, event_temp); let exports = {}; if (extraForeignImports !== undefined) { @@ -1775,14 +1829,14 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory exports._start(); - // Define a `@export step :: proc(dt: f32) -> (keep_going: bool) {` + // Define a `@export step :: proc(current_type: f64) -> (keep_going: bool) {` // in your app and it will get called every frame. // return `false` to stop the execution of the module. if (exports.step) { const odin_ctx = exports.default_context_ptr(); let prevTimeStamp = undefined; - const step = (currTimeStamp) => { + function step(currTimeStamp) { if (prevTimeStamp == undefined) { prevTimeStamp = currTimeStamp; } @@ -1790,13 +1844,21 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory const dt = (currTimeStamp - prevTimeStamp)*0.001; prevTimeStamp = currTimeStamp; - if (!exports.step(dt, odin_ctx)) { + for (let i = 0; i < eventQueue.length; i++) { + let e = eventQueue[i]; + event_temp.data = e.event_data; + exports.odin_dom_do_event_callback(e.data, e.callback, odin_ctx); + } + event_temp.data = null; + eventQueue.length = 0; + + if (!exports.step(currTimeStamp*0.001, odin_ctx)) { exports._end(); return; } window.requestAnimationFrame(step); - }; + } window.requestAnimationFrame(step); } else { From 2c5be4e054885d382080a6e3ca9f1f3878c72145 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 20 Sep 2024 11:18:11 +0100 Subject: [PATCH 166/320] Use `.shift()` instead --- vendor/wasm/js/runtime.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index 2258f805b..afd9f6dff 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -1844,13 +1844,12 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory const dt = (currTimeStamp - prevTimeStamp)*0.001; prevTimeStamp = currTimeStamp; - for (let i = 0; i < eventQueue.length; i++) { - let e = eventQueue[i]; + while (eventQueue.length > 0) { + let e = eventQueue.shift() event_temp.data = e.event_data; exports.odin_dom_do_event_callback(e.data, e.callback, odin_ctx); } event_temp.data = null; - eventQueue.length = 0; if (!exports.step(currTimeStamp*0.001, odin_ctx)) { exports._end(); From 9a8fb2fb2768db211c2aeaefe77fe45b4f91a567 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Fri, 20 Sep 2024 15:12:35 +0200 Subject: [PATCH 167/320] Fix for infinite loop in core:odin file tags parser when your local copy uses \r --- core/odin/parser/file_tags.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/odin/parser/file_tags.odin b/core/odin/parser/file_tags.odin index e2a07f8fb..84b172148 100644 --- a/core/odin/parser/file_tags.odin +++ b/core/odin/parser/file_tags.odin @@ -129,7 +129,7 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags name_start := i switch next_char(text, &i) { - case 0, '\n': + case 0, '\r', '\n': i -= 1 break groups_loop case ',': @@ -164,7 +164,7 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags is_notted: bool switch next_char(text, &i) { - case 0, '\n': + case 0, '\r', '\n': i -= 1 break kinds_loop case ',': From b33f6ba1b0971f000522c0da044a7011d4df8369 Mon Sep 17 00:00:00 2001 From: Antonino Simone Di Stefano Date: Sat, 21 Sep 2024 00:30:36 +0200 Subject: [PATCH 168/320] Fix type in parameter of atomic_compare_exchange_weak_explicit desited -> desired --- core/c/libc/stdatomic.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/c/libc/stdatomic.odin b/core/c/libc/stdatomic.odin index 8dc243b78..43a0e51df 100644 --- a/core/c/libc/stdatomic.odin +++ b/core/c/libc/stdatomic.odin @@ -235,7 +235,7 @@ atomic_compare_exchange_weak :: #force_inline proc(object, expected: ^$T, desire return ok } -atomic_compare_exchange_weak_explicit :: #force_inline proc(object, expected: ^$T, desited: T, success, failure: memory_order) -> bool { +atomic_compare_exchange_weak_explicit :: #force_inline proc(object, expected: ^$T, desired: T, success, failure: memory_order) -> bool { assert(failure != .release) assert(failure != .acq_rel) From 355f84d0cd8826ddef953b8ab003cfe56078c04b Mon Sep 17 00:00:00 2001 From: Antonino Simone Di Stefano Date: Sat, 21 Sep 2024 00:30:50 +0200 Subject: [PATCH 169/320] Use package qualifier for type_info_base and Type_Info_map --- core/slice/map.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/slice/map.odin b/core/slice/map.odin index 545ba8305..2d16e3ae1 100644 --- a/core/slice/map.odin +++ b/core/slice/map.odin @@ -52,7 +52,7 @@ map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (ent m := m rm := (^runtime.Raw_Map)(&m) - info := type_info_base(type_info_of(M)).variant.(Type_Info_Map) + info := runtime.type_info_base(type_info_of(M)).variant.(runtime.Type_Info_Map) if info.map_info != nil { entries = make(type_of(entries), len(m), allocator) or_return From 84700e09c9903e5e40badb829b599dd67886f68c Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Fri, 20 Sep 2024 19:02:00 -0400 Subject: [PATCH 170/320] Forbid parsing more fields if no separator was found Fixes #4278 --- src/parser.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/parser.cpp b/src/parser.cpp index 520a23c5a..5b4604c6d 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4377,10 +4377,14 @@ gb_internal Ast *parse_field_list(AstFile *f, isize *name_count_, u32 allowed_fl } } - allow_field_separator(f); + bool more_fields = allow_field_separator(f); Ast *param = ast_field(f, names, type, default_value, set_flags, tag, docs, f->line_comment); array_add(¶ms, param); + if (!more_fields) { + if (name_count_) *name_count_ = total_name_count; + return ast_field_list(f, start_token, params); + } while (f->curr_token.kind != follow && f->curr_token.kind != Token_EOF && From a89d22b291c4df103212756a27459bd9eb02a807 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Sat, 21 Sep 2024 00:47:21 -0400 Subject: [PATCH 171/320] add `time.time_to_rfc3339`, a printer to RFC3339 dates this is the counterpart to the existing parsing function `rfc3339_to_time_utc` and others. It prints the timestamp as a string, allocated dynamically. --- core/time/rfc3339.odin | 106 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/core/time/rfc3339.odin b/core/time/rfc3339.odin index e4c6565d6..3ed149ad1 100644 --- a/core/time/rfc3339.odin +++ b/core/time/rfc3339.odin @@ -187,4 +187,108 @@ scan_digits :: proc(s: string, sep: string, count: int) -> (res: int, ok: bool) found_sep |= rune(s[count]) == v } return res, found_sep -} \ No newline at end of file +} + +/* +Serialize the timestamp as a RFC 3339 string. + +The boolean `ok` is false if the `time` is not a valid datetime, or if allocating the result string fails. + +**Inputs**: +- `utc_offset`: offset in minutes wrt UTC (ie. the timezone) +- `include_nanos`: whether to include nanoseconds in the result. +*/ +time_to_rfc3339 :: proc(time: Time, utc_offset : int = 0, include_nanos := true, allocator := context.allocator) -> (res: string, ok: bool) { + // convert to datetime + datetime := time_to_datetime(time) or_return + + if datetime.year < 0 || datetime.year >= 10_000 { return "", false } + + temp_string := [30]u8{} + offset : uint = 0 // offset in temp_string + + print_as_fixed_int :: proc(dst: []u8, offset: ^uint, width: i8, i: i64) { + i := i + width := width + for digit_idx in 0.. (res: i64, n_digits: i8) { + res = n + n_digits = 9 + for res % 10 == 0 { + res = res / 10 + n_digits -= 1 + } + return + } + + // pre-epoch times: turn, say, -400ms to +600ms for display + nanos := time._nsec % 1_000_000_000 + if nanos < 0 { + nanos += 1_000_000_000 + } + + if nanos != 0 && include_nanos { + temp_string[offset] = '.' + offset += 1 + + // remove trailing zeroes + nanos_nonzero, n_digits := strip_trailing_zeroes_nanos(nanos) + assert(nanos_nonzero != 0) + + // write digits, right-to-left + for digit_idx : i8 = n_digits-1; digit_idx >= 0; digit_idx -= 1 { + digit := u8(nanos_nonzero % 10) + temp_string[offset + uint(digit_idx)] = '0' + u8(digit) + nanos_nonzero /= 10 + } + offset += uint(n_digits) + } + + if utc_offset == 0 { + temp_string[offset] = 'Z' + offset += 1 + } else { + temp_string[offset] = utc_offset > 0 ? '+' : '-' + offset += 1; + utc_offset := abs(utc_offset) + print_as_fixed_int(temp_string[:], &offset, 2, i64(utc_offset / 60)) + temp_string[offset] = ':' + offset += 1 + print_as_fixed_int(temp_string[:], &offset, 2, i64(utc_offset % 60)) + } + + res_as_slice, res_alloc := make_slice([]u8, len=offset, allocator = allocator) + if res_alloc != nil { + return "", false + } + + copy(res_as_slice, temp_string[:offset]) + + return string(res_as_slice), true +} From d08b3d3b82145faefe315d68350878c61b218b94 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Sat, 21 Sep 2024 00:48:39 -0400 Subject: [PATCH 172/320] add tests for time.time_to_rfc3339 --- tests/core/time/test_core_time.odin | 31 ++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/core/time/test_core_time.odin b/tests/core/time/test_core_time.odin index 51955b1c4..2ad3690d9 100644 --- a/tests/core/time/test_core_time.odin +++ b/tests/core/time/test_core_time.odin @@ -196,6 +196,35 @@ test_parse_rfc3339_string :: proc(t: ^testing.T) { } } +@test +test_print_rfc3339 :: proc(t: ^testing.T) { + TestCase :: struct { + printed: string, + time: i64, + utc_offset: int + }; + + tests :: [?]TestCase { + {"1985-04-12T23:20:50.52Z", 482196050520000000, 0}, + {"1985-04-12T23:20:50.52001905Z", 482196050520019050, 0}, + {"1996-12-19T16:39:57-08:00", 851013597000000000, -480}, + {"1996-12-20T00:39:57Z", 851042397000000000, 0}, + {"1937-01-01T12:00:27.87+00:20", -1041335972130000000, +20}, + }; + + for test in tests { + timestamp := time.Time { _nsec = test.time } + printed_timestamp, ok := time.time_to_rfc3339(time=timestamp, utc_offset=test.utc_offset) + defer delete_string(printed_timestamp) + + testing.expect(t, ok, "expected printing to work fine") + + testing.expectf( + t, printed_timestamp == test.printed, + "expected is %w, printed is %w", test.printed, printed_timestamp) + } +} + @test test_parse_iso8601_string :: proc(t: ^testing.T) { for test in iso8601_tests { @@ -318,4 +347,4 @@ date_component_roundtrip_test :: proc(t: ^testing.T, moment: dt.DateTime) { "Expected %4d-%2d-%2d %2d:%2d:%2d, got %4d-%2d-%2d %2d:%2d:%2d", moment.year, moment.month, moment.day, moment.hour, moment.minute, moment.second, YYYY, MM, DD, hh, mm, ss, ) -} \ No newline at end of file +} From 32e13f17aea7068b5621d21f97ef820c8dae16a4 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Sat, 21 Sep 2024 21:08:35 -0400 Subject: [PATCH 173/320] Apply suggestions from code review Co-authored-by: flysand7 --- core/time/rfc3339.odin | 6 +++--- tests/core/time/test_core_time.odin | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/time/rfc3339.odin b/core/time/rfc3339.odin index 3ed149ad1..9d816b3fa 100644 --- a/core/time/rfc3339.odin +++ b/core/time/rfc3339.odin @@ -204,8 +204,8 @@ time_to_rfc3339 :: proc(time: Time, utc_offset : int = 0, include_nanos := true, if datetime.year < 0 || datetime.year >= 10_000 { return "", false } - temp_string := [30]u8{} - offset : uint = 0 // offset in temp_string + temp_string := [36]u8{} + offset : uint = 0 print_as_fixed_int :: proc(dst: []u8, offset: ^uint, width: i8, i: i64) { i := i @@ -275,7 +275,7 @@ time_to_rfc3339 :: proc(time: Time, utc_offset : int = 0, include_nanos := true, offset += 1 } else { temp_string[offset] = utc_offset > 0 ? '+' : '-' - offset += 1; + offset += 1 utc_offset := abs(utc_offset) print_as_fixed_int(temp_string[:], &offset, 2, i64(utc_offset / 60)) temp_string[offset] = ':' diff --git a/tests/core/time/test_core_time.odin b/tests/core/time/test_core_time.odin index 2ad3690d9..23044b72f 100644 --- a/tests/core/time/test_core_time.odin +++ b/tests/core/time/test_core_time.odin @@ -201,7 +201,7 @@ test_print_rfc3339 :: proc(t: ^testing.T) { TestCase :: struct { printed: string, time: i64, - utc_offset: int + utc_offset: int, }; tests :: [?]TestCase { @@ -221,7 +221,8 @@ test_print_rfc3339 :: proc(t: ^testing.T) { testing.expectf( t, printed_timestamp == test.printed, - "expected is %w, printed is %w", test.printed, printed_timestamp) + "expected is %w, printed is %w", test.printed, printed_timestamp, + ) } } From 10702f113476fc4094801e27f1f861a29a2ab632 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 21 Sep 2024 20:44:33 -0600 Subject: [PATCH 174/320] Implement POSIX pthread, signal, sys/resource, unistd for Linux. --- core/sys/posix/pthread.odin | 39 ++++ core/sys/posix/signal.odin | 151 +++++++++++++++- core/sys/posix/sys_resource.odin | 12 +- core/sys/posix/unistd.odin | 300 +++++++++++++++++++++++++------ 4 files changed, 438 insertions(+), 64 deletions(-) diff --git a/core/sys/posix/pthread.odin b/core/sys/posix/pthread.odin index e264f6f6c..aa7b50a6f 100644 --- a/core/sys/posix/pthread.odin +++ b/core/sys/posix/pthread.odin @@ -513,6 +513,45 @@ when ODIN_OS == .Darwin { sched_priority: c.int, /* [PSX] process or thread execution scheduling priority */ } +} else when ODIN_OS == .Linux { + + PTHREAD_CANCEL_DEFERRED :: 0 + PTHREAD_CANCEL_ASYNCHRONOUS :: 1 + + PTHREAD_CANCEL_ENABLE :: 0 + PTHREAD_CANCEL_DISABLE :: 1 + + PTHREAD_CANCELED :: rawptr(uintptr(-1)) + + PTHREAD_CREATE_JOINABLE :: 0 + PTHREAD_CREATE_DETACHED :: 1 + + PTHREAD_INHERIT_SCHED :: 0 + PTHREAD_EXPLICIT_SCHED :: 1 + + PTHREAD_PRIO_NONE :: 0 + PTHREAD_PRIO_INHERIT :: 1 + PTHREAD_PRIO_PROTECT :: 2 + + PTHREAD_PROCESS_PRIVATE :: 0 + PTHREAD_PROCESS_SHARED :: 1 + + PTHREAD_SCOPE_SYSTEM :: 0 + PTHREAD_SCOPE_PROCESS :: 1 + + pthread_t :: distinct c.ulong + + pthread_attr_t :: struct #raw_union { + __size: [56]c.char, + __align: c.long, + } + + pthread_key_t :: distinct c.uint + + sched_param :: struct { + sched_priority: c.int, /* [PSX] process or thread execution scheduling priority */ + } + } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/signal.odin b/core/sys/posix/signal.odin index c35494185..7cb4f4c43 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -220,6 +220,16 @@ foreign lib { const struct timespec *restrict); int sigwaitinfo(const sigset_t *restrict, siginfo_t *restrict); */ + + when ODIN_OS == .Linux { + /* Return number of available real-time signal with highest priority. */ + @(private) + __libc_current_sigrtmin :: proc() -> result --- + + /* Return number of available real-time signal with lowest priority. */ + @(private) + __libc_current_sigrtmax :: proc() -> result --- + } } sigval :: struct #raw_union { @@ -480,7 +490,7 @@ when ODIN_OS == .Darwin { uid_t :: distinct c.uint32_t sigset_t :: distinct c.uint32_t - // MOTE: unimplemented on darwin. + // NOTE: unimplemented on darwin. // // SIGRTMIN :: // SIGRTMAX :: @@ -625,7 +635,7 @@ when ODIN_OS == .Darwin { __bits: [4]c.uint32_t, } - // MOTE: unimplemented on darwin. + // NOTE: unimplemented on FreeBSD. // // SIGRTMIN :: 65 // SIGRTMAX :: 126 @@ -794,7 +804,7 @@ when ODIN_OS == .Darwin { __bits: [4]c.uint32_t, } - // MOTE: unimplemented on darwin. + // NOTE: unimplemented on NetBSD. // // SIGRTMIN :: 33 // SIGRTMAX :: 63 @@ -1126,6 +1136,141 @@ when ODIN_OS == .Darwin { SI_ASYNCIO :: -4 // NOTE: not implemented SI_MESGQ :: -5 // NOTE: not implemented +} else when ODIN_OS == .Linux { + + // Request that signal be held + SIG_HOLD :: rawptr(uintptr(2)) + + uid_t :: distinct c.uint32_t + sigset_t :: struct { + [1024/(8 * size_of(c.ulong))]val + } + + SIGRTMIN :: __libc_current_sigrtmin() + SIGRTMAX :: __libc_current_sigrtmax() + + SIGHUP :: 1 + SIGQUIT :: 3 + SIGTRAP :: 5 + SIGBUS :: 7 + SIGKILL :: 9 + SIGUSR1 :: 10 + SIGUSR2 :: 12 + SIGPIPE :: 13 + SIGALRM :: 14 + SIGCHLD :: 17 + SIGCONT :: 18 + SIGSTOP :: 19 + SIGTSTP :: 20 + SIGTTIN :: 21 + SIGTTOU :: 22 + SIGURG :: 23 + SIGXCPU :: 24 + SIGXFSZ :: 25 + SIGVTALRM :: 26 + SIGPROF :: 27 + SIGPOLL :: 29 + SIGSYS :: 31 + + sigaction :: struct { + sa_handler: proc "c" (Signal), + sa_flags: SA_Flags, + sa_mask: sigset_t, + } + + SIG_BLOCK :: 0 + SIG_UNBLOCK :: 1 + SIG_SETMASK :: 2 + + SA_NOCLDSTOP :: 1 + SA_NOCLDWAIT :: 2 + SA_SIGINFO :: 4 + SA_ONSTACK :: 0x08000000 + SA_RESTART :: 0x10000000 + SA_NODEFER :: 0x40000000 + SA_RESETHAND :: 0x80000000 + + SS_ONSTACK :: 1 + SS_DISABLE :: 2 + + MINSIGSTKSZ :: 2048 + SIGSTKSZ :: 8192 + + stack_t :: struct { + ss_sp: rawptr, /* [PSX] stack base or pointer */ + ss_flags: SS_Flags, /* [PSX] flags */ + ss_size: c.size_t, /* [PSX] stack size */ + } + + // WARNING: This implementaion might be completely wrong and need to be reviewed and corrected. + siginfo_t :: struct { + si_signo: Signal, /* [PSX] signal number */ + si_code: struct #raw_union { /* [PSX] specific more detailed codes per signal */ + ill: ILL_Code, + fpe: FPE_Code, + segv: SEGV_Code, + bus: BUS_Code, + trap: TRAP_Code, + chld: CLD_Code, + poll: POLL_Code, + any: Any_Code, + }, + si_errno: Errno, /* [PSX] errno value associated with this signal */ + si_pid: pid_t, /* [PSX] sending process ID */ + si_uid: uid_t, /* [PSX] real user ID of sending process */ + si_addr: rawptr, /* [PSX] address of faulting instruction */ + si_status: c.int, /* [PSX] exit value or signal */ + si_band: c.long, /* [PSX] band event for SIGPOLL */ + si_value: sigval, /* [PSX] signal value */ + } + + ILL_ILLOPC :: 1 + ILL_ILLOPN :: 2 + ILL_ILLADR :: 3 + ILL_ILLTRP :: 4 + ILL_PRVOPC :: 5 + ILL_PRVREG :: 6 + ILL_COPROC :: 7 + ILL_BADSTK :: 8 + + FPE_INTDIV :: 1 + FPE_INTOVF :: 2 + FPE_FLTDIV :: 3 + FPE_FLTOVF :: 4 + FPE_FLTUND :: 5 + FPE_FLTRES :: 6 + FPE_FLTINV :: 7 + FPE_FLTSUB :: 8 + + SEGV_MAPERR :: 1 + SEGV_ACCERR :: 2 + + BUS_ADRALN :: 1 + BUS_ADRERR :: 2 + BUS_OBJERR :: 3 + + TRAP_BRKPT :: 1 + TRAP_TRACE :: 2 + + CLD_EXITED :: 1 + CLD_KILLED :: 2 + CLD_DUMPED :: 3 + CLD_TRAPPED :: 4 + CLD_STOPPED :: 5 + CLD_CONTINUED :: 6 + + POLL_IN :: 1 + POLL_OUT :: 2 + POLL_MSG :: 3 + POLL_ERR :: 4 + POLL_PRI :: 5 + POLL_HUP :: 6 + + SI_USER :: 0 + SI_QUEUE :: -1 + SI_TIMER :: -2 + SI_MESGQ :: -3 + SI_ASYNCIO :: -4 } else { #panic("posix is unimplemented for the current target") } diff --git a/core/sys/posix/sys_resource.odin b/core/sys/posix/sys_resource.odin index 6716d60c3..ad944a7bb 100644 --- a/core/sys/posix/sys_resource.odin +++ b/core/sys/posix/sys_resource.odin @@ -95,7 +95,7 @@ when ODIN_OS == .NetBSD { @(private) LGETRUSAGE :: "getrusage" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { PRIO_PROCESS :: 0 PRIO_PGRP :: 1 @@ -103,7 +103,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS rlim_t :: distinct c.uint64_t - RLIM_INFINITY :: (rlim_t(1) << 63) - 1 + RLIM_INFINITY :: max(rlim_t) - 1 when ODIN_OS == .Linux else (rlim_t(1) << 63) - 1 RLIM_SAVED_MAX :: RLIM_INFINITY RLIM_SAVED_CUR :: RLIM_INFINITY @@ -143,9 +143,13 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS RLIMIT_CPU :: 0 RLIMIT_DATA :: 2 RLIMIT_FSIZE :: 1 - RLIMIT_NOFILE :: 8 + RLIMIT_NOFILE :: 7 when ODIN_OS == .Linux else 8 RLIMIT_STACK :: 3 - RLIMIT_AS :: 5 when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD else 10 + when ODIN_OS == .Linux { + RLIMIT_AS :: 9 + } else { + RLIMIT_AS :: 5 when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD else 10 + } } else { #panic("posix is unimplemented for the current target") diff --git a/core/sys/posix/unistd.odin b/core/sys/posix/unistd.odin index 6ed9e5d11..08f4e4b69 100644 --- a/core/sys/posix/unistd.odin +++ b/core/sys/posix/unistd.odin @@ -1181,20 +1181,20 @@ when ODIN_OS == .Darwin { F_TLOCK :: 2 F_ULOCK :: 0 - _CS_PATH :: 1 - _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 - _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 - _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 - _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 - _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 - _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 - _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 - _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 - _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 - _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 - _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 - _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 - _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 + _CS_PATH :: 1 + _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 + _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 + _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 + _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 + _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 + _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 + _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 + _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 + _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 + _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 + _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 + _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 + _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 _PC_LINK_MAX :: 1 _PC_MAX_CANON :: 2 @@ -1362,20 +1362,20 @@ when ODIN_OS == .Darwin { F_TLOCK :: 2 F_ULOCK :: 0 - _CS_PATH :: 1 - _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 - _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 - _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 - _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 - _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 - _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 - _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 - _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 - _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 - _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 - _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 - _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 - _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 + _CS_PATH :: 1 + _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 + _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 + _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 + _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 + _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 + _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 + _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 + _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 + _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 + _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 + _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 + _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 + _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 _PC_LINK_MAX :: 1 _PC_MAX_CANON :: 2 @@ -1543,20 +1543,20 @@ when ODIN_OS == .Darwin { F_TLOCK :: 2 F_ULOCK :: 0 - _CS_PATH :: 1 - _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 - _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 - _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 - _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 - _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 - _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 - _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 - _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 - _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 - _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 - _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 - _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 - _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 + _CS_PATH :: 1 + _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 + _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 + _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 + _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 + _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 + _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 + _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 + _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 + _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 + _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 + _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 + _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 + _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 _PC_LINK_MAX :: 1 _PC_MAX_CANON :: 2 @@ -1655,7 +1655,6 @@ when ODIN_OS == .Darwin { _SC_TTY_NAME_MAX :: 68 _SC_HOST_NAME_MAX :: 69 - _SC_PASS_MAX :: 70 _SC_REGEXP :: 71 _SC_SHELL :: 72 _SC_SYMLOOP_MAX :: 73 @@ -1729,20 +1728,20 @@ when ODIN_OS == .Darwin { F_TLOCK :: 2 F_ULOCK :: 0 - _CS_PATH :: 1 - _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 - _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 - _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 - _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 - _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 - _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 - _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 - _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 - _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 - _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 - _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 - _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 - _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 + _CS_PATH :: 1 + _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 2 + _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 3 + _CS_POSIX_V6_ILP32_OFF32_LIBS :: 4 + _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 5 + _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 6 + _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 7 + _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 8 + _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 9 + _CS_POSIX_V6_LP64_OFF64_LIBS :: 10 + _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 11 + _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 12 + _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 13 + _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 14 _PC_LINK_MAX :: 1 _PC_MAX_CANON :: 2 @@ -1911,6 +1910,193 @@ when ODIN_OS == .Darwin { _POSIX_VDISABLE :: '\377' +} else when ODIN_OS == .Linux { + + _F_OK :: 0 + X_OK :: 1 + W_OK :: 2 + R_OK :: 4 + + F_LOCK :: 1 + F_TEST :: 3 + F_TLOCK :: 2 + F_ULOCK :: 0 + + _CS_PATH :: 1 + _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 2 + + _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 1116 + _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 1117 + _CS_POSIX_V6_ILP32_OFF32_LIBS :: 1118 + _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 1120 + _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 1121 + _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 1122 + _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 1124 + _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 1125 + _CS_POSIX_V6_LP64_OFF64_LIBS :: 1126 + _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 1128 + _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 1129 + _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 1130 + + _PC_LINK_MAX :: 1 + _PC_MAX_CANON :: 2 + _PC_MAX_INPUT :: 3 + _PC_NAME_MAX :: 4 + _PC_PATH_MAX :: 5 + _PC_PIPE_BUF :: 6 + _PC_CHOWN_RESTRICTED :: 7 + _PC_NO_TRUNC :: 8 + _PC_VDISABLE :: 9 + _PC_SYNC_IO :: 10 + _PC_ASYNC_IO :: 11 + _PC_PRIO_IO :: 12 + _PC_FILESIZEBITS :: 14 + _PC_REC_INCR_XFER_SIZE :: 15 + _PC_REC_MAX_XFER_SIZE :: 16 + _PC_REC_MIN_XFER_SIZE :: 17 + _PC_REC_XFER_ALIGN :: 18 + _PC_ALLOC_SIZE_MIN :: 19 + _PC_SYMLINK_MAX :: 20 + _PC_2_SYMLINK :: 21 + + _SC_ARG_MAX :: 1 + _SC_CHILD_MAX :: 2 + _SC_CLK_TCK :: 3 + _SC_NGROUPS_MAX :: 4 + _SC_OPEN_MAX :: 5 + _SC_STREAM_MAX :: 6 + _SC_TZNAME_MAX :: 7 + _SC_JOB_CONTROL :: 8 + _SC_SAVED_IDS :: 9 + _SC_REALTIME_SIGNALS :: 10 + _SC_PRIORITY_SCHEDULING :: 11 + _SC_TIMERS :: 12 + _SC_ASYNCHRONOUS_IO :: 13 + _SC_PRIORITIZED_IO :: 14 + _SC_SYNCHRONIZED_IO :: 15 + _SC_FSYNC :: 16 + _SC_MAPPED_FILES :: 17 + _SC_MEMLOCK :: 18 + _SC_MEMLOCK_RANGE :: 19 + _SC_MEMORY_PROTECTION :: 20 + _SC_MESSAGE_PASSING :: 21 + _SC_SEMAPHORES :: 22 + _SC_SHARED_MEMORY_OBJECTS :: 23 + _SC_AIO_LISTIO_MAX :: 24 + _SC_AIO_MAX :: 25 + _SC_AIO_PRIO_DELTA_MAX :: 26 + _SC_DELAYTIMER_MAX :: 27 + _SC_MQ_OPEN_MAX :: 28 + _SC_MQ_PRIO_MAX :: 29 + _SC_VERSION :: 30 + _SC_PAGESIZE :: 31 + _SC_PAGE_SIZE :: _SC_PAGESIZE + _SC_RTSIG_MAX :: 32 + _SC_SEM_NSEMS_MAX :: 33 + _SC_SEM_VALUE_MAX :: 34 + _SC_SIGQUEUE_MAX :: 35 + _SC_TIMER_MAX :: 36 + _SC_BC_BASE_MAX :: 37 + _SC_BC_DIM_MAX :: 38 + _SC_BC_SCALE_MAX :: 39 + _SC_BC_STRING_MAX :: 40 + _SC_COLL_WEIGHTS_MAX :: 41 + _SC_EXPR_NEST_MAX :: 43 + _SC_LINE_MAX :: 44 + _SC_RE_DUP_MAX :: 45 + _SC_2_VERSION :: 47 + _SC_2_C_BIND :: 48 + _SC_2_C_DEV :: 49 + _SC_2_FORT_DEV :: 50 + _SC_2_FORT_RUN :: 51 + _SC_2_SW_DEV :: 52 + _SC_2_LOCALEDEF :: 53 + + _SC_IOV_MAX :: 62 + _SC_THREADS :: 69 + _SC_THREAD_SAFE_FUNCTIONS :: 70 + _SC_GETGR_R_SIZE_MAX :: 71 + _SC_GETPW_R_SIZE_MAX :: 72 + _SC_LOGIN_NAME_MAX :: 73 + _SC_TTY_NAME_MAX :: 74 + _SC_THREAD_DESTRUCTOR_ITERATIONS :: 75 + _SC_THREAD_KEYS_MAX :: 76 + _SC_THREAD_STACK_MIN :: 77 + _SC_THREAD_THREADS_MAX :: 78 + _SC_THREAD_ATTR_STACKADDR :: 79 + _SC_THREAD_ATTR_STACKSIZE :: 80 + _SC_THREAD_PRIORITY_SCHEDULING :: 81 + _SC_THREAD_PRIO_INHERIT :: 82 + _SC_THREAD_PRIO_PROTECT :: 83 + _SC_THREAD_PROCESS_SHARED :: 84 + _SC_NPROCESSORS_CONF :: 85 + _SC_NPROCESSORS_ONLN :: 86 + _SC_PHYS_PAGES :: 87 + _SC_AVPHYS_PAGES :: 88 + _SC_ATEXIT_MAX :: 89 + _SC_PASS_MAX :: 90 + _SC_XOPEN_VERSION :: 91 + _SC_XOPEN_UNIX :: 92 + _SC_XOPEN_CRYPT :: 93 + _SC_XOPEN_ENH_I18N :: 94 + _SC_XOPEN_SHM :: 95 + _SC_2_CHAR_TERM :: 96 + _SC_2_UPE :: 97 + + _SC_XOPEN_LEGACY :: 129 + _SC_XOPEN_REALTIME :: 130 + _SC_XOPEN_REALTIME_THREADS :: 131 + _SC_ADVISORY_INFO :: 132 + _SC_BARRIERS :: 133 + _SC_CLOCK_SELECTION :: 137 + _SC_CPUTIME :: 138 + _SC_THREAD_CPUTIME :: 139 + _SC_MONOTONIC_CLOCK :: 149 + _SC_READER_WRITER_LOCKS :: 153 + _SC_SPIN_LOCKS :: 154 + _SC_REGEXP :: 155 + _SC_SHELL :: 157 + _SC_SPAWN :: 159 + _SC_SPORADIC_SERVER :: 160 + _SC_THREAD_SPORADIC_SERVER :: 161 + _SC_TIMEOUTS :: 164 + _SC_TYPED_MEMORY_OBJECTS :: 165 + _SC_2_PBS :: 168 + _SC_2_PBS_ACCOUNTING :: 169 + _SC_2_PBS_MESSAGE :: 171 + _SC_2_PBS_TRACK :: 172 + _SC_SYMLOOP_MAX :: 173 + _SC_2_PBS_CHECKPOINT :: 174 + _SC_V6_ILP32_OFF32 :: 175 + _SC_V6_ILP32_OFFBIG :: 176 + _SC_V6_LP64_OFF64 :: 177 + _SC_V6_LPBIG_OFFBIG :: 178 + _SC_HOST_NAME_MAX :: 179 + _SC_TRACE :: 180 + _SC_TRACE_EVENT_FILTER :: 181 + _SC_TRACE_INHERIT :: 182 + _SC_TRACE_LOG :: 183 + + _SC_IPV6 :: 234 + _SC_RAW_SOCKETS :: 235 + _SC_V7_ILP32_OFF32 :: 236 + _SC_V7_ILP32_OFFBIG :: 237 + _SC_V7_LP64_OFF64 :: 238 + _SC_V7_LPBIG_OFFBIG :: 239 + _SC_SS_REPL_MAX :: 240 + _SC_TRACE_EVENT_NAME_MAX :: 241 + _SC_TRACE_NAME_MAX :: 242 + _SC_TRACE_SYS_MAX :: 243 + _SC_TRACE_USER_EVENT_MAX :: 244 + _SC_XOPEN_STREAMS :: 245 + _SC_THREAD_ROBUST_PRIO_INHERIT :: 246 + _SC_THREAD_ROBUST_PRIO_PROTECT :: 247 + + // NOTE: Not implemented. + _SC_XOPEN_UUCP :: 0 + // NOTE: Not implemented. + _POSIX_VDISABLE :: 0 + } else { #panic("posix is unimplemented for the current target") } From 5162c6c506be74fcd8f7e09e7bb51106e03b24a3 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 21 Sep 2024 20:56:52 -0600 Subject: [PATCH 175/320] Rename sigaction duplicate type to sigaction_t on linux, following other platforms. --- core/sys/posix/signal.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/sys/posix/signal.odin b/core/sys/posix/signal.odin index 7cb4f4c43..8edaad5ba 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -1172,7 +1172,9 @@ when ODIN_OS == .Darwin { SIGPOLL :: 29 SIGSYS :: 31 - sigaction :: struct { + // NOTE: this is actually defined as `sigaction`, but due to the function with the same name + // `_t` has been added. + sigaction_t :: struct { sa_handler: proc "c" (Signal), sa_flags: SA_Flags, sa_mask: sigset_t, From c68d847fb38d11416b09a7bae2b33167d0bf6191 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 21 Sep 2024 20:59:54 -0600 Subject: [PATCH 176/320] Satisfy the compiler. --- core/sys/posix/signal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/posix/signal.odin b/core/sys/posix/signal.odin index 8edaad5ba..6748c162f 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -1143,7 +1143,7 @@ when ODIN_OS == .Darwin { uid_t :: distinct c.uint32_t sigset_t :: struct { - [1024/(8 * size_of(c.ulong))]val + [1024/(8 * size_of(c.ulong))]val, } SIGRTMIN :: __libc_current_sigrtmin() From 04c08c2e2dbbacddae2a596a62fca5f904e3fa2c Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 21 Sep 2024 21:24:18 -0600 Subject: [PATCH 177/320] Resolve bit set differences between linux and other platforms in posix/fcntl --- core/sys/posix/fcntl.odin | 142 +++++++++++++++++++++++++++----------- 1 file changed, 101 insertions(+), 41 deletions(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index 3350238e4..499fe757b 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -95,56 +95,116 @@ Lock_Type :: enum c.short { // Assertions made to unify this bit set. #assert(O_RDONLY == 0) -O_Flag_Bits :: enum c.int { - // Sets FD_CLOEXEC on the file descriptor. - CLOEXEC = log2(O_CLOEXEC), - // If not exists, combined with DIRECTORY will cause creation of a directory, otherwise a regular file. - CREAT = log2(O_CREAT), - // Fails if the opened descriptor would not be a directory. - DIRECTORY = log2(O_DIRECTORY), - // If combined with CREAT, causes a failure if the file already exists. - EXCL = log2(O_EXCL), - // If terminal device, do not make it the controlling terminal for the process. - NOCTTY = log2(O_NOCTTY), - // Don't follow symbolic links, fail with errno ELOOP. - NOFOLLOW = log2(O_NOFOLLOW), - // If exists and regular, truncate the length to 0. - TRUNC = log2(O_TRUNC), +when ODIN_OS == .Linux { - // NOTE: use with `posix.O_TTY_INIT + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in - // this bit set enum because it is 0 on some platforms and a value on others. - // TTY_INIT = O_TTY_INIT, + O_Flag_Bits :: enum c.int { + // Sets FD_CLOEXEC on the file descriptor. + CLOEXEC = log2(O_CLOEXEC), + // If not exists, combined with DIRECTORY will cause creation of a directory, otherwise a regular file. + CREAT = log2(O_CREAT), + // Fails if the opened descriptor would not be a directory. + DIRECTORY = log2(O_DIRECTORY), + // If combined with CREAT, causes a failure if the file already exists. + EXCL = log2(O_EXCL), + // If terminal device, do not make it the controlling terminal for the process. + NOCTTY = log2(O_NOCTTY), + // Don't follow symbolic links, fail with errno ELOOP. + NOFOLLOW = log2(O_NOFOLLOW), + // If exists and regular, truncate the length to 0. + TRUNC = log2(O_TRUNC), - // Set file offset to end of file prior to each write. - APPEND = log2(O_APPEND), - // Write I/O shall complete as defined by synchronized I/O data integrity completion. - DSYNC = log2(O_DSYNC), - // Causes nonblocking behaviour in various situations. - NONBLOCK = log2(O_NONBLOCK), - // Write I/O shall complete as defined by synchronized I/O file integrity completion. - SYNC = log2(O_SYNC), + // NOTE: use with `posix.O_TTY_INIT + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + // TTY_INIT = O_TTY_INIT, - // NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in - // this bit set enum because it is 0 on some platforms and a value on others. - // RSYNC = O_RSYNC, + // Set file offset to end of file prior to each write. + APPEND = log2(O_APPEND), + // Write I/O shall complete as defined by synchronized I/O data integrity completion. + DSYNC = log2(O_DSYNC), + // Causes nonblocking behaviour in various situations. + NONBLOCK = log2(O_NONBLOCK), + // Write I/O shall complete as defined by synchronized I/O file integrity completion. + SYNC = log2(O_SYNC), - // Execute only. - // NOTE: use with `posix.O_ENTER + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in - // this bit set enum because it is 0 on some platforms and a value on others. - // EXEC = O_EXEC + // NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + // RSYNC = O_RSYNC, - // Reading and writing. - RDWR = log2(O_RDWR), - // Writing only. - WRONLY = log2(O_WRONLY), - // Reading only. - // RDONLY = 0, // Default + // Execute only. + // NOTE: use with `posix.O_ENTER + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + // EXEC = O_EXEC + + // Reading and writing. + RDWR = log2(O_RDWR), + // Writing only. + WRONLY = log2(O_WRONLY), + // Reading only. + // RDONLY = 0, // Default + } + +} else { + + O_Flag_Bits :: enum c.int { + // Sets FD_CLOEXEC on the file descriptor. + CLOEXEC = log2(O_CLOEXEC), + // If not exists, combined with DIRECTORY will cause creation of a directory, otherwise a regular file. + CREAT = log2(O_CREAT), + // Fails if the opened descriptor would not be a directory. + DIRECTORY = log2(O_DIRECTORY), + // If combined with CREAT, causes a failure if the file already exists. + EXCL = log2(O_EXCL), + // If terminal device, do not make it the controlling terminal for the process. + NOCTTY = log2(O_NOCTTY), + // Don't follow symbolic links, fail with errno ELOOP. + NOFOLLOW = log2(O_NOFOLLOW), + // If exists and regular, truncate the length to 0. + TRUNC = log2(O_TRUNC), + + // NOTE: use with `posix.O_TTY_INIT + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + // TTY_INIT = O_TTY_INIT, + + // Set file offset to end of file prior to each write. + APPEND = log2(O_APPEND), + // Write I/O shall complete as defined by synchronized I/O data integrity completion. + DSYNC = log2(O_DSYNC), + // Causes nonblocking behaviour in various situations. + NONBLOCK = log2(O_NONBLOCK), + // Write I/O shall complete as defined by synchronized I/O file integrity completion. + SYNC = log2(O_SYNC), + + // NOTE: use with `posix.O_RSYNC + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + // RSYNC = O_RSYNC, + + // Execute only. + // NOTE: use with `posix.O_ENTER + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in + // this bit set enum because it is 0 on some platforms and a value on others. + EXEC = O_EXEC, + + // Reading and writing. + RDWR = log2(O_RDWR), + // Writing only. + WRONLY = log2(O_WRONLY), + // Reading only. + // RDONLY = 0, // Default + } } O_Flags :: bit_set[O_Flag_Bits; c.int] // A mask of all the access mode bits. -// NOTE: .EXEC and .RDONLY also belong here, but they are 0 on some platforms. -O_ACCMODE :: O_Flags{ .RDWR, .WRONLY } +when ODIN_OS == .Linux { + + // NOTE: .EXEC and .RDONLY also belong here, but they are 0 on some platforms. + O_ACCMODE :: O_Flags{ .RDWR, .WRONLY } + +} else { + + // NOTE: .RDONLY also belong here, but they are 0 on some platforms. + O_ACCMODE :: O_Flags{ .EXEC, .RDWR, .WRONLY } + +} AT_Flag_Bits :: enum c.int { EACCESS = log2(AT_EACCESS), From cc60725eda4d3a9d63bf64a8d92a19526bde75f0 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 21 Sep 2024 21:28:18 -0600 Subject: [PATCH 178/320] Move bit set creation to compiler guard. Fix indentation on posix/sys_sem. --- core/sys/posix/fcntl.odin | 5 ++++- core/sys/posix/sys_sem.odin | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index 499fe757b..32c124168 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -143,6 +143,8 @@ when ODIN_OS == .Linux { // RDONLY = 0, // Default } + O_Flags :: bit_set[O_Flag_Bits; c.int] + } else { O_Flag_Bits :: enum c.int { @@ -190,8 +192,9 @@ when ODIN_OS == .Linux { // Reading only. // RDONLY = 0, // Default } + + O_Flags :: bit_set[O_Flag_Bits; c.int] } -O_Flags :: bit_set[O_Flag_Bits; c.int] // A mask of all the access mode bits. when ODIN_OS == .Linux { diff --git a/core/sys/posix/sys_sem.odin b/core/sys/posix/sys_sem.odin index 9f45ab1fe..a496ecb4a 100644 --- a/core/sys/posix/sys_sem.odin +++ b/core/sys/posix/sys_sem.odin @@ -143,12 +143,12 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS semid_ds :: struct { sem_perm: ipc_perm, // [PSX] operation permission structure sem_otime: time_t, // [PSX] last semop() - __sem_otime_high: c.ulong, + __sem_otime_high: c.ulong, sem_ctime: time_t, // [PSX] last time changed by semctl() - __sem_ctime_high: c.ulong, + __sem_ctime_high: c.ulong, sem_nsems: c.ulong, // [PSX] number of semaphores in set - __glibc_reserved3: c.ulong, - __glibc_reserved4: c.ulong, + __glibc_reserved3: c.ulong, + __glibc_reserved4: c.ulong, } sembuf :: struct { From c1a67f37e62d5f928f47eb480c33f533d3160041 Mon Sep 17 00:00:00 2001 From: Isaac Andrade Date: Sat, 21 Sep 2024 21:37:41 -0600 Subject: [PATCH 179/320] Fix O_Flag_Bits.EXEC for non Linux platforms on posix/fcntl. --- core/sys/posix/fcntl.odin | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index 32c124168..be33739e4 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -181,9 +181,7 @@ when ODIN_OS == .Linux { // RSYNC = O_RSYNC, // Execute only. - // NOTE: use with `posix.O_ENTER + { .OTHER_FLAG, .OTHER_FLAG }`, unfortunately can't be in - // this bit set enum because it is 0 on some platforms and a value on others. - EXEC = O_EXEC, + EXEC = log2(O_EXEC), // Reading and writing. RDWR = log2(O_RDWR), From a1349d877601df166a6b4bb8a1a38126802dcc9d Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Sun, 22 Sep 2024 00:08:07 -0400 Subject: [PATCH 180/320] fix vet warnings --- core/time/rfc3339.odin | 4 +++- tests/core/time/test_core_time.odin | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/time/rfc3339.odin b/core/time/rfc3339.odin index 9d816b3fa..20e8ea0bb 100644 --- a/core/time/rfc3339.odin +++ b/core/time/rfc3339.odin @@ -199,6 +199,8 @@ The boolean `ok` is false if the `time` is not a valid datetime, or if allocatin - `include_nanos`: whether to include nanoseconds in the result. */ time_to_rfc3339 :: proc(time: Time, utc_offset : int = 0, include_nanos := true, allocator := context.allocator) -> (res: string, ok: bool) { + utc_offset := utc_offset + // convert to datetime datetime := time_to_datetime(time) or_return @@ -276,7 +278,7 @@ time_to_rfc3339 :: proc(time: Time, utc_offset : int = 0, include_nanos := true, } else { temp_string[offset] = utc_offset > 0 ? '+' : '-' offset += 1 - utc_offset := abs(utc_offset) + utc_offset = abs(utc_offset) print_as_fixed_int(temp_string[:], &offset, 2, i64(utc_offset / 60)) temp_string[offset] = ':' offset += 1 diff --git a/tests/core/time/test_core_time.odin b/tests/core/time/test_core_time.odin index 23044b72f..424111aa3 100644 --- a/tests/core/time/test_core_time.odin +++ b/tests/core/time/test_core_time.odin @@ -202,7 +202,7 @@ test_print_rfc3339 :: proc(t: ^testing.T) { printed: string, time: i64, utc_offset: int, - }; + } tests :: [?]TestCase { {"1985-04-12T23:20:50.52Z", 482196050520000000, 0}, @@ -210,7 +210,7 @@ test_print_rfc3339 :: proc(t: ^testing.T) { {"1996-12-19T16:39:57-08:00", 851013597000000000, -480}, {"1996-12-20T00:39:57Z", 851042397000000000, 0}, {"1937-01-01T12:00:27.87+00:20", -1041335972130000000, +20}, - }; + } for test in tests { timestamp := time.Time { _nsec = test.time } From c39b934e7ffabe4b6fe1f044b193682b9a83eda0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 22 Sep 2024 13:04:23 +0100 Subject: [PATCH 181/320] Remove unused imports --- core/os/os_js.odin | 2 -- vendor/wasm/js/dom.odin | 2 +- vendor/wasm/js/events.odin | 3 --- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/core/os/os_js.odin b/core/os/os_js.odin index 8bf1d988b..348554728 100644 --- a/core/os/os_js.odin +++ b/core/os/os_js.odin @@ -1,8 +1,6 @@ #+build js package os -import "base:runtime" - foreign import "odin_env" @(require_results) diff --git a/vendor/wasm/js/dom.odin b/vendor/wasm/js/dom.odin index 28dd32fed..ffc58a9a3 100644 --- a/vendor/wasm/js/dom.odin +++ b/vendor/wasm/js/dom.odin @@ -90,4 +90,4 @@ window_get_scroll :: proc "contextless" () -> (x, y: f64) { scroll: [2]f64 _window_get_scroll(&scroll) return scroll.x, scroll.y -} +} \ No newline at end of file diff --git a/vendor/wasm/js/events.odin b/vendor/wasm/js/events.odin index 258776fff..5a63da8ef 100644 --- a/vendor/wasm/js/events.odin +++ b/vendor/wasm/js/events.odin @@ -336,9 +336,6 @@ remove_custom_event_listener :: proc(id: string, name: string, user_data: rawptr return _remove_event_listener(id, name, user_data, callback) } -import "core:fmt" - - @(export, link_name="odin_dom_do_event_callback") do_event_callback :: proc(user_data: rawptr, callback: proc(e: Event)) { @(default_calling_convention="contextless") From 096258b5d5978a05d151fbcc1a43b600fff0abd8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 22 Sep 2024 13:08:42 +0100 Subject: [PATCH 182/320] Rename `runtime.js` to `odin.js` --- vendor/wasm/README.md | 6 +++--- vendor/wasm/js/{runtime.js => odin.js} | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename vendor/wasm/js/{runtime.js => odin.js} (100%) diff --git a/vendor/wasm/README.md b/vendor/wasm/README.md index d0b0a2f6f..191d45860 100644 --- a/vendor/wasm/README.md +++ b/vendor/wasm/README.md @@ -6,9 +6,9 @@ The `js_wasm32` target assumes that the WASM output will be ran within a web bro ## Example for `js_wasm32` -```js - - +```html + + diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/odin.js similarity index 100% rename from vendor/wasm/js/runtime.js rename to vendor/wasm/js/odin.js From 634fa7aa306c076a7a63047b0e448e01df156919 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 22 Sep 2024 13:13:34 +0100 Subject: [PATCH 183/320] Move `vendor:wasm/js` to `core:sys/wasm/js` --- core/sys/wasm/README.md | 15 +++++++++++++++ {vendor => core/sys}/wasm/js/dom.odin | 0 {vendor => core/sys}/wasm/js/dom_all_targets.odin | 0 {vendor => core/sys}/wasm/js/events.odin | 0 .../sys}/wasm/js/events_all_targets.odin | 0 {vendor => core/sys}/wasm/js/general.odin | 0 .../sys}/wasm/js/memory_all_targets.odin | 0 {vendor => core/sys}/wasm/js/memory_js.odin | 0 {vendor => core/sys}/wasm/js/odin.js | 0 9 files changed, 15 insertions(+) create mode 100644 core/sys/wasm/README.md rename {vendor => core/sys}/wasm/js/dom.odin (100%) rename {vendor => core/sys}/wasm/js/dom_all_targets.odin (100%) rename {vendor => core/sys}/wasm/js/events.odin (100%) rename {vendor => core/sys}/wasm/js/events_all_targets.odin (100%) rename {vendor => core/sys}/wasm/js/general.odin (100%) rename {vendor => core/sys}/wasm/js/memory_all_targets.odin (100%) rename {vendor => core/sys}/wasm/js/memory_js.odin (100%) rename {vendor => core/sys}/wasm/js/odin.js (100%) diff --git a/core/sys/wasm/README.md b/core/sys/wasm/README.md new file mode 100644 index 000000000..1aaeaa429 --- /dev/null +++ b/core/sys/wasm/README.md @@ -0,0 +1,15 @@ +# WASM on the Web + +This directory is for use when targeting the `js_wasm32` target and the packages that rely on it. + +The `js_wasm32` target assumes that the WASM output will be ran within a web browser rather than a standalone VM. In the VM cases, either `wasi_wasm32` or `freestanding_wasm32` should be used accordingly. + +## Example for `js_wasm32` + +```html + + + +``` diff --git a/vendor/wasm/js/dom.odin b/core/sys/wasm/js/dom.odin similarity index 100% rename from vendor/wasm/js/dom.odin rename to core/sys/wasm/js/dom.odin diff --git a/vendor/wasm/js/dom_all_targets.odin b/core/sys/wasm/js/dom_all_targets.odin similarity index 100% rename from vendor/wasm/js/dom_all_targets.odin rename to core/sys/wasm/js/dom_all_targets.odin diff --git a/vendor/wasm/js/events.odin b/core/sys/wasm/js/events.odin similarity index 100% rename from vendor/wasm/js/events.odin rename to core/sys/wasm/js/events.odin diff --git a/vendor/wasm/js/events_all_targets.odin b/core/sys/wasm/js/events_all_targets.odin similarity index 100% rename from vendor/wasm/js/events_all_targets.odin rename to core/sys/wasm/js/events_all_targets.odin diff --git a/vendor/wasm/js/general.odin b/core/sys/wasm/js/general.odin similarity index 100% rename from vendor/wasm/js/general.odin rename to core/sys/wasm/js/general.odin diff --git a/vendor/wasm/js/memory_all_targets.odin b/core/sys/wasm/js/memory_all_targets.odin similarity index 100% rename from vendor/wasm/js/memory_all_targets.odin rename to core/sys/wasm/js/memory_all_targets.odin diff --git a/vendor/wasm/js/memory_js.odin b/core/sys/wasm/js/memory_js.odin similarity index 100% rename from vendor/wasm/js/memory_js.odin rename to core/sys/wasm/js/memory_js.odin diff --git a/vendor/wasm/js/odin.js b/core/sys/wasm/js/odin.js similarity index 100% rename from vendor/wasm/js/odin.js rename to core/sys/wasm/js/odin.js From 26d00925ccd24b81bfe578be316c1ff2fd8faac9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 22 Sep 2024 13:20:45 +0100 Subject: [PATCH 184/320] Clean-up `libc` usage --- core/c/libc/errno.odin | 8 ++++++++ core/c/libc/stdio.odin | 2 +- core/c/libc/string.odin | 1 + core/c/libc/time.odin | 2 +- vendor/stb/image/stb_image.odin | 3 +-- vendor/stb/image/stb_image_resize.odin | 2 +- vendor/stb/image/stb_image_write.odin | 2 +- vendor/wasm/README.md | 2 +- 8 files changed, 15 insertions(+), 7 deletions(-) diff --git a/core/c/libc/errno.odin b/core/c/libc/errno.odin index 843b2f1b6..de429a6ec 100644 --- a/core/c/libc/errno.odin +++ b/core/c/libc/errno.odin @@ -98,6 +98,14 @@ when ODIN_OS == .Haiku { ERANGE :: B_POSIX_ERROR_BASE + 17 } +when ODIN_OS == .JS { + _ :: libc + _get_errno :: proc "c" () -> ^int { + @(static) errno: int + return &errno + } +} + // Odin has no way to make an identifier "errno" behave as a function call to // read the value, or to produce an lvalue such that you can assign a different // error value to errno. To work around this, just expose it as a function like diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin index 019389b0d..f02453bba 100644 --- a/core/c/libc/stdio.odin +++ b/core/c/libc/stdio.odin @@ -59,7 +59,7 @@ when ODIN_OS == .Windows { } // GLIBC and MUSL compatible. -when ODIN_OS == .Linux { +when ODIN_OS == .Linux || ODIN_OS == .JS { fpos_t :: struct #raw_union { _: [16]char, _: longlong, _: double, } _IOFBF :: 0 diff --git a/core/c/libc/string.odin b/core/c/libc/string.odin index cde9c7e6b..4ec4f3a7a 100644 --- a/core/c/libc/string.odin +++ b/core/c/libc/string.odin @@ -12,6 +12,7 @@ when ODIN_OS == .Windows { foreign import libc "system:c" } +@(default_calling_convention="c") foreign libc { // 7.24.2 Copying functions memcpy :: proc(s1, s2: rawptr, n: size_t) -> rawptr --- diff --git a/core/c/libc/time.odin b/core/c/libc/time.odin index 48def707e..6828793ec 100644 --- a/core/c/libc/time.odin +++ b/core/c/libc/time.odin @@ -45,7 +45,7 @@ when ODIN_OS == .Windows { } } -when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku { +when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku || ODIN_OS == .JS { @(default_calling_convention="c") foreign libc { // 7.27.2 Time manipulation functions diff --git a/vendor/stb/image/stb_image.odin b/vendor/stb/image/stb_image.odin index 85d612354..0151899d9 100644 --- a/vendor/stb/image/stb_image.odin +++ b/vendor/stb/image/stb_image.odin @@ -1,6 +1,6 @@ package stb_image -import c "core:c/libc" +import "core:c" @(private) LIB :: ( @@ -20,7 +20,6 @@ when LIB != "" { when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { foreign import stbi "../lib/stb_image_wasm.o" - foreign import stbi { LIB } } else when LIB != "" { foreign import stbi { LIB } } else { diff --git a/vendor/stb/image/stb_image_resize.odin b/vendor/stb/image/stb_image_resize.odin index a37c2e243..241a93eb0 100644 --- a/vendor/stb/image/stb_image_resize.odin +++ b/vendor/stb/image/stb_image_resize.odin @@ -1,6 +1,6 @@ package stb_image -import c "core:c/libc" +import "core:c" @(private) RESIZE_LIB :: ( diff --git a/vendor/stb/image/stb_image_write.odin b/vendor/stb/image/stb_image_write.odin index a0c0b57a0..e86fa2b95 100644 --- a/vendor/stb/image/stb_image_write.odin +++ b/vendor/stb/image/stb_image_write.odin @@ -1,6 +1,6 @@ package stb_image -import c "core:c/libc" +import "core:c" @(private) WRITE_LIB :: ( diff --git a/vendor/wasm/README.md b/vendor/wasm/README.md index 191d45860..1aaeaa429 100644 --- a/vendor/wasm/README.md +++ b/vendor/wasm/README.md @@ -7,7 +7,7 @@ The `js_wasm32` target assumes that the WASM output will be ran within a web bro ## Example for `js_wasm32` ```html - + + +

    !(7rD%?T#SYKFRuU&tMqpi9T4Xd#dKybI`E9 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 y}y&>ctf1MZ}WQ%+xs)F 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 z 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