Skip to content

Commit

Permalink
Protect class_(getter|property)[?] using Crystal.once(&).
Browse files Browse the repository at this point in the history
  • Loading branch information
ysbaddaden committed Jan 30, 2025
1 parent 7b15af9 commit a888edb
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 16 deletions.
50 changes: 38 additions & 12 deletions scripts/generate_object_properties.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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!
Expand Down
28 changes: 24 additions & 4 deletions src/object/properties.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit a888edb

Please sign in to comment.