Skip to content
Open
22 changes: 22 additions & 0 deletions spec/compiler/interpreter/bugs_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,28 @@ describe Crystal::Repl::Interpreter do
CRYSTAL
end

it "doesn't error if def body is InstanceVar and virtual dispatch has only one subclass (#16278)" do
interpret(<<-CRYSTAL).should eq(0)
abstract class A
abstract def foo : Int32

def bar
foo
end
end

class B < A
@test = 0

def foo : Int32
@test
end
end

B.new.as(A).bar
CRYSTAL
end

it "handles self in inlined method with arguments (#16210)" do
interpret(<<-CRYSTAL, prelude: "prelude").should eq(%("hello"))
class Foo
Expand Down
8 changes: 4 additions & 4 deletions src/compiler/crystal/interpreter/compiler.cr
Original file line number Diff line number Diff line change
Expand Up @@ -1027,16 +1027,16 @@ class Crystal::Repl::Compiler < Crystal::Visitor
compile_instance_var(node)
end

private def compile_instance_var(node : InstanceVar)
private def compile_instance_var(node : InstanceVar, owner = scope)
return false unless @wants_value

closured_self = lookup_closured_var?("self")
if closured_self
ivar_offset, ivar_size = get_closured_self_pointer(closured_self, node.name, node: node)
pointer_get ivar_size, node: node
else
ivar_offset = ivar_offset(scope, node.name)
ivar_size = inner_sizeof_type(scope.lookup_instance_var(node.name))
ivar_offset = ivar_offset(owner, node.name)
ivar_size = inner_sizeof_type(owner.lookup_instance_var(node.name))

get_self_ivar ivar_offset, ivar_size, node: node
end
Expand Down Expand Up @@ -1859,7 +1859,7 @@ class Crystal::Repl::Compiler < Crystal::Visitor
if obj
compile_read_instance_var(node, obj, body.name, owner: target_def.owner)
else
compile_instance_var(body)
compile_instance_var(body, owner: target_def.owner)
end
end

Expand Down