#include #include // See comments in build_native_lib() #define EXPORT __attribute__((visibility("default"))) /* Test: test_access_pointer */ EXPORT void print_pointer(const int32_t *ptr) { printf("printing pointer dereference from C: %d\n", *ptr); } /* Test: test_access_simple */ typedef struct Simple { int32_t field; } Simple; EXPORT int32_t access_simple(const Simple *s_ptr) { return s_ptr->field; } /* Test: test_access_nested */ typedef struct Nested { int32_t value; struct Nested *next; } Nested; // Returns the innermost/last value of a Nested pointer chain. EXPORT int32_t access_nested(const Nested *n_ptr) { // Edge case: `n_ptr == NULL` (i.e. first Nested is None). if (!n_ptr) { return 0; } while (n_ptr->next) { n_ptr = n_ptr->next; } return n_ptr->value; } /* Test: test_access_static */ typedef struct Static { int32_t value; struct Static *recurse; } Static; EXPORT int32_t access_static(const Static *s_ptr) { return s_ptr->recurse->recurse->value; } /* Test: unexposed_reachable_alloc */ EXPORT uintptr_t do_one_deref(const int32_t ***ptr) { return (uintptr_t)*ptr; }