2013-05-11 22:30:45 -04:00
|
|
|
namespace factor {
|
2009-10-31 03:30:48 -04:00
|
|
|
|
2016-08-05 08:44:37 -04:00
|
|
|
// Poor mans range-based for loops.
|
2015-06-04 11:30:36 -04:00
|
|
|
#define FACTOR_FOR_EACH(iterable) \
|
2015-06-05 13:20:32 -04:00
|
|
|
for (auto iter = (iterable).begin(), \
|
2015-06-04 11:30:36 -04:00
|
|
|
_end = (iterable).end(); \
|
|
|
|
iter != _end; \
|
2015-05-28 20:03:37 -04:00
|
|
|
iter++)
|
|
|
|
|
2013-05-13 00:28:25 -04:00
|
|
|
inline static void memset_2(void* dst, uint16_t pattern, size_t size) {
|
2010-04-25 20:19:50 -04:00
|
|
|
#ifdef __APPLE__
|
2013-05-11 22:30:45 -04:00
|
|
|
cell cell_pattern = (pattern | (pattern << 16));
|
|
|
|
memset_pattern4(dst, &cell_pattern, size);
|
2010-04-25 20:19:50 -04:00
|
|
|
#else
|
2013-05-11 22:30:45 -04:00
|
|
|
if (pattern == 0)
|
|
|
|
memset(dst, 0, size);
|
|
|
|
else {
|
2013-05-13 00:28:25 -04:00
|
|
|
uint16_t* start = (uint16_t*)dst;
|
2013-05-13 00:53:47 -04:00
|
|
|
uint16_t* end = (uint16_t*)((cell)dst + size);
|
2013-05-11 22:30:45 -04:00
|
|
|
while (start < end) {
|
|
|
|
*start = pattern;
|
|
|
|
start++;
|
|
|
|
}
|
|
|
|
}
|
2010-04-25 20:19:50 -04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2013-05-11 22:30:45 -04:00
|
|
|
inline static void memset_cell(void* dst, cell pattern, size_t size) {
|
2009-10-31 03:30:48 -04:00
|
|
|
#ifdef __APPLE__
|
2013-05-11 22:30:45 -04:00
|
|
|
#ifdef FACTOR_64
|
|
|
|
memset_pattern8(dst, &pattern, size);
|
2009-10-31 03:30:48 -04:00
|
|
|
#else
|
2013-05-11 22:30:45 -04:00
|
|
|
memset_pattern4(dst, &pattern, size);
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
if (pattern == 0)
|
|
|
|
memset(dst, 0, size);
|
|
|
|
else {
|
|
|
|
cell* start = (cell*)dst;
|
2013-05-13 00:53:47 -04:00
|
|
|
cell* end = (cell*)((cell)dst + size);
|
2013-05-11 22:30:45 -04:00
|
|
|
while (start < end) {
|
|
|
|
*start = pattern;
|
|
|
|
start++;
|
|
|
|
}
|
|
|
|
}
|
2009-10-31 03:30:48 -04:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2013-05-11 22:30:45 -04:00
|
|
|
void* fill_function_descriptor(void* ptr, void* code);
|
|
|
|
void* function_descriptor_field(void* ptr, size_t idx);
|
2011-05-20 18:11:50 -04:00
|
|
|
|
2013-05-11 22:30:45 -04:00
|
|
|
vm_char* safe_strdup(const vm_char* str);
|
2009-10-31 03:30:48 -04:00
|
|
|
cell read_cell_hex();
|
2013-05-11 22:30:45 -04:00
|
|
|
VM_C_API void* factor_memcpy(void* dst, void* src, size_t len);
|
2009-10-31 03:30:48 -04:00
|
|
|
|
2009-05-04 02:46:13 -04:00
|
|
|
}
|