1
0
mirror of https://github.com/janet-lang/janet synced 2024-10-18 16:05:47 +00:00

Fix endianess issues on s390x architecture.

Endianess code should use memcpy instead of unions. This apparently
is more correct on old, optimizing compilers. Technically, this is
compilers being really stupid but we work with what we got.

That said, this endianess code is more complicated than needed.
This commit is contained in:
Calvin Rose 2024-09-06 10:23:31 -05:00
parent e4f4a42751
commit 9ffec43d2b
2 changed files with 33 additions and 37 deletions

View File

@ -371,17 +371,15 @@ JANET_CORE_FN(cfun_buffer_push_uint16,
janet_fixarity(argc, 3); janet_fixarity(argc, 3);
JanetBuffer *buffer = janet_getbuffer(argv, 0); JanetBuffer *buffer = janet_getbuffer(argv, 0);
int reverse = should_reverse_bytes(argv, 1); int reverse = should_reverse_bytes(argv, 1);
union { uint16_t data = janet_getuinteger16(argv, 2);
uint16_t data; uint8_t bytes[sizeof(data)];
uint8_t bytes[2]; memcpy(bytes, &data, sizeof(bytes));
} u;
u.data = janet_getuinteger16(argv, 2);
if (reverse) { if (reverse) {
uint8_t temp = u.bytes[1]; uint8_t temp = bytes[1];
u.bytes[1] = u.bytes[0]; bytes[1] = bytes[0];
u.bytes[0] = temp; bytes[0] = temp;
} }
janet_buffer_push_u16(buffer, *(uint16_t *) u.bytes); janet_buffer_push_bytes(buffer, bytes, sizeof(bytes));
return argv[0]; return argv[0];
} }
@ -392,14 +390,12 @@ JANET_CORE_FN(cfun_buffer_push_uint32,
janet_fixarity(argc, 3); janet_fixarity(argc, 3);
JanetBuffer *buffer = janet_getbuffer(argv, 0); JanetBuffer *buffer = janet_getbuffer(argv, 0);
int reverse = should_reverse_bytes(argv, 1); int reverse = should_reverse_bytes(argv, 1);
union { uint32_t data = janet_getuinteger(argv, 2);
uint32_t data; uint8_t bytes[sizeof(data)];
uint8_t bytes[4]; memcpy(bytes, &data, sizeof(bytes));
} u;
u.data = janet_getuinteger(argv, 2);
if (reverse) if (reverse)
reverse_u32(u.bytes); reverse_u32(bytes);
janet_buffer_push_u32(buffer, *(uint32_t *) u.bytes); janet_buffer_push_bytes(buffer, bytes, sizeof(bytes));
return argv[0]; return argv[0];
} }
@ -410,14 +406,12 @@ JANET_CORE_FN(cfun_buffer_push_uint64,
janet_fixarity(argc, 3); janet_fixarity(argc, 3);
JanetBuffer *buffer = janet_getbuffer(argv, 0); JanetBuffer *buffer = janet_getbuffer(argv, 0);
int reverse = should_reverse_bytes(argv, 1); int reverse = should_reverse_bytes(argv, 1);
union { uint64_t data = janet_getuinteger64(argv, 2);
uint64_t data; uint8_t bytes[sizeof(data)];
uint8_t bytes[8]; memcpy(bytes, &data, sizeof(bytes));
} u;
u.data = janet_getuinteger64(argv, 2);
if (reverse) if (reverse)
reverse_u64(u.bytes); reverse_u64(bytes);
janet_buffer_push_u64(buffer, *(uint64_t *) u.bytes); janet_buffer_push_bytes(buffer, bytes, sizeof(bytes));
return argv[0]; return argv[0];
} }
@ -428,14 +422,12 @@ JANET_CORE_FN(cfun_buffer_push_float32,
janet_fixarity(argc, 3); janet_fixarity(argc, 3);
JanetBuffer *buffer = janet_getbuffer(argv, 0); JanetBuffer *buffer = janet_getbuffer(argv, 0);
int reverse = should_reverse_bytes(argv, 1); int reverse = should_reverse_bytes(argv, 1);
union { float data = (float) janet_getnumber(argv, 2);
float data; uint8_t bytes[sizeof(data)];
uint8_t bytes[4]; memcpy(bytes, &data, sizeof(bytes));
} u;
u.data = (float) janet_getnumber(argv, 2);
if (reverse) if (reverse)
reverse_u32(u.bytes); reverse_u32(bytes);
janet_buffer_push_u32(buffer, *(uint32_t *) u.bytes); janet_buffer_push_bytes(buffer, bytes, sizeof(bytes));
return argv[0]; return argv[0];
} }
@ -446,14 +438,12 @@ JANET_CORE_FN(cfun_buffer_push_float64,
janet_fixarity(argc, 3); janet_fixarity(argc, 3);
JanetBuffer *buffer = janet_getbuffer(argv, 0); JanetBuffer *buffer = janet_getbuffer(argv, 0);
int reverse = should_reverse_bytes(argv, 1); int reverse = should_reverse_bytes(argv, 1);
union { double data = janet_getnumber(argv, 2);
double data; uint8_t bytes[sizeof(data)];
uint8_t bytes[8]; memcpy(bytes, &data, sizeof(bytes));
} u;
u.data = janet_getnumber(argv, 2);
if (reverse) if (reverse)
reverse_u64(u.bytes); reverse_u64(bytes);
janet_buffer_push_u64(buffer, *(uint64_t *) u.bytes); janet_buffer_push_bytes(buffer, bytes, sizeof(bytes));
return argv[0]; return argv[0];
} }

View File

@ -174,6 +174,8 @@ JANET_CORE_FN(os_arch,
"* :riscv64\n\n" "* :riscv64\n\n"
"* :sparc\n\n" "* :sparc\n\n"
"* :wasm\n\n" "* :wasm\n\n"
"* :s390\n\n"
"* :s390x\n\n"
"* :unknown\n") { "* :unknown\n") {
janet_fixarity(argc, 0); janet_fixarity(argc, 0);
(void) argv; (void) argv;
@ -200,6 +202,10 @@ JANET_CORE_FN(os_arch,
return janet_ckeywordv("ppc"); return janet_ckeywordv("ppc");
#elif (defined(__ppc64__) || defined(_ARCH_PPC64) || defined(_M_PPC)) #elif (defined(__ppc64__) || defined(_ARCH_PPC64) || defined(_M_PPC))
return janet_ckeywordv("ppc64"); return janet_ckeywordv("ppc64");
#elif (defined(__s390x__))
return janet_ckeywordv("s390x");
#elif (defined(__s390__))
return janet_ckeywordv("s390");
#else #else
return janet_ckeywordv("unknown"); return janet_ckeywordv("unknown");
#endif #endif