From ec48405f0ac03d64660125ff10e7d30579151159 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Thu, 29 Mar 2012 22:56:06 +0400 Subject: [PATCH] Fix mistake: static initialization code cannot access other static objects. Specifically, the eid->type() call depends on the order of linking. --- library/DataStaticsFields.cpp | 1 + library/include/DataIdentity.h | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/library/DataStaticsFields.cpp b/library/DataStaticsFields.cpp index 29816bbc5..a34938f95 100644 --- a/library/DataStaticsFields.cpp +++ b/library/DataStaticsFields.cpp @@ -36,6 +36,7 @@ namespace df { pointer_identity identity_traits::identity; stl_ptr_vector_identity identity_traits >::identity; stl_bit_vector_identity identity_traits >::identity; + bit_array_identity identity_traits >::identity; buffer_container_identity buffer_container_identity::base_instance; diff --git a/library/include/DataIdentity.h b/library/include/DataIdentity.h index 840c9688f..c83b2092a 100644 --- a/library/include/DataIdentity.h +++ b/library/include/DataIdentity.h @@ -500,6 +500,11 @@ namespace df static container_identity *get(); }; + template<> struct identity_traits > { + static bit_array_identity identity; + static bit_container_identity *get() { return &identity; } + }; + template struct identity_traits > { static bit_container_identity *get(); }; @@ -553,9 +558,7 @@ namespace df template inline bit_container_identity *identity_traits >::get() { - static type_identity *eid = identity_traits::get(); - static enum_identity *reid = eid->type() == DFHack::IDTYPE_ENUM ? (enum_identity*)eid : NULL; - static bit_array_identity identity(reid); + static bit_array_identity identity(identity_traits::get()); return &identity; }