summaryrefslogtreecommitdiffstats
path: root/arith.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-07-21 06:55:45 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-07-21 06:55:45 -0700
commit16ea370778dcd9943fb11767992aebf6263acfd4 (patch)
tree02f66ea406e46eb7571a27ab6a4b3510d24fe05f /arith.c
parent5613a3b0d42a89d061df18cd9ae4e1008696572c (diff)
downloadtxr-16ea370778dcd9943fb11767992aebf6263acfd4.tar.gz
txr-16ea370778dcd9943fb11767992aebf6263acfd4.tar.bz2
txr-16ea370778dcd9943fb11767992aebf6263acfd4.zip
compat: fix glaringly broken init-time handling.
We are doing numerous compat_ver checks in various init functions, to enact alternative symbol registrations. Only problem is, compat_ver is always zero during initialization; it is not set until the -C option is processed in txr_main. Registrations must be fixed up after initialization; that's what the compat_fixup mechanism is for. This is an long-standing problem which affects compatibility operation going back over 150 versions. * arith.c (arith_init): Move compat logic to arith_compat_fixup. (arith_compat_fixup): New function. * arith.h (arith_compat_fixup): Declared. * eval.c (eval_init): Move compat logic to eval_compat_fixup. * ffi.c (ffi_init): Move compat logic to ffi_compat_fixup. (ffi_compat_fixup): New function. * ffi.h (ffi_compat_fixup): Declared. * regex.c (regex_init): Move compat logic to regex_compat_fixup. (regex_compat_fixup): New function. * regex.h (regex_compat_fixup): Declared. * stream.c (stream_init): Move compat logic to stream_compat_fixup. (stream_compat_fixup): New function. * stream.h (stream_compat_fixup): Declared. * struct.c (struct_init): Move compat logic to struct_compat_fixup. (struct_compat_fixup): New function. * struct.h (stream_compat_fixup): Declared. * lib.c (compat_fixup): Call arith_compat_fixup, ffi_compat_fixup, regex_compat_fixup, stream_compat_fixup and struct_compat_fixup.
Diffstat (limited to 'arith.c')
-rw-r--r--arith.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/arith.c b/arith.c
index 941ed681..ad3a0eaa 100644
--- a/arith.c
+++ b/arith.c
@@ -4584,13 +4584,6 @@ void arith_init(void)
bitset_s = intern(lit("bitset"), user_package);
logcount_s = intern(lit("logcount"), user_package);
- if (opt_compat && opt_compat <= 199) {
- reg_varl(intern(lit("*flo-dig*"), user_package), num_fast(DBL_DIG));
- reg_varl(intern(lit("*flo-max*"), user_package), flo(DBL_MAX));
- reg_varl(intern(lit("*flo-min*"), user_package), flo(DBL_MIN));
- reg_varl(intern(lit("*flo-epsilon*"), user_package), flo(DBL_EPSILON));
- }
-
reg_varl(intern(lit("flo-dig"), user_package), num_fast(DBL_DIG));
reg_varl(intern(lit("flo-max-dig"), user_package), num_fast(FLO_MAX_DIG));
reg_varl(intern(lit("flo-max"), user_package), flo(DBL_MAX));
@@ -4608,11 +4601,6 @@ void arith_init(void)
#endif
reg_varl(intern(lit("%e%"), user_package), flo(M_E));
- if (opt_compat && opt_compat <= 199) {
- reg_varl(intern(lit("*pi*"), user_package), flo(M_PI));
- reg_varl(intern(lit("*e*"), user_package), flo(M_E));
- }
-
reg_fun(plus_s, func_n0v(plusv));
reg_fun(minus_s, func_n1v(minusv));
reg_fun(mul_s, func_n0v(mulv));
@@ -4675,8 +4663,7 @@ void arith_init(void)
reg_fun(sqrt_s, func_n1(sqroot));
reg_fun(logand_s, func_n0v(logandv));
reg_fun(logior_s, func_n0v(logiorv));
- reg_fun(logxor_s,
- func_n2(if3(opt_compat && opt_compat <= 202, logxor_old, logxor)));
+ reg_fun(logxor_s, func_n2(logxor));
reg_fun(intern(lit("logtest"), user_package), func_n2(logtest));
reg_fun(lognot_s, func_n2o(lognot, 1));
reg_fun(logtrunc_s, func_n2(logtrunc));
@@ -4731,6 +4718,21 @@ void arith_init(void)
#endif
}
+void arith_compat_fixup(int compat_ver)
+{
+ if (compat_ver <= 202)
+ reg_fun(logxor_s, func_n2(logxor_old));
+
+ if (compat_ver <= 199) {
+ reg_varl(intern(lit("*pi*"), user_package), flo(M_PI));
+ reg_varl(intern(lit("*e*"), user_package), flo(M_E));
+ reg_varl(intern(lit("*flo-dig*"), user_package), num_fast(DBL_DIG));
+ reg_varl(intern(lit("*flo-max*"), user_package), flo(DBL_MAX));
+ reg_varl(intern(lit("*flo-min*"), user_package), flo(DBL_MIN));
+ reg_varl(intern(lit("*flo-epsilon*"), user_package), flo(DBL_EPSILON));
+ }
+}
+
void arith_free_all(void)
{
}