aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-01-09 19:15:46 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-01-16 21:58:47 -0500
commitfbcee58cfcabddd3e0842e22141a983a8169502f (patch)
tree9d1c30d44988c13230a1e046d124dbaeba88f9dc /src/analyze.cpp
parent0240fd91401c8a20064da0efd5b1e8955e481f1b (diff)
downloadzig-fbcee58cfcabddd3e0842e22141a983a8169502f.tar.gz
zig-fbcee58cfcabddd3e0842e22141a983a8169502f.zip
zig ir.cpp details: remove the mem_slot mechanism
Previously, there was hacky code to deal with result locations and how they work with regards to comptime values and runtime values. In addition, there was a hacky "mem_slot" mechanism that managed the memory for local variables, and acted differently depending on comptime vs runtime situations. All that is deleted in this commit, and as a result, result locations code has one less complication. Importantly, this means that a comptime result location is now passed to a function when it is evaluated at comptime. This test causes many regressions, and some of the behavior tests are disabled (commented out) in this commit. Future commits will re-enable the tests before merging the branch.
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index b7838003c8..435020014d 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -1102,11 +1102,28 @@ ZigType *get_partial_container_type(CodeGen *g, Scope *scope, ContainerKind kind
ZigValue *analyze_const_value(CodeGen *g, Scope *scope, AstNode *node, ZigType *type_entry,
Buf *type_name, UndefAllowed undef)
{
+ Error err;
+
+ ZigValue *result = create_const_vals(1);
+ ZigValue *result_ptr = create_const_vals(1);
+ result->special = ConstValSpecialUndef;
+ result->type = (type_entry == nullptr) ? g->builtin_types.entry_var : type_entry;
+ result_ptr->special = ConstValSpecialStatic;
+ result_ptr->type = get_pointer_to_type(g, result->type, false);
+ result_ptr->data.x_ptr.mut = ConstPtrMutComptimeVar;
+ result_ptr->data.x_ptr.special = ConstPtrSpecialRef;
+ result_ptr->data.x_ptr.data.ref.pointee = result;
+
size_t backward_branch_count = 0;
size_t backward_branch_quota = default_backward_branch_quota;
- return ir_eval_const_value(g, scope, node, type_entry,
+ if ((err = ir_eval_const_value(g, scope, node, result_ptr,
&backward_branch_count, &backward_branch_quota,
- nullptr, nullptr, node, type_name, nullptr, nullptr, undef);
+ nullptr, nullptr, node, type_name, nullptr, nullptr, undef)))
+ {
+ return g->invalid_instruction->value;
+ }
+ destroy(result_ptr, "ZigValue");
+ return result;
}
Error type_val_resolve_zero_bits(CodeGen *g, ZigValue *type_val, ZigType *parent_type,
@@ -3805,7 +3822,6 @@ ZigVar *add_variable(CodeGen *g, AstNode *source_node, Scope *parent_scope, Buf
variable_entry->var_type = var_type;
variable_entry->parent_scope = parent_scope;
variable_entry->shadowable = false;
- variable_entry->mem_slot_index = SIZE_MAX;
variable_entry->src_arg_index = SIZE_MAX;
assert(name);
@@ -3906,7 +3922,7 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var, bool allow_lazy) {
// TODO more validation for types that can't be used for export/extern variables
ZigType *implicit_type = nullptr;
- if (explicit_type && explicit_type->id == ZigTypeIdInvalid) {
+ if (explicit_type != nullptr && explicit_type->id == ZigTypeIdInvalid) {
implicit_type = explicit_type;
} else if (var_decl->expr) {
init_value = analyze_const_value(g, tld_var->base.parent_scope, var_decl->expr, explicit_type,
@@ -4694,8 +4710,14 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) {
assert(!fn_type->data.fn.is_generic);
FnTypeId *fn_type_id = &fn_type->data.fn.fn_type_id;
+ if (fn->analyzed_executable.begin_scope == nullptr) {
+ fn->analyzed_executable.begin_scope = &fn->def_scope->base;
+ }
+ if (fn->analyzed_executable.source_node == nullptr) {
+ fn->analyzed_executable.source_node = fn->body_node;
+ }
ZigType *block_return_type = ir_analyze(g, fn->ir_executable,
- &fn->analyzed_executable, fn_type_id->return_type, return_type_node);
+ &fn->analyzed_executable, fn_type_id->return_type, return_type_node, nullptr);
fn->src_implicit_return_type = block_return_type;
if (type_is_invalid(block_return_type) || fn->analyzed_executable.first_err_trace_msg != nullptr) {
@@ -6850,6 +6872,7 @@ static void render_const_val_array(CodeGen *g, Buf *buf, Buf *type_name, ZigValu
}
case ConstArraySpecialNone: {
ZigValue *base = &array->data.s_none.elements[start];
+ assert(base != nullptr);
assert(start + len <= const_val->type->data.array.len);
buf_appendf(buf, "%s{", buf_ptr(type_name));
@@ -6865,6 +6888,10 @@ static void render_const_val_array(CodeGen *g, Buf *buf, Buf *type_name, ZigValu
}
void render_const_value(CodeGen *g, Buf *buf, ZigValue *const_val) {
+ if (const_val == nullptr) {
+ buf_appendf(buf, "(invalid nullptr value)");
+ return;
+ }
switch (const_val->special) {
case ConstValSpecialRuntime:
buf_appendf(buf, "(runtime value)");