Răsfoiți Sursa

Merge pull request #5676 from Kelimion/big-asan

Change the way math/big constants are initialized
Jeroen van Rijn 2 zile în urmă
părinte
comite
641ccf89a2
2 a modificat fișierele cu 12 adăugiri și 20 ștergeri
  1. 1 12
      core/math/big/common.odin
  2. 11 8
      core/math/big/helpers.odin

+ 1 - 12
core/math/big/common.odin

@@ -14,23 +14,12 @@ import "base:intrinsics"
 	This allows to benchmark and/or setting optimized values for a certain CPU without recompiling.
 */
 
-/*
-	==========================    TUNABLES     ==========================
-
-	`initialize_constants` returns `#config(MUL_KARATSUBA_CUTOFF, _DEFAULT_MUL_KARATSUBA_CUTOFF)`
-	and we initialize this cutoff that way so that the procedure is used and called,
-	because it handles initializing the constants ONE, ZERO, MINUS_ONE, NAN and INF.
-
-	`initialize_constants` also replaces the other `_DEFAULT_*` cutoffs with custom compile-time values if so `#config`ured.
-
-*/
-
 /*
 	There is a bug with DLL globals. They don't get set.
 	To allow tests to run we add `-define:MATH_BIG_EXE=false` to hardcode the cutoffs for now.
 */
 when #config(MATH_BIG_EXE, true) {
-	MUL_KARATSUBA_CUTOFF := initialize_constants()
+	MUL_KARATSUBA_CUTOFF := _DEFAULT_MUL_KARATSUBA_CUTOFF
 	SQR_KARATSUBA_CUTOFF := _DEFAULT_SQR_KARATSUBA_CUTOFF
 	MUL_TOOM_CUTOFF      := _DEFAULT_MUL_TOOM_CUTOFF
 	SQR_TOOM_CUTOFF      := _DEFAULT_SQR_TOOM_CUTOFF

+ 11 - 8
core/math/big/helpers.odin

@@ -778,13 +778,14 @@ int_from_bytes_little_python :: proc(a: ^Int, buf: []u8, signed := false, alloca
 */
 INT_ONE, INT_ZERO, INT_MINUS_ONE, INT_INF, INT_MINUS_INF, INT_NAN := &Int{}, &Int{}, &Int{}, &Int{}, &Int{}, &Int{}
 
-@(init, private)
-_init_constants :: proc "contextless" () {
-	initialize_constants()
-}
+@(private)
+constant_allocator: runtime.Allocator
 
-initialize_constants :: proc "contextless" () -> (res: int) {
+@(init, private)
+initialize_constants :: proc "contextless" () {
 	context = runtime.default_context()
+	constant_allocator = context.allocator
+
 	internal_int_set_from_integer(     INT_ZERO,  0);      INT_ZERO.flags = {.Immutable}
 	internal_int_set_from_integer(      INT_ONE,  1);       INT_ONE.flags = {.Immutable}
 	internal_int_set_from_integer(INT_MINUS_ONE, -1); INT_MINUS_ONE.flags = {.Immutable}
@@ -796,15 +797,17 @@ initialize_constants :: proc "contextless" () -> (res: int) {
 	internal_int_set_from_integer(      INT_NAN,  1);       INT_NAN.flags = {.Immutable, .NaN}
 	internal_int_set_from_integer(      INT_INF,  1);       INT_INF.flags = {.Immutable, .Inf}
 	internal_int_set_from_integer(INT_MINUS_INF, -1); INT_MINUS_INF.flags = {.Immutable, .Inf}
-
-	return _DEFAULT_MUL_KARATSUBA_CUTOFF
 }
 
 /*
 	Destroy constants.
 	Optional for an EXE, as this would be called at the very end of a process.
 */
-destroy_constants :: proc() {
+@(fini, private)
+destroy_constants :: proc "contextless" () {
+	context = runtime.default_context()
+	context.allocator = constant_allocator
+
 	internal_destroy(INT_ONE, INT_ZERO, INT_MINUS_ONE, INT_INF, INT_MINUS_INF, INT_NAN)
 }