From 5957b12235f419036201966170d1f45aa9f899b1 Mon Sep 17 00:00:00 2001 From: Ary Borenszweig Date: Wed, 7 Oct 2020 11:59:50 -0300 Subject: [PATCH] Codegen: track whether constant is accessed with pointerof(...) --- src/compiler/crystal/codegen/types.cr | 4 ++++ src/compiler/crystal/semantic/main_visitor.cr | 1 + src/compiler/crystal/types.cr | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/src/compiler/crystal/codegen/types.cr b/src/compiler/crystal/codegen/types.cr index 1885ca18b5b0..64120bfe149e 100644 --- a/src/compiler/crystal/codegen/types.cr +++ b/src/compiler/crystal/codegen/types.cr @@ -183,10 +183,14 @@ module Crystal # Returns `true` if this constant's value is a simple literal, like # `nil`, a number, char, string or symbol literal. def simple? + return false if pointer_read? + value.simple_literal? end def needs_init_flag? + return true if pointer_read? + !(initializer || no_init_flag? || simple?) end diff --git a/src/compiler/crystal/semantic/main_visitor.cr b/src/compiler/crystal/semantic/main_visitor.cr index 720ae39a5397..8e54ea2bbe23 100644 --- a/src/compiler/crystal/semantic/main_visitor.cr +++ b/src/compiler/crystal/semantic/main_visitor.cr @@ -2559,6 +2559,7 @@ module Crystal when Path exp.accept self if const = exp.target_const + const.pointer_read = true const.value end when ReadInstanceVar diff --git a/src/compiler/crystal/types.cr b/src/compiler/crystal/types.cr index affb0c69a546..2e1c4120e3d0 100644 --- a/src/compiler/crystal/types.cr +++ b/src/compiler/crystal/types.cr @@ -3133,6 +3133,10 @@ module Crystal property vars : MetaVars? property? used = false property? visited = false + + # Is this constant accessed with pointerof(...)? + property? pointer_read = false + property visitor : MainVisitor? def initialize(program, namespace, name, @value)