@@ -117,7 +117,7 @@ class Crystal::CodeGenVisitor
117117 void_ptr = context.fun.params.first
118118 closure_type = llvm_typer.copy_type(context.closure_type.not_nil!)
119119 closure_ptr = pointer_cast void_ptr, closure_type.pointer
120- setup_closure_vars target_def.vars , context.closure_vars.not_nil!, self .context, closure_type, closure_ptr
120+ setup_closure_vars target_def, context.closure_vars.not_nil!, self .context, closure_type, closure_ptr
121121 else
122122 context.reset_closure
123123 end
@@ -459,11 +459,12 @@ class Crystal::CodeGenVisitor
459459 context.fun.add_attribute LLVM ::Attribute ::NoInline if target_def.no_inline?
460460 end
461461
462- def setup_closure_vars (def_vars , closure_vars, context, closure_type, closure_ptr)
462+ def setup_closure_vars (target_def , closure_vars, context, closure_type, closure_ptr)
463463 if context.closure_skip_parent
464464 parent_context = context.closure_parent_context.not_nil!
465- setup_closure_vars(def_vars , parent_context.closure_vars.not_nil!, parent_context, closure_type, closure_ptr)
465+ setup_closure_vars(target_def , parent_context.closure_vars.not_nil!, parent_context, closure_type, closure_ptr)
466466 else
467+ def_vars = target_def.vars
467468 closure_vars.each_with_index do |var , i |
468469 # A closured var in this context might have the same name as
469470 # a local var in another context, for example if the local var
@@ -472,20 +473,33 @@ class Crystal::CodeGenVisitor
472473 def_var = def_vars.try & .[var.name]?
473474 next if def_var && ! def_var.closured?
474475
475- self .context.vars[var.name] = LLVMVar .new(gep(closure_type, closure_ptr, 0 , i, var.name), var.type)
476+ if context.fun.naked?
477+ debug_variable_created = false
478+ else
479+ var_offset = llvm_typer.offset_of(closure_type, i)
480+ debug_variable_created = declare_variable(var.name, var.type, closure_ptr, target_def.location, offset: var_offset)
481+ end
482+ var_ptr = gep(closure_type, closure_ptr, 0 , i, var.name)
483+ self .context.vars[var.name] = LLVMVar .new(var_ptr, var.type, debug_variable_created: debug_variable_created)
476484 end
477485
478486 if (closure_parent_context = context.closure_parent_context) &&
479487 (parent_vars = closure_parent_context.closure_vars)
480488 parent_closure_type = llvm_typer.copy_type(closure_parent_context.closure_type.not_nil!)
481489 parent_closure_ptr = gep(closure_type, closure_ptr, 0 , closure_vars.size, " parent_ptr" )
482490 parent_closure = load(parent_closure_type.pointer, parent_closure_ptr, " parent" )
483- setup_closure_vars(def_vars , parent_vars, closure_parent_context, parent_closure_type, parent_closure)
491+ setup_closure_vars(target_def , parent_vars, closure_parent_context, parent_closure_type, parent_closure)
484492 elsif closure_self = context.closure_self
485- offset = context.closure_parent_context ? 1 : 0
486- self_value = gep(closure_type, closure_ptr, 0 , closure_vars.size + offset, " self" )
487- self_value = load(llvm_type(closure_self), self_value) unless context.type.passed_by_value?
488- self .context.vars[" self" ] = LLVMVar .new(self_value, closure_self, true )
493+ self_index = closure_vars.size + (context.closure_parent_context ? 1 : 0 )
494+ if context.fun.naked?
495+ debug_variable_created = false
496+ else
497+ self_offset = llvm_typer.offset_of(closure_type, self_index)
498+ debug_variable_created = declare_variable(" self" , closure_self, closure_ptr, target_def.location, offset: self_offset)
499+ end
500+ self_value = gep(closure_type, closure_ptr, 0 , self_index, " self" )
501+ self_value = load(llvm_type(closure_self), self_value) unless closure_self.passed_by_value?
502+ self .context.vars[" self" ] = LLVMVar .new(self_value, closure_self, true , debug_variable_created: debug_variable_created)
489503 end
490504 end
491505 end
0 commit comments