language

some fools attempt at an interpreted language
Log | Files | Refs | README

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 }