From 578531395ecbabd8179e31520c2832ac7d6d3765 Mon Sep 17 00:00:00 2001 From: Matthew Sotoudeh Date: Thu, 27 Jul 2023 12:06:17 -0700 Subject: add dynamic typing example --- .../dynamic_typing/runtime/dynamic_typing.c | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 python/examples/dynamic_typing/runtime/dynamic_typing.c (limited to 'python/examples/dynamic_typing/runtime/dynamic_typing.c') diff --git a/python/examples/dynamic_typing/runtime/dynamic_typing.c b/python/examples/dynamic_typing/runtime/dynamic_typing.c new file mode 100644 index 0000000..4e47bc9 --- /dev/null +++ b/python/examples/dynamic_typing/runtime/dynamic_typing.c @@ -0,0 +1,72 @@ +#include +#include "dynamic_typing.h" + +struct entry { + void *start; + void *end; + struct type *type; +}; + +static struct entry *ENTRIES; +static unsigned long N_ENTRIES; + +void annotate_type(void *ptr, struct type *type) { + ENTRIES = realloc(ENTRIES, (++N_ENTRIES) * sizeof(ENTRIES[0])); + ENTRIES[N_ENTRIES - 1] = (struct entry){ + .start = ptr, + .end = ptr + 1, + .type = type, + }; +} + +struct type *dynamic_typeof(void *ptr) { + for (unsigned long i = N_ENTRIES; i --> 0;) + if (ENTRIES[i].start <= ptr && ptr < ENTRIES[i].end) + return ENTRIES[i].type; + return 0; +} + +struct type *make_basic(const char *type, unsigned long size) { + struct type *t = calloc(1, sizeof(*t)); + t->kind = TY_BASIC; + t->basic = type; + t->size = size; + return t; +} + +struct type *make_array(struct type *base, unsigned long len) { + struct type *t = calloc(1, sizeof(*t)); + t->kind = TY_ARRAY; + t->base = base; + t->length = len; + t->size = len * t->base->size; + return t; +} + +struct type *make_pointer(struct type *base) { + struct type *t = calloc(1, sizeof(*t)); + t->kind = TY_POINTER; + t->base = base; + t->size = sizeof(void*); + return t; +} + +// function not supported yet +// for struct & union, the members are initialized by the caller +struct type *make_struct(unsigned long size) { + struct type *t = calloc(1, sizeof(*t)); + t->kind = TY_STRUCT; + return t; +} + +struct type *make_union(unsigned long size) { + struct type *t = calloc(1, sizeof(*t)); + t->kind = TY_UNION; + return t; +} +void prepend_member(struct type *aggregate, struct type *member, const char *name, unsigned long offset) { + member->offset = offset; + member->next_member = aggregate->members; + member->field_name = name; + aggregate->members = member; +} -- cgit v1.2.3