From e5c909cf36803ad20cad1e7c8675df9330fef2a2 Mon Sep 17 00:00:00 2001 From: Elizabeth Mattijsen Date: Sat, 23 Jul 2016 14:30:42 +0200 Subject: [PATCH] Make Hash[Any,Any].ASSIGN-KEY about 15% faster - rewritten using nqp ops - smarter handling of empty typed hashes Almost not worth it, but such a basic functionality can use all the optimization it can get --- src/core/Hash.pm | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/core/Hash.pm b/src/core/Hash.pm index e7419940236..da8159d5bbf 100644 --- a/src/core/Hash.pm +++ b/src/core/Hash.pm @@ -544,18 +544,29 @@ my class Hash { # declared in BOOTSTRAP } method ASSIGN-KEY(::?CLASS:D: TKey \key, TValue \assignval) { - nqp::bindattr(self,Map,'$!storage',nqp::hash) - unless nqp::defined(nqp::getattr(self,Map,'$!storage')); - my str $which = key.WHICH; - - nqp::existskey(nqp::getattr(self,Map,'$!storage'),$which) - ?? (nqp::getattr( - nqp::atkey(nqp::getattr(self,Map,'$!storage'),$which), - Pair, '$!value') = assignval) - !! nqp::bindkey(nqp::getattr(self,Map,'$!storage'),$which, - Pair.new(key,nqp::p6scalarfromdesc( - nqp::getattr(self,Hash,'$!descriptor')) = assignval)); - assignval + nqp::if( + nqp::getattr(self,Map,'$!storage').DEFINITE, + nqp::if( + nqp::existskey(nqp::getattr(self,Map,'$!storage'), + my str $which = nqp::unbox_s(key.WHICH)), + (nqp::getattr( + nqp::atkey(nqp::getattr(self,Map,'$!storage'),$which), + Pair,'$!value') = assignval), + nqp::stmts( + (nqp::bindkey(nqp::getattr(self,Map,'$!storage'),$which, + Pair.new(key,nqp::p6scalarfromdesc( + nqp::getattr(self,Hash,'$!descriptor')) = assignval))), + assignval + ) + ), + nqp::stmts( + (nqp::bindkey(nqp::bindattr(self,Map,'$!storage',nqp::hash), + nqp::unbox_s(key.WHICH), + Pair.new(key,nqp::p6scalarfromdesc( + nqp::getattr(self,Hash,'$!descriptor')) = assignval))), + assignval + ) + ) } method BIND-KEY(TKey \key, TValue \bindval) is raw {