From 4463445b017cd0099cbb0fa050d199a814505f72 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 30 Aug 2015 08:47:29 -0700 Subject: Introducing structs. * args.c (args_cat_zap): New function. * args.h: (args_cat_zap): Declared. * eval.c (struct_lit_s): New symbol variable. (eval_init): Initialize struct_lit_s. * eval.h (struct_lit_s): Declared. * gc.c (finalize): If a symbol has a struct slot hash attached to it, we must free it when the symbol is reclaimed. * lib.c (make_sym): Initialize symbol's slot_cache pointer to null. (copy): Copy structure objects. (init): Call struct_init to initialize struct module. * lib.h (SLOT_CACHE_SIZE): New preprocessor symbol (slot_cache_line_t, slot_cache_t): New typedefs. (struct sym): New member, slot_cache. * lisplib.c (struct_set_entries, struct_instantiate): New static functions. (liplib_init): Register new functions in dl_table. parser.y (HASH_S): New terminal symbol. (struct): New grammar rule. (n_expr): Derive struct. (yybadtoken): Map HASH_S to #S string. parser.l (grammar): Recognize #S and return HASH_S token. share/txr/stdlib/place.tl (slot): New defplace. share/txr/stdlib/struct.tl: New file. struct.c: New file. struct.h: New file. * Makefile (OBJS): Adding struct.o. --- lib.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 11a4da5f..8b41696f 100644 --- a/lib.c +++ b/lib.c @@ -64,6 +64,7 @@ #include "syslog.h" #include "glob.h" #include "cadr.h" +#include "struct.h" #include "txr.h" #define max(a, b) ((a) > (b) ? (a) : (b)) @@ -3728,6 +3729,7 @@ val make_sym(val name) obj->s.type = SYM; obj->s.name = name; obj->s.package = nil; + obj->s.slot_cache = 0; return obj; } @@ -6560,6 +6562,8 @@ val copy(val seq) return copy_hash(seq); if (seq->co.cls == random_state_s) return make_random_state(seq); + if (structp(seq)) + return copy_struct(seq); /* fallthrough */ default: type_mismatch(lit("copy: cannot copy object of type ~s"), @@ -7660,6 +7664,7 @@ void init(const wchar_t *pn, mem_t *(*oom)(mem_t *, size_t), glob_init(); #endif cadr_init(); + struct_init(); gc_state(gc_save); } -- cgit v1.2.3