]> gitweb.factorcode.org Git - factor.git/blob - vm/utilities.hpp
VM: macro FACTOR_FOR_EACH used in more places to drive iteration
[factor.git] / vm / utilities.hpp
1 namespace factor {
2
3 // Poor mans range-based for loops.
4 #define FACTOR_FOR_EACH(iterable)                           \
5   for (typeof((iterable).begin()) iter = (iterable).begin();    \
6        iter != (iterable).end();                                \
7        iter++)
8
9 inline static void memset_2(void* dst, uint16_t pattern, size_t size) {
10 #ifdef __APPLE__
11   cell cell_pattern = (pattern | (pattern << 16));
12   memset_pattern4(dst, &cell_pattern, size);
13 #else
14   if (pattern == 0)
15     memset(dst, 0, size);
16   else {
17     uint16_t* start = (uint16_t*)dst;
18     uint16_t* end = (uint16_t*)((cell)dst + size);
19     while (start < end) {
20       *start = pattern;
21       start++;
22     }
23   }
24 #endif
25 }
26
27 inline static void memset_cell(void* dst, cell pattern, size_t size) {
28 #ifdef __APPLE__
29 #ifdef FACTOR_64
30   memset_pattern8(dst, &pattern, size);
31 #else
32   memset_pattern4(dst, &pattern, size);
33 #endif
34 #else
35   if (pattern == 0)
36     memset(dst, 0, size);
37   else {
38     cell* start = (cell*)dst;
39     cell* end = (cell*)((cell)dst + size);
40     while (start < end) {
41       *start = pattern;
42       start++;
43     }
44   }
45 #endif
46 }
47
48 void* fill_function_descriptor(void* ptr, void* code);
49 void* function_descriptor_field(void* ptr, size_t idx);
50
51 vm_char* safe_strdup(const vm_char* str);
52 cell read_cell_hex();
53 VM_C_API void* factor_memcpy(void* dst, void* src, size_t len);
54
55 }