From 29ca6ee420f36381ee0fba6bd409dc51716ab206 Mon Sep 17 00:00:00 2001 From: CiD- Date: Fri, 17 Dec 2021 10:41:49 -0500 Subject: [PATCH 001/117] add zeroing to new region from realloc --- core/os/os.odin | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/core/os/os.odin b/core/os/os.odin index 83158be80..9230bc22c 100644 --- a/core/os/os.odin +++ b/core/os/os.odin @@ -206,11 +206,20 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, } } - aligned_resize :: proc(p: rawptr, old_size: int, new_size: int, new_alignment: int) -> ([]byte, mem.Allocator_Error) { + aligned_resize :: proc(p: rawptr, old_size: int, new_size: int, new_alignment: int) -> (new_memory: []byte, err: mem.Allocator_Error) { if p == nil { return nil, nil } - return aligned_alloc(new_size, new_alignment, p) + + new_memory = aligned_alloc(new_size, new_alignment, p) or_return + when ODIN_OS != "windows" { + // NOTE: realloc does not zero the new memory, so we do it + if new_size > old_size { + new_region := mem.raw_data(new_memory[old_size:]) + mem.zero(new_region, new_size - old_size) + } + } + return } switch mode { From ebdb3ab43a8cdc49cb715ecb6f5fd38522912aa5 Mon Sep 17 00:00:00 2001 From: CiD- Date: Fri, 17 Dec 2021 12:04:05 -0500 Subject: [PATCH 002/117] added notes about _unix_alloc --- core/os/os_darwin.odin | 2 ++ core/os/os_freebsd.odin | 2 ++ core/os/os_linux.odin | 2 ++ 3 files changed, 6 insertions(+) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index d40c80aeb..6fa43bf09 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -530,6 +530,8 @@ heap_alloc :: proc(size: int) -> rawptr { return _unix_calloc(1, size) } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. return _unix_realloc(ptr, new_size) } heap_free :: proc(ptr: rawptr) { diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index e9314b468..82317532d 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -378,6 +378,8 @@ heap_alloc :: proc(size: int) -> rawptr { } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. return _unix_realloc(ptr, c.size_t(new_size)); } diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 260a051ce..116fbdba5 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -543,6 +543,8 @@ heap_alloc :: proc(size: int) -> rawptr { } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. return _unix_realloc(ptr, c.size_t(new_size)) } From e5868e32050fc2fe92a50caa743c8123d3fe59d9 Mon Sep 17 00:00:00 2001 From: CiD- Date: Thu, 20 Jan 2022 10:17:47 -0500 Subject: [PATCH 003/117] add zeroing regardless of ODIN_OS --- core/os/os.odin | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/os/os.odin b/core/os/os.odin index 9230bc22c..2ebfebd2e 100644 --- a/core/os/os.odin +++ b/core/os/os.odin @@ -212,12 +212,11 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, } new_memory = aligned_alloc(new_size, new_alignment, p) or_return - when ODIN_OS != "windows" { - // NOTE: realloc does not zero the new memory, so we do it - if new_size > old_size { - new_region := mem.raw_data(new_memory[old_size:]) - mem.zero(new_region, new_size - old_size) - } + + // NOTE: heap_resize does not zero the new memory, so we do it + if new_size > old_size { + new_region := mem.raw_data(new_memory[old_size:]) + mem.zero(new_region, new_size - old_size) } return } From 0e0638362015665411d1454a1a7292de9fe97fed Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 22 Jan 2022 17:34:43 +0100 Subject: [PATCH 004/117] Changed make file so that it allows for multiple LLVM versions instead of a single one on Darwin --- Makefile | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index a7aecbb2d..6acecccc4 100644 --- a/Makefile +++ b/Makefile @@ -11,19 +11,23 @@ ifeq ($(OS), Darwin) ARCH=$(shell uname -m) LLVM_CONFIG=llvm-config - # LLVM Version Setting - LLVM_VERSION_PATTERN="^11\." - LLVM_VERSION="11" ifeq ($(ARCH), arm64) - LLVM_VERSION="13" - LLVM_VERSION_PATTERN="^13" - endif - - ifneq ($(shell llvm-config --version | grep $(LLVM_VERSION_PATTERN)),) - LLVM_CONFIG=llvm-config + ifneq ($(shell llvm-config --version | grep "^13\."),) + LLVM_CONFIG=llvm-config + else + $(error "Requirement: llvm-config must be version llvm 13 for arm64") + endif else - $(error "Requirement: llvm-config must be version $(LLVM_VERSION)") - endif + ifneq ($(shell llvm-config --version | grep "^11\."),) + LLVM_CONFIG=llvm-config + else ifneq ($(shell llvm-config --version | grep "^12\."),) + LLVM_CONFIG=llvm-config + else ifneq ($(shell llvm-config --version | grep "^13\."),) + LLVM_CONFIG=llvm-config + else + $(error "Requirement: llvm-config must be version llvm 11 or 12 or 13 for amd64/x86") + endif + endif LDFLAGS:=$(LDFLAGS) -liconv CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) From fe6539fad9e83f20d2e45b377e57353dfb6b3a96 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 22 Jan 2022 17:03:55 +0000 Subject: [PATCH 005/117] Add more to examples/all/all_vendor.odin --- examples/all/all_vendor.odin | 45 ++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 777c184f9..f94e092af 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -1,26 +1,47 @@ //+build windows package all -import glfw "vendor:glfw" -import gl "vendor:OpenGL" -import rl "vendor:raylib" -import PM "vendor:portmidi" + +import botan "vendor:botan" +import ENet "vendor:ENet" +import gl "vendor:OpenGL" +import glfw "vendor:glfw" +import microui "vendor:microui" +import miniaudio "vendor:miniaudio" +import PM "vendor:portmidi" +import rl "vendor:raylib" + import SDL "vendor:sdl2" -import IMG "vendor:sdl2/image" import SDLNet "vendor:sdl2/net" +import IMG "vendor:sdl2/image" import MIX "vendor:sdl2/mixer" import TTF "vendor:sdl2/ttf" -import vk "vendor:vulkan" -import ENet "vendor:ENet" -_ :: glfw +import stb_easy_font "vendor:stb/easy_font" +import stbi "vendor:stb/image" +import stbrp "vendor:stb/rect_pack" +import stbtt "vendor:stb/truetype" +import stb_vorbis "vendor:stb/vorbis" + +import vk "vendor:vulkan" + + +_ :: botan +_ :: ENet _ :: gl -_ :: rl +_ :: glfw +_ :: microui +_ :: miniaudio _ :: PM +_ :: rl _ :: SDL -_ :: IMG _ :: SDLNet +_ :: IMG _ :: MIX _ :: TTF -_ :: vk -_ :: ENet \ No newline at end of file +_ :: stb_easy_font +_ :: stbi +_ :: stbrp +_ :: stbtt +_ :: stb_vorbis +_ :: vk \ No newline at end of file From fdcb9deaffed29f8b528cb4a8bf30693a7894b2c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 22 Jan 2022 17:07:24 +0000 Subject: [PATCH 006/117] Generate core and vendor library collection; add package sidebar for the entire collection --- tools/odin-html-docs/odin_html_docs_main.odin | 262 +++++++++++++----- tools/odin-html-docs/style.css | 27 +- 2 files changed, 221 insertions(+), 68 deletions(-) diff --git a/tools/odin-html-docs/odin_html_docs_main.odin b/tools/odin-html-docs/odin_html_docs_main.odin index 7f2e7b59f..e5d46547a 100644 --- a/tools/odin-html-docs/odin_html_docs_main.odin +++ b/tools/odin-html-docs/odin_html_docs_main.odin @@ -8,10 +8,13 @@ import "core:strings" import "core:path/slashpath" import "core:sort" import "core:slice" +import "core:time" GITHUB_LICENSE_URL :: "https://github.com/odin-lang/Odin/tree/master/LICENSE" GITHUB_CORE_URL :: "https://github.com/odin-lang/Odin/tree/master/core" +GITHUB_VENDOR_URL :: "https://github.com/odin-lang/Odin/tree/master/vendor" BASE_CORE_URL :: "/core" +BASE_VENDOR_URL :: "/vendor" header: ^doc.Header files: []doc.File @@ -19,8 +22,18 @@ pkgs: []doc.Pkg entities: []doc.Entity types: []doc.Type -pkgs_to_use: map[string]^doc.Pkg // trimmed path +core_pkgs_to_use: map[string]^doc.Pkg // trimmed path +vendor_pkgs_to_use: map[string]^doc.Pkg // trimmed path pkg_to_path: map[^doc.Pkg]string // trimmed path +pkg_to_collection: map[^doc.Pkg]^Collection + +Collection :: struct { + name: string, + pkgs_to_use: ^map[string]^doc.Pkg, + github_url: string, + base_url: string, + root: ^Dir_Node, +} array :: proc(a: $A/doc.Array($T)) -> []T { return doc.from_array(header, a) @@ -175,6 +188,21 @@ main :: proc() { entities = array(header.entities) types = array(header.types) + core_collection := &Collection{ + "Core", + &core_pkgs_to_use, + GITHUB_CORE_URL, + BASE_CORE_URL, + nil, + } + vendor_collection := &Collection{ + "Vendor", + &vendor_pkgs_to_use, + GITHUB_VENDOR_URL, + BASE_VENDOR_URL, + nil, + } + { fullpaths: [dynamic]string defer delete(fullpaths) @@ -184,25 +212,38 @@ main :: proc() { } path_prefix := common_prefix(fullpaths[:]) - pkgs_to_use = make(map[string]^doc.Pkg) + core_pkgs_to_use = make(map[string]^doc.Pkg) + vendor_pkgs_to_use = make(map[string]^doc.Pkg) fullpath_loop: for fullpath, i in fullpaths { path := strings.trim_prefix(fullpath, path_prefix) - if !strings.has_prefix(path, "core/") { - continue fullpath_loop - } pkg := &pkgs[i+1] if len(array(pkg.entities)) == 0 { continue fullpath_loop } - trimmed_path := strings.trim_prefix(path, "core/") - if strings.has_prefix(trimmed_path, "sys") { - continue fullpath_loop - } - pkgs_to_use[trimmed_path] = pkg + switch { + case strings.has_prefix(path, "core/"): + trimmed_path := strings.trim_prefix(path, "core/") + if strings.has_prefix(trimmed_path, "sys") { + continue fullpath_loop + } + + core_pkgs_to_use[trimmed_path] = pkg + case strings.has_prefix(path, "vendor/"): + trimmed_path := strings.trim_prefix(path, "vendor/") + if strings.contains(trimmed_path, "/bindings") { + continue fullpath_loop + } + vendor_pkgs_to_use[trimmed_path] = pkg + } } - for path, pkg in pkgs_to_use { + for path, pkg in core_pkgs_to_use { pkg_to_path[pkg] = path + pkg_to_collection[pkg] = core_collection + } + for path, pkg in vendor_pkgs_to_use { + pkg_to_path[pkg] = path + pkg_to_collection[pkg] = vendor_collection } } @@ -218,42 +259,53 @@ main :: proc() { os.write_entire_file("index.html", b.buf[:]) } + core_collection.root = generate_directory_tree(core_pkgs_to_use) + vendor_collection.root = generate_directory_tree(vendor_pkgs_to_use) + + generate_packages(&b, core_collection, "core") + generate_packages(&b, vendor_collection, "vendor") +} + +generate_packages :: proc(b: ^strings.Builder, collection: ^Collection, dir: string) { + w := strings.to_writer(b) + { - strings.reset_builder(&b) - write_html_header(w, "core library - pkg.odin-lang.org") - write_core_directory(w) + strings.reset_builder(b) + write_html_header(w, fmt.tprintf("%s library - pkg.odin-lang.org", dir)) + write_collection_directory(w, collection) write_html_footer(w, true) - os.make_directory("core", 0) - os.write_entire_file("core/index.html", b.buf[:]) + os.make_directory(dir, 0) + os.write_entire_file(fmt.tprintf("%s/index.html", dir), b.buf[:]) } - for path, pkg in pkgs_to_use { - strings.reset_builder(&b) + for path, pkg in collection.pkgs_to_use { + strings.reset_builder(b) write_html_header(w, fmt.tprintf("package %s - pkg.odin-lang.org", path)) - write_pkg(w, path, pkg) + write_pkg(w, path, pkg, collection) write_html_footer(w, false) - recursive_make_directory(path, "core") - os.write_entire_file(fmt.tprintf("core/%s/index.html", path), b.buf[:]) + recursive_make_directory(path, dir) + os.write_entire_file(fmt.tprintf("%s/%s/index.html", dir, path), b.buf[:]) } } + +write_home_sidebar :: proc(w: io.Writer) { + fmt.wprintln(w, ``) + fmt.wprintln(w, `
`) + defer fmt.wprintln(w, `
`) + + fmt.wprintln(w, ``) +} + write_home_page :: proc(w: io.Writer) { fmt.wprintln(w, `
`) defer fmt.wprintln(w, `
`) - { - fmt.wprintln(w, ``) - fmt.wprintln(w, `
`) - defer fmt.wprintln(w, `
`) - - fmt.wprintln(w, ``) - - } - + write_home_sidebar(w) fmt.wprintln(w, `
`) defer fmt.wprintln(w, `
`) @@ -270,9 +322,8 @@ write_home_page :: proc(w: io.Writer) { fmt.wprintln(w, ``) fmt.wprintln(w, `
`) - fmt.wprintln(w, `

Vendor Library Collection

`) + fmt.wprintln(w, `

Vendor Library Collection

`) fmt.wprintln(w, `

Documentation for all the packages part of the vendor library collection.

`) - fmt.wprintln(w, `

Coming Soon.

`) fmt.wprintln(w, `
`) @@ -289,7 +340,7 @@ Dir_Node :: struct { children: [dynamic]^Dir_Node, } -generate_directory_tree :: proc() -> (root: ^Dir_Node) { +generate_directory_tree :: proc(pkgs_to_use: map[string]^doc.Pkg) -> (root: ^Dir_Node) { sort_tree :: proc(node: ^Dir_Node) { slice.sort_by_key(node.children[:], proc(node: ^Dir_Node) -> string {return node.name}) for child in node.children { @@ -342,25 +393,46 @@ generate_directory_tree :: proc() -> (root: ^Dir_Node) { return } -write_core_directory :: proc(w: io.Writer) { - root := generate_directory_tree() +write_collection_directory :: proc(w: io.Writer, collection: ^Collection) { + get_line_doc :: proc(pkg: ^doc.Pkg) -> (line_doc: string, ok: bool) { + if pkg == nil { + return + } + line_doc, _, _ = strings.partition(str(pkg.docs), "\n") + line_doc = strings.trim_space(line_doc) + if line_doc == "" { + return + } + switch { + case strings.has_prefix(line_doc, "*"): + return "", false + case strings.has_prefix(line_doc, "Copyright"): + return "", false + } + return line_doc, true + } + fmt.wprintln(w, `
`) defer fmt.wprintln(w, `
`) + + + write_home_sidebar(w) + + fmt.wprintln(w, `
`) + defer fmt.wprintln(w, `
`) { - fmt.wprintln(w, `
`) + fmt.wprintln(w, `
`) fmt.wprintln(w, `
`) - fmt.wprintln(w, "

Core Library Collection

") + fmt.wprintf(w, "

%s Library Collection

\n", collection.name) fmt.wprintln(w, "
    ") fmt.wprintf(w, "
  • License: BSD-3-Clause
  • \n", GITHUB_LICENSE_URL) - fmt.wprintf(w, "
  • Repository: {0:s}
  • \n", GITHUB_CORE_URL) + fmt.wprintf(w, "
  • Repository: {0:s}
  • \n", collection.github_url) fmt.wprintln(w, "
") fmt.wprintln(w, "
") fmt.wprintln(w, "
") fmt.wprintln(w, `
`) } - fmt.wprintln(w, `
`) - defer fmt.wprintln(w, `
`) fmt.wprintln(w, "
") fmt.wprintln(w, `

Directories

`) @@ -370,7 +442,7 @@ write_core_directory :: proc(w: io.Writer) { fmt.wprintln(w, "\t") fmt.wprintln(w, "\t\t") - for dir in root.children { + for dir in collection.root.children { if len(dir.children) != 0 { fmt.wprint(w, `%s`, BASE_CORE_URL, dir.path, dir.name) + fmt.wprintf(w, `%s`, collection.base_url, dir.path, dir.name) } else { fmt.wprintf(w, "%s", dir.name) } io.write_string(w, ``) io.write_string(w, ``) fmt.wprintf(w, "\n") @@ -405,14 +475,16 @@ write_core_directory :: proc(w: io.Writer) { for child in dir.children { assert(child.pkg != nil) fmt.wprintf(w, ``) line_doc, _, _ := strings.partition(str(child.pkg.docs), "\n") line_doc = strings.trim_space(line_doc) io.write_string(w, ``) @@ -606,6 +678,7 @@ write_type :: proc(using writer: ^Type_Writer, type: doc.Type, flags: Write_Type e := entities[type_entities[0]] name := str(type.name) tn_pkg := files[e.pos.file].pkg + collection: Collection // TODO determine this from package if tn_pkg != pkg { fmt.wprintf(w, `%s.`, str(pkgs[tn_pkg].name)) @@ -613,10 +686,10 @@ write_type :: proc(using writer: ^Type_Writer, type: doc.Type, flags: Write_Type if .Private in e.flags { io.write_string(w, name) } else if n := strings.contains_rune(name, '('); n >= 0 { - fmt.wprintf(w, `{1:s}`, pkg_to_path[&pkgs[tn_pkg]], name[:n], BASE_CORE_URL) + fmt.wprintf(w, `{1:s}`, pkg_to_path[&pkgs[tn_pkg]], name[:n], collection.base_url) io.write_string(w, name[n:]) } else { - fmt.wprintf(w, `{1:s}`, pkg_to_path[&pkgs[tn_pkg]], name, BASE_CORE_URL) + fmt.wprintf(w, `{1:s}`, pkg_to_path[&pkgs[tn_pkg]], name, collection.base_url) } case .Generic: name := str(type.name) @@ -870,6 +943,10 @@ write_doc_line :: proc(w: io.Writer, text: string) { } } +write_doc_sidebar :: proc(w: io.Writer) { + +} + write_docs :: proc(w: io.Writer, pkg: ^doc.Pkg, docs: string) { if docs == "" { return @@ -1002,13 +1079,55 @@ write_docs :: proc(w: io.Writer, pkg: ^doc.Pkg, docs: string) { } } -write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg) { +write_pkg_sidebar :: proc(w: io.Writer, curr_pkg: ^doc.Pkg, collection: ^Collection) { + + fmt.wprintln(w, ``) + fmt.wprintln(w, `
`) + defer fmt.wprintln(w, `
`) + + fmt.wprintf(w, "

%s Library

\n", collection.name) + + fmt.wprintln(w, `
    `) + defer fmt.wprintln(w, `
`) + + for dir in collection.root.children { + fmt.wprint(w, ``) + if dir.pkg == curr_pkg { + fmt.wprintf(w, `%s`, collection.base_url, dir.path, dir.name) + } else if dir.pkg != nil { + fmt.wprintf(w, `%s`, collection.base_url, dir.path, dir.name) + } else { + fmt.wprintf(w, "%s", dir.name) + } + if len(dir.children) != 0 { + fmt.wprintln(w, "
    ") + defer fmt.wprintln(w, "
\n") + for child in dir.children { + fmt.wprint(w, `
  • `) + defer fmt.wprintln(w, `
  • `) + if child.pkg == curr_pkg { + fmt.wprintf(w, `%s`, collection.base_url, child.path, child.name) + } else if child.pkg != nil { + fmt.wprintf(w, `%s`, collection.base_url, child.path, child.name) + } else { + fmt.wprintf(w, "%s", child.name) + } + } + } + } +} + +write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg, collection: ^Collection) { fmt.wprintln(w, `
    `) defer fmt.wprintln(w, `
    `) - fmt.wprintln(w, `
    `) + write_pkg_sidebar(w, pkg, collection) - { // breadcrumbs + fmt.wprintln(w, `
    `) + + if false { // breadcrumbs fmt.wprintln(w, `
    `) defer fmt.wprintln(w, `
    `) @@ -1017,7 +1136,7 @@ write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg) { io.write_string(w, "
      \n") defer io.write_string(w, "
    \n") - fmt.wprintf(w, ``, BASE_CORE_URL) + fmt.wprintf(w, ``, collection.base_url) dirs := strings.split(path, "/") for dir, i in dirs { @@ -1032,8 +1151,8 @@ write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg) { io.write_string(w, `
  • %s
  • `, GITHUB_CORE_URL, path, filename, filename) + fmt.wprintf(w, `
  • %s
  • `, collection.github_url, path, filename, filename) fmt.wprintln(w) } if any_hidden { @@ -1313,6 +1436,13 @@ write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg) { } fmt.wprintln(w, "") + { + fmt.wprintln(w, `

    Generation Information

    `) + now := time.now() + fmt.wprintf(w, "

    Generated with odin version %s (vendor %q) %s_%s @ %v

    \n", ODIN_VERSION, ODIN_VENDOR, ODIN_OS, ODIN_ARCH, now) + } + + fmt.wprintln(w, `
    `) { @@ -1320,7 +1450,7 @@ write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg) { fmt.wprintf(w, `
  • %s`, id, text) } - fmt.wprintln(w, `
  • `) - if dir.pkg != nil { - line_doc, _, _ := strings.partition(str(dir.pkg.docs), "\n") - line_doc = strings.trim_space(line_doc) - if line_doc != "" { - write_doc_line(w, line_doc) - } + if line_doc, ok := get_line_doc(dir.pkg); ok { + write_doc_line(w, line_doc) + } else { + io.write_string(w, ` `) } io.write_string(w, `
    `, str(child.pkg.name)) - fmt.wprintf(w, `%s`, BASE_CORE_URL, child.path, child.name) + fmt.wprintf(w, `%s`, collection.base_url, child.path, child.name) io.write_string(w, ``) - if line_doc != "" { + if line_doc, ok := get_line_doc(dir.pkg); ok { write_doc_line(w, line_doc) + } else { + io.write_string(w, ` `) } io.write_string(w, ``) - if line_doc, ok := get_line_doc(dir.pkg); ok { + if line_doc, ok := get_line_doc(child.pkg); ok { write_doc_line(w, line_doc) } else { io.write_string(w, ` `) From 8516e2e7e35ee68e7dab9b03f54be7e906bdb251 Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 22 Jan 2022 20:50:05 +0100 Subject: [PATCH 013/117] Changed match to be arbitrary width (cant do exact match as we never know how much subversion's llvm does) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 86762af6c..d3d3c6a2d 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ ifeq ($(OS), Darwin) LLVM_VERSION_PATTERN_SEPERATOR = )|( LLVM_VERSION_PATTERNS_ESCAPED_DOT = $(subst .,\.,$(LLVM_VERSIONS)) - LLVM_VERSION_PATTERNS_REPLACE_PERCENT = $(subst %,.,$(LLVM_VERSION_PATTERNS_ESCAPED_DOT)) + LLVM_VERSION_PATTERNS_REPLACE_PERCENT = $(subst %,.*,$(LLVM_VERSION_PATTERNS_ESCAPED_DOT)) LLVM_VERSION_PATTERN_REMOVE_ELEMENTS = $(subst " ",$(LLVM_VERSION_PATTERN_SEPERATOR),$(LLVM_VERSION_PATTERNS_REPLACE_PERCENT)) LLMV_VERSION_PATTERN_REMOVE_SINGLE_STR = $(subst ",,$(LLVM_VERSION_PATTERN_REMOVE_ELEMENTS)) LLVM_VERSION_PATTERN = "^(($(LLMV_VERSION_PATTERN_REMOVE_SINGLE_STR)))" From a5e16937748afea8682dfd4cf8089d8a34f71fc4 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sun, 23 Jan 2022 03:12:59 -0500 Subject: [PATCH 014/117] Fix fread definition --- core/c/libc/stdio.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin index 4a39c22e9..c5c936d16 100644 --- a/core/c/libc/stdio.odin +++ b/core/c/libc/stdio.odin @@ -149,7 +149,7 @@ foreign libc { putchar :: proc() -> int --- puts :: proc(s: cstring) -> int --- ungetc :: proc(c: int, stream: ^FILE) -> int --- - fread :: proc(ptr: rawptr, size: size_t, stream: ^FILE) -> size_t --- + fread :: proc(ptr: rawptr, size: size_t, nmemb: size_t, stream: ^FILE) -> size_t --- fwrite :: proc(ptr: rawptr, size: size_t, nmemb: size_t, stream: ^FILE) -> size_t --- // 7.21.9 File positioning functions From 0711d4e5fec13a2bf364604eed91f59a3b1f37d1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 23 Jan 2022 09:53:50 +0000 Subject: [PATCH 015/117] Correct bit_set printing --- tools/odin-html-docs/odin_html_docs_main.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/odin-html-docs/odin_html_docs_main.odin b/tools/odin-html-docs/odin_html_docs_main.odin index ec5103363..cc7f35008 100644 --- a/tools/odin-html-docs/odin_html_docs_main.odin +++ b/tools/odin-html-docs/odin_html_docs_main.odin @@ -886,6 +886,7 @@ write_type :: proc(using writer: ^Type_Writer, type: doc.Type, flags: Write_Type write_type(writer, types[type_types[0]], flags) } if .Underlying_Type in type_flags { + io.write_string(w, "; ") write_type(writer, types[type_types[1]], flags) } io.write_string(w, "]") From 56b4e0a3c393dd0d820b4d82467c33e0e72298a6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 23 Jan 2022 15:40:46 +0000 Subject: [PATCH 016/117] Fix #1267 --- src/check_expr.cpp | 3 ++- src/checker.cpp | 24 ++++++++++++++++++------ src/error.cpp | 1 + src/llvm_backend_type.cpp | 11 +++++------ src/ptr_set.cpp | 9 +++++++++ 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 8667d8734..99d351753 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6085,7 +6085,8 @@ CallArgumentError check_polymorphic_record_type(CheckerContext *c, Operand *oper } // NOTE(bill): Add type info the parameters - add_type_info_type(c, o->type); + // TODO(bill, 2022-01-23): why was this line added in the first place? I'm commenting it out for the time being + // add_type_info_type(c, o->type); } { diff --git a/src/checker.cpp b/src/checker.cpp index 63a697072..55a3892e5 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -688,12 +688,17 @@ void add_dependency(CheckerInfo *info, DeclInfo *d, Entity *e) { ptr_set_add(&d->deps, e); mutex_unlock(&info->deps_mutex); } -void add_type_info_dependency(DeclInfo *d, Type *type) { +void add_type_info_dependency(CheckerInfo *info, DeclInfo *d, Type *type, bool require_mutex) { if (d == nullptr) { return; } - // NOTE(bill): no mutex is required here because the only procedure calling it is wrapped in a mutex already + if (require_mutex) { + mutex_lock(&info->deps_mutex); + } ptr_set_add(&d->type_info_deps, type); + if (require_mutex) { + mutex_unlock(&info->deps_mutex); + } } AstPackage *get_core_package(CheckerInfo *info, String name) { @@ -1589,7 +1594,7 @@ void add_type_info_type_internal(CheckerContext *c, Type *t) { return; } - add_type_info_dependency(c->decl, t); + add_type_info_dependency(c->info, c->decl, t, false); auto found = map_get(&c->info->type_info_map, t); if (found != nullptr) { @@ -1613,6 +1618,9 @@ void add_type_info_type_internal(CheckerContext *c, Type *t) { // NOTE(bill): map entries grow linearly and in order ti_index = c->info->type_info_types.count; array_add(&c->info->type_info_types, t); + if (t->kind == Type_Named && t->Named.name == "A") { + gb_printf_err("HERE!\n"); + } } map_set(&c->checker->info.type_info_map, t, ti_index); @@ -1718,6 +1726,7 @@ void add_type_info_type_internal(CheckerContext *c, Type *t) { } else { add_type_info_type_internal(c, t_type_info_ptr); } + add_type_info_type_internal(c, bt->Union.polymorphic_params); for_array(i, bt->Union.variants) { add_type_info_type_internal(c, bt->Union.variants[i]); } @@ -1741,6 +1750,7 @@ void add_type_info_type_internal(CheckerContext *c, Type *t) { } } } + add_type_info_type_internal(c, bt->Struct.polymorphic_params); for_array(i, bt->Struct.fields) { Entity *f = bt->Struct.fields[i]; add_type_info_type_internal(c, f->type); @@ -1934,6 +1944,7 @@ void add_min_dep_type_info(Checker *c, Type *t) { } else { add_min_dep_type_info(c, t_type_info_ptr); } + add_min_dep_type_info(c, bt->Union.polymorphic_params); for_array(i, bt->Union.variants) { add_min_dep_type_info(c, bt->Union.variants[i]); } @@ -1957,6 +1968,7 @@ void add_min_dep_type_info(Checker *c, Type *t) { } } } + add_min_dep_type_info(c, bt->Struct.polymorphic_params); for_array(i, bt->Struct.fields) { Entity *f = bt->Struct.fields[i]; add_min_dep_type_info(c, f->type); @@ -5473,9 +5485,6 @@ void check_parsed_files(Checker *c) { TIME_SECTION("calculate global init order"); calculate_global_init_order(c); - TIME_SECTION("generate minimum dependency set"); - generate_minimum_dependency_set(c, c->info.entry_point); - TIME_SECTION("check test procedures"); check_test_procedures(c); @@ -5486,6 +5495,9 @@ void check_parsed_files(Checker *c) { add_type_info_for_type_definitions(c); check_merge_queues_into_arrays(c); + TIME_SECTION("generate minimum dependency set"); + generate_minimum_dependency_set(c, c->info.entry_point); + TIME_SECTION("check entry point"); if (build_context.build_mode == BuildMode_Executable && !build_context.no_entry_point && build_context.command_kind != Command_test) { Scope *s = c->info.init_scope; diff --git a/src/error.cpp b/src/error.cpp index 1496b4775..b08ff99df 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -403,6 +403,7 @@ void compiler_error(char const *fmt, ...) { gb_printf_err("Internal Compiler Error: %s\n", gb_bprintf_va(fmt, va)); va_end(va); + GB_DEBUG_TRAP(); gb_exit(1); } diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index decb57702..e1332c6f3 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -1,11 +1,10 @@ isize lb_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found=true) { - isize index = type_info_index(info, type, false); + auto *set = &info->minimum_dependency_type_info_set; + isize index = type_info_index(info, type, err_on_not_found); if (index >= 0) { - auto *set = &info->minimum_dependency_type_info_set; - for_array(i, set->entries) { - if (set->entries[i].ptr == index) { - return i+1; - } + isize i = ptr_entry_index(set, index); + if (i >= 0) { + return i+1; } } if (err_on_not_found) { diff --git a/src/ptr_set.cpp b/src/ptr_set.cpp index ca7df3b53..b45997916 100644 --- a/src/ptr_set.cpp +++ b/src/ptr_set.cpp @@ -138,6 +138,15 @@ gb_inline bool ptr_set_exists(PtrSet *s, T ptr) { return index != MAP_SENTINEL; } +template +gb_inline isize ptr_entry_index(PtrSet *s, T ptr) { + isize index = ptr_set__find(s, ptr).entry_index; + if (index != MAP_SENTINEL) { + return index; + } + return -1; +} + // Returns true if it already exists template T ptr_set_add(PtrSet *s, T ptr) { From 10b97a1b3909161b1c287a9279a9c6d3ee4434bf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 23 Jan 2022 16:36:37 +0000 Subject: [PATCH 017/117] Update style.css --- tools/odin-html-docs/style.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/odin-html-docs/style.css b/tools/odin-html-docs/style.css index 13db2f3c2..1b94d54ec 100644 --- a/tools/odin-html-docs/style.css +++ b/tools/odin-html-docs/style.css @@ -144,6 +144,15 @@ details.code-example > summary { } } +#pkg-sidebar { + overflow-x: hidden; +} + +#pkg-sidebar > div { + overflow-x: auto; +} + + #pkg-sidebar ul { list-style-type: none; padding: 0; @@ -160,4 +169,12 @@ details.code-example > summary { #pkg-sidebar a.active { font-style: italic; +} + +#TableOfContents { + overflow-x: hidden; +} + +#TableOfContents > ul { + overflow-x: auto; } \ No newline at end of file From 6ad262c2df2c1a6896e111263b7d2a59307968b2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 23 Jan 2022 16:52:08 +0000 Subject: [PATCH 018/117] Migrate odin-html-docs to pkg.odin-lang.org repo --- tools/odin-html-docs/footer.txt.html | 45 - tools/odin-html-docs/header-lower.txt.html | 36 - tools/odin-html-docs/header.txt.html | 6 - tools/odin-html-docs/odin_html_docs_main.odin | 1475 ----------------- tools/odin-html-docs/style.css | 180 -- 5 files changed, 1742 deletions(-) delete mode 100644 tools/odin-html-docs/footer.txt.html delete mode 100644 tools/odin-html-docs/header-lower.txt.html delete mode 100644 tools/odin-html-docs/header.txt.html delete mode 100644 tools/odin-html-docs/odin_html_docs_main.odin delete mode 100644 tools/odin-html-docs/style.css diff --git a/tools/odin-html-docs/footer.txt.html b/tools/odin-html-docs/footer.txt.html deleted file mode 100644 index ad73d2834..000000000 --- a/tools/odin-html-docs/footer.txt.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - diff --git a/tools/odin-html-docs/header-lower.txt.html b/tools/odin-html-docs/header-lower.txt.html deleted file mode 100644 index ae5dec861..000000000 --- a/tools/odin-html-docs/header-lower.txt.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - -
    - -
    -
    -
    \ No newline at end of file diff --git a/tools/odin-html-docs/header.txt.html b/tools/odin-html-docs/header.txt.html deleted file mode 100644 index 4bb9036e2..000000000 --- a/tools/odin-html-docs/header.txt.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - {0:s} \ No newline at end of file diff --git a/tools/odin-html-docs/odin_html_docs_main.odin b/tools/odin-html-docs/odin_html_docs_main.odin deleted file mode 100644 index cc7f35008..000000000 --- a/tools/odin-html-docs/odin_html_docs_main.odin +++ /dev/null @@ -1,1475 +0,0 @@ -package odin_html_docs - -import doc "core:odin/doc-format" -import "core:fmt" -import "core:io" -import "core:os" -import "core:strings" -import "core:path/slashpath" -import "core:sort" -import "core:slice" -import "core:time" - -GITHUB_LICENSE_URL :: "https://github.com/odin-lang/Odin/tree/master/LICENSE" -GITHUB_CORE_URL :: "https://github.com/odin-lang/Odin/tree/master/core" -GITHUB_VENDOR_URL :: "https://github.com/odin-lang/Odin/tree/master/vendor" -BASE_CORE_URL :: "/core" -BASE_VENDOR_URL :: "/vendor" - -header: ^doc.Header -files: []doc.File -pkgs: []doc.Pkg -entities: []doc.Entity -types: []doc.Type - -core_pkgs_to_use: map[string]^doc.Pkg // trimmed path -vendor_pkgs_to_use: map[string]^doc.Pkg // trimmed path -pkg_to_path: map[^doc.Pkg]string // trimmed path -pkg_to_collection: map[^doc.Pkg]^Collection - -Collection :: struct { - name: string, - pkgs_to_use: ^map[string]^doc.Pkg, - github_url: string, - base_url: string, - root: ^Dir_Node, -} - -array :: proc(a: $A/doc.Array($T)) -> []T { - return doc.from_array(header, a) -} -str :: proc(s: $A/doc.String) -> string { - return doc.from_string(header, s) -} - -errorf :: proc(format: string, args: ..any) -> ! { - fmt.eprintf("%s ", os.args[0]) - fmt.eprintf(format, ..args) - fmt.eprintln() - os.exit(1) -} - -base_type :: proc(t: doc.Type) -> doc.Type { - t := t - for { - if t.kind != .Named { - break - } - t = types[array(t.types)[0]] - } - return t -} - -is_type_untyped :: proc(type: doc.Type) -> bool { - if type.kind == .Basic { - flags := transmute(doc.Type_Flags_Basic)type.flags - return .Untyped in flags - } - return false -} - -common_prefix :: proc(strs: []string) -> string { - if len(strs) == 0 { - return "" - } - n := max(int) - for str in strs { - n = min(n, len(str)) - } - - prefix := strs[0][:n] - for str in strs[1:] { - for len(prefix) != 0 && str[:len(prefix)] != prefix { - prefix = prefix[:len(prefix)-1] - } - if len(prefix) == 0 { - break - } - } - return prefix -} - -recursive_make_directory :: proc(path: string, prefix := "") { - head, _, tail := strings.partition(path, "/") - path_to_make := head - if prefix != "" { - path_to_make = fmt.tprintf("%s/%s", prefix, head) - } - os.make_directory(path_to_make, 0) - if tail != "" { - recursive_make_directory(tail, path_to_make) - } -} - - -write_html_header :: proc(w: io.Writer, title: string) { - fmt.wprintf(w, string(#load("header.txt.html")), title) - io.write(w, #load("header-lower.txt.html")) -} - -write_html_footer :: proc(w: io.Writer, include_directory_js: bool) { - fmt.wprintf(w, "\n") - - io.write(w, #load("footer.txt.html")) - - if false && include_directory_js { - io.write_string(w, ` -`) - } - - fmt.wprintf(w, "\n\n") -} - -main :: proc() { - if len(os.args) != 2 { - errorf("expected 1 .odin-doc file") - } - data, ok := os.read_entire_file(os.args[1]) - if !ok { - errorf("unable to read file:", os.args[1]) - } - err: doc.Reader_Error - header, err = doc.read_from_bytes(data) - switch err { - case .None: - case .Header_Too_Small: - errorf("file is too small for the file format") - case .Invalid_Magic: - errorf("invalid magic for the file format") - case .Data_Too_Small: - errorf("data is too small for the file format") - case .Invalid_Version: - errorf("invalid file format version") - } - files = array(header.files) - pkgs = array(header.pkgs) - entities = array(header.entities) - types = array(header.types) - - core_collection := &Collection{ - "Core", - &core_pkgs_to_use, - GITHUB_CORE_URL, - BASE_CORE_URL, - nil, - } - vendor_collection := &Collection{ - "Vendor", - &vendor_pkgs_to_use, - GITHUB_VENDOR_URL, - BASE_VENDOR_URL, - nil, - } - - { - fullpaths: [dynamic]string - defer delete(fullpaths) - - for pkg in pkgs[1:] { - append(&fullpaths, str(pkg.fullpath)) - } - path_prefix := common_prefix(fullpaths[:]) - - core_pkgs_to_use = make(map[string]^doc.Pkg) - vendor_pkgs_to_use = make(map[string]^doc.Pkg) - fullpath_loop: for fullpath, i in fullpaths { - path := strings.trim_prefix(fullpath, path_prefix) - pkg := &pkgs[i+1] - if len(array(pkg.entities)) == 0 { - continue fullpath_loop - } - - switch { - case strings.has_prefix(path, "core/"): - trimmed_path := strings.trim_prefix(path, "core/") - if strings.has_prefix(trimmed_path, "sys") { - continue fullpath_loop - } - - core_pkgs_to_use[trimmed_path] = pkg - case strings.has_prefix(path, "vendor/"): - trimmed_path := strings.trim_prefix(path, "vendor/") - if strings.contains(trimmed_path, "/bindings") { - continue fullpath_loop - } - vendor_pkgs_to_use[trimmed_path] = pkg - } - } - for path, pkg in core_pkgs_to_use { - pkg_to_path[pkg] = path - pkg_to_collection[pkg] = core_collection - } - for path, pkg in vendor_pkgs_to_use { - pkg_to_path[pkg] = path - pkg_to_collection[pkg] = vendor_collection - } - } - - b := strings.make_builder() - defer strings.destroy_builder(&b) - w := strings.to_writer(&b) - - { - strings.reset_builder(&b) - write_html_header(w, "Packages - pkg.odin-lang.org") - write_home_page(w) - write_html_footer(w, true) - os.write_entire_file("index.html", b.buf[:]) - } - - core_collection.root = generate_directory_tree(core_pkgs_to_use) - vendor_collection.root = generate_directory_tree(vendor_pkgs_to_use) - - generate_packages(&b, core_collection, "core") - generate_packages(&b, vendor_collection, "vendor") -} - -generate_packages :: proc(b: ^strings.Builder, collection: ^Collection, dir: string) { - w := strings.to_writer(b) - - { - strings.reset_builder(b) - write_html_header(w, fmt.tprintf("%s library - pkg.odin-lang.org", dir)) - write_collection_directory(w, collection) - write_html_footer(w, true) - os.make_directory(dir, 0) - os.write_entire_file(fmt.tprintf("%s/index.html", dir), b.buf[:]) - } - - for path, pkg in collection.pkgs_to_use { - strings.reset_builder(b) - write_html_header(w, fmt.tprintf("package %s - pkg.odin-lang.org", path)) - write_pkg(w, path, pkg, collection) - write_html_footer(w, false) - recursive_make_directory(path, dir) - os.write_entire_file(fmt.tprintf("%s/%s/index.html", dir, path), b.buf[:]) - } -} - - -write_home_sidebar :: proc(w: io.Writer) { - fmt.wprintln(w, ``) - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - fmt.wprintln(w, ``) -} - -write_home_page :: proc(w: io.Writer) { - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - write_home_sidebar(w) - - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - fmt.wprintln(w, "
    ") - fmt.wprintln(w, "

    Odin Packages

    ") - fmt.wprintln(w, "
    ") - fmt.wprintln(w, "
    ") - defer fmt.wprintln(w, "
    ") - - fmt.wprintln(w, `
    `) - fmt.wprintln(w, `

    Core Library Collection

    `) - fmt.wprintln(w, `

    Documentation for all the packages part of the core library collection.

    `) - fmt.wprintln(w, `
    `) - - fmt.wprintln(w, `
    `) - fmt.wprintln(w, `

    Vendor Library Collection

    `) - fmt.wprintln(w, `

    Documentation for all the packages part of the vendor library collection.

    `) - fmt.wprintln(w, `
    `) - - - -} - - - -Dir_Node :: struct { - dir: string, - path: string, - name: string, - pkg: ^doc.Pkg, - children: [dynamic]^Dir_Node, -} - -generate_directory_tree :: proc(pkgs_to_use: map[string]^doc.Pkg) -> (root: ^Dir_Node) { - sort_tree :: proc(node: ^Dir_Node) { - slice.sort_by_key(node.children[:], proc(node: ^Dir_Node) -> string {return node.name}) - for child in node.children { - sort_tree(child) - } - } - root = new(Dir_Node) - root.children = make([dynamic]^Dir_Node) - children := make([dynamic]^Dir_Node) - for path, pkg in pkgs_to_use { - dir, _, inner := strings.partition(path, "/") - if inner == "" { - node := new_clone(Dir_Node{ - dir = dir, - name = dir, - path = path, - pkg = pkg, - }) - append(&root.children, node) - } else { - node := new_clone(Dir_Node{ - dir = dir, - name = inner, - path = path, - pkg = pkg, - }) - append(&children, node) - } - } - child_loop: for child in children { - dir, _, inner := strings.partition(child.path, "/") - for node in root.children { - if node.dir == dir { - append(&node.children, child) - continue child_loop - } - } - parent := new_clone(Dir_Node{ - dir = dir, - name = dir, - path = dir, - pkg = nil, - }) - append(&root.children, parent) - append(&parent.children, child) - } - - sort_tree(root) - - return -} - -write_collection_directory :: proc(w: io.Writer, collection: ^Collection) { - get_line_doc :: proc(pkg: ^doc.Pkg) -> (line_doc: string, ok: bool) { - if pkg == nil { - return - } - line_doc, _, _ = strings.partition(str(pkg.docs), "\n") - line_doc = strings.trim_space(line_doc) - if line_doc == "" { - return - } - switch { - case strings.has_prefix(line_doc, "*"): - return "", false - case strings.has_prefix(line_doc, "Copyright"): - return "", false - } - return line_doc, true - } - - - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - - write_home_sidebar(w) - - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - { - fmt.wprintln(w, `
    `) - fmt.wprintln(w, `
    `) - fmt.wprintf(w, "

    %s Library Collection

    \n", collection.name) - fmt.wprintln(w, "
      ") - fmt.wprintf(w, "
    • License: BSD-3-Clause
    • \n", GITHUB_LICENSE_URL) - fmt.wprintf(w, "
    • Repository: {0:s}
    • \n", collection.github_url) - fmt.wprintln(w, "
    ") - fmt.wprintln(w, "
    ") - fmt.wprintln(w, "
    ") - fmt.wprintln(w, `
    `) - } - - fmt.wprintln(w, "
    ") - fmt.wprintln(w, `

    Directories

    `) - fmt.wprintln(w, "
    ") - - fmt.wprintln(w, "
    ") - fmt.wprintln(w, "\t") - fmt.wprintln(w, "\t\t") - - for dir in collection.root.children { - if len(dir.children) != 0 { - fmt.wprint(w, ``) - io.write_string(w, ``) - fmt.wprintf(w, "\n") - - for child in dir.children { - assert(child.pkg != nil) - fmt.wprintf(w, ``) - - line_doc, _, _ := strings.partition(str(child.pkg.docs), "\n") - line_doc = strings.trim_space(line_doc) - io.write_string(w, ``) - - fmt.wprintf(w, "") - fmt.wprintf(w, "\n") - } - } - - fmt.wprintln(w, "\t\t") - fmt.wprintln(w, "\t
    `, dir.dir) - } else { - fmt.wprintf(w, `
    `, dir.dir) - } - - if dir.pkg != nil { - fmt.wprintf(w, `%s`, collection.base_url, dir.path, dir.name) - } else { - fmt.wprintf(w, "%s", dir.name) - } - io.write_string(w, ``) - if line_doc, ok := get_line_doc(dir.pkg); ok { - write_doc_line(w, line_doc) - } else { - io.write_string(w, ` `) - } - io.write_string(w, `
    `, str(child.pkg.name)) - fmt.wprintf(w, `%s`, collection.base_url, child.path, child.name) - io.write_string(w, ``) - if line_doc, ok := get_line_doc(child.pkg); ok { - write_doc_line(w, line_doc) - } else { - io.write_string(w, ` `) - } - io.write_string(w, `
    ") - fmt.wprintln(w, "
    ") -} - -is_entity_blank :: proc(e: doc.Entity_Index) -> bool { - name := str(entities[e].name) - return name == "" -} - -write_where_clauses :: proc(w: io.Writer, where_clauses: []doc.String) { - if len(where_clauses) != 0 { - io.write_string(w, " where ") - for clause, i in where_clauses { - if i > 0 { - io.write_string(w, ", ") - } - io.write_string(w, str(clause)) - } - } -} - - -Write_Type_Flag :: enum { - Is_Results, - Variadic, - Allow_Indent, - Poly_Names, -} -Write_Type_Flags :: distinct bit_set[Write_Type_Flag] -Type_Writer :: struct { - w: io.Writer, - pkg: doc.Pkg_Index, - indent: int, - generic_scope: map[string]bool, -} - -write_type :: proc(using writer: ^Type_Writer, type: doc.Type, flags: Write_Type_Flags) { - write_param_entity :: proc(using writer: ^Type_Writer, e, next_entity: ^doc.Entity, flags: Write_Type_Flags, name_width := 0) { - name := str(e.name) - - write_padding :: proc(w: io.Writer, name: string, name_width: int) { - for _ in 0..`, BASE_CORE_URL) - io.write_string(w, init_string) - io.write_string(w, ``) - case strings.has_prefix(init_string, "context."): - io.write_string(w, name) - io.write_string(w, " := ") - fmt.wprintf(w, ``, BASE_CORE_URL) - io.write_string(w, init_string) - io.write_string(w, ``) - case: - the_type := types[e.type] - type_flags := flags - {.Is_Results} - if .Param_Ellipsis in e.flags { - type_flags += {.Variadic} - } - - #partial switch e.kind { - case .Constant: - assert(name != "") - io.write_byte(w, '$') - io.write_string(w, name) - if name != "" && init_string == "" && next_entity != nil && e.field_group_index >= 0 { - if e.field_group_index == next_entity.field_group_index && e.type == next_entity.type { - return - } - } - - generic_scope[name] = true - if !is_type_untyped(the_type) { - io.write_string(w, ": ") - write_padding(w, name, name_width) - write_type(writer, the_type, type_flags) - io.write_string(w, " = ") - io.write_string(w, init_string) - } else { - io.write_string(w, " := ") - io.write_string(w, init_string) - } - return - - case .Variable: - if name != "" && init_string == "" && next_entity != nil && e.field_group_index >= 0 { - if e.field_group_index == next_entity.field_group_index && e.type == next_entity.type { - io.write_string(w, name) - return - } - } - - if name != "" { - io.write_string(w, name) - io.write_string(w, ": ") - write_padding(w, name, name_width) - } - write_type(writer, the_type, type_flags) - case .Type_Name: - io.write_byte(w, '$') - io.write_string(w, name) - generic_scope[name] = true - io.write_string(w, ": ") - write_padding(w, name, name_width) - if the_type.kind == .Generic { - io.write_string(w, "typeid") - if ts := array(the_type.types); len(ts) == 1 { - io.write_byte(w, '/') - write_type(writer, types[ts[0]], type_flags) - } - } else { - write_type(writer, the_type, type_flags) - } - } - - if init_string != "" { - io.write_string(w, " = ") - io.write_string(w, init_string) - } - } - } - write_poly_params :: proc(using writer: ^Type_Writer, type: doc.Type, flags: Write_Type_Flags) { - if type.polymorphic_params != 0 { - io.write_byte(w, '(') - write_type(writer, types[type.polymorphic_params], flags+{.Poly_Names}) - io.write_byte(w, ')') - } - - write_where_clauses(w, array(type.where_clauses)) - } - do_indent :: proc(using writer: ^Type_Writer, flags: Write_Type_Flags) { - if .Allow_Indent not_in flags { - return - } - for _ in 0.. (name_width: int) { - for entity_index in type_entities { - e := &entities[entity_index] - name := str(e.name) - name_width = max(len(name), name_width) - } - return - } - - - type_entities := array(type.entities) - type_types := array(type.types) - switch type.kind { - case .Invalid: - // ignore - case .Basic: - type_flags := transmute(doc.Type_Flags_Basic)type.flags - if is_type_untyped(type) { - io.write_string(w, str(type.name)) - } else { - fmt.wprintf(w, `%s`, str(type.name)) - } - case .Named: - e := entities[type_entities[0]] - name := str(type.name) - tn_pkg := files[e.pos.file].pkg - collection: Collection // TODO determine this from package - - if tn_pkg != pkg { - fmt.wprintf(w, `%s.`, str(pkgs[tn_pkg].name)) - } - if .Private in e.flags { - io.write_string(w, name) - } else if n := strings.contains_rune(name, '('); n >= 0 { - fmt.wprintf(w, `{1:s}`, pkg_to_path[&pkgs[tn_pkg]], name[:n], collection.base_url) - io.write_string(w, name[n:]) - } else { - fmt.wprintf(w, `{1:s}`, pkg_to_path[&pkgs[tn_pkg]], name, collection.base_url) - } - case .Generic: - name := str(type.name) - if name not_in generic_scope { - io.write_byte(w, '$') - } - io.write_string(w, name) - if name not_in generic_scope && len(array(type.types)) == 1 { - io.write_byte(w, '/') - write_type(writer, types[type_types[0]], flags) - } - case .Pointer: - io.write_byte(w, '^') - write_type(writer, types[type_types[0]], flags) - case .Array: - assert(type.elem_count_len == 1) - io.write_byte(w, '[') - io.write_uint(w, uint(type.elem_counts[0])) - io.write_byte(w, ']') - write_type(writer, types[type_types[0]], flags) - case .Enumerated_Array: - io.write_byte(w, '[') - write_type(writer, types[type_types[0]], flags) - io.write_byte(w, ']') - write_type(writer, types[type_types[1]], flags) - case .Slice: - if .Variadic in flags { - io.write_string(w, "..") - } else { - io.write_string(w, "[]") - } - write_type(writer, types[type_types[0]], flags - {.Variadic}) - case .Dynamic_Array: - io.write_string(w, "[dynamic]") - write_type(writer, types[type_types[0]], flags) - case .Map: - io.write_string(w, "map[") - write_type(writer, types[type_types[0]], flags) - io.write_byte(w, ']') - write_type(writer, types[type_types[1]], flags) - case .Struct: - type_flags := transmute(doc.Type_Flags_Struct)type.flags - io.write_string(w, "struct") - write_poly_params(writer, type, flags) - if .Packed in type_flags { io.write_string(w, " #packed") } - if .Raw_Union in type_flags { io.write_string(w, " #raw_union") } - if custom_align := str(type.custom_align); custom_align != "" { - io.write_string(w, " #align") - io.write_string(w, custom_align) - } - io.write_string(w, " {") - - tags := array(type.tags) - - if len(type_entities) != 0 { - do_newline(writer, flags) - indent += 1 - name_width := calc_name_width(type_entities) - - for entity_index, i in type_entities { - e := &entities[entity_index] - next_entity: ^doc.Entity = nil - if i+1 < len(type_entities) { - next_entity = &entities[type_entities[i+1]] - } - do_indent(writer, flags) - write_param_entity(writer, e, next_entity, flags, name_width) - - if tag := str(tags[i]); tag != "" { - io.write_byte(w, ' ') - io.write_quoted_string(w, tag) - } - - io.write_byte(w, ',') - do_newline(writer, flags) - } - indent -= 1 - do_indent(writer, flags) - } - io.write_string(w, "}") - case .Union: - type_flags := transmute(doc.Type_Flags_Union)type.flags - io.write_string(w, "union") - write_poly_params(writer, type, flags) - if .No_Nil in type_flags { io.write_string(w, " #no_nil") } - if .Maybe in type_flags { io.write_string(w, " #maybe") } - if custom_align := str(type.custom_align); custom_align != "" { - io.write_string(w, " #align") - io.write_string(w, custom_align) - } - io.write_string(w, " {") - if len(type_types) > 1 { - do_newline(writer, flags) - indent += 1 - for type_index in type_types { - do_indent(writer, flags) - write_type(writer, types[type_index], flags) - io.write_string(w, ", ") - do_newline(writer, flags) - } - indent -= 1 - do_indent(writer, flags) - } - io.write_string(w, "}") - case .Enum: - io.write_string(w, "enum") - if len(type_types) != 0 { - io.write_byte(w, ' ') - write_type(writer, types[type_types[0]], flags) - } - io.write_string(w, " {") - do_newline(writer, flags) - indent += 1 - - name_width := calc_name_width(type_entities) - - for entity_index in type_entities { - e := &entities[entity_index] - - name := str(e.name) - do_indent(writer, flags) - io.write_string(w, name) - - if init_string := str(e.init_string); init_string != "" { - for _ in 0.. 1 || !is_entity_blank(type_entities[0])) - if require_parens { io.write_byte(w, '(') } - for entity_index, i in type_entities { - if i > 0 { - io.write_string(w, ", ") - } - e := &entities[entity_index] - next_entity: ^doc.Entity = nil - if i+1 < len(type_entities) { - next_entity = &entities[type_entities[i+1]] - } - write_param_entity(writer, e, next_entity, flags) - } - if require_parens { io.write_byte(w, ')') } - - case .Proc: - type_flags := transmute(doc.Type_Flags_Proc)type.flags - io.write_string(w, "proc") - cc := str(type.calling_convention) - if cc != "" { - io.write_byte(w, ' ') - io.write_quoted_string(w, cc) - io.write_byte(w, ' ') - } - params := array(type.types)[0] - results := array(type.types)[1] - io.write_byte(w, '(') - write_type(writer, types[params], flags) - io.write_byte(w, ')') - if results != 0 { - assert(.Diverging not_in type_flags) - io.write_string(w, " -> ") - write_type(writer, types[results], flags+{.Is_Results}) - } - if .Diverging in type_flags { - io.write_string(w, " -> !") - } - if .Optional_Ok in type_flags { - io.write_string(w, " #optional_ok") - } - - case .Bit_Set: - type_flags := transmute(doc.Type_Flags_Bit_Set)type.flags - io.write_string(w, "bit_set[") - if .Op_Lt in type_flags { - io.write_uint(w, uint(type.elem_counts[0])) - io.write_string(w, "..<") - io.write_uint(w, uint(type.elem_counts[1])) - } else if .Op_Lt_Eq in type_flags { - io.write_uint(w, uint(type.elem_counts[0])) - io.write_string(w, "..=") - io.write_uint(w, uint(type.elem_counts[1])) - } else { - write_type(writer, types[type_types[0]], flags) - } - if .Underlying_Type in type_flags { - io.write_string(w, "; ") - write_type(writer, types[type_types[1]], flags) - } - io.write_string(w, "]") - case .Simd_Vector: - io.write_string(w, "#simd[") - io.write_uint(w, uint(type.elem_counts[0])) - io.write_byte(w, ']') - case .SOA_Struct_Fixed: - io.write_string(w, "#soa[") - io.write_uint(w, uint(type.elem_counts[0])) - io.write_byte(w, ']') - case .SOA_Struct_Slice: - io.write_string(w, "#soa[]") - case .SOA_Struct_Dynamic: - io.write_string(w, "#soa[dynamic]") - case .Relative_Pointer: - io.write_string(w, "#relative(") - write_type(writer, types[type_types[1]], flags) - io.write_string(w, ") ") - write_type(writer, types[type_types[0]], flags) - case .Relative_Slice: - io.write_string(w, "#relative(") - write_type(writer, types[type_types[1]], flags) - io.write_string(w, ") ") - write_type(writer, types[type_types[0]], flags) - case .Multi_Pointer: - io.write_string(w, "[^]") - write_type(writer, types[type_types[0]], flags) - case .Matrix: - io.write_string(w, "matrix[") - io.write_uint(w, uint(type.elem_counts[0])) - io.write_string(w, ", ") - io.write_uint(w, uint(type.elem_counts[1])) - io.write_string(w, "]") - write_type(writer, types[type_types[0]], flags) - } -} - -write_doc_line :: proc(w: io.Writer, text: string) { - text := text - for len(text) != 0 { - if strings.count(text, "`") >= 2 { - n := strings.index_byte(text, '`') - io.write_string(w, text[:n]) - io.write_string(w, "") - remaining := text[n+1:] - m := strings.index_byte(remaining, '`') - io.write_string(w, remaining[:m]) - io.write_string(w, "") - text = remaining[m+1:] - } else { - io.write_string(w, text) - return - } - } -} - -write_doc_sidebar :: proc(w: io.Writer) { - -} - -write_docs :: proc(w: io.Writer, pkg: ^doc.Pkg, docs: string) { - if docs == "" { - return - } - Block_Kind :: enum { - Paragraph, - Code, - } - Block :: struct { - kind: Block_Kind, - lines: []string, - } - - lines: [dynamic]string - it := docs - for line_ in strings.split_iterator(&it, "\n") { - line := strings.trim_right_space(line_) - append(&lines, line) - } - - curr_block_kind := Block_Kind.Paragraph - start := 0 - blocks: [dynamic]Block - - for line, i in lines { - text := strings.trim_space(line) - switch curr_block_kind { - case .Paragraph: - if strings.has_prefix(line, "\t") { - if i-start > 0 { - append(&blocks, Block{curr_block_kind, lines[start:i]}) - } - curr_block_kind, start = .Code, i - } else if text == "" { - if i-start > 0 { - append(&blocks, Block{curr_block_kind, lines[start:i]}) - } - start = i - } - case .Code: - if text == "" || strings.has_prefix(line, "\t") { - continue - } - - if i-start > 0 { - append(&blocks, Block{curr_block_kind, lines[start:i]}) - } - curr_block_kind, start = .Paragraph, i - } - } - if start < len(lines) { - if len(lines)-start > 0 { - append(&blocks, Block{curr_block_kind, lines[start:]}) - } - } - - for block in &blocks { - trim_amount := 0 - for trim_amount = 0; trim_amount < len(block.lines); trim_amount += 1 { - line := block.lines[trim_amount] - if strings.trim_space(line) != "" { - break - } - } - block.lines = block.lines[trim_amount:] - } - - for block, i in blocks { - if len(block.lines) == 0 { - continue - } - prev_line := "" - if i > 0 { - prev_lines := blocks[i-1].lines - if len(prev_lines) > 0 { - prev_line = prev_lines[len(prev_lines)-1] - } - } - prev_line = strings.trim_space(prev_line) - - lines := block.lines[:] - - end_line := block.lines[len(lines)-1] - if block.kind == .Paragraph && i+1 < len(blocks) { - if strings.has_prefix(end_line, "Example:") && blocks[i+1].kind == .Code { - lines = lines[:len(lines)-1] - } - } - - switch block.kind { - case .Paragraph: - io.write_string(w, "

    ") - for line, line_idx in lines { - if line_idx > 0 { - io.write_string(w, "\n") - } - io.write_string(w, line) - } - io.write_string(w, "

    \n") - case .Code: - all_blank := len(lines) > 0 - for line in lines { - if strings.trim_space(line) != "" { - all_blank = false - } - } - if all_blank { - continue - } - - if strings.has_prefix(prev_line, "Example:") { - io.write_string(w, "
    \n") - defer io.write_string(w, "
    \n") - io.write_string(w, "Example:\n") - io.write_string(w, `
    `)
    -				for line in lines {
    -					io.write_string(w, strings.trim_prefix(line, "\t"))
    -					io.write_string(w, "\n")
    -				}
    -				io.write_string(w, "
    \n") - } else { - io.write_string(w, "
    ")
    -				for line in lines {
    -					io.write_string(w, strings.trim_prefix(line, "\t"))
    -					io.write_string(w, "\n")
    -				}
    -				io.write_string(w, "
    \n") - } - } - } -} - -write_pkg_sidebar :: proc(w: io.Writer, curr_pkg: ^doc.Pkg, collection: ^Collection) { - - fmt.wprintln(w, ``) - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - fmt.wprintf(w, "

    %s Library

    \n", collection.name) - - fmt.wprintln(w, `
      `) - defer fmt.wprintln(w, `
    `) - - for dir in collection.root.children { - fmt.wprint(w, ``) - if dir.pkg == curr_pkg { - fmt.wprintf(w, `%s`, collection.base_url, dir.path, dir.name) - } else if dir.pkg != nil { - fmt.wprintf(w, `%s`, collection.base_url, dir.path, dir.name) - } else { - fmt.wprintf(w, "%s", dir.name) - } - if len(dir.children) != 0 { - fmt.wprintln(w, "
      ") - defer fmt.wprintln(w, "
    \n") - for child in dir.children { - fmt.wprint(w, `
  • `) - defer fmt.wprintln(w, `
  • `) - if child.pkg == curr_pkg { - fmt.wprintf(w, `%s`, collection.base_url, child.path, child.name) - } else if child.pkg != nil { - fmt.wprintf(w, `%s`, collection.base_url, child.path, child.name) - } else { - fmt.wprintf(w, "%s", child.name) - } - } - } - } -} - -write_pkg :: proc(w: io.Writer, path: string, pkg: ^doc.Pkg, collection: ^Collection) { - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - write_pkg_sidebar(w, pkg, collection) - - fmt.wprintln(w, `
    `) - - if false { // breadcrumbs - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - fmt.wprintln(w, ``) - io.write_string(w, "
      \n") - defer io.write_string(w, "
    \n") - - fmt.wprintf(w, ``, collection.base_url) - - dirs := strings.split(path, "/") - for dir, i in dirs { - url := strings.join(dirs[:i+1], "/") - short_path := strings.join(dirs[1:i+1], "/") - - a_class := "breadcrumb-link" - is_curr := i+1 == len(dirs) - if is_curr { - io.write_string(w, `\n") - } - } - - - fmt.wprintf(w, "

    package core:%s

    \n", path) - overview_docs := strings.trim_space(str(pkg.docs)) - if overview_docs != "" { - fmt.wprintln(w, "

    Overview

    ") - fmt.wprintln(w, "
    ") - defer fmt.wprintln(w, "
    ") - - write_docs(w, pkg, overview_docs) - } - - fmt.wprintln(w, `

    Index

    `) - fmt.wprintln(w, `
    `) - pkg_procs: [dynamic]^doc.Entity - pkg_proc_groups: [dynamic]^doc.Entity - pkg_types: [dynamic]^doc.Entity - pkg_vars: [dynamic]^doc.Entity - pkg_consts: [dynamic]^doc.Entity - - for entity_index in array(pkg.entities) { - e := &entities[entity_index] - name := str(e.name) - if name == "" || name[0] == '_' { - continue - } - switch e.kind { - case .Invalid, .Import_Name, .Library_Name: - // ignore - case .Constant: append(&pkg_consts, e) - case .Variable: append(&pkg_vars, e) - case .Type_Name: append(&pkg_types, e) - case .Procedure: append(&pkg_procs, e) - case .Proc_Group: append(&pkg_proc_groups, e) - } - } - - entity_key :: proc(e: ^doc.Entity) -> string { - return str(e.name) - } - - slice.sort_by_key(pkg_procs[:], entity_key) - slice.sort_by_key(pkg_proc_groups[:], entity_key) - slice.sort_by_key(pkg_types[:], entity_key) - slice.sort_by_key(pkg_vars[:], entity_key) - slice.sort_by_key(pkg_consts[:], entity_key) - - write_index :: proc(w: io.Writer, name: string, entities: []^doc.Entity) { - fmt.wprintln(w, `
    `) - defer fmt.wprintln(w, `
    `) - - - fmt.wprintf(w, `
    `+"\n", name) - fmt.wprintf(w, ``+"\n", name) - io.write_string(w, name) - fmt.wprintln(w, ``) - defer fmt.wprintln(w, `
    `) - - if len(entities) == 0 { - io.write_string(w, "

    This section is empty.

    \n") - } else { - fmt.wprintln(w, "
      ") - for e in entities { - name := str(e.name) - fmt.wprintf(w, "
    • {0:s}
    • \n", name) - } - fmt.wprintln(w, "
    ") - } - } - - entity_ordering := [?]struct{name: string, entities: []^doc.Entity} { - {"Types", pkg_types[:]}, - {"Constants", pkg_consts[:]}, - {"Variables", pkg_vars[:]}, - {"Procedures", pkg_procs[:]}, - {"Procedure Groups", pkg_proc_groups[:]}, - } - - - for eo in entity_ordering { - write_index(w, eo.name, eo.entities) - } - - fmt.wprintln(w, "
    ") - - - write_entity :: proc(w: io.Writer, e: ^doc.Entity) { - write_attributes :: proc(w: io.Writer, e: ^doc.Entity) { - for attr in array(e.attributes) { - io.write_string(w, "@(") - name := str(attr.name) - value := str(attr.value) - io.write_string(w, name) - if value != "" { - io.write_string(w, "=") - io.write_string(w, value) - } - io.write_string(w, ")\n") - } - } - - pkg_index := files[e.pos.file].pkg - pkg := &pkgs[pkg_index] - writer := &Type_Writer{ - w = w, - pkg = pkg_index, - } - defer delete(writer.generic_scope) - collection := pkg_to_collection[pkg] - github_url := collection.github_url if collection != nil else GITHUB_CORE_URL - - name := str(e.name) - path := pkg_to_path[pkg] - filename := slashpath.base(str(files[e.pos.file].name)) - fmt.wprintf(w, "

    {0:s}", name) - fmt.wprintf(w, " ¶") - if e.pos.file != 0 && e.pos.line > 0 { - src_url := fmt.tprintf("%s/%s/%s#L%d", github_url, path, filename, e.pos.line) - fmt.wprintf(w, "", src_url) - } - fmt.wprintf(w, "

    \n") - fmt.wprintln(w, `
    `) - - switch e.kind { - case .Invalid, .Import_Name, .Library_Name: - // ignore - case .Constant: - fmt.wprint(w, `
    `)
    -			the_type := types[e.type]
    -
    -			init_string := str(e.init_string)
    -			assert(init_string != "")
    -
    -			ignore_type := true
    -			if the_type.kind == .Basic && is_type_untyped(the_type) {
    -			} else {
    -				ignore_type = false
    -				type_name := str(the_type.name)
    -				if type_name != "" && strings.has_prefix(init_string, type_name) {
    -					ignore_type = true
    -				}
    -			}
    -
    -			if ignore_type {
    -				fmt.wprintf(w, "%s :: ", name)
    -			} else {
    -				fmt.wprintf(w, "%s: ", name)
    -				write_type(writer, the_type, {.Allow_Indent})
    -				fmt.wprintf(w, " : ")
    -			}
    -
    -
    -			io.write_string(w, init_string)
    -			fmt.wprintln(w, "
    ") - case .Variable: - fmt.wprint(w, `
    `)
    -			write_attributes(w, e)
    -			fmt.wprintf(w, "%s: ", name)
    -			write_type(writer, types[e.type], {.Allow_Indent})
    -			init_string := str(e.init_string)
    -			if init_string != "" {
    -				io.write_string(w, " = ")
    -				io.write_string(w, "…")
    -			}
    -			fmt.wprintln(w, "
    ") - - case .Type_Name: - fmt.wprint(w, `
    `)
    -			fmt.wprintf(w, "%s :: ", name)
    -			the_type := types[e.type]
    -			type_to_print := the_type
    -			if the_type.kind == .Named && .Type_Alias not_in e.flags {
    -				if e.pos == entities[array(the_type.entities)[0]].pos {
    -					bt := base_type(the_type)
    -					#partial switch bt.kind {
    -					case .Struct, .Union, .Proc, .Enum:
    -						// Okay
    -					case:
    -						io.write_string(w, "distinct ")
    -					}
    -					type_to_print = bt
    -				}
    -			}
    -			write_type(writer, type_to_print, {.Allow_Indent})
    -			fmt.wprintln(w, "
    ") - case .Procedure: - fmt.wprint(w, `
    `)
    -			fmt.wprintf(w, "%s :: ", name)
    -			write_type(writer, types[e.type], nil)
    -			write_where_clauses(w, array(e.where_clauses))
    -			fmt.wprint(w, " {…}")
    -			fmt.wprintln(w, "
    ") - case .Proc_Group: - fmt.wprint(w, `
    `)
    -			fmt.wprintf(w, "%s :: proc{{\n", name)
    -			for entity_index in array(e.grouped_entities) {
    -				this_proc := &entities[entity_index]
    -				this_pkg := files[this_proc.pos.file].pkg
    -				io.write_byte(w, '\t')
    -				if this_pkg != pkg_index {
    -					fmt.wprintf(w, "%s.", str(pkgs[this_pkg].name))
    -				}
    -				pkg := &pkgs[this_pkg]
    -				collection := pkg_to_collection[pkg]
    -				name := str(this_proc.name)
    -				fmt.wprintf(w, ``, pkg_to_path[pkg], name, collection.base_url)
    -				io.write_string(w, name)
    -				io.write_string(w, ``)
    -				io.write_byte(w, ',')
    -				io.write_byte(w, '\n')
    -			}
    -			fmt.wprintln(w, "}")
    -			fmt.wprintln(w, "
    ") - - } - fmt.wprintln(w, `
    `) - - the_docs := strings.trim_space(str(e.docs)) - if the_docs != "" { - fmt.wprintln(w, `
    `) - fmt.wprintln(w, ` `) - write_docs(w, pkg, the_docs) - fmt.wprintln(w, `
    `) - } - } - write_entities :: proc(w: io.Writer, title: string, entities: []^doc.Entity) { - fmt.wprintf(w, "

    {0:s}

    \n", title) - fmt.wprintln(w, `
    `) - if len(entities) == 0 { - io.write_string(w, "

    This section is empty.

    \n") - } else { - for e in entities { - fmt.wprintln(w, `
    `) - write_entity(w, e) - fmt.wprintln(w, `
    `) - } - } - fmt.wprintln(w, "
    ") - } - - for eo in entity_ordering { - write_entities(w, eo.name, eo.entities) - } - - fmt.wprintln(w, `

    Source Files

    `) - fmt.wprintln(w, "
      ") - any_hidden := false - source_file_loop: for file_index in array(pkg.files) { - file := files[file_index] - filename := slashpath.base(str(file.name)) - switch { - case - strings.has_suffix(filename, "_windows.odin"), - strings.has_suffix(filename, "_darwin.odin"), - strings.has_suffix(filename, "_essence.odin"), - strings.has_suffix(filename, "_freebsd.odin"), - strings.has_suffix(filename, "_wasi.odin"), - strings.has_suffix(filename, "_js.odin"), - strings.has_suffix(filename, "_freestanding.odin"), - - strings.has_suffix(filename, "_amd64.odin"), - strings.has_suffix(filename, "_i386.odin"), - strings.has_suffix(filename, "_arch64.odin"), - strings.has_suffix(filename, "_wasm32.odin"), - strings.has_suffix(filename, "_wasm64.odin"), - false: - any_hidden = true - continue source_file_loop - } - fmt.wprintf(w, `
    • %s
    • `, collection.github_url, path, filename, filename) - fmt.wprintln(w) - } - if any_hidden { - fmt.wprintln(w, "
    • (hidden platform specific files)
    • ") - } - fmt.wprintln(w, "
    ") - - { - fmt.wprintln(w, `

    Generation Information

    `) - now := time.now() - fmt.wprintf(w, "

    Generated with odin version %s (vendor %q) %s_%s @ %v

    \n", ODIN_VERSION, ODIN_VENDOR, ODIN_OS, ODIN_ARCH, now) - } - - - - fmt.wprintln(w, `
    `) - { - write_link :: proc(w: io.Writer, id, text: string) { - fmt.wprintf(w, `
  • %s`, id, text) - } - - fmt.wprintln(w, ``) - } - -} \ No newline at end of file diff --git a/tools/odin-html-docs/style.css b/tools/odin-html-docs/style.css deleted file mode 100644 index 1b94d54ec..000000000 --- a/tools/odin-html-docs/style.css +++ /dev/null @@ -1,180 +0,0 @@ -/* doc directories */ - -table.directory { - /*border: 1px solid #ccc!important;*/ - table-layout: fixed; - border-collapse: collapse; -} - -header.collection-header ul { - margin-top: 1em; - margin-bottom: 0; - padding-left: 0.5em; - list-style-type: none; -} - -hr.collection-hr { - margin: 0; - padding: 0; -} - - -.doc-directory tr { - padding-left: 1em!important; - border-top: 1px solid #ccc!important; - border-bottom: 1px solid #ccc!important; -} - -.doc-directory td { - padding: 0.25em 0.5em; -} -.directory-child td { - padding-left: 2em!important; -} - -.directory-child td+td { - position: relative; - left: -1.5em!important; - padding-right: 0; -} - -.doc-directory tr[aria-expanded=true] td.pkg-name:before { - content: "\2193"; -} -.doc-directory tr[aria-expanded=false] td.pkg-name:before { - content: "\2192"!important; -} - -.doc-directory tr[aria-hidden=true] { - display: none; -} - - -/* doc page */ - -pre.doc-code { - white-space: pre-wrap; - word-break: keep-all; - word-wrap: break-word; - tab-size: 8; - background-color: #f8f8f8; - color: #202224; - border: 1px solid #c6c8ca; - border-radius: 0.25rem; - padding: 0.625rem; -} -pre.doc-code a { - font-family: Consolas,Liberation Mono,Menlo,monospace!important; - text-decoration: none; - color: #2179d8; - font-weight: 800; -} - -pre.doc-code a.code-procedure { - color: #047919; -} - -.pkg-line-doc { - color: #444; - width: 100%; -} - - -.doc-source { - display: inline; - float: right; -} - -.doc-source a { - text-decoration: none; - color: #666666; - font-size: 0.75em; -} -.doc-source a:hover { - text-decoration: underline; -} - -a > .a-hidden { - opacity: 0; -} -a:hover > .a-hidden { - opacity: 100; -} -section.documentation h3 { - font-size: calc(1.1rem + .2vw); -} - -.pkg-index h3 { - margin-top: 0 !important; - padding-top: 0 !important; -} - - -.documentation .pkg-entity { - padding-bottom: 0.75rem; - border-bottom: 1px solid #d0d0d0; -} - -details.doc-index > summary { - font-size: 1.75rem; -} -details.doc-index ul { - list-style-type: none; -} - -details.odin-doc-toggle > summary.hideme span:before { - content: "Expand description"; -} -details.odin-doc-toggle[open] > summary.hideme span:before { - content: "Close description"; - opacity: 0.8; -} - -details.odin-doc-toggle[open] > summary.hideme { - margin-bottom: 0.5em; -} - -details.code-example > summary { - font-weight: 700; -} - -@media only screen and (max-width: 991px) { - #pkg-sidebar { - display: none; - } -} - -#pkg-sidebar { - overflow-x: hidden; -} - -#pkg-sidebar > div { - overflow-x: auto; -} - - -#pkg-sidebar ul { - list-style-type: none; - padding: 0; -} - -#pkg-sidebar li:not(:last-child) { - margin-bottom: 0.25rem; -} - - -#pkg-sidebar li > ul { - padding-left: 1.25rem; -} - -#pkg-sidebar a.active { - font-style: italic; -} - -#TableOfContents { - overflow-x: hidden; -} - -#TableOfContents > ul { - overflow-x: auto; -} \ No newline at end of file From 18e639f59b411a39c52339f67974a8dd76b33a6e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 23 Jan 2022 21:35:03 +0000 Subject: [PATCH 019/117] Add `strings.split_lines*` procedures --- core/strings/strings.odin | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index b93c5bcc0..67046c669 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -353,6 +353,76 @@ split_after_n_iterator :: proc(s: ^string, sep: string, n: int) -> (string, bool } +@(private) +_trim_cr :: proc(s: string) -> string { + n := len(s) + if n > 0 { + if s[n-1] == '\r' { + return s[:n-1] + } + } + return s +} + +split_lines :: proc(s: string, allocator := context.allocator) -> []string { + sep :: "\n" + lines := _split(s, sep, 0, -1, allocator) + for line in &lines { + line = _trim_cr(line) + } + return lines +} + +split_lines_n :: proc(s: string, n: int, allocator := context.allocator) -> []string { + sep :: "\n" + lines := _split(s, sep, 0, n, allocator) + for line in &lines { + line = _trim_cr(line) + } + return lines +} + +split_lines_after :: proc(s: string, allocator := context.allocator) -> []string { + sep :: "\n" + lines := _split(s, sep, len(sep), -1, allocator) + for line in &lines { + line = _trim_cr(line) + } + return lines +} + +split_lines_after_n :: proc(s: string, n: int, allocator := context.allocator) -> []string { + sep :: "\n" + lines := _split(s, sep, len(sep), n, allocator) + for line in &lines { + line = _trim_cr(line) + } + return lines +} + +split_lines_iterator :: proc(s: ^string) -> (line: string, ok: bool) { + sep :: "\n" + line = _split_iterator(s, sep, 0, -1) or_return + return _trim_cr(line), true +} + +split_lines_n_iterator :: proc(s: ^string, n: int) -> (line: string, ok: bool) { + sep :: "\n" + line = _split_iterator(s, sep, 0, n) or_return + return _trim_cr(line), true +} + +split_lines_after_iterator :: proc(s: ^string) -> (line: string, ok: bool) { + sep :: "\n" + line = _split_iterator(s, sep, len(sep), -1) or_return + return _trim_cr(line), true +} + +split_lines_after_n_iterator :: proc(s: ^string, n: int) -> (line: string, ok: bool) { + sep :: "\n" + line = _split_iterator(s, sep, len(sep), n) or_return + return _trim_cr(line), true +} From d269dbcd40d5b81f060a17ed4ca89d97dafcc49c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 23 Jan 2022 22:01:54 +0000 Subject: [PATCH 020/117] Add comment for the internals of `assert` --- core/runtime/core_builtin.odin | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/runtime/core_builtin.odin b/core/runtime/core_builtin.odin index 44da894c1..3bafc0b1d 100644 --- a/core/runtime/core_builtin.odin +++ b/core/runtime/core_builtin.odin @@ -614,6 +614,10 @@ raw_data :: proc{raw_array_data, raw_slice_data, raw_dynamic_array_data, raw_str @(disabled=ODIN_DISABLE_ASSERT) assert :: proc(condition: bool, message := "", loc := #caller_location) { if !condition { + // NOTE(bill): This is wrapped in a procedure call + // to improve performance to make the CPU not + // execute speculatively, making it about an order of + // magnitude faster proc(message: string, loc: Source_Code_Location) { p := context.assertion_failure_proc if p == nil { From 849fe01e702073bc50789b8fa904aac0d166e030 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 14:13:24 +0000 Subject: [PATCH 021/117] Add `lb_add_debug_local_variable` call to procedure arguments --- src/llvm_backend_proc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 2a6eb6bb3..2d5924608 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -488,6 +488,7 @@ void lb_begin_procedure_body(lbProcedure *p) { lbValue ptr = lb_address_from_load_or_generate_local(p, param); lb_add_entity(p->module, e, ptr); + lb_add_debug_local_variable(p, ptr.value, e->type, e->token); } } else if (arg_type->kind == lbArg_Indirect) { if (e->token.string.len != 0 && !is_blank_ident(e->token.string)) { @@ -496,6 +497,7 @@ void lb_begin_procedure_body(lbProcedure *p) { ptr.type = alloc_type_pointer(e->type); lb_add_entity(p->module, e, ptr); + lb_add_debug_local_variable(p, ptr.value, e->type, e->token); } } param_index += 1; From 49872e40dcd88f6b011a79baccdadf509f062795 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 14:46:56 +0000 Subject: [PATCH 022/117] Comment out calls --- src/llvm_backend_proc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 2d5924608..b35c6c304 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -488,7 +488,7 @@ void lb_begin_procedure_body(lbProcedure *p) { lbValue ptr = lb_address_from_load_or_generate_local(p, param); lb_add_entity(p->module, e, ptr); - lb_add_debug_local_variable(p, ptr.value, e->type, e->token); + // lb_add_debug_local_variable(p, ptr.value, e->type, e->token); } } else if (arg_type->kind == lbArg_Indirect) { if (e->token.string.len != 0 && !is_blank_ident(e->token.string)) { @@ -497,7 +497,7 @@ void lb_begin_procedure_body(lbProcedure *p) { ptr.type = alloc_type_pointer(e->type); lb_add_entity(p->module, e, ptr); - lb_add_debug_local_variable(p, ptr.value, e->type, e->token); + // lb_add_debug_local_variable(p, ptr.value, e->type, e->token); } } param_index += 1; From 2554c72bb219286825ee8d47a2c6c748416acb0e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 14:47:33 +0000 Subject: [PATCH 023/117] Update CommentGroup parsing for struct types --- src/check_type.cpp | 10 ++++++++++ src/docs_format.cpp | 4 ++-- src/docs_writer.cpp | 6 ++++++ src/entity.cpp | 2 ++ src/parser.cpp | 2 +- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index a5a757f3e..2a7479d68 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -120,6 +120,8 @@ void check_struct_fields(CheckerContext *ctx, Ast *node, Slice *fields ast_node(p, Field, param); Ast *type_expr = p->type; Type *type = nullptr; + CommentGroup *docs = p->docs; + CommentGroup *comment = p->comment; if (type_expr != nullptr) { type = check_type_expr(ctx, type_expr, nullptr); @@ -156,6 +158,14 @@ void check_struct_fields(CheckerContext *ctx, Ast *node, Slice *fields Entity *field = alloc_entity_field(ctx->scope, name_token, type, is_using, field_src_index); add_entity(ctx, ctx->scope, name, field); field->Variable.field_group_index = field_group_index; + + if (j == 0) { + field->Variable.docs = docs; + } + if (j+1 == p->names.count) { + field->Variable.comment = comment; + } + array_add(&fields_array, field); String tag = p->tag.string; if (tag.len != 0 && !unquote_string(permanent_allocator(), &tag, 0, tag.text[0] == '`')) { diff --git a/src/docs_format.cpp b/src/docs_format.cpp index f47fd0945..39f2e307c 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -185,8 +185,8 @@ struct OdinDocEntity { OdinDocTypeIndex type; OdinDocString init_string; u32 reserved_for_init; - OdinDocString comment; - OdinDocString docs; + OdinDocString comment; // line comment + OdinDocString docs; // preceding comment i32 field_group_index; OdinDocEntityIndex foreign_library; OdinDocString link_name; diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 0a990cc37..825ca113f 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -811,6 +811,12 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { comment = e->decl_info->comment; docs = e->decl_info->docs; } + if (!comment && e->kind == Entity_Variable) { + comment = e->Variable.comment; + } + if (!docs && e->kind == Entity_Variable) { + docs = e->Variable.docs; + } String link_name = {}; diff --git a/src/entity.cpp b/src/entity.cpp index 05ee9a33e..0f8bfa456 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -175,6 +175,8 @@ struct Entity { String link_name; String link_prefix; String link_section; + CommentGroup *docs; + CommentGroup *comment; bool is_foreign; bool is_export; } Variable; diff --git a/src/parser.cpp b/src/parser.cpp index 7e7146244..076c698ff 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -944,7 +944,7 @@ Ast *ast_field(AstFile *f, Array const &names, Ast *type, Ast *default_va result->Field.default_value = default_value; result->Field.flags = flags; result->Field.tag = tag; - result->Field.docs = docs; + result->Field.docs = docs; result->Field.comment = comment; return result; } From dcc9e61362a04ecbd01cf3088766e013db6253bc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 14:52:43 +0000 Subject: [PATCH 024/117] Correct string_append_token --- src/check_expr.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 99d351753..81f69055a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9115,18 +9115,7 @@ gbString string_append_string(gbString str, String string) { gbString string_append_token(gbString str, Token token) { - if (token.kind == Token_String) { - str = gb_string_append_rune(str, '"'); - } else if (token.kind == Token_Rune) { - str = gb_string_append_rune(str, '\''); - } str = string_append_string(str, token.string); - if (token.kind == Token_String) { - str = gb_string_append_rune(str, '"'); - } else if (token.kind == Token_Rune) { - str = gb_string_append_rune(str, '\''); - } - return str; } From 42ab882db4a6d5765c68021ade010b468ff4531e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 15:56:26 +0000 Subject: [PATCH 025/117] Remove debug code --- src/check_expr.cpp | 1 - src/checker.cpp | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 81f69055a..1742ef2d8 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3419,7 +3419,6 @@ void convert_untyped_error(CheckerContext *c, Operand *operand, Type *target_typ if (operand->value.kind == ExactValue_String) { String key = operand->value.value_string; if (is_type_string(operand->type) && is_type_enum(target_type)) { - gb_printf_err("HERE!\n"); Type *et = base_type(target_type); check_did_you_mean_type(key, et->Enum.fields, "."); } diff --git a/src/checker.cpp b/src/checker.cpp index 55a3892e5..b81d9987b 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1618,9 +1618,6 @@ void add_type_info_type_internal(CheckerContext *c, Type *t) { // NOTE(bill): map entries grow linearly and in order ti_index = c->info->type_info_types.count; array_add(&c->info->type_info_types, t); - if (t->kind == Type_Named && t->Named.name == "A") { - gb_printf_err("HERE!\n"); - } } map_set(&c->checker->info.type_info_map, t, ti_index); From f20105ddfee6d9a2aa02452e459c42c7f0310e76 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 23:07:06 +0000 Subject: [PATCH 026/117] Update docs for packages fmt and io --- core/fmt/fmt.odin | 33 +++++++++++++++++++++++++++------ core/fmt/fmt_js.odin | 7 ++++++- core/fmt/fmt_os.odin | 10 +++++++++- core/io/io.odin | 41 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 81 insertions(+), 10 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 2cc192c12..932fc0bb8 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -11,6 +11,7 @@ import "core:time" import "core:unicode/utf8" import "core:intrinsics" +// Internal data structure that stores the required information for formatted printing Info :: struct { minus: bool, plus: bool, @@ -46,9 +47,13 @@ Register_User_Formatter_Error :: enum { // it is prefixed with `_` rather than marked with a private attribute so that users can access it if necessary _user_formatters: ^map[typeid]User_Formatter +// set_user_formatters assigns m to a global value allowing the user have custom print formatting for specific +// types set_user_formatters :: proc(m: ^map[typeid]User_Formatter) { _user_formatters = m } +// register_user_formatter assigns a formatter to a specific typeid. set_user_formatters must be called +// before any use of this procedure. register_user_formatter :: proc(id: typeid, formatter: User_Formatter) -> Register_User_Formatter_Error { if _user_formatters == nil { return .No_User_Formatter @@ -61,7 +66,7 @@ register_user_formatter :: proc(id: typeid, formatter: User_Formatter) -> Regist } -// aprint* procedures return a string that was allocated with the current context +// aprint procedure return a string that was allocated with the current context // They must be freed accordingly aprint :: proc(args: ..any, sep := " ") -> string { str: strings.Builder @@ -69,12 +74,16 @@ aprint :: proc(args: ..any, sep := " ") -> string { sbprint(buf=&str, args=args, sep=sep) return strings.to_string(str) } +// aprintln procedure return a string that was allocated with the current context +// They must be freed accordingly aprintln :: proc(args: ..any, sep := " ") -> string { str: strings.Builder strings.init_builder(&str) sbprintln(buf=&str, args=args, sep=sep) return strings.to_string(str) } +// aprintf procedure return a string that was allocated with the current context +// They must be freed accordingly aprintf :: proc(fmt: string, args: ..any) -> string { str: strings.Builder strings.init_builder(&str) @@ -83,19 +92,21 @@ aprintf :: proc(fmt: string, args: ..any) -> string { } -// tprint* procedures return a string that was allocated with the current context's temporary allocator +// tprint procedure return a string that was allocated with the current context's temporary allocator tprint :: proc(args: ..any, sep := " ") -> string { str: strings.Builder strings.init_builder(&str, context.temp_allocator) sbprint(buf=&str, args=args, sep=sep) return strings.to_string(str) } +// tprintln procedure return a string that was allocated with the current context's temporary allocator tprintln :: proc(args: ..any, sep := " ") -> string { str: strings.Builder strings.init_builder(&str, context.temp_allocator) sbprintln(buf=&str, args=args, sep=sep) return strings.to_string(str) } +// tprintf procedure return a string that was allocated with the current context's temporary allocator tprintf :: proc(fmt: string, args: ..any) -> string { str: strings.Builder strings.init_builder(&str, context.temp_allocator) @@ -104,21 +115,24 @@ tprintf :: proc(fmt: string, args: ..any) -> string { } -// bprint* procedures return a string using a buffer from an array +// bprint procedures return a string using a buffer from an array bprint :: proc(buf: []byte, args: ..any, sep := " ") -> string { sb := strings.builder_from_slice(buf[0:len(buf)]) return sbprint(buf=&sb, args=args, sep=sep) } +// bprintln procedures return a string using a buffer from an array bprintln :: proc(buf: []byte, args: ..any, sep := " ") -> string { sb := strings.builder_from_slice(buf[0:len(buf)]) return sbprintln(buf=&sb, args=args, sep=sep) } +// bprintf procedures return a string using a buffer from an array bprintf :: proc(buf: []byte, fmt: string, args: ..any) -> string { sb := strings.builder_from_slice(buf[0:len(buf)]) return sbprintf(&sb, fmt, ..args) } +// formatted assert assertf :: proc(condition: bool, fmt: string, args: ..any, loc := #caller_location) -> bool { if !condition { p := context.assertion_failure_proc @@ -131,6 +145,7 @@ assertf :: proc(condition: bool, fmt: string, args: ..any, loc := #caller_locati return condition } +// formatted panic panicf :: proc(fmt: string, args: ..any, loc := #caller_location) -> ! { p := context.assertion_failure_proc if p == nil { @@ -142,24 +157,26 @@ panicf :: proc(fmt: string, args: ..any, loc := #caller_location) -> ! { - - +// sbprint formats using the default print settings and writes to buf sbprint :: proc(buf: ^strings.Builder, args: ..any, sep := " ") -> string { wprint(w=strings.to_writer(buf), args=args, sep=sep) return strings.to_string(buf^) } +// sbprintln formats using the default print settings and writes to buf sbprintln :: proc(buf: ^strings.Builder, args: ..any, sep := " ") -> string { wprintln(w=strings.to_writer(buf), args=args, sep=sep) return strings.to_string(buf^) } +// sbprintf formats according to the specififed format string and writes to buf sbprintf :: proc(buf: ^strings.Builder, fmt: string, args: ..any) -> string { wprintf(w=strings.to_writer(buf), fmt=fmt, args=args) return strings.to_string(buf^) } +// wprint formats using the default print settings and writes to w wprint :: proc(w: io.Writer, args: ..any, sep := " ") -> int { fi: Info fi.writer = w @@ -194,6 +211,7 @@ wprint :: proc(w: io.Writer, args: ..any, sep := " ") -> int { return int(size1 - size0) } +// wprintln formats using the default print settings and writes to w wprintln :: proc(w: io.Writer, args: ..any, sep := " ") -> int { fi: Info fi.writer = w @@ -214,6 +232,7 @@ wprintln :: proc(w: io.Writer, args: ..any, sep := " ") -> int { return int(size1 - size0) } +// wprintf formats according to the specififed format string and writes to w wprintf :: proc(w: io.Writer, fmt: string, args: ..any) -> int { fi: Info arg_index: int = 0 @@ -493,11 +512,13 @@ wprintf :: proc(w: io.Writer, fmt: string, args: ..any) -> int { return int(size1 - size0) } +// wprint_type is a utility procedure to write a ^runtime.Type_Info value to w wprint_type :: proc(w: io.Writer, info: ^runtime.Type_Info) -> (int, io.Error) { n, err := reflect.write_type(w, info) io.flush(auto_cast w) return n, err } +// wprint_typeid is a utility procedure to write a typeid value to w wprint_typeid :: proc(w: io.Writer, id: typeid) -> (int, io.Error) { n, err := reflect.write_type(w, type_info_of(id)) io.flush(auto_cast w) @@ -829,7 +850,7 @@ _pad :: proc(fi: ^Info, s: string) { fmt_float :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune) { switch verb { - case 'f', 'F', 'v': + case 'f', 'F', 'g', 'G', 'v': prec: int = 3 if fi.prec_set { prec = fi.prec diff --git a/core/fmt/fmt_js.odin b/core/fmt/fmt_js.odin index bcd9688a1..7a9876127 100644 --- a/core/fmt/fmt_js.odin +++ b/core/fmt/fmt_js.odin @@ -34,11 +34,16 @@ stderr := io.Writer{ }, } -// print* procedures return the number of bytes written +// print formats using the default print settings and writes to stdout print :: proc(args: ..any, sep := " ") -> int { return wprint(w=stdout, args=args, sep=sep) } +// println formats using the default print settings and writes to stdout println :: proc(args: ..any, sep := " ") -> int { return wprintln(w=stdout, args=args, sep=sep) } +// printf formats according to the specififed format string and writes to stdout printf :: proc(fmt: string, args: ..any) -> int { return wprintf(stdout, fmt, ..args) } +// eprint formats using the default print settings and writes to stderr eprint :: proc(args: ..any, sep := " ") -> int { return wprint(w=stderr, args=args, sep=sep) } +// eprintln formats using the default print settings and writes to stderr eprintln :: proc(args: ..any, sep := " ") -> int { return wprintln(w=stderr, args=args, sep=sep) } +// eprintf formats according to the specififed format string and writes to stderr eprintf :: proc(fmt: string, args: ..any) -> int { return wprintf(stderr, fmt, ..args) } diff --git a/core/fmt/fmt_os.odin b/core/fmt/fmt_os.odin index 7434d939d..f5c8d75bd 100644 --- a/core/fmt/fmt_os.odin +++ b/core/fmt/fmt_os.odin @@ -5,15 +5,18 @@ import "core:runtime" import "core:os" import "core:io" +// fprint formats using the default print settings and writes to fd fprint :: proc(fd: os.Handle, args: ..any, sep := " ") -> int { w := io.to_writer(os.stream_from_handle(fd)) return wprint(w=w, args=args, sep=sep) } +// fprintln formats using the default print settings and writes to fd fprintln :: proc(fd: os.Handle, args: ..any, sep := " ") -> int { w := io.to_writer(os.stream_from_handle(fd)) return wprintln(w=w, args=args, sep=sep) } +// fprintf formats according to the specififed format string and writes to fd fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int { w := io.to_writer(os.stream_from_handle(fd)) return wprintf(w, fmt, ..args) @@ -27,11 +30,16 @@ fprint_typeid :: proc(fd: os.Handle, id: typeid) -> (n: int, err: io.Error) { return wprint_typeid(w, id) } -// print* procedures return the number of bytes written +// print formats using the default print settings and writes to os.stdout print :: proc(args: ..any, sep := " ") -> int { return fprint(fd=os.stdout, args=args, sep=sep) } +// println formats using the default print settings and writes to os.stdout println :: proc(args: ..any, sep := " ") -> int { return fprintln(fd=os.stdout, args=args, sep=sep) } +// printf formats according to the specififed format string and writes to os.stdout printf :: proc(fmt: string, args: ..any) -> int { return fprintf(os.stdout, fmt, ..args) } +// eprint formats using the default print settings and writes to os.stderr eprint :: proc(args: ..any, sep := " ") -> int { return fprint(fd=os.stderr, args=args, sep=sep) } +// eprintln formats using the default print settings and writes to os.stderr eprintln :: proc(args: ..any, sep := " ") -> int { return fprintln(fd=os.stderr, args=args, sep=sep) } +// eprintf formats according to the specififed format string and writes to os.stderr eprintf :: proc(fmt: string, args: ..any) -> int { return fprintf(os.stderr, fmt, ..args) } diff --git a/core/io/io.odin b/core/io/io.odin index b4757f8e5..e9d839efb 100644 --- a/core/io/io.odin +++ b/core/io/io.odin @@ -1,9 +1,13 @@ +// package io provides basic interfaces for generic data stream primitives. +// The purpose of this package is wrap existing data structures and their +// operations into an abstracted stream interface. package io import "core:intrinsics" import "core:runtime" import "core:unicode/utf8" +// Seek whence values Seek_From :: enum { Start = 0, // seek relative to the origin of the file Current = 1, // seek relative to the current offset @@ -139,6 +143,10 @@ destroy :: proc(s: Stream) -> Error { return .Empty } +// read reads up to len(p) bytes into s. It returns the number of bytes read and any error if occurred. +// +// When read encounters an .EOF or error after successfully reading n > 0 bytes, it returns the number of +// bytes read along with the error. read :: proc(s: Reader, p: []byte, n_read: ^int = nil) -> (n: int, err: Error) { if s.stream_vtable != nil && s.impl_read != nil { n, err = s->impl_read(p) @@ -150,6 +158,7 @@ read :: proc(s: Reader, p: []byte, n_read: ^int = nil) -> (n: int, err: Error) { return 0, .Empty } +// write writes up to len(p) bytes into s. It returns the number of bytes written and any error if occurred. write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Error) { if s.stream_vtable != nil && s.impl_write != nil { n, err = s->impl_write(p) @@ -161,6 +170,13 @@ write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Erro return 0, .Empty } +// seek sets the offset of the next read or write to offset. +// +// .Start means seek relative to the origin of the file. +// .Current means seek relative to the current offset. +// .End means seek relative to the end. +// +// seek returns the new offset to the start of the file/stream, and any error if occurred. seek :: proc(s: Seeker, offset: i64, whence: Seek_From) -> (n: i64, err: Error) { if s.stream_vtable != nil && s.impl_seek != nil { return s->impl_seek(offset, whence) @@ -168,6 +184,8 @@ seek :: proc(s: Seeker, offset: i64, whence: Seek_From) -> (n: i64, err: Error) return 0, .Empty } +// The behaviour of close after the first call is stream implementation defined. +// Different streams may document their own behaviour. close :: proc(s: Closer) -> Error { if s.stream_vtable != nil && s.impl_close != nil { return s->impl_close() @@ -184,6 +202,7 @@ flush :: proc(s: Flusher) -> Error { return .None } +// size returns the size of the stream. If the stream does not support querying its size, 0 will be returned. size :: proc(s: Stream) -> i64 { if s.stream_vtable == nil { return 0 @@ -214,7 +233,12 @@ size :: proc(s: Stream) -> i64 { - +// read_at reads len(p) bytes into p starting with the provided offset in the underlying Reader_At stream r. +// It returns the number of bytes read and any error if occurred. +// +// When read_at returns n < len(p), it returns a non-nil Error explaining why. +// +// If n == len(p), err may be either nil or .EOF read_at :: proc(r: Reader_At, p: []byte, offset: i64, n_read: ^int = nil) -> (n: int, err: Error) { defer if n_read != nil { n_read^ += n @@ -245,6 +269,11 @@ read_at :: proc(r: Reader_At, p: []byte, offset: i64, n_read: ^int = nil) -> (n: } +// write_at writes len(p) bytes into p starting with the provided offset in the underlying Writer_At stream w. +// It returns the number of bytes written and any error if occurred. +// +// If write_at is writing to a Writer_At which has a seek offset, then write_at should not affect the underlying +// seek offset. write_at :: proc(w: Writer_At, p: []byte, offset: i64, n_written: ^int = nil) -> (n: int, err: Error) { defer if n_written != nil { n_written^ += n @@ -294,6 +323,7 @@ read_from :: proc(w: Reader_From, r: Reader) -> (n: i64, err: Error) { } +// read_byte reads and returns the next byte from r. read_byte :: proc(r: Byte_Reader, n_read: ^int = nil) -> (b: byte, err: Error) { defer if err == nil && n_read != nil { n_read^ += 1 @@ -347,6 +377,7 @@ _write_byte :: proc(w: Byte_Writer, c: byte, n_written: ^int = nil) -> (err: Err return err } +// read_rune reads a single UTF-8 encoded Unicode codepoint and returns the rune and its size in bytes. read_rune :: proc(br: Rune_Reader, n_read: ^int = nil) -> (ch: rune, size: int, err: Error) { defer if err == nil && n_read != nil { n_read^ += size @@ -405,10 +436,12 @@ unread_rune :: proc(s: Rune_Scanner) -> Error { } +// write_string writes the contents of the string s to w. write_string :: proc(s: Writer, str: string, n_written: ^int = nil) -> (n: int, err: Error) { return write(s, transmute([]byte)str, n_written) } +// write_rune writes a UTF-8 encoded rune to w. write_rune :: proc(s: Writer, r: rune, n_written: ^int = nil) -> (size: int, err: Error) { defer if err == nil && n_written != nil { n_written^ += size @@ -430,12 +463,16 @@ write_rune :: proc(s: Writer, r: rune, n_written: ^int = nil) -> (size: int, err } - +// read_full expected exactly len(buf) bytes from r into buf. read_full :: proc(r: Reader, buf: []byte) -> (n: int, err: Error) { return read_at_least(r, buf, len(buf)) } +// read_at_least reads from r into buf until it has read at least min bytes. It returns the number +// of bytes copied and an error if fewer bytes were read. `.EOF` is only returned if no bytes were read. +// `.Unexpected_EOF` is returned when an `.EOF ` is returned by the passed Reader after reading +// fewer than min bytes. If len(buf) is less than min, `.Short_Buffer` is returned. read_at_least :: proc(r: Reader, buf: []byte, min: int) -> (n: int, err: Error) { if len(buf) < min { return 0, .Short_Buffer From fe0b5bf4e27912c49f6c5eab817cbf514b0b22e4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 23:28:59 +0000 Subject: [PATCH 027/117] Parse comments on enums fields --- src/check_expr.cpp | 7 +++++++ src/check_type.cpp | 23 ++++++++++++----------- src/docs_writer.cpp | 11 ++++++----- src/entity.cpp | 2 ++ src/parser.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- src/parser.hpp | 6 ++++++ 6 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 1742ef2d8..725b57f33 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9341,6 +9341,13 @@ gbString write_expr_to_string(gbString str, Ast *node, bool shorthand) { str = gb_string_appendc(str, " = "); str = write_expr_to_string(str, fv->value, shorthand); case_end; + case_ast_node(fv, EnumFieldValue, node); + str = write_expr_to_string(str, fv->name, shorthand); + if (fv->value) { + str = gb_string_appendc(str, " = "); + str = write_expr_to_string(str, fv->value, shorthand); + } + case_end; case_ast_node(ht, HelperType, node); str = gb_string_appendc(str, "#type "); diff --git a/src/check_type.cpp b/src/check_type.cpp index 2a7479d68..a6d82c86e 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -732,20 +732,19 @@ void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *named_type, Ast Ast *ident = nullptr; Ast *init = nullptr; u32 entity_flags = 0; - if (field->kind == Ast_FieldValue) { - ast_node(fv, FieldValue, field); - if (fv->field == nullptr || fv->field->kind != Ast_Ident) { - error(field, "An enum field's name must be an identifier"); - continue; - } - ident = fv->field; - init = fv->value; - } else if (field->kind == Ast_Ident) { - ident = field; - } else { + if (field->kind != Ast_EnumFieldValue) { error(field, "An enum field's name must be an identifier"); continue; } + ident = field->EnumFieldValue.name; + init = field->EnumFieldValue.value; + if (ident == nullptr || ident->kind != Ast_Ident) { + error(field, "An enum field's name must be an identifier"); + continue; + } + CommentGroup *docs = field->EnumFieldValue.docs; + CommentGroup *comment = field->EnumFieldValue.comment; + String name = ident->Ident.token.string; if (init != nullptr) { @@ -803,6 +802,8 @@ void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *named_type, Ast e->flags |= EntityFlag_Visited; e->state = EntityState_Resolved; e->Constant.flags |= entity_flags; + e->Constant.docs = docs; + e->Constant.comment = comment; if (scope_lookup_current(ctx->scope, name) != nullptr) { error(ident, "'%.*s' is already declared in this enumeration", LIT(name)); diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 825ca113f..b1b9450df 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -811,11 +811,12 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { comment = e->decl_info->comment; docs = e->decl_info->docs; } - if (!comment && e->kind == Entity_Variable) { - comment = e->Variable.comment; - } - if (!docs && e->kind == Entity_Variable) { - docs = e->Variable.docs; + if (e->kind == Entity_Variable) { + if (!comment) { comment = e->Variable.comment; } + if (!docs) { docs = e->Variable.docs; } + } else if (e->kind == Entity_Constant) { + if (!comment) { comment = e->Constant.comment; } + if (!docs) { docs = e->Constant.docs; } } String link_name = {}; diff --git a/src/entity.cpp b/src/entity.cpp index 0f8bfa456..a0438a9f4 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -161,6 +161,8 @@ struct Entity { ParameterValue param_value; u32 flags; i32 field_group_index; + CommentGroup *docs; + CommentGroup *comment; } Constant; struct { Ast *init_expr; // only used for some variables within procedure bodies diff --git a/src/parser.cpp b/src/parser.cpp index 076c698ff..ebe65cee1 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -693,6 +693,16 @@ Ast *ast_field_value(AstFile *f, Ast *field, Ast *value, Token eq) { return result; } + +Ast *ast_enum_field_value(AstFile *f, Ast *name, Ast *value, CommentGroup *docs, CommentGroup *comment) { + Ast *result = alloc_ast_node(f, Ast_EnumFieldValue); + result->EnumFieldValue.name = name; + result->EnumFieldValue.value = value; + result->EnumFieldValue.docs = docs; + result->EnumFieldValue.comment = comment; + return result; +} + Ast *ast_compound_lit(AstFile *f, Ast *type, Array const &elems, Token open, Token close) { Ast *result = alloc_ast_node(f, Ast_CompoundLit); result->CompoundLit.type = type; @@ -1689,6 +1699,36 @@ Array parse_element_list(AstFile *f) { return elems; } +Array parse_enum_field_list(AstFile *f) { + auto elems = array_make(heap_allocator()); + + while (f->curr_token.kind != Token_CloseBrace && + f->curr_token.kind != Token_EOF) { + CommentGroup *docs = f->lead_comment; + CommentGroup *comment = nullptr; + Ast *name = parse_value(f); + Ast *value = nullptr; + if (f->curr_token.kind == Token_Eq) { + Token eq = expect_token(f, Token_Eq); + value = parse_value(f); + } + + comment = f->line_comment; + + Ast *elem = ast_enum_field_value(f, name, value, docs, comment); + array_add(&elems, elem); + + if (!allow_token(f, Token_Comma)) { + break; + } + + if (!elem->EnumFieldValue.comment) { + elem->EnumFieldValue.comment = f->line_comment; + } + } + + return elems; +} Ast *parse_literal_value(AstFile *f, Ast *type) { Array elems = {}; @@ -2449,7 +2489,7 @@ Ast *parse_operand(AstFile *f, bool lhs) { skip_possible_newline_for_literal(f); Token open = expect_token(f, Token_OpenBrace); - Array values = parse_element_list(f); + Array values = parse_enum_field_list(f); Token close = expect_closing_brace_of_field_list(f); return ast_enum_type(f, token, base_type, values); diff --git a/src/parser.hpp b/src/parser.hpp index b83822cbf..b005a4465 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -383,6 +383,12 @@ AST_KIND(_ExprBegin, "", bool) \ void *sce_temp_data; \ }) \ AST_KIND(FieldValue, "field value", struct { Token eq; Ast *field, *value; }) \ + AST_KIND(EnumFieldValue, "enum field value", struct { \ + Ast *name; \ + Ast *value; \ + CommentGroup *docs; \ + CommentGroup *comment; \ + }) \ AST_KIND(TernaryIfExpr, "ternary if expression", struct { Ast *x, *cond, *y; }) \ AST_KIND(TernaryWhenExpr, "ternary when expression", struct { Ast *x, *cond, *y; }) \ AST_KIND(OrElseExpr, "or_else expression", struct { Ast *x; Token token; Ast *y; }) \ From c0479f1564119603f022f5f3d22dd8dc3a1e5983 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jan 2022 23:42:04 +0000 Subject: [PATCH 028/117] Handle line comment better --- src/parser.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index ebe65cee1..108411cd0 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1244,7 +1244,7 @@ CommentGroup *consume_comment_group(AstFile *f, isize n, isize *end_line_) { return comments; } -void comsume_comment_groups(AstFile *f, Token prev) { +void consume_comment_groups(AstFile *f, Token prev) { if (f->curr_token.kind == Token_Comment) { CommentGroup *comment = nullptr; isize end_line = 0; @@ -1288,7 +1288,7 @@ Token advance_token(AstFile *f) { if (ok) { switch (f->curr_token.kind) { case Token_Comment: - comsume_comment_groups(f, prev); + consume_comment_groups(f, prev); break; case Token_Semicolon: if (ignore_newlines(f) && f->curr_token.string == "\n") { @@ -1699,6 +1699,16 @@ Array parse_element_list(AstFile *f) { return elems; } +CommentGroup *consume_line_comment(AstFile *f) { + CommentGroup *comment = f->line_comment; + if (f->line_comment == f->lead_comment) { + f->lead_comment = nullptr; + } + f->line_comment = nullptr; + return comment; + +} + Array parse_enum_field_list(AstFile *f) { auto elems = array_make(heap_allocator()); @@ -1713,7 +1723,7 @@ Array parse_enum_field_list(AstFile *f) { value = parse_value(f); } - comment = f->line_comment; + comment = consume_line_comment(f); Ast *elem = ast_enum_field_value(f, name, value, docs, comment); array_add(&elems, elem); @@ -1723,7 +1733,7 @@ Array parse_enum_field_list(AstFile *f) { } if (!elem->EnumFieldValue.comment) { - elem->EnumFieldValue.comment = f->line_comment; + elem->EnumFieldValue.comment = consume_line_comment(f); } } @@ -5438,7 +5448,7 @@ 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) { - comsume_comment_groups(f, f->prev_token); + consume_comment_groups(f, f->prev_token); } CommentGroup *docs = f->lead_comment; From 65f8722afc0680b7b7fa47fd7060fd434243ae3c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 25 Jan 2022 12:18:10 +0100 Subject: [PATCH 029/117] zlib: update Huffman builder. --- core/compress/zlib/zlib.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index 9ae980042..4d575c7e6 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -111,9 +111,9 @@ ZFAST_MASK :: ((1 << ZFAST_BITS) - 1) */ Huffman_Table :: struct { fast: [1 << ZFAST_BITS]u16, - firstcode: [16]u16, + firstcode: [17]u16, maxcode: [17]int, - firstsymbol: [16]u16, + firstsymbol: [17]u16, size: [288]u8, value: [288]u16, } @@ -244,7 +244,7 @@ allocate_huffman_table :: proc(allocator := context.allocator) -> (z: ^Huffman_T @(optimization_mode="speed") build_huffman :: proc(z: ^Huffman_Table, code_lengths: []u8) -> (err: Error) { sizes: [HUFFMAN_MAX_BITS+1]int - next_code: [HUFFMAN_MAX_BITS]int + next_code: [HUFFMAN_MAX_BITS+1]int k := int(0) @@ -256,14 +256,14 @@ build_huffman :: proc(z: ^Huffman_Table, code_lengths: []u8) -> (err: Error) { } sizes[0] = 0 - for i in 1..<(HUFFMAN_MAX_BITS+1) { + for i in 1 ..< HUFFMAN_MAX_BITS { if sizes[i] > (1 << uint(i)) { return E_Deflate.Huffman_Bad_Sizes } } code := int(0) - for i in 1.. Date: Tue, 25 Jan 2022 12:39:06 +0000 Subject: [PATCH 030/117] Disable early return from `check_proc_info` --- src/checker.cpp | 13 +++++++------ src/llvm_backend_proc.cpp | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index b81d9987b..9be64e369 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4855,12 +4855,13 @@ bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *untyped, Proc return false; } - if (pt->is_polymorphic && pt->is_poly_specialized) { - if ((e->flags & EntityFlag_Used) == 0) { - // NOTE(bill, 2019-08-31): It was never used, don't check - return false; - } - } + // NOTE(bill, 2022-01-25): Appears to be not needed any more + // if (pt->is_polymorphic && pt->is_poly_specialized) { + // if ((e->flags & EntityFlag_Used) == 0) { + // // NOTE(bill, 2019-08-31): It was never used, don't check + // return false; + // } + // } bool bounds_check = (pi->tags & ProcTag_bounds_check) != 0; bool no_bounds_check = (pi->tags & ProcTag_no_bounds_check) != 0; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index b35c6c304..9f9fe7c7a 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -61,7 +61,7 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool ignore_body) GB_ASSERT(entity != nullptr); GB_ASSERT(entity->kind == Entity_Procedure); if (!entity->Procedure.is_foreign) { - GB_ASSERT(entity->flags & EntityFlag_ProcBodyChecked); + GB_ASSERT_MSG(entity->flags & EntityFlag_ProcBodyChecked, "%.*s :: %s", LIT(entity->token.string), type_to_string(entity->type)); } String link_name = {}; From a3e7b2baa1ede7ba328a9ec6b249051347ef4cae Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 25 Jan 2022 12:42:45 +0000 Subject: [PATCH 031/117] Revert change --- src/checker.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 9be64e369..b81d9987b 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4855,13 +4855,12 @@ bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *untyped, Proc return false; } - // NOTE(bill, 2022-01-25): Appears to be not needed any more - // if (pt->is_polymorphic && pt->is_poly_specialized) { - // if ((e->flags & EntityFlag_Used) == 0) { - // // NOTE(bill, 2019-08-31): It was never used, don't check - // return false; - // } - // } + if (pt->is_polymorphic && pt->is_poly_specialized) { + if ((e->flags & EntityFlag_Used) == 0) { + // NOTE(bill, 2019-08-31): It was never used, don't check + return false; + } + } bool bounds_check = (pi->tags & ProcTag_bounds_check) != 0; bool no_bounds_check = (pi->tags & ProcTag_no_bounds_check) != 0; From f16f1d932ef36c67dab0b7c8cd6898f9811d6f75 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 25 Jan 2022 14:24:15 +0000 Subject: [PATCH 032/117] Fix #1448 --- src/check_expr.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 725b57f33..276e9d0bb 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5755,8 +5755,12 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type ctx.curr_proc_sig = e->type; GB_ASSERT(decl->proc_lit->kind == Ast_ProcLit); - evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true); + bool ok = evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true); decl->where_clauses_evaluated = true; + + if (ok && (data.gen_entity->flags & EntityFlag_ProcBodyChecked) == 0) { + check_procedure_later(c, e->file, e->token, decl, e->type, decl->proc_lit->ProcLit.body, decl->proc_lit->ProcLit.tags); + } } return data; } @@ -5769,6 +5773,7 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type Entity *e = entity_of_node(ident); + CallArgumentData data = {}; CallArgumentError err = call_checker(c, call, proc_type, e, operands, CallArgumentMode_ShowErrors, &data); gb_unused(err); @@ -5777,7 +5782,6 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type if (entity_to_use != nullptr) { update_untyped_expr_type(c, operand->expr, entity_to_use->type, true); } - if (data.gen_entity != nullptr) { Entity *e = data.gen_entity; DeclInfo *decl = data.gen_entity->decl_info; @@ -5789,8 +5793,12 @@ CallArgumentData check_call_arguments(CheckerContext *c, Operand *operand, Type ctx.curr_proc_sig = e->type; GB_ASSERT(decl->proc_lit->kind == Ast_ProcLit); - evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true); + bool ok = evaluate_where_clauses(&ctx, call, decl->scope, &decl->proc_lit->ProcLit.where_clauses, true); decl->where_clauses_evaluated = true; + + if (ok && (data.gen_entity->flags & EntityFlag_ProcBodyChecked) == 0) { + check_procedure_later(c, e->file, e->token, decl, e->type, decl->proc_lit->ProcLit.body, decl->proc_lit->ProcLit.tags); + } } return data; } From dd3322ac1fb139b639306831849d0264dcd13d6c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 25 Jan 2022 14:34:48 +0000 Subject: [PATCH 033/117] Update all_main.odin to include all the crypto packages --- examples/all/all_main.odin | 81 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index c24238602..199f406f7 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -5,25 +5,66 @@ package all import bufio "core:bufio" import bytes "core:bytes" + import c "core:c" import libc "core:c/libc" + import compress "core:compress" import gzip "core:compress/gzip" import zlib "core:compress/zlib" + import container "core:container" +import bit_array "core:container/bit_array" +import priority_queue "core:container/priority_queue" +import queue "core:container/queue" +import small_array "core:container/queue" + +import crypto "core:crypto" +import blake "core:crypto/blake" +import blake2b "core:crypto/blake2b" +import blake2s "core:crypto/blake2s" +import chacha20 "core:crypto/chacha20" +import chacha20poly1305 "core:crypto/chacha20poly1305" +import gost "core:crypto/gost" +import groestl "core:crypto/groestl" +import haval "core:crypto/haval" +import jh "core:crypto/jh" +import keccak "core:crypto/keccak" +import md2 "core:crypto/md2" +import md4 "core:crypto/md4" +import md5 "core:crypto/md5" +import poly1305 "core:crypto/poly1305" +import ripemd "core:crypto/ripemd" +import sha1 "core:crypto/sha1" +import sha2 "core:crypto/sha2" +import sha3 "core:crypto/sha3" +import shake "core:crypto/shake" +import sm3 "core:crypto/sm3" +import streebog "core:crypto/streebog" +import tiger "core:crypto/tiger" +import tiger2 "core:crypto/tiger2" +import crypto_util "core:crypto/util" +import whirlpool "core:crypto/whirlpool" +import x25519 "core:crypto/x25519" + import dynlib "core:dynlib" + import encoding "core:encoding" import base32 "core:encoding/base32" import base64 "core:encoding/base64" import csv "core:encoding/csv" import hxa "core:encoding/hxa" import json "core:encoding/json" + import fmt "core:fmt" import hash "core:hash" + import image "core:image" import png "core:image/png" + import io "core:io" import log "core:log" + import math "core:math" import big "core:math/big" import bits "core:math/bits" @@ -32,16 +73,22 @@ import linalg "core:math/linalg" import glm "core:math/linalg/glsl" import hlm "core:math/linalg/hlsl" import rand "core:math/rand" + import mem "core:mem" +// import virtual "core:mem/virtual" + import ast "core:odin/ast" import doc_format "core:odin/doc-format" import odin_format "core:odin/format" import odin_parser "core:odin/parser" import odin_printer "core:odin/printer" import odin_tokenizer "core:odin/tokenizer" + import os "core:os" + import slashpath "core:path/slashpath" import filepath "core:path/filepath" + import reflect "core:reflect" import runtime "core:runtime" import slice "core:slice" @@ -50,9 +97,11 @@ import strconv "core:strconv" import strings "core:strings" import sync "core:sync" import sync2 "core:sync/sync2" +import testing "core:testing" import scanner "core:text/scanner" import thread "core:thread" import time "core:time" + import unicode "core:unicode" import utf8 "core:unicode/utf8" import utf16 "core:unicode/utf16" @@ -68,6 +117,37 @@ _ :: compress _ :: gzip _ :: zlib _ :: container +_ :: bit_array +_ :: priority_queue +_ :: queue +_ :: small_array +_ :: crypto +_ :: blake +_ :: blake2b +_ :: blake2s +_ :: chacha20 +_ :: chacha20poly1305 +_ :: gost +_ :: groestl +_ :: haval +_ :: jh +_ :: keccak +_ :: md2 +_ :: md4 +_ :: md5 +_ :: poly1305 +_ :: ripemd +_ :: sha1 +_ :: sha2 +_ :: sha3 +_ :: shake +_ :: sm3 +_ :: streebog +_ :: tiger +_ :: tiger2 +_ :: crypto_util +_ :: whirlpool +_ :: x25519 _ :: dynlib _ :: encoding _ :: base32 @@ -107,6 +187,7 @@ _ :: strconv _ :: strings _ :: sync _ :: sync2 +_ :: testing _ :: scanner _ :: thread _ :: time From 515fd2a228835afa71cefec645b906729cda399e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 25 Jan 2022 17:08:32 +0100 Subject: [PATCH 034/117] bit_array: Fix initial size. --- core/container/bit_array/bit_array.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 61f6f86e8..0fa80c623 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -88,7 +88,7 @@ create :: proc(max_index: int, min_index := 0, allocator := context.allocator) - res = Bit_Array{ bias = min_index, } - return res, resize_if_needed(&res, size_in_bits) + return res, resize_if_needed(&res, legs) } /* From 1bf8328606ba83f943eb2568c89dab38b0b1dd94 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 25 Jan 2022 16:40:25 +0000 Subject: [PATCH 035/117] Strip unneeded semicolons --- core/crypto/blake/blake.odin | 8 ++++---- core/crypto/blake2b/blake2b.odin | 2 +- core/crypto/blake2s/blake2s.odin | 2 +- core/crypto/gost/gost.odin | 2 +- core/crypto/groestl/groestl.odin | 8 ++++---- core/crypto/haval/haval.odin | 30 ++++++++++++++-------------- core/crypto/jh/jh.odin | 8 ++++---- core/crypto/keccak/keccak.odin | 8 ++++---- core/crypto/md2/md2.odin | 2 +- core/crypto/md4/md4.odin | 2 +- core/crypto/md5/md5.odin | 2 +- core/crypto/ripemd/ripemd.odin | 8 ++++---- core/crypto/sha1/sha1.odin | 2 +- core/crypto/sha2/sha2.odin | 8 ++++---- core/crypto/sha3/sha3.odin | 8 ++++---- core/crypto/shake/shake.odin | 4 ++-- core/crypto/sm3/sm3.odin | 2 +- core/crypto/streebog/streebog.odin | 4 ++-- core/crypto/tiger/tiger.odin | 6 +++--- core/crypto/tiger2/tiger2.odin | 6 +++--- core/crypto/whirlpool/whirlpool.odin | 2 +- 21 files changed, 62 insertions(+), 62 deletions(-) diff --git a/core/crypto/blake/blake.odin b/core/crypto/blake/blake.odin index 81924ab1e..5fc0a02b9 100644 --- a/core/crypto/blake/blake.odin +++ b/core/crypto/blake/blake.odin @@ -44,7 +44,7 @@ hash_bytes_224 :: proc "contextless" (data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224 will hash the given input and write the @@ -123,7 +123,7 @@ hash_bytes_256 :: proc "contextless" (data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -202,7 +202,7 @@ hash_bytes_384 :: proc "contextless" (data: []byte) -> [DIGEST_SIZE_384]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_384 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_384(transmute([]byte)(data), hash); + hash_bytes_to_buffer_384(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_384 will hash the given input and write the @@ -281,7 +281,7 @@ hash_bytes_512 :: proc "contextless" (data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/blake2b/blake2b.odin b/core/crypto/blake2b/blake2b.odin index 6d4689b88..e75d74197 100644 --- a/core/crypto/blake2b/blake2b.odin +++ b/core/crypto/blake2b/blake2b.odin @@ -46,7 +46,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/blake2s/blake2s.odin b/core/crypto/blake2s/blake2s.odin index ad2e800fd..831335081 100644 --- a/core/crypto/blake2s/blake2s.odin +++ b/core/crypto/blake2s/blake2s.odin @@ -47,7 +47,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/gost/gost.odin b/core/crypto/gost/gost.odin index eed684f72..1d0274fae 100644 --- a/core/crypto/gost/gost.odin +++ b/core/crypto/gost/gost.odin @@ -41,7 +41,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/groestl/groestl.odin b/core/crypto/groestl/groestl.odin index 5434e31e0..8e5a2440d 100644 --- a/core/crypto/groestl/groestl.odin +++ b/core/crypto/groestl/groestl.odin @@ -44,7 +44,7 @@ hash_bytes_224 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224 will hash the given input and write the @@ -123,7 +123,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -202,7 +202,7 @@ hash_bytes_384 :: proc(data: []byte) -> [DIGEST_SIZE_384]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_384 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_384(transmute([]byte)(data), hash); + hash_bytes_to_buffer_384(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_384 will hash the given input and write the @@ -281,7 +281,7 @@ hash_bytes_512 :: proc(data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/haval/haval.odin b/core/crypto/haval/haval.odin index 442a348e9..811ecf95d 100644 --- a/core/crypto/haval/haval.odin +++ b/core/crypto/haval/haval.odin @@ -50,7 +50,7 @@ hash_bytes_128_3 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128_3 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128_3(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128_3(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128_3 will hash the given input and write the @@ -135,7 +135,7 @@ hash_bytes_128_4 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128_4 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128_4(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128_4(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128_4 will hash the given input and write the @@ -220,7 +220,7 @@ hash_bytes_128_5 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128_5 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128_5(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128_5(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128_5 will hash the given input and write the @@ -305,7 +305,7 @@ hash_bytes_160_3 :: proc(data: []byte) -> [DIGEST_SIZE_160]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_160_3 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_160_3(transmute([]byte)(data), hash); + hash_bytes_to_buffer_160_3(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_160_3 will hash the given input and write the @@ -390,7 +390,7 @@ hash_bytes_160_4 :: proc(data: []byte) -> [DIGEST_SIZE_160]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_160_4 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_160_4(transmute([]byte)(data), hash); + hash_bytes_to_buffer_160_4(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_160_4 will hash the given input and write the @@ -475,7 +475,7 @@ hash_bytes_160_5 :: proc(data: []byte) -> [DIGEST_SIZE_160]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_160_5 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_160_5(transmute([]byte)(data), hash); + hash_bytes_to_buffer_160_5(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_160_5 will hash the given input and write the @@ -560,7 +560,7 @@ hash_bytes_192_3 :: proc(data: []byte) -> [DIGEST_SIZE_192]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_192_3 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_192_3(transmute([]byte)(data), hash); + hash_bytes_to_buffer_192_3(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_192_3 will hash the given input and write the @@ -645,7 +645,7 @@ hash_bytes_192_4 :: proc(data: []byte) -> [DIGEST_SIZE_192]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_192_4 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_192_4(transmute([]byte)(data), hash); + hash_bytes_to_buffer_192_4(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_192_4 will hash the given input and write the @@ -730,7 +730,7 @@ hash_bytes_192_5 :: proc(data: []byte) -> [DIGEST_SIZE_192]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_192_5 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_192_5(transmute([]byte)(data), hash); + hash_bytes_to_buffer_192_5(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_192_5 will hash the given input and write the @@ -815,7 +815,7 @@ hash_bytes_224_3 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224_3 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224_3(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224_3(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224_3 will hash the given input and write the @@ -900,7 +900,7 @@ hash_bytes_224_4 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224_4 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224_4(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224_4(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224_4 will hash the given input and write the @@ -985,7 +985,7 @@ hash_bytes_224_5 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224_5 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224_5(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224_5(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224_5 will hash the given input and write the @@ -1070,7 +1070,7 @@ hash_bytes_256_3 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256_3 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256_3(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256_3(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256_3 will hash the given input and write the @@ -1155,7 +1155,7 @@ hash_bytes_256_4 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256_4 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256_4(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256_4(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256_4 will hash the given input and write the @@ -1240,7 +1240,7 @@ hash_bytes_256_5 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256_5 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256_5(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256_5(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256_5 will hash the given input and write the diff --git a/core/crypto/jh/jh.odin b/core/crypto/jh/jh.odin index 4ebc0e5cb..42c2d1d34 100644 --- a/core/crypto/jh/jh.odin +++ b/core/crypto/jh/jh.odin @@ -44,7 +44,7 @@ hash_bytes_224 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224 will hash the given input and write the @@ -123,7 +123,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -202,7 +202,7 @@ hash_bytes_384 :: proc(data: []byte) -> [DIGEST_SIZE_384]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_384 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_384(transmute([]byte)(data), hash); + hash_bytes_to_buffer_384(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_384 will hash the given input and write the @@ -281,7 +281,7 @@ hash_bytes_512 :: proc(data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/keccak/keccak.odin b/core/crypto/keccak/keccak.odin index f5d4826b1..aeb5aac52 100644 --- a/core/crypto/keccak/keccak.odin +++ b/core/crypto/keccak/keccak.odin @@ -49,7 +49,7 @@ hash_bytes_224 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224 will hash the given input and write the @@ -131,7 +131,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -213,7 +213,7 @@ hash_bytes_384 :: proc(data: []byte) -> [DIGEST_SIZE_384]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_384 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_384(transmute([]byte)(data), hash); + hash_bytes_to_buffer_384(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_384 will hash the given input and write the @@ -295,7 +295,7 @@ hash_bytes_512 :: proc(data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/md2/md2.odin b/core/crypto/md2/md2.odin index 102c1b8b4..711e6e9f6 100644 --- a/core/crypto/md2/md2.odin +++ b/core/crypto/md2/md2.odin @@ -40,7 +40,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/md4/md4.odin b/core/crypto/md4/md4.odin index d944daa1d..b2651225b 100644 --- a/core/crypto/md4/md4.odin +++ b/core/crypto/md4/md4.odin @@ -44,7 +44,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/md5/md5.odin b/core/crypto/md5/md5.odin index 9129e6384..30a556102 100644 --- a/core/crypto/md5/md5.odin +++ b/core/crypto/md5/md5.odin @@ -43,7 +43,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/ripemd/ripemd.odin b/core/crypto/ripemd/ripemd.odin index c475c4803..702d29037 100644 --- a/core/crypto/ripemd/ripemd.odin +++ b/core/crypto/ripemd/ripemd.odin @@ -45,7 +45,7 @@ hash_bytes_128 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128 will hash the given input and write the @@ -121,7 +121,7 @@ hash_bytes_160 :: proc(data: []byte) -> [DIGEST_SIZE_160]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_160 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_160(transmute([]byte)(data), hash); + hash_bytes_to_buffer_160(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_160 will hash the given input and write the @@ -197,7 +197,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -273,7 +273,7 @@ hash_bytes_320 :: proc(data: []byte) -> [DIGEST_SIZE_320]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_320 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_320(transmute([]byte)(data), hash); + hash_bytes_to_buffer_320(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_320 will hash the given input and write the diff --git a/core/crypto/sha1/sha1.odin b/core/crypto/sha1/sha1.odin index e8df3c7f6..b0dbd7dc8 100644 --- a/core/crypto/sha1/sha1.odin +++ b/core/crypto/sha1/sha1.odin @@ -43,7 +43,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/sha2/sha2.odin b/core/crypto/sha2/sha2.odin index 2178b70b5..7c7b2da81 100644 --- a/core/crypto/sha2/sha2.odin +++ b/core/crypto/sha2/sha2.odin @@ -48,7 +48,7 @@ hash_bytes_224 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224 will hash the given input and write the @@ -127,7 +127,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -206,7 +206,7 @@ hash_bytes_384 :: proc(data: []byte) -> [DIGEST_SIZE_384]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_384 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_384(transmute([]byte)(data), hash); + hash_bytes_to_buffer_384(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_384 will hash the given input and write the @@ -285,7 +285,7 @@ hash_bytes_512 :: proc(data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/sha3/sha3.odin b/core/crypto/sha3/sha3.odin index 2eceeaff6..1202f8b23 100644 --- a/core/crypto/sha3/sha3.odin +++ b/core/crypto/sha3/sha3.odin @@ -47,7 +47,7 @@ hash_bytes_224 :: proc(data: []byte) -> [DIGEST_SIZE_224]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_224 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_224(transmute([]byte)(data), hash); + hash_bytes_to_buffer_224(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_224 will hash the given input and write the @@ -126,7 +126,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -205,7 +205,7 @@ hash_bytes_384 :: proc(data: []byte) -> [DIGEST_SIZE_384]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_384 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_384(transmute([]byte)(data), hash); + hash_bytes_to_buffer_384(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_384 will hash the given input and write the @@ -284,7 +284,7 @@ hash_bytes_512 :: proc(data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/shake/shake.odin b/core/crypto/shake/shake.odin index 9fdc3ebf1..525dcfbd3 100644 --- a/core/crypto/shake/shake.odin +++ b/core/crypto/shake/shake.odin @@ -46,7 +46,7 @@ hash_bytes_128 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128 will hash the given input and write the @@ -128,7 +128,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the diff --git a/core/crypto/sm3/sm3.odin b/core/crypto/sm3/sm3.odin index e72973e33..74c9f22e2 100644 --- a/core/crypto/sm3/sm3.odin +++ b/core/crypto/sm3/sm3.odin @@ -42,7 +42,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the diff --git a/core/crypto/streebog/streebog.odin b/core/crypto/streebog/streebog.odin index deb71120d..f85977cba 100644 --- a/core/crypto/streebog/streebog.odin +++ b/core/crypto/streebog/streebog.odin @@ -44,7 +44,7 @@ hash_bytes_256 :: proc(data: []byte) -> [DIGEST_SIZE_256]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_256 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_256(transmute([]byte)(data), hash); + hash_bytes_to_buffer_256(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_256 will hash the given input and write the @@ -122,7 +122,7 @@ hash_bytes_512 :: proc(data: []byte) -> [DIGEST_SIZE_512]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_512 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_512(transmute([]byte)(data), hash); + hash_bytes_to_buffer_512(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_512 will hash the given input and write the diff --git a/core/crypto/tiger/tiger.odin b/core/crypto/tiger/tiger.odin index 4ea80c66c..cf6159fad 100644 --- a/core/crypto/tiger/tiger.odin +++ b/core/crypto/tiger/tiger.odin @@ -45,7 +45,7 @@ hash_bytes_128 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128 will hash the given input and write the @@ -124,7 +124,7 @@ hash_bytes_160 :: proc(data: []byte) -> [DIGEST_SIZE_160]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_160 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_160(transmute([]byte)(data), hash); + hash_bytes_to_buffer_160(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_160 will hash the given input and write the @@ -203,7 +203,7 @@ hash_bytes_192 :: proc(data: []byte) -> [DIGEST_SIZE_192]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_192 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_192(transmute([]byte)(data), hash); + hash_bytes_to_buffer_192(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_192 will hash the given input and write the diff --git a/core/crypto/tiger2/tiger2.odin b/core/crypto/tiger2/tiger2.odin index 84333f344..e8f2c4edb 100644 --- a/core/crypto/tiger2/tiger2.odin +++ b/core/crypto/tiger2/tiger2.odin @@ -45,7 +45,7 @@ hash_bytes_128 :: proc(data: []byte) -> [DIGEST_SIZE_128]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_128 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_128(transmute([]byte)(data), hash); + hash_bytes_to_buffer_128(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_128 will hash the given input and write the @@ -124,7 +124,7 @@ hash_bytes_160 :: proc(data: []byte) -> [DIGEST_SIZE_160]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_160 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_160(transmute([]byte)(data), hash); + hash_bytes_to_buffer_160(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_160 will hash the given input and write the @@ -203,7 +203,7 @@ hash_bytes_192 :: proc(data: []byte) -> [DIGEST_SIZE_192]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer_192 :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer_192(transmute([]byte)(data), hash); + hash_bytes_to_buffer_192(transmute([]byte)(data), hash) } // hash_bytes_to_buffer_192 will hash the given input and write the diff --git a/core/crypto/whirlpool/whirlpool.odin b/core/crypto/whirlpool/whirlpool.odin index 255f57bc2..0cfef7c6b 100644 --- a/core/crypto/whirlpool/whirlpool.odin +++ b/core/crypto/whirlpool/whirlpool.odin @@ -42,7 +42,7 @@ hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte { // computed hash to the second parameter. // It requires that the destination buffer is at least as big as the digest size hash_string_to_buffer :: proc(data: string, hash: []byte) { - hash_bytes_to_buffer(transmute([]byte)(data), hash); + hash_bytes_to_buffer(transmute([]byte)(data), hash) } // hash_bytes_to_buffer will hash the given input and write the From fb86c23dbd4c6e9dc82fcc72deb1ad59af5e07f0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 25 Jan 2022 16:41:31 +0000 Subject: [PATCH 036/117] Keep -vet happy --- core/container/queue/queue.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/container/queue/queue.odin b/core/container/queue/queue.odin index feca6934c..8ca3a85ac 100644 --- a/core/container/queue/queue.odin +++ b/core/container/queue/queue.odin @@ -2,6 +2,7 @@ package container_queue import "core:builtin" import "core:runtime" +_ :: runtime // Dynamically resizable double-ended queue/ring-buffer Queue :: struct($T: typeid) { From 081a5a52a621f3577255b30a4fa35c9b458d5689 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 26 Jan 2022 16:09:22 +0000 Subject: [PATCH 037/117] Add ODIN_ERROR_POS_STYLE environment variable Allowing for two different error message styles: default or odin path(line:column) message unix path:line:column: message --- src/build_settings.cpp | 51 +++++++++++++++++++++++++++++++++++++++++- src/error.cpp | 4 ++++ src/tokenizer.cpp | 8 ------- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index b4a934ec8..d7253f865 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -165,6 +165,11 @@ enum TimingsExportFormat : i32 { TimingsExportCSV = 2, }; +enum ErrorPosStyle { + ErrorPosStyle_Default, // path(line:column) msg + ErrorPosStyle_Unix, // path:line:column: msg +}; + // This stores the information for the specify architecture of this build struct BuildContext { // Constants @@ -175,7 +180,9 @@ struct BuildContext { String ODIN_ROOT; // Odin ROOT bool ODIN_DEBUG; // Odin in debug mode bool ODIN_DISABLE_ASSERT; // Whether the default 'assert' et al is disabled in code or not -bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil" allocator or not (i.e. it does nothing) + bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil" allocator or not (i.e. it does nothing) + + ErrorPosStyle ODIN_ERROR_POS_STYLE; TargetEndianKind endian_kind; @@ -254,6 +261,7 @@ bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil isize thread_count; PtrMap defined_values; + }; @@ -843,6 +851,22 @@ bool has_asm_extension(String const &path) { return false; } +// temporary +char *token_pos_to_string(TokenPos const &pos) { + gbString s = gb_string_make_reserve(temporary_allocator(), 128); + String file = get_file_path_string(pos.file_id); + switch (build_context.ODIN_ERROR_POS_STYLE) { + default: /*fallthrough*/ + case ErrorPosStyle_Default: + s = gb_string_append_fmt(s, "%.*s(%d:%d)", LIT(file), pos.line, pos.column); + break; + case ErrorPosStyle_Unix: + s = gb_string_append_fmt(s, "%.*s:%d:%d:", LIT(file), pos.line, pos.column); + break; + } + return s; +} + void init_build_context(TargetMetrics *cross_target) { BuildContext *bc = &build_context; @@ -855,6 +879,31 @@ void init_build_context(TargetMetrics *cross_target) { bc->ODIN_VENDOR = str_lit("odin"); bc->ODIN_VERSION = ODIN_VERSION; bc->ODIN_ROOT = odin_root_dir(); + + { + char const *found = gb_get_env("ODIN_ERROR_POS_STYLE", permanent_allocator()); + if (found) { + ErrorPosStyle kind = ErrorPosStyle_Default; + String style = make_string_c(found); + style = string_trim_whitespace(style); + if (style == "" || style == "default" || style == "odin") { + kind = ErrorPosStyle_Default; + } else if (style == "unix" || style == "gcc" || style == "clang" || style == "llvm") { + kind = ErrorPosStyle_Unix; + } else { + gb_printf_err("Invalid ODIN_ERROR_POS_STYLE: got %.*s\n", LIT(style)); + gb_printf_err("Valid formats:\n"); + gb_printf_err("\t\"default\" or \"odin\"\n"); + gb_printf_err("\t\tpath(line:column) message)\n"); + gb_printf_err("\t\"unix\"\n"); + gb_printf_err("\t\tpath:line:column: message)\n"); + gb_exit(1); + } + + build_context.ODIN_ERROR_POS_STYLE = kind; + } + } + bc->copy_file_contents = true; diff --git a/src/error.cpp b/src/error.cpp index b08ff99df..faf4d11fb 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -33,6 +33,10 @@ void init_global_error_collector(void) { } +// temporary +// defined in build_settings.cpp +char *token_pos_to_string(TokenPos const &pos); + bool set_file_path_string(i32 index, String const &path) { bool ok = false; GB_ASSERT(index >= 0); diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 20815fd16..40bc5c220 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -201,14 +201,6 @@ struct TokenPos { i32 column; // starting at 1 }; -// temporary -char *token_pos_to_string(TokenPos const &pos) { - gbString s = gb_string_make_reserve(temporary_allocator(), 128); - String file = get_file_path_string(pos.file_id); - s = gb_string_append_fmt(s, "%.*s(%d:%d)", LIT(file), pos.line, pos.column); - return s; -} - i32 token_pos_cmp(TokenPos const &a, TokenPos const &b) { if (a.offset != b.offset) { return (a.offset < b.offset) ? -1 : +1; From b190404b217f59b9bed65bdf588a4e0369f60a95 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 26 Jan 2022 16:37:16 +0000 Subject: [PATCH 038/117] Fix double map dereference indexing --- src/llvm_backend_expr.cpp | 6 ++++-- src/llvm_backend_general.cpp | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1f0ed6434..9b2e26434 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3460,7 +3460,8 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) { GB_ASSERT_MSG(is_type_indexable(t), "%s %s", type_to_string(t), expr_to_string(expr)); if (is_type_map(t)) { - lbValue map_val = lb_build_addr_ptr(p, ie->expr); + lbAddr map_addr = lb_build_addr(p, ie->expr); + lbValue map_val = lb_addr_load(p, map_addr); if (deref) { map_val = lb_emit_load(p, map_val); } @@ -3469,7 +3470,8 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) { key = lb_emit_conv(p, key, t->Map.key); Type *result_type = type_of_expr(expr); - return lb_addr_map(map_val, key, t, result_type); + lbValue map_ptr = lb_address_from_load_or_generate_local(p, map_val); + return lb_addr_map(map_ptr, key, t, result_type); } switch (t->kind) { diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 17eeb0bea..998dce88f 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -271,6 +271,10 @@ lbAddr lb_addr(lbValue addr) { lbAddr lb_addr_map(lbValue addr, lbValue map_key, Type *map_type, Type *map_result) { + GB_ASSERT(is_type_pointer(addr.type)); + Type *mt = type_deref(addr.type); + GB_ASSERT(is_type_map(mt)); + lbAddr v = {lbAddr_Map, addr}; v.map.key = map_key; v.map.type = map_type; From 74174eb4ae796d6c161839d91c301229a1884713 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 26 Jan 2022 16:38:12 +0000 Subject: [PATCH 039/117] Remove spurious `)` --- src/build_settings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d7253f865..96339be29 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -894,9 +894,9 @@ void init_build_context(TargetMetrics *cross_target) { gb_printf_err("Invalid ODIN_ERROR_POS_STYLE: got %.*s\n", LIT(style)); gb_printf_err("Valid formats:\n"); gb_printf_err("\t\"default\" or \"odin\"\n"); - gb_printf_err("\t\tpath(line:column) message)\n"); + gb_printf_err("\t\tpath(line:column) message\n"); gb_printf_err("\t\"unix\"\n"); - gb_printf_err("\t\tpath:line:column: message)\n"); + gb_printf_err("\t\tpath:line:column: message\n"); gb_exit(1); } From 070b4507686570335cb3624ef1ede6f442bd4866 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 26 Jan 2022 17:34:39 +0000 Subject: [PATCH 040/117] Add `ODIN_ERROR_POS_STYLE` constant and change `runtime.print_caller_location` based on that constant --- core/runtime/print.odin | 20 +++++++++++++++----- src/build_settings.cpp | 2 ++ src/checker.cpp | 10 ++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/core/runtime/print.odin b/core/runtime/print.odin index 8a14eba08..8c0b65864 100644 --- a/core/runtime/print.odin +++ b/core/runtime/print.odin @@ -143,11 +143,21 @@ print_int :: proc "contextless" (x: int) { print_i64(i64(x)) } print_caller_location :: proc "contextless" (using loc: Source_Code_Location) { print_string(file_path) - print_byte('(') - print_u64(u64(line)) - print_byte(':') - print_u64(u64(column)) - print_byte(')') + when ODIN_ERROR_POS_STYLE == .Default { + print_byte('(') + print_u64(u64(line)) + print_byte(':') + print_u64(u64(column)) + print_byte(')') + } else when ODIN_ERROR_POS_STYLE == .Unix { + print_byte(':') + print_u64(u64(line)) + print_byte(':') + print_u64(u64(column)) + print_byte(':') + } else { + #panic("unhandled ODIN_ERROR_POS_STYLE") + } } print_typeid :: proc "contextless" (id: typeid) { if id == nil { diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 96339be29..610e4f847 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -168,6 +168,8 @@ enum TimingsExportFormat : i32 { enum ErrorPosStyle { ErrorPosStyle_Default, // path(line:column) msg ErrorPosStyle_Unix, // path:line:column: msg + + ErrorPosStyle_COUNT }; // This stores the information for the specify architecture of this build diff --git a/src/checker.cpp b/src/checker.cpp index b81d9987b..e0c756bb8 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -893,6 +893,16 @@ void init_universal(void) { add_global_enum_constant(fields, "ODIN_ENDIAN", target_endians[bc->metrics.arch]); } + { + GlobalEnumValue values[ErrorPosStyle_COUNT] = { + {"Default", ErrorPosStyle_Default}, + {"Unix", ErrorPosStyle_Unix}, + }; + + auto fields = add_global_enum_type(str_lit("Odin_Error_Pos_Style_Type"), values, gb_count_of(values)); + add_global_enum_constant(fields, "ODIN_ERROR_POS_STYLE", build_context.ODIN_ERROR_POS_STYLE); + } + add_global_bool_constant("ODIN_DEBUG", bc->ODIN_DEBUG); add_global_bool_constant("ODIN_DISABLE_ASSERT", bc->ODIN_DISABLE_ASSERT); From 498f68c06b64b9e5bd6a8bd2aef2fb71ecabe5fc Mon Sep 17 00:00:00 2001 From: CiD- Date: Wed, 26 Jan 2022 14:37:15 -0500 Subject: [PATCH 041/117] avoid segfault on map resize --- src/llvm_backend_general.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 998dce88f..2fc21b534 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1602,8 +1602,9 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { return llvm_type; } llvm_type = LLVMStructCreateNamed(ctx, name); + LLVMTypeRef found_val = *found; map_set(&m->types, type, llvm_type); - lb_clone_struct_type(llvm_type, *found); + lb_clone_struct_type(llvm_type, found_val); return llvm_type; } } From 7e11f3cc4bd888ab57beedd94952a5ead8888d2e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 26 Jan 2022 23:31:47 +0000 Subject: [PATCH 042/117] Update doc format to allow for aliases --- src/docs_format.cpp | 13 +++++++++++-- src/docs_writer.cpp | 33 ++++++++++++++------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/docs_format.cpp b/src/docs_format.cpp index 39f2e307c..01320e2b9 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -154,6 +154,7 @@ enum OdinDocEntityKind : u32 { OdinDocEntity_ProcGroup = 5, OdinDocEntity_ImportName = 6, OdinDocEntity_LibraryName = 7, + OdinDocEntity_Builtin = 8, }; enum OdinDocEntityFlag : u64 { @@ -170,6 +171,8 @@ enum OdinDocEntityFlag : u64 { OdinDocEntityFlag_Type_Alias = 1ull<<20, + OdinDocEntityFlag_Builtin_Procedure = 1ull<<30, + OdinDocEntityFlag_Var_Thread_Local = 1ull<<40, OdinDocEntityFlag_Var_Static = 1ull<<41, @@ -201,15 +204,21 @@ enum OdinDocPkgFlags : u32 { OdinDocPkgFlag_Init = 1<<2, }; +struct OdinDocScopeEntry { + OdinDocString name; + OdinDocEntityIndex entity; +}; + struct OdinDocPkg { OdinDocString fullpath; OdinDocString name; u32 flags; OdinDocString docs; - OdinDocArray files; - OdinDocArray entities; + OdinDocArray files; + OdinDocArray entries; }; + struct OdinDocHeader { OdinDocHeaderBase base; diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index b1b9450df..290153ea3 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -819,6 +819,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { if (!docs) { docs = e->Constant.docs; } } + String name = e->token.string; String link_name = {}; OdinDocEntityKind kind = OdinDocEntity_Invalid; @@ -834,6 +835,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { case Entity_ProcGroup: kind = OdinDocEntity_ProcGroup; break; case Entity_ImportName: kind = OdinDocEntity_ImportName; break; case Entity_LibraryName: kind = OdinDocEntity_LibraryName; break; + case Entity_Builtin: kind = OdinDocEntity_Builtin; break; } switch (e->kind) { @@ -899,7 +901,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { doc_entity.kind = kind; doc_entity.flags = flags; doc_entity.pos = odin_doc_token_pos_cast(w, e->token.pos); - doc_entity.name = odin_doc_write_string(w, e->token.string); + doc_entity.name = odin_doc_write_string(w, name); doc_entity.type = 0; // Set later doc_entity.init_string = init_string; doc_entity.comment = odin_doc_comment_group_string(w, comment); @@ -976,7 +978,7 @@ void odin_doc_update_entities(OdinDocWriter *w) { -OdinDocArray odin_doc_add_pkg_entities(OdinDocWriter *w, AstPackage *pkg) { +OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPackage *pkg) { if (pkg->scope == nullptr) { return {}; } @@ -984,14 +986,14 @@ OdinDocArray odin_doc_add_pkg_entities(OdinDocWriter *w, Ast return {}; } - auto entities = array_make(heap_allocator(), 0, pkg->scope->elements.entries.count); - defer (array_free(&entities)); + auto entries = array_make(heap_allocator(), 0, w->entity_cache.entries.count); + defer (array_free(&entries)); for_array(i, pkg->scope->elements.entries) { + String name = pkg->scope->elements.entries[i].key.string; Entity *e = pkg->scope->elements.entries[i].value; switch (e->kind) { case Entity_Invalid: - case Entity_Builtin: case Entity_Nil: case Entity_Label: continue; @@ -1002,18 +1004,10 @@ OdinDocArray odin_doc_add_pkg_entities(OdinDocWriter *w, Ast case Entity_ProcGroup: case Entity_ImportName: case Entity_LibraryName: + case Entity_Builtin: // Fine break; } - array_add(&entities, e); - } - gb_sort_array(entities.data, entities.count, cmp_entities_for_printing); - - auto entity_indices = array_make(heap_allocator(), 0, w->entity_cache.entries.count); - defer (array_free(&entity_indices)); - - for_array(i, entities) { - Entity *e = entities[i]; if (e->pkg != pkg) { continue; } @@ -1024,12 +1018,13 @@ OdinDocArray odin_doc_add_pkg_entities(OdinDocWriter *w, Ast continue; } - OdinDocEntityIndex doc_entity_index = 0; - doc_entity_index = odin_doc_add_entity(w, e); - array_add(&entity_indices, doc_entity_index); + OdinDocScopeEntry entry = {}; + entry.name = odin_doc_write_string(w, name); + entry.entity = odin_doc_add_entity(w, e); + array_add(&entries, entry); } - return odin_write_slice(w, entity_indices.data, entity_indices.count); + return odin_write_slice(w, entries.data, entries.count); } @@ -1097,7 +1092,7 @@ void odin_doc_write_docs(OdinDocWriter *w) { } doc_pkg.files = odin_write_slice(w, file_indices.data, file_indices.count); - doc_pkg.entities = odin_doc_add_pkg_entities(w, pkg); + doc_pkg.entries = odin_doc_add_pkg_entries(w, pkg); if (dst) { *dst = doc_pkg; From 32b37f3429c18d9514091f4bde0a842eb2e70da7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 00:08:05 +0000 Subject: [PATCH 043/117] Support built-in procedures for doc format --- src/docs_format.cpp | 5 +++-- src/docs_writer.cpp | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/docs_format.cpp b/src/docs_format.cpp index 01320e2b9..7ce93d2bf 100644 --- a/src/docs_format.cpp +++ b/src/docs_format.cpp @@ -15,7 +15,7 @@ struct OdinDocVersionType { #define OdinDocVersionType_Major 0 #define OdinDocVersionType_Minor 2 -#define OdinDocVersionType_Patch 3 +#define OdinDocVersionType_Patch 4 struct OdinDocHeaderBase { u8 magic[8]; @@ -171,7 +171,8 @@ enum OdinDocEntityFlag : u64 { OdinDocEntityFlag_Type_Alias = 1ull<<20, - OdinDocEntityFlag_Builtin_Procedure = 1ull<<30, + OdinDocEntityFlag_Builtin_Pkg_Builtin = 1ull<<30, + OdinDocEntityFlag_Builtin_Pkg_Intrinsics = 1ull<<31, OdinDocEntityFlag_Var_Thread_Local = 1ull<<40, OdinDocEntityFlag_Var_Static = 1ull<<41, diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 290153ea3..8b752ab71 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -821,6 +821,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { String name = e->token.string; String link_name = {}; + TokenPos pos = e->token.pos; OdinDocEntityKind kind = OdinDocEntity_Invalid; u64 flags = 0; @@ -865,6 +866,24 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { if (e->Procedure.is_export) { flags |= OdinDocEntityFlag_Export; } link_name = e->Procedure.link_name; break; + case Entity_Builtin: + { + auto bp = builtin_procs[e->Builtin.id]; + pos = {}; + name = bp.name; + switch (bp.pkg) { + case BuiltinProcPkg_builtin: + flags |= OdinDocEntityFlag_Builtin_Pkg_Builtin; + break; + case BuiltinProcPkg_intrinsics: + flags |= OdinDocEntityFlag_Builtin_Pkg_Intrinsics; + break; + default: + GB_PANIC("Unhandled BuiltinProcPkg"); + } + GB_PANIC("HERE"); + } + break; } if (e->flags & EntityFlag_Param) { @@ -900,7 +919,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { doc_entity.kind = kind; doc_entity.flags = flags; - doc_entity.pos = odin_doc_token_pos_cast(w, e->token.pos); + doc_entity.pos = odin_doc_token_pos_cast(w, pos); doc_entity.name = odin_doc_write_string(w, name); doc_entity.type = 0; // Set later doc_entity.init_string = init_string; @@ -1011,7 +1030,7 @@ OdinDocArray odin_doc_add_pkg_entries(OdinDocWriter *w, AstPa if (e->pkg != pkg) { continue; } - if (!is_entity_exported(e)) { + if (!is_entity_exported(e, true)) { continue; } if (e->token.string.len == 0) { From 16786aac78e343fb11a5bd6c971ebb17ccd36f5c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 12:33:34 +0000 Subject: [PATCH 044/117] Correct int31_max etc --- core/math/rand/rand.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 9bd30c216..04e2c6414 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -70,7 +70,7 @@ int31_max :: proc(n: i32, r: ^Rand = nil) -> i32 { if n&(n-1) == 0 { return int31(r) & (n-1) } - max := i32((1<<31) - 1 - (1<<31)&u32(n)) + max := i32((1<<31) - 1 - (1<<31)%u32(n)) v := int31(r) for v > max { v = int31(r) @@ -85,7 +85,7 @@ int63_max :: proc(n: i64, r: ^Rand = nil) -> i64 { if n&(n-1) == 0 { return int63(r) & (n-1) } - max := i64((1<<63) - 1 - (1<<63)&u64(n)) + max := i64((1<<63) - 1 - (1<<63)%u64(n)) v := int63(r) for v > max { v = int63(r) @@ -100,7 +100,7 @@ int127_max :: proc(n: i128, r: ^Rand = nil) -> i128 { if n&(n-1) == 0 { return int127(r) & (n-1) } - max := i128((1<<63) - 1 - (1<<63)&u128(n)) + max := i128((1<<127) - 1 - (1<<127)%u128(n)) v := int127(r) for v > max { v = int127(r) From 4dc29d141f5423c6b0f8d963b60d18eee988a8ab Mon Sep 17 00:00:00 2001 From: Daniel Gavin Date: Thu, 27 Jan 2022 14:24:33 +0100 Subject: [PATCH 045/117] Fix `core:odin/parser` not setting the inline flag correctly. --- core/odin/parser/parser.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index e8c2c848d..56e1708e4 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2168,7 +2168,7 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ } switch e in &ast.unparen_expr(expr).derived { - case ast.Proc_Lit: + case ast.Proc_Lit: if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure literal") } @@ -2319,7 +2319,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { return rt case "force_inline", "force_no_inline": - return parse_inlining_operand(p, lhs, tok) + return parse_inlining_operand(p, lhs, name) case: expr := parse_expr(p, lhs) te := ast.new(ast.Tag_Expr, tok.pos, expr.pos) From ff5e03677366141516b86783f4f3031c6f5e83ab Mon Sep 17 00:00:00 2001 From: Daniel Gavin Date: Thu, 27 Jan 2022 14:27:26 +0100 Subject: [PATCH 046/117] Trim whitespaces --- core/odin/parser/parser.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 56e1708e4..0ebabfd70 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2168,7 +2168,7 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ } switch e in &ast.unparen_expr(expr).derived { - case ast.Proc_Lit: + case ast.Proc_Lit: if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure literal") } From 28bc274449e77569d997b0dc327c097098daf80d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 27 Jan 2022 14:58:45 +0100 Subject: [PATCH 047/117] Fix DEFLATE stored block handling. --- core/compress/zlib/zlib.odin | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index 4d575c7e6..d4c0f332c 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -538,19 +538,20 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all final = compress.read_bits_lsb(z, 1) type = compress.read_bits_lsb(z, 2) - // fmt.printf("Final: %v | Type: %v\n", final, type); + // fmt.printf("Final: %v | Type: %v\n", final, type) switch type { case 0: + // fmt.printf("Method 0: STORED\n") // Uncompressed block // Discard bits until next byte boundary compress.discard_to_next_byte_lsb(z) - uncompressed_len := i16(compress.read_bits_lsb(z, 16)) - length_check := i16(compress.read_bits_lsb(z, 16)) + uncompressed_len := u16(compress.read_bits_lsb(z, 16)) + length_check := u16(compress.read_bits_lsb(z, 16)) - // fmt.printf("LEN: %v, ~LEN: %v, NLEN: %v, ~NLEN: %v\n", uncompressed_len, ~uncompressed_len, length_check, ~length_check); + // fmt.printf("LEN: %v, ~LEN: %v, NLEN: %v, ~NLEN: %v\n", uncompressed_len, ~uncompressed_len, length_check, ~length_check) if ~uncompressed_len != length_check { @@ -567,10 +568,12 @@ inflate_raw :: proc(z: ^$C, expected_output_size := -1, allocator := context.all write_byte(z, u8(lit)) uncompressed_len -= 1 } + assert(uncompressed_len == 0) + case 3: return E_Deflate.BType_3 case: - // log.debugf("Err: %v | Final: %v | Type: %v\n", err, final, type); + // fmt.printf("Err: %v | Final: %v | Type: %v\n", err, final, type) if type == 1 { // Use fixed code lengths. build_huffman(z_repeat, Z_FIXED_LENGTH[:]) or_return From 24e7356825a473cba0a1e9962470be73d60ad248 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 16:08:47 +0000 Subject: [PATCH 048/117] Add `#no_type_assert` and `#type_assert` to disable implicit type assertions with `x.(T)` --- src/check_expr.cpp | 8 ++++ src/check_stmt.cpp | 8 ++++ src/checker.cpp | 12 ++++++ src/llvm_backend_expr.cpp | 76 ++++++++++++++++++++---------------- src/llvm_backend_stmt.cpp | 7 ++++ src/llvm_backend_utility.cpp | 41 ++++++++++++------- src/parser.cpp | 36 +++++++++++++++++ src/parser.hpp | 4 ++ 8 files changed, 144 insertions(+), 48 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 276e9d0bb..fb5a90f5a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6883,6 +6883,14 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type out &= ~StateFlag_no_bounds_check; } + if (in & StateFlag_no_type_assert) { + out |= StateFlag_no_type_assert; + out &= ~StateFlag_type_assert; + } else if (in & StateFlag_type_assert) { + out |= StateFlag_type_assert; + out &= ~StateFlag_no_type_assert; + } + c->state_flags = out; } diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 94b7561c7..f9e55ab37 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -490,6 +490,14 @@ void check_stmt(CheckerContext *ctx, Ast *node, u32 flags) { out &= ~StateFlag_no_bounds_check; } + if (in & StateFlag_no_type_assert) { + out |= StateFlag_no_type_assert; + out &= ~StateFlag_type_assert; + } else if (in & StateFlag_type_assert) { + out |= StateFlag_type_assert; + out &= ~StateFlag_no_type_assert; + } + ctx->state_flags = out; } diff --git a/src/checker.cpp b/src/checker.cpp index e0c756bb8..038709056 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4875,6 +4875,9 @@ bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *untyped, Proc bool bounds_check = (pi->tags & ProcTag_bounds_check) != 0; bool no_bounds_check = (pi->tags & ProcTag_no_bounds_check) != 0; + bool type_assert = (pi->tags & ProcTag_type_assert) != 0; + bool no_type_assert = (pi->tags & ProcTag_no_type_assert) != 0; + if (bounds_check) { ctx.state_flags |= StateFlag_bounds_check; ctx.state_flags &= ~StateFlag_no_bounds_check; @@ -4882,6 +4885,15 @@ bool check_proc_info(Checker *c, ProcInfo *pi, UntypedExprInfoMap *untyped, Proc ctx.state_flags |= StateFlag_no_bounds_check; ctx.state_flags &= ~StateFlag_bounds_check; } + + if (type_assert) { + ctx.state_flags |= StateFlag_type_assert; + ctx.state_flags &= ~StateFlag_no_type_assert; + } else if (no_type_assert) { + ctx.state_flags |= StateFlag_no_type_assert; + ctx.state_flags &= ~StateFlag_type_assert; + } + if (pi->body != nullptr && e != nullptr) { GB_ASSERT((e->flags & EntityFlag_ProcBodyChecked) == 0); } diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 9b2e26434..ea031ee56 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2768,28 +2768,30 @@ lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { Type *src_type = type_deref(v.type); Type *dst_type = type; - lbValue src_tag = {}; - lbValue dst_tag = {}; - if (is_type_union_maybe_pointer(src_type)) { - src_tag = lb_emit_comp_against_nil(p, Token_NotEq, v); - dst_tag = lb_const_bool(p->module, t_bool, true); - } else { - src_tag = lb_emit_load(p, lb_emit_union_tag_ptr(p, v)); - dst_tag = lb_const_union_tag(p->module, src_type, dst_type); + + if ((p->state_flags & StateFlag_no_type_assert) == 0) { + lbValue src_tag = {}; + lbValue dst_tag = {}; + if (is_type_union_maybe_pointer(src_type)) { + src_tag = lb_emit_comp_against_nil(p, Token_NotEq, v); + dst_tag = lb_const_bool(p->module, t_bool, true); + } else { + src_tag = lb_emit_load(p, lb_emit_union_tag_ptr(p, v)); + dst_tag = lb_const_union_tag(p->module, src_type, dst_type); + } + lbValue ok = lb_emit_comp(p, Token_CmpEq, src_tag, dst_tag); + auto args = array_make(permanent_allocator(), 6); + args[0] = ok; + + args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); + args[2] = lb_const_int(p->module, t_i32, pos.line); + args[3] = lb_const_int(p->module, t_i32, pos.column); + + args[4] = lb_typeid(p->module, src_type); + args[5] = lb_typeid(p->module, dst_type); + lb_emit_runtime_call(p, "type_assertion_check", args); } - lbValue ok = lb_emit_comp(p, Token_CmpEq, src_tag, dst_tag); - auto args = array_make(permanent_allocator(), 6); - args[0] = ok; - - args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); - args[2] = lb_const_int(p->module, t_i32, pos.line); - args[3] = lb_const_int(p->module, t_i32, pos.column); - - args[4] = lb_typeid(p->module, src_type); - args[5] = lb_typeid(p->module, dst_type); - lb_emit_runtime_call(p, "type_assertion_check", args); - lbValue data_ptr = v; return lb_emit_conv(p, data_ptr, tv.type); } else if (is_type_any(t)) { @@ -2797,23 +2799,23 @@ lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { if (is_type_pointer(v.type)) { v = lb_emit_load(p, v); } - lbValue data_ptr = lb_emit_struct_ev(p, v, 0); - lbValue any_id = lb_emit_struct_ev(p, v, 1); - lbValue id = lb_typeid(p->module, type); + if ((p->state_flags & StateFlag_no_type_assert) == 0) { + lbValue any_id = lb_emit_struct_ev(p, v, 1); + lbValue id = lb_typeid(p->module, type); + lbValue ok = lb_emit_comp(p, Token_CmpEq, any_id, id); + auto args = array_make(permanent_allocator(), 6); + args[0] = ok; - lbValue ok = lb_emit_comp(p, Token_CmpEq, any_id, id); - auto args = array_make(permanent_allocator(), 6); - args[0] = ok; + args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); + args[2] = lb_const_int(p->module, t_i32, pos.line); + args[3] = lb_const_int(p->module, t_i32, pos.column); - args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); - args[2] = lb_const_int(p->module, t_i32, pos.line); - args[3] = lb_const_int(p->module, t_i32, pos.column); - - args[4] = any_id; - args[5] = id; - lb_emit_runtime_call(p, "type_assertion_check", args); + args[4] = any_id; + args[5] = id; + lb_emit_runtime_call(p, "type_assertion_check", args); + } return lb_emit_conv(p, data_ptr, tv.type); } else { @@ -2843,6 +2845,14 @@ lbValue lb_build_expr(lbProcedure *p, Ast *expr) { out &= ~StateFlag_bounds_check; } + if (in & StateFlag_type_assert) { + out |= StateFlag_type_assert; + out &= ~StateFlag_no_type_assert; + } else if (in & StateFlag_no_type_assert) { + out |= StateFlag_no_type_assert; + out &= ~StateFlag_type_assert; + } + p->state_flags = out; } diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 3375ceda9..916c0433e 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1991,6 +1991,13 @@ void lb_build_stmt(lbProcedure *p, Ast *node) { out |= StateFlag_no_bounds_check; out &= ~StateFlag_bounds_check; } + if (in & StateFlag_no_type_assert) { + out |= StateFlag_no_type_assert; + out &= ~StateFlag_type_assert; + } else if (in & StateFlag_type_assert) { + out |= StateFlag_type_assert; + out &= ~StateFlag_no_type_assert; + } p->state_flags = out; } diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 5b1b11b44..7e2bd7daa 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -626,6 +626,12 @@ lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type, TokenPos p lbValue value_ = lb_address_from_load_or_generate_local(p, value); + if ((p->state_flags & StateFlag_no_type_assert) != 0 && !is_tuple) { + // just do a bit cast of the data at the front + lbValue ptr = lb_emit_conv(p, value_, alloc_type_pointer(type)); + return lb_emit_load(p, ptr); + } + lbValue tag = {}; lbValue dst_tag = {}; lbValue cond = {}; @@ -666,23 +672,22 @@ lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type, TokenPos p lb_start_block(p, end_block); if (!is_tuple) { - { - // NOTE(bill): Panic on invalid conversion - Type *dst_type = tuple->Tuple.variables[0]->type; + GB_ASSERT((p->state_flags & StateFlag_no_type_assert) == 0); + // NOTE(bill): Panic on invalid conversion + Type *dst_type = tuple->Tuple.variables[0]->type; - lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); - auto args = array_make(permanent_allocator(), 7); - args[0] = ok; + lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); + auto args = array_make(permanent_allocator(), 7); + args[0] = ok; - args[1] = lb_const_string(m, get_file_path_string(pos.file_id)); - args[2] = lb_const_int(m, t_i32, pos.line); - args[3] = lb_const_int(m, t_i32, pos.column); + args[1] = lb_const_string(m, get_file_path_string(pos.file_id)); + args[2] = lb_const_int(m, t_i32, pos.line); + args[3] = lb_const_int(m, t_i32, pos.column); - args[4] = lb_typeid(m, src_type); - args[5] = lb_typeid(m, dst_type); - args[6] = lb_emit_conv(p, value_, t_rawptr); - lb_emit_runtime_call(p, "type_assertion_check2", args); - } + args[4] = lb_typeid(m, src_type); + args[5] = lb_typeid(m, dst_type); + args[6] = lb_emit_conv(p, value_, t_rawptr); + lb_emit_runtime_call(p, "type_assertion_check2", args); return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0)); } @@ -706,6 +711,13 @@ lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *type, TokenPos } Type *dst_type = tuple->Tuple.variables[0]->type; + if ((p->state_flags & StateFlag_no_type_assert) != 0 && !is_tuple) { + // just do a bit cast of the data at the front + lbValue ptr = lb_emit_struct_ev(p, value, 0); + ptr = lb_emit_conv(p, ptr, alloc_type_pointer(type)); + return lb_addr(ptr); + } + lbAddr v = lb_add_local_generated(p, tuple, true); lbValue dst_typeid = lb_typeid(m, dst_type); @@ -731,7 +743,6 @@ lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *type, TokenPos if (!is_tuple) { // NOTE(bill): Panic on invalid conversion - lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); auto args = array_make(permanent_allocator(), 7); args[0] = ok; diff --git a/src/parser.cpp b/src/parser.cpp index 108411cd0..9cc9adfc9 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1843,6 +1843,8 @@ void parse_proc_tags(AstFile *f, u64 *tags) { ELSE_IF_ADD_TAG(require_results) ELSE_IF_ADD_TAG(bounds_check) ELSE_IF_ADD_TAG(no_bounds_check) + ELSE_IF_ADD_TAG(type_assert) + ELSE_IF_ADD_TAG(no_type_assert) else { syntax_error(tag_expr, "Unknown procedure type tag #%.*s", LIT(tag_name)); } @@ -1853,6 +1855,10 @@ void parse_proc_tags(AstFile *f, u64 *tags) { if ((*tags & ProcTag_bounds_check) && (*tags & ProcTag_no_bounds_check)) { syntax_error(f->curr_token, "You cannot apply both #bounds_check and #no_bounds_check to a procedure"); } + + if ((*tags & ProcTag_type_assert) && (*tags & ProcTag_no_type_assert)) { + syntax_error(f->curr_token, "You cannot apply both #type_assert and #no_type_assert to a procedure"); + } } @@ -2000,11 +2006,23 @@ Ast *parse_check_directive_for_statement(Ast *s, Token const &tag_token, u16 sta syntax_error(tag_token, "#bounds_check and #no_bounds_check cannot be applied together"); } break; + case StateFlag_type_assert: + if ((s->state_flags & StateFlag_no_type_assert) != 0) { + syntax_error(tag_token, "#type_assert and #no_type_assert cannot be applied together"); + } + break; + case StateFlag_no_type_assert: + if ((s->state_flags & StateFlag_type_assert) != 0) { + syntax_error(tag_token, "#type_assert and #no_type_assert cannot be applied together"); + } + break; } switch (state_flag) { case StateFlag_bounds_check: case StateFlag_no_bounds_check: + case StateFlag_type_assert: + case StateFlag_no_type_assert: switch (s->kind) { case Ast_BlockStmt: case Ast_IfStmt: @@ -2128,6 +2146,12 @@ Ast *parse_operand(AstFile *f, bool lhs) { } else if (name.string == "no_bounds_check") { Ast *operand = parse_expr(f, lhs); return parse_check_directive_for_statement(operand, name, StateFlag_no_bounds_check); + } else if (name.string == "type_assert") { + Ast *operand = parse_expr(f, lhs); + return parse_check_directive_for_statement(operand, name, StateFlag_type_assert); + } else if (name.string == "no_type_assert") { + Ast *operand = parse_expr(f, lhs); + return parse_check_directive_for_statement(operand, name, StateFlag_no_type_assert); } else if (name.string == "relative") { Ast *tag = ast_basic_directive(f, token, name); tag = parse_call_expr(f, tag); @@ -2224,6 +2248,12 @@ Ast *parse_operand(AstFile *f, bool lhs) { if (tags & ProcTag_bounds_check) { body->state_flags |= StateFlag_bounds_check; } + if (tags & ProcTag_no_type_assert) { + body->state_flags |= StateFlag_no_type_assert; + } + if (tags & ProcTag_type_assert) { + body->state_flags |= StateFlag_type_assert; + } return ast_proc_lit(f, type, body, tags, where_token, where_clauses); } else if (allow_token(f, Token_do)) { @@ -4611,6 +4641,12 @@ Ast *parse_stmt(AstFile *f) { } else if (tag == "no_bounds_check") { s = parse_stmt(f); return parse_check_directive_for_statement(s, name, StateFlag_no_bounds_check); + } else if (tag == "type_assert") { + s = parse_stmt(f); + return parse_check_directive_for_statement(s, name, StateFlag_type_assert); + } else if (tag == "no_type_assert") { + s = parse_stmt(f); + return parse_check_directive_for_statement(s, name, StateFlag_no_type_assert); } else if (tag == "partial") { s = parse_stmt(f); switch (s->kind) { diff --git a/src/parser.hpp b/src/parser.hpp index b005a4465..656f709e8 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -226,6 +226,8 @@ enum ProcInlining { enum ProcTag { ProcTag_bounds_check = 1<<0, ProcTag_no_bounds_check = 1<<1, + ProcTag_type_assert = 1<<2, + ProcTag_no_type_assert = 1<<3, ProcTag_require_results = 1<<4, ProcTag_optional_ok = 1<<5, @@ -258,6 +260,8 @@ ProcCallingConvention default_calling_convention(void) { enum StateFlag : u8 { StateFlag_bounds_check = 1<<0, StateFlag_no_bounds_check = 1<<1, + StateFlag_type_assert = 1<<2, + StateFlag_no_type_assert = 1<<3, StateFlag_BeenHandled = 1<<7, }; From 2aa783179e8ea968e6f093ed9b63ae2f8bd8be43 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 16:08:58 +0000 Subject: [PATCH 049/117] Update doc_format.odin --- core/odin/doc-format/doc_format.odin | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/odin/doc-format/doc_format.odin b/core/odin/doc-format/doc_format.odin index 59eafdc09..62682004d 100644 --- a/core/odin/doc-format/doc_format.odin +++ b/core/odin/doc-format/doc_format.odin @@ -11,7 +11,7 @@ String :: distinct Array(byte) Version_Type_Major :: 0 Version_Type_Minor :: 2 -Version_Type_Patch :: 3 +Version_Type_Patch :: 4 Version_Type :: struct { major, minor, patch: u8, @@ -77,9 +77,15 @@ Pkg :: struct { flags: Pkg_Flags, docs: String, files: Array(File_Index), - entities: Array(Entity_Index), + entries: Array(Scope_Entry), } +Scope_Entry :: struct { + name: String, + entity: Entity_Index, +} + + Entity_Kind :: enum u32le { Invalid = 0, Constant = 1, @@ -89,6 +95,7 @@ Entity_Kind :: enum u32le { Proc_Group = 5, Import_Name = 6, Library_Name = 7, + Builtin = 8, } Entity_Flag :: enum u32le { @@ -105,6 +112,9 @@ Entity_Flag :: enum u32le { Type_Alias = 20, + Builtin_Pkg_Builtin = 30, + Builtin_Pkg_Intrinsics = 31, + Var_Thread_Local = 40, Var_Static = 41, From 5eea23cf76037bac4576959c306f82ad0aeded96 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 16:09:05 +0000 Subject: [PATCH 050/117] Fix typo --- core/builtin/builtin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/builtin/builtin.odin b/core/builtin/builtin.odin index 74283720f..259fdef37 100644 --- a/core/builtin/builtin.odin +++ b/core/builtin/builtin.odin @@ -2,7 +2,7 @@ package builtin nil :: nil; -false :: 0!==0; +false :: 0!=0; true :: 0==0; ODIN_OS :: ODIN_OS; From 3165b7cf95ad3b0773dd1ee36561dbdcea51f047 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 16:09:33 +0000 Subject: [PATCH 051/117] Add `rand.exp_float64` --- core/math/rand/exp.odin | 214 +++++++++++++++++++++++++++++++++++++ core/math/rand/normal.odin | 14 ++- 2 files changed, 220 insertions(+), 8 deletions(-) create mode 100644 core/math/rand/exp.odin diff --git a/core/math/rand/exp.odin b/core/math/rand/exp.odin new file mode 100644 index 000000000..c0f92e99c --- /dev/null +++ b/core/math/rand/exp.odin @@ -0,0 +1,214 @@ +package rand + +import "core:math" + +// exp_float64 returns a exponential distribution in the range (0, max(f64)], +// with an exponential distribution who rate parameter is 1 (lambda) and whose mean +// is 1 (1/lambda). +// +// To produce a distribution with a differetn rate parameter, divide the result by +// the desired rate parameter +// +// "The Ziggurat Method for Generating Random Variables" +// Authors: George Marsaglia, Wai Wan Tsang +// Submitted: 2000-04-15. Published: 2000-10-02. +// https://www.jstatsoft.org/index.php/jss/article/view/v005i08/ziggurat.pdf [pdf] +// https://www.jstatsoft.org/article/view/v005i08 [web page] +// +exp_float64 :: proc(r: ^Rand = nil) -> f64 { + re :: 7.69711747013104972 + + @(static) + ke := [256]u32{ + 0xe290a139, 0x0, 0x9beadebc, 0xc377ac71, 0xd4ddb990, + 0xde893fb8, 0xe4a8e87c, 0xe8dff16a, 0xebf2deab, 0xee49a6e8, + 0xf0204efd, 0xf19bdb8e, 0xf2d458bb, 0xf3da104b, 0xf4b86d78, + 0xf577ad8a, 0xf61de83d, 0xf6afb784, 0xf730a573, 0xf7a37651, + 0xf80a5bb6, 0xf867189d, 0xf8bb1b4f, 0xf9079062, 0xf94d70ca, + 0xf98d8c7d, 0xf9c8928a, 0xf9ff175b, 0xfa319996, 0xfa6085f8, + 0xfa8c3a62, 0xfab5084e, 0xfadb36c8, 0xfaff0410, 0xfb20a6ea, + 0xfb404fb4, 0xfb5e2951, 0xfb7a59e9, 0xfb95038c, 0xfbae44ba, + 0xfbc638d8, 0xfbdcf892, 0xfbf29a30, 0xfc0731df, 0xfc1ad1ed, + 0xfc2d8b02, 0xfc3f6c4d, 0xfc5083ac, 0xfc60ddd1, 0xfc708662, + 0xfc7f8810, 0xfc8decb4, 0xfc9bbd62, 0xfca9027c, 0xfcb5c3c3, + 0xfcc20864, 0xfccdd70a, 0xfcd935e3, 0xfce42ab0, 0xfceebace, + 0xfcf8eb3b, 0xfd02c0a0, 0xfd0c3f59, 0xfd156b7b, 0xfd1e48d6, + 0xfd26daff, 0xfd2f2552, 0xfd372af7, 0xfd3eeee5, 0xfd4673e7, + 0xfd4dbc9e, 0xfd54cb85, 0xfd5ba2f2, 0xfd62451b, 0xfd68b415, + 0xfd6ef1da, 0xfd750047, 0xfd7ae120, 0xfd809612, 0xfd8620b4, + 0xfd8b8285, 0xfd90bcf5, 0xfd95d15e, 0xfd9ac10b, 0xfd9f8d36, + 0xfda43708, 0xfda8bf9e, 0xfdad2806, 0xfdb17141, 0xfdb59c46, + 0xfdb9a9fd, 0xfdbd9b46, 0xfdc170f6, 0xfdc52bd8, 0xfdc8ccac, + 0xfdcc542d, 0xfdcfc30b, 0xfdd319ef, 0xfdd6597a, 0xfdd98245, + 0xfddc94e5, 0xfddf91e6, 0xfde279ce, 0xfde54d1f, 0xfde80c52, + 0xfdeab7de, 0xfded5034, 0xfdefd5be, 0xfdf248e3, 0xfdf4aa06, + 0xfdf6f984, 0xfdf937b6, 0xfdfb64f4, 0xfdfd818d, 0xfdff8dd0, + 0xfe018a08, 0xfe03767a, 0xfe05536c, 0xfe07211c, 0xfe08dfc9, + 0xfe0a8fab, 0xfe0c30fb, 0xfe0dc3ec, 0xfe0f48b1, 0xfe10bf76, + 0xfe122869, 0xfe1383b4, 0xfe14d17c, 0xfe1611e7, 0xfe174516, + 0xfe186b2a, 0xfe19843e, 0xfe1a9070, 0xfe1b8fd6, 0xfe1c8289, + 0xfe1d689b, 0xfe1e4220, 0xfe1f0f26, 0xfe1fcfbc, 0xfe2083ed, + 0xfe212bc3, 0xfe21c745, 0xfe225678, 0xfe22d95f, 0xfe234ffb, + 0xfe23ba4a, 0xfe241849, 0xfe2469f2, 0xfe24af3c, 0xfe24e81e, + 0xfe25148b, 0xfe253474, 0xfe2547c7, 0xfe254e70, 0xfe25485a, + 0xfe25356a, 0xfe251586, 0xfe24e88f, 0xfe24ae64, 0xfe2466e1, + 0xfe2411df, 0xfe23af34, 0xfe233eb4, 0xfe22c02c, 0xfe22336b, + 0xfe219838, 0xfe20ee58, 0xfe20358c, 0xfe1f6d92, 0xfe1e9621, + 0xfe1daef0, 0xfe1cb7ac, 0xfe1bb002, 0xfe1a9798, 0xfe196e0d, + 0xfe1832fd, 0xfe16e5fe, 0xfe15869d, 0xfe141464, 0xfe128ed3, + 0xfe10f565, 0xfe0f478c, 0xfe0d84b1, 0xfe0bac36, 0xfe09bd73, + 0xfe07b7b5, 0xfe059a40, 0xfe03644c, 0xfe011504, 0xfdfeab88, + 0xfdfc26e9, 0xfdf98629, 0xfdf6c83b, 0xfdf3ec01, 0xfdf0f04a, + 0xfdedd3d1, 0xfdea953d, 0xfde7331e, 0xfde3abe9, 0xfddffdfb, + 0xfddc2791, 0xfdd826cd, 0xfdd3f9a8, 0xfdcf9dfc, 0xfdcb1176, + 0xfdc65198, 0xfdc15bb3, 0xfdbc2ce2, 0xfdb6c206, 0xfdb117be, + 0xfdab2a63, 0xfda4f5fd, 0xfd9e7640, 0xfd97a67a, 0xfd908192, + 0xfd8901f2, 0xfd812182, 0xfd78d98e, 0xfd7022bb, 0xfd66f4ed, + 0xfd5d4732, 0xfd530f9c, 0xfd48432b, 0xfd3cd59a, 0xfd30b936, + 0xfd23dea4, 0xfd16349e, 0xfd07a7a3, 0xfcf8219b, 0xfce7895b, + 0xfcd5c220, 0xfcc2aadb, 0xfcae1d5e, 0xfc97ed4e, 0xfc7fe6d4, + 0xfc65ccf3, 0xfc495762, 0xfc2a2fc8, 0xfc07ee19, 0xfbe213c1, + 0xfbb8051a, 0xfb890078, 0xfb5411a5, 0xfb180005, 0xfad33482, + 0xfa839276, 0xfa263b32, 0xf9b72d1c, 0xf930a1a2, 0xf889f023, + 0xf7b577d2, 0xf69c650c, 0xf51530f0, 0xf2cb0e3c, 0xeeefb15d, + 0xe6da6ecf, + } + @(static) + we := [256]f32{ + 2.0249555e-09, 1.486674e-11, 2.4409617e-11, 3.1968806e-11, + 3.844677e-11, 4.4228204e-11, 4.9516443e-11, 5.443359e-11, + 5.905944e-11, 6.344942e-11, 6.7643814e-11, 7.1672945e-11, + 7.556032e-11, 7.932458e-11, 8.298079e-11, 8.654132e-11, + 9.0016515e-11, 9.3415074e-11, 9.674443e-11, 1.0001099e-10, + 1.03220314e-10, 1.06377254e-10, 1.09486115e-10, 1.1255068e-10, + 1.1557435e-10, 1.1856015e-10, 1.2151083e-10, 1.2442886e-10, + 1.2731648e-10, 1.3017575e-10, 1.3300853e-10, 1.3581657e-10, + 1.3860142e-10, 1.4136457e-10, 1.4410738e-10, 1.4683108e-10, + 1.4953687e-10, 1.5222583e-10, 1.54899e-10, 1.5755733e-10, + 1.6020171e-10, 1.6283301e-10, 1.6545203e-10, 1.6805951e-10, + 1.7065617e-10, 1.732427e-10, 1.7581973e-10, 1.7838787e-10, + 1.8094774e-10, 1.8349985e-10, 1.8604476e-10, 1.8858298e-10, + 1.9111498e-10, 1.9364126e-10, 1.9616223e-10, 1.9867835e-10, + 2.0119004e-10, 2.0369768e-10, 2.0620168e-10, 2.087024e-10, + 2.1120022e-10, 2.136955e-10, 2.1618855e-10, 2.1867974e-10, + 2.2116936e-10, 2.2365775e-10, 2.261452e-10, 2.2863202e-10, + 2.311185e-10, 2.3360494e-10, 2.360916e-10, 2.3857874e-10, + 2.4106667e-10, 2.4355562e-10, 2.4604588e-10, 2.485377e-10, + 2.5103128e-10, 2.5352695e-10, 2.560249e-10, 2.585254e-10, + 2.6102867e-10, 2.6353494e-10, 2.6604446e-10, 2.6855745e-10, + 2.7107416e-10, 2.7359479e-10, 2.761196e-10, 2.7864877e-10, + 2.8118255e-10, 2.8372119e-10, 2.8626485e-10, 2.888138e-10, + 2.9136826e-10, 2.939284e-10, 2.9649452e-10, 2.9906677e-10, + 3.016454e-10, 3.0423064e-10, 3.0682268e-10, 3.0942177e-10, + 3.1202813e-10, 3.1464195e-10, 3.1726352e-10, 3.19893e-10, + 3.2253064e-10, 3.251767e-10, 3.2783135e-10, 3.3049485e-10, + 3.3316744e-10, 3.3584938e-10, 3.3854083e-10, 3.4124212e-10, + 3.4395342e-10, 3.46675e-10, 3.4940711e-10, 3.5215003e-10, + 3.5490397e-10, 3.5766917e-10, 3.6044595e-10, 3.6323455e-10, + 3.660352e-10, 3.6884823e-10, 3.7167386e-10, 3.745124e-10, + 3.773641e-10, 3.802293e-10, 3.8310827e-10, 3.860013e-10, + 3.8890866e-10, 3.918307e-10, 3.9476775e-10, 3.9772008e-10, + 4.0068804e-10, 4.0367196e-10, 4.0667217e-10, 4.09689e-10, + 4.1272286e-10, 4.1577405e-10, 4.1884296e-10, 4.2192994e-10, + 4.250354e-10, 4.281597e-10, 4.313033e-10, 4.3446652e-10, + 4.3764986e-10, 4.408537e-10, 4.4407847e-10, 4.4732465e-10, + 4.5059267e-10, 4.5388301e-10, 4.571962e-10, 4.6053267e-10, + 4.6389292e-10, 4.6727755e-10, 4.70687e-10, 4.741219e-10, + 4.7758275e-10, 4.810702e-10, 4.845848e-10, 4.8812715e-10, + 4.9169796e-10, 4.9529775e-10, 4.989273e-10, 5.0258725e-10, + 5.0627835e-10, 5.100013e-10, 5.1375687e-10, 5.1754584e-10, + 5.21369e-10, 5.2522725e-10, 5.2912136e-10, 5.330522e-10, + 5.370208e-10, 5.4102806e-10, 5.45075e-10, 5.491625e-10, + 5.532918e-10, 5.5746385e-10, 5.616799e-10, 5.6594107e-10, + 5.7024857e-10, 5.746037e-10, 5.7900773e-10, 5.834621e-10, + 5.8796823e-10, 5.925276e-10, 5.971417e-10, 6.018122e-10, + 6.065408e-10, 6.113292e-10, 6.1617933e-10, 6.2109295e-10, + 6.260722e-10, 6.3111916e-10, 6.3623595e-10, 6.4142497e-10, + 6.4668854e-10, 6.5202926e-10, 6.5744976e-10, 6.6295286e-10, + 6.6854156e-10, 6.742188e-10, 6.79988e-10, 6.858526e-10, + 6.9181616e-10, 6.978826e-10, 7.04056e-10, 7.103407e-10, + 7.167412e-10, 7.2326256e-10, 7.2990985e-10, 7.366886e-10, + 7.4360473e-10, 7.5066453e-10, 7.5787476e-10, 7.6524265e-10, + 7.7277595e-10, 7.80483e-10, 7.883728e-10, 7.9645507e-10, + 8.047402e-10, 8.1323964e-10, 8.219657e-10, 8.309319e-10, + 8.401528e-10, 8.496445e-10, 8.594247e-10, 8.6951274e-10, + 8.799301e-10, 8.9070046e-10, 9.018503e-10, 9.134092e-10, + 9.254101e-10, 9.378904e-10, 9.508923e-10, 9.644638e-10, + 9.786603e-10, 9.935448e-10, 1.0091913e-09, 1.025686e-09, + 1.0431306e-09, 1.0616465e-09, 1.08138e-09, 1.1025096e-09, + 1.1252564e-09, 1.1498986e-09, 1.1767932e-09, 1.206409e-09, + 1.2393786e-09, 1.276585e-09, 1.3193139e-09, 1.3695435e-09, + 1.4305498e-09, 1.508365e-09, 1.6160854e-09, 1.7921248e-09, + } + @(static) + fe := [256]f32{ + 1, 0.9381437, 0.90046996, 0.87170434, 0.8477855, 0.8269933, + 0.8084217, 0.7915276, 0.77595687, 0.7614634, 0.7478686, + 0.7350381, 0.72286767, 0.71127474, 0.70019263, 0.6895665, + 0.67935055, 0.6695063, 0.66000086, 0.65080583, 0.6418967, + 0.63325197, 0.6248527, 0.6166822, 0.60872537, 0.60096896, + 0.5934009, 0.58601034, 0.5787874, 0.57172304, 0.5648092, + 0.5580383, 0.5514034, 0.5448982, 0.5385169, 0.53225386, + 0.5261042, 0.52006316, 0.5141264, 0.50828975, 0.5025495, + 0.496902, 0.49134386, 0.485872, 0.48048335, 0.4751752, + 0.46994483, 0.46478975, 0.45970762, 0.45469615, 0.44975325, + 0.44487688, 0.44006512, 0.43531612, 0.43062815, 0.42599955, + 0.42142874, 0.4169142, 0.41245446, 0.40804818, 0.403694, + 0.3993907, 0.39513698, 0.39093173, 0.38677382, 0.38266218, + 0.37859577, 0.37457356, 0.37059465, 0.3666581, 0.362763, + 0.35890847, 0.35509375, 0.351318, 0.3475805, 0.34388044, + 0.34021714, 0.3365899, 0.33299807, 0.32944095, 0.32591796, + 0.3224285, 0.3189719, 0.31554767, 0.31215525, 0.30879408, + 0.3054636, 0.3021634, 0.29889292, 0.2956517, 0.29243928, + 0.28925523, 0.28609908, 0.28297043, 0.27986884, 0.27679393, + 0.2737453, 0.2707226, 0.2677254, 0.26475343, 0.26180625, + 0.25888354, 0.25598502, 0.2531103, 0.25025907, 0.24743107, + 0.24462597, 0.24184346, 0.23908329, 0.23634516, 0.23362878, + 0.23093392, 0.2282603, 0.22560766, 0.22297576, 0.22036438, + 0.21777324, 0.21520215, 0.21265087, 0.21011916, 0.20760682, + 0.20511365, 0.20263945, 0.20018397, 0.19774707, 0.19532852, + 0.19292815, 0.19054577, 0.1881812, 0.18583426, 0.18350479, + 0.1811926, 0.17889754, 0.17661946, 0.17435817, 0.17211354, + 0.1698854, 0.16767362, 0.16547804, 0.16329853, 0.16113494, + 0.15898713, 0.15685499, 0.15473837, 0.15263714, 0.15055119, + 0.14848037, 0.14642459, 0.14438373, 0.14235765, 0.14034624, + 0.13834943, 0.13636707, 0.13439907, 0.13244532, 0.13050574, + 0.1285802, 0.12666863, 0.12477092, 0.12288698, 0.12101672, + 0.119160056, 0.1173169, 0.115487166, 0.11367077, 0.11186763, + 0.11007768, 0.10830083, 0.10653701, 0.10478614, 0.10304816, + 0.101323, 0.09961058, 0.09791085, 0.09622374, 0.09454919, + 0.09288713, 0.091237515, 0.08960028, 0.087975375, 0.08636274, + 0.08476233, 0.083174095, 0.081597984, 0.08003395, 0.07848195, + 0.076941945, 0.07541389, 0.07389775, 0.072393484, 0.07090106, + 0.069420435, 0.06795159, 0.066494495, 0.06504912, 0.063615434, + 0.062193416, 0.060783047, 0.059384305, 0.057997175, + 0.05662164, 0.05525769, 0.053905312, 0.052564494, 0.051235236, + 0.049917534, 0.048611384, 0.047316793, 0.046033762, 0.0447623, + 0.043502413, 0.042254124, 0.041017443, 0.039792392, + 0.038578995, 0.037377283, 0.036187284, 0.035009038, + 0.033842582, 0.032687962, 0.031545233, 0.030414443, 0.02929566, + 0.02818895, 0.027094385, 0.026012046, 0.024942026, 0.023884421, + 0.022839336, 0.021806888, 0.020787204, 0.019780423, 0.0187867, + 0.0178062, 0.016839107, 0.015885621, 0.014945968, 0.014020392, + 0.013109165, 0.012212592, 0.011331013, 0.01046481, 0.009614414, + 0.008780315, 0.007963077, 0.0071633533, 0.006381906, + 0.0056196423, 0.0048776558, 0.004157295, 0.0034602648, + 0.0027887989, 0.0021459677, 0.0015362998, 0.0009672693, + 0.00045413437, + } + + for { + j := uint32(r) + i := j & 0xFF + x := f64(j) * f64(we[i]) + if j < ke[i] { + return x + } + if i == 0 { + return re - math.ln(float64(r)) + } + if fe[i]+f32(float64(r))*(fe[i-1]-fe[i]) < f32(math.exp(-x)) { + return x + } + } +} \ No newline at end of file diff --git a/core/math/rand/normal.odin b/core/math/rand/normal.odin index 4a77543ba..a9edd0f19 100644 --- a/core/math/rand/normal.odin +++ b/core/math/rand/normal.odin @@ -2,6 +2,12 @@ package rand import "core:math" + +// norm_float64 returns a normally distributed f64 in the range -max(f64) through +max(f64) inclusive, +// with a standard normal distribution with a mean of 0 and standard deviation of 1. +// +// sample = norm_float64() * std_dev + mean +// // // Normal distribution // @@ -11,12 +17,6 @@ import "core:math" // https://www.jstatsoft.org/index.php/jss/article/view/v005i08/ziggurat.pdf [pdf] // https://www.jstatsoft.org/article/view/v005i08 [web page] // - -// norm_float64 returns a normally distributed f64 in the range -max(f64) through +max(f64) inclusive, -// with a standard normal distribution with a mean of 0 and standard deviation of 1. -// -// sample = norm_float64() * std_dev + mean -// norm_float64 :: proc(r: ^Rand = nil) -> f64 { rn :: 3.442619855899 @@ -49,7 +49,6 @@ norm_float64 :: proc(r: ^Rand = nil) -> f64 { 0x7da61a1e, 0x7d72a0fb, 0x7d30e097, 0x7cd9b4ab, 0x7c600f1a, 0x7ba90bdc, 0x7a722176, 0x77d664e5, } - @(static) wn := [128]f32{ 1.7290405e-09, 1.2680929e-10, 1.6897518e-10, 1.9862688e-10, @@ -85,7 +84,6 @@ norm_float64 :: proc(r: ^Rand = nil) -> f64 { 1.2601323e-09, 1.2857697e-09, 1.3146202e-09, 1.347784e-09, 1.3870636e-09, 1.4357403e-09, 1.5008659e-09, 1.6030948e-09, } - @(static) fn := [128]f32{ 1.00000000, 0.9635997, 0.9362827, 0.9130436, 0.89228165, From 38249372957db6a84151d14def3f50c02fe585b5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 27 Jan 2022 16:30:22 +0000 Subject: [PATCH 052/117] Remove debug code --- src/docs_writer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 8b752ab71..0474ce8ff 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -881,7 +881,6 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) { default: GB_PANIC("Unhandled BuiltinProcPkg"); } - GB_PANIC("HERE"); } break; } From 2f3c5336d95be028fac795fe75b70fc271b15800 Mon Sep 17 00:00:00 2001 From: powerc9000 Date: Thu, 9 Dec 2021 13:03:27 -0700 Subject: [PATCH 053/117] Fix mutex and conditions trying to be destroyed twice in unix --- core/thread/thread_unix.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index cee278c7a..6cb91df86 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -167,8 +167,6 @@ _join_multiple :: proc(threads: ..^Thread) { _destroy :: proc(t: ^Thread) { _join(t) - sync.condition_destroy(&t.start_gate) - sync.mutex_destroy(&t.start_mutex) t.unix_thread = {} free(t, t.creation_allocator) } From 62cc752066ee3e07ca5523932aa4a6cdd839475b Mon Sep 17 00:00:00 2001 From: Jesse Stiller Date: Sun, 30 Jan 2022 13:57:01 +1000 Subject: [PATCH 054/117] Added round to HLSL and GLSL, and isinf/isfinite + isnan to HLSL --- core/math/linalg/glsl/linalg_glsl.odin | 19 +++++ core/math/linalg/hlsl/linalg_hlsl.odin | 80 +++++++++++++++++++++ core/math/linalg/hlsl/linalg_hlsl_math.odin | 5 ++ 3 files changed, 104 insertions(+) diff --git a/core/math/linalg/glsl/linalg_glsl.odin b/core/math/linalg/glsl/linalg_glsl.odin index 7bc68b964..74753f66f 100644 --- a/core/math/linalg/glsl/linalg_glsl.odin +++ b/core/math/linalg/glsl/linalg_glsl.odin @@ -473,6 +473,25 @@ floor_dvec3 :: proc "c" (x: dvec3) -> dvec3 { return {floor(x.x), floor(x.y), fl floor_dvec4 :: proc "c" (x: dvec4) -> dvec4 { return {floor(x.x), floor(x.y), floor(x.z), floor(x.w)} } + +round :: proc{ + round_f32, + round_f64, + round_vec2, + round_vec3, + round_vec4, + round_dvec2, + round_dvec3, + round_dvec4, +} +round_vec2 :: proc "c" (x: vec2) -> vec2 { return {round(x.x), round(x.y)} } +round_vec3 :: proc "c" (x: vec3) -> vec3 { return {round(x.x), round(x.y), round(x.z)} } +round_vec4 :: proc "c" (x: vec4) -> vec4 { return {round(x.x), round(x.y), round(x.z), round(x.w)} } +round_dvec2 :: proc "c" (x: dvec2) -> dvec2 { return {round(x.x), round(x.y)} } +round_dvec3 :: proc "c" (x: dvec3) -> dvec3 { return {round(x.x), round(x.y), round(x.z)} } +round_dvec4 :: proc "c" (x: dvec4) -> dvec4 { return {round(x.x), round(x.y), round(x.z), round(x.w)} } + + ceil :: proc{ ceil_f32, ceil_f64, diff --git a/core/math/linalg/hlsl/linalg_hlsl.odin b/core/math/linalg/hlsl/linalg_hlsl.odin index 4391975ba..3f73dcd1f 100644 --- a/core/math/linalg/hlsl/linalg_hlsl.odin +++ b/core/math/linalg/hlsl/linalg_hlsl.odin @@ -551,6 +551,23 @@ floor_double2 :: proc "c" (x: double2) -> double2 { return {floor(x.x), floor(x. floor_double3 :: proc "c" (x: double3) -> double3 { return {floor(x.x), floor(x.y), floor(x.z)} } floor_double4 :: proc "c" (x: double4) -> double4 { return {floor(x.x), floor(x.y), floor(x.z), floor(x.w)} } +round :: proc{ + round_float, + round_double, + round_float2, + round_float3, + round_float4, + round_double2, + round_double3, + round_double4, +} +round_float2 :: proc "c" (x: float2) -> float2 { return {round(x.x), round(x.y)} } +round_float3 :: proc "c" (x: float3) -> float3 { return {round(x.x), round(x.y), round(x.z)} } +round_float4 :: proc "c" (x: float4) -> float4 { return {round(x.x), round(x.y), round(x.z), round(x.w)} } +round_double2 :: proc "c" (x: double2) -> double2 { return {round(x.x), round(x.y)} } +round_double3 :: proc "c" (x: double3) -> double3 { return {round(x.x), round(x.y), round(x.z)} } +round_double4 :: proc "c" (x: double4) -> double4 { return {round(x.x), round(x.y), round(x.z), round(x.w)} } + ceil :: proc{ ceil_float, @@ -570,6 +587,69 @@ ceil_double3 :: proc "c" (x: double3) -> double3 { return {ceil(x.x), ceil(x.y), ceil_double4 :: proc "c" (x: double4) -> double4 { return {ceil(x.x), ceil(x.y), ceil(x.z), ceil(x.w)} } +isfinite_float :: proc "c" (x: float) -> bool { return !isinf_float(x) } +isfinite_float2 :: proc "c" (x: float2) -> bool2 { return {isfinite_float(x.x), isfinite_float(x.y)} } +isfinite_float3 :: proc "c" (x: float3) -> bool3 { return {isfinite_float(x.x), isfinite_float(x.y), isfinite_float(x.z)} } +isfinite_float4 :: proc "c" (x: float4) -> bool4 { return {isfinite_float(x.x), isfinite_float(x.y), isfinite_float(x.z), isfinite_float(x.w)} } +isfinite_double :: proc "c" (x: double) -> bool { return !isinf_double(x) } +isfinite_double2 :: proc "c" (x: double2) -> bool2 { return {isfinite_double(x.x), isfinite_double(x.y)} } +isfinite_double3 :: proc "c" (x: double3) -> bool3 { return {isfinite_double(x.x), isfinite_double(x.y), isfinite_double(x.z)} } +isfinite_double4 :: proc "c" (x: double4) -> bool4 { return {isfinite_double(x.x), isfinite_double(x.y), isfinite_double(x.z), isfinite_double(x.w)} } + +// isfinite is the opposite of isinf and returns true if the number is neither positive-infinite or negative-infinite +isfinite :: proc{ + isfinite_float, + isfinite_float2, + isfinite_float3, + isfinite_float4, + isfinite_double, + isfinite_double2, + isfinite_double3, + isfinite_double4, +} + + +isinf_float :: proc "c" (x: float) -> bool { return x * 0.5 == x } +isinf_float2 :: proc "c" (x: float2) -> bool2 { return {isinf_float(x.x), isinf_float(x.y)} } +isinf_float3 :: proc "c" (x: float3) -> bool3 { return {isinf_float(x.x), isinf_float(x.y), isinf_float(x.z)} } +isinf_float4 :: proc "c" (x: float4) -> bool4 { return {isinf_float(x.x), isinf_float(x.y), isinf_float(x.z), isinf_float(x.w)} } +isinf_double :: proc "c" (x: double) -> bool { return x * 0.5 == x } +isinf_double2 :: proc "c" (x: double2) -> bool2 { return {isinf_double(x.x), isinf_double(x.y)} } +isinf_double3 :: proc "c" (x: double3) -> bool3 { return {isinf_double(x.x), isinf_double(x.y), isinf_double(x.z)} } +isinf_double4 :: proc "c" (x: double4) -> bool4 { return {isinf_double(x.x), isinf_double(x.y), isinf_double(x.z), isinf_double(x.w)} } + +// isinf is the opposite of isfinite and returns true if the number is either positive-infinite or negative-infinite +isinf :: proc{ + isinf_float, + isinf_float2, + isinf_float3, + isinf_float4, + isinf_double, + isinf_double2, + isinf_double3, + isinf_double4, +} + + +isnan_float2 :: proc "c" (x: float2) -> bool2 { return {isnan_float(x.x), isnan_float(x.y)} } +isnan_float3 :: proc "c" (x: float3) -> bool3 { return {isnan_float(x.x), isnan_float(x.y), isnan_float(x.z)} } +isnan_float4 :: proc "c" (x: float4) -> bool4 { return {isnan_float(x.x), isnan_float(x.y), isnan_float(x.z), isnan_float(x.w)} } +isnan_double2 :: proc "c" (x: double2) -> bool2 { return {isnan_double(x.x), isnan_double(x.y)} } +isnan_double3 :: proc "c" (x: double3) -> bool3 { return {isnan_double(x.x), isnan_double(x.y), isnan_double(x.z)} } +isnan_double4 :: proc "c" (x: double4) -> bool4 { return {isnan_double(x.x), isnan_double(x.y), isnan_double(x.z), isnan_double(x.w)} } + +// isnan returns true if the input value is the special case of Not-A-Number +isnan :: proc{ + isnan_float, + isnan_float2, + isnan_float3, + isnan_float4, + isnan_double, + isnan_double2, + isnan_double3, + isnan_double4, +} + fmod :: proc{ fmod_float, fmod_double, diff --git a/core/math/linalg/hlsl/linalg_hlsl_math.odin b/core/math/linalg/hlsl/linalg_hlsl_math.odin index d884c3d31..91c542b59 100644 --- a/core/math/linalg/hlsl/linalg_hlsl_math.odin +++ b/core/math/linalg/hlsl/linalg_hlsl_math.odin @@ -26,7 +26,9 @@ log10_float :: proc "c" (x: float) -> float { return math.log(x, 10) } exp2_float :: proc "c" (x: float) -> float { return math.pow(float(2), x) } sign_float :: proc "c" (x: float) -> float { return math.sign(x) } floor_float :: proc "c" (x: float) -> float { return math.floor(x) } +round_float :: proc "c" (x: float) -> float { return math.round(x) } ceil_float :: proc "c" (x: float) -> float { return math.ceil(x) } +isnan_float :: proc "c" (x: float) -> bool { return math.classify(x) == .NaN} fmod_float :: proc "c" (x, y: float) -> float { return math.mod(x, y) } frac_float :: proc "c" (x: float) -> float { if x >= 0 { @@ -35,6 +37,7 @@ frac_float :: proc "c" (x: float) -> float { return math.trunc(-x) + x } + cos_double :: proc "c" (x: double) -> double { return math.cos(x) } sin_double :: proc "c" (x: double) -> double { return math.sin(x) } tan_double :: proc "c" (x: double) -> double { return math.tan(x) } @@ -59,7 +62,9 @@ log10_double :: proc "c" (x: double) -> double { return math.log(x, 10) exp2_double :: proc "c" (x: double) -> double { return math.pow(double(2), x) } sign_double :: proc "c" (x: double) -> double { return math.sign(x) } floor_double :: proc "c" (x: double) -> double { return math.floor(x) } +round_double :: proc "c" (x: double) -> double { return math.round(x) } ceil_double :: proc "c" (x: double) -> double { return math.ceil(x) } +isnan_double :: proc "c" (x: double) -> bool { return math.classify(x) == .NaN} fmod_double :: proc "c" (x, y: double) -> double { return math.mod(x, y) } frac_double :: proc "c" (x: double) -> double { if x >= 0 { From ebb8ca7c264c9b5b98e1388fcb2c6ef8bdc28d59 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 30 Jan 2022 21:35:05 +0000 Subject: [PATCH 055/117] Add `round` to linalg_glsl_math.odin --- core/math/linalg/glsl/linalg_glsl_math.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/math/linalg/glsl/linalg_glsl_math.odin b/core/math/linalg/glsl/linalg_glsl_math.odin index 68f43a2f7..968a3fa5e 100644 --- a/core/math/linalg/glsl/linalg_glsl_math.odin +++ b/core/math/linalg/glsl/linalg_glsl_math.odin @@ -23,6 +23,7 @@ log_f32 :: proc "c" (x: f32) -> f32 { return math.ln(x) } exp2_f32 :: proc "c" (x: f32) -> f32 { return math.pow(f32(2), x) } sign_f32 :: proc "c" (x: f32) -> f32 { return math.sign(x) } floor_f32 :: proc "c" (x: f32) -> f32 { return math.floor(x) } +round_f32 :: proc "c" (x: f32) -> f32 { return math.round(x) } ceil_f32 :: proc "c" (x: f32) -> f32 { return math.ceil(x) } mod_f32 :: proc "c" (x, y: f32) -> f32 { return math.mod(x, y) } fract_f32 :: proc "c" (x: f32) -> f32 { @@ -53,6 +54,7 @@ log_f64 :: proc "c" (x: f64) -> f64 { return math.ln(x) } exp2_f64 :: proc "c" (x: f64) -> f64 { return math.pow(f64(2), x) } sign_f64 :: proc "c" (x: f64) -> f64 { return math.sign(x) } floor_f64 :: proc "c" (x: f64) -> f64 { return math.floor(x) } +round_f64 :: proc "c" (x: f64) -> f64 { return math.round(x) } ceil_f64 :: proc "c" (x: f64) -> f64 { return math.ceil(x) } mod_f64 :: proc "c" (x, y: f64) -> f64 { return math.mod(x, y) } fract_f64 :: proc "c" (x: f64) -> f64 { From 35a826a0fdab5320462e9574f2a2f791bd913980 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 30 Jan 2022 21:38:34 +0000 Subject: [PATCH 056/117] Update CI to do `odin check examples/all` --- .github/workflows/ci.yml | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6742b56f3..575d2406d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,13 +17,16 @@ jobs: run: ./odin report timeout-minutes: 1 - name: Odin check - run: ./odin check examples/demo/demo.odin -vet + run: ./odin check examples/demo -vet timeout-minutes: 10 - name: Odin run - run: ./odin run examples/demo/demo.odin + run: ./odin run examples/demo timeout-minutes: 10 - name: Odin run -debug - run: ./odin run examples/demo/demo.odin -debug + run: ./odin run examples/demo -debug + timeout-minutes: 10 + - name: Odin check examples/local + run: ./odin check examples/all timeout-minutes: 10 - name: Core library tests run: | @@ -54,13 +57,16 @@ jobs: run: ./odin report timeout-minutes: 1 - name: Odin check - run: ./odin check examples/demo/demo.odin -vet + run: ./odin check examples/demo -vet timeout-minutes: 10 - name: Odin run - run: ./odin run examples/demo/demo.odin + run: ./odin run examples/demo timeout-minutes: 10 - name: Odin run -debug - run: ./odin run examples/demo/demo.odin -debug + run: ./odin run examples/demo -debug + timeout-minutes: 10 + - name: Odin check examples/local + run: ./odin check examples/all timeout-minutes: 10 - name: Core library tests run: | @@ -91,19 +97,24 @@ jobs: shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat - odin check examples/demo/demo.odin -vet + odin check examples/demo -vet timeout-minutes: 10 - name: Odin run shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat - odin run examples/demo/demo.odin + odin run examples/demo timeout-minutes: 10 - name: Odin run -debug shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat - odin run examples/demo/demo.odin -debug + odin run examples/demo -debug + timeout-minutes: 10 + - name: Odin check examples/local + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat + odin check examples/all timeout-minutes: 10 - name: Core library tests shell: cmd From 1502066303fdb448ce83350419bb4b74fa9d6289 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 30 Jan 2022 21:43:42 +0000 Subject: [PATCH 057/117] Correct CI --- .github/workflows/ci.yml | 7 ++++--- examples/all/all_main.odin | 2 -- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 575d2406d..fcb909a14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: Odin run -debug run: ./odin run examples/demo -debug timeout-minutes: 10 - - name: Odin check examples/local + - name: Odin check examples/all run: ./odin check examples/all timeout-minutes: 10 - name: Core library tests @@ -65,7 +65,7 @@ jobs: - name: Odin run -debug run: ./odin run examples/demo -debug timeout-minutes: 10 - - name: Odin check examples/local + - name: Odin check examples/all run: ./odin check examples/all timeout-minutes: 10 - name: Core library tests @@ -111,7 +111,8 @@ jobs: call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat odin run examples/demo -debug timeout-minutes: 10 - - name: Odin check examples/local + - name: Odin check examples/all + shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat odin check examples/all diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 199f406f7..b520faf4d 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -13,7 +13,6 @@ import compress "core:compress" import gzip "core:compress/gzip" import zlib "core:compress/zlib" -import container "core:container" import bit_array "core:container/bit_array" import priority_queue "core:container/priority_queue" import queue "core:container/queue" @@ -49,7 +48,6 @@ import x25519 "core:crypto/x25519" import dynlib "core:dynlib" -import encoding "core:encoding" import base32 "core:encoding/base32" import base64 "core:encoding/base64" import csv "core:encoding/csv" From 44ec95a983facb42ee815e12cf3355ae68406757 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 30 Jan 2022 21:55:55 +0000 Subject: [PATCH 058/117] Fix all_main.odin --- examples/all/all_main.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index b520faf4d..1f4d4357c 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -114,7 +114,6 @@ _ :: libc _ :: compress _ :: gzip _ :: zlib -_ :: container _ :: bit_array _ :: priority_queue _ :: queue @@ -147,7 +146,6 @@ _ :: crypto_util _ :: whirlpool _ :: x25519 _ :: dynlib -_ :: encoding _ :: base32 _ :: base64 _ :: csv From da1edac56debf698d493b87a09cfd65f504bb51a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 31 Jan 2022 11:29:05 +0000 Subject: [PATCH 059/117] Enforce `-strict-style` in CI --- .github/workflows/ci.yml | 6 +++--- core/os/os_darwin.odin | 6 +++--- core/testing/runner_other.odin | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fcb909a14..a1f96d20b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: run: ./odin run examples/demo -debug timeout-minutes: 10 - name: Odin check examples/all - run: ./odin check examples/all + run: ./odin check examples/all -strict-style timeout-minutes: 10 - name: Core library tests run: | @@ -66,7 +66,7 @@ jobs: run: ./odin run examples/demo -debug timeout-minutes: 10 - name: Odin check examples/all - run: ./odin check examples/all + run: ./odin check examples/all -strict-style timeout-minutes: 10 - name: Core library tests run: | @@ -115,7 +115,7 @@ jobs: shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat - odin check examples/all + odin check examples/all -strict-style timeout-minutes: 10 - name: Core library tests shell: cmd diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index b32453a5d..ef1d6185a 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -296,7 +296,7 @@ foreign libc { @(link_name="readdir_r$INODE64") _unix_readdir_r :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- @(link_name="fcntl") _unix_fcntl :: proc(fd: Handle, cmd: c.int, buf: ^byte) -> c.int --- - @(link_name="fchmod") _unix_fchmod :: proc(fildes: Handle, mode: u16) -> c.int ---; + @(link_name="fchmod") _unix_fchmod :: proc(fildes: Handle, mode: u16) -> c.int --- @(link_name="malloc") _unix_malloc :: proc(size: int) -> rawptr --- @(link_name="calloc") _unix_calloc :: proc(num, size: int) -> rawptr --- @@ -307,7 +307,7 @@ foreign libc { @(link_name="chdir") _unix_chdir :: proc(buf: cstring) -> c.int --- @(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: rawptr) -> rawptr --- - @(link_name="strerror") _darwin_string_error :: proc(num : c.int) -> cstring ---; + @(link_name="strerror") _darwin_string_error :: proc(num : c.int) -> cstring --- @(link_name="exit") _unix_exit :: proc(status: c.int) -> ! --- } @@ -324,7 +324,7 @@ get_last_error :: proc() -> int { } get_last_error_string :: proc() -> string { - return cast(string)_darwin_string_error(cast(c.int)get_last_error()); + return cast(string)_darwin_string_error(cast(c.int)get_last_error()) } open :: proc(path: string, flags: int = O_RDWR, mode: int = 0) -> (Handle, Errno) { diff --git a/core/testing/runner_other.odin b/core/testing/runner_other.odin index 3978a3c83..f3271d209 100644 --- a/core/testing/runner_other.odin +++ b/core/testing/runner_other.odin @@ -6,7 +6,7 @@ import "core:time" run_internal_test :: proc(t: ^T, it: Internal_Test) { // TODO(bill): Catch panics on other platforms - it.p(t); + it.p(t) } _fail_timeout :: proc(t: ^T, duration: time.Duration, loc := #caller_location) { From 1a9ec776cbd183d74a6d62cc4b4ef8c0fa8f085d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 31 Jan 2022 12:43:20 +0000 Subject: [PATCH 060/117] Unify logic for `slice.sort*` related procedures --- core/slice/sort.odin | 493 +---------------------------------- core/slice/sort_private.odin | 177 +++++++++++++ 2 files changed, 182 insertions(+), 488 deletions(-) create mode 100644 core/slice/sort_private.odin diff --git a/core/slice/sort.odin b/core/slice/sort.odin index d9755ad0e..24bce79af 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -1,10 +1,5 @@ package slice -import "core:intrinsics" -_ :: intrinsics - -ORD :: intrinsics.type_is_ordered - Ordering :: enum { Less = -1, Equal = 0, @@ -38,7 +33,7 @@ cmp_proc :: proc($E: typeid) -> (proc(E, E) -> Ordering) where ORD(E) { sort :: proc(data: $T/[]$E) where ORD(E) { when size_of(E) != 0 { if n := len(data); n > 1 { - _quick_sort(data, 0, n, _max_depth(n)) + _quick_sort_general(data, 0, n, _max_depth(n), struct{}{}, .Ordered) } } } @@ -48,7 +43,7 @@ sort :: proc(data: $T/[]$E) where ORD(E) { sort_by :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool) { when size_of(E) != 0 { if n := len(data); n > 1 { - _quick_sort_less(data, 0, n, _max_depth(n), less) + _quick_sort_general(data, 0, n, _max_depth(n), less, .Less) } } } @@ -56,7 +51,7 @@ sort_by :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool) { sort_by_cmp :: proc(data: $T/[]$E, cmp: proc(i, j: E) -> Ordering) { when size_of(E) != 0 { if n := len(data); n > 1 { - _quick_sort_cmp(data, 0, n, _max_depth(n), cmp) + _quick_sort_general(data, 0, n, _max_depth(n), cmp, .Cmp) } } } @@ -79,6 +74,7 @@ is_sorted_by :: proc(array: $T/[]$E, less: proc(i, j: E) -> bool) -> bool { return true } +is_sorted_by_cmp :: is_sorted_cmp is_sorted_cmp :: proc(array: $T/[]$E, cmp: proc(i, j: E) -> Ordering) -> bool { for i := len(array)-1; i > 0; i -= 1 { if cmp(array[i], array[i-1]) == .Equal { @@ -140,489 +136,10 @@ is_sorted_by_key :: proc(array: $T/[]$E, key: proc(E) -> $K) -> bool where ORD(K return true } - - @(private) -_max_depth :: proc(n: int) -> int { // 2*ceil(log2(n+1)) - depth: int +_max_depth :: proc(n: int) -> (depth: int) { // 2*ceil(log2(n+1)) for i := n; i > 0; i >>= 1 { depth += 1 } return depth * 2 } - -@(private) -_quick_sort :: proc(data: $T/[]$E, a, b, max_depth: int) where ORD(E) #no_bounds_check { - median3 :: proc(data: T, m1, m0, m2: int) #no_bounds_check { - if data[m1] < data[m0] { - swap(data, m1, m0) - } - if data[m2] < data[m1] { - swap(data, m2, m1) - if data[m1] < data[m0] { - swap(data, m1, m0) - } - } - } - - do_pivot :: proc(data: T, lo, hi: int) -> (midlo, midhi: int) #no_bounds_check { - m := int(uint(lo+hi)>>1) - if hi-lo > 40 { - s := (hi-lo)/8 - median3(data, lo, lo+s, lo+s*2) - median3(data, m, m-s, m+s) - median3(data, hi-1, hi-1-s, hi-1-s*2) - } - median3(data, lo, m, hi-1) - - - pivot := lo - a, c := lo+1, hi-1 - - for ; a < c && data[a] < data[pivot]; a += 1 { - } - b := a - - for { - for ; b < c && !(data[pivot] < data[b]); b += 1 { // data[b] <= pivot - } - for ; b < c && data[pivot] < data[c-1]; c -=1 { // data[c-1] > pivot - } - if b >= c { - break - } - - swap(data, b, c-1) - b += 1 - c -= 1 - } - - protect := hi-c < 5 - if !protect && hi-c < (hi-lo)/4 { - dups := 0 - if !(data[pivot] < data[hi-1]) { - swap(data, c, hi-1) - c += 1 - dups += 1 - } - if !(data[b-1] < data[pivot]) { - b -= 1 - dups += 1 - } - - if !(data[m] < data[pivot]) { - swap(data, m, b-1) - b -= 1 - dups += 1 - } - protect = dups > 1 - } - if protect { - for { - for ; a < b && !(data[b-1] < data[pivot]); b -= 1 { - } - for ; a < b && data[a] < data[pivot]; a += 1 { - } - if a >= b { - break - } - swap(data, a, b-1) - a += 1 - b -= 1 - } - } - swap(data, pivot, b-1) - return b-1, c - } - - - a, b, max_depth := a, b, max_depth - - if b-a > 12 { // only use shell sort for lengths <= 12 - if max_depth == 0 { - _heap_sort(data, a, b) - return - } - max_depth -= 1 - mlo, mhi := do_pivot(data, a, b) - if mlo-a < b-mhi { - _quick_sort(data, a, mlo, max_depth) - a = mhi - } else { - _quick_sort(data, mhi, b, max_depth) - b = mlo - } - } - if b-a > 1 { - // Shell short with gap 6 - for i in a+6.. a && data[j] < data[j-1]; j -= 1 { - swap(data, j, j-1) - } - } -} - -@(private) -_heap_sort :: proc(data: $T/[]$E, a, b: int) where ORD(E) #no_bounds_check { - sift_down :: proc(data: T, lo, hi, first: int) #no_bounds_check { - root := lo - for { - child := 2*root + 1 - if child >= hi { - break - } - if child+1 < hi && data[first+child] < data[first+child+1] { - child += 1 - } - if !(data[first+root] < data[first+child]) { - return - } - swap(data, first+root, first+child) - root = child - } - } - - - first, lo, hi := a, 0, b-a - - for i := (hi-1)/2; i >= 0; i -= 1 { - sift_down(data, i, hi, first) - } - - for i := hi-1; i >= 0; i -= 1 { - swap(data, first, first+i) - sift_down(data, lo, i, first) - } -} - - - - - - -@(private) -_quick_sort_less :: proc(data: $T/[]$E, a, b, max_depth: int, less: proc(i, j: E) -> bool) #no_bounds_check { - median3 :: proc(data: T, m1, m0, m2: int, less: proc(i, j: E) -> bool) #no_bounds_check { - if less(data[m1], data[m0]) { - swap(data, m1, m0) - } - if less(data[m2], data[m1]) { - swap(data, m2, m1) - if less(data[m1], data[m0]) { - swap(data, m1, m0) - } - } - } - - do_pivot :: proc(data: T, lo, hi: int, less: proc(i, j: E) -> bool) -> (midlo, midhi: int) #no_bounds_check { - m := int(uint(lo+hi)>>1) - if hi-lo > 40 { - s := (hi-lo)/8 - median3(data, lo, lo+s, lo+s*2, less) - median3(data, m, m-s, m+s, less) - median3(data, hi-1, hi-1-s, hi-1-s*2, less) - } - median3(data, lo, m, hi-1, less) - - pivot := lo - a, c := lo+1, hi-1 - - for ; a < c && less(data[a], data[pivot]); a += 1 { - } - b := a - - for { - for ; b < c && !less(data[pivot], data[b]); b += 1 { // data[b] <= pivot - } - for ; b < c && less(data[pivot], data[c-1]); c -=1 { // data[c-1] > pivot - } - if b >= c { - break - } - - swap(data, b, c-1) - b += 1 - c -= 1 - } - - protect := hi-c < 5 - if !protect && hi-c < (hi-lo)/4 { - dups := 0 - if !less(data[pivot], data[hi-1]) { - swap(data, c, hi-1) - c += 1 - dups += 1 - } - if !less(data[b-1], data[pivot]) { - b -= 1 - dups += 1 - } - - if !less(data[m], data[pivot]) { - swap(data, m, b-1) - b -= 1 - dups += 1 - } - protect = dups > 1 - } - if protect { - for { - for ; a < b && !less(data[b-1], data[pivot]); b -= 1 { - } - for ; a < b && less(data[a], data[pivot]); a += 1 { - } - if a >= b { - break - } - swap(data, a, b-1) - a += 1 - b -= 1 - } - } - swap(data, pivot, b-1) - return b-1, c - } - - - a, b, max_depth := a, b, max_depth - - if b-a > 12 { // only use shell sort for lengths <= 12 - if max_depth == 0 { - _heap_sort_less(data, a, b, less) - return - } - max_depth -= 1 - mlo, mhi := do_pivot(data, a, b, less) - if mlo-a < b-mhi { - _quick_sort_less(data, a, mlo, max_depth, less) - a = mhi - } else { - _quick_sort_less(data, mhi, b, max_depth, less) - b = mlo - } - } - if b-a > 1 { - // Shell short with gap 6 - for i in a+6.. bool) #no_bounds_check { - for i in a+1.. a && less(data[j], data[j-1]); j -= 1 { - swap(data, j, j-1) - } - } -} - -@(private) -_heap_sort_less :: proc(data: $T/[]$E, a, b: int, less: proc(i, j: E) -> bool) #no_bounds_check { - sift_down :: proc(data: T, lo, hi, first: int, less: proc(i, j: E) -> bool) #no_bounds_check { - root := lo - for { - child := 2*root + 1 - if child >= hi { - break - } - if child+1 < hi && less(data[first+child], data[first+child+1]) { - child += 1 - } - if !less(data[first+root], data[first+child]) { - return - } - swap(data, first+root, first+child) - root = child - } - } - - - first, lo, hi := a, 0, b-a - - for i := (hi-1)/2; i >= 0; i -= 1 { - sift_down(data, i, hi, first, less) - } - - for i := hi-1; i >= 0; i -= 1 { - swap(data, first, first+i) - sift_down(data, lo, i, first, less) - } -} - - - - - - -@(private) -_quick_sort_cmp :: proc(data: $T/[]$E, a, b, max_depth: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { - median3 :: proc(data: T, m1, m0, m2: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { - if cmp(data[m1], data[m0]) == .Less { - swap(data, m1, m0) - } - if cmp(data[m2], data[m1]) == .Less { - swap(data, m2, m1) - if cmp(data[m1], data[m0]) == .Less { - swap(data, m1, m0) - } - } - } - - do_pivot :: proc(data: T, lo, hi: int, cmp: proc(i, j: E) -> Ordering) -> (midlo, midhi: int) #no_bounds_check { - m := int(uint(lo+hi)>>1) - if hi-lo > 40 { - s := (hi-lo)/8 - median3(data, lo, lo+s, lo+s*2, cmp) - median3(data, m, m-s, m+s, cmp) - median3(data, hi-1, hi-1-s, hi-1-s*2, cmp) - } - median3(data, lo, m, hi-1, cmp) - - pivot := lo - a, c := lo+1, hi-1 - - for ; a < c && cmp(data[a], data[pivot]) == .Less; a += 1 { - } - b := a - - for { - for ; b < c && cmp(data[pivot], data[b]) >= .Equal; b += 1 { // data[b] <= pivot - } - for ; b < c && cmp(data[pivot], data[c-1]) == .Less; c -=1 { // data[c-1] > pivot - } - if b >= c { - break - } - - swap(data, b, c-1) - b += 1 - c -= 1 - } - - protect := hi-c < 5 - if !protect && hi-c < (hi-lo)/4 { - dups := 0 - if cmp(data[pivot], data[hi-1]) != .Less { - swap(data, c, hi-1) - c += 1 - dups += 1 - } - if cmp(data[b-1], data[pivot]) != .Less { - b -= 1 - dups += 1 - } - - if cmp(data[m], data[pivot]) != .Less { - swap(data, m, b-1) - b -= 1 - dups += 1 - } - protect = dups > 1 - } - if protect { - for { - for ; a < b && cmp(data[b-1], data[pivot]) >= .Equal; b -= 1 { - } - for ; a < b && cmp(data[a], data[pivot]) == .Less; a += 1 { - } - if a >= b { - break - } - swap(data, a, b-1) - a += 1 - b -= 1 - } - } - swap(data, pivot, b-1) - return b-1, c - } - - - a, b, max_depth := a, b, max_depth - - if b-a > 12 { // only use shell sort for lengths <= 12 - if max_depth == 0 { - _heap_sort_cmp(data, a, b, cmp) - return - } - max_depth -= 1 - mlo, mhi := do_pivot(data, a, b, cmp) - if mlo-a < b-mhi { - _quick_sort_cmp(data, a, mlo, max_depth, cmp) - a = mhi - } else { - _quick_sort_cmp(data, mhi, b, max_depth, cmp) - b = mlo - } - } - if b-a > 1 { - // Shell short with gap 6 - for i in a+6.. Ordering) #no_bounds_check { - for i in a+1.. a && cmp(data[j], data[j-1]) == .Less; j -= 1 { - swap(data, j, j-1) - } - } -} - -@(private) -_heap_sort_cmp :: proc(data: $T/[]$E, a, b: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { - sift_down :: proc(data: T, lo, hi, first: int, cmp: proc(i, j: E) -> Ordering) #no_bounds_check { - root := lo - for { - child := 2*root + 1 - if child >= hi { - break - } - if child+1 < hi && cmp(data[first+child], data[first+child+1]) == .Less { - child += 1 - } - if cmp(data[first+root], data[first+child]) >= .Equal { - return - } - swap(data, first+root, first+child) - root = child - } - } - - - first, lo, hi := a, 0, b-a - - for i := (hi-1)/2; i >= 0; i -= 1 { - sift_down(data, i, hi, first, cmp) - } - - for i := hi-1; i >= 0; i -= 1 { - swap(data, first, first+i) - sift_down(data, lo, i, first, cmp) - } -} - - - diff --git a/core/slice/sort_private.odin b/core/slice/sort_private.odin new file mode 100644 index 000000000..3b990c1e7 --- /dev/null +++ b/core/slice/sort_private.odin @@ -0,0 +1,177 @@ +//+private +package slice + +import "core:intrinsics" +_ :: intrinsics + +ORD :: intrinsics.type_is_ordered + +Sort_Kind :: enum { + Ordered, + Less, + Cmp, +} + +_quick_sort_general :: proc(data: $T/[]$E, a, b, max_depth: int, call: $P, $KIND: Sort_Kind) where (ORD(E) && KIND == .Ordered) || (KIND != .Ordered) #no_bounds_check { + less :: #force_inline proc(a, b: $E, call: $P) -> bool { + when KIND == .Ordered { + return a < b + } else when KIND == .Less { + return call(a, b) + } else when KIND == .Cmp { + return call(a, b) == .Less + } else { + #panic("unhandled Sort_Kind") + } + } + + insertion_sort :: proc(data: $T/[]$E, a, b: int, call: P) #no_bounds_check { + for i in a+1.. a && less(data[j], data[j-1], call); j -= 1 { + swap(data, j, j-1) + } + } + } + + heap_sort :: proc(data: $T/[]$E, a, b: int, call: P) #no_bounds_check { + sift_down :: proc(data: T, lo, hi, first: int, call: P) #no_bounds_check { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && less(data[first+child], data[first+child+1], call) { + child += 1 + } + if !less(data[first+root], data[first+child], call) { + return + } + swap(data, first+root, first+child) + root = child + } + } + + + first, lo, hi := a, 0, b-a + + for i := (hi-1)/2; i >= 0; i -= 1 { + sift_down(data, i, hi, first, call) + } + + for i := hi-1; i >= 0; i -= 1 { + swap(data, first, first+i) + sift_down(data, lo, i, first, call) + } + } + + median3 :: proc(data: T, m1, m0, m2: int, call: P) #no_bounds_check { + if less(data[m1], data[m0], call) { + swap(data, m1, m0) + } + if less(data[m2], data[m1], call) { + swap(data, m2, m1) + if less(data[m1], data[m0], call) { + swap(data, m1, m0) + } + } + } + + do_pivot :: proc(data: T, lo, hi: int, call: P) -> (midlo, midhi: int) #no_bounds_check { + m := int(uint(lo+hi)>>1) + if hi-lo > 40 { + s := (hi-lo)/8 + median3(data, lo, lo+s, lo+s*2, call) + median3(data, m, m-s, m+s, call) + median3(data, hi-1, hi-1-s, hi-1-s*2, call) + } + median3(data, lo, m, hi-1, call) + + pivot := lo + a, c := lo+1, hi-1 + + + for ; a < c && less(data[a], data[pivot], call); a += 1 { + } + b := a + + for { + for ; b < c && !less(data[pivot], data[b], call); b += 1 { // data[b] <= pivot + } + for ; b < c && less(data[pivot], data[c-1], call); c -=1 { // data[c-1] > pivot + } + if b >= c { + break + } + + swap(data, b, c-1) + b += 1 + c -= 1 + } + + protect := hi-c < 5 + if !protect && hi-c < (hi-lo)/4 { + dups := 0 + if !less(data[pivot], data[hi-1], call) { + swap(data, c, hi-1) + c += 1 + dups += 1 + } + if !less(data[b-1], data[pivot], call) { + b -= 1 + dups += 1 + } + + if !less(data[m], data[pivot], call) { + swap(data, m, b-1) + b -= 1 + dups += 1 + } + protect = dups > 1 + } + if protect { + for { + for ; a < b && !less(data[b-1], data[pivot], call); b -= 1 { + } + for ; a < b && less(data[a], data[pivot], call); a += 1 { + } + if a >= b { + break + } + swap(data, a, b-1) + a += 1 + b -= 1 + } + } + swap(data, pivot, b-1) + return b-1, c + } + + + a, b, max_depth := a, b, max_depth + + if b-a > 12 { // only use shell sort for lengths <= 12 + if max_depth == 0 { + heap_sort(data, a, b, call) + return + } + max_depth -= 1 + mlo, mhi := do_pivot(data, a, b, call) + if mlo-a < b-mhi { + _quick_sort_general(data, a, mlo, max_depth, call, KIND) + a = mhi + } else { + _quick_sort_general(data, mhi, b, max_depth, call, KIND) + b = mlo + } + } + if b-a > 1 { + // Shell short with gap 6 + for i in a+6.. Date: Mon, 31 Jan 2022 15:55:52 +0000 Subject: [PATCH 061/117] Add `slice.stable_sort*` procedures --- core/slice/slice.odin | 24 ++++++++++++------------ core/slice/sort.odin | 26 ++++++++++++++++++++++++++ core/slice/sort_private.odin | 23 +++++++++++++++++++++++ 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 426829a22..5fecc76b1 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -305,21 +305,21 @@ filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) - } scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U)->V, allocator := context.allocator) -> []V { - if len(s) == 0 { return {} } + if len(s) == 0 { return {} } - res := make([]V, len(s), allocator) - p := as_ptr(s) - q := as_ptr(res) - r := initializer + res := make([]V, len(s), allocator) + p := as_ptr(s) + q := as_ptr(res) + r := initializer - for l := len(s); l > 0; l -= 1 { - r = f(r, p[0]) - q[0] = r - p = p[1:] - q = q[1:] - } + for l := len(s); l > 0; l -= 1 { + r = f(r, p[0]) + q[0] = r + p = p[1:] + q = q[1:] + } - return res + return res } diff --git a/core/slice/sort.odin b/core/slice/sort.odin index 24bce79af..8a2dec039 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -56,6 +56,32 @@ sort_by_cmp :: proc(data: $T/[]$E, cmp: proc(i, j: E) -> Ordering) { } } +// stable_sort sorts a slice +stable_sort :: proc(data: $T/[]$E) where ORD(E) { + when size_of(E) != 0 { + if n := len(data); n > 1 { + _stable_sort_general(data, struct{}{}, .Ordered) + } + } +} + +// stable_sort_by sorts a slice with a given procedure to test whether two values are ordered "i < j" +stable_sort_by :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool) { + when size_of(E) != 0 { + if n := len(data); n > 1 { + _stable_sort_general(data, less, .Less) + } + } +} + +stable_sort_by_cmp :: proc(data: $T/[]$E, cmp: proc(i, j: E) -> Ordering) { + when size_of(E) != 0 { + if n := len(data); n > 1 { + _stable_sort_general(data, cmp, .Cmp) + } + } +} + is_sorted :: proc(array: $T/[]$E) -> bool where ORD(E) { for i := len(array)-1; i > 0; i -= 1 { if array[i] < array[i-1] { diff --git a/core/slice/sort_private.odin b/core/slice/sort_private.odin index 3b990c1e7..05e4d5eed 100644 --- a/core/slice/sort_private.odin +++ b/core/slice/sort_private.odin @@ -175,3 +175,26 @@ _quick_sort_general :: proc(data: $T/[]$E, a, b, max_depth: int, call: $P, $KIND insertion_sort(data, a, b, call) } } + + +// merge sort +_stable_sort_general :: proc(data: $T/[]$E, call: $P, $KIND: Sort_Kind) where (ORD(E) && KIND == .Ordered) || (KIND != .Ordered) #no_bounds_check { + less :: #force_inline proc(a, b: $E, call: $P) -> bool { + when KIND == .Ordered { + return a < b + } else when KIND == .Less { + return call(a, b) + } else when KIND == .Cmp { + return call(a, b) == .Less + } else { + #panic("unhandled Sort_Kind") + } + } + + n := len(data) + for i in 1.. 0 && less(data[j], data[j-1], call); j -= 1 { + swap(data, j, j-1) + } + } +} From 2f1aeaf757bce1ebc37bd5e63dfcdfe22685deaf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 31 Jan 2022 15:56:40 +0000 Subject: [PATCH 062/117] Remove the unneeded `$` --- core/slice/sort_private.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/slice/sort_private.odin b/core/slice/sort_private.odin index 05e4d5eed..7abd2f1ce 100644 --- a/core/slice/sort_private.odin +++ b/core/slice/sort_private.odin @@ -13,7 +13,7 @@ Sort_Kind :: enum { } _quick_sort_general :: proc(data: $T/[]$E, a, b, max_depth: int, call: $P, $KIND: Sort_Kind) where (ORD(E) && KIND == .Ordered) || (KIND != .Ordered) #no_bounds_check { - less :: #force_inline proc(a, b: $E, call: $P) -> bool { + less :: #force_inline proc(a, b: E, call: P) -> bool { when KIND == .Ordered { return a < b } else when KIND == .Less { @@ -179,7 +179,7 @@ _quick_sort_general :: proc(data: $T/[]$E, a, b, max_depth: int, call: $P, $KIND // merge sort _stable_sort_general :: proc(data: $T/[]$E, call: $P, $KIND: Sort_Kind) where (ORD(E) && KIND == .Ordered) || (KIND != .Ordered) #no_bounds_check { - less :: #force_inline proc(a, b: $E, call: $P) -> bool { + less :: #force_inline proc(a, b: E, call: P) -> bool { when KIND == .Ordered { return a < b } else when KIND == .Less { From 67ba05cb7cfee60daaf257230ddbc4f1e0a9f8ac Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 31 Jan 2022 19:33:02 +0000 Subject: [PATCH 063/117] Correct false positive check in `check_unique_package_names` --- src/checker.cpp | 10 ++++++++-- src/parser.cpp | 5 +++++ src/parser_pos.cpp | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 038709056..d9a1af0d1 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -5307,12 +5307,18 @@ void check_unique_package_names(Checker *c) { string_map_set(&pkgs, key, pkg); continue; } + auto *this = pkg->files[0]->pkg_decl; + auto *other = (*found)->files[0]->pkg_decl; + if (this == other) { + // NOTE(bill): A false positive was found, ignore it + continue; + } - error(pkg->files[0]->pkg_decl, "Duplicate declaration of 'package %.*s'", LIT(name)); + error(this, "Duplicate declaration of 'package %.*s'", LIT(name)); error_line("\tA package name must be unique\n" "\tThere is no relation between a package name and the directory that contains it, so they can be completely different\n" "\tA package name is required for link name prefixing to have a consistent ABI\n"); - error((*found)->files[0]->pkg_decl, "found at previous location"); + error(other, "found at previous location"); } } diff --git a/src/parser.cpp b/src/parser.cpp index 9cc9adfc9..7a858e520 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -183,6 +183,11 @@ Ast *clone_ast(Ast *node) { n->FieldValue.value = clone_ast(n->FieldValue.value); break; + case Ast_EnumFieldValue: + n->EnumFieldValue.name = clone_ast(n->EnumFieldValue.name); + n->EnumFieldValue.value = clone_ast(n->EnumFieldValue.value); + break; + case Ast_TernaryIfExpr: n->TernaryIfExpr.x = clone_ast(n->TernaryIfExpr.x); n->TernaryIfExpr.cond = clone_ast(n->TernaryIfExpr.cond); diff --git a/src/parser_pos.cpp b/src/parser_pos.cpp index 6ef0db215..54c3ec1f1 100644 --- a/src/parser_pos.cpp +++ b/src/parser_pos.cpp @@ -39,6 +39,7 @@ Token ast_token(Ast *node) { case Ast_SliceExpr: return node->SliceExpr.open; case Ast_Ellipsis: return node->Ellipsis.token; case Ast_FieldValue: return node->FieldValue.eq; + case Ast_EnumFieldValue: return ast_token(node->EnumFieldValue.name); case Ast_DerefExpr: return node->DerefExpr.op; case Ast_TernaryIfExpr: return ast_token(node->TernaryIfExpr.x); case Ast_TernaryWhenExpr: return ast_token(node->TernaryWhenExpr.x); @@ -178,6 +179,11 @@ Token ast_end_token(Ast *node) { } return node->Ellipsis.token; case Ast_FieldValue: return ast_end_token(node->FieldValue.value); + case Ast_EnumFieldValue: + if (node->EnumFieldValue.value) { + return ast_end_token(node->EnumFieldValue.value); + } + return ast_end_token(node->EnumFieldValue.name); case Ast_DerefExpr: return node->DerefExpr.op; case Ast_TernaryIfExpr: return ast_end_token(node->TernaryIfExpr.y); case Ast_TernaryWhenExpr: return ast_end_token(node->TernaryWhenExpr.y); From 85706d559d06998895b27710f5e4f4643443b032 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 31 Jan 2022 20:19:46 +0000 Subject: [PATCH 064/117] Fix typo --- src/checker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index d9a1af0d1..d50d4d176 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -5307,18 +5307,18 @@ void check_unique_package_names(Checker *c) { string_map_set(&pkgs, key, pkg); continue; } - auto *this = pkg->files[0]->pkg_decl; - auto *other = (*found)->files[0]->pkg_decl; - if (this == other) { + auto *curr = pkg->files[0]->pkg_decl; + auto *prev = (*found)->files[0]->pkg_decl; + if (curr == prev) { // NOTE(bill): A false positive was found, ignore it continue; } - error(this, "Duplicate declaration of 'package %.*s'", LIT(name)); + error(curr, "Duplicate declaration of 'package %.*s'", LIT(name)); error_line("\tA package name must be unique\n" "\tThere is no relation between a package name and the directory that contains it, so they can be completely different\n" "\tA package name is required for link name prefixing to have a consistent ABI\n"); - error(other, "found at previous location"); + error(prev, "found at previous location"); } } From eac74631ecb74689dbe6bb1e1d07cd15f1fc677a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 1 Feb 2022 14:11:19 +0000 Subject: [PATCH 065/117] Correct debug information logic for procedure parameters --- src/llvm_backend.hpp | 1 + src/llvm_backend_debug.cpp | 71 ++++++++++++++++++++++++++++++++++++++ src/llvm_backend_proc.cpp | 9 ++--- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 49f675a49..d7093bc63 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -232,6 +232,7 @@ struct lbTargetList { enum lbProcedureFlag : u32 { lbProcedureFlag_WithoutMemcpyPass = 1<<0, + lbProcedureFlag_DebugAllocaCopy = 1<<1, }; struct lbCopyElisionHint { diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index 7a2b00fe9..f60096aad 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -965,6 +965,77 @@ void lb_add_debug_local_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, T LLVMDIBuilderInsertDeclareBefore(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, instr); } + +void lb_add_debug_param_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token, unsigned arg_number) { + if (p->debug_info == nullptr) { + return; + } + if (type == nullptr) { + return; + } + if (type == t_invalid) { + return; + } + if (p->body == nullptr) { + return; + } + + lbModule *m = p->module; + String const &name = token.string; + if (name == "" || name == "_") { + return; + } + + if (lb_get_llvm_metadata(m, ptr) != nullptr) { + // Already been set + return; + } + + + AstFile *file = p->body->file(); + + LLVMMetadataRef llvm_scope = lb_get_current_debug_scope(p); + LLVMMetadataRef llvm_file = lb_get_llvm_metadata(m, file); + GB_ASSERT(llvm_scope != nullptr); + if (llvm_file == nullptr) { + llvm_file = LLVMDIScopeGetFile(llvm_scope); + } + + if (llvm_file == nullptr) { + return; + } + + LLVMDIFlags flags = LLVMDIFlagZero; + LLVMBool always_preserve = build_context.optimization_level == 0; + + LLVMMetadataRef debug_type = lb_debug_type(m, type); + + LLVMMetadataRef var_info = LLVMDIBuilderCreateParameterVariable( + m->debug_builder, llvm_scope, + cast(char const *)name.text, cast(size_t)name.len, + arg_number, + llvm_file, token.pos.line, + debug_type, + always_preserve, flags + ); + + LLVMValueRef storage = ptr; + LLVMValueRef instr = ptr; + LLVMBasicBlockRef block = p->decl_block->block; + LLVMMetadataRef llvm_debug_loc = lb_debug_location_from_token_pos(p, token.pos); + LLVMMetadataRef llvm_expr = LLVMDIBuilderCreateExpression(m->debug_builder, nullptr, 0); + lb_set_llvm_metadata(m, ptr, llvm_expr); + if (LLVMIsAAllocaInst(instr)) { + LLVMDIBuilderInsertDeclareBefore(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, instr); + } else { + // NOTE(bill, 2022-02-01): For parameter values, you must insert them at the end of the decl block + // The reason is that if the parameter is at index 0 and a pointer, there is not such things as an + // instruction "before" it. + LLVMDIBuilderInsertDeclareAtEnd(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, block); + } +} + + void lb_add_debug_context_variable(lbProcedure *p, lbAddr const &ctx) { if (!p->debug_info || !p->body) { return; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 9f9fe7c7a..7a6fac603 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -473,6 +473,8 @@ void lb_begin_procedure_body(lbProcedure *p) { } lbArgType *arg_type = &ft->args[param_index]; + defer (param_index += 1); + if (arg_type->kind == lbArg_Ignore) { continue; } else if (arg_type->kind == lbArg_Direct) { @@ -487,20 +489,19 @@ void lb_begin_procedure_body(lbProcedure *p) { param.type = e->type; lbValue ptr = lb_address_from_load_or_generate_local(p, param); + GB_ASSERT(LLVMIsAAllocaInst(ptr.value)); lb_add_entity(p->module, e, ptr); - // lb_add_debug_local_variable(p, ptr.value, e->type, e->token); + lb_add_debug_param_variable(p, ptr.value, e->type, e->token, param_index+1); } } else if (arg_type->kind == lbArg_Indirect) { if (e->token.string.len != 0 && !is_blank_ident(e->token.string)) { lbValue ptr = {}; ptr.value = LLVMGetParam(p->value, param_offset+param_index); ptr.type = alloc_type_pointer(e->type); - lb_add_entity(p->module, e, ptr); - // lb_add_debug_local_variable(p, ptr.value, e->type, e->token); + lb_add_debug_param_variable(p, ptr.value, e->type, e->token, param_index+1); } } - param_index += 1; } } From 8c9505505a0bf335a990b5ca05650aa6dcd08c30 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 1 Feb 2022 15:23:49 +0000 Subject: [PATCH 066/117] Add allocator parameter to `rand.perm` --- core/math/rand/rand.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 04e2c6414..29254d8f4 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -142,8 +142,8 @@ read :: proc(p: []byte, r: ^Rand = nil) -> (n: int) { } // perm returns a slice of n ints in a pseudo-random permutation of integers in the range [0, n) -perm :: proc(n: int, r: ^Rand = nil) -> []int { - m := make([]int, n) +perm :: proc(n: int, r: ^Rand = nil, allocator := context.allocator) -> []int { + m := make([]int, n, allocator) for i := 0; i < n; i += 1 { j := int_max(i+1, r) m[i] = m[j] From a04d849e30da1252e56d29ee18e2a51a5b6cb0d5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 1 Feb 2022 15:24:37 +0000 Subject: [PATCH 067/117] `core:container/lru` --- core/container/lru/lru_cache.odin | 183 ++++++++++++++++++++++++++++++ examples/all/all_main.odin | 3 +- 2 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 core/container/lru/lru_cache.odin diff --git a/core/container/lru/lru_cache.odin b/core/container/lru/lru_cache.odin new file mode 100644 index 000000000..02bb20da0 --- /dev/null +++ b/core/container/lru/lru_cache.odin @@ -0,0 +1,183 @@ +package container_lru + +import "core:intrinsics" +import "core:mem" +_ :: intrinsics +_ :: mem + +Node :: struct($Key, $Value: typeid) where intrinsics.type_is_valid_map_key(Key) { + prev, next: ^Node(Key, Value), + key: Key, + value: Value, +} + +// Cache is an LRU cache. It automatically removes entries as new entries are +// added if the capacity is reached. Entries are removed based on how recently +// they were used where the oldest entries are removed first. +Cache :: struct($Key, $Value: typeid) where intrinsics.type_is_valid_map_key(Key) { + head: ^Node(Key, Value), + tail: ^Node(Key, Value), + + entries: map[Key]^Node(Key, Value), + + count: int, + capacity: int, + + node_allocator: mem.Allocator, + + on_remove: proc(key: Key, value: Value, user_data: rawptr), + on_remove_user_data: rawptr, + call_on_remove_on_destroy: bool, +} + +// init initializes a Cache +init :: proc(c: ^$C/Cache($Key, $Value), capacity: int, entries_allocator := context.allocator, node_allocator := context.allocator) { + c.entries.allocator = entries_allocator + c.node_allocator = node_allocator + c.capacity = capacity +} + +// destroy deinitializes a Cache +destroy :: proc(c: ^$C/Cache($Key, $Value)) { + for _, node in c.entries { + if c.call_on_remove_on_destroy && c.on_remove != nil { + c.on_remove(node.key, node.value, c.on_remove_user_data) + } + free(node, c.node_allocator) + } + clear(&c.entries) + delete(c.entries) + c.head = nil + c.tail = nil + c.count = 0 +} + +// set the given key value pair. This operation updates the recent usage of the item. +set :: proc(c: ^$C/Cache($Key, $Value), key: Key, value: Value) -> mem.Allocator_Error { + if e, ok := c.entries[key]; ok { + e.value = value + return nil + } + + e := new(Node(Key, Value), c.node_allocator) or_return + e.key = key + e.value = value + + _push_front_node(c, e) + if c.count > c.capacity { + _remove_node(c, c.tail) + } + + c.entries[key] = e + return nil +} + +// get a value from the cache from a given key. This operation updates the usage of the item. +get :: proc(c: ^$C/Cache($Key, $Value), key: Key) -> (value: Value, ok: bool) #optional_ok { + e: ^Node(Key, Value) + e, ok = c.entries[key] + if !ok { + return + } + _pop_node(c, e) + _push_front_node(c, e) + return e.value, true +} + +// get_ptr gets the pointer to a value the cache from a given key. This operation updates the usage of the item. +get_ptr :: proc(c: ^$C/Cache($Key, $Value), key: Key) -> (value: ^Value, ok: bool) #optional_ok { + e: ^Node(Key, Value) + e, ok = c.entries[key] + if !ok { + return + } + _pop_node(c, e) + _push_front_node(c, e) + return &e.value, true +} + +// peek gets the value from the cache from a given key without updating the recent usage. +peek :: proc(c: ^$C/Cache($Key, $Value), key: Key) -> (value: Value, ok: bool) #optional_ok { + e: ^Node(Key, Value) + e, ok = c.entries[key] + if !ok { + return + } + return e.value, true +} + +// exists checks for the existence of a value from a given key without updating the recent usage. +exists :: proc(c: ^$C/Cache($Key, $Value), key: Key) -> bool { + return key in c.entries +} + +// remove removes an item from the cache. +remove :: proc(c: ^$C/Cache($Key, $Value), key: Key) -> bool { + e, ok := c.entries[key] + if !ok { + return false + } + _remove_node(c, e) + return true +} + + +@(private) +_remove_node :: proc(c: ^$C/Cache($Key, $Value), node: ^Node(Key, Value)) { + if c.head == node { + c.head = node.next + } + if c.tail == node { + c.tail = node.prev + } + if node.prev != nil { + node.prev.next = node.next + } + if node.next != nil { + node.next.prev = node.prev + } + node.prev = nil + node.next = nil + + c.count -= 1 + + delete_key(&c.entries, node.key) + + if c.on_remove != nil { + c.on_remove(node.key, node.value, c.on_remove_user_data) + } + + free(node, c.node_allocator) + +} + +@(private) +_push_front_node :: proc(c: ^$C/Cache($Key, $Value), e: ^Node(Key, Value)) { + if c.head != nil { + e.next = c.head + e.next.prev = e + } + c.head = e + if c.tail == nil { + c.tail = e + } + e.prev = nil + + c.count += 1 +} + +@(private) +_pop_node :: proc(c: ^$C/Cache($Key, $Value), e: ^Node(Key, Value)) { + if e == nil { + return + } + if e.prev != nil { + e.prev.next = e.next + } + + if e.next != nil { + e.next.prev = e.prev + } + e.prev = nil + e.next = nil +} \ No newline at end of file diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 1f4d4357c..e38dd5150 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -16,7 +16,8 @@ import zlib "core:compress/zlib" import bit_array "core:container/bit_array" import priority_queue "core:container/priority_queue" import queue "core:container/queue" -import small_array "core:container/queue" +import small_array "core:container/small_array" +import lru "core:container/lru" import crypto "core:crypto" import blake "core:crypto/blake" From 78815778ee399b4df1c5f7c44522c792b9dc3e23 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 2 Feb 2022 15:28:49 +0000 Subject: [PATCH 068/117] Add `//+private file` to complement `//+private` (`//+private package`) --- src/checker.cpp | 9 ++++++--- src/entity.cpp | 2 +- src/parser.cpp | 12 ++++++++++-- src/parser.hpp | 8 +++++--- src/string.cpp | 12 ++++++++++-- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index d50d4d176..4dcb5120f 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3467,9 +3467,12 @@ void check_collect_value_decl(CheckerContext *c, Ast *decl) { if (entity_visibility_kind == EntityVisiblity_Public && (c->scope->flags&ScopeFlag_File) && - c->scope->file && - (c->scope->file->flags & AstFile_IsPrivate)) { - entity_visibility_kind = EntityVisiblity_PrivateToPackage; + c->scope->file) { + if (c->scope->file->flags & AstFile_IsPrivatePkg) { + entity_visibility_kind = EntityVisiblity_PrivateToPackage; + } else if (c->scope->file->flags & AstFile_IsPrivateFile) { + entity_visibility_kind = EntityVisiblity_PrivateToFile; + } } if (entity_visibility_kind != EntityVisiblity_Public && !(c->scope->flags&ScopeFlag_File)) { diff --git a/src/entity.cpp b/src/entity.cpp index a0438a9f4..8327a517e 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -245,7 +245,7 @@ bool is_entity_exported(Entity *e, bool allow_builtin = false) { if (e->flags & EntityFlag_NotExported) { return false; } - if (e->file != nullptr && (e->file->flags & AstFile_IsPrivate) != 0) { + if (e->file != nullptr && (e->file->flags & (AstFile_IsPrivatePkg|AstFile_IsPrivateFile)) != 0) { return false; } diff --git a/src/parser.cpp b/src/parser.cpp index 7a858e520..bf8c909c2 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5535,8 +5535,16 @@ bool parse_file(Parser *p, AstFile *f) { if (!parse_build_tag(tok, lc)) { return false; } - } else if (lc == "+private") { - f->flags |= AstFile_IsPrivate; + } else if (string_starts_with(lc, str_lit("+private"))) { + f->flags |= AstFile_IsPrivatePkg; + String command = string_trim_starts_with(lc, str_lit("+private ")); + 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 diff --git a/src/parser.hpp b/src/parser.hpp index 656f709e8..0712e83cb 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -78,9 +78,11 @@ struct ImportedFile { }; enum AstFileFlag : u32 { - AstFile_IsPrivate = 1<<0, - AstFile_IsTest = 1<<1, - AstFile_IsLazy = 1<<2, + AstFile_IsPrivatePkg = 1<<0, + AstFile_IsPrivateFile = 1<<1, + + AstFile_IsTest = 1<<3, + AstFile_IsLazy = 1<<4, }; enum AstDelayQueueKind { diff --git a/src/string.cpp b/src/string.cpp index 800378689..eb6058f78 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -195,8 +195,6 @@ template bool operator > (String const &a, char const (&b)[N]) { retu template bool operator <= (String const &a, char const (&b)[N]) { return str_le(a, make_string(cast(u8 *)b, N-1)); } template bool operator >= (String const &a, char const (&b)[N]) { return str_ge(a, make_string(cast(u8 *)b, N-1)); } - - gb_inline bool string_starts_with(String const &s, String const &prefix) { if (prefix.len > s.len) { return false; @@ -230,6 +228,16 @@ gb_inline bool string_ends_with(String const &s, u8 suffix) { return s[s.len-1] == suffix; } + + +gb_inline String string_trim_starts_with(String const &s, String const &prefix) { + if (string_starts_with(s, prefix)) { + return substring(s, prefix.len, s.len); + } + return s; +} + + gb_inline isize string_extension_position(String const &str) { isize dot_pos = -1; isize i = str.len; From 5db603ded27b8cb6dac444fa660009fd7ecc5184 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 2 Feb 2022 15:39:41 +0000 Subject: [PATCH 069/117] Minor sanity clean up --- src/parser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/parser.cpp b/src/parser.cpp index bf8c909c2..6db71bc4a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5538,6 +5538,7 @@ bool parse_file(Parser *p, AstFile *f) { } 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") { From e190c024fd374aff56f8cd0cf81a16ef4b4b0542 Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Wed, 2 Feb 2022 20:07:38 +0100 Subject: [PATCH 070/117] Fix logic in `is_nil` procedure: a non_nil slice means there is data to check. --- core/reflect/reflect.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 7f64d0974..05b3a5da0 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -234,7 +234,7 @@ is_nil :: proc(v: any) -> bool { return true } data := as_bytes(v) - if data != nil { + if data == nil { return true } for v in data { From 35533a7baab4cbea175e5585f7e661abddb7a44d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 2 Feb 2022 23:38:32 +0000 Subject: [PATCH 071/117] Update `core:container/lru` to support `clear` and take a boolean to indicate whether or not to call the `on_remove` procedure on `clear` or `destroy` --- core/container/lru/lru_cache.odin | 37 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/core/container/lru/lru_cache.odin b/core/container/lru/lru_cache.odin index 02bb20da0..f8e6f7b46 100644 --- a/core/container/lru/lru_cache.odin +++ b/core/container/lru/lru_cache.odin @@ -1,9 +1,9 @@ package container_lru +import "core:runtime" import "core:intrinsics" -import "core:mem" +_ :: runtime _ :: intrinsics -_ :: mem Node :: struct($Key, $Value: typeid) where intrinsics.type_is_valid_map_key(Key) { prev, next: ^Node(Key, Value), @@ -23,11 +23,10 @@ Cache :: struct($Key, $Value: typeid) where intrinsics.type_is_valid_map_key(Key count: int, capacity: int, - node_allocator: mem.Allocator, + node_allocator: runtime.Allocator, on_remove: proc(key: Key, value: Value, user_data: rawptr), on_remove_user_data: rawptr, - call_on_remove_on_destroy: bool, } // init initializes a Cache @@ -37,23 +36,28 @@ init :: proc(c: ^$C/Cache($Key, $Value), capacity: int, entries_allocator := con c.capacity = capacity } -// destroy deinitializes a Cache -destroy :: proc(c: ^$C/Cache($Key, $Value)) { +// destroy deinitializes a Cachem +destroy :: proc(c: ^$C/Cache($Key, $Value), call_on_remove: bool) { + clear(c, call_on_remove) + delete(c.entries) +} + +// clear the contents of a Cache +clear :: proc(c: ^$C/Cache($Key, $Value), call_on_remove: bool) { for _, node in c.entries { - if c.call_on_remove_on_destroy && c.on_remove != nil { - c.on_remove(node.key, node.value, c.on_remove_user_data) + if call_on_remove { + _call_on_remove(c, node) } free(node, c.node_allocator) } - clear(&c.entries) - delete(c.entries) + runtime.clear(&c.entries) c.head = nil c.tail = nil c.count = 0 } // set the given key value pair. This operation updates the recent usage of the item. -set :: proc(c: ^$C/Cache($Key, $Value), key: Key, value: Value) -> mem.Allocator_Error { +set :: proc(c: ^$C/Cache($Key, $Value), key: Key, value: Value) -> runtime.Allocator_Error { if e, ok := c.entries[key]; ok { e.value = value return nil @@ -143,14 +147,19 @@ _remove_node :: proc(c: ^$C/Cache($Key, $Value), node: ^Node(Key, Value)) { delete_key(&c.entries, node.key) - if c.on_remove != nil { - c.on_remove(node.key, node.value, c.on_remove_user_data) - } + _call_on_remove(c, node) free(node, c.node_allocator) } +@(private) +_call_on_remove :: proc(c: ^$C/Cache($Key, $Value), node: ^Node(Key, Value)) { + if c.on_remove != nil { + c.on_remove(node.key, node.value, c.on_remove_user_data) + } +} + @(private) _push_front_node :: proc(c: ^$C/Cache($Key, $Value), e: ^Node(Key, Value)) { if c.head != nil { From df8bdac33f9c8333db64516f27b3c2b727ff7d2b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Feb 2022 00:31:36 +0000 Subject: [PATCH 072/117] Initialize the `global_rand` with the `intrinsics.read_cycle_counter()` value --- core/math/rand/rand.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 29254d8f4..19e475835 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -1,5 +1,7 @@ package rand +import "core:intrinsics" + Rand :: struct { state: u64, inc: u64, @@ -7,9 +9,7 @@ Rand :: struct { @(private) -_GLOBAL_SEED_DATA := 1234567890 -@(private) -global_rand := create(u64(uintptr(&_GLOBAL_SEED_DATA))) +global_rand := create(u64(intrinsics.read_cycle_counter())) set_global_seed :: proc(seed: u64) { init(&global_rand, seed) From 35c90fe12413335962cad02d77a4894079b00a5d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Feb 2022 13:34:31 +0000 Subject: [PATCH 073/117] Fix type alias declaration evaluation problem (#854 #1439) --- src/check_decl.cpp | 39 +++++++++++++++- src/check_expr.cpp | 113 +++++++++++++++++++++++++++++++++++++++------ src/checker.cpp | 3 -- 3 files changed, 137 insertions(+), 18 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index f9bc17ba4..193c28aea 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -385,7 +385,44 @@ void check_const_decl(CheckerContext *ctx, Entity *e, Ast *type_expr, Ast *init, Operand operand = {}; if (init != nullptr) { - Entity *entity = nullptr; + Entity *entity = check_entity_from_ident_or_selector(ctx, init); + if (entity != nullptr && entity->kind == Entity_TypeName) { + // NOTE(bill, 2022-02-03): This is used to solve the problem caused by type aliases + // being "confused" as constants + // + // A :: B + // C :: proc "c" (^A) + // B :: struct {x: C} + // + // A gets evaluated first, and then checks B. + // B then checks C. + // C then tries to check A which is unresolved but thought to be a constant. + // Therefore within C's check, A errs as "not a type". + // + // This is because a const declaration may or may not be a type and this cannot + // be determined from a syntactical standpoint. + // This check allows the compiler to override the entity to be checked as a type. + // + // There is no problem if B is prefixed with the `#type` helper enforcing at + // both a syntax and semantic level that B must be a type. + // + // A :: #type B + // + // This approach is not fool proof and can fail in case such as: + // + // X :: type_of(x) + // X :: Foo(int).Type + // + // Since even these kind of declarations may cause weird checking cycles. + // For the time being, these are going to be treated as an unfortunate error + // until there is a proper delaying system to try declaration again if they + // have failed. + + e->kind = Entity_TypeName; + check_type_decl(ctx, e, init, named_type); + return; + } + entity = nullptr; if (init->kind == Ast_Ident) { entity = check_ident(ctx, &operand, init, nullptr, e->type, true); } else if (init->kind == Ast_SelectorExpr) { diff --git a/src/check_expr.cpp b/src/check_expr.cpp index fb5a90f5a..88296611b 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1286,7 +1286,6 @@ bool check_cycle(CheckerContext *c, Entity *curr, bool report) { return false; } - Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *named_type, Type *type_hint, bool allow_import_name) { GB_ASSERT(n->kind == Ast_Ident); o->mode = Addressing_Invalid; @@ -1422,8 +1421,12 @@ Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *named_type, Typ case Entity_TypeName: o->mode = Addressing_Type; if (check_cycle(c, e, true)) { - type = t_invalid; + o->type = t_invalid; } + if (o->type != nullptr && type->kind == Type_Named && o->type->Named.type_name->TypeName.is_type_alias) { + o->type = base_type(o->type); + } + break; case Entity_ImportName: @@ -4064,6 +4067,98 @@ Type *determine_swizzle_array_type(Type *original_type, Type *type_hint, isize n } +bool is_entity_declared_for_selector(Entity *entity, Scope *import_scope, bool *allow_builtin) { + bool is_declared = entity != nullptr; + if (is_declared) { + if (entity->kind == Entity_Builtin) { + // NOTE(bill): Builtin's are in the universal scope which is part of every scopes hierarchy + // This means that we should just ignore the found result through it + *allow_builtin = entity->scope == import_scope || entity->scope != builtin_pkg->scope; + } else if ((entity->scope->flags&ScopeFlag_Global) == ScopeFlag_Global && (import_scope->flags&ScopeFlag_Global) == 0) { + is_declared = false; + } + } + return is_declared; +} + +// NOTE(bill, 2022-02-03): see `check_const_decl` for why it exists reasoning +Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node) { + if (node->kind == Ast_Ident) { + String name = node->Ident.token.string; + return scope_lookup(c->scope, name); + } else if (node->kind == Ast_SelectorExpr) { + ast_node(se, SelectorExpr, node); + if (!c->allow_arrow_right_selector_expr && se->token.kind == Token_ArrowRight) { + return nullptr; + } + + Ast *op_expr = se->expr; + Ast *selector = unparen_expr(se->selector); + if (selector == nullptr) { + return nullptr; + } + if (selector->kind != Ast_Ident) { + return nullptr; + } + + Entity *entity = nullptr; + Entity *expr_entity = nullptr; + bool check_op_expr = true; + + if (op_expr->kind == Ast_Ident) { + String op_name = op_expr->Ident.token.string; + Entity *e = scope_lookup(c->scope, op_name); + add_entity_use(c, op_expr, e); + expr_entity = e; + + if (e != nullptr && e->kind == Entity_ImportName && selector->kind == Ast_Ident) { + // IMPORTANT NOTE(bill): This is very sloppy code but it's also very fragile + // It pretty much needs to be in this order and this way + // If you can clean this up, please do but be really careful + String import_name = op_name; + Scope *import_scope = e->ImportName.scope; + String entity_name = selector->Ident.token.string; + + check_op_expr = false; + entity = scope_lookup_current(import_scope, entity_name); + bool allow_builtin = false; + if (!is_entity_declared_for_selector(entity, import_scope, &allow_builtin)) { + return nullptr; + } + + check_entity_decl(c, entity, nullptr, nullptr); + if (entity->kind == Entity_ProcGroup) { + return entity; + } + GB_ASSERT_MSG(entity->type != nullptr, "%.*s (%.*s)", LIT(entity->token.string), LIT(entity_strings[entity->kind])); + } + } + + Operand operand = {}; + if (check_op_expr) { + check_expr_base(c, &operand, op_expr, nullptr); + if (operand.mode == Addressing_Invalid) { + return nullptr; + } + } + + if (entity == nullptr && selector->kind == Ast_Ident) { + String field_name = selector->Ident.token.string; + if (is_type_dynamic_array(type_deref(operand.type))) { + init_mem_allocator(c->checker); + } + auto sel = lookup_field(operand.type, field_name, operand.mode == Addressing_Type); + entity = sel.entity; + } + + if (entity != nullptr) { + return entity; + } + } + return nullptr; +} + + Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *type_hint) { ast_node(se, SelectorExpr, node); @@ -4112,18 +4207,8 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ check_op_expr = false; entity = scope_lookup_current(import_scope, entity_name); - bool is_declared = entity != nullptr; bool allow_builtin = false; - if (is_declared) { - if (entity->kind == Entity_Builtin) { - // NOTE(bill): Builtin's are in the universal scope which is part of every scopes hierarchy - // This means that we should just ignore the found result through it - allow_builtin = entity->scope == import_scope || entity->scope != builtin_pkg->scope; - } else if ((entity->scope->flags&ScopeFlag_Global) == ScopeFlag_Global && (import_scope->flags&ScopeFlag_Global) == 0) { - is_declared = false; - } - } - if (!is_declared) { + if (!is_entity_declared_for_selector(entity, import_scope, &allow_builtin)) { error(op_expr, "'%.*s' is not declared by '%.*s'", LIT(entity_name), LIT(import_name)); operand->mode = Addressing_Invalid; operand->expr = node; @@ -4213,7 +4298,7 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ } } - if (entity == nullptr && selector->kind == Ast_Ident && is_type_array(type_deref(operand->type))) { + if (entity == nullptr && selector->kind == Ast_Ident && is_type_array(type_deref(operand->type))) { // TODO(bill): Simd_Vector swizzling String field_name = selector->Ident.token.string; diff --git a/src/checker.cpp b/src/checker.cpp index 4dcb5120f..c4423b2bc 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3563,9 +3563,6 @@ void check_collect_value_decl(CheckerContext *c, Ast *decl) { if (is_ast_type(init)) { e = alloc_entity_type_name(d->scope, token, nullptr); - // if (vd->type != nullptr) { - // error(name, "A type declaration cannot have an type parameter"); - // } } else if (init->kind == Ast_ProcLit) { if (c->scope->flags&ScopeFlag_Type) { error(name, "Procedure declarations are not allowed within a struct"); From cf9f3d5e2d33a9004a322db980de307de13dc3a0 Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Thu, 3 Feb 2022 15:50:39 +0100 Subject: [PATCH 074/117] fix logic in bswap_128 --- core/runtime/internal.odin | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin index 7b283a132..c07bcc60d 100644 --- a/core/runtime/internal.odin +++ b/core/runtime/internal.odin @@ -37,10 +37,8 @@ bswap_64 :: proc "contextless" (x: u64) -> u64 { bswap_128 :: proc "contextless" (x: u128) -> u128 { z := transmute([4]u32)x - z[0] = bswap_32(z[3]) - z[1] = bswap_32(z[2]) - z[2] = bswap_32(z[1]) - z[3] = bswap_32(z[0]) + z[0], z[3] = bswap_32(z[3]), bswap_32(z[0]) + z[1], z[2] = bswap_32(z[2]), bswap_32(z[1]) return transmute(u128)z } From 76edfae0e0a1da7435f8f0e30a53ae4a70c74ba7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 4 Feb 2022 12:08:20 +0000 Subject: [PATCH 075/117] `core:container/topological_sort` --- .../topological_sort/topological_sort.odin | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 core/container/topological_sort/topological_sort.odin diff --git a/core/container/topological_sort/topological_sort.odin b/core/container/topological_sort/topological_sort.odin new file mode 100644 index 000000000..4b69930d5 --- /dev/null +++ b/core/container/topological_sort/topological_sort.odin @@ -0,0 +1,98 @@ +// The following is a generic O(V+E) topological sorter implementation. +// This is the fastest known method for topological sorting and Odin's +// map type is being used to accelerate lookups. +package container_topological_sort + +import "core:intrinsics" +import "core:runtime" +_ :: intrinsics +_ :: runtime + + +Relations :: struct($K: typeid) where intrinsics.type_is_valid_map_key(K) { + dependents: map[K]bool, + dependencies: int, +} + +Sorter :: struct(K: typeid) where intrinsics.type_is_valid_map_key(K) { + relations: map[K]Relations(K), + dependents_allocator: runtime.Allocator, +} + +@(private="file") +make_relations :: proc(sorter: ^$S/Sorter($K)) -> (r: Relations(K)) { + r.dependents.allocator = sorter.dependents_allocator + return +} + + +init :: proc(sorter: ^$S/Sorter($K)) { + sorter.relations = make(map[K]Relations(K)) + sorter.dependents_allocator = context.allocator +} + +destroy :: proc(sorter: ^$S/Sorter($K)) { + for _, v in &sorter.relations { + delete(v.dependents) + } + delete(sorter.relations) +} + +add_key :: proc(sorter: ^$S/Sorter($K), key: K) -> bool { + if key in sorter.relations { + return false + } + sorter.relations[key] = make_relations(sorter) + return true +} + +add_dependency :: proc(sorter: ^$S/Sorter($K), key, dependency: K) -> bool { + if key == dependency { + return false + } + + find := &sorter.relations[dependency] + if find == nil { + find = map_insert(&sorter.relations, dependency, make_relations(sorter)) + } + + if find.dependents[key] { + return true + } + find.dependents[key] = true + + find = &sorter.relations[key] + if find == nil { + find = map_insert(&sorter.relations, key, make_relations(sorter)) + } + + find.dependencies += 1 + + return true +} + +sort :: proc(sorter: ^$S/Sorter($K)) -> (sorted, cycled: [dynamic]K) { + relations := &sorter.relations + + for k, v in relations { + if v.dependencies == 0 { + append(&sorted, k) + } + } + + for root in &sorted do for k, _ in relations[root].dependents { + relation := &relations[k] + relation.dependencies -= 1 + if relation.dependencies == 0 { + append(&sorted, k) + } + } + + for k, v in relations { + if v.dependencies != 0 { + append(&cycled, k) + } + } + + return +} \ No newline at end of file From 48af78e46981540b9071b382052777060ba83c23 Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Fri, 4 Feb 2022 22:12:07 +0100 Subject: [PATCH 076/117] add `iterator` to `core:container/bit_array` --- core/container/bit_array/bit_array.odin | 43 ++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 0fa80c623..f06cf74e7 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -11,11 +11,52 @@ INDEX_SHIFT :: 6 @(private="file") INDEX_MASK :: 63 +@(private="file") +NUM_BITS :: 64 + Bit_Array :: struct { bits: [dynamic]u64, bias: int, } +Bit_Array_Iterator :: struct { + array: ^Bit_Array, + current_word: uint, + current_bit: uint, +} + +/* + In: + - it: ^Bit_Array_Iterator - the iterator struct that holds the state. + + Out: + - index: int - the next set bit of the Bit_Array referenced by `it`. + - ok: bool - `true` if the iterator returned a valid index, + `false` if there were no more bits set +*/ +iterator :: proc (it: ^Bit_Array_Iterator) -> (int, bool) { + words := it.array.bits + // if the word is empty or we have already gone over all the bits in it, + // b.current_bit is greater than the index of any set bit in the word, + // meaning that word >> b.current_bit == 0. + for it.current_word < len(words) && (words[it.current_word] >> it.current_bit == 0) { + it.current_word += 1 + it.current_bit = 0 + } + + if it.current_word >= len(words) { return 0, false } + + // since we exited the loop and didn't return, this word has some bits higher than + // or equal to `it.current_bit` set. + offset := intrinsics.count_trailing_zeros(words[it.current_word] >> it.current_bit) + // skip over the bit, if the resulting it.current_bit is over 63, + // it is handled by the initial for loop in the next iteration. + it.current_bit += uint(offset) + defer it.current_bit += 1 + return int(it.current_word * NUM_BITS + it.current_bit) + it.array.bias, true +} + + /* In: - ba: ^Bit_Array - a pointer to the Bit Array @@ -121,4 +162,4 @@ resize_if_needed :: proc(ba: ^Bit_Array, legs: int, allocator := context.allocat resize(&ba.bits, legs + 1) } return len(ba.bits) > legs -} \ No newline at end of file +} From b54fc96b1e36ff83922d7af9d8126e3fff0d8078 Mon Sep 17 00:00:00 2001 From: ap29600 <66381278+ap29600@users.noreply.github.com> Date: Fri, 4 Feb 2022 22:39:47 +0100 Subject: [PATCH 077/117] rename `iterator` proc to `next`, add named return values --- core/container/bit_array/bit_array.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index f06cf74e7..bf2ae3a40 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -34,7 +34,7 @@ Bit_Array_Iterator :: struct { - ok: bool - `true` if the iterator returned a valid index, `false` if there were no more bits set */ -iterator :: proc (it: ^Bit_Array_Iterator) -> (int, bool) { +next :: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { words := it.array.bits // if the word is empty or we have already gone over all the bits in it, // b.current_bit is greater than the index of any set bit in the word, From 3a81f2ab898d537bba51b9ea81e047652112574e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 4 Feb 2022 22:40:15 +0000 Subject: [PATCH 078/117] Correct the type aliasing problem, caused by aliases (of aliases)+ --- src/check_decl.cpp | 1 + src/check_expr.cpp | 5 +++- src/checker.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 193c28aea..2454feb33 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -387,6 +387,7 @@ void check_const_decl(CheckerContext *ctx, Entity *e, Ast *type_expr, Ast *init, if (init != nullptr) { Entity *entity = check_entity_from_ident_or_selector(ctx, init); if (entity != nullptr && entity->kind == Entity_TypeName) { + // @TypeAliasingProblem // NOTE(bill, 2022-02-03): This is used to solve the problem caused by type aliases // being "confused" as constants // diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 88296611b..e1c9bde84 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4088,7 +4088,7 @@ Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node) { return scope_lookup(c->scope, name); } else if (node->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, node); - if (!c->allow_arrow_right_selector_expr && se->token.kind == Token_ArrowRight) { + if (se->token.kind == Token_ArrowRight) { return nullptr; } @@ -4108,6 +4108,9 @@ Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node) { if (op_expr->kind == Ast_Ident) { String op_name = op_expr->Ident.token.string; Entity *e = scope_lookup(c->scope, op_name); + if (e == nullptr) { + return nullptr; + } add_entity_use(c, op_expr, e); expr_entity = e; diff --git a/src/checker.cpp b/src/checker.cpp index c4423b2bc..c90f357dd 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3665,6 +3665,59 @@ void check_add_foreign_block_decl(CheckerContext *ctx, Ast *decl) { check_collect_entities(&c, block->stmts); } +bool correct_single_type_alias(CheckerContext *c, Entity *e) { + if (e->kind == Entity_Constant) { + DeclInfo *d = e->decl_info; + if (d != nullptr && d->init_expr != nullptr) { + Ast *init = d->init_expr; + Entity *alias_of = check_entity_from_ident_or_selector(c, init); + if (alias_of != nullptr && alias_of->kind == Entity_TypeName) { + e->kind = Entity_TypeName; + return true; + } + } + } + return false; +} + +bool correct_type_alias_in_scope_backwards(CheckerContext *c, Scope *s) { + isize n = s->elements.entries.count; + bool correction = false; + for (isize i = n-1; i >= 0; i--) { + correction |= correct_single_type_alias(c, s->elements.entries[i].value); + } + return correction; +} +bool correct_type_alias_in_scope_forwards(CheckerContext *c, Scope *s) { + isize n = s->elements.entries.count; + bool correction = false; + for (isize i = 0; i < n; i++) { + correction |= correct_single_type_alias(c, s->elements.entries[i].value); + } + return correction; +} + + +void correct_type_aliases_in_scope(CheckerContext *c, Scope *s) { + // NOTE(bill, 2022-02-04): This is used to solve the problem caused by type aliases + // of type aliases being "confused" as constants + // + // A :: C + // B :: A + // C :: struct {b: ^B} + // + // See @TypeAliasingProblem for more information + for (;;) { + bool corrections = false; + corrections |= correct_type_alias_in_scope_backwards(c, s); + corrections |= correct_type_alias_in_scope_forwards(c, s); + if (!corrections) { + return; + } + } +} + + // NOTE(bill): If file_scopes == nullptr, this will act like a local scope void check_collect_entities(CheckerContext *c, Slice const &nodes) { AstFile *curr_file = nullptr; @@ -3736,6 +3789,7 @@ void check_collect_entities(CheckerContext *c, Slice const &nodes) { } } + // correct_type_aliases(c); // NOTE(bill): 'when' stmts need to be handled after the other as the condition may refer to something // declared after this stmt in source @@ -4381,10 +4435,11 @@ bool collect_file_decls(CheckerContext *ctx, Slice const &decls) { for_array(i, decls) { if (collect_file_decl(ctx, decls[i])) { + correct_type_aliases_in_scope(ctx, ctx->scope); return true; } } - + correct_type_aliases_in_scope(ctx, ctx->scope); return false; } @@ -4654,6 +4709,15 @@ void check_import_entities(Checker *c) { } add_untyped_expressions(ctx.info, &untyped); } + + for_array(i, pkg->files) { + AstFile *f = pkg->files[i]; + reset_checker_context(&ctx, f, &untyped); + ctx.collect_delayed_decls = false; + + correct_type_aliases_in_scope(&ctx, pkg->scope); + } + for_array(i, pkg->files) { AstFile *f = pkg->files[i]; reset_checker_context(&ctx, f, &untyped); From d5384c5aa4d823fbd527fb82e9eb5559b4266dfd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 4 Feb 2022 22:45:13 +0000 Subject: [PATCH 079/117] Only check idents in the alias (of alias)+ problem --- src/check_decl.cpp | 2 +- src/check_expr.cpp | 4 ++-- src/checker.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 2454feb33..63fc777c0 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -385,7 +385,7 @@ void check_const_decl(CheckerContext *ctx, Entity *e, Ast *type_expr, Ast *init, Operand operand = {}; if (init != nullptr) { - Entity *entity = check_entity_from_ident_or_selector(ctx, init); + Entity *entity = check_entity_from_ident_or_selector(ctx, init, false); if (entity != nullptr && entity->kind == Entity_TypeName) { // @TypeAliasingProblem // NOTE(bill, 2022-02-03): This is used to solve the problem caused by type aliases diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e1c9bde84..d51444b4d 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4082,11 +4082,11 @@ bool is_entity_declared_for_selector(Entity *entity, Scope *import_scope, bool * } // NOTE(bill, 2022-02-03): see `check_const_decl` for why it exists reasoning -Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node) { +Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node, bool ident_only) { if (node->kind == Ast_Ident) { String name = node->Ident.token.string; return scope_lookup(c->scope, name); - } else if (node->kind == Ast_SelectorExpr) { + } else if (!ident_only) if (node->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, node); if (se->token.kind == Token_ArrowRight) { return nullptr; diff --git a/src/checker.cpp b/src/checker.cpp index c90f357dd..188d68502 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3670,7 +3670,7 @@ bool correct_single_type_alias(CheckerContext *c, Entity *e) { DeclInfo *d = e->decl_info; if (d != nullptr && d->init_expr != nullptr) { Ast *init = d->init_expr; - Entity *alias_of = check_entity_from_ident_or_selector(c, init); + Entity *alias_of = check_entity_from_ident_or_selector(c, init, true); if (alias_of != nullptr && alias_of->kind == Entity_TypeName) { e->kind = Entity_TypeName; return true; From 1553137c2365c3980488a6455fd83f0fcb9e28ca Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 00:04:02 +0000 Subject: [PATCH 080/117] Change behaviour of `A :: distinct Enum_Type` to be more intuitive --- src/check_decl.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 63fc777c0..f6dade812 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -238,6 +238,51 @@ isize total_attribute_count(DeclInfo *decl) { return attribute_count; } +Type *clone_enum_type(CheckerContext *ctx, Type *original_enum_type, Type *named_type) { + // NOTE(bill, 2022-02-05): Stupid edge case for `distinct` declarations + // + // X :: enum {A, B, C} + // Y :: distinct X + // + // To make Y be just like X, it will need to copy the elements of X and change their type + // so that they match Y rather than X. + GB_ASSERT(original_enum_type != nullptr); + GB_ASSERT(named_type != nullptr); + GB_ASSERT(original_enum_type->kind == Type_Enum); + GB_ASSERT(named_type->kind == Type_Named); + + Scope *parent = original_enum_type->Enum.scope->parent; + Scope *scope = create_scope(nullptr, parent); + + + Type *et = alloc_type_enum(); + et->Enum.base_type = original_enum_type->Enum.base_type; + et->Enum.min_value = original_enum_type->Enum.min_value; + et->Enum.max_value = original_enum_type->Enum.max_value; + et->Enum.min_value_index = original_enum_type->Enum.min_value_index; + et->Enum.max_value_index = original_enum_type->Enum.max_value_index; + et->Enum.scope = scope; + + auto fields = array_make(permanent_allocator(), original_enum_type->Enum.fields.count); + for_array(i, fields) { + Entity *old = original_enum_type->Enum.fields[i]; + + Entity *e = alloc_entity_constant(scope, old->token, named_type, old->Constant.value); + e->file = old->file; + e->identifier = clone_ast(old->identifier); + e->flags |= EntityFlag_Visited; + e->state = EntityState_Resolved; + e->Constant.flags = old->Constant.flags; + e->Constant.docs = old->Constant.docs; + e->Constant.comment = old->Constant.comment; + + fields[i] = e; + add_entity(ctx, scope, nullptr, e); + add_entity_use(ctx, e->identifier, e); + } + et->Enum.fields = fields; + return et; +} void check_type_decl(CheckerContext *ctx, Entity *e, Ast *init_expr, Type *def) { GB_ASSERT(e->type == nullptr); @@ -258,7 +303,11 @@ void check_type_decl(CheckerContext *ctx, Entity *e, Ast *init_expr, Type *def) Type *bt = check_type_expr(ctx, te, named); check_type_path_pop(ctx); - named->Named.base = base_type(bt); + Type *base = base_type(bt); + if (is_distinct && bt->kind == Type_Named && base->kind == Type_Enum) { + base = clone_enum_type(ctx, base, named); + } + named->Named.base = base; if (is_distinct && is_type_typeid(e->type)) { error(init_expr, "'distinct' cannot be applied to 'typeid'"); From 97be86710306702a672309b23fbe8d38f1e6eeec Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 13:01:15 +0000 Subject: [PATCH 081/117] Rename `#partial[Enum]Type` to `#sparse[Enum]Type` for non-contiguous enum fields --- core/reflect/types.odin | 3 +++ core/runtime/core.odin | 1 + core/runtime/print.odin | 3 +++ src/check_type.cpp | 13 +++++++------ src/llvm_backend_type.cpp | 4 +++- src/parser.cpp | 2 +- src/types.cpp | 4 ++++ 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/core/reflect/types.odin b/core/reflect/types.odin index 74778013a..a9a4a8d48 100644 --- a/core/reflect/types.odin +++ b/core/reflect/types.odin @@ -472,6 +472,9 @@ write_type_writer :: proc(w: io.Writer, ti: ^Type_Info, n_written: ^int = nil) - write_type(w, info.elem, &n) or_return case Type_Info_Enumerated_Array: + if info.is_sparse { + io.write_string(w, "#sparse", &n) or_return + } io.write_string(w, "[", &n) or_return write_type(w, info.index, &n) or_return io.write_string(w, "]", &n) or_return diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 424650828..35144473b 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -95,6 +95,7 @@ Type_Info_Enumerated_Array :: struct { count: int, min_value: Type_Info_Enum_Value, max_value: Type_Info_Enum_Value, + is_sparse: bool, } Type_Info_Dynamic_Array :: struct {elem: ^Type_Info, elem_size: int} Type_Info_Slice :: struct {elem: ^Type_Info, elem_size: int} diff --git a/core/runtime/print.odin b/core/runtime/print.odin index 8c0b65864..06740bc75 100644 --- a/core/runtime/print.odin +++ b/core/runtime/print.odin @@ -260,6 +260,9 @@ print_type :: proc "contextless" (ti: ^Type_Info) { print_type(info.elem) case Type_Info_Enumerated_Array: + if info.is_sparse { + print_string("#sparse") + } print_byte('[') print_type(info.index) print_byte(']') diff --git a/src/check_type.cpp b/src/check_type.cpp index a6d82c86e..6d3e32466 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2713,29 +2713,30 @@ bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, Type *named_t Type *t = alloc_type_enumerated_array(elem, index, bt->Enum.min_value, bt->Enum.max_value, Token_Invalid); - bool is_partial = false; + bool is_sparse = false; if (at->tag != nullptr) { GB_ASSERT(at->tag->kind == Ast_BasicDirective); String name = at->tag->BasicDirective.name.string; - if (name == "partial") { - is_partial = true; + if (name == "sparse") { + is_sparse = true; } else { error(at->tag, "Invalid tag applied to an enumerated array, got #%.*s", LIT(name)); } } - if (!is_partial && t->EnumeratedArray.count > bt->Enum.fields.count) { + if (!is_sparse && t->EnumeratedArray.count > bt->Enum.fields.count) { error(e, "Non-contiguous enumeration used as an index in an enumerated array"); long long ea_count = cast(long long)t->EnumeratedArray.count; long long enum_count = cast(long long)bt->Enum.fields.count; error_line("\tenumerated array length: %lld\n", ea_count); error_line("\tenum field count: %lld\n", enum_count); - error_line("\tSuggestion: prepend #partial to the enumerated array to allow for non-named elements\n"); + error_line("\tSuggestion: prepend #sparse to the enumerated array to allow for non-contiguous elements\n"); if (2*enum_count < ea_count) { error_line("\tWarning: the number of named elements is much smaller than the length of the array, are you sure this is what you want?\n"); - error_line("\t this warning will be removed if #partial is applied\n"); + error_line("\t this warning will be removed if #sparse is applied\n"); } } + t->EnumeratedArray.is_sparse = is_sparse; *type = t; diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index e1332c6f3..1d6297164 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -454,7 +454,7 @@ void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info da case Type_EnumeratedArray: { tag = lb_const_ptr_cast(m, variant_ptr, t_type_info_enumerated_array_ptr); - LLVMValueRef vals[6] = { + LLVMValueRef vals[7] = { lb_get_type_info_ptr(m, t->EnumeratedArray.elem).value, lb_get_type_info_ptr(m, t->EnumeratedArray.index).value, lb_const_int(m, t_int, type_size_of(t->EnumeratedArray.elem)).value, @@ -463,6 +463,8 @@ void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info da // Unions LLVMConstNull(lb_type(m, t_type_info_enum_value)), LLVMConstNull(lb_type(m, t_type_info_enum_value)), + + lb_const_bool(m, t_bool, t->EnumeratedArray.is_sparse).value, }; lbValue res = {}; diff --git a/src/parser.cpp b/src/parser.cpp index 6db71bc4a..7302b18a9 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2134,7 +2134,7 @@ Ast *parse_operand(AstFile *f, bool lhs) { break; } return original_type; - } else if (name.string == "partial") { + } else if (name.string == "sparse") { Ast *tag = ast_basic_directive(f, token, name); Ast *original_type = parse_type(f); Ast *type = unparen_expr(original_type); diff --git a/src/types.cpp b/src/types.cpp index 07951196a..e0d35a12c 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -221,6 +221,7 @@ struct TypeProc { ExactValue *max_value; \ i64 count; \ TokenKind op; \ + bool is_sparse; \ }) \ TYPE_KIND(Slice, struct { Type *elem; }) \ TYPE_KIND(DynamicArray, struct { Type *elem; }) \ @@ -3830,6 +3831,9 @@ gbString write_type_to_string(gbString str, Type *type) { break; case Type_EnumeratedArray: + if (type->EnumeratedArray.is_sparse) { + str = gb_string_appendc(str, "#sparse"); + } str = gb_string_append_rune(str, '['); str = write_type_to_string(str, type->EnumeratedArray.index); str = gb_string_append_rune(str, ']'); From 6418ec3b21de26bac4b291a2ad8e58c011c21c38 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 13:09:16 +0000 Subject: [PATCH 082/117] Correct `#sparse` usage and error messages --- core/math/big/common.odin | 2 +- examples/demo/demo.odin | 14 +++++++------- src/parser.cpp | 16 ++++++++++++++++ src/parser.hpp | 1 + 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/core/math/big/common.odin b/core/math/big/common.odin index 2b34a9163..e1198c352 100644 --- a/core/math/big/common.odin +++ b/core/math/big/common.odin @@ -172,7 +172,7 @@ Error :: enum int { Unimplemented = 127, } -Error_String :: #partial [Error]string{ +Error_String :: #sparse[Error]string{ .Okay = "Okay", .Out_Of_Memory = "Out of memory", .Invalid_Pointer = "Invalid pointer", diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 3e34e3d49..8c6ea0fa4 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1921,14 +1921,14 @@ constant_literal_expressions :: proc() { fmt.println("-------") - Partial_Baz :: enum{A=5, B, C, D=16} - #assert(len(Partial_Baz) < len(#partial [Partial_Baz]int)) - PARTIAL_ENUM_ARRAY_CONST :: #partial [Partial_Baz]int{.A ..= .C = 1, .D = 16} + Sparse_Baz :: enum{A=5, B, C, D=16} + #assert(len(Sparse_Baz) < len(#sparse[Sparse_Baz]int)) + SPARSE_ENUM_ARRAY_CONST :: #sparse[Sparse_Baz]int{.A ..= .C = 1, .D = 16} - fmt.println(PARTIAL_ENUM_ARRAY_CONST[.A]) - fmt.println(PARTIAL_ENUM_ARRAY_CONST[.B]) - fmt.println(PARTIAL_ENUM_ARRAY_CONST[.C]) - fmt.println(PARTIAL_ENUM_ARRAY_CONST[.D]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.A]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.B]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.C]) + fmt.println(SPARSE_ENUM_ARRAY_CONST[.D]) fmt.println("-------") diff --git a/src/parser.cpp b/src/parser.cpp index 7302b18a9..0914c77ca 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2134,6 +2134,22 @@ Ast *parse_operand(AstFile *f, bool lhs) { break; } return original_type; + } else if (name.string == "partial") { + Ast *tag = ast_basic_directive(f, token, name); + Ast *original_expr = parse_expr(f, lhs); + Ast *expr = unparen_expr(original_expr); + switch (expr->kind) { + case Ast_ArrayType: + syntax_error(expr, "#partial has been replaced with #sparse for non-contiguous enumerated array types"); + break; + case Ast_CompoundLit: + expr->CompoundLit.tag = tag; + break; + default: + syntax_error(expr, "Expected a compound literal after #%.*s, got %.*s", LIT(name.string), LIT(ast_strings[expr->kind])); + break; + } + return original_expr; } else if (name.string == "sparse") { Ast *tag = ast_basic_directive(f, token, name); Ast *original_type = parse_type(f); diff --git a/src/parser.hpp b/src/parser.hpp index 0712e83cb..ff0df0382 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -350,6 +350,7 @@ char const *inline_asm_dialect_strings[InlineAsmDialect_COUNT] = { Slice elems; \ Token open, close; \ i64 max_count; \ + Ast *tag; \ }) \ AST_KIND(_ExprBegin, "", bool) \ AST_KIND(BadExpr, "bad expression", struct { Token begin, end; }) \ From e870041fe6171b7e88cde672a3e5478d3786b3c9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 13:11:41 +0000 Subject: [PATCH 083/117] Fix `#sparse` usage --- core/compress/gzip/gzip.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/compress/gzip/gzip.odin b/core/compress/gzip/gzip.odin index 1a72500bf..0ed805ef8 100644 --- a/core/compress/gzip/gzip.odin +++ b/core/compress/gzip/gzip.odin @@ -66,7 +66,7 @@ OS :: enum u8 { _Unknown = 14, Unknown = 255, } -OS_Name :: #partial [OS]string{ +OS_Name :: #sparse[OS]string{ .FAT = "FAT", .Amiga = "Amiga", .VMS = "VMS/OpenVMS", From b8c4bf2afb39ca2980b2827aa1775b35728bb195 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:02:21 +0000 Subject: [PATCH 084/117] Add `#partial [Enum]Type{...}` support to check for missing enumerated array fields --- core/compress/gzip/gzip.odin | 1 + core/math/big/common.odin | 1 + src/check_expr.cpp | 145 +++++++++++++++++++++++++++++++++++ src/check_stmt.cpp | 90 +--------------------- 4 files changed, 149 insertions(+), 88 deletions(-) diff --git a/core/compress/gzip/gzip.odin b/core/compress/gzip/gzip.odin index 0ed805ef8..96e9c49a0 100644 --- a/core/compress/gzip/gzip.odin +++ b/core/compress/gzip/gzip.odin @@ -67,6 +67,7 @@ OS :: enum u8 { Unknown = 255, } OS_Name :: #sparse[OS]string{ + ._Unknown = "", .FAT = "FAT", .Amiga = "Amiga", .VMS = "VMS/OpenVMS", diff --git a/core/math/big/common.odin b/core/math/big/common.odin index e1198c352..74a641d83 100644 --- a/core/math/big/common.odin +++ b/core/math/big/common.odin @@ -182,6 +182,7 @@ Error_String :: #sparse[Error]string{ .Max_Iterations_Reached = "Max iterations reached", .Buffer_Overflow = "Buffer overflow", .Integer_Overflow = "Integer overflow", + .Integer_Underflow = "Integer underflow", .Division_by_Zero = "Division by zero", .Math_Domain_Error = "Math domain error", diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d51444b4d..40777df2a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6956,6 +6956,100 @@ void check_matrix_index_expr(CheckerContext *c, Operand *o, Ast *node, Type *typ } +struct TypeAndToken { + Type *type; + Token token; +}; + +void add_constant_switch_case(CheckerContext *ctx, PtrMap *seen, Operand operand, bool use_expr = true) { + if (operand.mode != Addressing_Constant) { + return; + } + if (operand.value.kind == ExactValue_Invalid) { + return; + } + + uintptr key = hash_exact_value(operand.value); + TypeAndToken *found = map_get(seen, key); + if (found != nullptr) { + isize count = multi_map_count(seen, key); + TypeAndToken *taps = gb_alloc_array(temporary_allocator(), TypeAndToken, count); + + multi_map_get_all(seen, key, taps); + for (isize i = 0; i < count; i++) { + TypeAndToken tap = taps[i]; + if (!are_types_identical(operand.type, tap.type)) { + continue; + } + + TokenPos pos = tap.token.pos; + if (use_expr) { + gbString expr_str = expr_to_string(operand.expr); + error(operand.expr, + "Duplicate case '%s'\n" + "\tprevious case at %s", + expr_str, + token_pos_to_string(pos)); + gb_string_free(expr_str); + } else { + error(operand.expr, "Duplicate case found with previous case at %s", token_pos_to_string(pos)); + } + return; + } + } + + TypeAndToken tap = {operand.type, ast_token(operand.expr)}; + multi_map_insert(seen, key, tap); +} + +typedef PtrMap SeenMap; + +void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Operand const &x, Operand const &lhs, Operand const &rhs) { + if (is_type_enum(x.type)) { + // TODO(bill): Fix this logic so it's fast!!! + + i64 v0 = exact_value_to_i64(lhs.value); + i64 v1 = exact_value_to_i64(rhs.value); + Operand v = {}; + v.mode = Addressing_Constant; + v.type = x.type; + v.expr = x.expr; + + Type *bt = base_type(x.type); + GB_ASSERT(bt->kind == Type_Enum); + for (i64 vi = v0; vi <= v1; vi++) { + if (upper_op != Token_GtEq && vi == v1) { + break; + } + + bool found = false; + for_array(j, bt->Enum.fields) { + Entity *f = bt->Enum.fields[j]; + GB_ASSERT(f->kind == Entity_Constant); + + i64 fv = exact_value_to_i64(f->Constant.value); + if (fv == vi) { + found = true; + break; + } + } + if (found) { + v.value = exact_value_i64(vi); + add_constant_switch_case(ctx, seen, v); + } + } + } else { + add_constant_switch_case(ctx, seen, lhs); + if (upper_op == Token_GtEq) { + add_constant_switch_case(ctx, seen, rhs); + } + } +} +void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, Operand const &x) { + add_constant_switch_case(ctx, seen, x); +} + + ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { u32 prev_state_flags = c->state_flags; defer (c->state_flags = prev_state_flags); @@ -7863,6 +7957,11 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type if (bet == t_invalid) { break; } + bool is_partial = cl->tag && (cl->tag->BasicDirective.name.string == "partial"); + + SeenMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue + map_init(&seen, heap_allocator()); + defer (map_destroy(&seen)); if (cl->elems.count > 0 && cl->elems[0]->kind == Ast_FieldValue) { RangeCache rc = range_cache_make(heap_allocator()); @@ -7936,6 +8035,8 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type check_assignment(c, &operand, elem_type, context_name); is_constant = is_constant && operand.mode == Addressing_Constant; + + add_to_seen_map(c, &seen, op.kind, x, x, y); } else { Operand op_index = {}; check_expr_with_type_hint(c, &op_index, fv->field, index_type); @@ -7971,6 +8072,8 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type check_assignment(c, &operand, elem_type, context_name); is_constant = is_constant && operand.mode == Addressing_Constant; + + add_to_seen_map(c, &seen, op_index); } } @@ -8006,11 +8109,53 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type } } + bool was_error = false; if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { if (0 < max && max < t->EnumeratedArray.count) { error(node, "Expected %lld values for this enumerated array literal, got %lld", cast(long long)t->EnumeratedArray.count, cast(long long)max); + was_error = true; } else { error(node, "Enumerated array literals must only have 'field = value' elements, bare elements are not allowed"); + was_error = true; + } + } + + // NOTE(bill): Check for missing cases when `#partial literal` is not present + if (cl->elems.count > 0 && !was_error && !is_partial) { + Type *et = base_type(index_type); + GB_ASSERT(et->kind == Type_Enum); + auto fields = et->Enum.fields; + + auto unhandled = array_make(temporary_allocator(), 0, fields.count); + + for_array(i, fields) { + Entity *f = fields[i]; + if (f->kind != Entity_Constant) { + continue; + } + ExactValue v = f->Constant.value; + auto found = map_get(&seen, hash_exact_value(v)); + if (!found) { + array_add(&unhandled, f); + } + } + + if (unhandled.count > 0) { + begin_error_block(); + defer (end_error_block()); + + if (unhandled.count == 1) { + error_no_newline(node, "Unhandled enumerated array case: %.*s", LIT(unhandled[0]->token.string)); + } else { + error_no_newline(node, "Unhandled enumerated array cases: "); + for_array(i, unhandled) { + Entity *f = unhandled[i]; + error_line("\t%.*s\n", LIT(f->token.string)); + } + } + error_line("\n"); + + error_line("\tSuggestion: Was '#partial %s {...}' wanted?\n", type_to_string(index_type)); } } diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index f9e55ab37..50b7c3233 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -697,54 +697,6 @@ bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, Ast *expr, b return true; } - -struct TypeAndToken { - Type *type; - Token token; -}; - - -void add_constant_switch_case(CheckerContext *ctx, PtrMap *seen, Operand operand, bool use_expr = true) { - if (operand.mode != Addressing_Constant) { - return; - } - if (operand.value.kind == ExactValue_Invalid) { - return; - } - - uintptr key = hash_exact_value(operand.value); - TypeAndToken *found = map_get(seen, key); - if (found != nullptr) { - isize count = multi_map_count(seen, key); - TypeAndToken *taps = gb_alloc_array(temporary_allocator(), TypeAndToken, count); - - multi_map_get_all(seen, key, taps); - for (isize i = 0; i < count; i++) { - TypeAndToken tap = taps[i]; - if (!are_types_identical(operand.type, tap.type)) { - continue; - } - - TokenPos pos = tap.token.pos; - if (use_expr) { - gbString expr_str = expr_to_string(operand.expr); - error(operand.expr, - "Duplicate case '%s'\n" - "\tprevious case at %s", - expr_str, - token_pos_to_string(pos)); - gb_string_free(expr_str); - } else { - error(operand.expr, "Duplicate case found with previous case at %s", token_pos_to_string(pos)); - } - return; - } - } - - TypeAndToken tap = {operand.type, ast_token(operand.expr)}; - multi_map_insert(seen, key, tap); -} - void check_inline_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { ast_node(irs, UnrollRangeStmt, node); check_open_scope(ctx, node); @@ -1032,45 +984,7 @@ void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { Operand b1 = rhs; check_comparison(ctx, &a1, &b1, Token_LtEq); - if (is_type_enum(x.type)) { - // TODO(bill): Fix this logic so it's fast!!! - - i64 v0 = exact_value_to_i64(lhs.value); - i64 v1 = exact_value_to_i64(rhs.value); - Operand v = {}; - v.mode = Addressing_Constant; - v.type = x.type; - v.expr = x.expr; - - Type *bt = base_type(x.type); - GB_ASSERT(bt->kind == Type_Enum); - for (i64 vi = v0; vi <= v1; vi++) { - if (upper_op != Token_GtEq && vi == v1) { - break; - } - - bool found = false; - for_array(j, bt->Enum.fields) { - Entity *f = bt->Enum.fields[j]; - GB_ASSERT(f->kind == Entity_Constant); - - i64 fv = exact_value_to_i64(f->Constant.value); - if (fv == vi) { - found = true; - break; - } - } - if (found) { - v.value = exact_value_i64(vi); - add_constant_switch_case(ctx, &seen, v); - } - } - } else { - add_constant_switch_case(ctx, &seen, lhs); - if (upper_op == Token_GtEq) { - add_constant_switch_case(ctx, &seen, rhs); - } - } + add_to_seen_map(ctx, &seen, upper_op, x, lhs, rhs); if (is_type_string(x.type)) { // NOTE(bill): Force dependency for strings here @@ -1115,7 +1029,7 @@ void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { continue; } update_untyped_expr_type(ctx, z.expr, x.type, !is_type_untyped(x.type)); - add_constant_switch_case(ctx, &seen, y); + add_to_seen_map(ctx, &seen, y); } } } From dd84b61cc83c6bb3a179375f0a37adf6782b3be8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:07:17 +0000 Subject: [PATCH 085/117] Correct `add_to_seen_map` logic --- src/check_expr.cpp | 10 +++++++--- src/check_stmt.cpp | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 40777df2a..b2ce6c897 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7018,7 +7018,7 @@ void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Ope Type *bt = base_type(x.type); GB_ASSERT(bt->kind == Type_Enum); for (i64 vi = v0; vi <= v1; vi++) { - if (upper_op != Token_GtEq && vi == v1) { + if (upper_op != Token_LtEq && vi == v1) { break; } @@ -7040,7 +7040,7 @@ void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Ope } } else { add_constant_switch_case(ctx, seen, lhs); - if (upper_op == Token_GtEq) { + if (upper_op == Token_LtEq) { add_constant_switch_case(ctx, seen, rhs); } } @@ -8036,7 +8036,11 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type is_constant = is_constant && operand.mode == Addressing_Constant; - add_to_seen_map(c, &seen, op.kind, x, x, y); + TokenKind upper_op = Token_LtEq; + if (op.kind == Token_RangeHalf) { + upper_op = Token_Lt; + } + add_to_seen_map(c, &seen, upper_op, x, x, y); } else { Operand op_index = {}; check_expr_with_type_hint(c, &op_index, fv->field, index_type); diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 50b7c3233..0d18af199 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -961,9 +961,9 @@ void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { TokenKind upper_op = Token_Invalid; switch (be->op.kind) { - case Token_Ellipsis: upper_op = Token_GtEq; break; - case Token_RangeFull: upper_op = Token_GtEq; break; - case Token_RangeHalf: upper_op = Token_Gt; break; + case Token_Ellipsis: upper_op = Token_LtEq; break; + case Token_RangeFull: upper_op = Token_LtEq; break; + case Token_RangeHalf: upper_op = Token_Lt; break; default: GB_PANIC("Invalid range operator"); break; } From cf246f65ff72db870313627b7db3b83601364385 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:31:22 +0000 Subject: [PATCH 086/117] Add check for variables which are both shadowing and unused by default --- src/checker.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 188d68502..b62ef7c4c 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -504,6 +504,7 @@ enum VettedEntityKind { VettedEntity_Unused, VettedEntity_Shadowed, + VettedEntity_Shadowed_And_Unused, }; struct VettedEntity { VettedEntityKind kind; @@ -625,12 +626,18 @@ void check_scope_usage(Checker *c, Scope *scope) { MUTEX_GUARD_BLOCK(scope->mutex) for_array(i, scope->elements.entries) { Entity *e = scope->elements.entries[i].value; if (e == nullptr) continue; - VettedEntity ve = {}; - if (vet_unused && check_vet_unused(c, e, &ve)) { - array_add(&vetted_entities, ve); - } - if (vet_shadowing && check_vet_shadowing(c, e, &ve)) { - array_add(&vetted_entities, ve); + VettedEntity ve_unused = {}; + VettedEntity ve_shadowed = {}; + bool is_unused = vet_unused && check_vet_unused(c, e, &ve_unused); + bool is_shadowed = vet_shadowing && check_vet_shadowing(c, e, &ve_shadowed); + if (is_unused && is_shadowed) { + VettedEntity ve_both = ve_shadowed; + ve_both.kind = VettedEntity_Shadowed_And_Unused; + array_add(&vetted_entities, ve_both); + } else if (is_unused) { + array_add(&vetted_entities, ve_unused); + } else if (is_shadowed) { + array_add(&vetted_entities, ve_shadowed); } } @@ -642,16 +649,18 @@ void check_scope_usage(Checker *c, Scope *scope) { Entity *other = ve.other; String name = e->token.string; - if (build_context.vet) { + 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 (build_context.vet) { switch (ve.kind) { case VettedEntity_Unused: error(e->token, "'%.*s' declared but not used", LIT(name)); break; case VettedEntity_Shadowed: if (e->flags&EntityFlag_Using) { - error(e->token, "Declaration of '%.*s' from 'using' shadows declaration at line %lld", LIT(name), cast(long long)other->token.pos.line); + error(e->token, "Declaration of '%.*s' from 'using' shadows declaration at line %d", LIT(name), other->token.pos.line); } else { - error(e->token, "Declaration of '%.*s' shadows declaration at line %lld", LIT(name), cast(long long)other->token.pos.line); + error(e->token, "Declaration of '%.*s' shadows declaration at line %d", LIT(name), other->token.pos.line); } break; default: From 3439139b1c763fe239967bd8c90d8ccbc1e0867f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:34:29 +0000 Subject: [PATCH 087/117] Minor clean up --- src/check_expr.cpp | 5 +++-- src/check_stmt.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index b2ce6c897..d90f93180 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6961,7 +6961,9 @@ struct TypeAndToken { Token token; }; -void add_constant_switch_case(CheckerContext *ctx, PtrMap *seen, Operand operand, bool use_expr = true) { +typedef PtrMap SeenMap; + +void add_constant_switch_case(CheckerContext *ctx, SeenMap *seen, Operand operand, bool use_expr = true) { if (operand.mode != Addressing_Constant) { return; } @@ -7002,7 +7004,6 @@ void add_constant_switch_case(CheckerContext *ctx, PtrMap multi_map_insert(seen, key, tap); } -typedef PtrMap SeenMap; void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Operand const &x, Operand const &lhs, Operand const &rhs) { if (is_type_enum(x.type)) { diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 0d18af199..2d85db82c 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -921,7 +921,7 @@ void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { } } - PtrMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue + SeenMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue map_init(&seen, heap_allocator()); defer (map_destroy(&seen)); From a4308e7246a995c745b120debbb61be9e1f19a38 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:45:59 +0000 Subject: [PATCH 088/117] Improve union variant assignment determination --- src/check_expr.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d90f93180..d6b454bf4 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -673,6 +673,42 @@ i64 check_distance_between_types(CheckerContext *c, Operand *operand, Type *type return 1; } } + + // TODO(bill): Determine which rule is a better on in practice + #if 1 + if (dst->Union.variants.count == 1) { + Type *vt = dst->Union.variants[0]; + i64 score = check_distance_between_types(c, operand, vt); + if (score >= 0) { + return score+2; + } + } + #else + // NOTE(bill): check to see you can assign to it with one of the variants? + i64 prev_lowest_score = -1; + i64 lowest_score = -1; + for_array(i, dst->Union.variants) { + Type *vt = dst->Union.variants[i]; + i64 score = check_distance_between_types(c, operand, vt); + if (score >= 0) { + if (lowest_score < 0) { + lowest_score = score; + } else { + if (prev_lowest_score < 0) { + prev_lowest_score = lowest_score; + } else { + prev_lowest_score = gb_min(prev_lowest_score, lowest_score); + } + lowest_score = gb_min(lowest_score, score); + } + } + } + if (lowest_score >= 0) { + if (prev_lowest_score != lowest_score) { // remove possible ambiguities + return lowest_score+2; + } + } + #endif } if (is_type_relative_pointer(dst)) { From 23c3573c307fc9b1c7aa2af2b445090543fd60d3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:56:06 +0000 Subject: [PATCH 089/117] Minor correction to error message suggestion --- 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 d6b454bf4..4184d5b30 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8196,7 +8196,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type } error_line("\n"); - error_line("\tSuggestion: Was '#partial %s {...}' wanted?\n", type_to_string(index_type)); + error_line("\tSuggestion: Was '#partial %s{...}' wanted?\n", type_to_string(type)); } } From 67ce0ec29f55621a36ddc1bde83f23a51c9ce355 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 14:58:13 +0000 Subject: [PATCH 090/117] Improve printing for unhandled cases by adding a new line before the cases --- src/check_expr.cpp | 2 +- src/check_stmt.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 4184d5b30..4664d2244 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8188,7 +8188,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type if (unhandled.count == 1) { error_no_newline(node, "Unhandled enumerated array case: %.*s", LIT(unhandled[0]->token.string)); } else { - error_no_newline(node, "Unhandled enumerated array cases: "); + error(node, "Unhandled enumerated array cases:"); for_array(i, unhandled) { Entity *f = unhandled[i]; error_line("\t%.*s\n", LIT(f->token.string)); diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 2d85db82c..7cae1893f 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1065,7 +1065,7 @@ void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { if (unhandled.count == 1) { error_no_newline(node, "Unhandled switch case: %.*s", LIT(unhandled[0]->token.string)); } else { - error_no_newline(node, "Unhandled switch cases: "); + error(node, "Unhandled switch cases:"); for_array(i, unhandled) { Entity *f = unhandled[i]; error_line("\t%.*s\n", LIT(f->token.string)); From c6ab8f82c88f7d5470fa2fb0459d09ba8a67a287 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 15:17:47 +0000 Subject: [PATCH 091/117] Code refactor to aid development --- src/check_expr.cpp | 3552 ++++++++++++++++++++++---------------------- 1 file changed, 1811 insertions(+), 1741 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 4664d2244..fb58839bc 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7086,6 +7086,1805 @@ void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, Operand const &x) { add_constant_switch_case(ctx, seen, x); } +ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ast_node(bd, BasicDirective, node); + + ExprKind kind = Expr_Expr; + + o->mode = Addressing_Constant; + String name = bd->name.string; + if (name == "file") { + o->type = t_untyped_string; + o->value = exact_value_string(get_file_path_string(bd->token.pos.file_id)); + } else if (name == "line") { + o->type = t_untyped_integer; + o->value = exact_value_i64(bd->token.pos.line); + } else if (name == "procedure") { + if (c->curr_proc_decl == nullptr) { + error(node, "#procedure may only be used within procedures"); + o->type = t_untyped_string; + o->value = exact_value_string(str_lit("")); + } else { + o->type = t_untyped_string; + o->value = exact_value_string(c->proc_name); + } + } else if (name == "caller_location") { + init_core_source_code_location(c->checker); + 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 == "location") { + init_core_source_code_location(c->checker); + error(node, "'#%.*s' must be used in a call expression", LIT(name)); + o->type = t_source_code_location; + o->mode = Addressing_Value; + } else if ( + name == "assert" || + name == "defined" || + name == "config" || + name == "load" || + name == "load_hash" || + name == "load_or" + ) { + error(node, "'#%.*s' must be used as a call", LIT(name)); + o->type = t_invalid; + o->mode = Addressing_Invalid; + } else { + error(node, "Unknown directive: #%.*s", LIT(name)); + o->type = t_invalid; + o->mode = Addressing_Invalid; + } + + } + return kind; +} + +ExprKind check_ternary_if_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ExprKind kind = Expr_Expr; + Operand cond = {Addressing_Invalid}; + ast_node(te, TernaryIfExpr, node); + check_expr(c, &cond, te->cond); + node->viral_state_flags |= te->cond->viral_state_flags; + + if (cond.mode != Addressing_Invalid && !is_type_boolean(cond.type)) { + error(te->cond, "Non-boolean condition in ternary if expression"); + } + + Operand x = {Addressing_Invalid}; + Operand y = {Addressing_Invalid}; + check_expr_or_type(c, &x, te->x, type_hint); + node->viral_state_flags |= te->x->viral_state_flags; + + if (te->y != nullptr) { + check_expr_or_type(c, &y, te->y, type_hint); + node->viral_state_flags |= te->y->viral_state_flags; + } else { + error(node, "A ternary expression must have an else clause"); + return kind; + } + + if (x.type == nullptr || x.type == t_invalid || + y.type == nullptr || y.type == t_invalid) { + return kind; + } + + convert_to_typed(c, &x, y.type); + if (x.mode == Addressing_Invalid) { + return kind; + } + convert_to_typed(c, &y, x.type); + if (y.mode == Addressing_Invalid) { + x.mode = Addressing_Invalid; + return kind; + } + + if (!ternary_compare_types(x.type, y.type)) { + gbString its = type_to_string(x.type); + gbString ets = type_to_string(y.type); + error(node, "Mismatched types in ternary if expression, %s vs %s", its, ets); + gb_string_free(ets); + gb_string_free(its); + return kind; + } + + o->type = x.type; + if (is_type_untyped_nil(o->type) || is_type_untyped_undef(o->type)) { + o->type = y.type; + } + + o->mode = Addressing_Value; + o->expr = node; + if (type_hint != nullptr && is_type_untyped(o->type)) { + if (check_cast_internal(c, &x, type_hint) && + check_cast_internal(c, &y, type_hint)) { + convert_to_typed(c, o, type_hint); + update_untyped_expr_type(c, node, type_hint, !is_type_untyped(type_hint)); + } + } + return kind; +} + +ExprKind check_ternary_when_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ExprKind kind = Expr_Expr; + Operand cond = {}; + ast_node(te, TernaryWhenExpr, node); + check_expr(c, &cond, te->cond); + node->viral_state_flags |= te->cond->viral_state_flags; + + if (cond.mode != Addressing_Constant || !is_type_boolean(cond.type)) { + error(te->cond, "Expected a constant boolean condition in ternary when expression"); + return kind; + } + + if (cond.value.value_bool) { + check_expr_or_type(c, o, te->x, type_hint); + node->viral_state_flags |= te->x->viral_state_flags; + } else { + if (te->y != nullptr) { + check_expr_or_type(c, o, te->y, type_hint); + node->viral_state_flags |= te->y->viral_state_flags; + } else { + error(node, "A ternary when expression must have an else clause"); + return kind; + } + } + return kind; +} + +ExprKind check_or_else_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ast_node(oe, OrElseExpr, node); + + String name = oe->token.string; + Ast *arg = oe->x; + Ast *default_value = oe->y; + + Operand x = {}; + Operand y = {}; + check_multi_expr_with_type_hint(c, &x, arg, type_hint); + if (x.mode == Addressing_Invalid) { + o->mode = Addressing_Value; + o->type = t_invalid; + o->expr = node; + return Expr_Expr; + } + + check_multi_expr_with_type_hint(c, &y, default_value, x.type); + error_operand_no_value(&y); + if (y.mode == Addressing_Invalid) { + o->mode = Addressing_Value; + o->type = t_invalid; + o->expr = node; + return Expr_Expr; + } + + Type *left_type = nullptr; + Type *right_type = nullptr; + check_or_else_split_types(c, &x, name, &left_type, &right_type); + add_type_and_value(&c->checker->info, arg, x.mode, x.type, x.value); + + if (left_type != nullptr) { + check_assignment(c, &y, left_type, name); + } else { + check_or_else_expr_no_value_error(c, name, x, type_hint); + } + + if (left_type == nullptr) { + left_type = t_invalid; + } + o->mode = Addressing_Value; + o->type = left_type; + o->expr = node; + return Expr_Expr; +} + +ExprKind check_or_return_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ast_node(re, OrReturnExpr, node); + + String name = re->token.string; + Operand x = {}; + check_multi_expr_with_type_hint(c, &x, re->expr, type_hint); + if (x.mode == Addressing_Invalid) { + o->mode = Addressing_Value; + o->type = t_invalid; + o->expr = node; + return Expr_Expr; + } + + Type *left_type = nullptr; + Type *right_type = nullptr; + check_or_return_split_types(c, &x, name, &left_type, &right_type); + add_type_and_value(&c->checker->info, re->expr, x.mode, x.type, x.value); + + if (right_type == nullptr) { + check_or_else_expr_no_value_error(c, name, x, type_hint); + } else { + Type *proc_type = base_type(c->curr_proc_sig); + GB_ASSERT(proc_type->kind == Type_Proc); + Type *result_type = proc_type->Proc.results; + if (result_type == nullptr) { + error(node, "'%.*s' requires the current procedure to have at least one return value", LIT(name)); + } else { + GB_ASSERT(result_type->kind == Type_Tuple); + + auto const &vars = result_type->Tuple.variables; + Type *end_type = vars[vars.count-1]->type; + + if (vars.count > 1) { + if (!proc_type->Proc.has_named_results) { + error(node, "'%.*s' within a procedure with more than 1 return value requires that the return values are named, allowing for early return", LIT(name)); + } + } + + Operand rhs = {}; + rhs.type = right_type; + rhs.mode = Addressing_Value; + + // TODO(bill): better error message + if (!check_is_assignable_to(c, &rhs, end_type)) { + gbString a = type_to_string(right_type); + gbString b = type_to_string(end_type); + gbString ret_type = type_to_string(result_type); + error(node, "Cannot assign end value of type '%s' to '%s' in '%.*s'", a, b, LIT(name)); + if (vars.count == 1) { + error_line("\tProcedure return value type: %s\n", ret_type); + } else { + error_line("\tProcedure return value types: (%s)\n", ret_type); + } + gb_string_free(ret_type); + gb_string_free(b); + gb_string_free(a); + } + } + } + + o->expr = node; + o->type = left_type; + if (left_type != nullptr) { + o->mode = Addressing_Value; + } else { + o->mode = Addressing_NoValue; + } + + if (c->curr_proc_sig == nullptr) { + error(node, "'%.*s' can only be used within a procedure", LIT(name)); + } + + if (c->in_defer) { + error(node, "'or_return' cannot be used within a defer statement"); + } + + return Expr_Expr; +} + +ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ExprKind kind = Expr_Expr; + ast_node(cl, CompoundLit, node); + + Type *type = type_hint; + if (type != nullptr && is_type_untyped(type)) { + type = nullptr; + } + bool is_to_be_determined_array_count = false; + bool is_constant = true; + if (cl->type != nullptr) { + type = nullptr; + + // [?]Type + if (cl->type->kind == Ast_ArrayType && cl->type->ArrayType.count != nullptr) { + Ast *count = cl->type->ArrayType.count; + if (count->kind == Ast_UnaryExpr && + count->UnaryExpr.op.kind == Token_Question) { + type = alloc_type_array(check_type(c, cl->type->ArrayType.elem), -1); + is_to_be_determined_array_count = true; + } + if (cl->elems.count > 0) { + if (cl->type->ArrayType.tag != nullptr) { + Ast *tag = cl->type->ArrayType.tag; + GB_ASSERT(tag->kind == Ast_BasicDirective); + String name = tag->BasicDirective.name.string; + if (name == "soa") { + error(node, "#soa arrays are not supported for compound literals"); + return kind; + } + } + } + } + if (cl->type->kind == Ast_DynamicArrayType && cl->type->DynamicArrayType.tag != nullptr) { + if (cl->elems.count > 0) { + Ast *tag = cl->type->DynamicArrayType.tag; + GB_ASSERT(tag->kind == Ast_BasicDirective); + String name = tag->BasicDirective.name.string; + if (name == "soa") { + error(node, "#soa arrays are not supported for compound literals"); + return kind; + } + } + } + + if (type == nullptr) { + type = check_type(c, cl->type); + } + } + + if (type == nullptr) { + error(node, "Missing type in compound literal"); + return kind; + } + + + Type *t = base_type(type); + if (is_type_polymorphic(t)) { + gbString str = type_to_string(type); + error(node, "Cannot use a polymorphic type for a compound literal, got '%s'", str); + o->expr = node; + o->type = type; + gb_string_free(str); + return kind; + } + + + switch (t->kind) { + case Type_Struct: { + if (cl->elems.count == 0) { + break; // NOTE(bill): No need to init + } + if (t->Struct.is_raw_union) { + if (cl->elems.count > 0) { + // NOTE: unions cannot be constant + is_constant = false; + + if (cl->elems[0]->kind != Ast_FieldValue) { + gbString type_str = type_to_string(type); + error(node, "%s ('struct #raw_union') compound literals are only allowed to contain 'field = value' elements", type_str); + gb_string_free(type_str); + } else { + if (cl->elems.count != 1) { + gbString type_str = type_to_string(type); + error(node, "%s ('struct #raw_union') compound literals are only allowed to contain up to 1 'field = value' element, got %td", type_str, cl->elems.count); + gb_string_free(type_str); + } else { + Ast *elem = cl->elems[0]; + ast_node(fv, FieldValue, elem); + if (fv->field->kind != Ast_Ident) { + gbString expr_str = expr_to_string(fv->field); + error(elem, "Invalid field name '%s' in structure literal", expr_str); + gb_string_free(expr_str); + break; + } + + String name = fv->field->Ident.token.string; + + Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + bool is_unknown = sel.entity == nullptr; + if (is_unknown) { + error(elem, "Unknown field '%.*s' in structure literal", LIT(name)); + break; + } + + if (sel.index.count > 1) { + error(elem, "Cannot assign to an anonymous field '%.*s' in a structure literal (at the moment)", LIT(name)); + break; + } + + Entity *field = t->Struct.fields[sel.index[0]]; + add_entity_use(c, fv->field, field); + + Operand o = {}; + check_expr_or_type(c, &o, fv->value, field->type); + + + check_assignment(c, &o, field->type, str_lit("structure literal")); + } + + } + } + break; + } + + + isize field_count = t->Struct.fields.count; + isize min_field_count = t->Struct.fields.count; + for (isize i = min_field_count-1; i >= 0; i--) { + Entity *e = t->Struct.fields[i]; + GB_ASSERT(e->kind == Entity_Variable); + if (e->Variable.param_value.kind != ParameterValue_Invalid) { + min_field_count--; + } else { + break; + } + } + + if (cl->elems[0]->kind == Ast_FieldValue) { + bool *fields_visited = gb_alloc_array(temporary_allocator(), bool, field_count); + + for_array(i, cl->elems) { + Ast *elem = cl->elems[i]; + if (elem->kind != Ast_FieldValue) { + error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); + continue; + } + ast_node(fv, FieldValue, elem); + if (fv->field->kind != Ast_Ident) { + gbString expr_str = expr_to_string(fv->field); + error(elem, "Invalid field name '%s' in structure literal", expr_str); + gb_string_free(expr_str); + continue; + } + String name = fv->field->Ident.token.string; + + Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + bool is_unknown = sel.entity == nullptr; + if (is_unknown) { + error(elem, "Unknown field '%.*s' in structure literal", LIT(name)); + continue; + } + + if (sel.index.count > 1) { + error(elem, "Cannot assign to an anonymous field '%.*s' in a structure literal (at the moment)", LIT(name)); + continue; + } + + Entity *field = t->Struct.fields[sel.index[0]]; + add_entity_use(c, fv->field, field); + + if (fields_visited[sel.index[0]]) { + error(elem, "Duplicate field '%.*s' in structure literal", LIT(name)); + continue; + } + + fields_visited[sel.index[0]] = true; + + Operand o = {}; + check_expr_or_type(c, &o, fv->value, field->type); + + if (is_type_any(field->type) || is_type_union(field->type) || is_type_raw_union(field->type) || is_type_typeid(field->type)) { + is_constant = false; + } + if (is_constant) { + is_constant = check_is_operand_compound_lit_constant(c, &o); + } + + check_assignment(c, &o, field->type, str_lit("structure literal")); + } + } else { + bool seen_field_value = false; + + for_array(index, cl->elems) { + Entity *field = nullptr; + Ast *elem = cl->elems[index]; + if (elem->kind == Ast_FieldValue) { + seen_field_value = true; + error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); + continue; + } else if (seen_field_value) { + error(elem, "Value elements cannot be used after a 'field = value'"); + continue; + } + if (index >= field_count) { + error(elem, "Too many values in structure literal, expected %td, got %td", field_count, cl->elems.count); + break; + } + + if (field == nullptr) { + field = t->Struct.fields[index]; + } + + Operand o = {}; + check_expr_or_type(c, &o, elem, field->type); + + if (is_type_any(field->type) || is_type_union(field->type) || is_type_raw_union(field->type) || is_type_typeid(field->type)) { + is_constant = false; + } + if (is_constant) { + is_constant = check_is_operand_compound_lit_constant(c, &o); + } + + check_assignment(c, &o, field->type, str_lit("structure literal")); + } + if (cl->elems.count < field_count) { + if (min_field_count < field_count) { + if (cl->elems.count < min_field_count) { + error(cl->close, "Too few values in structure literal, expected at least %td, got %td", min_field_count, cl->elems.count); + } + } else { + error(cl->close, "Too few values in structure literal, expected %td, got %td", field_count, cl->elems.count); + } + } + } + + break; + } + + case Type_Slice: + case Type_Array: + case Type_DynamicArray: + case Type_SimdVector: + case Type_Matrix: + { + Type *elem_type = nullptr; + String context_name = {}; + i64 max_type_count = -1; + if (t->kind == Type_Slice) { + elem_type = t->Slice.elem; + context_name = str_lit("slice literal"); + } else if (t->kind == Type_Array) { + elem_type = t->Array.elem; + context_name = str_lit("array literal"); + if (!is_to_be_determined_array_count) { + max_type_count = t->Array.count; + } + } else if (t->kind == Type_DynamicArray) { + elem_type = t->DynamicArray.elem; + context_name = str_lit("dynamic array literal"); + is_constant = false; + + if (!build_context.no_dynamic_literals) { + add_package_dependency(c, "runtime", "__dynamic_array_reserve"); + add_package_dependency(c, "runtime", "__dynamic_array_append"); + } + } else if (t->kind == Type_SimdVector) { + elem_type = t->SimdVector.elem; + context_name = str_lit("simd vector literal"); + max_type_count = t->SimdVector.count; + } else if (t->kind == Type_Matrix) { + elem_type = t->Matrix.elem; + context_name = str_lit("matrix literal"); + max_type_count = t->Matrix.row_count*t->Matrix.column_count; + } else { + GB_PANIC("unreachable"); + } + + + i64 max = 0; + + Type *bet = base_type(elem_type); + if (!elem_type_can_be_constant(bet)) { + is_constant = false; + } + + if (bet == t_invalid) { + break; + } + + if (cl->elems.count > 0 && cl->elems[0]->kind == Ast_FieldValue) { + if (is_type_simd_vector(t)) { + error(cl->elems[0], "'field = value' is not allowed for SIMD vector literals"); + } else { + RangeCache rc = range_cache_make(heap_allocator()); + defer (range_cache_destroy(&rc)); + + for_array(i, cl->elems) { + Ast *elem = cl->elems[i]; + if (elem->kind != Ast_FieldValue) { + error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); + continue; + } + ast_node(fv, FieldValue, elem); + + if (is_ast_range(fv->field)) { + Token op = fv->field->BinaryExpr.op; + + Operand x = {}; + Operand y = {}; + bool ok = check_range(c, fv->field, &x, &y, nullptr); + if (!ok) { + continue; + } + if (x.mode != Addressing_Constant || !is_type_integer(core_type(x.type))) { + error(x.expr, "Expected a constant integer as an array field"); + continue; + } + + if (y.mode != Addressing_Constant || !is_type_integer(core_type(y.type))) { + error(y.expr, "Expected a constant integer as an array field"); + continue; + } + + i64 lo = exact_value_to_i64(x.value); + i64 hi = exact_value_to_i64(y.value); + i64 max_index = hi; + if (op.kind == Token_RangeHalf) { // ..< (exclusive) + hi -= 1; + } else { // .. (inclusive) + max_index += 1; + } + + bool new_range = range_cache_add_range(&rc, lo, hi); + if (!new_range) { + error(elem, "Overlapping field range index %lld %.*s %lld for %.*s", lo, LIT(op.string), hi, LIT(context_name)); + continue; + } + + + if (max_type_count >= 0 && (lo < 0 || lo >= max_type_count)) { + error(elem, "Index %lld is out of bounds (0..<%lld) for %.*s", lo, max_type_count, LIT(context_name)); + continue; + } + if (max_type_count >= 0 && (hi < 0 || hi >= max_type_count)) { + error(elem, "Index %lld is out of bounds (0..<%lld) for %.*s", hi, max_type_count, LIT(context_name)); + continue; + } + + if (max < hi) { + max = max_index; + } + + Operand operand = {}; + check_expr_with_type_hint(c, &operand, fv->value, elem_type); + check_assignment(c, &operand, elem_type, context_name); + + is_constant = is_constant && operand.mode == Addressing_Constant; + } else { + Operand op_index = {}; + check_expr(c, &op_index, fv->field); + + if (op_index.mode != Addressing_Constant || !is_type_integer(core_type(op_index.type))) { + error(elem, "Expected a constant integer as an array field"); + continue; + } + // add_type_and_value(c->info, op_index.expr, op_index.mode, op_index.type, op_index.value); + + i64 index = exact_value_to_i64(op_index.value); + + if (max_type_count >= 0 && (index < 0 || index >= max_type_count)) { + error(elem, "Index %lld is out of bounds (0..<%lld) for %.*s", index, max_type_count, LIT(context_name)); + continue; + } + + bool new_index = range_cache_add_index(&rc, index); + if (!new_index) { + error(elem, "Duplicate field index %lld for %.*s", index, LIT(context_name)); + continue; + } + + if (max < index+1) { + max = index+1; + } + + Operand operand = {}; + check_expr_with_type_hint(c, &operand, fv->value, elem_type); + check_assignment(c, &operand, elem_type, context_name); + + is_constant = is_constant && operand.mode == Addressing_Constant; + } + } + + cl->max_count = max; + } + + } else { + isize index = 0; + for (; index < cl->elems.count; index++) { + Ast *e = cl->elems[index]; + if (e == nullptr) { + error(node, "Invalid literal element"); + continue; + } + + if (e->kind == Ast_FieldValue) { + error(e, "Mixture of 'field = value' and value elements in a literal is not allowed"); + continue; + } + + if (0 <= max_type_count && max_type_count <= index) { + error(e, "Index %lld is out of bounds (>= %lld) for %.*s", index, max_type_count, LIT(context_name)); + } + + Operand operand = {}; + check_expr_with_type_hint(c, &operand, e, elem_type); + check_assignment(c, &operand, elem_type, context_name); + + is_constant = is_constant && operand.mode == Addressing_Constant; + } + + if (max < index) { + max = index; + } + } + + + if (t->kind == Type_Array) { + if (is_to_be_determined_array_count) { + t->Array.count = max; + } else if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { + if (0 < max && max < t->Array.count) { + error(node, "Expected %lld values for this array literal, got %lld", cast(long long)t->Array.count, cast(long long)max); + } + } + } + + + if (t->kind == Type_SimdVector) { + if (!is_constant) { + error(node, "Expected all constant elements for a simd vector"); + } + } + + + if (t->kind == Type_DynamicArray) { + if (build_context.no_dynamic_literals && cl->elems.count) { + error(node, "Compound literals of dynamic types have been disabled"); + } + } + + if (t->kind == Type_Matrix) { + if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { + if (0 < max && max < max_type_count) { + error(node, "Expected %lld values for this matrix literal, got %lld", cast(long long)max_type_count, cast(long long)max); + } + } + } + + break; + } + + case Type_EnumeratedArray: + { + Type *elem_type = t->EnumeratedArray.elem; + Type *index_type = t->EnumeratedArray.index; + String context_name = str_lit("enumerated array literal"); + i64 max_type_count = t->EnumeratedArray.count; + + gbString index_type_str = type_to_string(index_type); + defer (gb_string_free(index_type_str)); + + i64 total_lo = exact_value_to_i64(*t->EnumeratedArray.min_value); + i64 total_hi = exact_value_to_i64(*t->EnumeratedArray.max_value); + + String total_lo_string = {}; + String total_hi_string = {}; + GB_ASSERT(is_type_enum(index_type)); + { + Type *bt = base_type(index_type); + GB_ASSERT(bt->kind == Type_Enum); + for_array(i, bt->Enum.fields) { + Entity *f = bt->Enum.fields[i]; + if (f->kind != Entity_Constant) { + continue; + } + if (total_lo_string.len == 0 && compare_exact_values(Token_CmpEq, f->Constant.value, *t->EnumeratedArray.min_value)) { + total_lo_string = f->token.string; + } + if (total_hi_string.len == 0 && compare_exact_values(Token_CmpEq, f->Constant.value, *t->EnumeratedArray.max_value)) { + total_hi_string = f->token.string; + } + if (total_lo_string.len != 0 && total_hi_string.len != 0) { + break; + } + } + } + + i64 max = 0; + + Type *bet = base_type(elem_type); + if (!elem_type_can_be_constant(bet)) { + is_constant = false; + } + + if (bet == t_invalid) { + break; + } + bool is_partial = cl->tag && (cl->tag->BasicDirective.name.string == "partial"); + + SeenMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue + map_init(&seen, heap_allocator()); + defer (map_destroy(&seen)); + + if (cl->elems.count > 0 && cl->elems[0]->kind == Ast_FieldValue) { + RangeCache rc = range_cache_make(heap_allocator()); + defer (range_cache_destroy(&rc)); + + for_array(i, cl->elems) { + Ast *elem = cl->elems[i]; + if (elem->kind != Ast_FieldValue) { + error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); + continue; + } + ast_node(fv, FieldValue, elem); + + if (is_ast_range(fv->field)) { + Token op = fv->field->BinaryExpr.op; + + Operand x = {}; + Operand y = {}; + bool ok = check_range(c, fv->field, &x, &y, nullptr, index_type); + if (!ok) { + continue; + } + if (x.mode != Addressing_Constant || !are_types_identical(x.type, index_type)) { + error(x.expr, "Expected a constant enum of type '%s' as an array field", index_type_str); + continue; + } + + if (y.mode != Addressing_Constant || !are_types_identical(x.type, index_type)) { + error(y.expr, "Expected a constant enum of type '%s' as an array field", index_type_str); + continue; + } + + i64 lo = exact_value_to_i64(x.value); + i64 hi = exact_value_to_i64(y.value); + i64 max_index = hi; + if (op.kind == Token_RangeHalf) { + hi -= 1; + } + + bool new_range = range_cache_add_range(&rc, lo, hi); + if (!new_range) { + gbString lo_str = expr_to_string(x.expr); + gbString hi_str = expr_to_string(y.expr); + error(elem, "Overlapping field range index %s %.*s %s for %.*s", lo_str, LIT(op.string), hi_str, LIT(context_name)); + gb_string_free(hi_str); + gb_string_free(lo_str); + continue; + } + + + // NOTE(bill): These are sanity checks for invalid enum values + if (max_type_count >= 0 && (lo < total_lo || lo > total_hi)) { + gbString lo_str = expr_to_string(x.expr); + error(elem, "Index %s is out of bounds (%.*s .. %.*s) for %.*s", lo_str, LIT(total_lo_string), LIT(total_hi_string), LIT(context_name)); + gb_string_free(lo_str); + continue; + } + if (max_type_count >= 0 && (hi < 0 || hi > total_hi)) { + gbString hi_str = expr_to_string(y.expr); + error(elem, "Index %s is out of bounds (%.*s .. %.*s) for %.*s", hi_str, LIT(total_lo_string), LIT(total_hi_string), LIT(context_name)); + gb_string_free(hi_str); + continue; + } + + if (max < hi) { + max = max_index; + } + + Operand operand = {}; + check_expr_with_type_hint(c, &operand, fv->value, elem_type); + check_assignment(c, &operand, elem_type, context_name); + + is_constant = is_constant && operand.mode == Addressing_Constant; + + TokenKind upper_op = Token_LtEq; + if (op.kind == Token_RangeHalf) { + upper_op = Token_Lt; + } + add_to_seen_map(c, &seen, upper_op, x, x, y); + } else { + Operand op_index = {}; + check_expr_with_type_hint(c, &op_index, fv->field, index_type); + + if (op_index.mode != Addressing_Constant || !are_types_identical(op_index.type, index_type)) { + error(op_index.expr, "Expected a constant enum of type '%s' as an array field", index_type_str); + continue; + } + + i64 index = exact_value_to_i64(op_index.value); + + if (max_type_count >= 0 && (index < total_lo || index > total_hi)) { + gbString idx_str = expr_to_string(op_index.expr); + error(elem, "Index %s is out of bounds (%.*s .. %.*s) for %.*s", idx_str, LIT(total_lo_string), LIT(total_hi_string), LIT(context_name)); + gb_string_free(idx_str); + continue; + } + + bool new_index = range_cache_add_index(&rc, index); + if (!new_index) { + gbString idx_str = expr_to_string(op_index.expr); + error(elem, "Duplicate field index %s for %.*s", idx_str, LIT(context_name)); + gb_string_free(idx_str); + continue; + } + + if (max < index+1) { + max = index+1; + } + + Operand operand = {}; + check_expr_with_type_hint(c, &operand, fv->value, elem_type); + check_assignment(c, &operand, elem_type, context_name); + + is_constant = is_constant && operand.mode == Addressing_Constant; + + add_to_seen_map(c, &seen, op_index); + } + } + + cl->max_count = max; + + } else { + isize index = 0; + for (; index < cl->elems.count; index++) { + Ast *e = cl->elems[index]; + if (e == nullptr) { + error(node, "Invalid literal element"); + continue; + } + + if (e->kind == Ast_FieldValue) { + error(e, "Mixture of 'field = value' and value elements in a literal is not allowed"); + continue; + } + + if (0 <= max_type_count && max_type_count <= index) { + error(e, "Index %lld is out of bounds (>= %lld) for %.*s", index, max_type_count, LIT(context_name)); + } + + Operand operand = {}; + check_expr_with_type_hint(c, &operand, e, elem_type); + check_assignment(c, &operand, elem_type, context_name); + + is_constant = is_constant && operand.mode == Addressing_Constant; + } + + if (max < index) { + max = index; + } + } + + bool was_error = false; + if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { + if (0 < max && max < t->EnumeratedArray.count) { + error(node, "Expected %lld values for this enumerated array literal, got %lld", cast(long long)t->EnumeratedArray.count, cast(long long)max); + was_error = true; + } else { + error(node, "Enumerated array literals must only have 'field = value' elements, bare elements are not allowed"); + was_error = true; + } + } + + // NOTE(bill): Check for missing cases when `#partial literal` is not present + if (cl->elems.count > 0 && !was_error && !is_partial) { + Type *et = base_type(index_type); + GB_ASSERT(et->kind == Type_Enum); + auto fields = et->Enum.fields; + + auto unhandled = array_make(temporary_allocator(), 0, fields.count); + + for_array(i, fields) { + Entity *f = fields[i]; + if (f->kind != Entity_Constant) { + continue; + } + ExactValue v = f->Constant.value; + auto found = map_get(&seen, hash_exact_value(v)); + if (!found) { + array_add(&unhandled, f); + } + } + + if (unhandled.count > 0) { + begin_error_block(); + defer (end_error_block()); + + if (unhandled.count == 1) { + error_no_newline(node, "Unhandled enumerated array case: %.*s", LIT(unhandled[0]->token.string)); + } else { + error(node, "Unhandled enumerated array cases:"); + for_array(i, unhandled) { + Entity *f = unhandled[i]; + error_line("\t%.*s\n", LIT(f->token.string)); + } + } + error_line("\n"); + + error_line("\tSuggestion: Was '#partial %s{...}' wanted?\n", type_to_string(type)); + } + } + + break; + } + + case Type_Basic: { + if (!is_type_any(t)) { + if (cl->elems.count != 0) { + error(node, "Illegal compound literal"); + } + break; + } + if (cl->elems.count == 0) { + break; // NOTE(bill): No need to init + } + { // Checker values + Type *field_types[2] = {t_rawptr, t_typeid}; + isize field_count = 2; + if (cl->elems[0]->kind == Ast_FieldValue) { + bool fields_visited[2] = {}; + + for_array(i, cl->elems) { + Ast *elem = cl->elems[i]; + if (elem->kind != Ast_FieldValue) { + error(elem, "Mixture of 'field = value' and value elements in a 'any' literal is not allowed"); + continue; + } + ast_node(fv, FieldValue, elem); + if (fv->field->kind != Ast_Ident) { + gbString expr_str = expr_to_string(fv->field); + error(elem, "Invalid field name '%s' in 'any' literal", expr_str); + gb_string_free(expr_str); + continue; + } + String name = fv->field->Ident.token.string; + + Selection sel = lookup_field(type, name, o->mode == Addressing_Type); + if (sel.entity == nullptr) { + error(elem, "Unknown field '%.*s' in 'any' literal", LIT(name)); + continue; + } + + isize index = sel.index[0]; + + if (fields_visited[index]) { + error(elem, "Duplicate field '%.*s' in 'any' literal", LIT(name)); + continue; + } + + fields_visited[index] = true; + check_expr(c, o, fv->value); + + // NOTE(bill): 'any' literals can never be constant + is_constant = false; + + check_assignment(c, o, field_types[index], str_lit("'any' literal")); + } + } else { + for_array(index, cl->elems) { + Ast *elem = cl->elems[index]; + if (elem->kind == Ast_FieldValue) { + error(elem, "Mixture of 'field = value' and value elements in a 'any' literal is not allowed"); + continue; + } + + + check_expr(c, o, elem); + if (index >= field_count) { + error(o->expr, "Too many values in 'any' literal, expected %td", field_count); + break; + } + + // NOTE(bill): 'any' literals can never be constant + is_constant = false; + + check_assignment(c, o, field_types[index], str_lit("'any' literal")); + } + if (cl->elems.count < field_count) { + error(cl->close, "Too few values in 'any' literal, expected %td, got %td", field_count, cl->elems.count); + } + } + } + + break; + } + + case Type_Map: { + if (cl->elems.count == 0) { + break; + } + is_constant = false; + { // Checker values + bool key_is_typeid = is_type_typeid(t->Map.key); + bool value_is_typeid = is_type_typeid(t->Map.value); + + for_array(i, cl->elems) { + Ast *elem = cl->elems[i]; + if (elem->kind != Ast_FieldValue) { + error(elem, "Only 'field = value' elements are allowed in a map literal"); + continue; + } + ast_node(fv, FieldValue, elem); + + if (key_is_typeid) { + check_expr_or_type(c, o, fv->field, t->Map.key); + } else { + check_expr_with_type_hint(c, o, fv->field, t->Map.key); + } + check_assignment(c, o, t->Map.key, str_lit("map literal")); + if (o->mode == Addressing_Invalid) { + continue; + } + + if (value_is_typeid) { + check_expr_or_type(c, o, fv->value, t->Map.value); + } else { + check_expr_with_type_hint(c, o, fv->value, t->Map.value); + } + check_assignment(c, o, t->Map.value, str_lit("map literal")); + } + } + + if (build_context.no_dynamic_literals && cl->elems.count) { + error(node, "Compound literals of dynamic types have been disabled"); + } else { + add_package_dependency(c, "runtime", "__dynamic_map_reserve"); + add_package_dependency(c, "runtime", "__dynamic_map_set"); + } + break; + } + + case Type_BitSet: { + if (cl->elems.count == 0) { + break; // NOTE(bill): No need to init + } + Type *et = base_type(t->BitSet.elem); + isize field_count = 0; + if (et->kind == Type_Enum) { + field_count = et->Enum.fields.count; + } + + if (cl->elems[0]->kind == Ast_FieldValue) { + error(cl->elems[0], "'field = value' in a bit_set a literal is not allowed"); + is_constant = false; + } else { + for_array(index, cl->elems) { + Ast *elem = cl->elems[index]; + if (elem->kind == Ast_FieldValue) { + error(elem, "'field = value' in a bit_set a literal is not allowed"); + continue; + } + + check_expr_with_type_hint(c, o, elem, et); + + if (is_constant) { + is_constant = o->mode == Addressing_Constant; + } + + check_assignment(c, o, t->BitSet.elem, str_lit("bit_set literal")); + if (o->mode == Addressing_Constant) { + i64 lower = t->BitSet.lower; + i64 upper = t->BitSet.upper; + i64 v = exact_value_to_i64(o->value); + if (lower <= v && v <= upper) { + // okay + } else { + error(elem, "Bit field value out of bounds, %lld not in the range %lld .. %lld", v, lower, upper); + continue; + } + } + } + } + break; + } + + default: { + if (cl->elems.count == 0) { + break; // NOTE(bill): No need to init + } + + gbString str = type_to_string(type); + error(node, "Invalid compound literal type '%s'", str); + gb_string_free(str); + return kind; + } + } + + if (is_constant) { + o->mode = Addressing_Constant; + + if (is_type_bit_set(type)) { + // NOTE(bill): Encode as an integer + + i64 lower = base_type(type)->BitSet.lower; + + u64 bits = 0; + for_array(index, cl->elems) { + Ast *elem = cl->elems[index]; + GB_ASSERT(elem->kind != Ast_FieldValue); + TypeAndValue tav = elem->tav; + ExactValue i = exact_value_to_integer(tav.value); + if (i.kind != ExactValue_Integer) { + continue; + } + i64 val = big_int_to_i64(&i.value_integer); + val -= lower; + u64 bit = u64(1ll<value = exact_value_u64(bits); + } else if (is_type_constant_type(type) && cl->elems.count == 0) { + ExactValue value = exact_value_compound(node); + Type *bt = core_type(type); + if (bt->kind == Type_Basic) { + if (bt->Basic.flags & BasicFlag_Boolean) { + value = exact_value_bool(false); + } else if (bt->Basic.flags & BasicFlag_Integer) { + value = exact_value_i64(0); + } else if (bt->Basic.flags & BasicFlag_Unsigned) { + value = exact_value_i64(0); + } else if (bt->Basic.flags & BasicFlag_Float) { + value = exact_value_float(0); + } else if (bt->Basic.flags & BasicFlag_Complex) { + value = exact_value_complex(0, 0); + } else if (bt->Basic.flags & BasicFlag_Quaternion) { + value = exact_value_quaternion(0, 0, 0, 0); + } else if (bt->Basic.flags & BasicFlag_Pointer) { + value = exact_value_pointer(0); + } else if (bt->Basic.flags & BasicFlag_String) { + String empty_string = {}; + value = exact_value_string(empty_string); + } else if (bt->Basic.flags & BasicFlag_Rune) { + value = exact_value_i64(0); + } + } + + o->value = value; + } else { + o->value = exact_value_compound(node); + } + } else { + o->mode = Addressing_Value; + } + o->type = type; + return kind; +} + +ExprKind check_type_assertion(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ExprKind kind = Expr_Expr; + ast_node(ta, TypeAssertion, node); + check_expr(c, o, ta->expr); + node->viral_state_flags |= ta->expr->viral_state_flags; + + if (o->mode == Addressing_Invalid) { + o->expr = node; + return kind; + } + if (o->mode == Addressing_Constant) { + gbString expr_str = expr_to_string(o->expr); + error(o->expr, "A type assertion cannot be applied to a constant expression: '%s'", expr_str); + gb_string_free(expr_str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + if (is_type_untyped(o->type)) { + gbString expr_str = expr_to_string(o->expr); + error(o->expr, "A type assertion cannot be applied to an untyped expression: '%s'", expr_str); + gb_string_free(expr_str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + Type *src = type_deref(o->type); + Type *bsrc = base_type(src); + + + if (ta->type != nullptr && ta->type->kind == Ast_UnaryExpr && ta->type->UnaryExpr.op.kind == Token_Question) { + if (!is_type_union(src)) { + gbString str = type_to_string(o->type); + error(o->expr, "Type assertions with .? can only operate on unions, got %s", str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + if (bsrc->Union.variants.count != 1 && type_hint != nullptr) { + bool allowed = false; + for_array(i, bsrc->Union.variants) { + Type *vt = bsrc->Union.variants[i]; + if (are_types_identical(vt, type_hint)) { + allowed = true; + add_type_info_type(c, vt); + break; + } + } + if (allowed) { + add_type_info_type(c, o->type); + o->type = type_hint; + o->mode = Addressing_OptionalOk; + return kind; + } + } + + if (bsrc->Union.variants.count != 1) { + error(o->expr, "Type assertions with .? can only operate on unions with 1 variant, got %lld", cast(long long)bsrc->Union.variants.count); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + add_type_info_type(c, o->type); + add_type_info_type(c, bsrc->Union.variants[0]); + + o->type = bsrc->Union.variants[0]; + o->mode = Addressing_OptionalOk; + } else { + Type *t = check_type(c, ta->type); + Type *dst = t; + + if (is_type_union(src)) { + bool ok = false; + for_array(i, bsrc->Union.variants) { + Type *vt = bsrc->Union.variants[i]; + if (are_types_identical(vt, dst)) { + ok = true; + break; + } + } + + if (!ok) { + gbString expr_str = expr_to_string(o->expr); + gbString dst_type_str = type_to_string(t); + defer (gb_string_free(expr_str)); + defer (gb_string_free(dst_type_str)); + if (bsrc->Union.variants.count == 0) { + error(o->expr, "Cannot type assert '%s' to '%s' as this is an empty union", expr_str, dst_type_str); + } else { + error(o->expr, "Cannot type assert '%s' to '%s' as it is not a variant of that union", expr_str, dst_type_str); + } + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + add_type_info_type(c, o->type); + add_type_info_type(c, t); + + o->type = t; + o->mode = Addressing_OptionalOk; + } else if (is_type_any(src)) { + o->type = t; + o->mode = Addressing_OptionalOk; + + add_type_info_type(c, o->type); + add_type_info_type(c, t); + } else { + gbString str = type_to_string(o->type); + error(o->expr, "Type assertions can only operate on unions and 'any', got %s", str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + } + + if ((c->state_flags & StateFlag_no_type_assert) == 0) { + add_package_dependency(c, "runtime", "type_assertion_check"); + add_package_dependency(c, "runtime", "type_assertion_check2"); + } + return kind; +} + +ExprKind check_selector_call_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ast_node(se, SelectorCallExpr, node); + // IMPORTANT NOTE(bill, 2020-05-22): This is a complete hack to get a shorthand which is extremely useful for vtables + // COM APIs is a great example of where this kind of thing is extremely useful + // General idea: + // + // x->y(123) == x.y(x, 123) + // + // How this has been implemented at the moment is quite hacky but it's done so to reduce need for huge backend changes + // Just regenerating a new AST aids things + // + // TODO(bill): Is this a good hack or not? + // + // NOTE(bill, 2020-05-22): I'm going to regret this decision, ain't I? + + + if (se->modified_call) { + // Prevent double evaluation + o->expr = node; + o->type = node->tav.type; + o->value = node->tav.value; + o->mode = node->tav.mode; + return Expr_Expr; + } + + bool allow_arrow_right_selector_expr; + allow_arrow_right_selector_expr = c->allow_arrow_right_selector_expr; + c->allow_arrow_right_selector_expr = true; + Operand x = {}; + ExprKind kind = check_expr_base(c, &x, se->expr, nullptr); + c->allow_arrow_right_selector_expr = allow_arrow_right_selector_expr; + + if (x.mode == Addressing_Invalid || x.type == t_invalid) { + o->mode = Addressing_Invalid; + o->type = t_invalid; + o->expr = node; + return kind; + } + if (!is_type_proc(x.type)) { + gbString type_str = type_to_string(x.type); + error(se->call, "Selector call expressions expect a procedure type for the call, got '%s'", type_str); + gb_string_free(type_str); + + o->mode = Addressing_Invalid; + o->type = t_invalid; + o->expr = node; + return Expr_Stmt; + } + + ast_node(ce, CallExpr, se->call); + + GB_ASSERT(x.expr->kind == Ast_SelectorExpr); + + Ast *first_arg = x.expr->SelectorExpr.expr; + GB_ASSERT(first_arg != nullptr); + + Type *pt = base_type(x.type); + GB_ASSERT(pt->kind == Type_Proc); + Type *first_type = nullptr; + String first_arg_name = {}; + if (pt->Proc.param_count > 0) { + Entity *f = pt->Proc.params->Tuple.variables[0]; + first_type = f->type; + first_arg_name = f->token.string; + } + if (first_arg_name.len == 0) { + first_arg_name = str_lit("_"); + } + + if (first_type == nullptr) { + error(se->call, "Selector call expressions expect a procedure type for the call with at least 1 parameter"); + o->mode = Addressing_Invalid; + o->type = t_invalid; + o->expr = node; + return Expr_Stmt; + } + + Operand y = {}; + y.mode = first_arg->tav.mode; + y.type = first_arg->tav.type; + y.value = first_arg->tav.value; + if (check_is_assignable_to(c, &y, first_type)) { + // Do nothing, it's valid + } else { + Operand z = y; + z.type = type_deref(y.type); + if (check_is_assignable_to(c, &z, first_type)) { + // NOTE(bill): AST GENERATION HACK! + Token op = {Token_Pointer}; + first_arg = ast_deref_expr(first_arg->file(), first_arg, op); + } else if (y.mode == Addressing_Variable) { + Operand w = y; + w.type = alloc_type_pointer(y.type); + if (check_is_assignable_to(c, &w, first_type)) { + // NOTE(bill): AST GENERATION HACK! + Token op = {Token_And}; + first_arg = ast_unary_expr(first_arg->file(), op, first_arg); + } + } + } + + if (ce->args.count > 0) { + bool fail = false; + bool first_is_field_value = (ce->args[0]->kind == Ast_FieldValue); + for_array(i, ce->args) { + Ast *arg = ce->args[i]; + bool mix = false; + if (first_is_field_value) { + mix = arg->kind != Ast_FieldValue; + } else { + mix = arg->kind == Ast_FieldValue; + } + if (mix) { + fail = true; + break; + } + } + if (!fail && first_is_field_value) { + Token op = {Token_Eq}; + AstFile *f = first_arg->file(); + first_arg = ast_field_value(f, ast_ident(f, make_token_ident(first_arg_name)), first_arg, op); + } + } + + + + auto modified_args = slice_make(heap_allocator(), ce->args.count+1); + modified_args[0] = first_arg; + slice_copy(&modified_args, ce->args, 1); + ce->args = modified_args; + se->modified_call = true; + + allow_arrow_right_selector_expr = c->allow_arrow_right_selector_expr; + c->allow_arrow_right_selector_expr = true; + check_expr_base(c, o, se->call, type_hint); + c->allow_arrow_right_selector_expr = allow_arrow_right_selector_expr; + + o->expr = node; + return Expr_Expr; +} + + +ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ExprKind kind = Expr_Expr; + ast_node(ie, IndexExpr, node); + check_expr(c, o, ie->expr); + node->viral_state_flags |= ie->expr->viral_state_flags; + if (o->mode == Addressing_Invalid) { + o->expr = node; + return kind; + } + + Type *t = base_type(type_deref(o->type)); + bool is_ptr = is_type_pointer(o->type); + bool is_const = o->mode == Addressing_Constant; + + if (is_type_map(t)) { + Operand key = {}; + if (is_type_typeid(t->Map.key)) { + check_expr_or_type(c, &key, ie->index, t->Map.key); + } else { + check_expr_with_type_hint(c, &key, ie->index, t->Map.key); + } + check_assignment(c, &key, t->Map.key, str_lit("map index")); + if (key.mode == Addressing_Invalid) { + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + o->mode = Addressing_MapIndex; + o->type = t->Map.value; + o->expr = node; + + add_package_dependency(c, "runtime", "__dynamic_map_get"); + add_package_dependency(c, "runtime", "__dynamic_map_set"); + return Expr_Expr; + } + + i64 max_count = -1; + bool valid = check_set_index_data(o, t, is_ptr, &max_count, o->type); + + if (is_const) { + if (is_type_array(t)) { + // OKay + } else if (is_type_slice(t)) { + // Okay + } else if (is_type_enumerated_array(t)) { + // Okay + } else if (is_type_string(t)) { + // Okay + } else if (is_type_relative_slice(t)) { + // Okay + } else if (is_type_matrix(t)) { + // Okay + } else { + valid = false; + } + } + + if (!valid) { + gbString str = expr_to_string(o->expr); + gbString type_str = type_to_string(o->type); + defer (gb_string_free(str)); + defer (gb_string_free(type_str)); + if (is_const) { + error(o->expr, "Cannot index constant '%s' of type '%s'", str, type_str); + } else { + error(o->expr, "Cannot index '%s' of type '%s'", str, type_str); + } + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + if (ie->index == nullptr) { + gbString str = expr_to_string(o->expr); + error(o->expr, "Missing index for '%s'", str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + Type *index_type_hint = nullptr; + if (is_type_enumerated_array(t)) { + Type *bt = base_type(t); + GB_ASSERT(bt->kind == Type_EnumeratedArray); + index_type_hint = bt->EnumeratedArray.index; + } + + i64 index = 0; + bool ok = check_index_value(c, t, false, ie->index, max_count, &index, index_type_hint); + if (is_const) { + if (index < 0) { + gbString str = expr_to_string(o->expr); + error(o->expr, "Cannot index a constant '%s'", str); + error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n"); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } else if (ok) { + ExactValue value = type_and_value_of_expr(ie->expr).value; + o->mode = Addressing_Constant; + bool success = false; + bool finish = false; + o->value = get_constant_field_single(c, value, cast(i32)index, &success, &finish); + if (!success) { + gbString str = expr_to_string(o->expr); + error(o->expr, "Cannot index a constant '%s' with index %lld", str, cast(long long)index); + error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n"); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + } + } + + if (type_hint != nullptr && is_type_matrix(t)) { + // TODO(bill): allow matrix columns to be assignable to other types which are the same internally + // if a type hint exists + } + return kind; +} + +ExprKind check_slice_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { + ExprKind kind = Expr_Stmt; + ast_node(se, SliceExpr, node); + check_expr(c, o, se->expr); + node->viral_state_flags |= se->expr->viral_state_flags; + + if (o->mode == Addressing_Invalid) { + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + bool valid = false; + i64 max_count = -1; + Type *t = base_type(type_deref(o->type)); + switch (t->kind) { + case Type_Basic: + if (t->Basic.kind == Basic_string || t->Basic.kind == Basic_UntypedString) { + valid = true; + if (o->mode == Addressing_Constant) { + max_count = o->value.value_string.len; + } + o->type = type_deref(o->type); + } + break; + + case Type_Array: + valid = true; + max_count = t->Array.count; + if (o->mode != Addressing_Variable && !is_type_pointer(o->type)) { + gbString str = expr_to_string(node); + error(node, "Cannot slice array '%s', value is not addressable", str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + o->type = alloc_type_slice(t->Array.elem); + break; + + case Type_MultiPointer: + valid = true; + o->type = type_deref(o->type); + break; + + case Type_Slice: + valid = true; + o->type = type_deref(o->type); + break; + + case Type_DynamicArray: + valid = true; + o->type = alloc_type_slice(t->DynamicArray.elem); + break; + + case Type_Struct: + if (is_type_soa_struct(t)) { + valid = true; + o->type = make_soa_struct_slice(c, nullptr, nullptr, t->Struct.soa_elem); + } + break; + + case Type_RelativeSlice: + valid = true; + o->type = t->RelativeSlice.slice_type; + if (o->mode != Addressing_Variable) { + gbString str = expr_to_string(node); + error(node, "Cannot relative slice '%s', value is not addressable", str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + break; + } + + if (!valid) { + gbString str = expr_to_string(o->expr); + gbString type_str = type_to_string(o->type); + error(o->expr, "Cannot slice '%s' of type '%s'", str, type_str); + gb_string_free(type_str); + gb_string_free(str); + o->mode = Addressing_Invalid; + o->expr = node; + return kind; + } + + if (se->low == nullptr && se->high != nullptr) { + // It is okay to continue as it will assume the 1st index is zero + } + + i64 indices[2] = {}; + Ast *nodes[2] = {se->low, se->high}; + for (isize i = 0; i < gb_count_of(nodes); i++) { + i64 index = max_count; + if (nodes[i] != nullptr) { + i64 capacity = -1; + if (max_count >= 0) { + capacity = max_count; + } + i64 j = 0; + if (check_index_value(c, t, true, nodes[i], capacity, &j)) { + index = j; + } + + node->viral_state_flags |= nodes[i]->viral_state_flags; + } else if (i == 0) { + index = 0; + } + indices[i] = index; + } + + for (isize i = 0; i < gb_count_of(indices); i++) { + i64 a = indices[i]; + for (isize j = i+1; j < gb_count_of(indices); j++) { + i64 b = indices[j]; + if (a > b && b >= 0) { + error(se->close, "Invalid slice indices: [%td > %td]", a, b); + } + } + } + + if (max_count < 0) { + if (o->mode == Addressing_Constant) { + gbString s = expr_to_string(se->expr); + error(se->expr, "Cannot slice constant value '%s'", s); + gb_string_free(s); + } + } + + if (t->kind == Type_MultiPointer && se->high != nullptr) { + /* + x[:] -> [^]T + x[i:] -> [^]T + x[:n] -> []T + x[i:n] -> []T + */ + o->type = alloc_type_slice(t->MultiPointer.elem); + } + + o->mode = Addressing_Value; + + if (is_type_string(t) && max_count >= 0) { + bool all_constant = true; + for (isize i = 0; i < gb_count_of(nodes); i++) { + if (nodes[i] != nullptr) { + TypeAndValue tav = type_and_value_of_expr(nodes[i]); + if (tav.mode != Addressing_Constant) { + all_constant = false; + break; + } + } + } + if (!all_constant) { + gbString str = expr_to_string(o->expr); + error(o->expr, "Cannot slice '%s' with non-constant indices", str); + error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n"); + gb_string_free(str); + o->mode = Addressing_Value; // NOTE(bill): Keep subsequent values going without erring + o->expr = node; + return kind; + } + + String s = {}; + if (o->value.kind == ExactValue_String) { + s = o->value.value_string; + } + + o->mode = Addressing_Constant; + o->type = t; + o->value = exact_value_string(substring(s, cast(isize)indices[0], cast(isize)indices[1])); + } + return kind; +} ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { u32 prev_state_flags = c->state_flags; @@ -7189,52 +8988,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type case_end; case_ast_node(bd, BasicDirective, node); - o->mode = Addressing_Constant; - String name = bd->name.string; - if (name == "file") { - o->type = t_untyped_string; - o->value = exact_value_string(get_file_path_string(bd->token.pos.file_id)); - } else if (name == "line") { - o->type = t_untyped_integer; - o->value = exact_value_i64(bd->token.pos.line); - } else if (name == "procedure") { - if (c->curr_proc_decl == nullptr) { - error(node, "#procedure may only be used within procedures"); - o->type = t_untyped_string; - o->value = exact_value_string(str_lit("")); - } else { - o->type = t_untyped_string; - o->value = exact_value_string(c->proc_name); - } - } else if (name == "caller_location") { - init_core_source_code_location(c->checker); - 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 == "location") { - init_core_source_code_location(c->checker); - error(node, "'#%.*s' must be used in a call expression", LIT(name)); - o->type = t_source_code_location; - o->mode = Addressing_Value; - } else if ( - name == "assert" || - name == "defined" || - name == "config" || - name == "load" || - name == "load_hash" || - name == "load_or" - ) { - error(node, "'#%.*s' must be used as a call", LIT(name)); - o->type = t_invalid; - o->mode = Addressing_Invalid; - } else { - error(node, "Unknown directive: #%.*s", LIT(name)); - o->type = t_invalid; - o->mode = Addressing_Invalid; - } - - } + kind = check_basic_directive_expr(c, o, node, type_hint); case_end; case_ast_node(pg, ProcGroup, node); @@ -7283,1165 +9037,23 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type case_end; case_ast_node(te, TernaryIfExpr, node); - Operand cond = {Addressing_Invalid}; - check_expr(c, &cond, te->cond); - node->viral_state_flags |= te->cond->viral_state_flags; - - if (cond.mode != Addressing_Invalid && !is_type_boolean(cond.type)) { - error(te->cond, "Non-boolean condition in ternary if expression"); - } - - Operand x = {Addressing_Invalid}; - Operand y = {Addressing_Invalid}; - check_expr_or_type(c, &x, te->x, type_hint); - node->viral_state_flags |= te->x->viral_state_flags; - - if (te->y != nullptr) { - check_expr_or_type(c, &y, te->y, type_hint); - node->viral_state_flags |= te->y->viral_state_flags; - } else { - error(node, "A ternary expression must have an else clause"); - return kind; - } - - if (x.type == nullptr || x.type == t_invalid || - y.type == nullptr || y.type == t_invalid) { - return kind; - } - - convert_to_typed(c, &x, y.type); - if (x.mode == Addressing_Invalid) { - return kind; - } - convert_to_typed(c, &y, x.type); - if (y.mode == Addressing_Invalid) { - x.mode = Addressing_Invalid; - return kind; - } - - if (!ternary_compare_types(x.type, y.type)) { - gbString its = type_to_string(x.type); - gbString ets = type_to_string(y.type); - error(node, "Mismatched types in ternary if expression, %s vs %s", its, ets); - gb_string_free(ets); - gb_string_free(its); - return kind; - } - - o->type = x.type; - if (is_type_untyped_nil(o->type) || is_type_untyped_undef(o->type)) { - o->type = y.type; - } - - o->mode = Addressing_Value; - o->expr = node; - if (type_hint != nullptr && is_type_untyped(o->type)) { - if (check_cast_internal(c, &x, type_hint) && - check_cast_internal(c, &y, type_hint)) { - convert_to_typed(c, o, type_hint); - update_untyped_expr_type(c, node, type_hint, !is_type_untyped(type_hint)); - } - } + kind = check_ternary_if_expr(c, o, node, type_hint); case_end; case_ast_node(te, TernaryWhenExpr, node); - Operand cond = {}; - check_expr(c, &cond, te->cond); - node->viral_state_flags |= te->cond->viral_state_flags; - - if (cond.mode != Addressing_Constant || !is_type_boolean(cond.type)) { - error(te->cond, "Expected a constant boolean condition in ternary when expression"); - return kind; - } - - if (cond.value.value_bool) { - check_expr_or_type(c, o, te->x, type_hint); - node->viral_state_flags |= te->x->viral_state_flags; - } else { - if (te->y != nullptr) { - check_expr_or_type(c, o, te->y, type_hint); - node->viral_state_flags |= te->y->viral_state_flags; - } else { - error(node, "A ternary when expression must have an else clause"); - return kind; - } - } + kind = check_ternary_when_expr(c, o, node, type_hint); case_end; case_ast_node(oe, OrElseExpr, node); - String name = oe->token.string; - Ast *arg = oe->x; - Ast *default_value = oe->y; - - Operand x = {}; - Operand y = {}; - check_multi_expr_with_type_hint(c, &x, arg, type_hint); - if (x.mode == Addressing_Invalid) { - o->mode = Addressing_Value; - o->type = t_invalid; - o->expr = node; - return Expr_Expr; - } - - check_multi_expr_with_type_hint(c, &y, default_value, x.type); - error_operand_no_value(&y); - if (y.mode == Addressing_Invalid) { - o->mode = Addressing_Value; - o->type = t_invalid; - o->expr = node; - return Expr_Expr; - } - - Type *left_type = nullptr; - Type *right_type = nullptr; - check_or_else_split_types(c, &x, name, &left_type, &right_type); - add_type_and_value(&c->checker->info, arg, x.mode, x.type, x.value); - - if (left_type != nullptr) { - check_assignment(c, &y, left_type, name); - } else { - check_or_else_expr_no_value_error(c, name, x, type_hint); - } - - if (left_type == nullptr) { - left_type = t_invalid; - } - o->mode = Addressing_Value; - o->type = left_type; - o->expr = node; - return Expr_Expr; + return check_or_else_expr(c, o, node, type_hint); case_end; case_ast_node(re, OrReturnExpr, node); - String name = re->token.string; - Operand x = {}; - check_multi_expr_with_type_hint(c, &x, re->expr, type_hint); - if (x.mode == Addressing_Invalid) { - o->mode = Addressing_Value; - o->type = t_invalid; - o->expr = node; - return Expr_Expr; - } - - Type *left_type = nullptr; - Type *right_type = nullptr; - check_or_return_split_types(c, &x, name, &left_type, &right_type); - add_type_and_value(&c->checker->info, re->expr, x.mode, x.type, x.value); - - if (right_type == nullptr) { - check_or_else_expr_no_value_error(c, name, x, type_hint); - } else { - Type *proc_type = base_type(c->curr_proc_sig); - GB_ASSERT(proc_type->kind == Type_Proc); - Type *result_type = proc_type->Proc.results; - if (result_type == nullptr) { - error(node, "'%.*s' requires the current procedure to have at least one return value", LIT(name)); - } else { - GB_ASSERT(result_type->kind == Type_Tuple); - - auto const &vars = result_type->Tuple.variables; - Type *end_type = vars[vars.count-1]->type; - - if (vars.count > 1) { - if (!proc_type->Proc.has_named_results) { - error(node, "'%.*s' within a procedure with more than 1 return value requires that the return values are named, allowing for early return", LIT(name)); - } - } - - Operand rhs = {}; - rhs.type = right_type; - rhs.mode = Addressing_Value; - - // TODO(bill): better error message - if (!check_is_assignable_to(c, &rhs, end_type)) { - gbString a = type_to_string(right_type); - gbString b = type_to_string(end_type); - gbString ret_type = type_to_string(result_type); - error(node, "Cannot assign end value of type '%s' to '%s' in '%.*s'", a, b, LIT(name)); - if (vars.count == 1) { - error_line("\tProcedure return value type: %s\n", ret_type); - } else { - error_line("\tProcedure return value types: (%s)\n", ret_type); - } - gb_string_free(ret_type); - gb_string_free(b); - gb_string_free(a); - } - } - } - - o->expr = node; - o->type = left_type; - if (left_type != nullptr) { - o->mode = Addressing_Value; - } else { - o->mode = Addressing_NoValue; - } - - if (c->curr_proc_sig == nullptr) { - error(node, "'%.*s' can only be used within a procedure", LIT(name)); - } - - if (c->in_defer) { - error(node, "'or_return' cannot be used within a defer statement"); - } - - return Expr_Expr; + return check_or_return_expr(c, o, node, type_hint); case_end; case_ast_node(cl, CompoundLit, node); - Type *type = type_hint; - if (type != nullptr && is_type_untyped(type)) { - type = nullptr; - } - bool is_to_be_determined_array_count = false; - bool is_constant = true; - if (cl->type != nullptr) { - type = nullptr; - - // [?]Type - if (cl->type->kind == Ast_ArrayType && cl->type->ArrayType.count != nullptr) { - Ast *count = cl->type->ArrayType.count; - if (count->kind == Ast_UnaryExpr && - count->UnaryExpr.op.kind == Token_Question) { - type = alloc_type_array(check_type(c, cl->type->ArrayType.elem), -1); - is_to_be_determined_array_count = true; - } - if (cl->elems.count > 0) { - if (cl->type->ArrayType.tag != nullptr) { - Ast *tag = cl->type->ArrayType.tag; - GB_ASSERT(tag->kind == Ast_BasicDirective); - String name = tag->BasicDirective.name.string; - if (name == "soa") { - error(node, "#soa arrays are not supported for compound literals"); - return kind; - } - } - } - } - if (cl->type->kind == Ast_DynamicArrayType && cl->type->DynamicArrayType.tag != nullptr) { - if (cl->elems.count > 0) { - Ast *tag = cl->type->DynamicArrayType.tag; - GB_ASSERT(tag->kind == Ast_BasicDirective); - String name = tag->BasicDirective.name.string; - if (name == "soa") { - error(node, "#soa arrays are not supported for compound literals"); - return kind; - } - } - } - - if (type == nullptr) { - type = check_type(c, cl->type); - } - } - - if (type == nullptr) { - error(node, "Missing type in compound literal"); - return kind; - } - - - Type *t = base_type(type); - if (is_type_polymorphic(t)) { - gbString str = type_to_string(type); - error(node, "Cannot use a polymorphic type for a compound literal, got '%s'", str); - o->expr = node; - o->type = type; - gb_string_free(str); - return kind; - } - - - switch (t->kind) { - case Type_Struct: { - if (cl->elems.count == 0) { - break; // NOTE(bill): No need to init - } - if (t->Struct.is_raw_union) { - if (cl->elems.count > 0) { - // NOTE: unions cannot be constant - is_constant = false; - - if (cl->elems[0]->kind != Ast_FieldValue) { - gbString type_str = type_to_string(type); - error(node, "%s ('struct #raw_union') compound literals are only allowed to contain 'field = value' elements", type_str); - gb_string_free(type_str); - } else { - if (cl->elems.count != 1) { - gbString type_str = type_to_string(type); - error(node, "%s ('struct #raw_union') compound literals are only allowed to contain up to 1 'field = value' element, got %td", type_str, cl->elems.count); - gb_string_free(type_str); - } else { - Ast *elem = cl->elems[0]; - ast_node(fv, FieldValue, elem); - if (fv->field->kind != Ast_Ident) { - gbString expr_str = expr_to_string(fv->field); - error(elem, "Invalid field name '%s' in structure literal", expr_str); - gb_string_free(expr_str); - break; - } - - String name = fv->field->Ident.token.string; - - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); - bool is_unknown = sel.entity == nullptr; - if (is_unknown) { - error(elem, "Unknown field '%.*s' in structure literal", LIT(name)); - break; - } - - if (sel.index.count > 1) { - error(elem, "Cannot assign to an anonymous field '%.*s' in a structure literal (at the moment)", LIT(name)); - break; - } - - Entity *field = t->Struct.fields[sel.index[0]]; - add_entity_use(c, fv->field, field); - - Operand o = {}; - check_expr_or_type(c, &o, fv->value, field->type); - - - check_assignment(c, &o, field->type, str_lit("structure literal")); - } - - } - } - break; - } - - - isize field_count = t->Struct.fields.count; - isize min_field_count = t->Struct.fields.count; - for (isize i = min_field_count-1; i >= 0; i--) { - Entity *e = t->Struct.fields[i]; - GB_ASSERT(e->kind == Entity_Variable); - if (e->Variable.param_value.kind != ParameterValue_Invalid) { - min_field_count--; - } else { - break; - } - } - - if (cl->elems[0]->kind == Ast_FieldValue) { - bool *fields_visited = gb_alloc_array(temporary_allocator(), bool, field_count); - - for_array(i, cl->elems) { - Ast *elem = cl->elems[i]; - if (elem->kind != Ast_FieldValue) { - error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); - continue; - } - ast_node(fv, FieldValue, elem); - if (fv->field->kind != Ast_Ident) { - gbString expr_str = expr_to_string(fv->field); - error(elem, "Invalid field name '%s' in structure literal", expr_str); - gb_string_free(expr_str); - continue; - } - String name = fv->field->Ident.token.string; - - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); - bool is_unknown = sel.entity == nullptr; - if (is_unknown) { - error(elem, "Unknown field '%.*s' in structure literal", LIT(name)); - continue; - } - - if (sel.index.count > 1) { - error(elem, "Cannot assign to an anonymous field '%.*s' in a structure literal (at the moment)", LIT(name)); - continue; - } - - Entity *field = t->Struct.fields[sel.index[0]]; - add_entity_use(c, fv->field, field); - - if (fields_visited[sel.index[0]]) { - error(elem, "Duplicate field '%.*s' in structure literal", LIT(name)); - continue; - } - - fields_visited[sel.index[0]] = true; - - Operand o = {}; - check_expr_or_type(c, &o, fv->value, field->type); - - if (is_type_any(field->type) || is_type_union(field->type) || is_type_raw_union(field->type) || is_type_typeid(field->type)) { - is_constant = false; - } - if (is_constant) { - is_constant = check_is_operand_compound_lit_constant(c, &o); - } - - check_assignment(c, &o, field->type, str_lit("structure literal")); - } - } else { - bool seen_field_value = false; - - for_array(index, cl->elems) { - Entity *field = nullptr; - Ast *elem = cl->elems[index]; - if (elem->kind == Ast_FieldValue) { - seen_field_value = true; - error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); - continue; - } else if (seen_field_value) { - error(elem, "Value elements cannot be used after a 'field = value'"); - continue; - } - if (index >= field_count) { - error(elem, "Too many values in structure literal, expected %td, got %td", field_count, cl->elems.count); - break; - } - - if (field == nullptr) { - field = t->Struct.fields[index]; - } - - Operand o = {}; - check_expr_or_type(c, &o, elem, field->type); - - if (is_type_any(field->type) || is_type_union(field->type) || is_type_raw_union(field->type) || is_type_typeid(field->type)) { - is_constant = false; - } - if (is_constant) { - is_constant = check_is_operand_compound_lit_constant(c, &o); - } - - check_assignment(c, &o, field->type, str_lit("structure literal")); - } - if (cl->elems.count < field_count) { - if (min_field_count < field_count) { - if (cl->elems.count < min_field_count) { - error(cl->close, "Too few values in structure literal, expected at least %td, got %td", min_field_count, cl->elems.count); - } - } else { - error(cl->close, "Too few values in structure literal, expected %td, got %td", field_count, cl->elems.count); - } - } - } - - break; - } - - case Type_Slice: - case Type_Array: - case Type_DynamicArray: - case Type_SimdVector: - case Type_Matrix: - { - Type *elem_type = nullptr; - String context_name = {}; - i64 max_type_count = -1; - if (t->kind == Type_Slice) { - elem_type = t->Slice.elem; - context_name = str_lit("slice literal"); - } else if (t->kind == Type_Array) { - elem_type = t->Array.elem; - context_name = str_lit("array literal"); - if (!is_to_be_determined_array_count) { - max_type_count = t->Array.count; - } - } else if (t->kind == Type_DynamicArray) { - elem_type = t->DynamicArray.elem; - context_name = str_lit("dynamic array literal"); - is_constant = false; - - if (!build_context.no_dynamic_literals) { - add_package_dependency(c, "runtime", "__dynamic_array_reserve"); - add_package_dependency(c, "runtime", "__dynamic_array_append"); - } - } else if (t->kind == Type_SimdVector) { - elem_type = t->SimdVector.elem; - context_name = str_lit("simd vector literal"); - max_type_count = t->SimdVector.count; - } else if (t->kind == Type_Matrix) { - elem_type = t->Matrix.elem; - context_name = str_lit("matrix literal"); - max_type_count = t->Matrix.row_count*t->Matrix.column_count; - } else { - GB_PANIC("unreachable"); - } - - - i64 max = 0; - - Type *bet = base_type(elem_type); - if (!elem_type_can_be_constant(bet)) { - is_constant = false; - } - - if (bet == t_invalid) { - break; - } - - if (cl->elems.count > 0 && cl->elems[0]->kind == Ast_FieldValue) { - if (is_type_simd_vector(t)) { - error(cl->elems[0], "'field = value' is not allowed for SIMD vector literals"); - } else { - RangeCache rc = range_cache_make(heap_allocator()); - defer (range_cache_destroy(&rc)); - - for_array(i, cl->elems) { - Ast *elem = cl->elems[i]; - if (elem->kind != Ast_FieldValue) { - error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); - continue; - } - ast_node(fv, FieldValue, elem); - - if (is_ast_range(fv->field)) { - Token op = fv->field->BinaryExpr.op; - - Operand x = {}; - Operand y = {}; - bool ok = check_range(c, fv->field, &x, &y, nullptr); - if (!ok) { - continue; - } - if (x.mode != Addressing_Constant || !is_type_integer(core_type(x.type))) { - error(x.expr, "Expected a constant integer as an array field"); - continue; - } - - if (y.mode != Addressing_Constant || !is_type_integer(core_type(y.type))) { - error(y.expr, "Expected a constant integer as an array field"); - continue; - } - - i64 lo = exact_value_to_i64(x.value); - i64 hi = exact_value_to_i64(y.value); - i64 max_index = hi; - if (op.kind == Token_RangeHalf) { // ..< (exclusive) - hi -= 1; - } else { // .. (inclusive) - max_index += 1; - } - - bool new_range = range_cache_add_range(&rc, lo, hi); - if (!new_range) { - error(elem, "Overlapping field range index %lld %.*s %lld for %.*s", lo, LIT(op.string), hi, LIT(context_name)); - continue; - } - - - if (max_type_count >= 0 && (lo < 0 || lo >= max_type_count)) { - error(elem, "Index %lld is out of bounds (0..<%lld) for %.*s", lo, max_type_count, LIT(context_name)); - continue; - } - if (max_type_count >= 0 && (hi < 0 || hi >= max_type_count)) { - error(elem, "Index %lld is out of bounds (0..<%lld) for %.*s", hi, max_type_count, LIT(context_name)); - continue; - } - - if (max < hi) { - max = max_index; - } - - Operand operand = {}; - check_expr_with_type_hint(c, &operand, fv->value, elem_type); - check_assignment(c, &operand, elem_type, context_name); - - is_constant = is_constant && operand.mode == Addressing_Constant; - } else { - Operand op_index = {}; - check_expr(c, &op_index, fv->field); - - if (op_index.mode != Addressing_Constant || !is_type_integer(core_type(op_index.type))) { - error(elem, "Expected a constant integer as an array field"); - continue; - } - // add_type_and_value(c->info, op_index.expr, op_index.mode, op_index.type, op_index.value); - - i64 index = exact_value_to_i64(op_index.value); - - if (max_type_count >= 0 && (index < 0 || index >= max_type_count)) { - error(elem, "Index %lld is out of bounds (0..<%lld) for %.*s", index, max_type_count, LIT(context_name)); - continue; - } - - bool new_index = range_cache_add_index(&rc, index); - if (!new_index) { - error(elem, "Duplicate field index %lld for %.*s", index, LIT(context_name)); - continue; - } - - if (max < index+1) { - max = index+1; - } - - Operand operand = {}; - check_expr_with_type_hint(c, &operand, fv->value, elem_type); - check_assignment(c, &operand, elem_type, context_name); - - is_constant = is_constant && operand.mode == Addressing_Constant; - } - } - - cl->max_count = max; - } - - } else { - isize index = 0; - for (; index < cl->elems.count; index++) { - Ast *e = cl->elems[index]; - if (e == nullptr) { - error(node, "Invalid literal element"); - continue; - } - - if (e->kind == Ast_FieldValue) { - error(e, "Mixture of 'field = value' and value elements in a literal is not allowed"); - continue; - } - - if (0 <= max_type_count && max_type_count <= index) { - error(e, "Index %lld is out of bounds (>= %lld) for %.*s", index, max_type_count, LIT(context_name)); - } - - Operand operand = {}; - check_expr_with_type_hint(c, &operand, e, elem_type); - check_assignment(c, &operand, elem_type, context_name); - - is_constant = is_constant && operand.mode == Addressing_Constant; - } - - if (max < index) { - max = index; - } - } - - - if (t->kind == Type_Array) { - if (is_to_be_determined_array_count) { - t->Array.count = max; - } else if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { - if (0 < max && max < t->Array.count) { - error(node, "Expected %lld values for this array literal, got %lld", cast(long long)t->Array.count, cast(long long)max); - } - } - } - - - if (t->kind == Type_SimdVector) { - if (!is_constant) { - error(node, "Expected all constant elements for a simd vector"); - } - } - - - if (t->kind == Type_DynamicArray) { - if (build_context.no_dynamic_literals && cl->elems.count) { - error(node, "Compound literals of dynamic types have been disabled"); - } - } - - if (t->kind == Type_Matrix) { - if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { - if (0 < max && max < max_type_count) { - error(node, "Expected %lld values for this matrix literal, got %lld", cast(long long)max_type_count, cast(long long)max); - } - } - } - - break; - } - - case Type_EnumeratedArray: - { - Type *elem_type = t->EnumeratedArray.elem; - Type *index_type = t->EnumeratedArray.index; - String context_name = str_lit("enumerated array literal"); - i64 max_type_count = t->EnumeratedArray.count; - - gbString index_type_str = type_to_string(index_type); - defer (gb_string_free(index_type_str)); - - i64 total_lo = exact_value_to_i64(*t->EnumeratedArray.min_value); - i64 total_hi = exact_value_to_i64(*t->EnumeratedArray.max_value); - - String total_lo_string = {}; - String total_hi_string = {}; - GB_ASSERT(is_type_enum(index_type)); - { - Type *bt = base_type(index_type); - GB_ASSERT(bt->kind == Type_Enum); - for_array(i, bt->Enum.fields) { - Entity *f = bt->Enum.fields[i]; - if (f->kind != Entity_Constant) { - continue; - } - if (total_lo_string.len == 0 && compare_exact_values(Token_CmpEq, f->Constant.value, *t->EnumeratedArray.min_value)) { - total_lo_string = f->token.string; - } - if (total_hi_string.len == 0 && compare_exact_values(Token_CmpEq, f->Constant.value, *t->EnumeratedArray.max_value)) { - total_hi_string = f->token.string; - } - if (total_lo_string.len != 0 && total_hi_string.len != 0) { - break; - } - } - } - - i64 max = 0; - - Type *bet = base_type(elem_type); - if (!elem_type_can_be_constant(bet)) { - is_constant = false; - } - - if (bet == t_invalid) { - break; - } - bool is_partial = cl->tag && (cl->tag->BasicDirective.name.string == "partial"); - - SeenMap seen = {}; // NOTE(bill): Multimap, Key: ExactValue - map_init(&seen, heap_allocator()); - defer (map_destroy(&seen)); - - if (cl->elems.count > 0 && cl->elems[0]->kind == Ast_FieldValue) { - RangeCache rc = range_cache_make(heap_allocator()); - defer (range_cache_destroy(&rc)); - - for_array(i, cl->elems) { - Ast *elem = cl->elems[i]; - if (elem->kind != Ast_FieldValue) { - error(elem, "Mixture of 'field = value' and value elements in a literal is not allowed"); - continue; - } - ast_node(fv, FieldValue, elem); - - if (is_ast_range(fv->field)) { - Token op = fv->field->BinaryExpr.op; - - Operand x = {}; - Operand y = {}; - bool ok = check_range(c, fv->field, &x, &y, nullptr, index_type); - if (!ok) { - continue; - } - if (x.mode != Addressing_Constant || !are_types_identical(x.type, index_type)) { - error(x.expr, "Expected a constant enum of type '%s' as an array field", index_type_str); - continue; - } - - if (y.mode != Addressing_Constant || !are_types_identical(x.type, index_type)) { - error(y.expr, "Expected a constant enum of type '%s' as an array field", index_type_str); - continue; - } - - i64 lo = exact_value_to_i64(x.value); - i64 hi = exact_value_to_i64(y.value); - i64 max_index = hi; - if (op.kind == Token_RangeHalf) { - hi -= 1; - } - - bool new_range = range_cache_add_range(&rc, lo, hi); - if (!new_range) { - gbString lo_str = expr_to_string(x.expr); - gbString hi_str = expr_to_string(y.expr); - error(elem, "Overlapping field range index %s %.*s %s for %.*s", lo_str, LIT(op.string), hi_str, LIT(context_name)); - gb_string_free(hi_str); - gb_string_free(lo_str); - continue; - } - - - // NOTE(bill): These are sanity checks for invalid enum values - if (max_type_count >= 0 && (lo < total_lo || lo > total_hi)) { - gbString lo_str = expr_to_string(x.expr); - error(elem, "Index %s is out of bounds (%.*s .. %.*s) for %.*s", lo_str, LIT(total_lo_string), LIT(total_hi_string), LIT(context_name)); - gb_string_free(lo_str); - continue; - } - if (max_type_count >= 0 && (hi < 0 || hi > total_hi)) { - gbString hi_str = expr_to_string(y.expr); - error(elem, "Index %s is out of bounds (%.*s .. %.*s) for %.*s", hi_str, LIT(total_lo_string), LIT(total_hi_string), LIT(context_name)); - gb_string_free(hi_str); - continue; - } - - if (max < hi) { - max = max_index; - } - - Operand operand = {}; - check_expr_with_type_hint(c, &operand, fv->value, elem_type); - check_assignment(c, &operand, elem_type, context_name); - - is_constant = is_constant && operand.mode == Addressing_Constant; - - TokenKind upper_op = Token_LtEq; - if (op.kind == Token_RangeHalf) { - upper_op = Token_Lt; - } - add_to_seen_map(c, &seen, upper_op, x, x, y); - } else { - Operand op_index = {}; - check_expr_with_type_hint(c, &op_index, fv->field, index_type); - - if (op_index.mode != Addressing_Constant || !are_types_identical(op_index.type, index_type)) { - error(op_index.expr, "Expected a constant enum of type '%s' as an array field", index_type_str); - continue; - } - - i64 index = exact_value_to_i64(op_index.value); - - if (max_type_count >= 0 && (index < total_lo || index > total_hi)) { - gbString idx_str = expr_to_string(op_index.expr); - error(elem, "Index %s is out of bounds (%.*s .. %.*s) for %.*s", idx_str, LIT(total_lo_string), LIT(total_hi_string), LIT(context_name)); - gb_string_free(idx_str); - continue; - } - - bool new_index = range_cache_add_index(&rc, index); - if (!new_index) { - gbString idx_str = expr_to_string(op_index.expr); - error(elem, "Duplicate field index %s for %.*s", idx_str, LIT(context_name)); - gb_string_free(idx_str); - continue; - } - - if (max < index+1) { - max = index+1; - } - - Operand operand = {}; - check_expr_with_type_hint(c, &operand, fv->value, elem_type); - check_assignment(c, &operand, elem_type, context_name); - - is_constant = is_constant && operand.mode == Addressing_Constant; - - add_to_seen_map(c, &seen, op_index); - } - } - - cl->max_count = max; - - } else { - isize index = 0; - for (; index < cl->elems.count; index++) { - Ast *e = cl->elems[index]; - if (e == nullptr) { - error(node, "Invalid literal element"); - continue; - } - - if (e->kind == Ast_FieldValue) { - error(e, "Mixture of 'field = value' and value elements in a literal is not allowed"); - continue; - } - - if (0 <= max_type_count && max_type_count <= index) { - error(e, "Index %lld is out of bounds (>= %lld) for %.*s", index, max_type_count, LIT(context_name)); - } - - Operand operand = {}; - check_expr_with_type_hint(c, &operand, e, elem_type); - check_assignment(c, &operand, elem_type, context_name); - - is_constant = is_constant && operand.mode == Addressing_Constant; - } - - if (max < index) { - max = index; - } - } - - bool was_error = false; - if (cl->elems.count > 0 && cl->elems[0]->kind != Ast_FieldValue) { - if (0 < max && max < t->EnumeratedArray.count) { - error(node, "Expected %lld values for this enumerated array literal, got %lld", cast(long long)t->EnumeratedArray.count, cast(long long)max); - was_error = true; - } else { - error(node, "Enumerated array literals must only have 'field = value' elements, bare elements are not allowed"); - was_error = true; - } - } - - // NOTE(bill): Check for missing cases when `#partial literal` is not present - if (cl->elems.count > 0 && !was_error && !is_partial) { - Type *et = base_type(index_type); - GB_ASSERT(et->kind == Type_Enum); - auto fields = et->Enum.fields; - - auto unhandled = array_make(temporary_allocator(), 0, fields.count); - - for_array(i, fields) { - Entity *f = fields[i]; - if (f->kind != Entity_Constant) { - continue; - } - ExactValue v = f->Constant.value; - auto found = map_get(&seen, hash_exact_value(v)); - if (!found) { - array_add(&unhandled, f); - } - } - - if (unhandled.count > 0) { - begin_error_block(); - defer (end_error_block()); - - if (unhandled.count == 1) { - error_no_newline(node, "Unhandled enumerated array case: %.*s", LIT(unhandled[0]->token.string)); - } else { - error(node, "Unhandled enumerated array cases:"); - for_array(i, unhandled) { - Entity *f = unhandled[i]; - error_line("\t%.*s\n", LIT(f->token.string)); - } - } - error_line("\n"); - - error_line("\tSuggestion: Was '#partial %s{...}' wanted?\n", type_to_string(type)); - } - } - - break; - } - - case Type_Basic: { - if (!is_type_any(t)) { - if (cl->elems.count != 0) { - error(node, "Illegal compound literal"); - } - break; - } - if (cl->elems.count == 0) { - break; // NOTE(bill): No need to init - } - { // Checker values - Type *field_types[2] = {t_rawptr, t_typeid}; - isize field_count = 2; - if (cl->elems[0]->kind == Ast_FieldValue) { - bool fields_visited[2] = {}; - - for_array(i, cl->elems) { - Ast *elem = cl->elems[i]; - if (elem->kind != Ast_FieldValue) { - error(elem, "Mixture of 'field = value' and value elements in a 'any' literal is not allowed"); - continue; - } - ast_node(fv, FieldValue, elem); - if (fv->field->kind != Ast_Ident) { - gbString expr_str = expr_to_string(fv->field); - error(elem, "Invalid field name '%s' in 'any' literal", expr_str); - gb_string_free(expr_str); - continue; - } - String name = fv->field->Ident.token.string; - - Selection sel = lookup_field(type, name, o->mode == Addressing_Type); - if (sel.entity == nullptr) { - error(elem, "Unknown field '%.*s' in 'any' literal", LIT(name)); - continue; - } - - isize index = sel.index[0]; - - if (fields_visited[index]) { - error(elem, "Duplicate field '%.*s' in 'any' literal", LIT(name)); - continue; - } - - fields_visited[index] = true; - check_expr(c, o, fv->value); - - // NOTE(bill): 'any' literals can never be constant - is_constant = false; - - check_assignment(c, o, field_types[index], str_lit("'any' literal")); - } - } else { - for_array(index, cl->elems) { - Ast *elem = cl->elems[index]; - if (elem->kind == Ast_FieldValue) { - error(elem, "Mixture of 'field = value' and value elements in a 'any' literal is not allowed"); - continue; - } - - - check_expr(c, o, elem); - if (index >= field_count) { - error(o->expr, "Too many values in 'any' literal, expected %td", field_count); - break; - } - - // NOTE(bill): 'any' literals can never be constant - is_constant = false; - - check_assignment(c, o, field_types[index], str_lit("'any' literal")); - } - if (cl->elems.count < field_count) { - error(cl->close, "Too few values in 'any' literal, expected %td, got %td", field_count, cl->elems.count); - } - } - } - - break; - } - - case Type_Map: { - if (cl->elems.count == 0) { - break; - } - is_constant = false; - { // Checker values - bool key_is_typeid = is_type_typeid(t->Map.key); - bool value_is_typeid = is_type_typeid(t->Map.value); - - for_array(i, cl->elems) { - Ast *elem = cl->elems[i]; - if (elem->kind != Ast_FieldValue) { - error(elem, "Only 'field = value' elements are allowed in a map literal"); - continue; - } - ast_node(fv, FieldValue, elem); - - if (key_is_typeid) { - check_expr_or_type(c, o, fv->field, t->Map.key); - } else { - check_expr_with_type_hint(c, o, fv->field, t->Map.key); - } - check_assignment(c, o, t->Map.key, str_lit("map literal")); - if (o->mode == Addressing_Invalid) { - continue; - } - - if (value_is_typeid) { - check_expr_or_type(c, o, fv->value, t->Map.value); - } else { - check_expr_with_type_hint(c, o, fv->value, t->Map.value); - } - check_assignment(c, o, t->Map.value, str_lit("map literal")); - } - } - - if (build_context.no_dynamic_literals && cl->elems.count) { - error(node, "Compound literals of dynamic types have been disabled"); - } else { - add_package_dependency(c, "runtime", "__dynamic_map_reserve"); - add_package_dependency(c, "runtime", "__dynamic_map_set"); - } - break; - } - - case Type_BitSet: { - if (cl->elems.count == 0) { - break; // NOTE(bill): No need to init - } - Type *et = base_type(t->BitSet.elem); - isize field_count = 0; - if (et->kind == Type_Enum) { - field_count = et->Enum.fields.count; - } - - if (cl->elems[0]->kind == Ast_FieldValue) { - error(cl->elems[0], "'field = value' in a bit_set a literal is not allowed"); - is_constant = false; - } else { - for_array(index, cl->elems) { - Ast *elem = cl->elems[index]; - if (elem->kind == Ast_FieldValue) { - error(elem, "'field = value' in a bit_set a literal is not allowed"); - continue; - } - - check_expr_with_type_hint(c, o, elem, et); - - if (is_constant) { - is_constant = o->mode == Addressing_Constant; - } - - check_assignment(c, o, t->BitSet.elem, str_lit("bit_set literal")); - if (o->mode == Addressing_Constant) { - i64 lower = t->BitSet.lower; - i64 upper = t->BitSet.upper; - i64 v = exact_value_to_i64(o->value); - if (lower <= v && v <= upper) { - // okay - } else { - error(elem, "Bit field value out of bounds, %lld not in the range %lld .. %lld", v, lower, upper); - continue; - } - } - } - } - break; - } - - default: { - if (cl->elems.count == 0) { - break; // NOTE(bill): No need to init - } - - gbString str = type_to_string(type); - error(node, "Invalid compound literal type '%s'", str); - gb_string_free(str); - return kind; - } - } - - if (is_constant) { - o->mode = Addressing_Constant; - - if (is_type_bit_set(type)) { - // NOTE(bill): Encode as an integer - - i64 lower = base_type(type)->BitSet.lower; - - u64 bits = 0; - for_array(index, cl->elems) { - Ast *elem = cl->elems[index]; - GB_ASSERT(elem->kind != Ast_FieldValue); - TypeAndValue tav = elem->tav; - ExactValue i = exact_value_to_integer(tav.value); - if (i.kind != ExactValue_Integer) { - continue; - } - i64 val = big_int_to_i64(&i.value_integer); - val -= lower; - u64 bit = u64(1ll<value = exact_value_u64(bits); - } else if (is_type_constant_type(type) && cl->elems.count == 0) { - ExactValue value = exact_value_compound(node); - Type *bt = core_type(type); - if (bt->kind == Type_Basic) { - if (bt->Basic.flags & BasicFlag_Boolean) { - value = exact_value_bool(false); - } else if (bt->Basic.flags & BasicFlag_Integer) { - value = exact_value_i64(0); - } else if (bt->Basic.flags & BasicFlag_Unsigned) { - value = exact_value_i64(0); - } else if (bt->Basic.flags & BasicFlag_Float) { - value = exact_value_float(0); - } else if (bt->Basic.flags & BasicFlag_Complex) { - value = exact_value_complex(0, 0); - } else if (bt->Basic.flags & BasicFlag_Quaternion) { - value = exact_value_quaternion(0, 0, 0, 0); - } else if (bt->Basic.flags & BasicFlag_Pointer) { - value = exact_value_pointer(0); - } else if (bt->Basic.flags & BasicFlag_String) { - String empty_string = {}; - value = exact_value_string(empty_string); - } else if (bt->Basic.flags & BasicFlag_Rune) { - value = exact_value_i64(0); - } - } - - o->value = value; - } else { - o->value = exact_value_compound(node); - } - } else { - o->mode = Addressing_Value; - } - o->type = type; + kind = check_compound_literal(c, o, node, type_hint); case_end; case_ast_node(pe, ParenExpr, node); @@ -8461,127 +9073,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type case_end; case_ast_node(ta, TypeAssertion, node); - check_expr(c, o, ta->expr); - node->viral_state_flags |= ta->expr->viral_state_flags; - - if (o->mode == Addressing_Invalid) { - o->expr = node; - return kind; - } - if (o->mode == Addressing_Constant) { - gbString expr_str = expr_to_string(o->expr); - error(o->expr, "A type assertion cannot be applied to a constant expression: '%s'", expr_str); - gb_string_free(expr_str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - if (is_type_untyped(o->type)) { - gbString expr_str = expr_to_string(o->expr); - error(o->expr, "A type assertion cannot be applied to an untyped expression: '%s'", expr_str); - gb_string_free(expr_str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - Type *src = type_deref(o->type); - Type *bsrc = base_type(src); - - - if (ta->type != nullptr && ta->type->kind == Ast_UnaryExpr && ta->type->UnaryExpr.op.kind == Token_Question) { - if (!is_type_union(src)) { - gbString str = type_to_string(o->type); - error(o->expr, "Type assertions with .? can only operate on unions, got %s", str); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - if (bsrc->Union.variants.count != 1 && type_hint != nullptr) { - bool allowed = false; - for_array(i, bsrc->Union.variants) { - Type *vt = bsrc->Union.variants[i]; - if (are_types_identical(vt, type_hint)) { - allowed = true; - add_type_info_type(c, vt); - break; - } - } - if (allowed) { - add_type_info_type(c, o->type); - o->type = type_hint; - o->mode = Addressing_OptionalOk; - return kind; - } - } - - if (bsrc->Union.variants.count != 1) { - error(o->expr, "Type assertions with .? can only operate on unions with 1 variant, got %lld", cast(long long)bsrc->Union.variants.count); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - add_type_info_type(c, o->type); - add_type_info_type(c, bsrc->Union.variants[0]); - - o->type = bsrc->Union.variants[0]; - o->mode = Addressing_OptionalOk; - } else { - Type *t = check_type(c, ta->type); - Type *dst = t; - - if (is_type_union(src)) { - bool ok = false; - for_array(i, bsrc->Union.variants) { - Type *vt = bsrc->Union.variants[i]; - if (are_types_identical(vt, dst)) { - ok = true; - break; - } - } - - if (!ok) { - gbString expr_str = expr_to_string(o->expr); - gbString dst_type_str = type_to_string(t); - defer (gb_string_free(expr_str)); - defer (gb_string_free(dst_type_str)); - if (bsrc->Union.variants.count == 0) { - error(o->expr, "Cannot type assert '%s' to '%s' as this is an empty union", expr_str, dst_type_str); - } else { - error(o->expr, "Cannot type assert '%s' to '%s' as it is not a variant of that union", expr_str, dst_type_str); - } - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - add_type_info_type(c, o->type); - add_type_info_type(c, t); - - o->type = t; - o->mode = Addressing_OptionalOk; - } else if (is_type_any(src)) { - o->type = t; - o->mode = Addressing_OptionalOk; - - add_type_info_type(c, o->type); - add_type_info_type(c, t); - } else { - gbString str = type_to_string(o->type); - error(o->expr, "Type assertions can only operate on unions and 'any', got %s", str); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - } - - add_package_dependency(c, "runtime", "type_assertion_check"); - add_package_dependency(c, "runtime", "type_assertion_check2"); + kind = check_type_assertion(c, o, node, type_hint); case_end; case_ast_node(tc, TypeCast, node); @@ -8669,443 +9161,19 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type case_end; case_ast_node(se, SelectorCallExpr, node); - // IMPORTANT NOTE(bill, 2020-05-22): This is a complete hack to get a shorthand which is extremely useful for vtables - // COM APIs is a great example of where this kind of thing is extremely useful - // General idea: - // - // x->y(123) == x.y(x, 123) - // - // How this has been implemented at the moment is quite hacky but it's done so to reduce need for huge backend changes - // Just regenerating a new AST aids things - // - // TODO(bill): Is this a good hack or not? - // - // NOTE(bill, 2020-05-22): I'm going to regret this decision, ain't I? - - - if (se->modified_call) { - // Prevent double evaluation - o->expr = node; - o->type = node->tav.type; - o->value = node->tav.value; - o->mode = node->tav.mode; - return Expr_Expr; - } - - bool allow_arrow_right_selector_expr; - allow_arrow_right_selector_expr = c->allow_arrow_right_selector_expr; - c->allow_arrow_right_selector_expr = true; - Operand x = {}; - ExprKind kind = check_expr_base(c, &x, se->expr, nullptr); - c->allow_arrow_right_selector_expr = allow_arrow_right_selector_expr; - - if (x.mode == Addressing_Invalid || x.type == t_invalid) { - o->mode = Addressing_Invalid; - o->type = t_invalid; - o->expr = node; - return kind; - } - if (!is_type_proc(x.type)) { - gbString type_str = type_to_string(x.type); - error(se->call, "Selector call expressions expect a procedure type for the call, got '%s'", type_str); - gb_string_free(type_str); - - o->mode = Addressing_Invalid; - o->type = t_invalid; - o->expr = node; - return Expr_Stmt; - } - - ast_node(ce, CallExpr, se->call); - - GB_ASSERT(x.expr->kind == Ast_SelectorExpr); - - Ast *first_arg = x.expr->SelectorExpr.expr; - GB_ASSERT(first_arg != nullptr); - - Type *pt = base_type(x.type); - GB_ASSERT(pt->kind == Type_Proc); - Type *first_type = nullptr; - String first_arg_name = {}; - if (pt->Proc.param_count > 0) { - Entity *f = pt->Proc.params->Tuple.variables[0]; - first_type = f->type; - first_arg_name = f->token.string; - } - if (first_arg_name.len == 0) { - first_arg_name = str_lit("_"); - } - - if (first_type == nullptr) { - error(se->call, "Selector call expressions expect a procedure type for the call with at least 1 parameter"); - o->mode = Addressing_Invalid; - o->type = t_invalid; - o->expr = node; - return Expr_Stmt; - } - - Operand y = {}; - y.mode = first_arg->tav.mode; - y.type = first_arg->tav.type; - y.value = first_arg->tav.value; - if (check_is_assignable_to(c, &y, first_type)) { - // Do nothing, it's valid - } else { - Operand z = y; - z.type = type_deref(y.type); - if (check_is_assignable_to(c, &z, first_type)) { - // NOTE(bill): AST GENERATION HACK! - Token op = {Token_Pointer}; - first_arg = ast_deref_expr(first_arg->file(), first_arg, op); - } else if (y.mode == Addressing_Variable) { - Operand w = y; - w.type = alloc_type_pointer(y.type); - if (check_is_assignable_to(c, &w, first_type)) { - // NOTE(bill): AST GENERATION HACK! - Token op = {Token_And}; - first_arg = ast_unary_expr(first_arg->file(), op, first_arg); - } - } - } - - if (ce->args.count > 0) { - bool fail = false; - bool first_is_field_value = (ce->args[0]->kind == Ast_FieldValue); - for_array(i, ce->args) { - Ast *arg = ce->args[i]; - bool mix = false; - if (first_is_field_value) { - mix = arg->kind != Ast_FieldValue; - } else { - mix = arg->kind == Ast_FieldValue; - } - if (mix) { - fail = true; - break; - } - } - if (!fail && first_is_field_value) { - Token op = {Token_Eq}; - AstFile *f = first_arg->file(); - first_arg = ast_field_value(f, ast_ident(f, make_token_ident(first_arg_name)), first_arg, op); - } - } - - - - auto modified_args = slice_make(heap_allocator(), ce->args.count+1); - modified_args[0] = first_arg; - slice_copy(&modified_args, ce->args, 1); - ce->args = modified_args; - se->modified_call = true; - - allow_arrow_right_selector_expr = c->allow_arrow_right_selector_expr; - c->allow_arrow_right_selector_expr = true; - check_expr_base(c, o, se->call, type_hint); - c->allow_arrow_right_selector_expr = allow_arrow_right_selector_expr; - - o->expr = node; - return Expr_Expr; + return check_selector_call_expr(c, o, node, type_hint); case_end; - case_ast_node(ise, ImplicitSelectorExpr, node); return check_implicit_selector_expr(c, o, node, type_hint); case_end; case_ast_node(ie, IndexExpr, node); - check_expr(c, o, ie->expr); - node->viral_state_flags |= ie->expr->viral_state_flags; - if (o->mode == Addressing_Invalid) { - o->expr = node; - return kind; - } - - Type *t = base_type(type_deref(o->type)); - bool is_ptr = is_type_pointer(o->type); - bool is_const = o->mode == Addressing_Constant; - - if (is_type_map(t)) { - Operand key = {}; - if (is_type_typeid(t->Map.key)) { - check_expr_or_type(c, &key, ie->index, t->Map.key); - } else { - check_expr_with_type_hint(c, &key, ie->index, t->Map.key); - } - check_assignment(c, &key, t->Map.key, str_lit("map index")); - if (key.mode == Addressing_Invalid) { - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - o->mode = Addressing_MapIndex; - o->type = t->Map.value; - o->expr = node; - - add_package_dependency(c, "runtime", "__dynamic_map_get"); - add_package_dependency(c, "runtime", "__dynamic_map_set"); - return Expr_Expr; - } - - i64 max_count = -1; - bool valid = check_set_index_data(o, t, is_ptr, &max_count, o->type); - - if (is_const) { - if (is_type_array(t)) { - // OKay - } else if (is_type_slice(t)) { - // Okay - } else if (is_type_enumerated_array(t)) { - // Okay - } else if (is_type_string(t)) { - // Okay - } else if (is_type_relative_slice(t)) { - // Okay - } else if (is_type_matrix(t)) { - // Okay - } else { - valid = false; - } - } - - if (!valid) { - gbString str = expr_to_string(o->expr); - gbString type_str = type_to_string(o->type); - defer (gb_string_free(str)); - defer (gb_string_free(type_str)); - if (is_const) { - error(o->expr, "Cannot index constant '%s' of type '%s'", str, type_str); - } else { - error(o->expr, "Cannot index '%s' of type '%s'", str, type_str); - } - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - if (ie->index == nullptr) { - gbString str = expr_to_string(o->expr); - error(o->expr, "Missing index for '%s'", str); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - Type *index_type_hint = nullptr; - if (is_type_enumerated_array(t)) { - Type *bt = base_type(t); - GB_ASSERT(bt->kind == Type_EnumeratedArray); - index_type_hint = bt->EnumeratedArray.index; - } - - i64 index = 0; - bool ok = check_index_value(c, t, false, ie->index, max_count, &index, index_type_hint); - if (is_const) { - if (index < 0) { - gbString str = expr_to_string(o->expr); - error(o->expr, "Cannot index a constant '%s'", str); - error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n"); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } else if (ok) { - ExactValue value = type_and_value_of_expr(ie->expr).value; - o->mode = Addressing_Constant; - bool success = false; - bool finish = false; - o->value = get_constant_field_single(c, value, cast(i32)index, &success, &finish); - if (!success) { - gbString str = expr_to_string(o->expr); - error(o->expr, "Cannot index a constant '%s' with index %lld", str, cast(long long)index); - error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n"); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - } - } - - if (type_hint != nullptr && is_type_matrix(t)) { - // TODO(bill): allow matrix columns to be assignable to other types which are the same internally - // if a type hint exists - } - + kind = check_index_expr(c, o, node, type_hint); case_end; case_ast_node(se, SliceExpr, node); - check_expr(c, o, se->expr); - node->viral_state_flags |= se->expr->viral_state_flags; - - if (o->mode == Addressing_Invalid) { - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - bool valid = false; - i64 max_count = -1; - Type *t = base_type(type_deref(o->type)); - switch (t->kind) { - case Type_Basic: - if (t->Basic.kind == Basic_string || t->Basic.kind == Basic_UntypedString) { - valid = true; - if (o->mode == Addressing_Constant) { - max_count = o->value.value_string.len; - } - o->type = type_deref(o->type); - } - break; - - case Type_Array: - valid = true; - max_count = t->Array.count; - if (o->mode != Addressing_Variable && !is_type_pointer(o->type)) { - gbString str = expr_to_string(node); - error(node, "Cannot slice array '%s', value is not addressable", str); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - o->type = alloc_type_slice(t->Array.elem); - break; - - case Type_MultiPointer: - valid = true; - o->type = type_deref(o->type); - break; - - case Type_Slice: - valid = true; - o->type = type_deref(o->type); - break; - - case Type_DynamicArray: - valid = true; - o->type = alloc_type_slice(t->DynamicArray.elem); - break; - - case Type_Struct: - if (is_type_soa_struct(t)) { - valid = true; - o->type = make_soa_struct_slice(c, nullptr, nullptr, t->Struct.soa_elem); - } - break; - - case Type_RelativeSlice: - valid = true; - o->type = t->RelativeSlice.slice_type; - if (o->mode != Addressing_Variable) { - gbString str = expr_to_string(node); - error(node, "Cannot relative slice '%s', value is not addressable", str); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - break; - } - - if (!valid) { - gbString str = expr_to_string(o->expr); - gbString type_str = type_to_string(o->type); - error(o->expr, "Cannot slice '%s' of type '%s'", str, type_str); - gb_string_free(type_str); - gb_string_free(str); - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } - - if (se->low == nullptr && se->high != nullptr) { - // It is okay to continue as it will assume the 1st index is zero - } - - i64 indices[2] = {}; - Ast *nodes[2] = {se->low, se->high}; - for (isize i = 0; i < gb_count_of(nodes); i++) { - i64 index = max_count; - if (nodes[i] != nullptr) { - i64 capacity = -1; - if (max_count >= 0) { - capacity = max_count; - } - i64 j = 0; - if (check_index_value(c, t, true, nodes[i], capacity, &j)) { - index = j; - } - - node->viral_state_flags |= nodes[i]->viral_state_flags; - } else if (i == 0) { - index = 0; - } - indices[i] = index; - } - - for (isize i = 0; i < gb_count_of(indices); i++) { - i64 a = indices[i]; - for (isize j = i+1; j < gb_count_of(indices); j++) { - i64 b = indices[j]; - if (a > b && b >= 0) { - error(se->close, "Invalid slice indices: [%td > %td]", a, b); - } - } - } - - if (max_count < 0) { - if (o->mode == Addressing_Constant) { - gbString s = expr_to_string(se->expr); - error(se->expr, "Cannot slice constant value '%s'", s); - gb_string_free(s); - } - } - - if (t->kind == Type_MultiPointer && se->high != nullptr) { - /* - x[:] -> [^]T - x[i:] -> [^]T - x[:n] -> []T - x[i:n] -> []T - */ - o->type = alloc_type_slice(t->MultiPointer.elem); - } - - o->mode = Addressing_Value; - - if (is_type_string(t) && max_count >= 0) { - bool all_constant = true; - for (isize i = 0; i < gb_count_of(nodes); i++) { - if (nodes[i] != nullptr) { - TypeAndValue tav = type_and_value_of_expr(nodes[i]); - if (tav.mode != Addressing_Constant) { - all_constant = false; - break; - } - } - } - if (!all_constant) { - gbString str = expr_to_string(o->expr); - error(o->expr, "Cannot slice '%s' with non-constant indices", str); - error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n"); - gb_string_free(str); - o->mode = Addressing_Value; // NOTE(bill): Keep subsequent values going without erring - o->expr = node; - return kind; - } - - String s = {}; - if (o->value.kind == ExactValue_String) { - s = o->value.value_string; - } - - o->mode = Addressing_Constant; - o->type = t; - o->value = exact_value_string(substring(s, cast(isize)indices[0], cast(isize)indices[1])); - } - + kind = check_slice_expr(c, o, node, type_hint); case_end; case_ast_node(mie, MatrixIndexExpr, node); @@ -9230,6 +9298,8 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type return kind; } + + ExprKind check_expr_base(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { ExprKind kind = check_expr_base_internal(c, o, node, type_hint); if (o->type != nullptr && core_type(o->type) == nullptr) { From 445ca705210999e106b6aeb265cfb2979cbd857c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 5 Feb 2022 16:11:48 +0000 Subject: [PATCH 092/117] Correct implicit union cast --- src/check_expr.cpp | 11 +++++++++++ src/llvm_backend_expr.cpp | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index fb58839bc..3f31ac810 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -508,6 +508,10 @@ bool check_cast_internal(CheckerContext *c, Operand *x, Type *type); #define MAXIMUM_TYPE_DISTANCE 10 i64 check_distance_between_types(CheckerContext *c, Operand *operand, Type *type) { + if (c == nullptr) { + GB_ASSERT(operand->mode == Addressing_Value); + GB_ASSERT(is_type_typed(operand->type)); + } if (operand->mode == Addressing_Invalid || type == t_invalid) { return -1; @@ -818,6 +822,13 @@ bool check_is_assignable_to(CheckerContext *c, Operand *operand, Type *type) { return check_is_assignable_to_with_score(c, operand, type, &score); } +bool internal_check_is_assignable_to(Type *src, Type *dst) { + Operand x = {}; + x.type = src; + x.mode = Addressing_Value; + return check_is_assignable_to(nullptr, &x, dst); +} + AstPackage *get_package_of_type(Type *type) { for (;;) { if (type == nullptr) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index ea031ee56..715b7df78 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1834,6 +1834,15 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { return lb_addr_load(p, parent); } } + if (dst->Union.variants.count == 1) { + Type *vt = dst->Union.variants[0]; + if (internal_check_is_assignable_to(src, vt)) { + value = lb_emit_conv(p, value, vt); + lbAddr parent = lb_add_local_generated(p, t, true); + lb_emit_store_union_variant(p, parent.addr, value, vt); + return lb_addr_load(p, parent); + } + } } // NOTE(bill): This has to be done before 'Pointer <-> Pointer' as it's From bccbdefde952f605bde620c8d9d0c7f9a5dfc3e0 Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Sat, 5 Feb 2022 18:00:59 +0100 Subject: [PATCH 093/117] Update interface to allow more modes of iteration It's now possible to iterate over: - all keys in the range min_value ..= max_value, with `iterate_all` - all set keys in the bit array, with `iterate_set` - all unset keys in the range min_value ..= max_value, with `iterate_unset` `Bit_Array` now stores the `max_value` provided during construction, and updates it when a key that was previously out of range is set. --- core/container/bit_array/bit_array.odin | 113 +++++++++++++++++++----- 1 file changed, 91 insertions(+), 22 deletions(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index bf2ae3a40..0a92e3dc4 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -17,12 +17,24 @@ NUM_BITS :: 64 Bit_Array :: struct { bits: [dynamic]u64, bias: int, + max_index: int, } Bit_Array_Iterator :: struct { array: ^Bit_Array, - current_word: uint, - current_bit: uint, + word_idx: int, + bit_idx: uint, +} + +/* + In: + - ba: ^Bit_Array - the array to iterate over + + Out: + - it: ^Bit_Array_Iterator - the iterator that holds iteration state +*/ +make_iterator :: proc (ba: ^Bit_Array) -> (it: Bit_Array_Iterator) { + return Bit_Array_Iterator { array = ba } } /* @@ -30,30 +42,85 @@ Bit_Array_Iterator :: struct { - it: ^Bit_Array_Iterator - the iterator struct that holds the state. Out: - - index: int - the next set bit of the Bit_Array referenced by `it`. - - ok: bool - `true` if the iterator returned a valid index, - `false` if there were no more bits set + - set: bool - the state of the bit at `index` + - index: int - the next bit of the Bit_Array referenced by `it`. + - ok: bool - `true` if the iterator returned a valid index, + `false` if there were no more bits */ -next :: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { - words := it.array.bits - // if the word is empty or we have already gone over all the bits in it, - // b.current_bit is greater than the index of any set bit in the word, - // meaning that word >> b.current_bit == 0. - for it.current_word < len(words) && (words[it.current_word] >> it.current_bit == 0) { - it.current_word += 1 - it.current_bit = 0 +iterate_all :: proc (it: ^Bit_Array_Iterator) -> (set: bool, index: int, ok: bool) { + index = it.word_idx * NUM_BITS + int(it.bit_idx) + it.array.bias + if index > it.array.max_index { return false, 0, false } + + word := it.array.bits[it.word_idx] if len(it.array.bits) > it.word_idx else 0 + set = (word >> it.bit_idx & 1) == 1 + + it.bit_idx += 1 + if it.bit_idx >= NUM_BITS { + it.bit_idx = 0 + it.word_idx += 1 } - if it.current_word >= len(words) { return 0, false } + return set, index, true +} - // since we exited the loop and didn't return, this word has some bits higher than - // or equal to `it.current_bit` set. - offset := intrinsics.count_trailing_zeros(words[it.current_word] >> it.current_bit) - // skip over the bit, if the resulting it.current_bit is over 63, - // it is handled by the initial for loop in the next iteration. - it.current_bit += uint(offset) - defer it.current_bit += 1 - return int(it.current_word * NUM_BITS + it.current_bit) + it.array.bias, true +/* + In: + - it: ^Bit_Array_Iterator - the iterator struct that holds the state. + + Out: + - index: int - the next set bit of the Bit_Array referenced by `it`. + - ok: bool - `true` if the iterator returned a valid index, + `false` if there were no more bits set +*/ +iterate_set :: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { + return iterate_internal_(it, true) +} + +/* + In: + - it: ^Bit_Array_Iterator - the iterator struct that holds the state. + + Out: + - index: int - the next unset bit of the Bit_Array referenced by `it`. + - ok: bool - `true` if the iterator returned a valid index, + `false` if there were no more unset bits +*/ +iterate_unset:: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { + return iterate_internal_(it, false) +} + +@(private="file") +iterate_internal_ :: proc (it: ^Bit_Array_Iterator, $ITERATE_SET_BITS: bool) -> (index: int, ok: bool) { + word := it.array.bits[it.word_idx] if len(it.array.bits) > it.word_idx else 0 + when ! ITERATE_SET_BITS { word = ~word } + + // if the word is empty or we have already gone over all the bits in it, + // b.bit_idx is greater than the index of any set bit in the word, + // meaning that word >> b.bit_idx == 0. + for it.word_idx < len(it.array.bits) && word >> it.bit_idx == 0 { + it.word_idx += 1 + it.bit_idx = 0 + word = it.array.bits[it.word_idx] if len(it.array.bits) > it.word_idx else 0 + when ! ITERATE_SET_BITS { word = ~word } + } + + // if we are iterating the set bits, reaching the end of the array means we have no more bits to check + when ITERATE_SET_BITS { + if it.word_idx >= len(it.array.bits) { + return 0, false + } + } + + // reaching here means that the word has some set bits + it.bit_idx += uint(intrinsics.count_trailing_zeros(word >> it.bit_idx)) + index = it.word_idx * NUM_BITS + int(it.bit_idx) + it.array.bias + + it.bit_idx += 1 + if it.bit_idx >= NUM_BITS { + it.bit_idx = 0 + it.word_idx += 1 + } + return index, index <= it.array.max_index } @@ -111,6 +178,7 @@ set :: proc(ba: ^Bit_Array, #any_int index: uint, allocator := context.allocator resize_if_needed(ba, leg_index) or_return + if idx > ba.max_index { ba.max_index = idx } ba.bits[leg_index] |= 1 << uint(bit_index) return true } @@ -128,6 +196,7 @@ create :: proc(max_index: int, min_index := 0, allocator := context.allocator) - res = Bit_Array{ bias = min_index, + max_index = max_index, } return res, resize_if_needed(&res, legs) } From b6ebfe4b2c1445f59ed35c20bf8d4ba8910b59de Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Sat, 5 Feb 2022 18:11:48 +0100 Subject: [PATCH 094/117] rename iterator procedures --- core/container/bit_array/bit_array.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 0a92e3dc4..5fbac69af 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -47,7 +47,7 @@ make_iterator :: proc (ba: ^Bit_Array) -> (it: Bit_Array_Iterator) { - ok: bool - `true` if the iterator returned a valid index, `false` if there were no more bits */ -iterate_all :: proc (it: ^Bit_Array_Iterator) -> (set: bool, index: int, ok: bool) { +iterate_by_all :: proc (it: ^Bit_Array_Iterator) -> (set: bool, index: int, ok: bool) { index = it.word_idx * NUM_BITS + int(it.bit_idx) + it.array.bias if index > it.array.max_index { return false, 0, false } @@ -72,7 +72,7 @@ iterate_all :: proc (it: ^Bit_Array_Iterator) -> (set: bool, index: int, ok: boo - ok: bool - `true` if the iterator returned a valid index, `false` if there were no more bits set */ -iterate_set :: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { +iterate_by_set :: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { return iterate_internal_(it, true) } @@ -85,7 +85,7 @@ iterate_set :: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { - ok: bool - `true` if the iterator returned a valid index, `false` if there were no more unset bits */ -iterate_unset:: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { +iterate_by_unset:: proc (it: ^Bit_Array_Iterator) -> (index: int, ok: bool) { return iterate_internal_(it, false) } From 697f8c7ee6ef3d0af4d8e44163e770ef1f2227c5 Mon Sep 17 00:00:00 2001 From: ap29600 <66381278+ap29600@users.noreply.github.com> Date: Sat, 5 Feb 2022 18:46:25 +0100 Subject: [PATCH 095/117] replace a branch with `max` in `core:container/bit_array.set` --- core/container/bit_array/bit_array.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 5fbac69af..5eebe1bcb 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -178,7 +178,7 @@ set :: proc(ba: ^Bit_Array, #any_int index: uint, allocator := context.allocator resize_if_needed(ba, leg_index) or_return - if idx > ba.max_index { ba.max_index = idx } + ba.max_index = max(idx, ba.max_index) ba.bits[leg_index] |= 1 << uint(bit_index) return true } From a571153458211ba34973811eae9057140634b509 Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 5 Feb 2022 20:45:32 +0100 Subject: [PATCH 096/117] Adds missing calls for os --- core/os/os_darwin.odin | 62 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index adb490e4f..948f68410 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -296,6 +296,9 @@ foreign libc { @(link_name="readdir_r$INODE64") _unix_readdir_r :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- @(link_name="fcntl") _unix_fcntl :: proc(fd: Handle, cmd: c.int, buf: ^byte) -> c.int --- + @(link_name="rename") _unix_rename :: proc(old: cstring, new: cstring) -> c.int --- + @(link_name="remove") _unix_remove :: proc(path: cstring) -> c.int --- + @(link_name="fchmod") _unix_fchmod :: proc(fildes: Handle, mode: u16) -> c.int --- @(link_name="malloc") _unix_malloc :: proc(size: int) -> rawptr --- @@ -412,6 +415,65 @@ is_path_separator :: proc(r: rune) -> bool { return r == '/' } +is_file_handle :: proc(fd: Handle) -> bool { + s, err := _fstat(fd) + if err != ERROR_NONE { + return false + } + return S_ISREG(cast(u32)s.mode) +} + +is_file_path :: proc(path: string, follow_links: bool = true) -> bool { + s: OS_Stat + err: Errno + if follow_links { + s, err = _stat(path) + } else { + s, err = _lstat(path) + } + if err != ERROR_NONE { + return false + } + return S_ISREG(cast(u32)s.mode) +} + + +is_dir_handle :: proc(fd: Handle) -> bool { + s, err := _fstat(fd) + if err != ERROR_NONE { + return false + } + return S_ISDIR(cast(u32)s.mode) +} + +is_dir_path :: proc(path: string, follow_links: bool = true) -> bool { + s: OS_Stat + err: Errno + if follow_links { + s, err = _stat(path) + } else { + s, err = _lstat(path) + } + if err != ERROR_NONE { + return false + } + return S_ISDIR(cast(u32)s.mode) +} + +is_file :: proc {is_file_path, is_file_handle} +is_dir :: proc {is_dir_path, is_dir_handle} + + +rename :: proc(old: string, new: string) -> bool { + old_cstr := strings.clone_to_cstring(old, context.temp_allocator) + new_cstr := strings.clone_to_cstring(new, context.temp_allocator) + return _unix_rename(old_cstr, new_cstr) != -1 +} + +remove :: proc(path: string) -> bool { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + return _unix_remove(path) != -1 +} @private _stat :: proc(path: string) -> (OS_Stat, Errno) { From de7e6121866e9fcbe5c9f7fda2a594fa243942b5 Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 5 Feb 2022 20:45:55 +0100 Subject: [PATCH 097/117] Ignores DS_Store files which MacOS uses for Indexing or some crap --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0d606498e..abbdccecd 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# For macOS +.DS_Store + # Build results [Dd]ebug/ [Dd]ebugPublic/ From 3edf638cc6c40e0c05e041359372200150ebc0f8 Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 5 Feb 2022 20:54:27 +0100 Subject: [PATCH 098/117] Fixed Typo --- core/os/os_darwin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 948f68410..48fcbc724 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -472,7 +472,7 @@ rename :: proc(old: string, new: string) -> bool { remove :: proc(path: string) -> bool { path_cstr := strings.clone_to_cstring(path, context.temp_allocator) - return _unix_remove(path) != -1 + return _unix_remove(path_cstr) != -1 } @private From a724573bb3338e3f096134cbf35325b2dedffb18 Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 5 Feb 2022 21:16:58 +0100 Subject: [PATCH 099/117] Fixes fopendir and readdir_r for arm64 or seemingly doing so --- core/os/os_darwin.odin | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 48fcbc724..e64542f84 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -290,10 +290,15 @@ foreign libc { @(link_name="fstat64") _unix_fstat :: proc(fd: Handle, stat: ^OS_Stat) -> c.int --- @(link_name="readlink") _unix_readlink :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t --- @(link_name="access") _unix_access :: proc(path: cstring, mask: int) -> int --- - @(link_name="fdopendir$INODE64") _unix_fdopendir :: proc(fd: Handle) -> Dir --- + + @(link_name="fdopendir$INODE64") _unix_fdopendir_amd64 :: proc(fd: Handle) -> Dir --- + @(link_name="readdir_r$INODE64") _unix_readdir_r_amd64 :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- + @(link_name="fdopendir") _unix_fdopendir_arm64 :: proc(fd: Handle) -> Dir --- + @(link_name="readdir_r") _unix_readdir_r_arm64 :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- + @(link_name="closedir") _unix_closedir :: proc(dirp: Dir) -> c.int --- @(link_name="rewinddir") _unix_rewinddir :: proc(dirp: Dir) --- - @(link_name="readdir_r$INODE64") _unix_readdir_r :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- + @(link_name="fcntl") _unix_fcntl :: proc(fd: Handle, cmd: c.int, buf: ^byte) -> c.int --- @(link_name="rename") _unix_rename :: proc(old: cstring, new: cstring) -> c.int --- @@ -315,6 +320,14 @@ foreign libc { @(link_name="exit") _unix_exit :: proc(status: c.int) -> ! --- } +when ODIN_ARCH != "arm64" { + _unix_fdopendir :: proc {_unix_fdopendir_amd64} + _unix_readdir_r :: proc {_unix_readdir_r_amd64} +} else { + _unix_fdopendir :: proc {_unix_fdopendir_arm64} + _unix_readdir_r :: proc {_unix_readdir_r_arm64} +} + foreign dl { @(link_name="dlopen") _unix_dlopen :: proc(filename: cstring, flags: int) -> rawptr --- @(link_name="dlsym") _unix_dlsym :: proc(handle: rawptr, symbol: cstring) -> rawptr --- From a3d99765cc1012c2bb3e4f7e953c8126a9c158d2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 5 Feb 2022 22:18:22 +0100 Subject: [PATCH 100/117] mem: Add `doc.odin` with `Tracking_Allocator` example. --- core/mem/doc.odin | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 core/mem/doc.odin diff --git a/core/mem/doc.odin b/core/mem/doc.odin new file mode 100644 index 000000000..2a5ee06d3 --- /dev/null +++ b/core/mem/doc.odin @@ -0,0 +1,34 @@ +/* +package mem implements various types of allocators. + + +An example of how to use the `Tracking_Allocator` to track subsequent allocations +in your program and report leaks and bad frees: + +```odin +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) + context.allocator = mem.tracking_allocator(&track) + + _main() + + for _, v in track.allocation_map { + fmt.printf("%v leaked %v bytes", v.location, v.size) + } + for bf in track.bad_free_array { + fmt.printf("%v allocation %p was freed badly", bf.location, bf.memory) + } +} +``` +*/ +package mem \ No newline at end of file From 8b1100bf2b2488c181f7f8112cf079c475f5f59c Mon Sep 17 00:00:00 2001 From: Platin21 Date: Sat, 5 Feb 2022 23:12:55 +0100 Subject: [PATCH 101/117] os.open does r/d as default which makes a call to open a dir invalid this should fix this problem --- core/path/filepath/walk.odin | 2 +- tools/odinfmt/main.odin | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/core/path/filepath/walk.odin b/core/path/filepath/walk.odin index 29d4fd5b1..dad63cc09 100644 --- a/core/path/filepath/walk.odin +++ b/core/path/filepath/walk.odin @@ -71,7 +71,7 @@ _walk :: proc(info: os.File_Info, walk_proc: Walk_Proc) -> (err: os.Errno, skip_ @(private) read_dir :: proc(dir_name: string, allocator := context.temp_allocator) -> ([]os.File_Info, os.Errno) { - f, err := os.open(dir_name) + f, err := os.open(dir_name, os.O_RDONLY) if err != 0 { return nil, err } diff --git a/tools/odinfmt/main.odin b/tools/odinfmt/main.odin index bc1b521ca..cebb20888 100644 --- a/tools/odinfmt/main.odin +++ b/tools/odinfmt/main.odin @@ -114,7 +114,6 @@ main :: proc() { filepath.walk(path, walk_files); for file in files { - fmt.println(file); backup_path := strings.concatenate({file, "_bk"}); defer delete(backup_path); From 19aec13a1060a521913abc6bd669080171d43594 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 6 Feb 2022 11:42:59 +0000 Subject: [PATCH 102/117] Support rank-2 arrays (matrix-like) for `transpose` --- src/check_builtin.cpp | 38 ++++++++++++++++++++++++++++++++++++-- src/llvm_backend_expr.cpp | 21 +++++++++++++++++++++ src/types.cpp | 19 +++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index a42741976..d3a3103b1 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -2183,9 +2183,43 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 } operand->mode = Addressing_Value; - if (is_type_array(t)) { + if (t->kind == Type_Array) { + i32 rank = type_math_rank(t); // Do nothing - operand->type = x.type; + operand->type = x.type; + if (rank > 2) { + gbString s = type_to_string(x.type); + error(call, "'%.*s' expects a matrix or array with a rank of 2, got %s of rank %d", LIT(builtin_name), s, rank); + gb_string_free(s); + return false; + } else if (rank == 2) { + Type *inner = base_type(t->Array.elem); + GB_ASSERT(inner->kind == Type_Array); + Type *elem = inner->Array.elem; + Type *array_inner = alloc_type_array(elem, t->Array.count); + Type *array_outer = alloc_type_array(array_inner, inner->Array.count); + operand->type = array_outer; + + i64 elements = t->Array.count*inner->Array.count; + i64 size = type_size_of(operand->type); + if (!is_type_valid_for_matrix_elems(elem)) { + gbString s = type_to_string(x.type); + error(call, "'%.*s' expects a matrix or array with a base element type of an integer, float, or complex number, got %s", LIT(builtin_name), s); + gb_string_free(s); + } else if (elements > MATRIX_ELEMENT_COUNT_MAX) { + gbString s = type_to_string(x.type); + error(call, "'%.*s' expects a matrix or array with a maximum of %d elements, got %s with %lld elements", LIT(builtin_name), MATRIX_ELEMENT_COUNT_MAX, s, elements); + gb_string_free(s); + } else if (elements > MATRIX_ELEMENT_COUNT_MAX) { + gbString s = type_to_string(x.type); + error(call, "'%.*s' expects a matrix or array with non-zero elements, got %s", LIT(builtin_name), MATRIX_ELEMENT_COUNT_MAX, s); + gb_string_free(s); + } else if (size > MATRIX_ELEMENT_MAX_SIZE) { + gbString s = type_to_string(x.type); + error(call, "Too large of a type for '%.*s', got %s of size %lld, maximum size %d", LIT(builtin_name), s, cast(long long)size, MATRIX_ELEMENT_MAX_SIZE); + gb_string_free(s); + } + } } else { GB_ASSERT(t->kind == Type_Matrix); operand->type = alloc_type_matrix(t->Matrix.elem, t->Matrix.column_count, t->Matrix.row_count); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 715b7df78..29a86d116 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -580,6 +580,27 @@ LLVMValueRef lb_matrix_to_trimmed_vector(lbProcedure *p, lbValue m) { lbValue lb_emit_matrix_tranpose(lbProcedure *p, lbValue m, Type *type) { if (is_type_array(m.type)) { + i32 rank = type_math_rank(m.type); + if (rank == 2) { + lbAddr addr = lb_add_local_generated(p, type, false); + lbValue dst = addr.addr; + lbValue src = m; + i32 n = cast(i32)get_array_type_count(m.type); + i32 m = cast(i32)get_array_type_count(type); + // m.type == [n][m]T + // type == [m][n]T + + for (i32 j = 0; j < m; j++) { + lbValue dst_col = lb_emit_struct_ep(p, dst, j); + for (i32 i = 0; i < n; i++) { + lbValue dst_row = lb_emit_struct_ep(p, dst_col, i); + lbValue src_col = lb_emit_struct_ev(p, src, i); + lbValue src_row = lb_emit_struct_ev(p, src_col, j); + lb_emit_store(p, dst_row, src_row); + } + } + return lb_addr_load(p, addr); + } // no-op m.type = type; return m; diff --git a/src/types.cpp b/src/types.cpp index e0d35a12c..9ee6ba359 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -363,6 +363,7 @@ enum TypeInfoFlag : u32 { enum : int { MATRIX_ELEMENT_COUNT_MIN = 1, MATRIX_ELEMENT_COUNT_MAX = 16, + MATRIX_ELEMENT_MAX_SIZE = MATRIX_ELEMENT_COUNT_MAX * (2 * 8), // complex128 }; @@ -1583,6 +1584,24 @@ Type *core_array_type(Type *t) { } } +i32 type_math_rank(Type *t) { + i32 rank = 0; + for (;;) { + t = base_type(t); + switch (t->kind) { + case Type_Array: + rank += 1; + t = t->Array.elem; + break; + case Type_Matrix: + rank += 2; + t = t->Matrix.elem; + break; + default: + return rank; + } + } +} Type *base_complex_elem_type(Type *t) { From 0c16f27814a344f0694b8d4ae580f82393a0d540 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 6 Feb 2022 11:50:27 +0000 Subject: [PATCH 103/117] Update parser for `#sparse` --- core/odin/parser/parser.odin | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 0ebabfd70..cc802e7d2 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2273,6 +2273,24 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { return original_type case "partial": + tag := ast.new(ast.Basic_Directive, tok.pos, end_pos(name)) + tag.tok = tok + tag.name = name.text + original_expr := parse_expr(p, lhs) + expr := ast.unparen_expr(original_expr) + switch t in &expr.derived { + case ast.Comp_Lit: + t.tag = tag + case ast.Array_Type: + t.tag = tag + error(p, tok.pos, "#%s has been replaced with #sparse for non-contiguous enumerated array types", name.text) + case: + error(p, tok.pos, "expected a compound literal after #%s", name.text) + + } + return original_expr + + case "sparse": tag := ast.new(ast.Basic_Directive, tok.pos, end_pos(name)) tag.tok = tok tag.name = name.text From cda9fd527199a6046b1a442ed634ac282df4d799 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 6 Feb 2022 11:59:12 +0000 Subject: [PATCH 104/117] Add `tag` to `ast.Comp_Lit` --- core/odin/ast/ast.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 9db57541b..8eb0def44 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -151,6 +151,7 @@ Comp_Lit :: struct { open: tokenizer.Pos, elems: []^Expr, close: tokenizer.Pos, + tag: ^Expr, } From 9cbf46e6898a6d60e8e8580aad93773c193ba22f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 7 Feb 2022 11:00:38 +0000 Subject: [PATCH 105/117] Fix constant multi pointer declarations through integers --- src/llvm_backend_const.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 5862a7add..8f17a1cfb 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -115,8 +115,8 @@ LLVMValueRef llvm_const_cast(LLVMValueRef val, LLVMTypeRef dst) { lbValue lb_const_ptr_cast(lbModule *m, lbValue value, Type *t) { - GB_ASSERT(is_type_pointer(value.type)); - GB_ASSERT(is_type_pointer(t)); + GB_ASSERT(is_type_internally_pointer_like(value.type)); + GB_ASSERT(is_type_internally_pointer_like(t)); GB_ASSERT(lb_is_const(value)); lbValue res = {}; @@ -175,7 +175,7 @@ LLVMValueRef llvm_const_array(LLVMTypeRef elem_type, LLVMValueRef *values, isize } LLVMValueRef llvm_const_slice(lbModule *m, lbValue data, lbValue len) { - GB_ASSERT(is_type_pointer(data.type)); + GB_ASSERT(is_type_pointer(data.type) || is_type_multi_pointer(data.type)); GB_ASSERT(are_types_identical(len.type, t_int)); LLVMValueRef vals[2] = { data.value, @@ -568,7 +568,7 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc } case ExactValue_Integer: - if (is_type_pointer(type)) { + if (is_type_pointer(type) || is_type_multi_pointer(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); From 3c2ed3bb69df24ba162e5f2ea8f61ee3f7fd8e2f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 7 Feb 2022 11:37:13 +0000 Subject: [PATCH 106/117] Correct `//+private file` bug --- src/checker.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index b62ef7c4c..7fb4fdb29 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3477,11 +3477,11 @@ void check_collect_value_decl(CheckerContext *c, Ast *decl) { if (entity_visibility_kind == EntityVisiblity_Public && (c->scope->flags&ScopeFlag_File) && c->scope->file) { - if (c->scope->file->flags & AstFile_IsPrivatePkg) { - entity_visibility_kind = EntityVisiblity_PrivateToPackage; - } else if (c->scope->file->flags & AstFile_IsPrivateFile) { + if (c->scope->file->flags & AstFile_IsPrivateFile) { entity_visibility_kind = EntityVisiblity_PrivateToFile; - } + } else if (c->scope->file->flags & AstFile_IsPrivatePkg) { + entity_visibility_kind = EntityVisiblity_PrivateToPackage; + } } if (entity_visibility_kind != EntityVisiblity_Public && !(c->scope->flags&ScopeFlag_File)) { From 817bc7434dfd0ebfeb1310c22741b9d66af67ac2 Mon Sep 17 00:00:00 2001 From: NoahR02 Date: Tue, 8 Feb 2022 06:16:10 -0500 Subject: [PATCH 107/117] Ports OpenSimplex2 from https://github.com/KdotJPG/OpenSimplex2 to Odin. Adds tests for the noise procedures. --- core/math/noise/internal.odin | 734 ++++++++++++++++++ core/math/noise/opensimplex2.odin | 171 ++++ tests/core/Makefile | 7 +- tests/core/build.bat | 7 +- .../core/math/noise/test_core_math_noise.odin | 153 ++++ 5 files changed, 1069 insertions(+), 3 deletions(-) create mode 100644 core/math/noise/internal.odin create mode 100644 core/math/noise/opensimplex2.odin create mode 100644 tests/core/math/noise/test_core_math_noise.odin diff --git a/core/math/noise/internal.odin b/core/math/noise/internal.odin new file mode 100644 index 000000000..5837f9235 --- /dev/null +++ b/core/math/noise/internal.odin @@ -0,0 +1,734 @@ +/* + OpenSimplex2 noise implementation. + + Ported from https://github.com/KdotJPG/OpenSimplex2. + Copyright 2022 Yuki2 (https://github.com/NoahR02) +*/ +//+private +package math_noise + +/* + Private implementation details follow. +*/ + +PRIME_X :: i64(0x5205402B9270C86F) +PRIME_Y :: i64(0x598CD327003817B5) +PRIME_Z :: i64(0x5BCC226E9FA0BACB) +PRIME_W :: i64(0x56CC5227E58F554B) + +HASH_MULTIPLIER :: i64(0x53A3F72DEEC546F5) +SEED_FLIP_3D :: i64(-0x52D547B2E96ED629) +SEED_OFFSET_4D :: i64(0xE83DC3E0DA7164D) + +ROOT_2_OVER_2 :: f64(0.7071067811865476) +SKEW_2D :: f64(0.366025403784439) +UNSKEW_2D :: f64(-0.21132486540518713) +ROOT_3_OVER_3 :: f64(0.577350269189626) + +FALLBACK_ROTATE_3D :: f64(2.0) / f64(3.0) +ROTATE_3D_ORTHOGONALIZER :: f64(UNSKEW_2D) + +SKEW_4D :: f32(0hbe0d8369) +UNSKEW_4D :: f32(0.309016994374947) +LATTICE_STEP_4D :: f32(0.2) + +N_GRADS_2D_EXPONENT :: 7 +N_GRADS_3D_EXPONENT :: 8 +N_GRADS_4D_EXPONENT :: 9 +N_GRADS_2D :: 1 << N_GRADS_2D_EXPONENT +N_GRADS_3D :: 1 << N_GRADS_3D_EXPONENT +N_GRADS_4D :: 1 << N_GRADS_4D_EXPONENT + +NORMALIZER_2D :: f64(0.01001634121365712) +NORMALIZER_3D :: f64(0.07969837668935331) +NORMALIZER_4D :: f64(0.0220065933241897) +RSQUARED_2D :: f32(0.5) +RSQUARED_3D :: f32(0.6) +RSQUARED_4D :: f32(0.6) + +GRADIENTS_2D := [N_GRADS_2D * 2]f32{ + 0h4218d2da, 0h42b87975, 0h42b87975, 0h4218d2da, 0h42b87975, 0hc218d2da, 0h4218d2da, 0hc2b87975, + 0hc218d2da, 0hc2b87975, 0hc2b87975, 0hc218d2da, 0hc2b87975, 0h4218d2da, 0hc218d2da, 0h42b87975, + 0h4150804d, 0h42c5f72a, 0h42731b78, 0h429e696c, 0h429e696c, 0h42731b78, 0h42c5f72a, 0h4150804d, + 0h42c5f72a, 0hc150804d, 0h429e696c, 0hc2731b78, 0h42731b78, 0hc29e696c, 0h4150804d, 0hc2c5f72a, + 0hc150804d, 0hc2c5f72a, 0hc2731b78, 0hc29e696c, 0hc29e696c, 0hc2731b78, 0hc2c5f72a, 0hc150804d, + 0hc2c5f72a, 0h4150804d, 0hc29e696c, 0h42731b78, 0hc2731b78, 0h429e696c, 0hc150804d, 0h42c5f72a, + 0h4218d2da, 0h42b87975, 0h42b87975, 0h4218d2da, 0h42b87975, 0hc218d2da, 0h4218d2da, 0hc2b87975, + 0hc218d2da, 0hc2b87975, 0hc2b87975, 0hc218d2da, 0hc2b87975, 0h4218d2da, 0hc218d2da, 0h42b87975, + 0h4150804d, 0h42c5f72a, 0h42731b78, 0h429e696c, 0h429e696c, 0h42731b78, 0h42c5f72a, 0h4150804d, + 0h42c5f72a, 0hc150804d, 0h429e696c, 0hc2731b78, 0h42731b78, 0hc29e696c, 0h4150804d, 0hc2c5f72a, + 0hc150804d, 0hc2c5f72a, 0hc2731b78, 0hc29e696c, 0hc29e696c, 0hc2731b78, 0hc2c5f72a, 0hc150804d, + 0hc2c5f72a, 0h4150804d, 0hc29e696c, 0h42731b78, 0hc2731b78, 0h429e696c, 0hc150804d, 0h42c5f72a, + 0h4218d2da, 0h42b87975, 0h42b87975, 0h4218d2da, 0h42b87975, 0hc218d2da, 0h4218d2da, 0hc2b87975, + 0hc218d2da, 0hc2b87975, 0hc2b87975, 0hc218d2da, 0hc2b87975, 0h4218d2da, 0hc218d2da, 0h42b87975, + 0h4150804d, 0h42c5f72a, 0h42731b78, 0h429e696c, 0h429e696c, 0h42731b78, 0h42c5f72a, 0h4150804d, + 0h42c5f72a, 0hc150804d, 0h429e696c, 0hc2731b78, 0h42731b78, 0hc29e696c, 0h4150804d, 0hc2c5f72a, + 0hc150804d, 0hc2c5f72a, 0hc2731b78, 0hc29e696c, 0hc29e696c, 0hc2731b78, 0hc2c5f72a, 0hc150804d, + 0hc2c5f72a, 0h4150804d, 0hc29e696c, 0h42731b78, 0hc2731b78, 0h429e696c, 0hc150804d, 0h42c5f72a, + 0h4218d2da, 0h42b87975, 0h42b87975, 0h4218d2da, 0h42b87975, 0hc218d2da, 0h4218d2da, 0hc2b87975, + 0hc218d2da, 0hc2b87975, 0hc2b87975, 0hc218d2da, 0hc2b87975, 0h4218d2da, 0hc218d2da, 0h42b87975, + 0h4150804d, 0h42c5f72a, 0h42731b78, 0h429e696c, 0h429e696c, 0h42731b78, 0h42c5f72a, 0h4150804d, + 0h42c5f72a, 0hc150804d, 0h429e696c, 0hc2731b78, 0h42731b78, 0hc29e696c, 0h4150804d, 0hc2c5f72a, + 0hc150804d, 0hc2c5f72a, 0hc2731b78, 0hc29e696c, 0hc29e696c, 0hc2731b78, 0hc2c5f72a, 0hc150804d, + 0hc2c5f72a, 0h4150804d, 0hc29e696c, 0h42731b78, 0hc2731b78, 0h429e696c, 0hc150804d, 0h42c5f72a, + 0h4218d2da, 0h42b87975, 0h42b87975, 0h4218d2da, 0h42b87975, 0hc218d2da, 0h4218d2da, 0hc2b87975, + 0hc218d2da, 0hc2b87975, 0hc2b87975, 0hc218d2da, 0hc2b87975, 0h4218d2da, 0hc218d2da, 0h42b87975, + 0h4150804d, 0h42c5f72a, 0h42731b78, 0h429e696c, 0h429e696c, 0h42731b78, 0h42c5f72a, 0h4150804d, + 0h42c5f72a, 0hc150804d, 0h429e696c, 0hc2731b78, 0h42731b78, 0hc29e696c, 0h4150804d, 0hc2c5f72a, + 0hc150804d, 0hc2c5f72a, 0hc2731b78, 0hc29e696c, 0hc29e696c, 0hc2731b78, 0hc2c5f72a, 0hc150804d, + 0hc2c5f72a, 0h4150804d, 0hc29e696c, 0h42731b78, 0hc2731b78, 0h429e696c, 0hc150804d, 0h42c5f72a, + 0h4218d2da, 0h42b87975, 0h42b87975, 0h4218d2da, 0h42b87975, 0hc218d2da, 0h4218d2da, 0hc2b87975, + 0hc218d2da, 0hc2b87975, 0hc2b87975, 0hc218d2da, 0hc2b87975, 0h4218d2da, 0hc218d2da, 0h42b87975, +} + +GRADIENTS_3D := [N_GRADS_3D * 4]f32{ + 0h41df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, + 0h00000000, 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, + 0hc1df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0hc16b5146, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc16b5146, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0hc21ae5b8, 0h00000000, 0h416b5146, 0h00000000, 0hc16b5146, 0h00000000, 0h421ae5b8, 0h00000000, + 0hc148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, + 0hc148c1c5, 0h41df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0h41df5103, 0h00000000, + 0h00000000, 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, + 0h41df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, 0h00000000, + 0h41df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0h421ae5b8, 0h00000000, 0hc16b5146, 0h00000000, 0h416b5146, 0h00000000, 0hc21ae5b8, 0h00000000, + 0h41df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0h416b5146, 0h00000000, 0h421ae5b8, 0h00000000, 0h421ae5b8, 0h00000000, 0h416b5146, 0h00000000, + 0h41df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, + 0h00000000, 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, + 0hc1df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0hc16b5146, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc16b5146, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0hc21ae5b8, 0h00000000, 0h416b5146, 0h00000000, 0hc16b5146, 0h00000000, 0h421ae5b8, 0h00000000, + 0hc148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, + 0hc148c1c5, 0h41df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0h41df5103, 0h00000000, + 0h00000000, 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, + 0h41df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, 0h00000000, + 0h41df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0h421ae5b8, 0h00000000, 0hc16b5146, 0h00000000, 0h416b5146, 0h00000000, 0hc21ae5b8, 0h00000000, + 0h41df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0h416b5146, 0h00000000, 0h421ae5b8, 0h00000000, 0h421ae5b8, 0h00000000, 0h416b5146, 0h00000000, + 0h41df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, + 0h00000000, 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, + 0hc1df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0hc16b5146, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc16b5146, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0hc21ae5b8, 0h00000000, 0h416b5146, 0h00000000, 0hc16b5146, 0h00000000, 0h421ae5b8, 0h00000000, + 0hc148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, + 0hc148c1c5, 0h41df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0h41df5103, 0h00000000, + 0h00000000, 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, + 0h41df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, 0h00000000, + 0h41df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0h421ae5b8, 0h00000000, 0hc16b5146, 0h00000000, 0h416b5146, 0h00000000, 0hc21ae5b8, 0h00000000, + 0h41df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0h416b5146, 0h00000000, 0h421ae5b8, 0h00000000, 0h421ae5b8, 0h00000000, 0h416b5146, 0h00000000, + 0h41df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, + 0h00000000, 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, + 0hc1df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0hc16b5146, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc16b5146, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0hc21ae5b8, 0h00000000, 0h416b5146, 0h00000000, 0hc16b5146, 0h00000000, 0h421ae5b8, 0h00000000, + 0hc148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, + 0hc148c1c5, 0h41df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0h41df5103, 0h00000000, + 0h00000000, 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, + 0h41df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, 0h00000000, + 0h41df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0h421ae5b8, 0h00000000, 0hc16b5146, 0h00000000, 0h416b5146, 0h00000000, 0hc21ae5b8, 0h00000000, + 0h41df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0h416b5146, 0h00000000, 0h421ae5b8, 0h00000000, 0h421ae5b8, 0h00000000, 0h416b5146, 0h00000000, + 0h41df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, + 0h00000000, 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, + 0hc1df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0hc16b5146, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc21ae5b8, 0h00000000, 0hc16b5146, 0h00000000, + 0hc1df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0hc1df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0hc21ae5b8, 0h00000000, 0h416b5146, 0h00000000, 0hc16b5146, 0h00000000, 0h421ae5b8, 0h00000000, + 0hc148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, + 0hc148c1c5, 0h41df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0h41df5103, 0h41df5103, 0h00000000, + 0h00000000, 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, + 0h41df5103, 0hc1df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0hc1df5103, 0h4148c1c5, 0h00000000, + 0h416b5146, 0hc21ae5b8, 0h00000000, 0h00000000, 0h421ae5b8, 0hc16b5146, 0h00000000, 0h00000000, + 0h41df5103, 0hc148c1c5, 0hc1df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0hc1df5103, 0h00000000, + 0h421ae5b8, 0h00000000, 0hc16b5146, 0h00000000, 0h416b5146, 0h00000000, 0hc21ae5b8, 0h00000000, + 0h41df5103, 0hc148c1c5, 0h41df5103, 0h00000000, 0h41df5103, 0h4148c1c5, 0h41df5103, 0h00000000, + 0h416b5146, 0h00000000, 0h421ae5b8, 0h00000000, 0h421ae5b8, 0h00000000, 0h416b5146, 0h00000000, + 0h41df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0h41df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0h421ae5b8, 0h416b5146, 0h00000000, 0h00000000, 0h416b5146, 0h421ae5b8, 0h00000000, 0h00000000, + 0hc1df5103, 0h41df5103, 0hc148c1c5, 0h00000000, 0hc1df5103, 0h41df5103, 0h4148c1c5, 0h00000000, + 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0hc1df5103, 0h00000000, + 0h00000000, 0hc21ae5b8, 0hc16b5146, 0h00000000, 0h00000000, 0hc16b5146, 0hc21ae5b8, 0h00000000, + 0hc148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, 0h4148c1c5, 0hc1df5103, 0h41df5103, 0h00000000, + 0h00000000, 0hc16b5146, 0h421ae5b8, 0h00000000, 0h00000000, 0hc21ae5b8, 0h416b5146, 0h00000000, +} + +GRADIENTS_4D := [N_GRADS_4D * 4]f32{ + 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc208695c, 0hc19194b0, 0h40de6d7d, 0h41b6d966, + 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc22076c5, 0h406d72bf, 0h406d72bf, 0h41a58418, + 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, 0h4208695c, + 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1d2a716, 0h416b8e00, 0h416b8e00, 0h41f50507, + 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h40de6d7d, + 0hc208695c, 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc22076c5, 0h406d72bf, 0h41a58418, 0h406d72bf, + 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h419194b0, + 0hc1b6d966, 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1d2a716, 0h416b8e00, 0h41f50507, 0h416b8e00, + 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h40de6d7d, + 0hc208695c, 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc22076c5, 0h41a58418, 0h406d72bf, 0h406d72bf, + 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h419194b0, + 0hc1b6d966, 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1d2a716, 0h41f50507, 0h416b8e00, 0h416b8e00, + 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h40de6d7d, + 0h41b6d966, 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41a58418, 0hc22076c5, 0h406d72bf, 0h406d72bf, + 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, + 0h4208695c, 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h41f50507, 0hc1d2a716, 0h416b8e00, 0h416b8e00, + 0hc208ee18, 0hc18a0670, 0hc18a0670, 0hc18a0670, 0hc20e2b7a, 0hc19d18ee, 0hc19d18ee, 0h40b05c85, + 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0hc19d18ee, + 0hc21c1252, 0hc1b8e69d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0h40024b8d, + 0hc21c1252, 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc235739c, 0hbfc4b564, 0hbfc4b564, 0hbfc4b564, + 0hc18a0670, 0hc208ee18, 0hc18a0670, 0hc18a0670, 0hc19d18ee, 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, + 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, 0hc19d18ee, 0hc19d18ee, + 0hc1b8e69d, 0hc21c1252, 0h40024b8d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0hc1b8e69d, 0h40024b8d, + 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0hbfc4b564, 0hc235739c, 0hbfc4b564, 0hbfc4b564, + 0hc18a0670, 0hc18a0670, 0hc208ee18, 0hc18a0670, 0hc19d18ee, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, + 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0hc19d18ee, + 0hc1b8e69d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc21c1252, 0h40024b8d, + 0h40024b8d, 0h40024b8d, 0hc21c1252, 0hc1b8e69d, 0hbfc4b564, 0hbfc4b564, 0hc235739c, 0hbfc4b564, + 0hc18a0670, 0hc18a0670, 0hc18a0670, 0hc208ee18, 0hc19d18ee, 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, + 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0hc19d18ee, 0hc20e2b7a, + 0hc1b8e69d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0h40024b8d, 0hc21c1252, + 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc21c1252, 0hbfc4b564, 0hbfc4b564, 0hbfc4b564, 0hc235739c, + 0hc16b8e00, 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc19194b0, 0hc208695c, 0h40de6d7d, 0h41b6d966, + 0h40de6d7d, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h406d72bf, 0hc22076c5, 0h406d72bf, 0h41a58418, + 0hc06d72bf, 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc0de6d7d, 0hc1b6d966, 0h419194b0, 0h4208695c, + 0h419194b0, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h416b8e00, 0hc1d2a716, 0h416b8e00, 0h41f50507, + 0hc16b8e00, 0hc16b8e00, 0hc1f50507, 0h41d2a716, 0hc19194b0, 0h40de6d7d, 0hc208695c, 0h41b6d966, + 0h40de6d7d, 0hc19194b0, 0hc208695c, 0h41b6d966, 0h406d72bf, 0h406d72bf, 0hc22076c5, 0h41a58418, + 0hc06d72bf, 0hc06d72bf, 0hc1a58418, 0h422076c5, 0hc0de6d7d, 0h419194b0, 0hc1b6d966, 0h4208695c, + 0h419194b0, 0hc0de6d7d, 0hc1b6d966, 0h4208695c, 0h416b8e00, 0h416b8e00, 0hc1d2a716, 0h41f50507, + 0hc16b8e00, 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc19194b0, 0hc208695c, 0h41b6d966, 0h40de6d7d, + 0h40de6d7d, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h406d72bf, 0hc22076c5, 0h41a58418, 0h406d72bf, + 0hc06d72bf, 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc0de6d7d, 0hc1b6d966, 0h4208695c, 0h419194b0, + 0h419194b0, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h416b8e00, 0hc1d2a716, 0h41f50507, 0h416b8e00, + 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc1f50507, 0hc19194b0, 0h40de6d7d, 0h41b6d966, 0hc208695c, + 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc208695c, 0h406d72bf, 0h406d72bf, 0h41a58418, 0hc22076c5, + 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1a58418, 0hc0de6d7d, 0h419194b0, 0h4208695c, 0hc1b6d966, + 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1b6d966, 0h416b8e00, 0h416b8e00, 0h41f50507, 0hc1d2a716, + 0hc16b8e00, 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc19194b0, 0h41b6d966, 0hc208695c, 0h40de6d7d, + 0h40de6d7d, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h406d72bf, 0h41a58418, 0hc22076c5, 0h406d72bf, + 0hc06d72bf, 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc0de6d7d, 0h4208695c, 0hc1b6d966, 0h419194b0, + 0h419194b0, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h416b8e00, 0h41f50507, 0hc1d2a716, 0h416b8e00, + 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc1f50507, 0hc19194b0, 0h41b6d966, 0h40de6d7d, 0hc208695c, + 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc208695c, 0h406d72bf, 0h41a58418, 0h406d72bf, 0hc22076c5, + 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1a58418, 0hc0de6d7d, 0h4208695c, 0h419194b0, 0hc1b6d966, + 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1b6d966, 0h416b8e00, 0h41f50507, 0h416b8e00, 0hc1d2a716, + 0h41d2a716, 0hc16b8e00, 0hc1f50507, 0hc16b8e00, 0h41b6d966, 0hc19194b0, 0hc208695c, 0h40de6d7d, + 0h41b6d966, 0h40de6d7d, 0hc208695c, 0hc19194b0, 0h41a58418, 0h406d72bf, 0hc22076c5, 0h406d72bf, + 0h422076c5, 0hc06d72bf, 0hc1a58418, 0hc06d72bf, 0h4208695c, 0hc0de6d7d, 0hc1b6d966, 0h419194b0, + 0h4208695c, 0h419194b0, 0hc1b6d966, 0hc0de6d7d, 0h41f50507, 0h416b8e00, 0hc1d2a716, 0h416b8e00, + 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc1f50507, 0h41b6d966, 0hc19194b0, 0h40de6d7d, 0hc208695c, + 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc208695c, 0h41a58418, 0h406d72bf, 0h406d72bf, 0hc22076c5, + 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1a58418, 0h4208695c, 0hc0de6d7d, 0h419194b0, 0hc1b6d966, + 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1b6d966, 0h41f50507, 0h416b8e00, 0h416b8e00, 0hc1d2a716, + 0h3fc4b564, 0h3fc4b564, 0h3fc4b564, 0h4235739c, 0hc0024b8d, 0hc0024b8d, 0h41b8e69d, 0h421c1252, + 0hc0024b8d, 0h41b8e69d, 0hc0024b8d, 0h421c1252, 0hc0b05c85, 0h419d18ee, 0h419d18ee, 0h420e2b7a, + 0h41b8e69d, 0hc0024b8d, 0hc0024b8d, 0h421c1252, 0h419d18ee, 0hc0b05c85, 0h419d18ee, 0h420e2b7a, + 0h419d18ee, 0h419d18ee, 0hc0b05c85, 0h420e2b7a, 0h418a0670, 0h418a0670, 0h418a0670, 0h4208ee18, + 0h3fc4b564, 0h3fc4b564, 0h4235739c, 0h3fc4b564, 0hc0024b8d, 0h40024b8d, 0h421c1252, 0h41b8e69d, + 0hc0024b8d, 0h41b8e69d, 0h421c1252, 0hc0024b8d, 0hc0b05c85, 0h419d18ee, 0h420e2b7a, 0h419d18ee, + 0h41b8e69d, 0hc0024b8d, 0h421c1252, 0hc0024b8d, 0h419d18ee, 0hc0b05c85, 0h420e2b7a, 0h419d18ee, + 0h419d18ee, 0h419d18ee, 0h420e2b7a, 0hc0b05c85, 0h418a0670, 0h418a0670, 0h4208ee18, 0h418a0670, + 0h3fc4b564, 0h4235739c, 0h3fc4b564, 0h3fc4b564, 0hc0024b8d, 0h421c1252, 0hc0024b8d, 0h41b8e69d, + 0hc0024b8d, 0h421c1252, 0h41b8e69d, 0hc0024b8d, 0hc0b05c85, 0h420e2b7a, 0h419d18ee, 0h419d18ee, + 0h41b8e69d, 0h421c1252, 0hc0024b8d, 0hc0024b8d, 0h419d18ee, 0h420e2b7a, 0hc0b05c85, 0h419d18ee, + 0h419d18ee, 0h420e2b7a, 0h419d18ee, 0hc0b05c85, 0h418a0670, 0h4208ee18, 0h418a0670, 0h418a0670, + 0h4235739c, 0h3fc4b564, 0h3fc4b564, 0h3fc4b564, 0h421c1252, 0hc0024b8d, 0hc0024b8d, 0h41b8e69d, + 0h421c1252, 0hc0024b8d, 0h41b8e69d, 0hc0024b8d, 0h420e2b7a, 0hc0b05c85, 0h419d18ee, 0h419d18ee, + 0h421c1252, 0h41b8e69d, 0hc0024b8d, 0hc0024b8d, 0h420e2b7a, 0h419d18ee, 0hc0b05c85, 0h419d18ee, + 0h420e2b7a, 0h419d18ee, 0h419d18ee, 0hc0b05c85, 0h4208ee18, 0h418a0670, 0h418a0670, 0h418a0670, + 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc208695c, 0hc19194b0, 0h40de6d7d, 0h41b6d966, + 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc22076c5, 0h406d72bf, 0h406d72bf, 0h41a58418, + 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, 0h4208695c, + 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1d2a716, 0h416b8e00, 0h416b8e00, 0h41f50507, + 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h40de6d7d, + 0hc208695c, 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc22076c5, 0h406d72bf, 0h41a58418, 0h406d72bf, + 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h419194b0, + 0hc1b6d966, 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1d2a716, 0h416b8e00, 0h41f50507, 0h416b8e00, + 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h40de6d7d, + 0hc208695c, 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc22076c5, 0h41a58418, 0h406d72bf, 0h406d72bf, + 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h419194b0, + 0hc1b6d966, 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1d2a716, 0h41f50507, 0h416b8e00, 0h416b8e00, + 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h40de6d7d, + 0h41b6d966, 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41a58418, 0hc22076c5, 0h406d72bf, 0h406d72bf, + 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, + 0h4208695c, 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h41f50507, 0hc1d2a716, 0h416b8e00, 0h416b8e00, + 0hc208ee18, 0hc18a0670, 0hc18a0670, 0hc18a0670, 0hc20e2b7a, 0hc19d18ee, 0hc19d18ee, 0h40b05c85, + 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0hc19d18ee, + 0hc21c1252, 0hc1b8e69d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0h40024b8d, + 0hc21c1252, 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc235739c, 0hbfc4b564, 0hbfc4b564, 0hbfc4b564, + 0hc18a0670, 0hc208ee18, 0hc18a0670, 0hc18a0670, 0hc19d18ee, 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, + 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, 0hc19d18ee, 0hc19d18ee, + 0hc1b8e69d, 0hc21c1252, 0h40024b8d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0hc1b8e69d, 0h40024b8d, + 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0hbfc4b564, 0hc235739c, 0hbfc4b564, 0hbfc4b564, + 0hc18a0670, 0hc18a0670, 0hc208ee18, 0hc18a0670, 0hc19d18ee, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, + 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0hc19d18ee, + 0hc1b8e69d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc21c1252, 0h40024b8d, + 0h40024b8d, 0h40024b8d, 0hc21c1252, 0hc1b8e69d, 0hbfc4b564, 0hbfc4b564, 0hc235739c, 0hbfc4b564, + 0hc18a0670, 0hc18a0670, 0hc18a0670, 0hc208ee18, 0hc19d18ee, 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, + 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0hc19d18ee, 0hc20e2b7a, + 0hc1b8e69d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0h40024b8d, 0hc21c1252, + 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc21c1252, 0hbfc4b564, 0hbfc4b564, 0hbfc4b564, 0hc235739c, + 0hc16b8e00, 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc19194b0, 0hc208695c, 0h40de6d7d, 0h41b6d966, + 0h40de6d7d, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h406d72bf, 0hc22076c5, 0h406d72bf, 0h41a58418, + 0hc06d72bf, 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc0de6d7d, 0hc1b6d966, 0h419194b0, 0h4208695c, + 0h419194b0, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h416b8e00, 0hc1d2a716, 0h416b8e00, 0h41f50507, + 0hc16b8e00, 0hc16b8e00, 0hc1f50507, 0h41d2a716, 0hc19194b0, 0h40de6d7d, 0hc208695c, 0h41b6d966, + 0h40de6d7d, 0hc19194b0, 0hc208695c, 0h41b6d966, 0h406d72bf, 0h406d72bf, 0hc22076c5, 0h41a58418, + 0hc06d72bf, 0hc06d72bf, 0hc1a58418, 0h422076c5, 0hc0de6d7d, 0h419194b0, 0hc1b6d966, 0h4208695c, + 0h419194b0, 0hc0de6d7d, 0hc1b6d966, 0h4208695c, 0h416b8e00, 0h416b8e00, 0hc1d2a716, 0h41f50507, + 0hc16b8e00, 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc19194b0, 0hc208695c, 0h41b6d966, 0h40de6d7d, + 0h40de6d7d, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h406d72bf, 0hc22076c5, 0h41a58418, 0h406d72bf, + 0hc06d72bf, 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc0de6d7d, 0hc1b6d966, 0h4208695c, 0h419194b0, + 0h419194b0, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h416b8e00, 0hc1d2a716, 0h41f50507, 0h416b8e00, + 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc1f50507, 0hc19194b0, 0h40de6d7d, 0h41b6d966, 0hc208695c, + 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc208695c, 0h406d72bf, 0h406d72bf, 0h41a58418, 0hc22076c5, + 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1a58418, 0hc0de6d7d, 0h419194b0, 0h4208695c, 0hc1b6d966, + 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1b6d966, 0h416b8e00, 0h416b8e00, 0h41f50507, 0hc1d2a716, + 0hc16b8e00, 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc19194b0, 0h41b6d966, 0hc208695c, 0h40de6d7d, + 0h40de6d7d, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h406d72bf, 0h41a58418, 0hc22076c5, 0h406d72bf, + 0hc06d72bf, 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc0de6d7d, 0h4208695c, 0hc1b6d966, 0h419194b0, + 0h419194b0, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h416b8e00, 0h41f50507, 0hc1d2a716, 0h416b8e00, + 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc1f50507, 0hc19194b0, 0h41b6d966, 0h40de6d7d, 0hc208695c, + 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc208695c, 0h406d72bf, 0h41a58418, 0h406d72bf, 0hc22076c5, + 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1a58418, 0hc0de6d7d, 0h4208695c, 0h419194b0, 0hc1b6d966, + 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1b6d966, 0h416b8e00, 0h41f50507, 0h416b8e00, 0hc1d2a716, + 0h41d2a716, 0hc16b8e00, 0hc1f50507, 0hc16b8e00, 0h41b6d966, 0hc19194b0, 0hc208695c, 0h40de6d7d, + 0h41b6d966, 0h40de6d7d, 0hc208695c, 0hc19194b0, 0h41a58418, 0h406d72bf, 0hc22076c5, 0h406d72bf, + 0h422076c5, 0hc06d72bf, 0hc1a58418, 0hc06d72bf, 0h4208695c, 0hc0de6d7d, 0hc1b6d966, 0h419194b0, + 0h4208695c, 0h419194b0, 0hc1b6d966, 0hc0de6d7d, 0h41f50507, 0h416b8e00, 0hc1d2a716, 0h416b8e00, + 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc1f50507, 0h41b6d966, 0hc19194b0, 0h40de6d7d, 0hc208695c, + 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc208695c, 0h41a58418, 0h406d72bf, 0h406d72bf, 0hc22076c5, + 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1a58418, 0h4208695c, 0hc0de6d7d, 0h419194b0, 0hc1b6d966, + 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1b6d966, 0h41f50507, 0h416b8e00, 0h416b8e00, 0hc1d2a716, + 0h3fc4b564, 0h3fc4b564, 0h3fc4b564, 0h4235739c, 0hc0024b8d, 0hc0024b8d, 0h41b8e69d, 0h421c1252, + 0hc0024b8d, 0h41b8e69d, 0hc0024b8d, 0h421c1252, 0hc0b05c85, 0h419d18ee, 0h419d18ee, 0h420e2b7a, + 0h41b8e69d, 0hc0024b8d, 0hc0024b8d, 0h421c1252, 0h419d18ee, 0hc0b05c85, 0h419d18ee, 0h420e2b7a, + 0h419d18ee, 0h419d18ee, 0hc0b05c85, 0h420e2b7a, 0h418a0670, 0h418a0670, 0h418a0670, 0h4208ee18, + 0h3fc4b564, 0h3fc4b564, 0h4235739c, 0h3fc4b564, 0hc0024b8d, 0h40024b8d, 0h421c1252, 0h41b8e69d, + 0hc0024b8d, 0h41b8e69d, 0h421c1252, 0hc0024b8d, 0hc0b05c85, 0h419d18ee, 0h420e2b7a, 0h419d18ee, + 0h41b8e69d, 0hc0024b8d, 0h421c1252, 0hc0024b8d, 0h419d18ee, 0hc0b05c85, 0h420e2b7a, 0h419d18ee, + 0h419d18ee, 0h419d18ee, 0h420e2b7a, 0hc0b05c85, 0h418a0670, 0h418a0670, 0h4208ee18, 0h418a0670, + 0h3fc4b564, 0h4235739c, 0h3fc4b564, 0h3fc4b564, 0hc0024b8d, 0h421c1252, 0hc0024b8d, 0h41b8e69d, + 0hc0024b8d, 0h421c1252, 0h41b8e69d, 0hc0024b8d, 0hc0b05c85, 0h420e2b7a, 0h419d18ee, 0h419d18ee, + 0h41b8e69d, 0h421c1252, 0hc0024b8d, 0hc0024b8d, 0h419d18ee, 0h420e2b7a, 0hc0b05c85, 0h419d18ee, + 0h419d18ee, 0h420e2b7a, 0h419d18ee, 0hc0b05c85, 0h418a0670, 0h4208ee18, 0h418a0670, 0h418a0670, + 0h4235739c, 0h3fc4b564, 0h3fc4b564, 0h3fc4b564, 0h421c1252, 0hc0024b8d, 0hc0024b8d, 0h41b8e69d, + 0h421c1252, 0hc0024b8d, 0h41b8e69d, 0hc0024b8d, 0h420e2b7a, 0hc0b05c85, 0h419d18ee, 0h419d18ee, + 0h421c1252, 0h41b8e69d, 0hc0024b8d, 0hc0024b8d, 0h420e2b7a, 0h419d18ee, 0hc0b05c85, 0h419d18ee, + 0h420e2b7a, 0h419d18ee, 0h419d18ee, 0hc0b05c85, 0h4208ee18, 0h418a0670, 0h418a0670, 0h418a0670, + 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc208695c, 0hc19194b0, 0h40de6d7d, 0h41b6d966, + 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc22076c5, 0h406d72bf, 0h406d72bf, 0h41a58418, + 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, 0h4208695c, + 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1d2a716, 0h416b8e00, 0h416b8e00, 0h41f50507, + 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h40de6d7d, + 0hc208695c, 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc22076c5, 0h406d72bf, 0h41a58418, 0h406d72bf, + 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h419194b0, + 0hc1b6d966, 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1d2a716, 0h416b8e00, 0h41f50507, 0h416b8e00, + 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h40de6d7d, + 0hc208695c, 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc22076c5, 0h41a58418, 0h406d72bf, 0h406d72bf, + 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h419194b0, + 0hc1b6d966, 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1d2a716, 0h41f50507, 0h416b8e00, 0h416b8e00, + 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h40de6d7d, + 0h41b6d966, 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41a58418, 0hc22076c5, 0h406d72bf, 0h406d72bf, + 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, + 0h4208695c, 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h41f50507, 0hc1d2a716, 0h416b8e00, 0h416b8e00, + 0hc208ee18, 0hc18a0670, 0hc18a0670, 0hc18a0670, 0hc20e2b7a, 0hc19d18ee, 0hc19d18ee, 0h40b05c85, + 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0hc19d18ee, + 0hc21c1252, 0hc1b8e69d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0h40024b8d, + 0hc21c1252, 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc235739c, 0hbfc4b564, 0hbfc4b564, 0hbfc4b564, + 0hc18a0670, 0hc208ee18, 0hc18a0670, 0hc18a0670, 0hc19d18ee, 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, + 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, 0hc19d18ee, 0hc19d18ee, + 0hc1b8e69d, 0hc21c1252, 0h40024b8d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0hc1b8e69d, 0h40024b8d, + 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0hbfc4b564, 0hc235739c, 0hbfc4b564, 0hbfc4b564, + 0hc18a0670, 0hc18a0670, 0hc208ee18, 0hc18a0670, 0hc19d18ee, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, + 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0hc19d18ee, + 0hc1b8e69d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc21c1252, 0h40024b8d, + 0h40024b8d, 0h40024b8d, 0hc21c1252, 0hc1b8e69d, 0hbfc4b564, 0hbfc4b564, 0hc235739c, 0hbfc4b564, + 0hc18a0670, 0hc18a0670, 0hc18a0670, 0hc208ee18, 0hc19d18ee, 0hc19d18ee, 0h40b05c85, 0hc20e2b7a, + 0hc19d18ee, 0h40b05c85, 0hc19d18ee, 0hc20e2b7a, 0h40b05c85, 0hc19d18ee, 0hc19d18ee, 0hc20e2b7a, + 0hc1b8e69d, 0h40024b8d, 0h40024b8d, 0hc21c1252, 0h40024b8d, 0hc1b8e69d, 0h40024b8d, 0hc21c1252, + 0h40024b8d, 0h40024b8d, 0hc1b8e69d, 0hc21c1252, 0hbfc4b564, 0hbfc4b564, 0hbfc4b564, 0hc235739c, + 0hc16b8e00, 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc19194b0, 0hc208695c, 0h40de6d7d, 0h41b6d966, + 0h40de6d7d, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h406d72bf, 0hc22076c5, 0h406d72bf, 0h41a58418, + 0hc06d72bf, 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc0de6d7d, 0hc1b6d966, 0h419194b0, 0h4208695c, + 0h419194b0, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h416b8e00, 0hc1d2a716, 0h416b8e00, 0h41f50507, + 0hc16b8e00, 0hc16b8e00, 0hc1f50507, 0h41d2a716, 0hc19194b0, 0h40de6d7d, 0hc208695c, 0h41b6d966, + 0h40de6d7d, 0hc19194b0, 0hc208695c, 0h41b6d966, 0h406d72bf, 0h406d72bf, 0hc22076c5, 0h41a58418, + 0hc06d72bf, 0hc06d72bf, 0hc1a58418, 0h422076c5, 0hc0de6d7d, 0h419194b0, 0hc1b6d966, 0h4208695c, + 0h419194b0, 0hc0de6d7d, 0hc1b6d966, 0h4208695c, 0h416b8e00, 0h416b8e00, 0hc1d2a716, 0h41f50507, + 0hc16b8e00, 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc19194b0, 0hc208695c, 0h41b6d966, 0h40de6d7d, + 0h40de6d7d, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h406d72bf, 0hc22076c5, 0h41a58418, 0h406d72bf, + 0hc06d72bf, 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc0de6d7d, 0hc1b6d966, 0h4208695c, 0h419194b0, + 0h419194b0, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h416b8e00, 0hc1d2a716, 0h41f50507, 0h416b8e00, + 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc1f50507, 0hc19194b0, 0h40de6d7d, 0h41b6d966, 0hc208695c, + 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc208695c, 0h406d72bf, 0h406d72bf, 0h41a58418, 0hc22076c5, + 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1a58418, 0hc0de6d7d, 0h419194b0, 0h4208695c, 0hc1b6d966, + 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1b6d966, 0h416b8e00, 0h416b8e00, 0h41f50507, 0hc1d2a716, + 0hc16b8e00, 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc19194b0, 0h41b6d966, 0hc208695c, 0h40de6d7d, + 0h40de6d7d, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h406d72bf, 0h41a58418, 0hc22076c5, 0h406d72bf, + 0hc06d72bf, 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc0de6d7d, 0h4208695c, 0hc1b6d966, 0h419194b0, + 0h419194b0, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h416b8e00, 0h41f50507, 0hc1d2a716, 0h416b8e00, + 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc1f50507, 0hc19194b0, 0h41b6d966, 0h40de6d7d, 0hc208695c, + 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc208695c, 0h406d72bf, 0h41a58418, 0h406d72bf, 0hc22076c5, + 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1a58418, 0hc0de6d7d, 0h4208695c, 0h419194b0, 0hc1b6d966, + 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1b6d966, 0h416b8e00, 0h41f50507, 0h416b8e00, 0hc1d2a716, + 0h41d2a716, 0hc16b8e00, 0hc1f50507, 0hc16b8e00, 0h41b6d966, 0hc19194b0, 0hc208695c, 0h40de6d7d, + 0h41b6d966, 0h40de6d7d, 0hc208695c, 0hc19194b0, 0h41a58418, 0h406d72bf, 0hc22076c5, 0h406d72bf, + 0h422076c5, 0hc06d72bf, 0hc1a58418, 0hc06d72bf, 0h4208695c, 0hc0de6d7d, 0hc1b6d966, 0h419194b0, + 0h4208695c, 0h419194b0, 0hc1b6d966, 0hc0de6d7d, 0h41f50507, 0h416b8e00, 0hc1d2a716, 0h416b8e00, + 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc1f50507, 0h41b6d966, 0hc19194b0, 0h40de6d7d, 0hc208695c, + 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc208695c, 0h41a58418, 0h406d72bf, 0h406d72bf, 0hc22076c5, + 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1a58418, 0h4208695c, 0hc0de6d7d, 0h419194b0, 0hc1b6d966, + 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1b6d966, 0h41f50507, 0h416b8e00, 0h416b8e00, 0hc1d2a716, + 0h3fc4b564, 0h3fc4b564, 0h3fc4b564, 0h4235739c, 0hc0024b8d, 0hc0024b8d, 0h41b8e69d, 0h421c1252, + 0hc0024b8d, 0h41b8e69d, 0hc0024b8d, 0h421c1252, 0hc0b05c85, 0h419d18ee, 0h419d18ee, 0h420e2b7a, + 0h41b8e69d, 0hc0024b8d, 0hc0024b8d, 0h421c1252, 0h419d18ee, 0hc0b05c85, 0h419d18ee, 0h420e2b7a, + 0h419d18ee, 0h419d18ee, 0hc0b05c85, 0h420e2b7a, 0h418a0670, 0h418a0670, 0h418a0670, 0h4208ee18, + 0h3fc4b564, 0h3fc4b564, 0h4235739c, 0h3fc4b564, 0hc0024b8d, 0h40024b8d, 0h421c1252, 0h41b8e69d, + 0hc0024b8d, 0h41b8e69d, 0h421c1252, 0hc0024b8d, 0hc0b05c85, 0h419d18ee, 0h420e2b7a, 0h419d18ee, + 0h41b8e69d, 0hc0024b8d, 0h421c1252, 0hc0024b8d, 0h419d18ee, 0hc0b05c85, 0h420e2b7a, 0h419d18ee, + 0h419d18ee, 0h419d18ee, 0h420e2b7a, 0hc0b05c85, 0h418a0670, 0h418a0670, 0h4208ee18, 0h418a0670, + 0h3fc4b564, 0h4235739c, 0h3fc4b564, 0h3fc4b564, 0hc0024b8d, 0h421c1252, 0hc0024b8d, 0h41b8e69d, + 0hc0024b8d, 0h421c1252, 0h41b8e69d, 0hc0024b8d, 0hc0b05c85, 0h420e2b7a, 0h419d18ee, 0h419d18ee, + 0h41b8e69d, 0h421c1252, 0hc0024b8d, 0hc0024b8d, 0h419d18ee, 0h420e2b7a, 0hc0b05c85, 0h419d18ee, + 0h419d18ee, 0h420e2b7a, 0h419d18ee, 0hc0b05c85, 0h418a0670, 0h4208ee18, 0h418a0670, 0h418a0670, + 0h4235739c, 0h3fc4b564, 0h3fc4b564, 0h3fc4b564, 0h421c1252, 0hc0024b8d, 0hc0024b8d, 0h41b8e69d, + 0h421c1252, 0hc0024b8d, 0h41b8e69d, 0hc0024b8d, 0h420e2b7a, 0hc0b05c85, 0h419d18ee, 0h419d18ee, + 0h421c1252, 0h41b8e69d, 0hc0024b8d, 0hc0024b8d, 0h420e2b7a, 0h419d18ee, 0hc0b05c85, 0h419d18ee, + 0h420e2b7a, 0h419d18ee, 0h419d18ee, 0hc0b05c85, 0h4208ee18, 0h418a0670, 0h418a0670, 0h418a0670, + 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41d2a716, 0hc208695c, 0hc19194b0, 0h40de6d7d, 0h41b6d966, + 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41b6d966, 0hc22076c5, 0h406d72bf, 0h406d72bf, 0h41a58418, + 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h422076c5, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, 0h4208695c, + 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h4208695c, 0hc1d2a716, 0h416b8e00, 0h416b8e00, 0h41f50507, + 0hc1f50507, 0hc16b8e00, 0h41d2a716, 0hc16b8e00, 0hc208695c, 0hc19194b0, 0h41b6d966, 0h40de6d7d, + 0hc208695c, 0h40de6d7d, 0h41b6d966, 0hc19194b0, 0hc22076c5, 0h406d72bf, 0h41a58418, 0h406d72bf, + 0hc1a58418, 0hc06d72bf, 0h422076c5, 0hc06d72bf, 0hc1b6d966, 0hc0de6d7d, 0h4208695c, 0h419194b0, + 0hc1b6d966, 0h419194b0, 0h4208695c, 0hc0de6d7d, 0hc1d2a716, 0h416b8e00, 0h41f50507, 0h416b8e00, + 0hc1f50507, 0h41d2a716, 0hc16b8e00, 0hc16b8e00, 0hc208695c, 0h41b6d966, 0hc19194b0, 0h40de6d7d, + 0hc208695c, 0h41b6d966, 0h40de6d7d, 0hc19194b0, 0hc22076c5, 0h41a58418, 0h406d72bf, 0h406d72bf, + 0hc1a58418, 0h422076c5, 0hc06d72bf, 0hc06d72bf, 0hc1b6d966, 0h4208695c, 0hc0de6d7d, 0h419194b0, + 0hc1b6d966, 0h4208695c, 0h419194b0, 0hc0de6d7d, 0hc1d2a716, 0h41f50507, 0h416b8e00, 0h416b8e00, + 0h41d2a716, 0hc1f50507, 0hc16b8e00, 0hc16b8e00, 0h41b6d966, 0hc208695c, 0hc19194b0, 0h40de6d7d, + 0h41b6d966, 0hc208695c, 0h40de6d7d, 0hc19194b0, 0h41a58418, 0hc22076c5, 0h406d72bf, 0h406d72bf, + 0h422076c5, 0hc1a58418, 0hc06d72bf, 0hc06d72bf, 0h4208695c, 0hc1b6d966, 0hc0de6d7d, 0h419194b0, + 0h4208695c, 0hc1b6d966, 0h419194b0, 0hc0de6d7d, 0h41f50507, 0hc1d2a716, 0h416b8e00, 0h416b8e00, +} + +/* + 2D Simplex noise base. +*/ +_internal_noise_2d_unskewed_base :: proc(seed: i64, coord: Vec2) -> (value: f32) { + // Get base points and offsets. + base := [2]i64{fast_floor(coord.x), fast_floor(coord.y)} + i := [2]f32{f32(coord.x - f64(base.x)), f32(coord.y - f64(base.y))} + + // Prime pre-multiplication for hash. + bp := base * [2]i64{PRIME_X, PRIME_Y} + + // Unskew. + t := f32(i.x + i.y) * f32(UNSKEW_2D) + d0 := i + [2]f32{t, t} + + // First vertex. + a0 := RSQUARED_2D - d0.x * d0.x - d0.y * d0.y + if a0 > 0 { + value = (a0 * a0) * (a0 * a0) * grad(seed, [2]i64{bp.x, bp.y}, d0) + } + + // Second vertex. + a1 := f32(2 * (1 + 2 * UNSKEW_2D) * (1 / UNSKEW_2D + 2)) * t + f32(-2 * (1 + 2 * UNSKEW_2D) * (1 + 2 * UNSKEW_2D)) + a0 + if a1 > 0 { + d1 := d0 - [2]f32{f32(1 + 2 * UNSKEW_2D), f32(1 + 2 * UNSKEW_2D)} + value += (a1 * a1) * (a1 * a1) * grad(seed, [2]i64{bp.x + PRIME_X, bp.y + PRIME_Y}, d1) + } + + // Third vertex. + if d0.y > d0.x { + d2 := d0 - [2]f32{f32(UNSKEW_2D), f32(UNSKEW_2D + 1)} + a2 := RSQUARED_2D - d2.x * d2.x - d2.y * d2.y + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * grad(seed, [2]i64{bp.x, bp.y + PRIME_Y}, d2) + } + } else { + d2 := d0 - [2]f32{f32(UNSKEW_2D + 1), f32(UNSKEW_2D)} + a2 := RSQUARED_2D - d2.x * d2.x - d2.y * d2.y + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * grad(seed, [2]i64{bp.x + PRIME_X, bp.y}, d2) + } + } + + return +} + + +/* + Generate overlapping cubic lattices for 3D OpenSimplex2 noise. +*/ +_internal_noise_3d_unrotated_base :: proc(seed: i64, coord: Vec3) -> (value: f32) { + seed := seed + // Get base points and offsets. + // xr, yr, zr := coord.x, coord.y, coord.z + + rb := [3]i64{fast_round(coord.x), fast_round(coord.y), fast_round(coord.z)} + ri := [3]f32{f32(coord.x - f64(rb.x)), f32(coord.y - f64(rb.y)), f32(coord.z - f64(rb.z))} + + // -1 if positive, 1 if negative. + i_sign := [3]i64{i64(-1.0 - ri.x) | 1, i64(-1.0 - ri.y) | 1, i64(-1.0 - ri.z) | 1} + f_sign := [3]f32{f32(i_sign.x), f32(i_sign.y), f32(i_sign.z)} + + // Compute absolute values, using the above as a shortcut. This was faster in my tests for some reason. + a0 := f_sign * -ri + + // Prime pre-multiplication for hash. + rbp := rb * [3]i64{PRIME_X, PRIME_Y, PRIME_Z} + + // Loop: Pick an edge on each lattice copy. + a := (RSQUARED_3D - ri.x * ri.x) - (ri.y * ri.y + ri.z * ri.z) + + l := 0 + for { + defer l += 1 + + // Closest point on cube. + if a > 0 { + a2 := a * a; a4 := a2 * a2 + value += a4 * grad(seed, rbp, ri) + } + + // Second-closest point. + if a0.x >= a0.y && a0.x >= a0.z { + b := a + a0.x + a0.x + if b > 1 { + b -= 1 + b2 := b * b; b4 := b2 * b2 + value += b4 * grad(seed, [3]i64{rbp.x - i_sign.x * PRIME_X, rbp.y, rbp.z}, [3]f32{ri.x + f_sign.x, ri.y, ri.z}) + } + } else if a0.y > a0.x && a0.y >= a0.z { + b := a + a0.y + a0.y + if b > 1 { + b -= 1 + b2 := b * b; b4 := b2 * b2 + value += b4 * grad(seed, [3]i64{rbp.x, rbp.y - i_sign.y * PRIME_Y, rbp.z}, [3]f32{ri.x, ri.y + f_sign.y, ri.z}) + } + } else { + b := a + a0.z + a0.z + if b > 1 { + b -= 1 + b2 := b * b; b4 := b2 * b2 + value += b4 * grad(seed, [3]i64{rbp.x, rbp.y, rbp.z - i_sign.z * PRIME_Z}, [3]f32{ri.x, ri.y, ri.z + f_sign.z}) + } + } + + // Break from loop if we're done, skipping updates below. + if l == 1 { + break + } + + // Update absolute value. + a0 = 0.5 - a0 + + // Update relative coordinate. + ri = a0 * f_sign + + // Update falloff. + a += (0.75 - a0.x) - (a0.y + a0.z) + + // Update prime for hash. + rbp += [3]i64{i_sign.x >> 1, i_sign.y >> 1, i_sign.z >> 1} & {PRIME_X, PRIME_Y, PRIME_Z} + + // Update the reverse sign indicators. + i_sign = -i_sign + f_sign = -f_sign + + // And finally update the seed for the other lattice copy. + seed ~= SEED_FLIP_3D + } + + return value +} + +/* + 4D OpenSimplex2 noise base. +*/ +_internal_noise_4d_unskewed_base :: proc(seed: i64, coord: Vec4) -> (value: f32) { + seed := seed + + // Get base points and offsets + base := [4]i64{fast_floor(coord.x), fast_floor(coord.y), fast_floor(coord.z), fast_floor(coord.w)} + si := [4]f32{f32(coord.x - f64(base.x)), f32(coord.y - f64(base.y)), f32(coord.z - f64(base.z)), f32(coord.w - f64(base.w))} + + // Determine which lattice we can be confident has a contributing point its corresponding cell's base simplex. + // We only look at the spaces between the diagonal planes. This proved effective in all of my tests. + si_sum := (si.x + si.y) + (si.z + si.w) + starting_lattice := i64(si_sum * 1.25) + + // Offset for seed based on first lattice copy. + seed += starting_lattice * SEED_OFFSET_4D + + // Offset for lattice point relative positions (skewed) + starting_lattice_offset := f32(starting_lattice) * -LATTICE_STEP_4D + si += starting_lattice_offset + + // Prep for vertex contributions. + ssi := (si_sum + starting_lattice_offset * 4) * UNSKEW_4D + + // Prime pre-multiplication for hash. + svp := base * [4]i64{PRIME_X, PRIME_Y, PRIME_Z, PRIME_W} + + // Five points to add, total, from five copies of the A4 lattice. + for i : i64 = 0; ; i += 1 { + + // Next point is the closest vertex on the 4-simplex whose base vertex is the aforementioned vertex. + score := 1.0 + ssi * (-1.0 / UNSKEW_4D) // Seems slightly faster than 1.0-xsi-ysi-zsi-wsi + if si.x >= si.x && si.x >= si.z && si.x >= si.w && si.x >= score { + svp.x += PRIME_X + si.x -= 1 + ssi -= UNSKEW_4D + } + else if si.y > si.x && si.y >= si.z && si.y >= si.w && si.y >= score { + svp.y += PRIME_Y + si.y -= 1 + ssi -= UNSKEW_4D + } + else if si.z > si.x && si.z > si.y && si.z >= si.w && si.z >= score { + svp.z += PRIME_Z + si.z -= 1 + ssi -= UNSKEW_4D + } + else if si.w > si.x && si.w > si.y && si.w > si.z && si.w >= score { + svp.w += PRIME_W + si.w -= 1 + ssi -= UNSKEW_4D + } + + // gradient contribution with falloff. + d := si + ssi + a := (d.x * d.x + d.y * d.y) + (d.z * d.z + d.w * d.w) + + if a < RSQUARED_4D { + a -= RSQUARED_4D + a *= a; a4 := a * a + value += a4 * grad(seed, svp, d) + } + + // Break from loop if we're done, skipping updates below. + if i == 4 { + break + } + + // Update for next lattice copy shifted down by <-0.2, -0.2, -0.2, -0.2>. + si += LATTICE_STEP_4D + ssi += LATTICE_STEP_4D * 4 * UNSKEW_4D + seed -= SEED_OFFSET_4D + + // Because we don't always start on the same lattice copy, there's a special reset case. + if i == starting_lattice { + svp -= {PRIME_X, PRIME_Y, PRIME_Z, PRIME_W} + seed += SEED_OFFSET_4D * 5 + } + } + return +} + +/* + Utility functions +*/ +@(optimization_mode="speed") +grad_2d :: proc(seed: i64, svp: [2]i64, delta: [2]f32) -> (value: f32) { + hash := seed ~ svp.x ~ svp.y + hash *= HASH_MULTIPLIER + hash ~= hash >> (64 - N_GRADS_2D_EXPONENT + 1) + + gi := hash & ((N_GRADS_2D - 1) << 1) + return GRADIENTS_2D[gi] * delta.x + GRADIENTS_2D[gi | 1] * delta.y +} + +@(optimization_mode="speed") +grad_3d :: proc(seed: i64, rvp: [3]i64, delta: [3]f32) -> (value: f32) { + hash := (seed ~ rvp.x) ~ (rvp.y ~ rvp.z) + hash *= HASH_MULTIPLIER + hash ~= hash >> (64 - N_GRADS_3D_EXPONENT + 2) + + gi := hash & ((N_GRADS_3D - 1) << 2) + return GRADIENTS_3D[gi] * delta.x + GRADIENTS_3D[gi | 1] * delta.y + GRADIENTS_3D[gi | 2] * delta.z +} + +@(optimization_mode="speed") +grad_4d :: proc(seed: i64, svp: [4]i64, delta: [4]f32) -> (value: f32) { + hash := seed ~ (svp.x ~ svp.y) ~ (svp.z ~ svp.w) + hash *= HASH_MULTIPLIER + hash ~= hash >> (64 - N_GRADS_4D_EXPONENT + 2) + + gi := hash & ((N_GRADS_4D - 1) << 2) + return (GRADIENTS_4D[gi] * delta.x + GRADIENTS_4D[gi | 1] * delta.y) + (GRADIENTS_4D[gi | 2] * delta.z + GRADIENTS_4D[gi | 3] * delta.w) +} + +grad :: proc {grad_2d, grad_3d, grad_4d} + +@(optimization_mode="speed") +fast_floor :: proc(x: f64) -> (floored: i64) { + xi := i64(x) + return x < f64(xi) ? xi - 1 : xi +} + +@(optimization_mode="speed") +fast_round :: proc(x: f64) -> (rounded: i64) { + return x < 0 ? i64(x - 0.5) : i64(x + 0.5) +} \ No newline at end of file diff --git a/core/math/noise/opensimplex2.odin b/core/math/noise/opensimplex2.odin new file mode 100644 index 000000000..d90dafdf5 --- /dev/null +++ b/core/math/noise/opensimplex2.odin @@ -0,0 +1,171 @@ +/* + OpenSimplex2 noise implementation. + + Ported from https://github.com/KdotJPG/OpenSimplex2. + Copyright 2022 Yuki2 (https://github.com/NoahR02) +*/ +package math_noise + +/* + Input coordinate vectors +*/ +Vec2 :: [2]f64 +Vec3 :: [3]f64 +Vec4 :: [4]f64 + +/* + Noise Evaluators +*/ + +/* + 2D Simplex noise, standard lattice orientation. +*/ +noise_2d :: proc(seed: i64, coord: Vec2) -> (value: f32) { + // Get points for A2* lattice + skew := SKEW_2D * (coord.x + coord.y) + skewed := coord + skew + + return _internal_noise_2d_unskewed_base(seed, skewed) +} + +/* + 2D Simplex noise, with Y pointing down the main diagonal. + Might be better for a 2D sandbox style game, where Y is vertical. + Probably slightly less optimal for heightmaps or continent maps, + unless your map is centered around an equator. It's a subtle + difference, but the option is here to make it an easy choice. +*/ +noise_2d_improve_x :: proc(seed: i64, coord: Vec2) -> (value: f32) { + // Skew transform and rotation baked into one. + xx := coord.x * ROOT_2_OVER_2 + yy := coord.y * (ROOT_2_OVER_2 * (1 + 2 * SKEW_2D)) + return _internal_noise_2d_unskewed_base(seed, Vec2{yy + xx, yy - xx}) +} + + +/* + 3D OpenSimplex2 noise, with better visual isotropy in (X, Y). + Recommended for 3D terrain and time-varied animations. + The Z coordinate should always be the "different" coordinate in whatever your use case is. + If Y is vertical in world coordinates, call `noise_3d_improve_xz(x, z, Y)` or use `noise_3d_xz_before_y`. + If Z is vertical in world coordinates, call `noise_3d_improve_xz(x, y, Z)`. + For a time varied animation, call `noise_3d_improve_xz(x, y, T)`. +*/ +noise_3d_improve_xy :: proc(seed: i64, coord: Vec3) -> (value: f32) { + /* + Re-orient the cubic lattices without skewing, so Z points up the main lattice diagonal, + and the planes formed by XY are moved far out of alignment with the cube faces. + Orthonormal rotation. Not a skew transform. + */ + xy := coord.x + coord.y + s2 := xy * ROTATE_3D_ORTHOGONALIZER + zz := coord.z * ROOT_3_OVER_3 + + r := Vec3{coord.x + s2 + zz, coord.y + s2 + zz, xy * -ROOT_3_OVER_3 + zz} + + // Evaluate both lattices to form a BCC lattice. + return _internal_noise_3d_unrotated_base(seed, r) +} + +/* + 3D OpenSimplex2 noise, with better visual isotropy in (X, Z). + Recommended for 3D terrain and time-varied animations. + The Y coordinate should always be the "different" coordinate in whatever your use case is. + If Y is vertical in world coordinates, call `noise_3d_improve_xz(x, Y, z)`. + If Z is vertical in world coordinates, call `noise_3d_improve_xz(x, Z, y)` or use `noise_3d_improve_xy`. + For a time varied animation, call `noise_3d_improve_xz(x, T, y)` or use `noise_3d_improve_xy`. +*/ +noise_3d_improve_xz :: proc(seed: i64, coord: Vec3) -> (value: f32) { + /* + Re-orient the cubic lattices without skewing, so Y points up the main lattice diagonal, + and the planes formed by XZ are moved far out of alignment with the cube faces. + Orthonormal rotation. Not a skew transform. + */ + xz := coord.x + coord.z + s2 := xz * ROTATE_3D_ORTHOGONALIZER + yy := coord.y * ROOT_3_OVER_3 + + r := Vec3{coord.x + s2 + yy, xz * -ROOT_3_OVER_3 + yy, coord.z + s2 + yy} + + // Evaluate both lattices to form a BCC lattice. + return _internal_noise_3d_unrotated_base(seed, r) +} + +/* + 3D OpenSimplex2 noise, fallback rotation option + Use `noise_3d_improve_xy` or `noise_3d_improve_xz` instead, wherever appropriate. + They have less diagonal bias. This function's best use is as a fallback. +*/ +noise_3d_fallback :: proc(seed: i64, coord: Vec3) -> (value: f32) { + /* + Re-orient the cubic lattices via rotation, to produce a familiar look. + Orthonormal rotation. Not a skew transform. + */ + bias := FALLBACK_ROTATE_3D * (coord.x + coord.y + coord.z) + biased := bias - coord + // Evaluate both lattices to form a BCC lattice. + return _internal_noise_3d_unrotated_base(seed, biased) +} + + +/* + 4D OpenSimplex2 noise, with XYZ oriented like `noise_3d_improve_xy` + and W for an extra degree of freedom. W repeats eventually. + Recommended for time-varied animations which texture a 3D object (W=time) + in a space where Z is vertical. +*/ +noise_4d_improve_xyz_improve_xy :: proc(seed: i64, coord: Vec4) -> (value: f32) { + xy := coord.x + coord.y + s2 := xy * -0.21132486540518699998 + zz := coord.z * 0.28867513459481294226 + ww := coord.w * 0.2236067977499788 + + xr, yr : f64 = coord.x + (zz + ww + s2), coord.y + (zz + ww + s2) + zr : f64 = xy * -0.57735026918962599998 + (zz + ww) + wr : f64 = coord.z * -0.866025403784439 + ww + + return _internal_noise_4d_unskewed_base(seed, Vec4{xr, yr, zr, wr}) +} + +/* + 4D OpenSimplex2 noise, with XYZ oriented like `noise_3d_improve_xz` + and W for an extra degree of freedom. W repeats eventually. + Recommended for time-varied animations which texture a 3D object (W=time) + in a space where Y is vertical. +*/ +noise_4d_improve_xyz_improve_xz :: proc(seed: i64, coord: Vec4) -> (value: f32) { + xz := coord.x + coord.z + s2 := xz * -0.21132486540518699998 + yy := coord.y * 0.28867513459481294226 + ww := coord.w * 0.2236067977499788 + + xr, zr : f64 = coord.x + (yy + ww + s2), coord.z + (yy + ww + s2) + yr := xz * -0.57735026918962599998 + (yy + ww) + wr := coord.y * -0.866025403784439 + ww + + return _internal_noise_4d_unskewed_base(seed, Vec4{xr, yr, zr, wr}) +} + +/* + 4D OpenSimplex2 noise, with XYZ oriented like `noise_3d_fallback` + and W for an extra degree of freedom. W repeats eventually. + Recommended for time-varied animations which texture a 3D object (W=time) + where there isn't a clear distinction between horizontal and vertical +*/ +noise_4d_improve_xyz :: proc(seed: i64, coord: Vec4) -> (value: f32) { + xyz := coord.x + coord.y + coord.z + ww := coord.w * 0.2236067977499788 + s2 := xyz * -0.16666666666666666 + ww + + skewed := Vec4{coord.x + s2, coord.y + s2, coord.z + s2, -0.5 * xyz + ww} + return _internal_noise_4d_unskewed_base(seed, skewed) +} + +/* + 4D OpenSimplex2 noise, fallback lattice orientation. +*/ +noise_4d_fallback :: proc(seed: i64, coord: Vec4) -> (value: f32) { + // Get points for A4 lattice + skew := f64(SKEW_4D) * (coord.x + coord.y + coord.z + coord.w) + return _internal_noise_4d_unskewed_base(seed, coord + skew) +} \ No newline at end of file diff --git a/tests/core/Makefile b/tests/core/Makefile index 0f0ffe4d6..1c2cee6bd 100644 --- a/tests/core/Makefile +++ b/tests/core/Makefile @@ -1,7 +1,7 @@ ODIN=../../odin PYTHON=$(shell which python3) -all: download_test_assets image_test compress_test strings_test hash_test crypto_test +all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test download_test_assets: $(PYTHON) download_assets.py @@ -19,4 +19,7 @@ hash_test: $(ODIN) run hash -out=test_hash -o:speed -no-bounds-check crypto_test: - $(ODIN) run crypto -out=crypto_hash -o:speed -no-bounds-check \ No newline at end of file + $(ODIN) run crypto -out=crypto_hash -o:speed -no-bounds-check + +noise_test: + $(ODIN) run math/noise -out=test_noise \ No newline at end of file diff --git a/tests/core/build.bat b/tests/core/build.bat index 176b7f175..6af39e688 100644 --- a/tests/core/build.bat +++ b/tests/core/build.bat @@ -35,4 +35,9 @@ echo --- echo --- echo Running core:encoding tests echo --- -%PATH_TO_ODIN% run encoding %COMMON% \ No newline at end of file +%PATH_TO_ODIN% run encoding %COMMON% + +echo --- +echo Running core:math/noise tests +echo --- +%PATH_TO_ODIN% run math/noise %COMMON% \ No newline at end of file diff --git a/tests/core/math/noise/test_core_math_noise.odin b/tests/core/math/noise/test_core_math_noise.odin new file mode 100644 index 000000000..a3ac1b955 --- /dev/null +++ b/tests/core/math/noise/test_core_math_noise.odin @@ -0,0 +1,153 @@ +package test_core_math_noise + +import "core:testing" +import "core:math/noise" +import "core:fmt" + +TEST_count := 0 +TEST_fail := 0 + +V2 :: noise.Vec2 +V3 :: noise.Vec3 +V4 :: noise.Vec4 + +when ODIN_TEST { + expect :: testing.expect + log :: testing.log +} else { + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + fmt.printf("[%v] ", loc) + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.println(message) + return + } + fmt.println(" PASS") + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } +} + +main :: proc() { + t := testing.T{} + noise_test(&t) + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) +} + +Test_Vector :: struct { + seed: i64, + coord: union {V2, V3, V4}, + expected: f32, + + test_proc: union { + proc(_: i64, _: V2) -> f32, + proc(_: i64, _: V3) -> f32, + proc(_: i64, _: V4) -> f32, + }, +} + +SEED_1 :: 2324223232 +SEED_2 :: 932466901 +SEED_3 :: 9321 + +COORD_1 :: V4{ 242.0, 3433.0, 920.0, 222312.0} +COORD_2 :: V4{ 590.0, 9411.0, 5201.0, 942124256.0} +COORD_3 :: V4{12090.0, 19411.0, 81950901.0, 4224219.0} + +Noise_Tests := []Test_Vector{ + /* + `noise_2d` tests. + */ + {SEED_1, COORD_1.xy, 0.25010583, noise.noise_2d}, + {SEED_2, COORD_2.xy, -0.92513955, noise.noise_2d}, + {SEED_3, COORD_3.xy, 0.67327416, noise.noise_2d}, + + /* + `noise_2d_improve_x` tests. + */ + {SEED_1, COORD_1.xy, 0.17074019, noise.noise_2d_improve_x}, + {SEED_2, COORD_2.xy, 0.72330487, noise.noise_2d_improve_x}, + {SEED_3, COORD_3.xy, -0.032076947, noise.noise_2d_improve_x}, + + /* + `noise_3d_improve_xy` tests. + */ + {SEED_1, COORD_1.xyz, 0.14819577, noise.noise_3d_improve_xy}, + {SEED_2, COORD_2.xyz, -0.065345764, noise.noise_3d_improve_xy}, + {SEED_3, COORD_3.xyz, -0.37761918, noise.noise_3d_improve_xy}, + + /* + `noise_3d_improve_xz` tests. + */ + {SEED_1, COORD_1.xyz, -0.50075006, noise.noise_3d_improve_xz}, + {SEED_2, COORD_2.xyz, -0.36039603, noise.noise_3d_improve_xz}, + {SEED_3, COORD_3.xyz, -0.3479203, noise.noise_3d_improve_xz}, + + /* + `noise_3d_fallback` tests. + */ + {SEED_1, COORD_1.xyz, 0.6557345, noise.noise_3d_fallback}, + {SEED_2, COORD_2.xyz, 0.55452216, noise.noise_3d_fallback}, + {SEED_3, COORD_3.xyz, -0.26408964, noise.noise_3d_fallback}, + + /* + `noise_3d_fallback` tests. + */ + {SEED_1, COORD_1.xyz, 0.6557345, noise.noise_3d_fallback}, + {SEED_2, COORD_2.xyz, 0.55452216, noise.noise_3d_fallback}, + {SEED_3, COORD_3.xyz, -0.26408964, noise.noise_3d_fallback}, + + /* + `noise_4d_improve_xyz_improve_xy` tests. + */ + {SEED_1, COORD_1, 0.44929826, noise.noise_4d_improve_xyz_improve_xy}, + {SEED_2, COORD_2, -0.13270882, noise.noise_4d_improve_xyz_improve_xy}, + {SEED_3, COORD_3, 0.10298563, noise.noise_4d_improve_xyz_improve_xy}, + + /* + `noise_4d_improve_xyz_improve_xz` tests. + */ + {SEED_1, COORD_1, -0.078514606, noise.noise_4d_improve_xyz_improve_xz}, + {SEED_2, COORD_2, -0.032157656, noise.noise_4d_improve_xyz_improve_xz}, + {SEED_3, COORD_3, -0.38607058, noise.noise_4d_improve_xyz_improve_xz}, + + /* + `noise_4d_improve_xyz` tests. + */ + {SEED_1, COORD_1, -0.4442258, noise.noise_4d_improve_xyz}, + {SEED_2, COORD_2, 0.36822623, noise.noise_4d_improve_xyz}, + {SEED_3, COORD_3, 0.22628775, noise.noise_4d_improve_xyz}, + + /* + `noise_4d_fallback` tests. + */ + {SEED_1, COORD_1, -0.14233987, noise.noise_4d_fallback}, + {SEED_2, COORD_2, 0.1354035, noise.noise_4d_fallback}, + {SEED_3, COORD_3, 0.14565045, noise.noise_4d_fallback}, + + // TODO: Output according to C# - Figure out which of these two is right (and why). + // {SEED_1, COORD_1, -0.14233987, noise.noise_4d_fallback}, + // {SEED_2, COORD_2, 0.1354035, noise.noise_4d_fallback}, + // {SEED_3, COORD_3, 0.14565045, noise.noise_4d_fallback}, +} + +noise_test :: proc(t: ^testing.T) { + for test in Noise_Tests { + output: f32 + + switch coord in test.coord { + case V2: + output = test.test_proc.(proc(_: i64, _: V2) -> f32)(test.seed, test.coord.(V2)) + case V3: + output = test.test_proc.(proc(_: i64, _: V3) -> f32)(test.seed, test.coord.(V3)) + case V4: + output = test.test_proc.(proc(_: i64, _: V4) -> f32)(test.seed, test.coord.(V4)) + } + + error := fmt.tprintf("Seed %v, Coord: %v, Expected: %3.8f. Got %3.8f", test.seed, test.coord, test.expected, output) + expect(t, test.expected == output, error) + } +} \ No newline at end of file From accb35506f5c0b66fa25fb7ccec7e97a9da61d8e Mon Sep 17 00:00:00 2001 From: NoahR02 Date: Tue, 8 Feb 2022 06:25:07 -0500 Subject: [PATCH 108/117] Ports OpenSimplex2 from https://github.com/KdotJPG/OpenSimplex2 to Odin. Adds tests for the noise procedures. --- tests/core/math/noise/test_core_math_noise.odin | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/core/math/noise/test_core_math_noise.odin b/tests/core/math/noise/test_core_math_noise.odin index a3ac1b955..c3a3e4228 100644 --- a/tests/core/math/noise/test_core_math_noise.odin +++ b/tests/core/math/noise/test_core_math_noise.odin @@ -128,10 +128,6 @@ Noise_Tests := []Test_Vector{ {SEED_2, COORD_2, 0.1354035, noise.noise_4d_fallback}, {SEED_3, COORD_3, 0.14565045, noise.noise_4d_fallback}, - // TODO: Output according to C# - Figure out which of these two is right (and why). - // {SEED_1, COORD_1, -0.14233987, noise.noise_4d_fallback}, - // {SEED_2, COORD_2, 0.1354035, noise.noise_4d_fallback}, - // {SEED_3, COORD_3, 0.14565045, noise.noise_4d_fallback}, } noise_test :: proc(t: ^testing.T) { From 30bb2382aa0c7a9d6407c0b28258cd9fd00c560d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Feb 2022 11:48:59 +0000 Subject: [PATCH 109/117] Correct simple boolean intrinsics --- src/check_builtin.cpp | 5 +++-- src/checker_builtin_procs.hpp | 4 ---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index d3a3103b1..1fb3d6037 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -3344,9 +3344,11 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 case BuiltinProc_type_is_simple_compare: case BuiltinProc_type_is_dereferenceable: case BuiltinProc_type_is_valid_map_key: + case BuiltinProc_type_is_valid_matrix_elements: case BuiltinProc_type_is_named: case BuiltinProc_type_is_pointer: case BuiltinProc_type_is_array: + case BuiltinProc_type_is_enumerated_array: case BuiltinProc_type_is_slice: case BuiltinProc_type_is_dynamic_array: case BuiltinProc_type_is_map: @@ -3354,10 +3356,9 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 case BuiltinProc_type_is_union: case BuiltinProc_type_is_enum: case BuiltinProc_type_is_proc: - case BuiltinProc_type_is_bit_field: - case BuiltinProc_type_is_bit_field_value: case BuiltinProc_type_is_bit_set: case BuiltinProc_type_is_simd_vector: + case BuiltinProc_type_is_matrix: case BuiltinProc_type_is_specialized_polymorphic_record: case BuiltinProc_type_is_unspecialized_polymorphic_record: case BuiltinProc_type_has_nil: diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index e8f5174c0..d833a055f 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -213,8 +213,6 @@ BuiltinProc__type_simple_boolean_begin, BuiltinProc_type_is_union, BuiltinProc_type_is_enum, BuiltinProc_type_is_proc, - BuiltinProc_type_is_bit_field, - BuiltinProc_type_is_bit_field_value, BuiltinProc_type_is_bit_set, BuiltinProc_type_is_simd_vector, BuiltinProc_type_is_matrix, @@ -466,8 +464,6 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_is_union"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_enum"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_proc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, - {STR_LIT("type_is_bit_field"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, - {STR_LIT("type_is_bit_field_value"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_bit_set"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_simd_vector"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_matrix"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, From 83e9a6b417c449e0ffa413f4841ce0d19b1c7732 Mon Sep 17 00:00:00 2001 From: CiD- Date: Tue, 8 Feb 2022 09:21:43 -0500 Subject: [PATCH 110/117] fix -vet for filepath/match.odin --- core/path/filepath/match.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/path/filepath/match.odin b/core/path/filepath/match.odin index cba44953d..bde7f5393 100644 --- a/core/path/filepath/match.odin +++ b/core/path/filepath/match.odin @@ -227,11 +227,10 @@ glob :: proc(pattern: string, allocator := context.allocator) -> (matches: []str return m[:], .None } - temp_buf: [8]byte - dir, file := split(pattern) volume_len := 0 when ODIN_OS == "windows" { + temp_buf: [8]byte volume_len, dir = clean_glob_path_windows(dir, temp_buf[:]) } else { dir = clean_glob_path(dir) From 251edf7bc7eff05b1dcead77133fe1a3ec2e973c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikkel=20Hjortsh=C3=B8j?= Date: Fri, 11 Feb 2022 17:22:14 +0100 Subject: [PATCH 111/117] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a1f96d20b..c62fcd36b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -79,7 +79,7 @@ jobs: make timeout-minutes: 10 build_windows: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v1 - name: build Odin From 1c57d1c01921284e82329933df558bf9edd317bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikkel=20Hjortsh=C3=B8j?= Date: Fri, 11 Feb 2022 17:22:33 +0100 Subject: [PATCH 112/117] Update nightly.yml --- .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 2b33c45a8..7175843f5 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -7,7 +7,7 @@ on: jobs: build_windows: - runs-on: windows-latest + runs-on: windows-2019 steps: - uses: actions/checkout@v1 - name: build Odin From e59064dd59d69fe94b5c6ba8c24ed92bc2143e4e Mon Sep 17 00:00:00 2001 From: FancyKillerPanda Date: Sun, 13 Feb 2022 10:33:48 +1100 Subject: [PATCH 113/117] Updated vendor/sdl2/ttf LIB and DLL. --- vendor/sdl2/ttf/SDL2_ttf.dll | Bin 33792 -> 1534464 bytes vendor/sdl2/ttf/SDL2_ttf.lib | Bin 12122 -> 18406 bytes vendor/sdl2/ttf/sdl_ttf.odin | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl2/ttf/SDL2_ttf.dll b/vendor/sdl2/ttf/SDL2_ttf.dll index 575636a915df04b5a82b36a5635e59624380c9de..2acc0e5bc8b9ca9933e585af49f64923297e41c2 100644 GIT binary patch literal 1534464 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 z

    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%0AaPqQ5@O3xS$Xd^ba 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

    B^x7efaE;|TzT#<&wtO!PS(#JdB%+pYgXf9 zWbb{v3gX=6U;Ku0DKBy|%R`yy-XX!yQsrvDiR`VBan%pxePr((p64#oE^C4>*5pT0 zdyi$J_I9pWDO!2ZjmX}9g_P+Z+1p2cA4EKH9k-N^I&>wn_h{Y+8&V%?e4*VVq+PLN zROdiPZtyVFhAsCse%kuoI5s0Uc!`ysC0~f@a*wET)3eGgp6;<#QEIZJ7u|teujS8DFLZ6>m!? zGTg|1`f2zl@mDMVB#5XVWL5o`aUtkr>hVmwh1ju`JXiB`?!46K-fcfR z?Fb}mWVSOGx{(GKI^F4!od#mt5aUW(8nEj<7}Ppv)onvfhA86ebUhMq_D9z9o9udK z{eXI4(r|dvaTcvp_*Byo1SbR7PsI;LC+!ELf|bz~d{KTdUWHxpB}V2e2N<8BmwmkT zH(q5{uzk+|mY3gu&i@WS7{RSS;G9o@(n$FLXnh+| z)f)O@PJ%iwAwFL&cfa8^ZeFYJ_13s^Q2h~AcBBTgKPRpc=8hEE0xpp?I410;Z<);-K9;!UW-ih2RgMH>2gyhK~C zyG7n_C{KhC(V$MmNL56NhSY^>|5ggMqrBmkBaGUOWJ5yG4EvjY;*NZYJcV0&==e@N z9j>j3P<`$0eM;C(hYxHjh_CaOyc|519R!iynfVkxBy=wYJEK@jU&#!;=fD@;5?rY) z<W%cMX!cuf+|kA{oy2V#tyDZDu`7&q5#5SU0b_ zWL2);;Kyu)@`d|ihiaV*2J8MR6aY1>uc(#Jx>~1^C*NDc1kDp?Yd{Lt z$+?6?KOyp*+`hFFRj_ImjBK%H*-@zfrDiPLtKhmxRnA-iF-Q6AuNS`8M_~mQiv_WV7~!+s9!M zeFILDIv#`w-B2XJF?g`3x@L@M{Y`QOPgmFeqDUj4@+<(`<{9PjedQ(JhJGex&UXbH zD@I7nh}dMAOlcm|x7c_Rse7cKy%?GGzS@XdqT3BL{?{V4D2qO=qRh4lC}3`Zi8)I& zyvNJ&l*4z~!kI;9Ga?-e6~%yAp^Km-id~Uvk6S0h5B^-WD6!wB`4$F?uI6KjwFD&- zSJ(i-(;&JS_}Lfd;L0z!mmmt0%Q1iGqdH8&lGB+~S`Bx#aAmjx zBAf=;!A=B9YB~h|{7DoZA`#>{aWHVZ4pkDDEOs0YJA8r!G^xfDu=GU1-l*-xvxfgF zA)5UC)_2-97%P7XG(~}E#3BVl+)?tvo{hii2p+L9YDlz#=aX0oiPS=DqUvs`2TTuVBo;`|tOG;G{e4Eo+UM%p&S-?w zKS2&OM35s|c6<}te$tJSsX3>5?P#^)hBd}^ho)FUhxK_$mYTjY=H&h)-e^F$Yt7Nq zu*jK*S6@yYdR3Sc2tbvd?M$>Iin7Myqo(Mr<+a(cv98 zL|RW`&_Q4L*DR<_{t@Hmg~BDHrx~%iGIMydVTp+Nppiu%`HkoDDKpR(y^H-7*tS=Q zn%>~7lJdm$hsihJJf{)%mmZjh36pUmh7*_icNiS(*gX0u?sNW55(K-Mp)o8KSEGjv zPg4zvqC|K=mQZ>~0t4o_r=q0-hJpptBWLD?rJMG}&!=u%%5t6E1EKr62X=su0q`?f zo%mP=)V>q>nNG+O(oX)(2~5GbdC}36-C|8jWdTkoJ^)=2Uwu|$EkXlt@#X+tDL8K3g{z@XqA6ODI1^i4B7HM<5yK*LLUlAb8pC%7L^IvIP4R}S4NxnmLATu8L?A%?Tx?1;a2SMF(nyn z)V>Dy?==ri{Pq=W-=ZypjQVMm(z*gDa$oBz8ydWai{L~-Ol^Re^ICENg23NG($|()@P$B!;hY}%*bOWN zAgA07B%-ZY8T9JJlW}{aQjVT_a-Df%#9Bf{3X0Y$o}doad+0K#DIK=ks^J~BCHBk& ziz2Oqgvatm=7P|HmRvX5(`m`UTJd=Qsk}I={88c-B;n1K#ewR< z;zC*H)1!r-i47t?V?zJNKffJcG$NAAfa&MLWpgDlMst0p*CU3g-{7X-)~pf7-(uyU z)Q~1*`}q!zg%E-^4}iBQQY@^IL!!VvumC42VXAiFfMeAvE4Q@mGq-DQkBX_e3z3?) zZEqO1e&Lx&M4M2K+!WddK_}{{^fR&0btEpZTgDr86||XHSVka(Xv-P+6(H$L+~Fe9 zFtI|Tdw)6inIXwFZncno2CO?xmXQ(&tt4@R| z9clSmb>b4;EgXkOTHaM}j-dX;!Z50jkrui2GU{s88&}c>A2KSMx#i1+fVl;>vM`Boa~QJjEyo z)uHCK4@-}E{YsLAfjC-^2=*@8@-yOUs$AEh_3cw6>4Shw zK~_Pn{tpnBA&vVWOM)8KEhHOge-aYsmanPas1w@BcV!dBOB=X!hEac|d^G89=c9{B zYJA-DuFy^{08di9C2xdDG3s(PSUyr^)SKVwG9SpB@#+l`_W-Pf`B0F& zMt7mx4!a9rr#Q_U(jP&-hRn4j?RAszZ$VkmsC$C;6AP%T>npT|nj-$zw>=U(8J ztCeKyX@1)J)%+}TFVIWs`l*AzL&{hg`uowUzFi1AbowNfZcg{_7?m#LT1MyhRq5)z zPP(&7CmWsq{G08mVMs%oX1u4;u5^2wReD_-KC4xFmt6EK{C-@e)TNkaV`#1Pxi2u015lSzJ-*-07Tg#`a$#pD`435M zOeY^8iN9TaL;C-$zNcA+Xe)zXTHmuG{-WQk=qAy=bCO$85#rDIQ5mc+ zSMn4xU;wUX&Fg#M*Vd-%mV0AWl4*1$d+L%tD7G&7S4#5f==7&|W_>EUpweH}$i~%> zce$3v^MX1MUQNjr(`R2XTV$TK)DE9bm<(T~{!N%jq4QHzg}^ijPVtk$h{7)Omfu zia9lxOzF@K^?6VA`PacN>TVl(y}s9W`Y-YcblwN6xD^%gmzG0XUCA3cuvTChBxi>Q zd4U1O$V#(PlunI>@9=_7r1I20rSwjXo7PLIgr{43ce~1M^IJyj9&(9r?u~m04O#9f zz541a&I%UIy`*&7RZ}X1htDl3y=2O4Z!o`f&g>bZgFQ>HoH@-K`nl9EVu*!5MKr@v z2K;Oc4Fokg$0Q$q+wDpj4W*Y$4O>euyXxx7;Hz4xb+D3tXnI_F*^H~t4lb`bwRGBL zS5F8&RyuX|wG)C5WfxTECm(vR;??@bQ`v%sHCn&mN7^sFY|4x(qc%jcbkWn4v^`?Gdn#NN(G3~z>h|OP zr8*A)(EQZ>)0IBE#B6JO$~6$q3bBQGzQ-pnbmHsE-FRg{bi6)zvCph3z*2^OZQvAy z8K-jUgB!c5ymIbxI}IR5civ z4nry3JJ?eznkzU|m_5q54DsQ;X%?%+io9SypYgy8a~=_!>k*lG_U>L)82mtW=w0c11s5;b*HM4FHHZ?fLT2}ytj7<$zb;k zJT}zKs4(#)6yGTjDKCDm+`R*cnC&29f>7wyrQtCMc)T*_X9AClGw{%t3ac9wT;5i2 z`IiG15X2Sz)IIx6Ww)-raj6OYSk1aZ)pvdFN!_et$ZSs^Y4=TU}t4*HSlZEY;0ZkmQo7cc?O8LM?uUMfJ7SCEw0D zJ^ERvO0%elL-nIBU-7^E?$4-u5nkL@RwQOV?VPj4j|<$TeBM5N+_8qr{z4@I36Y%zPexYPw6B=Juc6g;@gc!KWsxp6~2>i<_(x&OYBcPRUz6fJDyG{D=l)w{leclmU2IUg{s@577CY?0ifeBp-np`SA|-Vcp;q0_OR% z%xkLs=;&5S64l5VvE6t*fFB9Ox5fWGY(35*Tt;mUFN~$5^2J6wF@0Y};)(*bP)7E~ zNpTU=BO)#sSLAL4d}Y%UNhbp1oQXHd=3iSRLKJ_ZRy8B(`&1eYT&_Xx*15cu4V;e( z`3SkaEm@%$1PM5|1yTU10HI zQBhduEKw?xyt%vRKHf-A1Q15?BSnp*r6U{F?~?) zewhyS`$SQL`hB|S4t|9~Tyz4>=|PAHIp=7Vl&^)dq_T1@Y!#yTzPG zL^XI}?ZkiC!#DDfIUh(hdw7Eni`xG1&=pfLK+bt1)}7E!!*O^bPBi2ziPRvP65sIa zE%}o04m?nDCM8i|8IEhJq+6NB?DEMCXTLdk)xr+vM6RCub>$gNuTJ9LOyvF}`yjR8 zm#mRfKy|Dyan{+^ti<%Q`2R>znBHb#lAcea_>T(rDDlUl`zWFCg^C0L*GYwdbQixQ zpWw$R#uqieZZJ|MH5v;&nd<|r5)994Z~TjjmXR{=E_#t4)P)3R8hI2I2hc(?8KLm( zO$EiPXh+)fxiQMqF{VNuAuB@YLqp{HD< z&Z2R_VgYx|2KPlaxNC2vY{k^)f!K9eNrgvt>TJ|DFmIiMML})?X30le_*e|i=OZ@v zu8{qN1dBv33Ln+W^7pyd3!5b*2cqla>PGO841auW@ivE6xSJT46qkx`;8#@FF`ufH zuzOPFeY}(PCe%li(l7R#2&T?=n^m|H+B|1`^kcRcad&-J@rHnVTLto4VfjSIguTUu zYf2RHs`7$3|9arnIfZoDl89Nmn+k)Us2%nr%?z#zy(arPEj7{-lOm&Z7CN1aod&u0 zo23)pfV>-5cja+7k47JPI$fTMeMN=lcofP@k0co%pNA}8mWx=#U_aGs0B`+fzfSy6 zK_7TOqfdVP%sg>v^of#WvCjw?8qsi-HE;*NvIc5jAr~bD*%b6PXxl0=zTIVch3FMA zA{hpr%CR>ZPD*Bk84&1OqFu%kD#igI@zHYUNgF#E9m0sR{E;Uk_!3wrau#9($5J|Z zxOG1bYJN}3ZaV^i)GAUX2f42#sc8j8qg#y0g z)d&RueO_1lWb11R4u^3;s4w~%a;&>51so`6QGosQRbB3ARjv^J!+IZ7&gxGr(;uNS z;vd}UNAh*f#g*Jvyf4M1aQKJH;}TEU~Zr|B0Ki^V&jGy=?S)Sx-W~jaA1A2(4VLj<2vBe@;S5Rv*INv^*pPe@1tA4uYbE=m5CNn1 zbHJ_$LF^-*Y)5~>_rzWzT@l}m3;H+?9Jj?kANHp8F7L3p7Jfie3Ut?!pNcpE5Zn9f zAB)1Ei=vmZ-SGhbz<+izl0q$of`Jo4tArQ|72J5P1pl-9$0dKx@^7(-d7t*X+C;E`V$-e4Xwqa={tbm|#lOX~ zkaPK=4rEO}%UhjQOumv;Q@`gG}^~BCBb5|400Cjx?8s z_ea>b9GI-WO-={0x`9_en5@2yv8LX}ZsD_Rcmulh5rmUR7D3R4-Q>4Fiew1Fcb-Mk z1VN*ZA_x+A-9hH|GMoRu$m$eYaA<;;=L6CNp@;3s>IuC0fn;@z(w%q!n(&oOfK68S z!`g1>=O}rQuP7J*-uJ--7- zkT2`!%chzUH;iH#Vpl{1{e_m0BWI>n+dYJ4T>4xOz}IUfKhgC$sUtJ;My`Rd- z*^|^lW@m4w$ND_{om+dFp6ab#=qUn#|C{T3nlzVQ-(yG}czur~r^EU#=G6~g-*O7p z>-!7TB5dfW^YDI{dDVyQ;QfF27&f}wkA(M+WK&To%D{UmsRP6N5pp`f`%ckD`k}{y zONFOZ@`p?KEF0dS>VGCv$k5a86e^_YsTL}z+CL)jPyg zB3vGjn9d=iJu#ian;%F_pVVN4n2P@)A*RA$LD4E26-E0wKkemp{*P6DvChxe`C0PI zLh`fa^%ufkV8!Q%?31(5fF!clVCa&>qIYZQkx)NEsM#_j@2Y0h2kZ+Uv)`jD=?gRu z$v5=y@1(rZbzO-^+bMO3A@`Sl1i~{gXYnoc^)cjbL1a)r2QPg1Q{I8SzC#G9Q%Jn* z3u&78D&#M_!+zk1TA9C|$!7X@j0ZK3h1yMk}Krh?sL8uDC2&8 zx_x`QKKZlzbdZUC?V0R}eS;Je+g)`F2NPvk{mPoxyH&TCSL@gg-TGC#Zo!o%J4>IQ z&~wM-@@w$&_ErnBIT$9`#&$cF=9#>zOrPjXH`N(p_k}^51NUdQ$Hp^D;(um?X+5NO zKQPT|ZU?3*9lEqcO`ToU!M$NY&lb9Tob%mx%F z{?@znDTCslumTQ-;z!XqP&$F1==v@azMb`VaQt4))msL?gB|+uO*Vk&$HeyihhU6v*2F z_V5$7w|Il>?HRqo1d=JGSI9j*dWHVH z;5nj4XGF*H(U?R*XI~;P0PTVGN*5B9h^^dYdW*LR`*J#blAK$(#*5`qToBHv?V_IK z9{ihasChl7>sR`Be^M9z_sUIq06Q|%+Cd41al=wIj2Zm28%Acm#Coz#Qt}*K@^oEN zPO%(e<&HMRo<;sCI{yfrpRe-eple;o_ulxM!0y&Y(YND(>~*guwh?=#=-f#(jH==$ zfst71l^1XH7gNY9gHw7DD09U&Vqzoy>dML`+#`ArsOb8*;-82Lr&0G0JC~p#-Kghg ziQO^@Xh%d>W1<&!x4d{2kQcqCNuu9}i^|^?h=POyyiqGAA-s7-w$Z z?el-Fm=Do0tZ`eu-j;m(by68l)Y|!(+;bm5{9FK{wP)=+@#Y7z_WuyA7qnQ7=u6Ne zVeKdLYxg2~=Ns+&FoQl6?{d~iyeTGTT}i^)fjWsQwB~)M(9=An3*Aq`I)rF6s?e5CoI)@2lrHo*32T|tTsfPV zZf*om=|Y7hEEju~s_Aq>2^H^g|6Z$U1$Oc>oL}~s_8HYf-aQDQ@YSs(xZ;JF^t24mo|Zu}Et9E9_C@wg*bmto z*)w5!WPhv>7&McxE);2n6uOPIq}yA>Q@XutNLa&ZuXs(GHhz&DxDmY6%(qpdnS}v= zS35u_e%JvrdS6x)V$TlI@;8;ggCFv<_RjaAmE>>L`As@Mvx8VgOaS@Ib^af8ewO~! z9XkI`oxecmXSJWJF2(y@tMf0}FaHLef4o!?34 zXYmfJb$-jEdi?yf<3g+$pVj^noj*Y5chdP;*V|d<0hbbl9sX@*`HMm2BjWuWRc^6*v^PLDBqt{6oYfFG$$QjmzL=T$sI}l}J#! zMr`QvaASYG7cUija*`(?Mm@@*!mT*UarwHd@aF!KrqGu_0+TKq7``ah8>7^%377U! zvGpP{gl*@Q74KCn#7bJZVcI90Q7!EaLn^Ot%8&gfd(ZxlciBa=F+f z5{EC4xFRq1$-GJ4cyieKR6fkP9-l8!CV?mBpD`-oac3F--Rv9DgSZogV)a+@T=00D z7&)qia1CC2t3h_nAFYk2YY-#OJ?Rg(p$m8*Rn5k%CetKK2`mg|;fyzln6# zytrBp4;4HH%yXFy`0=H75V1^u)O=`vd|!(u49`>_gU^r2Nq8@xvOH>sP4HAdSy z8%r7yB6~|V)p)&$Ynk|e`R^$Hml>!n9ET@UT;rUP)&2Rm%Hgg<|GRHc-CrB}WTjxN zg>MMaOYgA$=Mlpkh1-{hp-GFL$~sC)?D9h%c8gQ`vl*^(-`LJ6eS9c|6TO=Frmf%1 zT|Mb{+R5X=0(htU=a{@AI-#Z3wOn2zcIR*lZ_RHq@V|fwFOKD+n0*t|TWQXP4$;I} zEM&|RJNTpTCKL)n1e|9U`G}`3%B@-U5b-TQT+h|Xb(l~9_1+3;KBQRqdVK2DR*;Ur zU9#6$@E6`$Vi}v6&#;94mG}Bvm#fhg{I#)kOz#KtLY@bW(AD^mobxM*Vj0CVOfS^l zC8AtQa#|hEvv43@{0VzZ7ZvxDi`wdVQZ!|yKPu=Y2vleLmlVId!_jiBOBVk@JROnZ z$X3l25^mlQCm4NtC^eE!i8| zD$tAXDL2Qav9~UZ2G>D@)9}p3Tm10H_u_@$S7XH2TH--)2@0VSWN}?8PM}t2j_2LuN+O162G~@x&|sXWI2@aMt>bcP!|aQd=c-`OEU!oORiO+rhOl;0xYqUJu^{dDc^tbW?*{ls zaha1|f9T(&-I%5Rj6c{!zvZ~tU_HOXkK;?}ww*og&RLf*4#tV|qSReNKd?V{e5{)n z;7Ibd=zDp=KD463E2aI|;X^Lj_-ouefy5)lsbF>K<Q z)SkflH|mO@f2C8VT{VvNi1M%wJ03flrJ45msN`1!Nr!%-x*h!j074e<#8_6#?cIAM zm7hW7yX#CAnbJl3biNR;Z|K%(VB(GV}5NVyw6%6oWw2{_1 z>iKpx@Pk<#u=s8QRG0paJ50hJo+#ZEv_%0}l3^`Yd=k&%%~ z^?o4#hkcUSA2eWyIE_qCoNCUhz*Qv>n#T7XAheh}Cy_E9N6{bQlQiuU({_+)Noetg z(j3*Te$w48@))}qC`p%PaHpxvNxT_S&Lg4q%8c8dx5f$}FT3i}QAX?$$WP}=U4XPIfL7q4nUbdN1;un z0!W34evd+%3MO2kjXyE*R;ZI&J?Ij8qN2*Abeg2xcded$=!(Xh!3@{gze;CcA+f~E z1+(iu19eJ6GcV=EG(o5tvoD`$#6B0o0%J0n-z<1YEMf;95<93PJQ4+NSMUg)JvIYot0MLcAfAG56-;3>c!RO{Y2R{7; z9aN0<*zfnYLkHH;Xm`9x$gOxoa)v*bXH7=74g=S6CtJ6a~MWKL?Ii7aa21361)@EFSY z6ediYh{!pG3dcjVP2lvOYmdg_hKSw@*FYmoZt@wLmYl`g25ug*v zu2G7Of=Zp<9_lmfl^2uaMSFtXiBQ^XTjPEJDLPsc?7|-e^y>hFUU!86J<|GDh5e7P zmNHxK$4~N-_&rdgwH7hjGxq&zRm;&w?}C^rZr}#hUdMnXy@DRISCF+_K2Q7KO6NP9 zx;27J!%Th_sLpE#DxZp8LmDku)ZnCI%+n&%aH$&g$ zx0u^NE%~P-vM3_-o(JZbR2^3RDt!?q6muPC7@2Pm^Zf=)R__nuB-{K3f7JV(Kx^*C zAN9`5+0CQCIU&7z4kkw&l!H*C!Ti`sFK0rpaVVNrKBT7HDE!GVjV*b1>jnOulU5<&#g16Xr)p3ypJzPaYeO2(K3vfsBv*%sp2(@(5 zxulTC3!E=HaklsnU56Hxfpy)$IxVsh2{;0rmw6=`5E!r2((mYAn9Q@ebICI-F$uyF z8dDe+#ooDF`}#V=DG+<1c*d4qx@I%(_>(b=tg@MIDslYv8g#4uWF*TrqvgE zb1_kfK2cL`G;KwB^A4tlhak1w{1VTh=FUR5o`e*kw-g^v!Mj;15@mneQ<8}6O@3h6 z4@(3sEcRE)n;!%NY|EQ}%yIDM=Y#AYX%^{t^V69NXfFGO^ot#z3+LO`4E!U`^4qS! zjso3*)5}{l(jPe=t+cgqK9YnsJyW#Z8ZTIh{l1x6Vt*CO=cRWm2oB1r!$)5B*oy*&OhUJwaePUro}M|(b2{5l4S z<{aj>$KNZ0U)Yvoe%B(6cyrE8w3`a_E^ir+Uvkc#Kcqy?R-^UP_8dHO*01K^krvDj zovTylihbzTl!QPU*imbtMfl$3;NVoewp|pqT+VhJr&UmimhTycx6rNwf$l?EP0FVw zZ`9jXOU(fU*zJ|`Bbh3$5=ro{Lh!H6B=mNBejGQ`F+zV~b$z5AR)-8JZ^w{p@wL+$ zpkwi@xWPRFCm~TRBfDXWoQAcKcr|Ux35f zKcT%szd>&`!{sGu2Liid=cuzZ{Fe4S+Be<7qoVe^P+Wdv??R6>Q+GJ*5cJU2VshAB zhL406kIuuhQ@smS9s$)_gd+f-rpELYmO<6qSVjNo1gHsL0Tb z8QP35919$?d%g+(^dXgzw%~dyj3G|8}U&?nP;24qz#6sv|G87^gYC}x`rgk?1J?Mb$nB8h#Gy@ujTfbo26gAbLqIm&WQz*dy`?;omKuo5le37hO1>W`$Cp~MKgbywH&0* zI{(_f&M~Ua3&aSA1QkIBt&a@tKeha#(B9al$_PhZax*{2u@A?|64(!lX8!yJ=S+D_ z<~W;d!&x5nI9oZceUe_I37Fb^0uI@bmJ+-6}rS9a$SZ)TYYa9i0DM zB{>_U!e%r7H>;e~rb^zB(MDv?R#pDVQb0dnB}EpkJhJ@sOR6$(L!0VeyHd9BK2CYR z+`?b1?tM&l;s}^GzTrp@he53f_`DWB&Saio80#80I@3xpxRA9@918N&ki_t?#L(CV z!_{aPazBS3Cz5fP$&maMPbM+?EF^~{?jlIGGr1?0cE~*$KhER=WJB^@ZE~wB>9XU@ zJ-*{Aec%L;JkW+AjQ@w^JKHqJl+DR*)A-LN?sEl!T)dt{Nt9cKFxENdI{fh%-*4d za9uPE0C!(^5SW|1(TP)dLF6KDY+#ue27%t%-JLwql>Xl6@JYNkYY~cyD<7ANhp2Zc zFAK|ndqQi~3e;8@o9Jd3o>ws=c%v0%%pD!I$b*kOgYDv|BV{{911n11bcfsKT2|u( z!oUcUTo6kS(&q6QR25?@;{jT2wf}^4xRUDI;(BO@TMOTS%8ZROYvZZ7ehkkrqnz&6 zDrhW6Tg(%VMn~1`=>qo#+)zo=7(W~r>fmc~Po1axR@f`UO8Ff@Fih5Pk$?vV5QDYb zk4Ha{lb+a!Rwm63ECNMnF%D-vu=8L*i*ZP~3BTx+%z5m*TTlq~&%=d>8v{L9oLAFj zZPc~DZFq41O~B@EK>kS(E%AzHPa)@|T=W6CH5+%j3XX{Otgi9od>1$s+@1nl9^KeL zhSK{6+$=`YB)sS0*-MFIK<8|K?DotuG@bJ3vBfVe(vS=Z3=4m3@!U=b=`)?phWr)6 z6rGr<$L`2Rm(Z=b3?(94WBHoqtE+8Ffr+LirS9$C`aIYbpy|!0XqEYBinM<7ZQJR^ z{$1ywa`_MzIPx_4yua4%N&(Xiyb$hkVXY_O`ADKn6?@K-k&$81SZkhyz@uB5aYddN zcXcCVy%@R8*qnqcF`iZ z7{%qDo$7HhCgMm7NiarWGg21TM21$WYXYxMg!E6S8d1su<`~aE>=Mf1e zL{p>1DHu9()C7)pzpcC9YkW$b?_|BLXT8^WpS>UV7~h9>9x89%2wYlZK3afgUx+s5 zq2*yD;tQ*;Jyrv*Jyxe@Hy~;%sx`c6Fd)1gU^jA`7o(WMpP<9!=g2C34gR(=@a^Sj zlX*V=i1FibV;p+2#tAWET}0M#m4SZ7=Gr|cxi@cV+5ZuXv6OpDf`%+mE9iJ0dRNgw zTWFyJUZF0A4j73KOBnw2;2IelcRuV%VVH#&@Qu9%J+vqD;(m*8g!#4A<6P;XT_?>9 zwWI~V@J8<|19iB74@NBk%@gh6$r_RBiH=CYFZvE0iW^#AlkMW*!TlHw=$7cHZ2F(@ z!$+t&B``hIj9&i}I3T4-cW(l(z514BxG_PZ%x3{&3ZEYljLKsKVqVHv4Au}2LCXQM z`wyIre2R(B+<`xk11mqs$aYqfov0??SzdI3nTkeBy#`)hXl5k%_^U?29#E!L4hCK` zF2pep@(8CkBuA+;=Y@70h6dNdvq7WCLI;%#h;$i+7jvS zqaRmoB|V<*n`gqPSh%dr!6>3CK-B&+l*jEeA0zK4ScPxf?Th>nd<$>bPxvASg0;kV zbg)3y(fFdAuVUVN(VPKG&PGX;@#7Ys{p(z*c?h3dMS}2B=IW$H?#4@KCsKKS2?J`q zc4w+Q318#-Op=Vy*;j#_#+{J2nFxjw=#Q!Z!K z$aOz*6-H-F@kQq&ILSe*8m@qn)mFh7V0|X<#KY(BO&9<}#hOL*r?$G#r9D}%Ex!X$ zu|ULnP^-8ZZ$;6Y7wI|QmmJktg7_!KhdG~>&cQl>kqo)Mfe3pl(^0l$Hz21P!ZHur zl1kp3Wxq6Eaq!s4uTpSd)bu{)6^yxXDlumaLsOZ~JvYQY^ASefc zGpiJRgeU^vFKPT40w3nS9C z8Sg{Pry;&1FPrwqre_W%D`CNudM>Znys4tEJ&$bYE2r`OfeW(Nn} z`#+5 z2m$CoT4=<7j&FetCT=LhdI$E}v_UV15Mc>+7$)dG<6lL_8<_tB*RM@O6}+x!>9ImN|`%Zh)i%)uc?Yhi39YI^lYQB&hRQoeXzK6{L`6VEKnu0^$Q z`3arb9T!lfl=yxedU60{LmrfXBO}OFo4?sbDhk-8~ z!;A4|sQIKN>%{5lwjIWY``#EBSdAPT5P1ofBp?DWQxHK_3x6qJas*_TAa9r0s}G;l zIuYH}Z*u_dnGf*BO3d`#KP=l+CJYDEc*sSaz(PHe%N=qsOv=(-q%2jdT#R(`pfh-2 zyh+ecIPnO*nZbLyuLBXIu?y28qmV7M`BY=VpvEF8hn%g#$ATOzRpi%K(PGzLR6|nl zW0!IV*h|!a25;;Pw5W#pcC>zv`mbH`DAM1YqKu)+KpwVXAmMXTmr{B;U*4B5(q)GU zkBbDDjnX`+@p#ovc*~U^{3{T^6O7gV0YIx^fTU%x8Mgv%yjlKc2G*124akA{i}kU| zO`WyM8N|3rt+&FNek@bi&dMUD<0fQ`OHt22Y&201wqaG`T`=jM8Z(5pT6ze0V>m|& zHFcA`5RF8AzJ4c-JWHZH5c&%4t@Ngg<&89}=>~JAx6o0gen^Ddq z9Aty!WCAopq2jH=dh1p)bQ>~S>XZeDWH77DMn+Lv@>GOF1{ULWOuXDIfL|R&aHNZa z4_!z;^blUMu}>Jx*_cPGMseDZt?~Ok@|09dVIg7DhNFv|&06I}XaYZTFD0(&h%Qoj z6jFYT3y{$t?mwcG^%;)VJ4?~*qqr%j~e6WI$lI zYCO&zWp7!{E|a{FjsGfNHvXb^jo*^oUugUkq_k~(??mH;lgqDeJSO{i51iqO@Z56! z<>agRliVtET^8%-J54PA7vRV8+xl!3HUYMPnY`dyjb9;B_~MH}=*YYx6hm&*F>o*8$g?QQ`Pqg@dIodE(Qu;m4)?pBTb%KE$p{ebtG&-P? z->Vgs8D^Sbdzfs(JzXg8GG~h<^cyLeZnol7Ldvsz2aj+^X&n^|H=fQO;@(w(*qu%g zJ#-XkS({SaonL^6JY;B61_pBjce{M8;Db8ShHY*cFu_<9jk=Gkz?L zbCNT@3yiW=$DoLOnuIjjUbULR!R(c((Spg|=#9`A=n3N;{8UD5<;xSg@4z`+bDS=; zG8S=@ytqZvAI-~y*Z^9C;d0aPDho9o@|Vr-gr9pe{dBw zn&SKn22Flus9-X7cygC0*OSa$<2JxKD_Qat-$c@_iR+j76^^4rj@;J3gWjms&WEW3 zliRs5R}N{qhO%L3r)curwk8$OgTlN)dHTu5nn$A;h?e66<#Wd3L*L&)5N!AD^A!;1 zjV`u30z9m+JAxLu2?Beg3)>KQh9a<*tsINq|1Akbm;^x}oUSc@%pRPhZG$yM-vX4f z=__x&7Q(S)aCvL%Nf45Xw;%+uO4kmqq^{K}Yviand=iF_b?cqbr()Qbx4N*d(IS6f zF4;k1qstB&+FqcmQIpG->F{)vA{%0T%S3BqDcGG9+b4l11dqqLTs-TyVyn4R7x zr&4P|awAJ1tAIfveQ9#f^7QZ zpfbU9=vFn1LU!-T``s+@;`Y5w@6EYPidSd0pS?F$_TEUV_b`lvkq}Kh%56&))q5|X zdW<7Wu66+l9R$T?2GF}wCtuH}eoULfr*u9|;8Pbq`S}C~T$h>8r#^hj<`X~4 zm{?ZxXk1D)QeB)cvADOC8vR#+q5!tschwZY6sp2D zL~tq$^DJ3b44_G9AsYI3F80)zdJ149J?cnWg1$whk=JecPC9S0zW0up;x*()UHEqw z;VUn%t{j7&(pD|!`C@3t;Gu)H$Omv=uuji$(=B3$@cXJ?oUDg&vH%5qk0*1aoh8-r*3Pu?zusC63`H{$YOn4OQnNS+Vb$k|Xjm7Xjkys^odQyLLE2J^bHhcm#5n07eh zO@_mDE=~F-xq@GUviNDBsgQ2!Tc}R=;iwWr?vqsTuY<2@-2dm)2ZXo4Bv;^di{|gv zh&zR$4}_@;MnM%%`O45EEpqc3FO>ji~ikluP%9;%AefOy2^2G0>6K}_IlIflV$jQlb=pghs+_$8Of zvGf+?0K)Hy<#+O2Rxm}YY{g(@zr2qHJ#aBC^di$Nof;KNr3xd@+Ov>iIU{(CY|hZo zn+4O|p_)#ZbjiuBprGu=Nmvjx2>F*Q3l>Au^jMYP7TrK`GKG!O_(`haY&BWpi;l=p zTT2rS<%X47Ixxdh6^KI##BJ2YxQk^IO~?$I$OVm<(h4l4XgQK48=)zs_!vmR5P+Pr zIb!{Qrc_=8ZJ^{QXT4TI!+6;;e*UEZ7~3?-Gs3on};EBQsO+xW3+g2zSspuvX?EMT-rm3AA~IUZ#hm7F=G`F%CVw_`DLRJ z&Jp8<76-i)9vrTeH_K|@K~0bttN=|)N``}hT4WMfnP}g7t@1py48g6{}9pKBGp@hD$P>E}L6TZaFQR1)h5+PvxwblAWa%Ta^kjf}b_}vD`2yJ(4<$pZ97x2* z_b?D)WR#upAK~%fixy^hqj{5f02)4kVF7pJLPky51@^W!c#H$)3?U)t2TM2u*R&DL zS1*u)xeg;!%wtM0Z?xtyOEBqdQ`zCd*Bl{atPCtt^LFqLn51@5uNZYj(FurR^_{J$ z^{g6yEbTT7qd`3LfrcN$~U6wlbEJXzSeMIXmGB!4m*X+DQvvxym$(}-J8=<3)wCql{txQ_dT#HKB?@nV*5d{W;m4x7q zRFyo9Et0X_&v}4-DZ?t+Gh^Q>rcQ^@lo1nTF>OV>0SbbfdsyYN_dn9{v46U`FR4Gk zDDyjqJfIz7d9|0l(I8fUV!V=@-kh=62y&O&Moyj?EE%yGll{+*39eunX=&uQ&-p-uuI6u&nw7wZllu1HVlcjU@%07kFerDOec zTpzK;zZ^fU{a$%W1o+`hDg32{agJNN7wa(dMd)h#yYLsiMX5*nved08W%d9#I&yN( zNbK5DP=T>gxWrhDic3bF0}6DQd`;=3RrH5pdNn6*dUA8RF>3 z(U|f}dHfvw%% zE5Ex2aocKZPQ6x92mWw;3%Q3>V{pT!U43j?x45)W;EnlObG{E;<}^P%n>aIQt84J3>RjWy!YJ$sFngMuK%#w@`(r~R%-D)s z>+yq`E3y(AL)I_6EfKN?{p^EiEz-h4YR|-Z0C`q@juiL9O0oV52Lz`9xy3M1Bd$@V z%jI^@5VL%KIRE<^ZJG>wWAjMsjZOQ~u1~ z(Sw+siAY_`8B*8Gff`}Iak5*=6GK$F2>?r+gQy*i$=ZVz4H8AUO*L2^gtrFFQc61HxZ0^2sMTnL1 z9OFs+;@XUrz~ePSEGrEggjquvucBe`jjtaPO&AG{p{=^R2Fdu;zT>b&gk~uEr;yxA z`YkK^AH#`8X%TD|Do{giiD<$)sQhR?XuVs~I%Yb!15$U9R9xR6(38|%&D|Sh4Gy9Z zjtsHNaCESvypZ++gZUlWw{GyPn)QPFX_orTYxS1x&>3O(jpTi ze#T!__z}K0cUs9ZgwATjag0{s5t(PP3Lm&2!>UD2l;tKS%H__PHx=>vt|b|ZWyHQP zj}T?!au-Z3L2LJm`b`itWUGt{8F`O+FfT_7igU;Lhk3Mc9r?Z>Fm;|5rhWU+3$(Bc z^*~&j#t3owJAT0Flk3cPF%>!JzHVxXu0?2t5-muT5*l2Ba*JfSWujc22L-u)kn2aS zB8N<5M9RQfr8&8CW(N?O@?5Ytcj|(v{@^7;wl*$SG4vh);nw&`7C5<$oUn`o2+p8Uu*E?l;7Y~Wa};(5MIUl1G{=#jf{-mtAQJ+s1X}`sLp!{(9e=;VZofD^DMNWzZs0n^vz@ zmmx4`J$7wc1;gjch-D(0j8+k1!lHSzi*eqCM&wQ}nTN;m#5ZdyQX}*-K&z+WCwKa+ zg^-X*d|W6Vi|}Zs;*Z52(Oxag6LaygPOD541xse5;7NEaJt24cbcSf_Ez(7_wr+Sd z>#&5FS(Q6$_QElU--egmlHgS2+r!6M3$91%=Xf+}DU;Y=Yn8VVK7ZbH9p`GPpnCqo z*^mZ)1_0H6#gFJ06$UUD@1>^#-AphogV|@zn}wKwg);js_>p{rpo)lj;oqVoa|5Lq z2oaj81Lu|afuv6zp@k8G-c_2(F#s9pMV^&RrJm!S6FJXAPJ8?=m=BHkDXUz>$H-Qh z=O~c}eX?Z6C=6ZVSh#R59_y$!r!SZ~3fD!*tUE}`{AKgdnL#|37Ua&E5x~oA6e>L? zH!v?)gr%d*%ToxBFBO$_Jdw>>fB>zLt7L||MFvp=P`pAEgP;MX;-#9IXHK7i$6QLs zoCQdYoFdB!eq2AB`MyIwt)hieICULk%p#5mfGc zJO(q6t2c9%%vy+{KZ}5Qi-Mlu005eSh0QF~BF{^NUomCw)Hxn4LU%vp`4@gfzm`tR zojyAV4RnF5Y5vsN1=!CJ;o_3n1)`>vEH2}UooPpi~lGITGNx4GuM~OtvhjK+ORej_csD$zxi>3a}2f^m6;%LO92CsPyURC{4 z&qqZ4vpBUdI%{CNR^in#!KzW7qRjRnmH?t`4z@$>CH-8UPn=q+OiUzr?e&S z{g9-ekJ8X*Qa|@&4jF#*BRfYrawxqNlbEGmYC^Xty+mhHiEcNZFh3|gA>vy~J<-D4 zQcv7!=Y9oGN>$LVxOBEs6_o$d%ap1pwzF4QPfF>{gvcnRca{Y*r{bwf>600PM4?Z5 z*ctNhL`t9kxlk$3*|~O+CaG1< z5K9!Dx=Cu52^2_b7U@qS(f%C;s^t6}nPH=Oh-jqtt`cZIVr5c;FC?K-gI{PDxSj<> zFx@cqkjCI&V7O2^cL;J#VvvgGuasvh9xd`uq)I{t5rb4{pF;d(Vjrslr9V0|lhhwg zJh*sC2&yIbVu=$zfoYWw;;)+U{=@3zgcm}p#JmPi7_?#359lm0?*z#pIqzI$XRIP3 zsex&=D>d*8i6lUnRE=470Y;!uiu64e5Q_99S)hP0sVAForXmy1WujE4yY0jQBB#*i z@7RecNEGvxTmZjf0~+xJxz{S5V6p4OigY!bEdu>UZnrbm;b~@-talZk#ry#M`>cGC z{J=Y7Pul#!J5QjT@5|b}C&e2?{wv$SeQn-z+Pr7Ac^}|>hm!Jnd*G|7p1l1Ldy1W% zLc5x{1Hyiy-DX0z4=evoh~#O`!GR3<2m02)N5FFwyY^KiEEhg$#An@I;Ek4Vg!;o*e?1j{ zeEq#feg>@&jcxK6q?0!`2B#q-;_;k8hgNgm#ZMwx7U_E@YlrIf6b^^N||1sJ#A{q%q1UcktYE!j7}Qp zF&=sxs1=T$viuh9&hL&;zGQxI0n4ugT#qgtXuSGVqWIBOcKJm|C_jJUg6S+@0C-_E zZ=hh5#|W(i7IAmarI__Rv6Or9j-!^ldC-H9g`VzpE5x%R6nAx(F^65>Qp_M7wRir! zKnd&Pb;EFs9cbMB9EvF{4tggYp?siZMk&jmrONAT7nIDHi!cR}G+wrdTZcP`cI~%G zj7~@m?K&K4NkP`Rr5>#iHkEI(hqRgC&sFH354AhXFh_vi0ZIK+n3KNbQ*Aj{sGzlf zWUFyE&%7LU0kK_=!YcfAZM;pG_}bw`zt5do5@0*t1l+>?ax(5hcMZI*Z1ki!jZqeI zHfgsTEEenAy&buqY0IYwl(SPIlo>->qj|+J9qpD=aCV+{Z@o8qbbLhv&$oiz%A)Md zJZ;r|HKO7WKM*l=^Nw$EAv-4!Ca^@stMX9qpI`(mHtuG+9@?DhSs@+^jcxem($J`f zcDuDz;w%tR2{9~czv=?Zl)TW6&$~CRkm(#GY$pyH=r0-bqCK_R?SCZ3SW2qn3aa0i zUplvB>ii|21aH7CRPxkp2mBSS8g_h364``8dSK9ZNRfsslXe}Jq}A@|X4KjxZslnp zOEkn86GOzaz(Z))=e0Y!P@+YH)qNT`Ucq-Dd_N$8v1@VW0KfSg@FUYlAbpb-TY}~C zYprlSGPx#)JdJQup6;N_dfAh#>rj1&4dy?bQW_Tl(D=5s-m>%ala9=PIB~Gb{7>6} zL!zDpHuHF(vd10k-J;#G0&C9t5XTh%nNM;FD%zpo+}z4~_S@qEejpSXF+5o1r*<9( zE#?w5UA1qs78{K1Uw!CtQ44$XW7CHe1qU5fc%%N1!?IrJ6J}Ne6f2d44l!3Fvz)&q zKTtkh;HNI*KbQbzF;A7guP#-K^hLw<(5@8h!xOz8+U%AcsI97~L75tS%H82MTfo1> z`HxcE!S3Rc7}_ve^6W7_$gBCbGXxjP1!cTubTX^09=IO^X&E3>w`#9R#QxPcMhqkH9P;{{foE0u$bwv{=wrUKH_(Z z`kk$Q7pdQ+@;6e(U;OjdM^?xuK31v6cpd!x`HeJsGwhCn8P-K+lmHB*(vtWU7@p8_ zL$>lO=#M8JrhUO6VGLUdH5zK_5s|M!% z21dqw=PDqP_XCy6xjm6ui&TU=A${0%3)Iyo6ZJ{~5QKA9Vu@;SAG>jI zV-HWXASK!d9_gux{QZ&NkK4+23x>(i9O7CZlz-!=RM*@jOfG__7 z4{m_GGB&)`Yy5!lD!AkCrmndDF$~(p7XVLmWD0nQ8SyCmgl_$hx8NwXqYGa(lLnl-fhQQ{PqiR)fjm9kN$^+<6HR~O-ODN9l!(a6&;omJq9+dxZy25 z{@J?+K@CBy6dIaSUQ8G7JC3uNB~qMydH1wlbmq<^5}Lwa9>>Bi8tDvO~Ii zqs9ZkgHFL>CEiP5D^P73i8dAFiE5h8XJZRgn_%Z#Um)A`xdf;-jYOLYWScfffNE2; z3}^tGf*)7>&l0BE6qRiXl@W%2@u&cYR>)Tr3o!@(iO+-Us^om>Gd33)wfoAcVbg=X z;Hu8;3a+s;Uwr=%`qw=lDj`?v67;QebQbgd61>g)u$}yg@oeNBxGJDoUf6zkbp*`t!-F9k zBCglx4MHXtzwC5ga;8zY#+B!C)$ZzwO2jDQ5H4_TweZm>fG2mbdfx_j;H9$7Whg$=7@v--Fty4}a8`*H^v4aA zSu5Rv)1r5CIU3oDeuWjih-{!@7--9T^yM-FdSze1AS`gGn4%-6M8^&^-o+Lx@_QD9 z@5g*c!y!fxPaPVJJfj6FHumi98%H~tj_ zMJ8EvM{mr=z9ZfbpI3|)wK55(ke{tx1KmR{U2*9)-mEZSp`{rJ#}9k5m0zbq-y-tB zhw-e7g}rv<34Dbnhdj~6kS9de!*n!T7)ExHAF$;+B1Zw~79hnogCeq0(<0|U--b47 zUf5`P5yir5e6&Kq;t#)t%e)0|cS9KWRrJSS1WkD#Kaea>^ge#W_Cz10neUb64-*_r> z5V8~+pZKE>i$~^|B;x5H*kewkR#61F5%5(GXGuYMm00!(kJw*1*F=&DjFEsumQT454_!3!OR}M9voFC{>ldoJa zdj|fESbtef6b%o8Mj9=CLz2pIn*r)Puth^R+%Ce)#qUi&h&ffhFa{TxA+uR6#HG=L z#f6|vSuI`|-P6z?u`TKl=&@4V@{2KfKi3W2Gbpa&K4v{yPVRRfmQtAW)8g~jLPMaE zn=*^V-OpKjXq@YD@5L3N?mZmRMB(XPjO&gif*(A_PiTMTODO0!-YGIZ;RIvFsLbbOZMFf)3` z!zk;Cj)&%X{&75tgD3`u$8tto^^Eb1eKxFNwL8DZ(ldFV4I_2WWxY#2(<(Ot79G*o z6V2}*9gmP_lQT26i4igDC~!NpKHZ!1trp>SqwJrQTbH(CF2p`Mb_$0HLYbT_BAbyh z{;Ix8uN9|}J?iS@@6`~gFSrnOxfoSOD{IjLC+pQD99GGGIJ6*!)g$<6?RV1BqpU&2 z!6Xd6)i`?U)k8RhBNchLRSHz>s~CV6gg6-rZO7|!z1ZV$_VgJaVg$yYgb@fw_iww= z^(R}5pBoqXqc4>q4~#%)Z8`;mjOK`wv~UG1J76$bTx2xE0rv<_1*1}wQ^C&Gswt?Q zgYhr;$-{97Hh?bpH=0fnG6dajQi8aoB~AoC_5av^pl3-TY_qcQc( zV+kI~UmhD9IZc@I1!UUG<2AU>vQUrSs922gc?wPxC|x*CSb;EqfukWnGJGW+8t1L;4tmhe__u$NX1;$$UWgIS z-L&wdqB1BTj%G{;&|w`&gCzpSA?#)=`+8%tkzV6J{@AiKAsJrGb(vL=(j>WXPduo* zyZJ)(kc)jVQ9*4|E>8SKxtQea+3l@WvS)uuF6dw*gse?zDOE{wvArX?C3fi4UdBIFB#Ccb|8ed!8Jx{d@$NJtUmy!nlNw)BM7 zBNm)gEHz+gVzqE=ObYGHPW-W1L?7+!XR~%(hFE1-ho#f!f`=} zBg^2)nA;ZZ;@QXJNWl#EDqdRq<^GN{oXExH{C=Ei$_Xx*m=bf469sM)1=2(Tv6jT_ z$?qHoR*2$5I|o=tnzN3HqR5Af>^efb4$9m@GN*D=kP^HqIyMvg5_+5)_lOa+5=X3M zFjd2nKRk@T-vlngV#-S=L(cBw?#JgIxt`mX2kT-D0khMC-LV8?K@ z!k$C!JY5EMp4Gr`IsQM%YZRPajnPVnamrYmlOY%Old%(k@9WLUR^uWlbN|!yRyrNke0pL*)=8&z__oao2)l_cNx%&&228uW_1xvN>7vC zOaAf<)t-HMDH(x`eK>T}qHU(4rDxz87Mli(1 z*=}<(sKbCnfWPO{(8~;G6^@BC#9G#4!@w`Oe(_?v2N{IpS-HJx@G%HKSFw;sI?C(O zV}ZPN>|mo_zpNWp@Z1`7Uzj3S4c`VorjS_+B4H2R6>DnLCMP*4gH!M#Xc&M8Q9ZXs zjG_KGdldxuW4R9sj=v2@IId|gIv1}qtD?s;c4n#y)5ifXxy_#oA(10U978)>spVodSUT<#z&A;MqA?GUW ziKkGs4D!hE+w&X{`Z~s6eww~}a+Qv#<|R;R9AH;#a7LqX9|tNX6dq>P0S7~0#PYGw zrURw_wv5JOm0p{P0HGNFK70ZWKZuOlYHx}NI)OPw=ivupS*Ha*4DHNVOLZ4`7YZY^ zD;y#z075iJ%HUke*lI&^6LY*h!s9_*B4A?nVH(c+cV4XfX&|v_@UO-vXoAWE=`G_ z2cv5E4-OHI(*MYO3VBdQu5px_h9@|}D8VuR9)SV@J{aAD9kv`*n?K?5G@ebWgU)nB zTxvHTyzQJ1+MaKIedxgd_iAx+lAp;u>!ZnOPT6CxB@!LMeqenTP5?2R8M9BMWHinQ{U(T6dKgc)DLE4ICd zw8(wp-lq%)l2m9Li?Jc`AA|RvI1|RjB{L1E>jhWMb)YX48QqEIs;Q zzei7SuDIH+J9M1;LcS`Y0w7-x>ec6iOcP;qlXUDqpT!v1fIETOsEOydTRKF;a!s!u z%);xiJJPHB^RZey9?M61)acch^6?4rn8Qa#$kwZe^6_@@co`qd#iNIhrQ)%Gk8{Oi zJ|7vFORv`XI9@#dhK~#vqE~Z?VO}mC^Z0n7c)XmCS>mxbAMqI;d3*7(4<2zwZH7!H zWi!bopqKEG0d4f^3;4K4JbL-a3zYQg;e32gJRZZxP2#aHAO9&H`|$B4@tDrXmE!SY zKJwxWz4{_P-X$I{0Z7_cGkZgXtNR5r-#w0g79g{Lx#}EmZihAR?kTv4yXP%6PcgR+sQR6e-@W$?B|HXUk$H8=TRDW@M!LImOcO0TwN&E-qH=5%I zLM{1myuz{vD+^bQqNXn@=|7V6+*(d!QnkhZtbKF0LQJ^*Vyy z-GbhM4d!!z+QHKC5WC{Bn7*T|5IE3I+kEmjPqrS*^JN}p6_y`ZfAACz0jdl(BIKGA{?)BQLLf6o9wD1$)3XKFe!m2N{ zM=xs`P}(gNA3U`ClH>K(_f~iYo(-A7rv5-m;5XVTT>I6y1?`G_9MmwEBIvut=XKs` z>v)^33k$-Ov$H-5qz|bvYPoOQkkUOPr=esodj4!}qfu+rmGAr<|H}7f;9q&O@Q?D; z8QsJNy}m2N6;qW1GwSob+S>URq~9Vw(wt!TXYI}u@3gHxRI|e0_iP`6mhzeep{)60t#UL3%a5o~+k_=!I3KTN&D~4;Aj9i8naC(>KF*`%<5msdvs+qV zE9VY81;m|zwDFG)oq+3U5PO>=oL=6zrwQR6yuHZcb!2h2H>YXw1&p9NmWi>n&f2P8 zJgNFT6xW9iC~XMs8C=%Vy>z2Ii=Yj_HP=#31TV#lqcWt&^mm53OLG*H!r!p7HlF6f zY@O@M;Pkv3DcY*_#^&xD%bGJZPlM5L8rt@`iuY`6F57i}dCU3p=fP|1U&y=UBD|Gc zKT8YO;;nRaH65mz6r2@!6Tj0J%&orRh8wP0OV?e^Q>XA$2j|Tg2k^WZfxuIxI-lkT zWJck~iHt%YSJRUR&{+$v)51$Z2%bx4Ojju3(ngeMS2aD&02AJ1R2+C-R2MIm2oVrx-kpI`IrWg(6h5Aa65fjRL8Z|EPH8-cc??$EQ@@cwuZnty;Jc7!x&zFUG5m53D>8 zrGGOp?Z(0fWnV;DVF07BVTVF~#4iLo+HM}CCI(M9FH%3_WGW(xKq>Ex-+~PtbMb2^ zAb|t~;n)Pkj~)PIS^_dcK_*Mcm;?lYRz#V*B}7j^j!}@eCFHyW1WQR#hWBKnp5qgc zT?*19A>9&?jSA8i$22JO!#iYwXwUNs@;S;toKiAF@u@=xXq5}00;5?}ct4hJoaxyw~Lwfv9_hCm~m@j!1INUkr8=nL@80CSB0q2O0XgC{RdjW?z$9iLE?FG;})l@xZ08+B{ z0%(nDstyr1ubRpM_avp<8N0%LSsyJl1$oL3Nw3Uj(L$|~-+F+&WDZ=vF9C7Y84IV* zV-|Y3^7|aF{i<^V1DaKfKBes;#jW1uEiTr{OSajp1ZeF!c%qE0Jqn5&tD$VXL#=yo zy(AR-s3P2y#3dO%3>9VV^5JfmTQ2p-mbz8B=J;}!V-94;_i)hX&-%{G<6qt-5%wX$ ziy1Ia=D}0;+QsPhA)E461aM)@bD58$KI47dlfaWTu|GG~!ydx;M`kr3g<1dhBU23? z8wWbps9_(PpvSIt=X|E!{!c(Xv7r}uW4XHi7&XwB8Ht;1kqxne<){ zP>Xh*k=3NWT&nbtjEeDUIkdBX4zAEY)Nb5N~u3srVQzgTjV=AwFvLHKcMl? zL$*=})Ix5Icu$a!VTLhuhit9Rm@~Ds{Lq{^QzvNQ-yw<5bFK`2Se=nEXPJ2|QhYdM zl-lw;b0J297ctNBAoO4fH232`#)DRQS|J%>X>=|8H?&-^)StCOGC3PEV2_Z$L*o<~ zhs_=Mh16oY;+$pn0GSZH>nV8G&oU37@2lY!J=cVn2Xx)xpR2pb_};3%@qD@e5Vi|F zgBa~a##=Zfsr4J1AS3a)-QAc>{FzNu-N%8_LSsLykAm;$Ycj?R)1e2bZ!qo0dS>H6 z2!S6T+bN#7B^67D+Ufx0LkWh*c*m0kJuG?QH-0KI>Om|G_TFv0I3W*y#tUtZe}gqY zmX9YJLHM1#fe$@1T&1|jsve)3)~Dd|tU$Nul9b54U_+rXLvq`1>~F(xbCIxfw?<6H znBm3th#3#i+6%C#z#yGB-(1C>v&U9O;gw!HC;gi-EaxsT7lG3hn;g*Qckd8G%NzvXv|4!)$; ziuIePGXDnWT&(*gnS8ZMK0_s!BUzflql{Mp^Hl{8i3LEHoK5!Z_X3VgIh%iiQH$|# zY65bff;=E0Jrj_dBqUq}Y>Cdy80To~8hpA?d_!@PUxo7VwOu6N`bau%P2e1)a5g8) zyMJ_%&A%DInasZjH%k6ZQ)o-5hS?p0e^kokAARUSz;c!OFiynDKTRetR>@zfMkM#YoKg`GTJkqmOuI3FOJ z$G_bmMSf8y$zwz=Yr|uBM>#08`Jz<>Vc$!cN#b)lkkfy;-Pp=qFDvS%Dtbe6j;)9A z#<6ubej&4`tISW}dl!5Dw%#K7Sd|=A$rs4vRFxc1$(JD69&&r%koDf_mJN(UE-|<& zM6y`0ANp1fyMC!+*eyyxb}Pu~n6pvlssv<{goOW)EagtI>Wbt3WcBh{og^hikun@p zfF;jb_(Z&s1;^kQET~tRANxkK;8Scgko>AjUZIj7mdSrp$-h&{(`53KD)}mve2PrI zUnLi)WE1TJ?x;#WTP3fQ$+xQHekysPOkS*#594T@eZ+k-kjzraU#aAuFb5&|w<@_o zCBH0_N2}yDD)~m4T%eMlP|26dwc5ppt9kOm>n=zFH+8guH^1bd@|z zC2y9=Zk2qVN`62l@2!=6)?X#hl*zkQvRfrzD3jk)$$Rk0iahBglh>={Z7R7TT~M-0 zCI3SuKPr=-QOSQ&$@66L11k9rm3*m8HdOKwm7FS*Z&1loRPy_BV9iy@K9&5GOrETg z&sWJMGPy`4AFq=0Wb$uRa*9em8p-x}%TmCTaD-15498%^*f~Zdi}4l%&p6HXmJnA0 zvRFabB`C9}hP)SLu2hhF0kNxkN5GroFCUUsHKOS#_EMtQDXQ2iKV)DI3M&RMP! zpmww8&*7SIWL%g1x43#78P~Vq|9?dn?Ff$0#wY( zgf_koP&g&gw<+ynft6gi3m21Ywlh(hsL}(SqV;9v~(&{i@DL(m==6-d6QQOEkMOh+-FU) z1ur4H)dDSi8{W7|SdL%RJ6AP#*_U#{DVE8TRq}Nz`9$In{>&)zm;&CcDtI51V6X>7 zve34TaO$Ent_tV!T)^HN_r)8;I@kHw7zb;Ebf4NopkxAk_i~qnvHrgPyTR*0rmog7{{y?3I7u zOw$@!a?1L1(kW+xs;k;5hu;ISqfTejN|Qkoban1CP#_tnC(cUz$SLXni~KPiD4oqX z)!B?$ugGScu9|TXR*K2ZI5lbQXg5QvpeJ9urfh&Hs+p0#Wl$gQs~X<;UNY)q4soiW z9u(OZ@kSN&XZ#}bYbx_@{9MkXh8&v5Bp`->1brBNDT&m@GJn{UG>(!a{)L^Eu8HBa zLv)Y%cG3W``P#v-D?#Za^yNegangyNQ-Cf?F6#c8Pzn_TqTKz5u2z)#ol_WT@sGU?TO0Lt{i1BSeV-nvIE(J*P`m5vv zA7^v=S(zGfxtcvuIBWO;{p$cZ3vW*bIZM5k404uwA{pc?RhbNOmYSCga+bOx8RRT= zaWcqR>iA@kvy>|tK!8jd1brP~zQ5O>i{$nT{H~?UN%`RSl5c;D0?Y8~kdcY;c9tuP=&Z(cr9)*cHL? z=%B|FseME$90ig#Xf{=)C$(dPj%pO-JXE7 zZkJ^6oH}2^x0NE^`DQInuXPabs@H&uxL4y20 ze;_phb`>E!*e= zM}a_3cS4$PZ59d?E(M9z9qYZ>wB<7hvMI49-J%%X)K!Y7>a<_zz6KWsU%h$+1pZ&!`S zT{Lc-F=-X2qMGt%8U|?L4*}OIuEd%Wc`z?&VO&9gl-ETHC0+~jWC~FIDqKUus{q!5 z!?3^W`FF@w{2KT^D0?1EOX1J?iHA%Pw#0%y6!naPH5DBLOUK|1CJtKoAEKHnK}v?d z7%BINlnR_7Adhc6Qm&H~kHK?f7}BkZ4M!8;37LNEtO6R%|s$;d2r0Z|IA33*(MI1LNIvH=>=PY!C7k7vffr64E^aZ)0^_ zvocEHtdR_Z5s4Q58i5Z0^@72XG6#FkC6$*G=Pu~jggp)N4j)y7_M)6taTxPBQbt{g zlHO&Y)52Yig;n1s(ePS?UIqVye-vXSF(!Nyj>5#FadiS}gz%j&QfU8L-c0KjE%LYnUmv!&^(WwaqAfm(WhCIp+n;&2F)u^o z+5P7kjXPr?rQkCsY19j4t3~)d&!W14R6od)Ls63UzQ~n72J}vcDC2qDB+!-WD6yC& zX0ZhAzGhY-&j=k?-MoSPLcXsYJw}VXk6yIuxP&DxVu|esVX@Xsa~<$Q%B8mmW{@i# zxi4n!Zp_V%x4`e4fWdo@%0Cfuw$zb-%Sz<`;78=Y!O9Q2DlIb3k>_sad5L)@Fpsb^ zV>?HT*243kE^Pjc9s{Gw;~XUsk~u2>)V{pH`R%M&`(0^EC3WX8x>6+u*7DR5dAyckNjbaKUd-{ za-XBbpIPFky(sYjN&x4WQK0J!(2r*?DVpubJ&w8SnfrPRzi$Gjf_r5Ci8`=zrdg}h zcp>xO&-}bcMbI-w9|ryC$g}28$g`Mvj$s~)KfW=z3g|h=r7b_Bu7c4n@8__vFJs9Z zmi(mI;tvhwKtJ$<{&8b`kpH$Ny0OHcQ9{r&dIa)kq8>56#*gv^Z?N!RO8g&wkK8xe z_+eKFx~5C~BS(3Hek=Fxr;z(E%sq;@t#-h=5b`7Q>-oOmKr8=y%zq>EpJ?YttXG;_ zVgh_0bvJ5o;dFa*X;>LJH`=#0XItKGl5|f+}%^|>4CHykP1ZjL!yQja= zpu?nCd2?u$Dd;6!`mNW-(>+EFJWdiI69n>p<>{Fj@LYhmfUz#L^Yf6Ymo*Q7si9Wc zfDB~^GPFoN9%3V257lMhvei@1fg=jyfn{dG8)dT|D}G%M)zE(kPlZ~3gM9I<@MmTq z!*$h51o?{){L5Ji@nj2=7n0MmVo~7Tt_q#T~*}U5@~4Eer)*@&A0G#un{f zcm4;tW5{jwQ3+{$lc@_Fsau))3R5RJQtx8wV@%CQYI}NbCj3^yPjQr5`$weCVQLyu zIUiVcKg|523E7KNs`mKi5q=)wTRVh*P0SkMF9L31-N4l5Z;<*hQl0e;BII*ImUoD+ z6XCBDew_o~hmRxmS*H5i;5(1`?4)Jv(d?Dez9r!*XzAKq}5XN^-`oV6 zAzZS;$3wf?yHM^whjQDQ4Yy)!1v4<#c}cd|62_NpqDlMCcrO_Bd5z9qqn3v0K-MEC zkU13BKvFZj2T}m>8SCR&9|CoZ_sGHzqdtBYUg_@24ceo~Dnh^QLEiWzK;XaXf}`0Z z0Kl*E>~p-an>*!z6tYrW^A*{IPswvH2YYckAusK~3k*@I64gYqeE*?%G|cZn&Z9 zop3*G=h|I}C!Ffuh+Ef@cyEpLdL6W`%2~b)<-K%W%}do*jp@z;4JZIw27!h!s&Kh1 ze@$5>9b@a+!-b+~E&c4m_oHjIRmH%O*BwD3^ez@9Dcb6-KswXoMpxX;T&rtvUA#Nz zeK<_vHQFs}uRoTuDyL2x-r%d<(aAWL4sXK&LSWC4v6N1uW1dcZ5m1w1z<$uuPZ+Za zJ`M<=kr-cSKk6)YGhhJz-^36TzEEvnogCQJ-{am&@PF`{s-C~auWnrNHIfe#)+#}u z6{+7L;YX(agu=w33hi?s*pIXyv@`2|(5_sE8;pDDP00Tp3w^H*YDlhlucO=#vfO5r zd-DgaZcA5f+-7ZjgEnC^2;WLfz8`_4iI|#`t8a0jIUv!1ge$jcgMh7WV<&A~tu}tM zHlbF~bI_lIGjs04(HrQNE1X>`ePr$Rj34(Mecat;&Sq}RZ}nLJ!$WFAa{mv;p^=h0 z9w5CNFLcwp8ivVh6tQo5{5df_au{6WyG4Cn}^aywDj{dbf(;?8SMsxyV@zB}5 zF=t)y?ZTW|98TE+pbhJH|3}?%vr_sAr`FT|@8`-J-LzHty@9lkHC&A0DM&&qMu2N} zojt5Nk8*EB-`9w~*Ln?4Ltf+`(FHvZ`cOhp*44`1O=L%r4!d0IH5wJ=1IdV?Y4 zXw(D-cLOSG5Ql*scQ;5txQ#akOD|{-+~GKU#j9NJ<31|`$6n^0s(;&zXLKgU^E>fi zYbPj5;Wrz8LU5fOnb#ek{>F46DfHGwOVN)Q&`=X$x(;$YyBl)e)G8mrTlCof#ooKX zM^#;m|1-%15(u84iAD=G)?gDwO%z&2L^EUt&)|#%0mVlZi>COh6ea|GV8SH8@pv?C zZEb7sZF~E&YOl7nyhKgHBLUO~@WI1JK(S{SA0P@5wDbS2ea=i0)Z6yn-v96a`G0=- zz?^gTd#}Cr+H0@9*4pLUxe?}~jm8c`ld-*m!1T=h(YjnJ*zaX3}_{uuTAJD68fo{({8BD zbeYpt&YaE^%bd;>%baFD_nFf&6J<_UIdi((AttH`%;`)%=CtJdujaIn6q(ai&YaFv z&z#N_b0p9aKphn0Lsi^=F}HhwcJs3gri@3f49{mKx7z1%?f7?JVcf+=u+O~Spya{n z6+{Vx?FFA^d8B;|czWh`Gjs8jpk^*thdVR3QH?k=w@VDJo4(1XToHA=s!!Y@%E&Pp z9SZK+hBJ~fZ#O~_)V!6KZ0|<)jm+E5pm9tZ1$1pf&KoZ~^Y-R7GH;b_`4{9jF7wem zCa!)Q&7=6`Ta3%31CnWIZxB;U7A8HfPdREXOFIU888>&#wV@O66;VT}dU`JJE>_J} zb6JuPRLQ?+sI{S&PO=Ze#$2w_IwlBT;gNZ?@gJDd6N+UCR+4sSK0EIXQU>F? z@+HP~fjh2!*YhWiWV!1(t+*75@;U3d<9)$h&9~Zjk)^lQ4j}zo=iW#!XnBnWUg&E6 zZ`PJW%Jn?$aooWRYUDaVUZ$&6ewVEB8)5+ngzoKRwHC)DyR&rfM$knKrNf}O{6)!C zX?gw%x%7zcsu1WG{oDRxo+r85T@Q|G@AHR0x4jGcv{x}9=|;=wtF?!TB{(jPm3dbi z@^;3iur5KsTGO}9g)DtQz`vpX4DInvq<7nIO)c=@$X%@?mwNjEl_uA=d`|mMl=eUB zw*M%43;(nUl56MCkFes~@|nYvGh^jnuf-D#Gl2n_-IMb|{N(T!K8C9K2x#6eiJ&KH zX2K0g`QG@X@jsY3~4s=}=2o+MfsO*5)nX`AFD`J{~<<`uP)TeCJ2f@$y(H ze%Mx*Ht-R|2v>~KG3({5D`c!?b(704hK3AVZbsS=rtkIz&y&KsUvbg5_sFbS7ixZs zs~SWe#l9p3AV%+bhOmP5TCXDLPt4s8m_pE>P+q{;!27fu%DT!o(JH)8Ko@{9UKSGesFg2f5bNqyG=Xp3 zYs)oo@$>n-7%zb=n@d6RTneem6Mm8ZZ>izf#c;Gq@E~V2)casJjQUQOdF$(+bO3|& za-ZY_-Q+_^zKi7fT3LJl9Ey&S>uooe@HOpgVPU(qY3i#UrYSe8?_~80$tu%W3Qpi zf}Ckj=ki@pRH>eVXw!2};hieAsejSV+C1;<1GpNbH5*7a{L3oY>782HX6oyrMO#(5 zWv>Y1UDl>uM#&>#nbzbQSu&i>l`dV4SkHFT8r?ec_SGWW9R3R)QS+-&L6Z(*0vOsC z4-A`Emlo6y)Xm|icI81ys|RSyrVLDDIajX)w2QbjY)vj$aiRD!z-6{i)?;;tl5^*g zoQ=lU`|QTNY>zSF6KxqjZ>D(DW$4z`@hrJx>3OY8@Vv~ybKLL>?x**X%9n|hOZQ#` zSQ`^BsE!CdHU7dpYIVqFDUiKtaNvi1K;|DWui4&KUB~aAVg*eEe{U_He+4P0uE#FJh6t2d(sJ+i6 zIkc8mR!CG7hbvbxy=6yIVNbZwM<4d1l``2rPg;jK;T)d!^S2(sN5NWp9GgzSBw5`_nJ2-0?XXOna8(#qkv>mwQ--&@9=8 zuaj-qGY7I{I-GeP+U5acAJP<~O+>Iq#x}O~%pc zNlej)1SGGiZ2^B?W%7eUvbSY|1+?j{YIeP#o%Qj&vfkO%JF5cPR5(_qYuU^Frj_A) z5LbXK0gyF0pMXeBh8PA!N^pfx!r%`)vat;)xrLBHS6r}-^NBPW>9cgpzfZdeS4)a&IS#mEOMK3LQn_~S zL$^A7_68qx>!L59TZfLKTS2WXjo)RC=Tt&m{BB$;)1emWCCc-lkw z`3(IMca!#kSuXw3_>%PFNt(z~pmXV01tHL{avqW(0D*&kt&)t!+Qgeezkct0Wa!rm zY5KKN(XSRIKU_72VN&d&{e!j8a@IDzLzpg6rjm!=QI*TXV-~EhD)4qxaaooMEOwtI z?z7B&Dhe)p9{54{|IR$w5r_=3O4hFpd}rj5YQMv6oRIrt&7tN{xYj}PyYQHOaSuCC zm5u(2-^Gf+3VdfU35ph?KF$&5FL|Vj`~`z4mUScf9Q0UGV~0!U*0|@S;FC7`T0 z%CC0c$Fy=^AU?9x%RL=xV|J~GZv&zUg|{4E>6B9-^5!k2xw!JGJ1Z=Un0@{l@$5<) z>~nYn-2HMUh7;)Qo6XQj*-eYDG2I;f(J_NboJhTl53iAM6~nc`sJz9hGxOW35of%Y za*06LoK}H!1wVzD4BTE2G3Vq4jL^u`R$-~t?U=aOb4x;%Ykk;^R@lF0@eOx`6yS;F zRlz=m94L`0y3MKGzME8uQNnq*1XhT5O+Yvn)p8bbK@U;1aQ3o zz$q7wBIHtXbOxeV9-NVXrK8+^m~zgwQV>@z_*%---rklzD2Q!<5~PZLJ_N)t_J!do z6oBMKfoESt`@^Xb)5)hb%>*(55J(N&S7>;;NQOC8bPlDcScdZ&-qZOQ#@o1mx`w&u z6vPP>lcOdaWdXqbll+JxreX@)DsUgsW)Jy3C)8(jISLeI6rehiM?<)jMC$oRo zsu1zB-Alck&Xi88ioA{@d9lAE`P|MYu2ux4D%0h_ijfX}eCdx0KdN}7ie8qi=`172 z;!K6F_9^MJ%}6%Nd{X*-WeQPV6f8MQVM&?%EA~PS&09X+7eIQu)mBzOfTV&OJ-D zJbOY#?8`WsSCfU5=w%Ghx9-O8{J@E)7PfMy^cp8KRQcRBNIAB)1g1ifOBxmwcscv4 zJ3D?j6+68nP{<5P*)8kYSp%IDgT`*hr8>uY%KdA%a{ubF7LFDtcGB9RF9FK8V3T#r)_WM1={xH`481!k&tD_!N0~eo-9e|k#w>yy3Ydl zS?oSb+-I5ltZ<*Ie7WVY>5o+GT=g_Yy21SZWxq9r)rfV^{!*rov2Gv`G!D@{`quWo zbT9r_)k99*dKBidMZ8{)ZlIJ_pzgnlC(9KAB z7qMIW$11nWyXdQb;Ll?XWkq-E~7QTJenw9{xU~Kisx#i9Tsji6a zH8zGjTB$MxMUW;cjBXX&ImOp?)fyyMC!l%D6!Gvlpxu_m|A__sTv`$_$5%wmiDR^( z5YQ@4)pTC<0&QqbN%G;(u9qbsf6!QCYz{QsSz6%1Z_Ve-0GtTAGeB4{)B%YN_wH1YJJh597yn*;@skZJse|xOXT8P_0Zd$yg19`=rG5?{v0{)L; z;{vQp!=n6@xRBeB99r9gKT>G}v?l1^cxN%N8w#Om3tRac$5t-b1>^|73uyL$e5@Wa z!+RI%#P6R+ek*wD|A8A{PFYyyq3GZKa&-NVrH(po7+t|+B(v6pxUi#KO zx{-`pzJt1Vr_ArlAP4GB*Qkb`NjK;n{ct2U-x~xnTuy1-&)$SFYrcYKVi7-m z))Uz;*q8q#$7LGJ`mQxX2l~ll@Btn)ufuix3&@TG@lR59Q}`Z#73YccT9H>b3`s zTJAfYTPSYR>n`Js!Vkv6Tn$6v6H?+)I8*j&w`{55Gv${aUH*Gf|NBz@+(H)akpJyD zv*nf{?u6g}G>9(RH6lu9%X`>f@xvTA8gBL=oGr>o?%sk*&MXNS8#Bzs*}_~5scnf} z@OgX%SCGBKtJshyn*g{%n5}sjrjcU!6|b)kL9pP5DG#UR;bC7g+TDkUW6ewX90 zV&k~GPHQ^k!&(TWN#7EdC* zNc|U!T?2{`{&n*%^1m{#T19>n4eKbojuJGhtisNanHBKAqAk9eU|Hgf%~5OErhqwE zPGY%s{}7yQU&BiG|CV z?@@DL)PU~*YZ+<5^u;phDiZlCw#r@UDP<7;411&{ZTHI5hoVu_K0As zghXL(23kru{aNs5=?}pX!z-OJ2PYoP*nLEep2V;Fln1R1tMtsUh*8Yc4EVFO#bRtD zBfbPn9qOurdQu>jM97a;Yo>n3q;$g5Su#^b3Q5tL>6d2U&ht4)|Pos;m)9W}FM0z{30 zY>Hkee>oxdm$`TwH3x7deH0g~$!*eZ^_^7T%jG*_=3GIYZg={VlKJjD)0uivyzxhk zf`AFBQB-BgBLc$~8S#*scu^4GQ~8{x5a1hv00a3yNf@5XOZd6ABC$|`DhM6ndKY1i z`%SjQF{`uOePdw7V@!PHZa1S?jNHwOesrp6;gLaoChTJAXY$XApN<%IVhDu`etwr= z#s!o)grPEc8ex4)JF2KGIy+IieW`T&$_lkG zs5zfFQ5D*YI~O>Wy!6LDZT$uPkp3(M?FBzSAWa${`kbD{-up@h08*mBJqq4GUKe8_KWi&v%#VB^ldYEy&~BF2f-6Ns-UiU72*U02)?bZMb)>>aEccM`9+{dItzeFv)s%{xU# zwhltcYVLneizARDfxDApkVHo#0}r!sfPQKrq?4ye+tj)d@^94QVy@a-udkhj!@o{j ze3mNBT}@dTSX24MKRO#}UZ$4T@O!l^7oPN9T~<@06F@b;q9`+PM14kUejI`o8Y?`< zBHt0R`0U;VHBtJgY!|9LvYxJkE=G-)6Z`tm$FMmlVmu!<@)BzZt!;t1*zh># z_5Z0Vs-n!Im3&8x*L3sPFxN6TiePkX5Sawoz^ufzl2?td=zmIja}aO0shootH3mnW zZ6n`z=}h)d6`lDpk5tj|hX%PFiGN-AF9)e+FVFHMzN&a4+A*Y((sVPAY6WeVgjIW; zc5o1%2&wP>-Df{u`L2U^hP~MiS-0fm2L12O-5+TDln!2~Es@*uzpy z2P3~mctBKmvlz4(n;1WAVnna}{5DkDFQptQka3E8n@?HBiJS~aZ&o28<*kCdv znni$}_$EJ4$lLx?dcbvEIn(6LC`epIqjhuKWqc+Y)O*fE-Xq2i-9!|botWeVjwTRh zk>haotFqID&YdCLV~K2e!^RZ0yVb~dwh=y4DB;Z|iJv=J5C2{&mBNTt7q3zO9s(oA z>y)5)&~%ZfO8NbYl%k}(nI&posyUJ9afs;8Rmsww#qvgX))Rrr0OvbOjff`wz2jZGm;^B~#O zJmG9=D4_mX7mq~BWWV&JL+^eK3WQkm*xT4D-r19gRH|KzizqD0q;xh*8$#xB)+H&$ zp1(wl&@R-pCRw9i2${zS$!PjdiX-RT1@g6|g)id;5%+WR!*6(2GN;aX42lXfglv9L z<(3xsl_0A?^-H=|{W0vw`%N5B0e;u6F~Pf!{9JDn8QOBoca?a+nS)Ld^O zS{jwJlB~jymcf67%&&#~=i(1s%|hso(UrKF_YA*eR*zI&jZsI)yaZ+iwp&r$wq5Yy z7qb>$#m3@@7XKb8ggK99UoD(>#Co8#fePJm3!9_7`k|M@#;B|e8BGd*9^>K&#Yg35 zM^DYqiWvEQ=&Y*x4;1W-XII$rwJQF+M~jPGsxN)3A z6sS=3TI2>x;*TGe#6re${>H12G-=mv36^#_jgt1f4Yc9Dwh@z<%DcPn^gQ8A?oOy# zdU7Z3;)Ar0N!mwy`*D;!@4qFlnNFGiUzOLq^SF}N{Q9^5S6=hqk=NYy8=3o~YkB-% zd5tT```5{9&iy|kulez>ob|Ef|0nXA4ZoEB{NwVPAFK5LBYDjaAN^kU-nTiB>o9`&E{W7zy8PantS>d zY*No^}$$urU`OJCSw7}G9uDYFb*7m$QXuC3f&=x)VpiQ@K=b-H|br>f4 zG}pFP9_-6+Vdb(W*DkE(yluVie*=Fc@ea=0K8$c4#!<%&g+Zg6T_`qGj=EUi7S*=U z6gDuN!tF#K?FyLqaaaDF)!%rX!y4fqgZ@qPF4oOJ$t9e*1Q1;Z{9ETu)Z2C=o|ue2 zTUW#y4?~RH9Q~g2gjL4)wr)R$jOab@uWJ=;_7qj8<>+DKuv<#~Dk-01ujEQOpE0vI zjz*ov}K-SL!)W@Aro-Ck8%(Ay~m9?-SbV#zarGx*%(UYBpDKXfNx z>=3z&wsa+|9S2S!V>3N#_?a_V1O5-@R=epV<`tYtaBeikN5=w3bqsh*zs`|7Uw%7JT7(t~&1>*zkq%8SJYFm6YC4w(Stu+n5c{lPeuTfaxv4K+B9M)&t)dyYz0_qL^?b zXO*p@87l2}Orya-S7EU~{<(8ujG5&g*KTzh!wEE3O0Kidzgsn?3VJuv$QCiSV}E33 z1H`ce(jpE?)Y)l)N?Z3wQG*zm$}URu~ONX%2kS8JcH)y z(rs#g@MLMXJeB<#A}TSe%H?M5W?WDUPalHE&yJWO^cSPWLE~n2Kh;RYFD{leA}1A3 zkFBJY^K+xRM7OF(hK!FfoLVI}&5J4(k(B>2uT{<~G~WKwx45p{s;+R-s#DWdaz(ui zL8_KGImmjO-IZN=EX}sgyt0;!fpt-hZp|*xty$9}*68JDNz6FUyQqAd$4C5owWc6B zA{;;|d-Mpx&!#Lwu)`_V<(yt*3JV@|&8erSNryVpcIZ9wR^_55VsK$4?kQ}O)Us;J z^`)p&$DRfzQP#$8A7yDn2kYjvVkDjTIl7rm-xS^-P~ZR-fN5rlz3PWjooK@3qSTxx zDm%F}Nh$2-r<{O%;OGia>R(E%RQttA=tkf%5lW#ooe#cAbE=eo3~5f4PJz-U1Zhao zkfcJh_Jy@S_M4PS*P4b^Z(cfyFnsQzI9`RGzsGBf9qhhRsHo2zK(7=>AhgxYR3 z$rv$(F0Vqki1`gFbpk=okABKJMq(~4{*Dx3R989q{vhqOF4xoPMKg|i{7yYzAzS}? z8YO*4b&1pi)+9El?coJck=Bd%f1ObdG+cNaRt_I6k&1vmqkVw)x_N2&Q^VcfSlz5Z z1HK&Vu8UZ=RYehhN)gSI0hVq8J`_qT>^ITsb%c$v<2lq45Jf#&lPFEtuMn5)aDwU_ zxl_bkh-`U1D&I6lwB)5BvF}0~a1I+b-nAcn0C`z!>{{hy6*T|I{;>+FTPM5=cg>Gc zjd)1<;Wpw?`^z{AaR$s4d)5h>(i&a+!yv6m1O)aV(j=cs%ey1i-MXA5iZFV)Tb9BA zg%6iW>o)*E2Nhf_5IwPo(JKAXv?hVFJ(@I04#XHg2cN2x1(z!1ud>qywz~Z+o=Bu5 zMo=7xQXI$yVt`pcVvHh2r`ynjGE#zv3N`Hq$)~!dn&HZ3T>SZLef638G`HoSsV`R3 zTi2@ob=`cjAR##K)YU?)+o+Q%H&Mg4tVeF=N7MPlYJS`_M>u*)T-}?eNa95ZBI$Fr zrkxTmeht&`uWSvPfwJJ(@nv4e{IavG#wUEih(7tTla~ zJ5e7h6O3fHnzw3(VUO(E_bUx1`&ukLU?M78rDdma3At$4h|5@(w-eAg8i_#9f7wV3 zg-xcbf5I3pF?U!c*cE4dGPY{*cczTOkOu(KlmTp!(8BWcBblV z`D=riG1U6MWDg@_VSjkFV+1h9{t9ArVCmqQYe|zBLZHH9v3n8BdQwKk9KC1fAi7TWS(fVZnJN7V-ZFg(!t?p=h zm>*jT5kG5)@&)!VlPOY&z;%)@ZQSyO_Aoo|R`}s*5d2s#S<_j1?O{&nQ_^Rf@!zzE zSp`P)?vIr{)aTj5jCI;KgGZ|9G}`Cb!?1i!@4G|kL;uGF%qocLbIO8i4Sp45o^lNW zqg&;Zci}6{>QUkp{N%yaGh!zNR?Hv>;(CEo*|$_>E4Rte_)0;5ThN3o4x`mpAc=qC zBn~W8kb6WWzL&(h#c?WBq}aain@8lX&!%P68ir)S{AI69*#cig3VF^tYI{;xnEc0tOC7spA&U**KVqvC%f@n@*@ z#(H|G6zVo<5AUpSa`MQ+*uP1Y-3l1ZHTA(KD$oiED!>r;d~)tb+g zyl>L5^m>my-)zP8iT?omz3IT#WktnvwQktLD8V(pDA8{aop^?~UVO{szfThUyD(!a ze{4o?-fvN<{bms~bsBHZekzmiGRgO~H#@=(ym$dYOqka{8?%{yFT_a;i=)eb9G}D|7|ge zJV$GmyHv#WLPLO4du7SlG>0)&uL}oZHS6^zt|LHp6Ezug+-GlBbK@-@siH?-6xv91 zvI~Al+S|9O5yKf2!x;v*)y{x@PKTABQ?yU)QFyHtpAAng0nILF_&Fyd1hysc^WXaQ3y>Lvl?$vA3&tM>6@S5l6{RmXyM1U!L@55q1N z6G?eB#bLu&%D#dFUStPhhOfYWr{(|?cbkmTi0%J5$P@cFS-F0@m|b3zOpI}B3DlZJ zjUZx;c$SaEeBQD5MLz4axJu@QLwKIUys=o}E7L&M@*v70x^?Lo#AQ@hCZt%G_!9f4 z?2W+q5)3pQg2nU~C!J5inZw8hjJ5cmmy=!Lo~u-cg%)Sd&->KR6qI^p=3$MYYIUm2 zIQ=-P?h?0dr($XqD^dJ@j&bVlQ(>ZrHmDJW60ckUHkvu@zn4L6jpeZSVSfmaiXJCO z4eAd`vPPvxEG)*C$pV+(cMK~#@2n83OR-35M^L;4R~9Fs-dDeCjuy5iW~~CWsl+Ki z#2>a}P0@K*m)gixac;0rjbhOhmb>IHSRd+~@Aw^je^-r%v!`1%d;WE|Vwz%K@q{9d zpoD!)xyTEqvuRp~)0HstV(&J3tSyrDPH*0+HN7e?qDL?0gBVKYpnu0(ewv_&LF3yMf__hs8ND3F0Zez+VEWrGEwqZhKVQ*=RXkEfKkSmR*cm%T z>RjN~`5m5iK0ow4xg@>cBEfXR5_18u+E1++p!>JaSsuxUiE=B>@L__&LW*PF$e553iyiWY7kSJ9&{V&3}M6mlt*kudBrq31DWCT%# zm!f#qRh-OY9wI?(k4@6Y7T0|sT*ZHoS2t%N7o82^#4`?lU}xtBlvR#y%r8h4jiFp& zXO+?ZOAdtk7|khsv~KiPwo;sK%Suo)32nrxjHTT{KoNo4z~|Lz737`%6&TD#5X6)cUIv&2f_Vsok&UqLkm z0Wm_MV(hW0L!qmno{$Lzoz&LE`%vpNo~fHf0tQw<;2o+VoA;tWSj17pyYobU@OO_q zGN?XB^l9%F*{L$5b)jtKeDpgi=*Zd2L;iUEYwzn@?rTD9@>F|%^E`c4ZAjconDd6o z7KV}-$vI#Ri^F^AJl1mWHMm2NXdn?IsO;TAiz*IOvh8Py#?db0pf$|^wnC^mf1vjv z#;Gh(O{O${LVuMFx`UIcqBoz*fIl`~Asq1UMYuE_a^T(-J6YkKKw5R=HFBd$&6F#_ zCLT)5AghSAM@OXV&#YHiS6K^Y=;qhc{utCeA1#MiD?acMG*#mQCSAtUby7L-c81lB+*&M9-@b4V3nmobLLJoaitEv6P^PE@d zY?C08N8RMvc=*#)fv0|~oCfBcPLbSkuv=@h^V$+VeBb#z@m(jkb?4v<%Nk-LFwmBZ zKQ^D$RKV`gqf#)*K@!pDYdky?8}s_fq@8k7o(F4xZCT+^+$kmo#CQ3&9u~)n1KJW< zSgtniZUv}$8%g@)j$BV;`-cEpTb4hRixhTeTZQ)!aR*gs&lXPhb}2ftLT+DbJp8`* z7*G8q)!y65NmFy4tX56QrwOX@zP4RC@$QqYCT}-8N=n*{#G|+6%OD@(j8#)@Y}(d$aT#w~PpXuT*c_TXOT3Vda}0y~@UR&tu$)(e~S+ zKoP3NSw0jY&&8uk#%VZC66@br2l(Z8v^ELn_V;lk7KAP z?mb<##M$O$#-)8_^yU7gC$+?c$fRQPp z$}?^Z?Wu=m6z%;sdT+~p<1t)wx-Iutcsy>uNsyQ+&|GA+x7o+UyYFt>Th#Cze$)X@ zpYj^_o=1W7;i+3yaWz9c9H%57ar`l$@@$T1{LLVE^SA2qW%j4}N;pl$+FVa$-45FV z@9}yTg9BBj+W6DhK~OJ0cG(nXL<7cFHK^K>duVLHYMIWJsPV%mX^U6!9TKypH&2H- zwnh)S9H2hs@pLo&Qg=fji=ugJ0xRP5GC2tTr%G(=?-ZYISz#w3wKU0k=)RqWo0M~A8 zl>xGvvIN!A@FQbyc{jE$zjf!bw$7|^U}&DUfuy5tGH^|}4m?j1|cGz`pq zQ*3V=cY9jVa0Cq7>ovf@WKMj@(jfdO{Z4i;zcT07C2T0p<}?C`&sUE#+vH&mzvovD z@6@}maCr$e|0_4x2B)F0vEp`6?8Mdzi~Q24-mnjZ+OCD@r4uO)>vO-B4iHqaivC1x z_P-w$CotfUL{Nl_d_0=~rTeV_r!nC2APM0taxu%xR2udL^@)A-dA+zOeOyU8Gb@V8tZmBczU4r`S^K+IE z6_2MKqL*T|kFe2=IE@E6yqvMD3w8bOXV@9l5DSb1CE~}k{ zoc*f|+T%$G-WomI-3WSL7q|=m$<{jJeV_eR#5#Xq>ScWM|rbxv6mAlvcTiE!Na?|T;*my-W9vJW!!`?Tr zao6I)gDUNakEPtZ$JM=!Ir^}u|F83Qg#9nheTnnZ-VtR{mjyPzG#p=x5>2Z&v=sNQ zOLcrbzF4L5|C6xjdzlTia&|qrJ*e9f4lyIsQ;6BH%5#-;qq6hHEQf} zI~RL(!CMk+6`mY1B`+l{2|?v_|4W*)>G(SKJN`ZMo>phT&N&_JVPD13v2t_o4KA%p zEuDyr(yrS>MfDG=qC^X93~XD}0Az1Q%DbcG?}v?#wI8%c%lB(PXp5AmPT3eai%0BXm>x>;hg;A+R(88sLlzqmnl> zxVR*yS}JBnz5Srk2wtTh_rpi1v5`4|e#6LL>;2SFB7SGaXmOoh zN7Awy?F`zdfstNF0VEF($@%sd(MQk{aK7TVlDD z8&XAYv=3s(s)UOhVgph|&yp>SKi%1$*r2c#DV=RUeXh*NG)waSTp@nW`1ke4(D=>@ zP-0aLKVjnq=L|ZVN)d;sz19%LA`O2Qj*DfoT^`s&{F^KW?8J)Uy&1ZwaRYlLJaSRL zJ?>}jZlcY;bhwB*5FmXlR8w7{I-82vI|fVVJ1@=(kbaj%BKsjAa`YU<0pEoHGleJq|gcVh{lfy*1gRFLaswmaU-mfE6Fu`*z6z^lfBFkA$BG!;| z=nnpPmdPx{MyDNPa=b`q1zPQF2EVoTBJCNUw>D^uKL#8Nq(a6T{CHg$XiW|vdS@_i z8_a!eKqWH97t~g}Z^w$q?%$#Nc1z{E3Zk_E6ogMG~#HyLk$}^n>>1z8S*l<}5 z1d@ALL%7BbGDkO_^^B)u?|etryckQHl~Y1Xu|3_-E&=}JFpsEJGe{L4^}ZdoE*TK$ zfFbuF|JX=v3w^SD`8Uov5Bz$@m&bbA)|MNNw`O&C;JUoE#%v$`&961|0UcGj9yp39 z5|Ikhy4->XZraizf)hl@YtvVfqmS-JQR zdUrG)zM*bTOluPTOYQ#mS>YNF%kdcZW&o?k!|d<~7iotW9F4JmP;^A@y}deW>=Lxc zzOEiVQf)2;ElTWC&;p!L;BFAKhG~1^q$4RYZrm?Y)j#neVsviXZN=Xj@u{NAxpy{< z&Y;RQkz67QXk06krXMW<&NPqq#qt{uPntTFTQS8^1c)wPp*d5!voyc*V1!ePny9r9 zwurM0^hqn~&?hyxMq^hoe&JC|b)ET!yjuf}M;rkBgsyA%ALN%H1%c-4N(%+Oqzb4pR6im(Ao8nfEB~a;h{N$mzf1hV4|b{^?^G?&Y^A#K@CuiTEJD2O zd%MP6f9rMM#-9m=jJrWzn=M}bFI-{;hvYj4G}?p?QCz0~(vyi`a67UFbu$eEBtd@@ zSh?>hp58Xr+WNl;8>(#xbX4Ut;`0Iq_d0aqhy+drhLc;Z)&sp*=_nkquta{rY)I@U z&VfVY;o6z8SltXYjxx}ZQgtts+|+>pD}LCkE%B0C#mh|xkhS2xJdN3x9%$z60k-skyAMJD)y-$9p0uSyV+Fjtzg+aa3Vz9SM2D=J$ z=GK%~6i3PYb@E_y$!d{G)oBreN2s3+(pOOH*=R9kkVS1wK2Q{dgpdlqL0>LuH|xACx=ZI@b8)RgtVUbi;U zd6>2?8;`I3OEbRqp$HdSzIm|Yi-^jhHEwi)0|-P#%oY7dVe1y3FELGqOfJz_7S5oh zb-NeBHcGkCSXIn$ISj=gZ|+^_7gup&l%F`nd2f1u z)z6 z1fh0g{h`-2eP87ULSH!a`Ul!IZ7i)rVVxwsBrQ#cIb2k#sBOg{&&t87o}1N~W@YOE z{ZZ#`5U%Od1FS!}V$FUsrwJmJ)|wWQniWV)TP`b*a|3PY)Y4Mpd8mnB%p4t&VyH4zd9YGBq@$V=A`*=x zLw;B7tvqN|r_5<+sxj|!Ae$bd*5cI#UEt$t`k>?|1 zx32M4Zoy$l^G?aA={qE!IW3=z?C92^96ux1;Md8HM?A0JX(kw_B&zEvA!yzJs}?kG z^-+wb<6_~tIIwE^t_FoQj$qrqAcIzoPM93es|%= zhEkG>+(^I~;p|aHuX%&6g`Au^DIb<3R#R!GJo#>Mzn^ozf8>65x!*r`zq{SJQDRUsG+tT8lJFif&70vHNDIbZ>|5?a@&PndNq- zjHiG5+*2Th4_znx@-b?|S9C2OsiMh$#Q4r>YNpLtb4lu3Rcg&iU8z!^+MC*)8ktN? zjppMRs_=?mnrE%D|HC{BWgGSkOj@>TUExFBq7Fejt=N~c!L<1_tL?ok|9)*z6Wo+^ zL|Uqx=PeP4RmfLo`99tt-wC-gmdT*)jrhE-j zX$^agK6v!()hf7rAB_+I)kpK9TsIo;ELqy*refDiwA$PX z?kfa^>{ciNsvCoR3L&feQ6e8glTrmhereHhLb9e+1y`bs~_U)jaUXsomF9Bp_>21QUmvGPzr% zkNoM@>e9DldJ*=p69lAoh7A;jT4xiufC2hacO~&h6Zm8s# zL2$%yhyx9fS_9@JA0~Z4grq{VNmNXtfO*j;j9x1V%G(I*=7sNVJfxfzJY`xoUngyy zxmx9Exc8Gid{#+OQmJ4?1!aM?RXiqIBY#aO0^w2R5+!J>)0Qzj@oqNJ%D+w!rqj(S zRp2!`Pm<1(B-SuoqTH*dZN%6au|`(%HD3zJeo~Q-uz@@3mxJZIC`I}pAeIhGF6pW4 zF=vO_r5bo#5)&x}KhOmwP4HQzxJ4A`Shop~B9x{b-!*(o-zi}XpGs~o(3Z3c*<`Hb zql|=t4!o8~srv{In)yrRy+_iRx$2*w@b8Q7pT>GFEJdL1XP zo-9_grn?7$sm9KL@d4|JfHPts&3<2p(hC3unM0(89CTB*f3+IAc>#La%6FRHiL7(^ zy=rvWD4p?uN~~u;pav9K(dAjPzpeF(44I3e+Uq`)*49u#RGgeTGE~9Mr4%ZEdiGmNh||Em)9lv`*t?{)%W=awl=1hW@rWdp2i@(vg5sGsD=32%nF|+VW9T40KXP zeP5K5%u(NEBeexVn|Y2gJ0G)W)OGy#I&fnMSxN+MKUMV7o`0Tbp*h1!l=M3O=BFQM z1^Rq`S{i7oXiVL&mNus`0^2HZY^g*hFHm~|u3HM^f54qn!0>~hHnK}XgGNm*8;8>a z1;n&VFqekv`F;l!c-x~;L#32137dciZx44+s!Tp9PL&lj3gSm{>V6n9C+ADKfkQha zMSJqTw7epP3Wv7jU3i_K^%JIksz|EewdvFh5rYON%H!1#orY808| z1MPvlmqIulYhFm=u<`fw;kLGlM zdERMizn!!48s(8wEYwTrl;b5pdDI(_xP_9G*Qk$WEM<(80^S8zIKWo{uz@Q>*c}=j zi4iI}9w;3MN;hStCJ*ifoz>0GQhD8_j)W?KtT5#azRWv8pODd>&?t=Sa2O**Kd(-u zv(^ybG}(!C{FTF5n?2rBI>tRbFo@ z*(oOWBXwfBICQh`_^(mpzv;Q>^6Lc~=7pW{%KJv|xSKWNY`es`yg)1em0HfVp!yF{Rpuj_4b6PcUA`O}+Y*iJ)7q=ui?G3VhnqcHt%c6pg zM_4?b{}yP%$rZ{L83W*uvD?`m@0E>>q@E%>Wz92h9XsSC2V3rB-$|3?Lr~g&fse!p zOi8rmO`pi#r1p2IY^~`PG;eB0cs{8$oX~^?S^>mdfK4}L$_qz_c}XFDo2?;dBk&8X zU>EPPfAt!ji?7d8l9k~D)e5j^l{{b97JV5mR_d0_tRZUUg`{`z>G3F8P6y|5{D}}q zw9rS8k%WMR-KAV|07;h2k`qp~Thj8^PlRFxmv9rqr$o!bs-oS=h7|N8q-cHjO}q<% zlRsVsCi2It;EVjpMBT>|2dQHnVUN~4gB%Ta`B38;z*`6&a6!=MF{8Nw>smThScQfZ zXr}ysFhu#H*L``wpYN;NZ{Af9@Zagnt^2EaSH8UY>R!`VKKh9Br}POAXNj_4(0_RD zsRoxGyivXxz6PNPI)H_j!d*SUdf`(`%ZjPAFTSo&);u95TJvQx306BC1#7C;g|`rN z>vDD2FTIt5m?63q*<9Sao?%|zihQuJ3l(b{OO(2IkXhP~NgeKx*+1ihX(MO=SY%6? zxaM79WvbBZyH?iooygTl(M@aOJ+weB9}p{oQ9OepVVezwU_|K`V^|fod`&pG;P|z` zoK^tKrtWQ)@+d@x&zdcz9z-Hcz+353e=eo2*Oq)+o=>WT+M=%u?V15D2TnRmdBV;SI$KJI=7>8de){3=4kV5vdos!rbJ{R3j z(K-@93hOKcD0xZ?eKKALdZ;;tNS=j?2^takK|j?sNKWHj@Z>aOUjT>TiqrT5(=9B= z%~>pYO|MdnB#w*yyNEj-Sc*(x=_Z1L{sY<)T!k=?=6;_ubCBReIm30fcY*SKidp#g zOPxju3rJf#P^nDdLjnFqHj}CcbWEC#Nf({yBHbAd-hHq|#@5V*Bz`lhy z-O!AS3Z$nO6}p1a#E0q(tBQqepQ2Mo(e;pjeSMy@xSu?)GVly-5fSKFG%RAEECchF zmDs@243njyk$iS8WCk6`P()*IYYVy&dsu^;`{%@mDI)A9|d5IbFMU2fE{?Q2d65A+A z_CGQT4l6!OdPxtpw8}Lr}h(EcLmKf15gOTG70(0nt}s z7-ake9U)&5@4&i%?WS&=z$n7QCPWhnYMLmbX=2s4OURX46Q|TrHEZFY7i4ALicAT0hd)U?3jJZ@rl;7gZ|nlzbZ#4j!wxl z3WSb1fYx;8UnQ-a&ph;yQZcf3N)ZDIcK8s^rX0If@t9(twuccxqehnIE8K#V-D35RfgSB@B?N7xD>Fl|Nx1`0TT;2_cj} zLWOqAU*crA11V89m!r9>rB`8q_E1F)@$XeN;s!;|oC@Z2O7C`8hzFw$F8bK=*-o-}Pf7~rF5}f0jSnOB? zGO_3EBilGBT&2G1{)A)fXZq{UIkuKxP@fr?^~Lp#|NQ#QqwCA4LaP_d4*N8qwq=C? zw~s!&a@yAC+vqwfz1WZRi9fo$zxSOOyBRR|?jOb0sbZDFxb(4eAmYw8S+!h=K=aPe zTrJH0M%bPm)KfDD2krkNS7{F(~m5-*=3JlJ19@cs~-zfcyhRvvYci z`-vTW$4uA^CrsvVCTx}yCL^5*o9%?H=o>cQ32Sx328AJ04SYDkoqdC4gq&bmkEK+V zy2TBSU>z+iiL9A%0_%=(Y` zmQ@Wloc{hd?qe>Z(l7Qu^9DK_BL8_`7m`Y&``pL;W>5`rZb*i>mS!bH4;X(%-17V^ z>C>hDFZ-W)Y%R3lN@=GmE|A4kNH2oF9ww2 z;n5uZ0`Ib6SV|!b<3H%h~Dd{8-E`8@wKr#kJ^ zRr`KJ*Bt*dT(`=t33(a%*AYn8v7@tzn4v|Rvi@{SGOj}JcjPG>4 zBQ7cAPkD4Ss;9doOHA|m3jP(;Kb!g`h5S)JnW|_1ll7<97^$BnCS5^^c+c z`P45dBgfHLMvM3k#2>He^t8KprSkC z5-oo;flToRc}=ITZTVvSllnU)v0MLA-h1oUsb4~C0aP+;g@#9ap`KJC71J?yPgU6xIo5*dm z2V+f+cCOE}wMWd=FT@~SnV4&kR(w{XC%G&i&EEkiUvo>c*u;<5mNj`=DSB&9yxZ&e zLrIM|@BTramX_3r)7|Gu?sJg)Jnue<@6&&1M^1B<&}=pK`3!nIXD$J`$vuL(Yg`|e z=J5BcS;NfZjILCB-B1( ziA3IkRD9e+H=>kLm*0_dKQFS^N&doVxVtT4`%xA@oE?)5M2=mDEKlu-`n4nHa@r9e zlNB4#Auek@@xxiMe9rOfPPc<(NTRJfJSa@IHF}&p{0CyJ5!r&+S<<;RxyfXvRIHEL zBV{&a%08+}jH9ez>2$gJ4W0nYD6tKlA>LD2hp;uXKMXR^D6U-qM6g7A_X6Poh;VZR zOUvxdB$2Q(*X_;raYzI{At6qPTr$A4$=Nb%kVvUSNNhZ34tbVO<=9JW)46qIW0f1qJl5@X26s)UQ$|9OG_{ZEH1|1$US_+1AK|N(})wX zvNhxhil=kM#r8(nTzVO_YPfU#+1OO8=9BpDBe6)lCrfN;SQ$}A39Rr@!-^_?f?B9m z&mO+>Thh;q@sETf(J6Rc`M?lXzOFD;)WRE8ETjrRdlTiSavmnRoRIwWz^}lC8t15V z&9q+kM412GQd$uocRLA@*zWEWYzbmUwhnfb%~gqyYX^0k5m03zp1BCyXLsNHud<$+7_!-E&*53cqNuFkE)`e{vm ze5?mIv3K}9v2%2*u1A+EolcXq7yHa?r~9Ibo;_r56%~Sm*DU9Dh|!fkM9K;^?Lz)O#Z3SXp(+m*n_XeGNHc(;ZW% z_~C-sRnjneGv}e?m3-GVXv@9aToi6ZdJbdR+?p(oAFgr?lyuXZ{H-a`(Yz#Xw>5oD z^1;B0T$)RoSV8hn0X6TE12O=y_aWvV`p{g(LKv*OckmIe*|I zXmTFZ8XE$u2af7s&3-iaQ)`kKuHKLfHpr&&8%$$C2<5K@N7he}Q8tT3XHzs|+`zYZ zF)B9)r;6qh#_lFn^c7yfyJN)iopoQ#({@26%&Q8LoC74lHpf+qo*Hp7Nz?AQ%FLWG zlqb%xuzHR~`&cLxj1>%86Ys}s*Q*VLZVZ2$ zH`o0$vRg*0BT&2tb{OY zO^XRgNT`|fbxKwhSwn)nri$Kc9>gpf#=FeA8PP z^6&uWy|*~zZ<{wfXx89%YIE4Xr9L-X&(-~#>jwu?t%~%%&dQO&2N4e&o9r{j&=D?& zsE=}0+~1g>c%--IG4E*SdEuE==VQ3%ZPk|76l%-ob8G$e1;zeD^M*UK1doD3&ELQ| z1IY)c)`wX;lW$P8WBnk!JfkCvB>wY$PU&Ho2xEg?rAL4TGdXL-ZxUAk1J0}bfBVKIA#?$(V0;R0t z$}RrQ^Nv4Q_0^IXo)MX&;Z$d;UBTz=K9w`-`^G}9ZdNrbJ{?8-oL33!TlI5%yL}2c zZ7j+3$(}+8tF2%4#i!4LjfL zgKT`KM%)gH%JU}od8PZD=swSLpQpRelicSZ_j$O<$-mcq?r@(Q-RCOz`H1`ciTk|A zectXqZ*reky3fPzbFX@)`M=bN-HlFtTij>6`~0K({15d^r=MJ-kMk6O;uij2=bWfF zCe&A)Q9M(g8=Zfzz+(51tl%)in1{s1H6aPU(`QE6#QQ;3RdNDe0%Q>!-Bo z-i-+I^fue4vqY`Z+&{^)%Ip4ds4vcf#<=w;BG9MKqrV+`Iz|{gXxa(F+p)fHjB?S7 zcwn)24TZ9t<^)?;VvOHLEa$@bX<1Jco*XXO21gZG?;9p~I|eUaeQIlIQSx(P7AbX8 z*x0PRx@=tOse%b;LB_kjNcL(#j*pi&sIzr-e zgccj^IJ4nHTh*OAcgUd~C$`30eY7%|9Lrodo8V*SYKZfK!tkzI^DJv}sW~}ULWGj5 z7NK%^L6!FGmgFD_CX}BLgF))U zl?wV1Lne&Mf!f0^qupF$PcIgd2~+1RJLdRYX%99Wb8^i~OZ`*I7M?%=%h_>r2ioSj z^n9Q`v$}L?epafwl#I;Der8#?U5UU9Vt)Wf$PSIcHeSJrJzgXb-j0GmBQ$Dmou9** z+oT?|I^W-OcV0(zKA=k_zgpg7ROcV8&hym`BMN!4F(n@op+TEhme6VYa!DqNGe%Fa zya!h+{%UP`;ho|opW__ zXS#B)QkdIc`7z5+y;2V*e5#^AYtFOC4wy@ER!h<)M6 zGn2!#Rl9QMs*f{ZfkCX12ivM*gCw>@KF`EqlehxiT@t(}e^4O4>y1#}=HSx&Ts;LL z`Z&AJ)~y<}4e;?-zR?!@z7_yHrtc0y7ksITFDU$!?$linv7$X`UOQq$ZF@UC;4&Qw ziXIHCfCj?J6xh}|vQ{q~RBKK<$eH!j(&7N!E<_WZ*IFjm%q#<&SM2foSdDO zuZ>vn;4V8a7|T+Zupb!BbX`x8_^mt?D*Bo-` zeVpnv)kJ!^dCS5rsg2YzB|rK9(Do+qQI%KY|4cH00fIM3BGE#L8fzk`L9u28HJ41_ zj!ZNN0$NmBY>GRD85TtdP6Ax7(_+=u+RgUuVr~0Y`?jFCWq~AM)c}ehE`Zw|#sys1 zWq#lD+&hyAqHW**|Meqz?%eyV=Q+=L&Nist+!b-_EANL%x%`K#5E#M}F|QM=M%|bpjNKJd4OHH(wZH09fyV`=9|qXI5pfQ+_u1Y# zEOIyBJ0MJ|J^E4d#P0TbIqgZ8+W8DcQ=|&Iw)j;=6V>%PEDu~a+@geDA+JPoN- zw7(mNr%KTBbS25R+7<)I24Xi|`#Swh!pZKi`>_+s`kN`+=M|36bNb|6)&YcI#5zJ} zg$OhpJ8)|aDue=^AWVLOEsfY1Ysn4IXu**4;?O?aLg7p?7u~3>elI@=Lz**ZP`!l4 z1pSV~YU)V`{SN8g=Fp63rTL*5&A~vMq1D3dx|)D83@F$e%Gap2%ueDusnw{*wwJ^U zUq(;B`ungJS?<&zQgo{Q3RgtjW?r-X#g20xA{Un~Mvs;DA+vF_Gud|WnOC=H6D*I`%hv;-HnSNeJSP7cRSH9xcoSr6LQ+erYf4YEh^7Nhvr~7d zjlS=Iwlv(Z-gzXt7hNUfvQkFU^-XH|zV_gn~wT>nSellb6j4&I4Do z=KCAgWCEZ7I_huQ7}P?osr9upaNcQQ2l(U>b27rta|{!J_MJW08ml;;$!r0_n0)MT zK38Mi2BjVAf4Cu%*PeSOk>G@%CqvN<^z#LIgTdEy7?lYtJGy*d@Vuejh$pDIQot z&&cvLaV^@S^MIsS(+31Of}3+qd5hkXD2N;<7XieJep%kfGh$uxn{3w$u&NA~`Wt|~ zVtSkKBD=3y@z|t#Nps}nB|C)AbxO{pBy?=PqmR_DPMpWGuZIiZK!!e2Vf0)PFe~d> zvPMqx>KwRtb3ECC)yP%$XuNn!@Fs%* z+Q-eiK+5J(Ho5l+Y_~kC;p;t!Qo-_;mK{09rkw~&&i9;D`xAKHd(vO*8WggABR);E z*l*UDoi!5Wa=Qlwop4Ul(TIeq)r>!4yPk@cqxYNFA7qO9g`yUC7BRzTF~jB_^M%wp z)EwSO5iKY8NbuwWFtK-PokWo?VBDG%9^{l;pe2ilZaCK;YlUWROy;s?mJg&Nrp=dJ zM$YKTPR_+_g8K#Gg|(Y{mh4hjwtFg!_*AceBL8U-Q24I>z?4y&Th-p6J=<=SA28Po zt@Y{g!oEQ`$<>loe^M6mk{z-<{>{?F0@q^g79^+6pGWd%)T6(xa9T>Ay!0~Rnb>6D6R#Lm8GG6cXK0| z;sYrzKNNG(iys0&h|kX0j*{5AsrDxX8xerOufS2?RC-Zzv?9Pc5kTFuPunx~JVPO_ zACrZbdM4tVUcCkcC{R6y{Go%S4g zS|?eRLnOn8u~;NW3r?3Os;1JN)}H-9^}Eg<#e3a*Q)#}TJ^KQ=)nXFZ_gExfgAvFm zYITV~OTbxkQ?2>W@C;kUI?;(e0@tYTL%vcI^r=8&cq*#yVH~bzmd*_iv}m<0(hX)Q zN2y!`8y5NS;O5kHn2fAT1*sF8w1{ft;t6^j8?Nu14PY?K#*a z5?Mp{s!Dcd>wyzj!wr1}Tg57dqY}SJviLXy>{M%kJ!=BE$UhKeWT2l=V(vk$E zi!Us_33Fm2-PQ0qMl*qqHzqS&SX9lA#y@?%&DhLqzP;0si_&D0CwnO12B8>lYTlAMOtsZJ}JocJD+Nz>lwpa9d# zt-<>R;INvWhJWVJotdb+GN60{Eb`c!WYLYFRE)lqAS=xDNe%}N%u+>!iz9Qlm9fq% zlD%HfmDIi*88dMhg882mYKQzKI{w2#v!x~RQvOd`8Up{9xSB%73};Qa!xqRzdoRyP z=zLSK_1ELla<20$CvqI`a-%Q{IfX)#3~*}pQ|4# zbNPA1J8zH79WNjwL@iBLbCqo5^{Tz?d0NwrWRaPa(3gX-gEqgz3#NU5Ae5+N_YvAN zQOnEBf-^ahN{JVYCoxK8)|$>GRRtim2{~5Af2rx~>6fI50q)B_>6cWUI7}Uq^HbF| z&`)AR3|AF_X-dmYt95+!*awHm@)LD9sB~#s!BywC|1?zSoLo54yr_RY50}>CIMhHH z&~#x!sHe2Cf>c0Ll~}6YMEk0C7)Ek_%&r*SXWlnsM{?(lK)I10JCYO4e+Eou-HT(1 zTmT%oT(^4P*wr^aX+T#jQ2~n=Lh-I8M|D#z7C8|D?ag?FB!}y(rF>!zo1#N}5)xMs z$R(zea{kI=$V?=*!)zEPA%hc%-^ioTK>J>*fRrXy@WyfxZ^;@NN}7{bcS}3^`H~Ua zl=(uuZct$T9lcU*u->1bs%az=j#-Qv0RsS0Lc4Y{<_ic_s9J1TefrZp=B~nCxUGA} zEHCtgQq7GUqaVn*Ft>#Fqa13~HifX9hghM*n|2cE(TE#|#cA(N8tAcCp(7p9Y+Z#m zkr@45fh!BOyN}RkPN?EH6dUnH9L5_Awn&$iv>{I8L@=V2)sBu&%CBE*+*XOO+A-PKsn`p+v^8`AIykE?Gn3j{n{SqF+ISyS^c zx2~Wx=iZ1-+OmU)ZkBh%Ix218?c*i{h;IDXoZ}mNB`34~=6|x3exmejZC>&^+^A1;vdzIFmbrIO$NT=Eu z4(ayiz{EEeau~&Z%+V7Jm^E&fL%Os@jw+-PPx2(CJvU}>sY;%%JsoT;j_n=_Cpk&3 z@Y`X(3P6I^pPdP6Ed4V@%vLx;j=y%;UHt*6^Rk?Z@iLNm49167itteAiJmXH?oy-c z0aK<&Aa>^01g7%C9-%br%vj=bDmCKwsivfO;R!TC?e&JXs73yC2*w7zHZJ&bRffjZ z5UC~WFp9sJsEX?ec+!72*T#fYWZ9BhG!W(nec#slkai1U7pLVt$wxA&G^iOAn3}hW zclwgVd5~~^wup*nfJ8?jc;l7*A5jISwtTD&->*#}+~e7uFowhD5|HJL7wfgNI&aHC zV&a^GhPVd=$S#y25oNY8=v`;7gF2Li`gDpob%OK)Z^e#zrN#`o`^n0?8?2$J0$(Q; zx6f4-Nfp%KVRN{S=PG$F-(ap!trrGr!9Yd6_)w=l$jd6J-6MO({Qh3@;9}0(`N`wU z`KFtj$vj^&>-*jyr_pC#fh2j02E=YEHGCsBCI^wjkQ{lRgU%y1UbqjLNBeQBWb;L? zRJkL!Ns>d(u;h%4m!G+jn}CCZvI5q|6PZ(1vgC+8FYLM8*e9>13v&w)ISI{W5eh0L z>(bw;YN|(FGo@XI5M=(@K{Yskxc{livUENXBXg-fKGO>>PgkeS#GJWoty?2vg2K`J zO68&(`@az#E$3ONMg<|m^3^J+jGU~3OKTwxMXMU#_4Bnd(*JQ;%fon-pRv!6(|+7i z!gW0XHdSf4A8)m$Vf>=M3q4v{J7R>iC;vqP1pDcKcQH}PwXMvIhI5Ug|)FNXY?7qqlN#`>^&9^Q%W930pY zYpGa%DKk864Xt<0En%^Y*rsq5Xbxwkv}g~uX*I95yyZ)r--n)+y+!8jWPXY0m~;vP zBEXDa=0zHmr@#g+E+%tTqim+-HOE$EhprrSJczma$zA2&LxNIfpIVqgXE`G^g|{_VLsjPwJtcV>4U{5 zYfTG5LdKbQd|nYM>H_~f=;L}h1jyHMbwh1=;ur6+Q{B;F^X)|hktgdE8sfMG9V-aT(1C3oL; zLA0`Ar#EtL(kBzj@rXe{_Ecv>Wgt4x;1c7C=!XV@^D9z(MSXt6^JEE?CB{>isy3@c zMdY)@xxA-mAE%n#sZ(KL6((wp5^31o30aTVp{O8g7h(RKjX}4j_yQa5CWj(bPVE?L>EAfIZ3DJJl+}Ii!L#>8)(I{>P44V7OJM=*N9miqVlnR!A485GM za{&Co{621(+CaRY98hIG2StNIjnkCaEgaIsFP5L`5ygQWD`(Dx5gHxI*kWv zw5Jy?E!JcEh6aZ*SemHPV;}ioSBD0@2PIObEJ>73XcTtXFFKtgR~_N}y1(qP|B>m_ zLQf>9u8Y}WKa?+w?1J-P=_$RM!FXhwwJpCIR@j5OY&wID3&yDb6KIJA)E1=U!52G>K3*vka+0(KP22fwbccVCxa zePS|9f|J9+b>h9INv$B1KU63@S%9-{Z^P{i|---<;e4s5b@ghgWHnjWshS?jI^hN1w5 zv}s?g)ZB9Y5PHuFvm;2)s_ZF1*SUd(@vh*9R3w_gs@VJjC4<&+pcWm5sh_G0_f;ua zCtGHfeWH}6)u~bfr44f|`8L2{OcjY18CSCX7o#A991*FURZ6|nrz=WaL6~_$T}gY} zz5UojqoX)j31Hd^f?>;0s@O%B^!%`nmm{{xt74CKf1B(U7xF3?A2%Y=D%iAlesMp} zX0)brc&#em>+xz$rTn5$C4m18*_=8Tb4aTyYWxB3QE~|rU{cr?)`A2Y;E=D){*0}ac?g-Wt7XfD6zFs?o0f@4 z-s6n-$I`D^)qhAflsD*PpNfb2w0b_(issr{|UIRS)B9-p2ze!4KxUfB?WYzXwjMSi& zS;Y8@V0(^w%rGlNP+b8O`V_0aeT7__k>TZdLk!=-@hgjwq0CKIsIcV_H`8n(67~=N zL}kc|7-WXxBV)C3-_K$@hep0vV-@I6m+%d{?f85jJ8`Y~n!afl232!TvCd}m4#n1> zdFb$MdIxE&&#oGX$KjwgdvqGiH=;q=MMUcW}6^0K@Jvd|CWy`6U+Uyy(o@g}vIhhL;0X3#(T ztd~AcCG({6z8!gE`NW#ykRaST6|2(m0MaiP?g6Fmi&jhp#Mci!by3RjQ*c~TS`9MQMo0;p1K zoD>vF%;&JuO@iOCLwyzxp`ptthJ8!eD(w>Q4&n~vml|e%SMp|at5Q2|de@lIF4KIf z3<#Gx+4Az&^1~x_oQ*HelYR2g>gM@Iim%4ba5;L6gSldkd|?T6XdYG*a6Cs(q+ z{d*QCjttP%_k#TDYh*aCl_MWPkt ze$a$TWfVP0igJR2o(DBE1-t=?O`(QGul#ZRHvIaHDV4qt(22Go9-!-QFZOHGS^QB z7#S^{2V{NCsl^>tg@Dx~WBGzrZ<#d)%_mmXF9r0%J95Lz-U`o{Q&>CWrqV)dyuUg= z@~ps|{5x_|E%q*mwy-avd}|Yk#|?0gnZB{OHeR>{hjZ+A@O(nin#7K*$cXJY9165P zF0;c@@BHMEOX3Uv!PXQk1xN=kjh8+w{$R1T6OGue6EVnU)xSwN?fW6_j{QYg8?!4M z*gmJuQVL=8yCZAGo*PDRuQi~?8pW+(=vLc&a@ig_Rc^KlVZ~%lM4$R$3EIk z3tNul2~y|l-o1MK7H_~tm)|00H1=vLb5NWBkTSA(U9lS<4|`c-#$Kc4-5hfdhH~-I z=LqT-E2CcM^wQW{LnAZvCrT(4BHmrIUcS{j!Q2{xTw^}x+r*jnx;|JVj5%zLJ-o>d z1$NJS6U}&tLzWZ6>y(bgO*;Xmp4bxQ@Yw%3)@LPfet6(s?*HH@i~X}z$EYCNS~S$oAp?y zSMG?neT3NaqOG0%M$iB0)K?ySI3( zmEU`eRhSzp-xDg|K(tMWVPTcf$Ku$#91XlQ?-jA#P=_){t;=xWtuzQj+PE%R z1Ktf-JQcB+3;m(Mrnz6E4KMXmG4wlL|R%M=^TA%!wNZ5snOgV}C#>09#-hvSzW)}G!R`*^5WrQiwK zck$W!lSnZH3*;DIFW(e2w{Ei0Gw;5bDJuyFo}1%?8QCAdq-fK-y16?kcgV?GZiyL3 z{JhKd$9DCLT%;>@7{LeA(hh3bv|U98-n!|dJ`zpXsVo%OI@d>#?Zfano3_&s98OK2 zu4F%RcP3A`PqQeOn!zLY3`-G%kL7xxD&>pZWtUp+pDp_+w_*%QqyPard=G& z>*nQyPuy5zUQ!%u%}EZ>o?5?YS6naQb+HmicqkMt+5kO%pXYgS-#lS8hVnQAo_P*L z*z9G@XmyVa?kseU3=qS+9FmELcknJBXJYwWuj=D)q8W=jiNo268*C>VMX0!t^5UH>pQebr6ZyXk5-eZ);4bkn=s^fouW!A-An(@Wg+ z0yjOwO;2*uzHWLj?6&Wwue#}aH(l+fkGScBZhDuS-sYy?annoO^a3|M!%a_8sY{3q z5o)I3P@q=Eya_z5`L2Xp1kA zA?BP6dFS4N;bma?q|ys@WdtRbAEV*YBupebU8J;RH9Q!8t=}9koU+zv@=NLI6LFr< z3QJ$O7xWSpw^@FGqGd+v`Dnkpa+mj3-AaB})#S8*1y#EKS__DbEk^_MkA~&m6eqcJ;*E;?@{kzabz{HgS$`a+j$uVGTO%?pv zgi2ARDiLW@ZeQhTc;~UK-3Uc;T#x?TeW?$>b6})B5<0O z2Fzb!o}@7aVJ44FNx^8G@GTCEgvUor%lxOD!q-JkG&*!83xL-hx*!>QsbHO_E$!wd zIfaAV%p_`!5Af*;$!Grtj!b|T9jTC0(Np^u>bz1yTtqb|+Z?h{MUsR5YQLeJ0C~cc z`1S%LaJxTxHfB{uIp%Gj8!eyb8ZGY-k7<|vJ1DDgZBNSOPH!S`&G^G zM!X+8bqZj0QGFc$46I6W+R8KOr{Ez4xMwrZem9)KwjUqcCh%G#)<1@BtWy5WwLC;C!I zC>=ZFh>-d93TO^?WT{o>4R>1mz&<^rZ>3hRc?BTn_l3iXSnG}ZrayP4+h=#-SkzJf^U^VJEw}N ztkN%+*^jp|sWF@f8MAy>XlKNpXcn-m%owK0cj5(Q6`PR9wJdJ2G&s2*B&R;$T@9L~ zw4X>6H55(R1jF@;5|?!@{Kjj;Y_q(W(_9>An>U_AlE9YPh32(Bw+jf(@Ng<_xVZ(F zW|+%n&ij2v?qzwugir{5|1-Ft3jM=$9&XPW~L`;m9^4j=N%y#|D)xdf7S71F(d8e?j)HUOfU z249fXc+jvemGR}-_h6zZhsdIZ*MAL&oY*tn=8Ow{lO-ilSSd`+GYP#SrF7m6KDMf(K_FoWWf zFWCm{TekVKl)GZ(4?vwe~4S+nH`v8qr58=Xpa6ZXkA^1 zFj2^jywTqYJ3f-5f3cO8R+VjGP#6V!DLw~5=zW=MH<<32)+EN!T;I$c$UA)@D?}`? z8scocsx?iNp`cs+M$p8oJkx(d*A#kdDhoLS<~)$~(~Owf8nxwCr3M z6F)oD@;0)Qb81-YeJ6yS8U1t&2tu(tggKm892p9y3yb@Q_8yY*HVC;!L6cLSg| z@ZKiYj0Z0E=jqH|gUfcx95hZkxZ z-_{zB2(Idd@r540ME5@tB-Nhoc(#Om$}~pAtPb0RAWjD&?D@pR@~j1qpxH35IKRRI$=L6)=@F>T|vQk zlA=z`uMfP|*ui1zmNH{Cf~-f*f#s6A5<@wBB894-WyX^i^0-+2#Iw~{eTYZtm1M3o zo)q&Uu`LqzpvqYNIqp&^>XNSpUoZA}KA^B;zrA`-im!xjldn^aCl7J|4@5?NolaTg z-+dI8uQMr|y4bTPwOD0$@Y>rg82~*;Fn+u|aoCX^qt#&{;AKHCW8DoQx-5 z=jI-!X|d5URvE{cw+xo-B4$V?LAh9}L~E3ZvnD-NVookG%uCCJsk(?;A|e5_3BIt2 zhI3(FK{}o>w#clqq97Vm5zg~*2+0>S&2xqGi?zWV9*UyFOW1v}Hh1nOlKRu=i*p~- zdJV+22J_i4se@`lEg19^A$pkN_w}d&d^|Qp73MW3AqxcVqD6^(G3V{1BBbcPopo6L3yL1FIVG zHN=?f#w9cmt4u{ET2qRN9g`B8a#^v~_*3axg*nq_PW8ve6?)An#Sj1|T*3-lj;vU( z9|Wz-1}8264i5aNF|w7L8{$6hBJnjym95@%Ez}_2pOD%zRXOEGRYZT&qy5Mbv!bKQ zN5v`Hr(|NW(}*)4v0EW=f9QsX+0}DY>Uyu_A2a)RkNs`Q`;XK69yH=zh(Z>Pn80#6 zHjRKp0K7}$gPW)V{M~9VP;MIzohTF0>S#LgYwCso$WR61z7VU~mydh+w2r_ZT zr;1ESt~8aft|^Nt`p{$LupM>N4_Ss4J!u8hAe)j@Ws?p?4YEl`T{h`Z)F7L5OwT4A ziW+2-j#=5HLs5fn(&6lC+0-LV4Y~=4b6-w24RMHp@nkj)c}T$AO+z3UvW^wOXb1Hn z7!`6tTjp`ehSn&aVj#NK*qaBDVi0V(<%PqNcw|YwyPuq`aDNL`1+7~-rI3|?s?XD~ zsK8@g>(?5eR-Y!r;#@j7C_GNkWpc#K!CA6n%l6I9ELk5*76Vm z1g5I>`nlG)laI2pqkdUzLBh;)RibyjtXFsOXKIQP2t-K0PbgAjZnGvAj*t7kCF_dy zsx>~Onvq%vC*WOgmT|$gEY_eox!9bHQnw>N9N4Ed70?X@2K&hSX<8@?AWaL^8H}Qb zQ6@*|;S7iL!9NH|ZAK_(ssA--InYQbUfSVPtV;`p;KV0*6ANhu;5zFQ&1fRT3;D?Z ziEDX&5|bcj$4#uEN|&T2Zse0gPDet9-4$!)1iZ7aQsO|gmX$ij7p&BMvyEs~(7MF0 zh+!}g^3NXOWH}>fU0&e6olr3QYtGw3YfOGX&v&GfUn!|1+=^JixK!RO0mUh6bl*{Ru1M1tkt?Swg@))3z(0?@jyp0i%TRp88@v#ay^<6rc!xY!$+P|3 zphJkOJ66yB_T2B`GCWD_aO>=~Cm?Hy#Y($<8z&ZFYdTyFb~GIFSXISg^Ez25@oQ_qsIB-GJj- zS9_||)0kGOs-#~f@=4B{tEHppB1-I~zsRN636#zk+ZRZGz>afB?dN}RkTJH`nwX~V zhqO;u4vGq~ob@IAxcQ`f%oyUBLhEIYczkgXqC{!IUroRtNUE54WLpm zqX3CtII~x84M|>iO4yXAT*7bDc6~wi}9EAg-~`qg4SFx)%oz4C_WhGTaU* zkA%D*iBBYAGQRiWz~|bsp)@6kaj}vfyMZRk*<%1rCUcT}BCU{Ai8}{*h#l!YH;*dk zmdJ+TQA6Kh?~enyd-=mrdtw{ekY~B*O;`=;$Hp zAPi$dqB}wVchG+5m0a11OQCd=L$*2p}&MzEzBECW(dJR3%Q_ z%;*}#oKkE04v%tU)DFA(-h+4-6ZS_SRcUx}e-Wlq_}~l4B%t;t+CU@v>tY*XX1xD# zd4g%@oX4F3?dq$dA6xALdQoeB7m;Obg)ksr)6E*pZ{#FB6L3JGis%_YiRm*C?zcI3 zl8z_13v-<`cx~MXmS?85D>dFI2`M3c0ynY+RR$ z(8kl4E~KiC>Qah%9L+RrIG#U(QgSAqu)i~3fUh-u%qy$9RABlC9vf~i0f~OWlY>OJ z-;+Ti^tOUS6AMK9u!tUVmti%5A7^s+RB_mg%ylDLSp1y>Yqg~!Kc|sumth{jj0Z32 zuyvz9QOT$D{=)q@W%jDO1iiN#9o1#D3t_ERx@c0r`t5S7%2FdEH&AXd<-V+tEP!kI zjz+B8&Li=G2@5a#hBdwv#c4n_U->VpsZT< z^=_xJFY8`a=qDE=4K6f5fdRrvAEn%raHM>CCm zS@-@;{P?_7;YaCd+4xaRy)J&-eD?ntejH!>Z{f!%fb)NiAM=*}@9^Vd%6-`c2!0IZ zdr$oMOVcs%V?Qsys+#>SdHZtu(LVlI`0>zJ)caNVq0U6o<;%Ax< z-C;NIOW2Pu-!|NXI`|QL;=gEVB1AQ9zoa%Ahb}v?v~(a)C)=DH2AC578z-SUkZYY+ zgEIPmxh1QCx%_Lq==wuxxHAcN@gr6A-@{nGY@2}JpZtmRC@r6)?GPFklnQ%|DL@Vz zXKX>02TRY#zXij~gr?q86MDKWb$y4rYOMM&x?``lbP@`Vnx?md=6gh!)9!~;*$A^z z{z}N2TnFDg5{*-7ulbeW+A*M_Y! z-MXW&*17|uqa#Mkdz=>#i7geqCGlUBV;(Sc(Hg%;_gZ!qv}`Z-c4;do=d|qftA||v zHeEnQbBop~CNyp4HY2cw;0o}zrQT>S9iFw6e(#kY({GNaR*FqCCe@om-j1-`!Ybv- zVVEC=w3>ZH`O-&m#;V2cq|p#;VI4|@Rw8Ap;}3~*psgJ1!%}gy7Y#GGJQ`!f6L>vh zn{-w5JDltUw#>U)TX~!{*GGUmv$N&HoF&{1nbHW!=MCjXJ+U1*+R9#x1xJe$`M@wE zlfHC_;@+k`XMR0#4q4Ou@eRCW&c?s1=IjR~%zrtC9GojPlBrP^nkz_XO(V%|ZmDl+ zCJaR{ZIuHkt!Wd>GVvOJj?TY^vYGru1xXk9jTHEkD$pSH8`eqsu&ezEzl;uk)A{X5 z>{nT;fFP&lhLsZgxI<39`sb(w?gc$-XF|eo zE57;h0_G1mRKKI(@E}R5==WvFB66|A3gSRG-%oYE-=@AVmG497a`*RK=lfOad%b-B z1Im!@?{B@W>c2pJA1mMgBK6~0F_OcD9&19a2R?}U2`dD_b-elTblr#cBOzLuZvCbH z_%vr8V@~~lCrK5(d%Cms5+)@a!s7l-TUV&13ssTT`)iqpcu``g?Ct#rl!!F;TWV;y zz0?!AMtE*vz`rXvEY~V^$h^TcyGIfoRVD6kmy}i&tKU%YFg6p!+-LqKR)tMKUsu9z zz+-cow{4Rw*}tvok=8^)OX3ovEf;wiD!*(w>FNgN!IA18eN_%vFr#6;+{-6x;>Z!r z@!Pz>(IA|$gw9wlR#9@Ls3__fL1o~ecBfQh-ae8Ws{t%zwZe!`hSKad;y;ke6`yXH zmvf-s3dA==KQTI%PUVCA$HfI@3E70q%_^U{XG0<$InE#0&3Ws`?m6+$x#5oL3g!oX zyxK3|!?sRq%;!Zrq7gq5qRmx!C&Vtli?dyV3~&#yJ&My1>1g6Aw|MfO_`F!-D>;MB zwfoCgCgCCAS82|vNPHk&SzEut+{L-?O-25|N8Bg>IWLFK^9Ag=C7FH{o%DvFe_pOi zjyKGLL=G*OyE1h@w#BI%i=XOBU}@f1p{_Sp7?Uj@Sl5S<=@hDRL?)Eb3e^b}f7yr+ zZV?4{sl+~voDba<;qPO?OtJiK^P`UDyu8@{hqTo(&c&2*3R5J;V;85*b@orx*Rh5I zc*oc}Njt_)op`cH-SyaGy{$DpDU)ISpn=5xp5(W#sbZewxBQ33`zDoQL2@Sj0Hh_1 z6fR_Jm3_XdKeOe#cuIK;z&BfC*1HTJZTQ)N6*`d(^0xF;~4kGyu` z6_iW#{cZY&@@I#=g%=dBQ0;e&tyF0?6GlB^fK4D7t?_4k<<^h;PE~hcq+U@UFg<^g z7ff`}l{+~W1y3#~47}_mU~J)fnlh{#SX?)7lu2zkhH&DAOHd;9GT+>)Fbrywn=dPD zoo?|ygc?MROdeDpQy8mp^F<%03-*cROZ*xX68vPd}`Y!XjO@%ZExS~ z0OFIx$CT#VADnLvJ!jURCBw01eP=@Mt>{6YvhfYgyS)%1+A+>Wf$s?lL~k;zA2t9z zd!|%tT~=pb%Y!wJ>ARNc8<#bG?J|9((hs)q#=Q#U&isAowaeXZGk@Qc`AgFz;l>jA zd{pbS=X{;__Q}qCZBEZuzf=Cd&X-eF_k7*+@>kE-l};Dz>&chc-DAEc^Xg0HYv8Lg zUlpR4uaI0I?k9>8^ZeZjlgsB2F3RGo_jo&om|KxIyP@tJ^oRVX~5VXO;OPXjU>%twAape<(!Nb z`nla|zxLPv z?5+Btt!l<0EpmntmkWmu?bl)|`Yv$|?z~pWZutgS&SjH$O!G6+;BwVq!hYxuw4qH$ z!AqHd3fIo{gKW~E7b2ne**q!yQ`#w4QTW;|= z3#FPKnFMl<$?R9a>(CJ?r{GoJ4X@8W&%o=Ex&I-&THa9bvPn`!|NQ#@AMmP2eg+ci zJmUuG5Aga9X%BeqiMsGIRE{2?$ndB3Ft>R1?Z<`}{-3T5nXJgyfrCKjx^I7XroH{J z3zRkX{j_Dx$E|c~f%x$t3wht1(|x3~=mQ0U-;tz>)(z?FaSkTtj$lzawzZf&%mp73 z_Rpw^7VLYa_e`bCPkl>Zmb)hB%hyrX@$D%501~Lfa3)qAm9KR zGwltBTyU(lmqvIL0yRq!DDN9tu$cY6g2hisQbkV>R)i%olS}gE5~-U|nG}^q?h#Kb7CYPn5qAJ96sWm$j7x8K_qV)>;ptiMC1MYuv(f6_s;c{-iiUwxy?DEWFOI{GEYDIMFxB#aTFGFpfVYoW?xzs?v}-!l8VH&Rdc>UiZ~X5@Fzk&&PG z&euc_rw;tu6~9_*)e}Mf8o=>p*!z}y0Eh_y`+&CWMe2VXqIa>b%m#|!zW8%Kg zrRk#;Es!~Sg;HCcSd~aBtXX3*{1F@OY=5}?t=OU5dBbE`jHg2a&uUUczk9Xn0d75N7s5D1th+%NILI1 z%9m>wZlt3t^i zB7Do#coX7+TE8N@{t^O^CV$CNmv#X~6+Ksn+hPQEHU%9IE^(_>=aLGd_6@z%IZ30~ zi6}rgaB`fvqXYIB)g{g)?@{|-kM(%bfy{cGYwPWK#2|D9x9x$A`(4S&!W=9ZTMS zh$+y@Bc;=|a$Na?T6tq>1Fv{+JYTFU2jhz^ZXd72nh($Rwd=)R>z2}ht;I&7?=q~( zWy-p!m3TrG=9XCV=j0h%jOV2mJNM`emH1Cs^U7k)N4hhebyTL|1%gLY$K>J(vnJM- za&soN*l&?jF$pe1ffe^{A>5G4c@{Yvo@u7f6j-Y@{g@Ss7S4&tCsIfgFC6~>aTO>D zDpa(WEj@(chNCxw!7l60Q5D2VVy639f&enI%Zm9k&QD+>c&DG!RK0d9hKT&VuCziM zaIIf`)&_h}@~Oq@8cm*8i-d56fo)a=yvsZ(D>^4`jUvo>I! zUmLKvSSyohDO1x@mY$X}Hz47XH4jm&n<`}4o6^enO89eYfof@K9m|lPh*tbny*_)B zw)C4avY=J~Es_L==~&y`eq;w=_z0?zZ%{9gws>(_alNjcoltKkm6q{l zN4J9~|`RHT2^TBW=#QQW&jAKJ%OcoV1d*_Hdq)uW%H4^utNf}FNgZc5^9L_v?} zI*e(bwsgC!XzlFQxp~rxOw3ldzZ4!Yu9z1exi1WPA)xqFTPl7KRL1GHyevull;0}| zIklO8AMx)E{=LU1=8eD16@S%C4q)~Ywd7_!exZ-czRm~tD+CTpbn|(okeIC!rI4sa z$jh9w7G3Xrzr6eV(`d1}zlWUf=X8I6rpNbk=lk*9-`l#iU_JI*Cmv?Vs`5A7hI&Sn z$+NKfo=+^$=?<;u8(Zd!A(IFi?Xsa(xRU#*zS^B-thtax4GO%dEgK_0;@9FBzg1f{ zT~=fHb9%!aXwYuK2)lrFi5YpIZSiFMq%h$RW2(k`PPnuSH~cE;ihmdEOhe(P}$ z#<-xZ~JHZ1u^@F$NEq{5NwsM>os|3efgr8`2VK#{8t2M2qHl<~MLb*Ace^yqv)UT;A8AO12 zfF-8Fm>AgP%X*WS4@(-)yL_;m4>p!Q%1^EF2GF{8)Eyq}PH~aWKx~Wrh|fc8+oLVp zD-D*vpla6|D=DF%wpT%|UHjo+c_SVI_VMj5a%h;#%UbJOTK)8N zO3oj}S{eUwW`V%hdV5VN9dN=MVqIJvd@ic)UJh<)t!bD(esnN(w_nZK`Ah2VX>|L(rMVN15j zK;uOV`H?ER=y)z+bunn^Gpqu#y`!?d=487v=Hl1Vhn%dhsI0F$SeA8l_AGo zh+;4D#VHoDmaUU%rneXTzBxqseBZPi-BH#89w-Aj^*jLIQIB?Z*#b!3P=gB@S{A;Wo%j=FDJwTtfz?DdMrSFN`S$WW(W0jAt=WVc5 z*2kpMyc&7t=*>BXQ}22yxlld!#=A)wV098uMlPKpb1u`@|63h?Vz+JwD9sF_*&fEV zCIBQTuQ7isWN=DP_r?BmuJ#5!WhC6%>m#4TI?EZDsy;_GENcK$IjwOnW2FJi-f_(N ziBLCd%(SpIW|o27tg=Zjuz$G&x!)Sn(e8H)h2I5#RV^~caA}^5hudK{A~D4-qCU1|$rqq98n_(;Dp#eU5(6sB-&EavY>f+*F4&DPgUa9erl1lO ztSFF`3eqG_Qr!%G+4vSw${pXIb~^Y^V+#MjYJ5#&yUTsjrOM^IrI?<{=2crjki2z7Ve<8o7bW&tds!>ika1486N3~C8UPF1iW*n#8ERbL za5IQ};Lr#6`}2KOH+#9?H)pL$UdUUV54SG9U zwikF?6Q`@}-~r_ylk$Jx&*pFS|D8M!qIRBtD$mb?i9E;U`4>zJ&r9T4OaXX~$}@ID z@_fBKzonjwu9oL#oc9yt`8id#s79WDFSs%#D+t4q_iaES9<|;403PPlSw#MSgCDpB zsw9IwCO=TlN5u~m!VhHA^F}RGjNSKZ>1`c1Pk&8(WUg$LW;^@3cQd=XZ0hHMP)7W2 z#U678IKSDCUg|~yoigvpngV};yX@zBy_YeGHL$S5^F&xnv?+1#R4Ssfy^#jr#z0Y`~4l4iK z`#gabgjesm&(C?5rO2ptw+v80t@S;vo+&=Tjp;SUn z;M42beZTe~?~8eVtp00F;+W#*ypi}Oi4QaD;+XkW@KR^rSkql{$Gw#NJHMqr$1KuWqNQzB_*|*U=;hJ2)x}jtv9dEQPrE z4@pXR7b=+!DK?M-8<;S&Te=dVP~@Sm2HJgf)1w z@}kT>eGVHhW@=G%ola$VG)rSrC+lvER2uX)0~;<}i^={T*AWbY(qeiK_qI}L@)sFB z#gJb=#r!0pQCavI&&~BDR!}~JpVp8ClJ9PZCf+R1m&vSKMcDO#r!Lg|KU} z1Kkd5>y^XW$**So)zUSIzuE!nTSk2~<~p3!@IEcP)5=k;e4n>L>js}rrA-q2)^WPK ziYKLiu&N4GzAD-aqFQZ~)hy~xky~o6U!#U16OVSY22HZLM!<{eB`q`d--qLsW1)w{ zvBBWB)!1!HU~JJ=)*&z&eb}(;;p`i`Xq0J&u&RkCxTwqV>w%ZF*zcutI6R5WSf{NV zpf*dl8i*Ycj<+o4|gv{fmS7|VX|CbSH4I5$Ee!+DeFVl8JE zY!V+N1Ks=#C@B&Pmv2D7^w?U6czcfhje$ZmlUm~^X|~oS&T4UR`Ka1i*0QZ^?y;3c zAH_Z(`8W6{1=*lA6E8hH9MwsI3v6Y*;#I)Mn}~B8B0ORe*~_q|R2cEb96xLOK$1)+rL%y5#UzpdmT}g`mmsjq6`4pad0e5?2)?6 z4T%RyA)h&f;Zgb-3|96&&hr@x(&V~SAb&KD;vAc%->`P+M&h?rlKnAB z4BgKXKj3ZlYF)7cmWhKoQP#feMQr@ zT4H8tHE%+~7;Y|I_?F1YK`&}HQNxJUEsXJI*24V&{Ir^rM3I+ZbUq709VU>P5d ztcy-gt5K(v(orIkKt_8;u8@&~*Y@3yIU^Tuu(FW1xt7>3j6TAJ!n@(g+8s;Tu{n(C zvQl$BszH6pyP}UoPv~#u3K;z7VZN$yFb>8eo*bOH4kZ(F^3gy19!0!YgZd&^T(pvP zu$}qK$V2F(xhV^>n75J4?1g^*&G*6w2f1$6+zWwUITi*h0KY7Y0i zJEolH0AvP>FjJEgT<#ApukvQH_sDxe&%C<%X1(6h;ja&x^L@uIv6~KO)gEi}ilzDT zs@&jmg9#ARZFEOsyWLz^HWN@phedwUa5ayyQk;{1WW4!0e=M2AbtnW8xeNXpi zq3Vx2?iW9iao=+&d)!@$v4PU}AE~msL;kJGTJL66qMp;=wBkEP1`55U@?Au}goGN) z;2WR3*-cMU`A$gJcSx~Lz>R!Q@kxK&ZFjiJ_u)aOi;0eOz6?zJk%2-ts(kI_OZ=ET zEA;kprJls`JUaUnp?A!&ISH?PlmCz|onWw5-iE&kmvG@~66-3TRW_no1vuIm*rLVe zgR~*5U#;a23o-p27^z!z{xD82(C%d-P>J?kxkKXf9x|~W>0`bSd-q}#t6XzKR8F*I zJE~N;RU*WYKY5MtjWyPEf30^%h|shXi3kgyP4Fm%mj@zUR;yw71R)|mOFqI5C`607~@K-=8w=_pms{q=}uSCYEMjf0id z-dlQLL*$Kc{1R`i*)OO)(^s09dugrp9fSt>v-_wyX!fOIY8^za149HaR29$rLvp19 zPtJB?+rY2n{myUmY=R+^FCkuwtQ(Wq{Rfl($jm?2ke?#suEkqlwQ>)w$W5F|nMgzb zO+$}JPv*VmlzsDYK<7z}q&{c9+=%&@oqb%5W%xth4dFoN z+>`28C{DSgTbx9gY>>wEKud&3x(4O@X)DXB8b4T2D)E6|WPazZ*8}S!YY7CHgX-Rp zxvcWmFL}qaxX)UvS5RB^4#B-n6n1sl)AY?6t60}%_wXDv>wWMWOCLqzw@$m2gnfq4 zKtZdlJ_y6J^d&M$WI}6@AkLjvGb-6%@d85fSavBt#VKYiseuT>PV)x;2&0FVp--sg zEn@3;;v=$HXI2{5DQptTx8R1v76t{pgVsE-@?#*OEtAt|IoXl3Wd_4g8HooaRB+T} zpB8JOghUx5?!Vwrd^WS~mk{0(o1vZy!?mSyiHFngMwK~N^}AJD_B)yKd$ZeX)$Uv& z?I^QMZD}LVFg{@MEa9PpURYAL`3=(aoU5>$pjiSAHw*fLWYRi=%x-;dp|m{rxO9`E z*G{hB9TM83JSR@(&x#sTf-i1Q$hN4~llr~W;7Z(IE4hr8YRv5tCoZ0UCzkkJ{AK_3 zj})Ikaf!d?$Pw5*Y}i#Jmi9G-A>4zUF}I%+TP-o1jC^+ErRCV)rnImE+a+FF&^#+4 zAv_%y(YTh-E8)`7BJe}tQzb{b z753V1e$L6}`wdwO-=R;AKT&dJx_^(m=jy>yIau#mLg7!me=$~-nQi8`%B-;dQ`v`H zz%LbZEViC}mCxO;7OH#~W%9Z6vQ+MHCGY2a&afSID(~^>yon%r(g>6o^+1j%{e#rH zNAw&{EJhftB^zaitR+v87-on-V|pczxJl?`ZdxI!IiWZbT&@qH#0Gx0>w_UxIuHwS z3Z>6?v(9wWS(2I)rY_f~wd+?Sx=v?xrIa3yl3sk#D%v3Ifm?|Z>PtY7FH_!MuAH1mv#Xt?=#P0B%+|KqJd-pi> ziq!S6Uu*h3DPIfB*4WPJn2VNZjRR@es_~s#jnVGJipcHgTL%NUybEfy=;g|5MHblW z6vRb}2t5Z@9)mQ_jt)ro31^d*UD3NaX?pz=J2cF#T1f~@nn9G|H`}eLv+axZ4iD|0Y zDi)iF*67bqy-)FplSooUzuesih>WjHtc7r^@i5?g0RZOBh$N^48yjS(a%KSi$_7)t zGSrlKzlcc^7IL%%h(rm6qLhaU`}=<-hyxE2GCqSqy?$VpnIK8;sB7?0H5( zw>~9kexSpL#1z563mD50HpT`*A)D=C>rPo5Y*O>X@sZ2Xx3f3c4{plwm>uHa(N3V2 z3_?$K5xSRt!B{P7xELLoBG{~3$0=++2Y)v~W_n@Xcx+tm$(rHElOkRXZfdIQ3E_ua z{6OSHt|{3X-sCJ|Mq3mOMlv|J7RGP*&f!(OvGk30YUbE%yKO@7Uvs)!VH{ z?T6t_i($qbLQ;S>RaQw=E?gfP)s==a3E2S&Y2mCBdCBTOlRB0h%mGGo&qV=yoMhL~ zj_DAcptn_i7Vu0F^*liLcFBz*USb5}g57CN0m-dL>7wzhbQIegPlrNi0jzoNPn^s8LQC%!ad-V`+2SIFjq*nIT>iP1Tbf%lmlC-0GswDO1#AzMX)1`CT zebs{@>zQCMZp@JS?iztFTcnBakXPN-HVzMN;_f|ZR7)Xkm;Xo{M;SV z9y=kjOKDc!Wus3L-yWedD8F;yUm*jzNU8PSmdGe37*DYfXDkoU^)H&&T>MNf@=!C{ z{OC~bVNuFA;>SCDdjAQum~3_BGi;BTDbA-|{X4f;OhV?tok{GHvQB3swL+ZZ`MHW8 zgmK>WxHx3(6yq9ame|KiY~TNgO?7its}5b^9A@ipX!lQUyP)Sf`TbaWylMOQV-LCN zD~F8KC-&6F)2eN5r;(8p4_|17(%#dVanE6V)p;Bz*L&L|vp7*Uyj)tt ziRvEv#nri>@I=n($M?jWZAD zt@}0oiFd=}3HiM`^SkJe^83Ctd=x$y4nFj9@S*p=iw|c%l?@nK0|w4$X?)P7oh*D{ zY}IU2IJK}d1%UxqvRC^B4ycf;m7#@_F~!EBi7Qmp0flR0!C79eYh$tgB|f<=v43XU z7sTFo2O@}VSU(ah&cg3%XR=+qmKE4-Id&akdChj2-!nNr2&y1vUkF(MKg4`r|4;3E4B zGH~`YOIulsl3-eIuQ=5E8fv`TI2D2=g();-25OW|gV>S;acUMG z1hxoha#zV)b%Be$XRFr}8#m3XFtNL)tj_Y7<-h%vT|Pgn%fsC+zeAVH>t$AxKSwoZ?zD5WN1KR%RBE7!@x-dn8gk-LWzXNwUElNfpKk2&JAGGU zHvwTrp%~fLbM!yQLbS?koM$+|!ewp9s-x!<2ASz(v&zh8IU`7J>V}WAz|9?s5-L5L z-3ueh^fWpZq=)3}-(|-{vwyjNFJ5`{{#}+uukZO8{mP=(^sC4I{XE+glp9hkTR4oO zGL2Mb74{XaIf!V&IwgOf?y5?i{$`QoEU^8{{=WE+qx+k^zwCJMtNVN1vH6Xw-EB3^ zZ`}6iG58JPJ``^#50wndV{d%R+s%Pw^`q!Y>BrB~>l6H!-@kUDkhR{94TP}{?tBT; z<#HhHf6qp%Q`Pq8x@o%S0<60YKc(GO8N9kt;S~z-dW_c_|IQG!RUa7M*R_>%U^J?G zI~?Jl5spS6!g zCb@uSJ0Hshh8caIL^@TZTF6#~XhtjT=uW76mPt$&{X6r(0}x@+sJnb-g5SwUGVm_i zD!&^uzb{-T`7g=jKko_oEkc+~iOh%NuZ_Rp%5T$OJy%TevBX!VdgjY4t!h-0Y)K2f zd_G@WIfY$%oVZ@pdpE;^=gp)-4qDX$a5!hq`5eyq{$n%Fy&UeIKG{nk-VUF$|$S>90|j^_t@ar2j42J*6~UUkdd31bl`dgcw3t# zH*i`&jSh;{@GT3)w8r15#!&986$VB{*v+!!jQmQ@1Ai>mn>Xi3l>dqqYN8SncJ6No zGibq^L?@%i*0|P{@8VS{sN>d_=GZtaa?Lz@OuX3R97sM!znQ-YG?W!5t4NpM;S3(0 zIYNG4;o_l79#$j{{pOha&#?%+*7#u>wg_pChnH2y)>MUIcj1rVEml}3*bhGH0JkWu zVv+49V~_JixlD^yLbnxsA?z#)z$or1=+Ch6)Eed96_!SG$h!r+@q<6|bq6b^h1cuk zl7{+Vv~NOAkj$?JL1_z4$5Z`vjIUU@u`@kGbxtWsMlj%HXUV3J+sZXoO@jsSqY z-+-swO)n8tKx?3^!1cg=z)fN_$@!hlnj{(GcZ9A5Ui+p#1!j|N`hDw12YNiPKTnlp5AL~J*~Z2dqJzM zB_IUvfc1WCMXT;DqM%1^DtW)Zwf3Hw1hDqJ|Gw{^k7o8|?R9g6+B&WnuvMF-J0$4Car7ax>~YkKC6uK?-q$3G(z*Beyk|$tm(|7{BkVYT#IHAoKbqZ}0y@ErOiK}qZl;9i^8msi>i5N5%FJl9_Yhq> zK-BMg3JKUE1^Kxe97P-cNoK>r)UBrb*e)t$^N^G1mrv%Hf<1_qzg*=x4zM8F{9tY> zcj|!av=X1G)sOOAv46BR$7omzB~jw-yc?)$jK{_kn4Bj;%%JTn1Mphw{nux8$w=9n z{xA40zd!BnQ}VAu*!d4s^G6Nh@mjh6(T|VM1M8cg+kEuqO+qVzI6r3QEWpawNzXK|Zf;l92hFcl9yqvVtNMG7z zljKh?gKanSn)^)WJ?Nb8$0N36#8#>ABh;lYhx6r#O}UvSdEIkSq_@fstN4sR!#uI> z31{h*{OW*F%k#Q5&eH$nH`jo%?f1;b$XV+7A1AJ1>2(n~c*NX!w%nmZbh{2 z_ojbN$68YpUIYmOHfC^kgjwjLNU1-eN+PAUD>j#~=r_!(aR{&`lp#Qpm$LBZdK9H> z@>t!j`KOq1#j%p9>1-m@7Q(2sADKiRa2aLxf!8n&nJ6atpleA#RW<;sip$xr+`WvSGw3@dH?X z@v(**S&v(G>sw8^X_4-x$dkri#a*qH{Q(~U@I4Jz1AOj2TZ8-4x;3&(T7C6^=;B>>{QTz!Ef^6EDrL`rF#DE# z)#QHckFValE==ek5CVLIlH0n^_~+9rY709SgS@~m!SO2oXf7jBt)Adi@2+mSJ&Dhb z`WPaJIIOSGg8#m?3k{!#)o~ni+RtN7?=_w21)csME+k)(#xr779-!N(X$9jAyBvB44-ol}k#WFk8tkv**Lozz9^QcmNVns>Z*@+<)v zu{F#q=fXAl{A-+th-O;reQ%i1af6l3WV5%@6t|UXlHUsbdfTWZo0i39qARTvsQz(z ztGQs$tZEsP$PI6kU&Je=mTo1o_n80%k)60J3?rycg?9(l5U#S^ejUU_t$Vi>%|cdX zy=A7I!L}WvaQPd+-;D5*<#SK~1Kv|Td>eroZHl;(SnAN}KUo4wNIuEJ$uJ{O1c zNrA!yEDk4tcn4+TJ2u~2)!5kJUHU80c`_?K;8h(Dv$L*o7@NDEWI!`9*K0)H)Y%kS z)8sZ*G`Z(jHq|||;P{XSKjgR{2z?CM_I;s`agPmvl29buSdq+5s%>(g)7}`{RI@s| zSdoSa!)Ca-ak;@VrzycyvpC;Ml)PopuEybd#jgP)lL9`;$~D!kx$2;3nq$UNp)POj zad0(VHZ-llHjS0~jz<=xZ|A*NuR`tvP44j&@y2myMyE*h8kq@&b9O}{vVprwLeV=* zZviYmdN}%IwqJ3l;nT1eh584bUx32ksLR^1AEjv{G>Z+GKPyS zgPU^A_)EX!Ju$7!h*#1KgG0rBV&3>wpaqErG*NA%u$Ot4S@rI%{_v@|w+7x$Cb0$| zdD)`kOjnO-^EV3Tn{uq6`sZY}L41wt7xD|K9`E6v^Zq6sD>3+CEWpmBnWn7d5E@H= zJC=-Wn47YTX2K)%=l>aEX^h+Dk-QLtz1w>Pj*VAmVy4Q^SjX=KivJ8Na;x8bA8y z?%L?(uIo>}VzHYGwxOWw++6CNw}|FBHG``&*T5$RA%^~_Ldc!mr{78ZA^{0f!_@W@ ze)OtEm+j_Fg*!HPaE^pN@|F{f$&*g7;!d$agI@Ebxf@VGp?Id$6)lkyy zcu_xH9UedW$K^JArORExCG3leGyS78W-gqiil;8E;Eiik%{J^|-A*rdZKMQIl==f( z{}f}>$$1jG-vpe4dhA_tz0MztA6U;#!HzZbht3UgzYRAOBy~IF=iGD;dF(;ir8ZWQ zb)mv<5Y^=D=`Fj%?DR40l*Up1VRFYPlILC12a%d{=Pqvw5j_Ovxmf=`{;81iqCenn%PjEU=!?f4}((d;dn zG%fpoXgzbOzRb-tG_X(`=scb=(`^(n8>o~vwSm@6Hpn3J4t;OR{#x&obuT!Xm$^@7 z7cI1^BNI$(Ga`5R%o`$JPG8O$rB3@DdgyNBc~>&mgkI{UD4Q{K zO5ZWTwnvslwpV{`RYq5D*!pmYY_h0pM(JdxYxs5NC!EX_(<8J0TZj~Zi)er+0u<3s z$wayn1A|Gk%@C{jKtp`_Oxt7y_mGU)N%B-2MfXDAL8Fp4SmrwnA&E#H8Z=j>KE~(D zSN5ZzhR61pwGj-7N&bRent49r1>hmq(w8Y-zyXXLvA3z{Jz6CrDB0{i`a3&kWSC*# z{d6)DbyN!?t&Lg+-iiLOAve5n>{xHo8lkN}Nc&-@-#yl={8t9PEfdLriuHMYuKa8ma_!W$( zu1SXEKhDDfe5*dBEVPjs!@PkChm`o=rg0Xg4~G{HXRz8es~N$dQW&mdQ@NpidgkXo zEI5#Hl1$Y-hyN+ucpuQbKdPuh^Gt`P1|2$ll3mOO?%9jjPJ~(qbA$wLbXq+2!UN_kKN%XFIg(OBSpJ0ccm;tP#IvjrcW-lyu`&i0CBCTt^osNG-OZ`on0EDWLT>OG-r?p;C-Ve0QxkI2&S1Co z*l^5B-7aV8?`2Yj4}DEn>+k(3X5R&k#PW?u5)#EkMbJzm!%68p_$2QSzqWYsDry)9 z!*x=hpvntPm0hZGoxc~b1=j0@Slo@yo$HhCYWJZUoav@j2)R@yBbyMGAO*>zlxLE4 zn_9Q#Vi74?eOS}(_-M1Co%9K8I3t!Z&}4V-$PLkKd?-1QD$RlWQKnmb!{OUSn^V^uAh(j3WB-0x)~q`wjkLz{o7E%cq1YmGm)?8!bj6d^}&YqWazKtppB3 z5C9yi{r@rSfI-Xt75~#Mke>+nPOajiH0e&QO1aNPok6AYzNzA3Vuk;02w9X_a@t4H z9k$Z))0ov{cBMwbR@=oCN3-|;4?h}9<_M}yMBZYWPEC$pRN*Y?#{-ZjCy}R}rMutZ zZOtCJwY|w@G<$Xx`N++--{dTRUTGsIOMF*B;50>yz)5~SWaiBfwq|L_Cea*ybBqq z{jhcZHSC}s6L2iclb?Vg+yoP#sEWNNKqU9yGXd|d{MRR-|3#XBmT6}2ts{#EF6prM zbz%-#aBb%*UU$Ey+FAMoHlcqo8w$Pw*=7F(NFB1;Lg@9Eyfux&LalcT+)sE@-v?~+ zII8fw#VBS^%wAibojTCJhl<>{YgQu!MXQ}h#)ya^GXqiNdcXQIA4S=1fW)mdu7iO8 z0|A!%B*vQ(xn0&5k=vW|w?`L$aB*{UzpDqt>Rxv`?xZlxttf)NLE`?^1vuFs#N&kf zw|8#$FQ+H&o*r!r;EUQGp|;NeRTPbplN>9kaXufn*mje--|mgxN@=;LKst^tY6|tr zJGbMs;on7rbfdKB9WSz{zTJvi`7t&j#y9x+7;1FsreWTX=TTlL;8gk#v#l2a<%_$& z*1-HKp+@UsWKVdw+1Td~Tww=nbjM3+JX%aW?%u&39Krf*<`()-Raj^nzF}z-!3m zZdI8gdD$R!?ErE)mG!n=sU~z>`B3>^y^;Tw<>i0E5w@LLEB~XK1GS^F-ZB+1a=D*z ztADhoH~Qzj{jvSY<@O_wlVGeXTCb1L7Re+acTV|-_=n6^Nn~N)(l7tGywzNo%R*O- zj7~3{%-QgppuT%gmV_+%oj^ji*4ulSPL?qY?X8GxG9ofmeMUyMx`|7KWaNu(s@t%j zCVy1z{;H9ZJ;YD7#PzkO0XWd06cefn_}aWWY$)4M92%!ynODQJ+B z**t)&#e1vuzWsOHgoMxQ20IsxKMDZO3h+QEYiT_{Jdw6e3s0l1sBY|0G~T{x;jzTO ziAg!V-TV85f{>>5xcrAl=06-1g9_cs5aoaB4hCu^Ssez_&6B6wh->Fx!u(l0VdRy9 z*S1k;JLiGdy#W>f6dwBxL1sCh!Yh)ar&U)t=~rN-Xlj3K#LuB>h4ZiX3rFJ61A@AL z6t#-phUD}ejI2V4jj|nQ7K1He3L>7i_*|vOnk^`bczA=!gg>?xF>d=NnTpKf?onbQ z0p%(@4>e~JJ=;PaKPkmh8#AVIb8H#C4&E%|jgEPlM_An?CmF^nc{h`n;T6xaa_@fX zPzJ@-l0FX-Ab+AI!dSs(F$qxLX@g&70^E#`aBKQkHBBz)v~7SFAX!9R1m8* zwK!%~cx}|u`-q2l#0MjmojL0vkJ!&E)-8J@*xqgYJ#!yj2j_lv4Z z`ta@E_b|kjaltemX@wRB`!7}JJDIVzocDB{6_0#2C^Xl+RXhh7R{k+~JIK8KT6G&^ zG6hP40^bS>Yy))V&tie*E${}AA}zPRu;M9m4xE6Ty|Qz21%XaiPSClqRJMBS8BcCx z1>#um>0525f2h5%vOn^{%nzx2!;9&fK7VU=k%(t{{iY-5Y#uPxIR)NnfgGo_evrmG`lb!DMs7= zWXdFRXEGZI%b)Y^IN3sriP>Y;KtR0k!$%M3V@2te}Vlu)g zle~)Pc#{R&##!~L$U1$&9Q@u!q)cqn-qti}ddNH8P0Wm?f7Y;qJ+J!~P;s356~U*% z1;(zUg;i4UmmPx9Hl7BOMA5kVQLio!5+T-zvfTo7c=>l1#yv=dSqe7<#5&;qVs-izEs zYj6QG0&l7egSjLBF7yzL;Vr)Vh5z74*nnbgEWC$gEF2UbtnK4Nr-Yv5T=2o6d z0x8LAZhW_LcQjS#Zyf0Plc6~5tTv8im(7*+_!tsI_q~uyBOk#q!x@x-*^O5v-0?{N zkbX#bn+y&mMx+<*0?y2{ir}|WztOJoRr)2bwRTUA8Ii2BUe!GILgp>BT^!UfBR#k1pw#l6Uu&Q9=G4R9J=r!WrFytT{$Qdq-} zs4fjzcD3_++fR$(u*VacaytG3{L7!ym;o`3-!ROHjmLEW%|OciQdQTuVSH{F?>2tz zMBRu$I6qM`5sb5g)J(MQZKva|prtYlj$WiCD^tr(t^`+V^0A(rN~F^xD7*l#_CysV zzXj?H{vToSe@p-!u&Gd4FF88|tFc_k#!zeFEES^mcLE{CF3a`R{L+*8SR3?W^Y?Np zPE@fyADts%{0Zhwl{4td3L~i}mle&=t!i0;y=j$yHH#iB83APCbYjRi`7Yt&y0XFl zGt@eK%Pzl`HzrmBiJ0G(kO#mgD2R63?AtT|Zb>Rr>7B)$*>~IxHAu}@8US~WI=_EI})|fC)R7 zwvz<6iD$1bk7uV3^v6(<5f>E+Z z6Ut=17%4=%MA&J~M6=B%fFb(GvCx*g-(3emyg@_xmqi`N<%ndv|x)C+qdRd9m&-8xy zD8nAh!ZWfyirMOtr>R7SxX#L}`gU%v?0mH%vYqRGQt9cUe*}M+hp%o>a$T(tWfewr z!hmSa8hqAZz4_RrElsOY*nmU2zO@0}}$=izIf`&6qulTLiuWd4a82e7SzvJKdv7qM!y^PF74qOe6{x7kBZ*Om>saSFP7zB zund3qmESEtzHs|mf2<4h{#Y}NKUV32GvSPj{ITlUjLNQK{IQxN>szfKmdCEMepv5+ zs^Ete5B#wDGIf5toxi*v);oIu!fk+t#kUDqfb~p)cP=)W;sSN!m-3ztgdSRd;&#jG z0y5{S$lrJ_>04QkhZDIk&F&%qBLC2mR0Y4o?5|cqkIRGK3iInuL8Ws&V9iPG6EL#G zxHX92R7oN#7MzAp$;r@}Qw)3o-I1#aZ!lpbr0!HGU2|k(%Lx#NyoXW|{ei@t^9B62 z!}vexZIM*=qS|E*m2DSQDqMp15MHqS-h1IiS6=2l+Gcbw=>5DUyM-PXV!Hc)ToAGP zH1R+wYPy*gD*Ls{AYoZ2lt#4)cYc*Ha+MvO6gT|SCn0*)MNfj{CF#Ju&DUJ^Mat=j z9)Vs=_8JO3*|m#Sa)_gh%bNFbOb`+*?J&daViQ-cu6!!!%4mbtFI87?Klrmp`-$x5 zjpt-7lb>||Cy~9hHsyXQk-L6j_+~-zn~Tc%?l(o>Z42KvRHfXDDnLHKao;}Yl$W$! zTN(NIgCjOELFvtXFuU8i9m#I(y;@~ZRBScm!)+LvjaphdmZi;39cuJT?o`DiDlAzb z#|*VtLk^zT4>s?Rllkc$a`vs@&?W2}4h$1!5^0NYtJEc+{TWSphc97DLXn$<;SX3h zSm?;Mlyld`B?Qt3=$+ryZ=<@lacxzKOs zG}D1?s{aHhqezLV(Z_9_0Xvn+awBna5EASe9(rkNRtxW(#b*4HMFBd$XD=uI7@Dj* zsQ=z724iE84TL`nTSAz_P&>gVa>@JZ$8{IBo3!n=nsz^9+D%onL?#y51#0*p8kVHE zG70F}?PlLb_4bV&wp+8*Ev2Xo<;h{cG*2_1dh3ukLS ze#ecv5caE!r`}bxyx)G^p|{h5emyXSen~SE^vk>Nk-gpi-8`^(%R7;R#)vk!KT`J! zbMD>suB9Bm1#5Xfu{T8k@m(Ina)e;uWWK@!|5?*iJ$q)zG4um(3%`s<+#VL(Dw!^~ zrNQlbd;34r%S*N;oV$)7oZEjHRGVSqm=WTi&MNDuvwV0#{1rc&>&O(8BMIq8z`YOy3- z-^4|F*U?VL&$viQ!umrl0v~E9iy`9ZQO`!Y$>FsAL(3=aotNjb4s$Wm{dvabFA2xy1(=K95xcU8C9|DMMH_o%E#lY^yM*$$m0+J8!r{xy>aj);5ifm9Y5xi=wjl9G8hvu zo+05iuCyB+9jeaVw&m0nG56A;6LMv@#@t%oo9a>Fl3c=kcr`Y|I~Sar|8fDmX~VFj zy90BT>PWI?UA95yM$3+27NT`)5m>5XtPH_w(YhxW{0R2|gbFL7ie?~>N$)3<1T76! zTRH+d8@K=|wn%Xt!aUyl*rf*VoyJf1kn_K5{mhTiltAaA(-^fgHxG z;)OroJSYj~QRXy;1xxRJasIue=(y?+gnG0=#25UWbP!c6^f6WidG{)XlTh&2MDFZk zlf-&=6Ln8rok`Ygh}ErfI{Na)$A-$Zr%-0re~z<0@`@vf>-~XjSavNKib)Bjx{V~~ zkcZDIFL4pLulHTPXa4s|H-cN`%+C0 zc4NiVB!+)?4f%iuFWon%Kp;!5sdjze1lSQ-ZrUG@l;9Fgn3%FMhp`)_nBjq0W+BrY#aT zVZZxD6B&6i@5q9ZayOmpKSW58!g*lv?g;OQ*UmT2-K(1y@1e$}Q&fJ$gEXJY^&MbW z{Mak|;dTRnFrV_%r6H09&LmI%4NU3WM`goB( z*sP|Uj)!R|y4Y854aqIh<28-0qq8>2fn#!Ck-gWi7c zihelDK4kmZfh7Y6`VkNMgSas3P4L>P?7$Vt(!?;r^LvY< z+I@n>`A+H#xD=A=aKiZbQLuod3L`^4xIoh3))`#_lam(+~fmqeFL zLbhzX%F?)tj&i+8CG;hpm{dYueb6=y$;u$s8H>$~8@DX6RK)H<7mzb-SIVvNr=6Us`SQ9KpL-CbPJ6vLmvc zyDe!a2DCUT;ZmD;Cj~s%(O6m$#IRb~NaxP(8=@f;F7dKN%}zV=tk!PyDbA8Fn~720 zB`%l;OwQDsgSac|P0RU3)3ocl@wOL7g}um6QOoDReuZXH)bHd}dd=oqlkojxP zP7wXi9Wut03*y=Tl5)&%_mE42q8eL=ve#|-rJ=9nKc`4OPX2YK-ZS!rA9Xs;Q{kTm z`;7W`oANNkS^z7_H-`G!j=K;;*ia`#itzn?Ps z{i^Ys`oi&l&5S>+Z+KC=V@$bl{HEL$VYz&sntZ!i3Q+kLQ?60%J|v!LT|;$=uSn#D zaYu^VpJvJ*9@hIrQTu=5RU!Y4Dfi~h!MML)RBoXu_q<)tGE;6{Sne{)^&n88y`?aZ z7&iAQFb*m83=o5Erm33jBsSH<&eEezo!9m;+x>MFVY@F9u6ay1IJOqH`|o&SVR;I% z)|6MoZ1+WWL;Zlat_K+~yPZ@j?C)kJHJMb+HaGdR%E{4v1q}upz2%C;=ubLJ#uWF* z7z{+-Q{R?6VY>6My3^8Ny7IiiJZo+kPPh@L3-7xaFZ>~ZXMPLORW;q`pF4#AX zCi_GFUA>m_oNUoP`K7T|yy7O!|D+N?!Q|dEBBgpqM)uv7+h5IrdvUMM0m_OwCNUzn$`4StBZx*}?BEdo&qmy`m(3~Y~7cV7|=XUSiH+Ca5$G3!zAu={H^IAjtyCK&M zM{$g<4B{BAO-0Zg1W_l6W3;w7juDbgBy8PJ_@4$+WE*js8TODg{viqUm6|(r9x1n$ zQ|H^bv5|*lkx4$fn)NL&PCmMdrU6pA6R`OS42Sf+VLXhG!@2tz=kE3H1?65gD)eUG zV?`pVmy`J_HH_G*w4!f-H|@FCc0mESp27gJZ=!TwMItK+y@X^h#K~vAknV5{xmtlk z9^nDfa{4uK0L>!8buuriF4-)vF`|5PPO--n&*{MD6KI(>6=>u?b2Kq7?K;ofj}l!H ziQ^$tt{-RRXzGs;N6@B4<%W2XD45qpQ74iJ5|(gBoY-YwOl40$gWlN8+5gybh{0#3 zxW2U~AR^DaC=(86{MsIY6>%Xn?JKILyC)iiXY@WfN8vEBsOt3Inf)G~C$F~tI`rVd z$E+gs>S6TSd8hDyLtjPB9Oja%r~!*6D>_wA`9Fq3V`QEB%l~w_8BI|(7Iqo?K)`d$ zp+Ub*jRbZ#sSu!)9EqZJk2g8vq*>gJZi@3M=EWtGL}cJw)l=?W+wvb_O(_LdH50UQt!CppXN&wGt1ttS4Dh~ zP_??K4KIf2B7Y22n+?93 z@YVlM@ZD{*{}p`Km-YEK;kyZD*h6kcWfHFNzXRWWcg+6@e7Ci}7ry&%9yeO`0iB7g}WidcbzYM6nytE3`}o)_ZnXo;k##4(f=0T zxevqC8T;g8U>0H^>tycwd7+~1n><4WXOx?tGRjSH1w&Szu3a+jSP1;5K+YlYbsNgO z6E6lWE^N7cF3-J_=H$ivFaNhjn~#tx5&tSkGQ_}0`Jdz3a~Oz(^e2G8rMW}h0h4rG zg4VKA%j9BGnH%^`;cz9#loL(O`i&lP_)<)pG9$RRlwypE5OVYCY2sW@{{cT@;n0WC zABx<2R`l#dfk$0-QP9h^-sz^7r{0puBK_99hWOz#cIwTj7XC|(je0OmY+^*``Pl%y|%pkC25o;2)BG@vf1*#;Ky$H z@6sQNXv?2n*z(`JAiw1&m|mWGTU*hV|2gwv;ql+F-*=z?uk818nV5g`e*f0fAHLr! znXIDye&(4)`+YDs-9wshDC~FbaxYGmCQ+{N$tY95@740_J^a)^+3yDhrH=&_A85ZX zIN*MdvoF0bstxV;VP=`h_6H;4Ou(ns6xgxFiW!ffs~x!dcYFUR^r z-aQrW+#LBkMU>5v-)Y2lw-L^FQvRfWJOUDPXkTaa?S-h?n8c)av-t=WhN7eq)tXW6 z1p%26D4Mr4O~?{K?1Un`G1jf6tBUr~CDCBaWe zis!weA2#?~YAxR2#LjUYcZEb`yZ0L04Y4XFhDY~UU3beFsqfYtr3`anFM_Egx zkMxn4AiGZb&KR5jv+n>B|0#nT+87e6e(GH(!{-aBSh?D%KhphQ*_XPvt2@carDS1> zJzOJE|HEw(S&t=2WVL??pW~I$z{oA(?j?^HmC9aN9)-TmQlm_hnUgwya4pCBJ2nWv(w$zuN{tp8W5hJ&oU+FTz@UQbF6jJvBSKza~l^lIQx zYq@W(9iEYWHS$C>H~1h73nn8g8-z?B!-7zzFD(IKKc@0&6aAeoKY{a1HbBzNEA9f@ z_(4_gGSSe()vBOvFx$LA-GW}b~r9glnj2pdF_LHex**Gc0i04fPvc8wpmP;Wl z+3(~5QMqfrR1rmwvT`!M5%o%p#9cJVNy>R>gLo2*y`wwd<`|TIj_#A1n&_Si-*khs z^g$kA8PhI(d=eFZQ)E*t`>o%w8e68Vh-c7$OOJ=eL`j>I8A$KjZaA!@<@iLlU&8qd zS?cO563(5Ihb21qR77T!N7DqvE@!i31c4>&>2`68!O*_XrP55nD1r>D#(Z+rE&*7kOw?X3{cxfB9VYSH|iW>dD&*I=QY_P;U(gdU3G z3OcK>NBo1$c8+P{W)Y{r{d??F*OitLXa9grmPKX^^j{S)nEe+QSy)O#fP)5io-{Z0s~-Kt!1ucb=bswPGYybOZ~)t$gR-_kd!pii8)NIMgp7l z!BIDRR)tG=WOgt6b7nLx4;%fRML^I8GK%@jwE5y9Z2x<~ku}EL&qh0ft>*u*2u_*z zS;Wk9pC-$RvsCAQ;^@1Rc;HU!K-sCZR&kTo3N`6!3o74XT72Sr6xnl`F&GnFbbYJv zk9j>3%Z-;Ixt)vQ1d1?o;Sb^C<`pBJUpM|Rk~CaU5lHL(gXmPjJ}g>yUG*HNT{cg_ z_L*b$kbk%7J62*_O$9OcN@^HLw@du>W^FD02-efT1P?c@cQQM56sCL5(vMMNs%Et= z%ejnZ8|n=;npzJr`ua$XOz|CLlkU^r zh(3FWqU7?p#H6Rr~oSW`Yo8ZqlAz!Q>h`inMO}oREs%%@muN&t5;P z8H%_Jf4GviSE`)M^{i$zdu46=)|S?2-Sx8s5F_6CSJk^4pWOhcSsIHi(RBrGR z;vLRO)op@s4ymodRFiW=ll#~7RzTW!-%7tW7Ks1LNbet!JtTr@scOoOC&z7~HdVLT z={TBcU|$WBoMH_H41E9~=$0Tr43a{I7y!Ysn#&yxed@98G`);l_Gr4{js(rIEc!eH zG=iA)M!>TvJG}^7CVODZNZ*f$EuVRq?2HDc47$9AdYN`W(WX%gf)e{840gVq_CL@a zvmZ4QI~xBykkE?gh(}nu2TGs{7ixcCXAn(4QNlWZLF5|NDKrLj~@l;@BAUzi!&sN8%a4YJ;nI7In|8g`ZrC14po>nT5v$rjtiC)xG2_`75)V!uqr3#q=(ccdg|% zo}F1ACC?2oH$3Xr*DFH7a`|a6lOwD76RXBb;LIvviB~Jp1?!2y6ZWz+vd-P+zP(tM zF{_Sab;hzqOG>Jo_-dxqjs!d7Wa;#Ir6gD^izdZBkMEl}p2Ir+s!NPIR2cH}rgNLD zU9{67F^56oWH{Lybtlua2c6}I>1lEL7Mox%7D-iCn}%1lUXn~dP^J_me*$|GO2V9^ z{bvm-x9h`X1ti0Z^k>KPSjb_fU>jq=y8L>`!WgF4f+1Al`dPl>S%rA|%wbU3>Y`zN z`M6+MmrzYg!mHgvA7pR(28@4I{D=C+1h!c|qzjulL@Sf`?VEb@ z40XArVDiIms%ze(@0-Tk=K_6x2|aK-$pPbQuI)NuZO^X03DT>Lg^Br!E$!xfn;SBq zq8}3eLr&rcGeoNI9&*K{1HcG&4E{Lb8$y3cb)jHVK^@d{qyJ;G<=J1>Inlp;m#~Ss zS4}7me&LwfH}KOv}vAI4NAAPae1N8#7;aMG} z3q?5|8+P>MiB}a}Dk1xvopG z0o#Uc3#mBfD?4p0@;7*hZh~K3&G1x0hm&hLO2151?=?q>hVNuX^RCzF8TALjQQ@I} zhycRO8OQqmsqAd=KFZjr1J|6$hGuh6mf5xuK1AIe(e$fF$7;4I>Xf0f+r@>iuiG5O#I($N z9OoY)ha0K3Io`fi&CZHC-&ku;ssnW7Z2u2Bjhlt>;P+m@MMYm+z!!240-tcEjY<7@ z6Xd*!N9c zlx=O}|ED_#N1Z{@H%Pt`b*H?~QSbw1d&*u=Twqk`PI)6)x4!k!LO*QFk+&tYQ4i)H z!U$T*F{X?H*0V??^LYmEJrm%>?*ub#2f-WWM<$MSfJ5Ud?-)3u=Jp-el)Ber(fm@oo1yv-|Cxw?dY0a`E{!2o&98D-=6CMo6_5pNZAKPU48t}RRYJu~uNB0I?)Of@kg(+$s~r}P&= z^cc`qG%?MvrvVvRS~$r6gh>n6??Vsrr*{?~mg9&N3(rXFsq!2h zV7|-&=H>G7xiP1}26uIrww$3iLS$bK5ZOBxk+pwblf*mq=F35E!gojV&eBI-eq7>4 zn=$a==6KyRPW$^JJ|lLjg%TL;t!4@`^iLMkK(gd71E=gO^g-M?4!(GT@h@E8e1~xD zBl_5gWUy1#xyS6j_HWzAV8XNd>#;?i?MryRwYFXQ#XGCV>_@^`J#M?MjP(a0zY@;IFCC^+u`g|HM_;meuc~IxO!#honWLmm+`=#!=HjY z$$p2E6#ltRlt^3_;Vd>o-`;QNq_Pv38ie{w5ZXa zJP)tn%WtcB1^c^E*x`JzgW;IK4$4MQrX#3T5(swlWsVBujunT+WUF5bG$Bi%BT7s)5^?#fP&Pw9L zG$Mu)TiIB|R$2`z0;$GO4i&PMjr+2djYVu_W58B6imhyft=!Il3v6X$5nI`KK(=yQ zFiDoJ94WR^=<|HTR)TaZn-#3_BwlwjlJ+068`^HDC?OdwR|bnK44pb4Tz$R~HjU4X ztTfUlBd%iVW!c|E`ce>m-YgocXaruI-PUV%zo>b{a$epYGp$ASv(0ICbGyzCdecvD z`dbQN-zXMNP~%LA(I6eob*bu;oOWea&^K~cArh#u&yJ1Q-u4QpeK%lc=+=khb#-dB z;fcnT8HbYsB3CE?@Oy7WeyfftD^2Yd-vsni^OIf!KWCsR1S$XdupeS|=DE*s>M`

    )2tolW(?QM)sc; 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≥r8X?EVV(^GHq5c1&kM;j{kJ5#IO?^Z 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 z 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�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

    O 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%0An{UdYww2q!|D0jdk0uBBawkSyGw~gO1-OYe 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

    gEXWtTDE@#gXp1Om*M)h5} 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 literal 33792 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 LpP&D2EAW2-=w@;! diff --git a/vendor/sdl2/ttf/SDL2_ttf.lib b/vendor/sdl2/ttf/SDL2_ttf.lib index 28810a7bcbb11ecbda3401928fd0953062f51493..bd53219e9d3f99c34e4907ed9faa6e13e8c11de1 100644 GIT binary patch literal 18406 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 literal 12122 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 Date: Mon, 14 Feb 2022 10:57:29 +0000 Subject: [PATCH 114/117] Correct _split_iterator --- core/bytes/bytes.odin | 40 ++++++-------------------- core/strings/strings.odin | 59 ++++++++------------------------------- 2 files changed, 20 insertions(+), 79 deletions(-) diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index 1bf11e0b0..fb36b2d6e 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -219,39 +219,24 @@ split_after_n :: proc(s, sep: []byte, n: int, allocator := context.allocator) -> @private _split_iterator :: proc(s: ^[]byte, sep: []byte, sep_save, n: int) -> (res: []byte, ok: bool) { - s, n := s, n - - if n == 0 { - return - } - - if sep == nil { + if sep == "" { res = s[:] ok = true s^ = s[len(s):] return } - if n < 0 { - n = count(s^, sep) + 1 - } - - n -= 1 - - i := 0 - for ; i < n; i += 1 { - m := index(s^, sep) - if m < 0 { - break - } + m := index(s^, sep) + if m < 0 { + // not found + res = s[:] + ok = res != "" + s^ = s[len(s):] + } else { res = s[:m+sep_save] ok = true s^ = s[m+len(sep):] - return } - res = s[:] - ok = res != nil - s^ = s[len(s):] return } @@ -260,19 +245,10 @@ split_iterator :: proc(s: ^[]byte, sep: []byte) -> ([]byte, bool) { return _split_iterator(s, sep, 0, -1) } -split_n_iterator :: proc(s: ^[]byte, sep: []byte, n: int) -> ([]byte, bool) { - return _split_iterator(s, sep, 0, n) -} - split_after_iterator :: proc(s: ^[]byte, sep: []byte) -> ([]byte, bool) { return _split_iterator(s, sep, len(sep), -1) } -split_after_n_iterator :: proc(s: ^[]byte, sep: []byte, n: int) -> ([]byte, bool) { - return _split_iterator(s, sep, len(sep), n) -} - - index_byte :: proc(s: []byte, c: byte) -> int { for i := 0; i < len(s); i += 1 { diff --git a/core/strings/strings.odin b/core/strings/strings.odin index 67046c669..4daa0bacd 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -298,13 +298,7 @@ split_after_n :: proc(s, sep: string, n: int, allocator := context.allocator) -> @private -_split_iterator :: proc(s: ^string, sep: string, sep_save, n: int) -> (res: string, ok: bool) { - s, n := s, n - - if n == 0 { - return - } - +_split_iterator :: proc(s: ^string, sep: string, sep_save: int) -> (res: string, ok: bool) { if sep == "" { res = s[:] ok = true @@ -312,44 +306,27 @@ _split_iterator :: proc(s: ^string, sep: string, sep_save, n: int) -> (res: stri return } - if n < 0 { - n = count(s^, sep) + 1 - } - - n -= 1 - - i := 0 - for ; i < n; i += 1 { - m := index(s^, sep) - if m < 0 { - break - } + m := index(s^, sep) + if m < 0 { + // not found + res = s[:] + ok = res != "" + s^ = s[len(s):] + } else { res = s[:m+sep_save] ok = true s^ = s[m+len(sep):] - return } - res = s[:] - ok = res != "" - s^ = s[len(s):] return } split_iterator :: proc(s: ^string, sep: string) -> (string, bool) { - return _split_iterator(s, sep, 0, -1) -} - -split_n_iterator :: proc(s: ^string, sep: string, n: int) -> (string, bool) { - return _split_iterator(s, sep, 0, n) + return _split_iterator(s, sep, 0) } split_after_iterator :: proc(s: ^string, sep: string) -> (string, bool) { - return _split_iterator(s, sep, len(sep), -1) -} - -split_after_n_iterator :: proc(s: ^string, sep: string, n: int) -> (string, bool) { - return _split_iterator(s, sep, len(sep), n) + return _split_iterator(s, sep, len(sep)) } @@ -402,25 +379,13 @@ split_lines_after_n :: proc(s: string, n: int, allocator := context.allocator) - split_lines_iterator :: proc(s: ^string) -> (line: string, ok: bool) { sep :: "\n" - line = _split_iterator(s, sep, 0, -1) or_return - return _trim_cr(line), true -} - -split_lines_n_iterator :: proc(s: ^string, n: int) -> (line: string, ok: bool) { - sep :: "\n" - line = _split_iterator(s, sep, 0, n) or_return + line = _split_iterator(s, sep, 0) or_return return _trim_cr(line), true } split_lines_after_iterator :: proc(s: ^string) -> (line: string, ok: bool) { sep :: "\n" - line = _split_iterator(s, sep, len(sep), -1) or_return - return _trim_cr(line), true -} - -split_lines_after_n_iterator :: proc(s: ^string, n: int) -> (line: string, ok: bool) { - sep :: "\n" - line = _split_iterator(s, sep, len(sep), n) or_return + line = _split_iterator(s, sep, len(sep)) or_return return _trim_cr(line), true } From 441365b3886967465da4f9201e8dfdfc059931e4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 14 Feb 2022 10:58:01 +0000 Subject: [PATCH 115/117] Set the macOS minimum version to 12 for ARM CPUs --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index fe56d451f..27c71c8eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -485,7 +485,7 @@ i32 linker_stage(lbGenerator *gen) { // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' #if defined(GB_CPU_ARM) - " -mmacosx-version-min=11.0.0 " + " -mmacosx-version-min=12.0.0 " #else " -mmacosx-version-min=10.8.0 " #endif From 2e7157ae9cd0eb38133a750e7f4845661d8751ba Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 14 Feb 2022 11:01:34 +0000 Subject: [PATCH 116/117] Correct bytes._split_iterator --- core/bytes/bytes.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/bytes/bytes.odin b/core/bytes/bytes.odin index fb36b2d6e..09a3ed259 100644 --- a/core/bytes/bytes.odin +++ b/core/bytes/bytes.odin @@ -218,8 +218,8 @@ split_after_n :: proc(s, sep: []byte, n: int, allocator := context.allocator) -> @private -_split_iterator :: proc(s: ^[]byte, sep: []byte, sep_save, n: int) -> (res: []byte, ok: bool) { - if sep == "" { +_split_iterator :: proc(s: ^[]byte, sep: []byte, sep_save: int) -> (res: []byte, ok: bool) { + if len(sep) == 0 { res = s[:] ok = true s^ = s[len(s):] @@ -230,7 +230,7 @@ _split_iterator :: proc(s: ^[]byte, sep: []byte, sep_save, n: int) -> (res: []by if m < 0 { // not found res = s[:] - ok = res != "" + ok = len(res) != 0 s^ = s[len(s):] } else { res = s[:m+sep_save] @@ -242,11 +242,11 @@ _split_iterator :: proc(s: ^[]byte, sep: []byte, sep_save, n: int) -> (res: []by split_iterator :: proc(s: ^[]byte, sep: []byte) -> ([]byte, bool) { - return _split_iterator(s, sep, 0, -1) + return _split_iterator(s, sep, 0) } split_after_iterator :: proc(s: ^[]byte, sep: []byte) -> ([]byte, bool) { - return _split_iterator(s, sep, len(sep), -1) + return _split_iterator(s, sep, len(sep)) } From e6e04fc6c888b9acdb0058f7050a53b0bc7d4465 Mon Sep 17 00:00:00 2001 From: Phil H Date: Mon, 14 Feb 2022 22:15:45 -0800 Subject: [PATCH 117/117] Add 'odin run -help' info for specifying args --- src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cpp b/src/main.cpp index 27c71c8eb..efb0f584e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1851,6 +1851,7 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(1, " one must contain the program's entry point, all must be in the same package."); } else if (command == "run") { print_usage_line(1, "run same as 'build', but also then runs the newly compiled executable."); + print_usage_line(1, " append an empty flag and then the args, '-- ', to specify args for the output."); } else if (command == "check") { print_usage_line(1, "check parse and type check .odin file(s)"); } else if (command == "test") {