mirror of
https://github.com/janet-lang/janet
synced 2025-02-02 18:29:10 +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:
parent
e4f4a42751
commit
9ffec43d2b
@ -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];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user