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

Let core.get_mod_storage be called multiple times #12572

Merged
merged 5 commits into from
Jul 23, 2022

Conversation

TurkeyMcMac
Copy link
Contributor

This is a bug fix. If a single mod calls core.get_mod_storage multiple times, it should get the same reference every time, unless references are garbage-collected between calls. Without this PR, core.get_mod_storage cannot be called multiple times unless references are garbage-collected between calls.

This PR works by implementing core.get_mod_storage in Lua. The C++ version still exists, but it takes the desired mod name as an argument, and is only available internally.

To do

This PR is Ready for Review.

How to test

Have this code run at some mod's initialization time:

assert(core.get_mod_storage() == core.get_mod_storage())                        
collectgarbage()                                                                
assert(core.get_mod_storage())

builtin/common/storage.lua Outdated Show resolved Hide resolved
builtin/game/init.lua Outdated Show resolved Hide resolved
src/script/lua_api/l_storage.cpp Show resolved Hide resolved
@sfan5 sfan5 added the Bugfix 🐛 PRs that fix a bug label Jul 22, 2022
@TurkeyMcMac TurkeyMcMac requested a review from sfan5 July 22, 2022 12:20
@TurkeyMcMac TurkeyMcMac requested a review from sfan5 July 22, 2022 13:31
Copy link
Member

@sfan5 sfan5 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Jul 22, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
Copy link
Member

@SmallJoker SmallJoker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works as intended. Code looks good.

@appgurueu
Copy link
Contributor

appgurueu commented Jul 23, 2022

assert(core.get_mod_storage() == core.get_mod_storage())                        
collectgarbage()                                                                
assert(core.get_mod_storage())

Perhaps add this to games/devtest/mods/unittests/misc.lua?

@sfan5 sfan5 merged commit d631f21 into minetest:master Jul 23, 2022
TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Jul 23, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
@TurkeyMcMac
Copy link
Contributor Author

@appgurueu I have now added a unit test as part of #12562.

TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Aug 14, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Aug 25, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Sep 13, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Sep 13, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Sep 19, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
TurkeyMcMac added a commit to TurkeyMcMac/minetest that referenced this pull request Sep 26, 2022
It is no longer necessary to keep just one object per mod, since
data is no longer stored in these objects. Now one can obtain
multiple distinct references with core.get_mod_storage, but this
will be changed by PR minetest#12572.

One can test like so:

    local a = core.get_mod_storage()
    local b = core.get_mod_storage()
    a:set_string("!", "?")
    assert(b:get("!") == "?")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants