diff --git a/src/Perl6/Metamodel/AttributeContainer.nqp b/src/Perl6/Metamodel/AttributeContainer.nqp index b87e650a25f..8205517e44d 100644 --- a/src/Perl6/Metamodel/AttributeContainer.nqp +++ b/src/Perl6/Metamodel/AttributeContainer.nqp @@ -25,6 +25,7 @@ role Perl6::Metamodel::AttributeContainer { method compose_attributes($obj, :$compiler_services) { my %seen_with_accessor; my %meths := self.method_table($obj); + %meths := %meths.FLATTENABLE_HASH() unless nqp::ishash(%meths); my %orig_meths; for %meths { %orig_meths{$_.key} := 1; diff --git a/src/Perl6/Metamodel/MROBasedMethodDispatch.nqp b/src/Perl6/Metamodel/MROBasedMethodDispatch.nqp index 48d35825c03..c849bb8f886 100644 --- a/src/Perl6/Metamodel/MROBasedMethodDispatch.nqp +++ b/src/Perl6/Metamodel/MROBasedMethodDispatch.nqp @@ -63,8 +63,9 @@ role Perl6::Metamodel::MROBasedMethodDispatch { @mro_reversed.unshift($_); } for @mro_reversed { - for $_.HOW.method_table($_) { - %cache{$_.key} := $_.value; + my $method_table := $_.HOW.method_table($_); + for nqp::ishash($method_table) ?? $method_table !! $method_table.FLATTENABLE_HASH() { + %cache{$_.key} := nqp::decont($_.value); } if nqp::can($_.HOW, 'is_composed') && !$_.HOW.is_composed($_) { $authable := 0; @@ -72,7 +73,8 @@ role Perl6::Metamodel::MROBasedMethodDispatch { } # Also add submethods. - for $obj.HOW.submethod_table($obj) { + my $submethod_table := $obj.HOW.submethod_table($obj); + for nqp::ishash($submethod_table) ?? $submethod_table !! $submethod_table.FLATTENABLE_HASH() { %cache{$_.key} := $_.value; } diff --git a/src/Perl6/Metamodel/MethodContainer.nqp b/src/Perl6/Metamodel/MethodContainer.nqp index b5c2a46d1e9..d67d2181e5a 100644 --- a/src/Perl6/Metamodel/MethodContainer.nqp +++ b/src/Perl6/Metamodel/MethodContainer.nqp @@ -52,11 +52,13 @@ role Perl6::Metamodel::MethodContainer { # If local flag was not passed, include those from parents. unless $local { for self.parents($obj, :all($all), :excl($excl)) { - for $_.HOW.method_table($_) { - @meths.push(nqp::hllizefor($_.value, 'perl6')); + my %method_table := $_.HOW.method_table($_); + for nqp::ishash(%method_table) ?? %method_table !! %method_table.FLATTENABLE_HASH { + @meths.push(nqp::hllizefor(nqp::decont($_.value), 'perl6')); } - for $_.HOW.submethod_table($_) { - @meths.push(nqp::hllizefor($_.value, 'perl6')); + my %submethod_table := $_.HOW.submethod_table($_); + for nqp::ishash(%submethod_table) ?? %submethod_table !! %submethod_table.FLATTENABLE_HASH { + @meths.push(nqp::hllizefor(nqp::decont($_.value), 'perl6')); } } } @@ -86,13 +88,15 @@ role Perl6::Metamodel::MethodContainer { method lookup($obj, $name) { for self.mro($obj) { my %meth := $_.HOW.method_table($obj); + %meth := %meth.FLATTENABLE_HASH unless nqp::ishash(%meth); if nqp::existskey(%meth, $name) { - return %meth{$name}; + return nqp::decont(%meth{$name}); } if nqp::can($_.HOW, 'submethod_table') { my %submeth := $_.HOW.submethod_table($obj); + %submeth := %submeth.FLATTENABLE_HASH unless nqp::ishash(%submeth); if nqp::existskey(%submeth, $name) { - return %submeth{$name}; + return nqp::decont(%submeth{$name}); } } }