summaryrefslogtreecommitdiff
path: root/lib/gitlab/utils/strong_memoize.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/utils/strong_memoize.rb')
-rw-r--r--lib/gitlab/utils/strong_memoize.rb23
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/gitlab/utils/strong_memoize.rb b/lib/gitlab/utils/strong_memoize.rb
index 7e78363dae5..eb44b7ddd95 100644
--- a/lib/gitlab/utils/strong_memoize.rb
+++ b/lib/gitlab/utils/strong_memoize.rb
@@ -23,7 +23,7 @@ module Gitlab
# def enabled?
# Feature.enabled?(:some_feature)
# end
- # strong_memoize_attr :enabled?, :enabled
+ # strong_memoize_attr :enabled?
#
def strong_memoize(name)
key = ivar(name)
@@ -46,20 +46,20 @@ module Gitlab
end
def strong_memoized?(name)
- instance_variable_defined?(ivar(name))
+ key = ivar(StrongMemoize.normalize_key(name))
+ instance_variable_defined?(key)
end
def clear_memoization(name)
- key = ivar(name)
+ key = ivar(StrongMemoize.normalize_key(name))
remove_instance_variable(key) if instance_variable_defined?(key)
end
module StrongMemoizeClassMethods
- def strong_memoize_attr(method_name, member_name = nil)
- member_name ||= method_name
+ def strong_memoize_attr(method_name)
+ member_name = StrongMemoize.normalize_key(method_name)
- StrongMemoize.send( # rubocop:disable GitlabSecurity/PublicSend
- :do_strong_memoize, self, method_name, member_name)
+ StrongMemoize.send(:do_strong_memoize, self, method_name, member_name) # rubocop:disable GitlabSecurity/PublicSend
end
end
@@ -83,7 +83,14 @@ module Gitlab
end
end
- class <<self
+ class << self
+ def normalize_key(key)
+ return key unless key.end_with?('!', '?')
+
+ # Replace invalid chars like `!` and `?` with allowed Unicode codeparts.
+ key.to_s.tr('!?', "\uFF01\uFF1F")
+ end
+
private
def do_strong_memoize(klass, method_name, member_name)