rt.c (1423B)
1 #include <stdlib.h> 2 3 #include "rt.h" 4 5 #include "bc.h" 6 #include "stk.h" 7 #include "var.h" 8 #include "ns.h" 9 #include "object.h" 10 #include "pc.h" 11 #include "helper.h" 12 13 /* Creates new runtime context. 14 * char* - Filename 15 * stk_t* - Arguement stack (non-null) 16 * ns_cont*- Copy of the global namespace 17 */ 18 rt_t* rt_ctx_new(char* fname, stk_t* args) 19 { 20 N_ASSERT(fname, "rt_ctx_new\n"); 21 N_ASSERT(args, "rt_ctx_new\n"); 22 23 rt_t* ctx = (rt_t*)malloc(sizeof(rt_t)); 24 M_ASSERT(ctx); 25 26 ctx->db = 0; 27 ctx->pc = pc_new(fname); 28 ctx->stack = stk_new(); 29 ctx->argstk = args; 30 ctx->vars = ns_init(MAXIMUM_TRACKING_VARS); 31 ctx->names = ns_init(0x7F); 32 ctx->varctx = ns_ctx_init(); 33 34 var_cont* ns_var = var_new(OBJECT); 35 var_set(ns_var, ctx->vars, OBJECT); 36 37 ns_dec(ctx->names, OBJECT, 1, 1); 38 ns_set(ctx->names, 1, 1, ns_var); 39 40 return ctx; 41 } 42 43 void rt_ns_del(void* ns) 44 { 45 ns_t* namespace = (ns_t*)ns; 46 ns_del(namespace); 47 } 48 49 /* Destroys runtime context. This can be *very* slow. 50 */ 51 void rt_ctx_del(rt_t* ctx) 52 { 53 N_ASSERT(ctx, "rt_ctx_del\n"); 54 55 N_ASSERT(ctx->stack, "rt_ctx_del\n"); 56 stk_del(ctx->stack); 57 58 N_ASSERT(ctx->argstk, "rt_ctx_del\n"); 59 stk_del(ctx->argstk); 60 61 N_ASSERT(ctx->pc, "rt_ctx_del\n"); 62 pc_del(ctx->pc); 63 64 N_ASSERT(ctx->vars, "rt_ctx_del\n"); 65 ns_del(ctx->vars); 66 67 N_ASSERT(ctx->names, "rt_ctx_del\n"); 68 ns_del(ctx->names); 69 70 N_ASSERT(ctx->varctx, "rt_ctx_del\n"); 71 ns_ctx_del(ctx->varctx); 72 73 free(ctx); 74 }