diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index fc6ddf1..1e63f55 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -189,7 +189,7 @@ obj ast_transformation (Object) { var copy_construct_param = ast_identifier_ptr(string("in"), node->adt_def.self_type->clone_with_indirection(1,false), node) var assign_param = ast_identifier_ptr(string("in"), node->adt_def.self_type->clone_with_indirection(0,true), node) vector( - make_pair("operator==", ast_function_ptr(string("operator=="), type_ptr(vector(equals_param->identifier.type), type_ptr(base_type::boolean()), 0, false, false, false), vector(equals_param), false)), + make_pair("operator==", ast_function_ptr(string("operator=="), type_ptr(vector(equals_param->identifier.type), type_ptr(base_type::boolean()), 0, false, false, true), vector(equals_param), false)), make_pair("operator!=", ast_function_ptr(string("operator!="), type_ptr(vector(nequals_param->identifier.type), type_ptr(base_type::boolean()), 0, false, false, true), vector(nequals_param), false)), make_pair("construct", ast_function_ptr(string("construct"), type_ptr(vector<*type>(), node->adt_def.self_type->clone_with_increased_indirection(), 0, false, false, true), vector<*ast_node>(), false)), make_pair("copy_construct", ast_function_ptr(string("copy_construct"), type_ptr(vector(copy_construct_param->identifier.type), type_ptr(base_type::void_return()), 0, false, false, true), vector(copy_construct_param), false)), diff --git a/stdlib/function_value_lower.krak b/stdlib/function_value_lower.krak index cf228bd..54a5610 100644 --- a/stdlib/function_value_lower.krak +++ b/stdlib/function_value_lower.krak @@ -43,9 +43,8 @@ fun function_value_lower(name_ast_map: *map,*ast_node match(*node) { ast_node::identifier(backing) { // see if this identifier use is a closed variable in a closure - var enclosing_func = parent_chain->item_from_top_satisfying(fun(n: *ast_node): bool return is_function(n);) - if (enclosing_func->function.closed_variables.contains(node)) { - println(backing.name + " is being used in a closed fashion") + var enclosing_func = parent_chain->item_from_top_satisfying_or(fun(n: *ast_node): bool return is_function(n);, null()) + if (enclosing_func && enclosing_func->function.closed_variables.contains(node)) { closed_over_uses.add(make_pair(node, make_pair(parent_chain->top(), enclosing_func))) } } diff --git a/stdlib/stack.krak b/stdlib/stack.krak index 41cdcb9..d1bc878 100644 --- a/stdlib/stack.krak +++ b/stdlib/stack.krak @@ -96,4 +96,10 @@ obj stack (Object, Serializable) { fun item_from_top_satisfying(func: fun(T):bool): T { return from_top(index_from_top_satisfying(func)) } + fun item_from_top_satisfying_or(func: fun(T):bool, other: T): T { + var idx = index_from_top_satisfying(func) + if (idx != -1) + return from_top(idx) + return other + } }