Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ScriptHook_t initialization order #320

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from

Commits on Sep 5, 2024

  1. Fix ScriptHook_t initialization order

    When a ScriptClassDesc_t for is initialized (SCRIPTDESC), it recursively
    invokes its parents initializers in order to obtain their pHelper
    member.
    Initialization is only done once, so repeated initialization is skipped.
    Initialization includes assignment of a vector of ScriptHook_t's
    (DEFINE_SCRIPTFUNC/BEGIN_SCRIPTHOOK), which must be initialized
    beforehand.
    Both of these use (static) globals; Within a translation unit,
    initialization order is defined to be the same as the order of
    declaration. So within a translation unit we must define all
    ScriptHook_t's before the ScriptClassDesc_t using them.
    A problem occurs with the parent initialization though, since there is
    no defined order between translation units, meaning initialization of a
    ScriptClassDesc_t can happen before its ScriptHook_t's, despite being
    the correct order within its translation unit.
    
    On MSVC it seems this issue is benign. On GCC/Linux however the
    initialization of a ScriptHook_t essentially cleared whatever happened
    during the initialization of the ScriptClassDesc_t, meaning many hooks
    simply didn't work.
    
    This situation is remedied by delaying the initialization of the
    ScriptClassDesc_t's ScriptHook_t vector to only when the constructor of
    it is invoked from its translation unit. This is accomplished simply by
    adding a boolean parameter to the function (GetScriptDesc()) that is
    true in the global constructor invocation, and false by default
    (including when doing parent ScriptClassDesc_t initialization).
    When false, a valid ScriptClassDesc_t pointer is still returned, with
    the proper value for pHelper, which is all that is needed for the
    initialization of the child ScriptClassDesc_t. The value of the returned
    pointer is a fixed memory location, and does not change due to the
    delayed initialization.
    
    Fixes entropy-zero#244.
    z33ky committed Sep 5, 2024
    Configuration menu
    Copy the full SHA
    6a2a58c View commit details
    Browse the repository at this point in the history