diff --git a/scripts/generate_object_properties.cr b/scripts/generate_object_properties.cr index ced3e7d69028..2f809ec45235 100755 --- a/scripts/generate_object_properties.cr +++ b/scripts/generate_object_properties.cr @@ -35,20 +35,46 @@ struct Generator end def def_getter(suffix = "") + if @macro_prefix == "class_" + def_class_getter suffix + else + <<-TEXT + def {{var_name}}#{suffix} {% if type %} : {{type}} {% end %} + {% if block %} + if (%value = @{{var_name}}).nil? + @{{var_name}} = {{yield}} + else + %value + end + {% else %} + @{{var_name}} + {% end %} + end + + TEXT + end + end + + def def_class_getter(suffix = "") <<-TEXT - def #{@method_prefix}{{var_name}}#{suffix} {% if type %} : {{type}} {% end %} - {% if block %} - if (%value = #{@var_prefix}{{var_name}}).nil? - #{@var_prefix}{{var_name}} = {{yield}} - else - %value - end - {% else %} - #{@var_prefix}{{var_name}} - {% end %} - end + {% if block %} @@__{{var_name}}_flag = false {% end %} + + def self.{{var_name}}#{suffix} {% if type %} : {{type}} {% end %} + {% if block %} + if (%value = @@{{var_name}}).nil? + ::Crystal.once(pointerof(@@__{{var_name}}_flag)) do + @@{{var_name}} = {{yield}} if @@{{var_name}}.nil? + end + @@{{var_name}}.not_nil! + else + %value + end + {% else %} + @@{{var_name}} + {% end %} + end - TEXT + TEXT end def def_vars! diff --git a/src/object/properties.cr b/src/object/properties.cr index c9bc1c74c4c1..fe34eec415e2 100644 --- a/src/object/properties.cr +++ b/src/object/properties.cr @@ -993,10 +993,15 @@ class Object {% type = nil %} {% end %} + {% if block %} @@__{{var_name}}_flag = false {% end %} + def self.{{var_name}} {% if type %} : {{type}} {% end %} {% if block %} if (%value = @@{{var_name}}).nil? - @@{{var_name}} = {{yield}} + ::Crystal.once(pointerof(@@__{{var_name}}_flag)) do + @@{{var_name}} = {{yield}} if @@{{var_name}}.nil? + end + @@{{var_name}}.not_nil! else %value end @@ -1120,10 +1125,15 @@ class Object {% type = nil %} {% end %} + {% if block %} @@__{{var_name}}_flag = false {% end %} + def self.{{var_name}}? {% if type %} : {{type}} {% end %} {% if block %} if (%value = @@{{var_name}}).nil? - @@{{var_name}} = {{yield}} + ::Crystal.once(pointerof(@@__{{var_name}}_flag)) do + @@{{var_name}} = {{yield}} if @@{{var_name}}.nil? + end + @@{{var_name}}.not_nil! else %value end @@ -1469,10 +1479,15 @@ class Object {% type = nil %} {% end %} + {% if block %} @@__{{var_name}}_flag = false {% end %} + def self.{{var_name}} {% if type %} : {{type}} {% end %} {% if block %} if (%value = @@{{var_name}}).nil? - @@{{var_name}} = {{yield}} + ::Crystal.once(pointerof(@@__{{var_name}}_flag)) do + @@{{var_name}} = {{yield}} if @@{{var_name}}.nil? + end + @@{{var_name}}.not_nil! else %value end @@ -1611,10 +1626,15 @@ class Object {% type = nil %} {% end %} + {% if block %} @@__{{var_name}}_flag = false {% end %} + def self.{{var_name}}? {% if type %} : {{type}} {% end %} {% if block %} if (%value = @@{{var_name}}).nil? - @@{{var_name}} = {{yield}} + ::Crystal.once(pointerof(@@__{{var_name}}_flag)) do + @@{{var_name}} = {{yield}} if @@{{var_name}}.nil? + end + @@{{var_name}}.not_nil! else %value end