diff --git a/lib/std/builtin.c3 b/lib/std/builtin.c3 index 0db824319..07ca25698 100644 --- a/lib/std/builtin.c3 +++ b/lib/std/builtin.c3 @@ -3,16 +3,34 @@ // a copy of which can be found in the LICENSE_STDLIB file. module std::builtin; -macro scope(&variable; @body) @autoimport +optenum VarCastResult +{ + TYPE_MISMATCH +} + +/** + * Stores a variable on the stack, then restores it at the end of the + * macro scope. + * + * @param variable `the variable to store and restore` + **/ +macro void scope(&variable; @body) @autoimport { $typeof(variable) temp = variable; defer variable = temp; @body(); } +/** + * Convert a variant type to a type, returning an failure if there is a type mismatch. + * + * @param v `the variant to convert to the given type.` + * @param $Type `the type to convert to` + * @return `The variant.ptr converted to its type.` + **/ macro varcast(variant v, $Type) @autoimport { - if (v.type != $Type.typeid) return null; + if (v.type != $Type.typeid) return VarCastResult.TYPE_MISMATCH!; return ($Type*)v.ptr; } diff --git a/src/compiler/compiler_internal.h b/src/compiler/compiler_internal.h index 219cb6463..50ab6a671 100644 --- a/src/compiler/compiler_internal.h +++ b/src/compiler/compiler_internal.h @@ -1578,13 +1578,6 @@ extern Type *type_cuint; extern const char *attribute_list[NUMBER_OF_ATTRIBUTES]; extern const char *builtin_list[NUMBER_OF_BUILTINS]; -extern const char *kw_at_return; -extern const char *kw_at_checked; -extern const char *kw_at_ensure; -extern const char *kw_at_optreturn; -extern const char *kw_at_param; -extern const char *kw_at_require; - extern const char *kw_std; extern const char *kw_max; extern const char *kw_min; @@ -1608,8 +1601,6 @@ extern const char *kw_nan; extern const char *kw_noinline; extern const char *kw_main; extern const char *kw_ordinal; -extern const char *kw_reqparse; -extern const char *kw_require; extern const char *kw_pure; extern const char *kw_param; extern const char *kw_ptr; diff --git a/src/compiler/symtab.c b/src/compiler/symtab.c index 159be6b56..2be8ba335 100644 --- a/src/compiler/symtab.c +++ b/src/compiler/symtab.c @@ -39,13 +39,6 @@ static SymTab symtab; const char *attribute_list[NUMBER_OF_ATTRIBUTES]; const char *builtin_list[NUMBER_OF_BUILTINS]; -const char *kw_at_return; -const char *kw_at_checked; -const char *kw_at_ensure; -const char *kw_at_optreturn; -const char *kw_at_param; -const char *kw_at_require; - const char *kw_in; const char *kw_out; const char *kw_inout; @@ -72,8 +65,6 @@ const char *kw_ordinal; const char *kw_param; const char *kw_ptr; const char *kw_pure; -const char *kw_reqparse; -const char *kw_require; const char *kw_std; const char *kw_sizeof; const char *kw_values; @@ -159,7 +150,7 @@ void symtab_init(uint32_t capacity) kw_param = KW_DEF("param"); kw_ptr = KW_DEF("ptr"); kw_pure = KW_DEF("pure"); - kw_require = KW_DEF("require"); + KW_DEF("require"); kw_std = KW_DEF("std"); kw_values = KW_DEF("values"); kw_incr = KW_DEF("incr");