Skip to content

Commit

Permalink
Don't turn static variables into constants
Browse files Browse the repository at this point in the history
Assigning values to a static variable must always be considered as having side-effects.
  • Loading branch information
GrieferAtWork committed Apr 7, 2024
1 parent 35e98c2 commit 8859176
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/deemon/compiler/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,12 @@ symbol_set_haseffect(struct symbol *__restrict self,
case SYMBOL_TYPE_GETSET:
return true;

case SYMBOL_TYPE_STATIC:
/* Static variables are visible beyond the relevant function
* call, meaning they *always* have side-effects and can't be
* optimized away. */
return true;

default: break;
}
return false;
Expand Down
1 change: 1 addition & 0 deletions src/deemon/execute/function-wrappers.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ PRIVATE struct type_cmp funcstaticsiter_cmp = {
/* .tp_le = */ (DREF DeeObject *(DCALL *)(DeeObject *, DeeObject *))&funcstaticsiter_le,
/* .tp_gr = */ (DREF DeeObject *(DCALL *)(DeeObject *, DeeObject *))&funcstaticsiter_gr,
/* .tp_ge = */ (DREF DeeObject *(DCALL *)(DeeObject *, DeeObject *))&funcstaticsiter_ge,
/* .tp_nii = */ &funcstaticsiter_nii,
};

PRIVATE struct type_getset tpconst funcstaticsiter_getsets[] = {
Expand Down
51 changes: 51 additions & 0 deletions util/test/compiler-static-constinit.dee
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/deemon
/* Copyright (c) 2018-2024 Griefer@Work *
* *
* This software is provided 'as-is', without any express or implied *
* warranty. In no event will the authors be held liable for any damages *
* arising from the use of this software. *
* *
* Permission is granted to anyone to use this software for any purpose, *
* including commercial applications, and to alter it and redistribute it *
* freely, subject to the following restrictions: *
* *
* 1. The origin of this software must not be misrepresented; you must not *
* claim that you wrote the original software. If you use this software *
* in a product, an acknowledgement (see the following) in the product *
* documentation is required: *
* Portions Copyright (c) 2018-2024 Griefer@Work *
* 2. Altered source versions must be plainly marked as such, and must not be *
* misrepresented as being the original software. *
* 3. This notice may not be removed or altered from any source distribution. *
*/

#if 1 /* #ifdef CONFIG_EXPERIMENTAL_STATIC_IN_FUNCTION */
function foo() {
return () -> {
/* Test to make sure that the compiler doesn't try
* to inline statics with constant initializers. */
static local x = 42;
return x;
};
}

local a = foo();
local b = foo();

assert a.__statics__[0] !is bound;
assert b.__statics__[0] !is bound;

assert a() == 42;
assert b() == 42;

a.__statics__[0] = 24;

assert a() == 24;
assert b() == 42;

b.__statics__[0] = "foo";

assert a() == 24;
assert b() == "foo";

#endif

0 comments on commit 8859176

Please sign in to comment.