From a3a891a7f4b0c099af49eb180dc8ce2e09527b50 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 6 Sep 2021 15:41:09 +0100 Subject: [PATCH] Add `intrinsics.is_package_imported()` --- core/intrinsics/intrinsics.odin | 3 +++ src/check_builtin.cpp | 23 +++++++++++++++++++++++ src/checker_builtin_procs.hpp | 7 +++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/core/intrinsics/intrinsics.odin b/core/intrinsics/intrinsics.odin index 008e2ee5a..28a178db1 100644 --- a/core/intrinsics/intrinsics.odin +++ b/core/intrinsics/intrinsics.odin @@ -2,6 +2,9 @@ //+ignore package intrinsics +// Package-Related +is_package_imported :: proc(package_name: string) -> bool --- + // Types simd_vector :: proc($N: int, $T: typeid) -> type/#simd[N]T soa_struct :: proc($N: int, $T: typeid) -> type/#soa[N]T diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 05a5fceda..ffd622e4a 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1871,6 +1871,29 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 operand->type = alloc_type_simd_vector(count, elem); break; } + + case BuiltinProc_is_package_imported: { + bool value = false; + + if (!is_type_string(operand->type) && (operand->mode != Addressing_Constant)) { + error(ce->args[0], "Expected a constant string for '%.*s'", LIT(builtin_name)); + } else if (operand->value.kind == ExactValue_String) { + String pkg_name = operand->value.value_string; + // TODO(bill): probably should have this be a `StringMap` eventually + for_array(i, c->info->packages.entries) { + AstPackage *pkg = c->info->packages.entries[i].value; + if (pkg->name == pkg_name) { + value = true; + break; + } + } + } + + operand->mode = Addressing_Constant; + operand->type = t_untyped_bool; + operand->value = exact_value_bool(value); + break; + } case BuiltinProc_soa_struct: { Operand x = {}; diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index dc9d139f7..466e679c3 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -36,6 +36,8 @@ enum BuiltinProcId { BuiltinProc_DIRECTIVE, // NOTE(bill): This is used for specialized hash-prefixed procedures // "Intrinsics" + BuiltinProc_is_package_imported, + BuiltinProc_simd_vector, BuiltinProc_soa_struct, @@ -230,7 +232,6 @@ BuiltinProc__type_simple_boolean_end, BuiltinProc__type_end, - BuiltinProc_COUNT, }; gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { @@ -270,6 +271,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { // "Intrinsics" + {STR_LIT("is_package_imported"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_vector"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, // Type {STR_LIT("soa_struct"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, // Type @@ -459,6 +462,6 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_equal_proc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_hasher_proc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, - + {STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics}, };