language

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

ins_def.c (18248B)


      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 
      4 #include "ins_def.h"
      5 
      6 #include "proc.h"
      7 #include "rt.h"
      8 #include "bc.h"
      9 #include "stk.h"
     10 #include "object.h"
     11 #include "var.h"
     12 #include "var_ops.h"
     13 #include "pc.h"
     14 #include "helper.h"
     15 
     16 /* Initializes INS_DEF with pointers to each instructions function
     17  * Populates INS_DEF
     18  */
     19 void init_ins_def( void )
     20 {
     21 	INS_DEC(0x00, _ins_def_NULL, "NULL");
     22 	INS_DEC(0x01, _ins_def_SYNC, "SYNC");
     23 
     24 	INS_DEC(0x02, _ins_def_PRINT, "PRINT");
     25 	INS_DEC(0x03, _ins_def_DEBUG, "DEBUG");
     26 	INS_DEC(0x0E, _ins_def_ARGB, "ARGB");
     27 	INS_DEC(0x0F, _ins_def_LIBC, "LIBC");
     28 
     29 	INS_DEC(0x10, _ins_def_POP, "POP");
     30 	INS_DEC(0x11, _ins_def_ROT, "ROT");
     31 	INS_DEC(0x12, _ins_def_DUP, "DUP");
     32 	INS_DEC(0x13, _ins_def_ROT_THREE, "ROT_THREE");
     33 
     34 	INS_DEC(0x20, _ins_def_DEC, "DEC");
     35 	INS_DEC(0x21, _ins_def_LOV, "LOV");
     36 	INS_DEC(0x22, _ins_def_STV, "STV");
     37 	INS_DEC(0x23, _ins_def_CTV, "CTV");
     38 	INS_DEC(0x24, _ins_def_CTS, "CTS");
     39 
     40 	INS_DEC(0x30, _ins_def_TYPEOF, "TYPEOF");
     41 	INS_DEC(0x31, _ins_def_CAST, "CAST");
     42 
     43 	INS_DEC(0x40, _ins_def_ADD, "ADD");
     44 	INS_DEC(0x41, _ins_def_SUB, "SUB");
     45 	INS_DEC(0x42, _ins_def_MULT, "MULT");
     46 	INS_DEC(0x43, _ins_def_DIV, "DIV");
     47 	INS_DEC(0x44, _ins_def_POW, "POW");
     48 	INS_DEC(0x45, _ins_def_BRT, "BRT");
     49 	INS_DEC(0x46, _ins_def_SIN, "SIN");
     50 	INS_DEC(0x47, _ins_def_COS, "COS");
     51 	INS_DEC(0x48, _ins_def_TAN, "TAN");
     52 	INS_DEC(0x49, _ins_def_ISIN, "ISIN");
     53 	INS_DEC(0x4A, _ins_def_ICOS, "ICOS");
     54 	INS_DEC(0x4B, _ins_def_ITAN, "ITAN");
     55 	INS_DEC(0x4C, _ins_def_MOD, "MOD");
     56 	INS_DEC(0x4D, _ins_def_BOR, "BOR");
     57 	INS_DEC(0x4E, _ins_def_BXOR, "BXOR");
     58 	INS_DEC(0x4F, _ins_def_BNAND, "BNAND");
     59 
     60 	INS_DEC(0x50, _ins_def_GTHAN, "GTHAN");
     61 	INS_DEC(0x51, _ins_def_LTHAN, "LTHAN");
     62 	INS_DEC(0x52, _ins_def_GTHAN_EQ, "GTHAN_EQ");
     63 	INS_DEC(0x53, _ins_def_LTHAN_EQ, "LTHAN_EQ");
     64 	INS_DEC(0x54, _ins_def_EQ, "EQ");
     65 	INS_DEC(0x55, _ins_def_NEQ, "NEQ");
     66 	INS_DEC(0x56, _ins_def_NOT, "NOT");
     67 	INS_DEC(0x57, _ins_def_OR, "OR");
     68 	INS_DEC(0x58, _ins_def_AND, "AND");
     69 
     70 	INS_DEC(0x60, _ins_def_STARTL, "STARTL");
     71 	INS_DEC(0x61, _ins_def_CLOOP, "CLOOP");
     72 	INS_DEC(0x6E, _ins_def_BREAK, "BREAK");
     73 	INS_DEC(0x6F, _ins_def_ENDL, "ENDL");
     74 
     75 	INS_DEC(0x70, _ins_def_GOTO, "GOTO");
     76 	INS_DEC(0x71, _ins_def_JUMPF, "JUMPF");
     77 	INS_DEC(0x72, _ins_def_IFDO, "IFDO");
     78 	INS_DEC(0x73, _ins_def_ELSE, "ELSE");
     79 	INS_DEC(0x7E, _ins_def_DONE, "DONE");
     80 	INS_DEC(0x7F, _ins_def_CALL, "CALL");
     81 
     82 	INS_DEC(0x80, _ins_def_GETN, "GETN");
     83 	INS_DEC(0x81, _ins_def_SETN, "SETN");
     84 	INS_DEC(0x82, _ins_def_CALLM, "CALLM");
     85 	INS_DEC(0x83, _ins_def_INDEXO, "INDEXO");
     86 	INS_DEC(0x84, _ins_def_MODO, "MODO");
     87 
     88 	INS_DEC(0xF0, _ins_def_RETURN, "RETURN");
     89 	INS_DEC(0xF1, _ins_def_NEW, "NEW");
     90 	INS_DEC(0xF2, _ins_def_ENDCLASS, "ENDCLASS");
     91 	INS_DEC(0xFE, _ins_def_DECLASS, "DECLASS");
     92 	INS_DEC(0xFF, _ins_def_DEFUN, "DEFUN");
     93 }
     94 
     95 int ins_def_is_valid(bc_cont* line)
     96 {
     97 	int rv = 0;
     98 
     99 	if (INS_DEF[line->op] != NULL)
    100 	{
    101 		rv = 1;
    102 	}
    103 	return rv;
    104 }
    105 
    106 inline void run_ins(rt_t* ctx, bc_cont* line)
    107 {
    108 	INS_DEF[line->op](ctx, line);
    109 }
    110 
    111 void _ins_def_NULL     (rt_t* ctx, bc_cont* line)
    112 {
    113 	pc_inc(ctx->pc, 1);
    114 }
    115 void _ins_def_SYNC     (rt_t* ctx, bc_cont* line)
    116 {
    117 	pc_inc(ctx->pc, 1);
    118 }
    119 void _ins_def_PRINT    (rt_t* ctx, bc_cont* line)
    120 {
    121 	var_cont* var = stk_pop(ctx->stack);
    122 
    123 	var_pprint(var);
    124 
    125 	pc_inc(ctx->pc, 1);
    126 }
    127 void _ins_def_DEBUG    (rt_t* ctx, bc_cont* line)
    128 {
    129 	ctx->db = 0 ? ctx->db : 1;
    130 	pc_inc(ctx->pc, 1);
    131 }
    132 void _ins_def_ARGB     (rt_t* ctx, bc_cont* line)
    133 {
    134 	var_cont* var = stk_pop(ctx->stack);
    135 
    136 	stk_push(ctx->argstk, var);
    137 
    138 	pc_inc(ctx->pc, 1);
    139 }
    140 void _ins_def_LIBC     (rt_t* ctx, bc_cont* line)
    141 {
    142 	pc_inc(ctx->pc, 1);
    143 }
    144 
    145 void _ins_def_POP      (rt_t* ctx, bc_cont* line)
    146 {
    147 	int n = var_data_get_G_INT(line->varg[0]);
    148 	int i = 0;
    149 
    150 	while (n > i)
    151 	{
    152 		i++;
    153 		stk_pop(ctx->stack);
    154 	}
    155 
    156 	pc_inc(ctx->pc, 1);
    157 }
    158 void _ins_def_ROT      (rt_t* ctx, bc_cont* line)
    159 {
    160 	stk_rot_top(ctx->stack);
    161 
    162 	pc_inc(ctx->pc, 1);
    163 }
    164 void _ins_def_DUP      (rt_t* ctx, bc_cont* line)
    165 {
    166 	var_cont* var = stk_at(ctx->stack, 0);
    167 	var_cont* dup = var_data_cpy(var);
    168 	stk_push(ctx->stack, dup);
    169 	pc_inc(ctx->pc, 1);
    170 }
    171 void _ins_def_ROT_THREE(rt_t* ctx, bc_cont* line)
    172 {
    173 	stk_rot_three(ctx->stack);
    174 	pc_inc(ctx->pc, 1);
    175 }
    176 
    177 void _ins_def_DEC      (rt_t* ctx, bc_cont* line)
    178 {
    179 	int scope = var_data_get_G_INT(line->varg[0]);
    180 	b_type type  = var_data_get_TYPE(line->varg[1]);
    181 	int name  = var_data_get_G_INT(line->varg[2]);
    182 
    183 	proc_decvar(ctx, type, scope, name);
    184 
    185 	pc_inc(ctx->pc, 1);
    186 }
    187 void _ins_def_LOV      (rt_t* ctx, bc_cont* line)
    188 {
    189 	int scope = var_data_get_G_INT(line->varg[0]);
    190 	int name  = var_data_get_G_INT(line->varg[1]);
    191 
    192 	var_cont* var;
    193 
    194 	var = proc_getvar(ctx, scope, name);
    195 
    196 	stk_push(ctx->stack, var);
    197 
    198 	pc_inc(ctx->pc, 1);
    199 }
    200 void _ins_def_STV      (rt_t* ctx, bc_cont* line)
    201 {
    202 	int scope = var_data_get_G_INT(line->varg[0]);
    203 	int name  = var_data_get_G_INT(line->varg[1]);
    204 
    205 	var_cont* var = stk_pop(ctx->stack);
    206 	var_cont* ovr = proc_getvar(ctx, scope, name);
    207 	var_cont* set = var_data_cpy(var);
    208 	set->ownership = ovr->ownership;
    209 
    210 	proc_setvar(ctx, scope, name, set);
    211 
    212 	pc_inc(ctx->pc, 1);
    213 }
    214 void _ins_def_CTV      (rt_t* ctx, bc_cont* line)
    215 {
    216 	int name = var_data_get_G_INT(line->varg[0]);
    217 	
    218 	int scope = var_data_get_G_INT(line->varg[1]);
    219 
    220 	var_cont* new = var_data_cpy(line->varg[2]);
    221 
    222 	proc_setvar(ctx, scope, name, new);
    223 
    224 	pc_inc(ctx->pc, 1);
    225 }
    226 void _ins_def_CTS      (rt_t* ctx, bc_cont* line)
    227 {
    228 	//var_cont* new = var_data_cpy(line->varg[0]);
    229 
    230 	stk_push(ctx->stack, line->varg[0]);
    231 
    232 	pc_inc(ctx->pc, 1);
    233 }
    234 
    235 void _ins_def_TYPEOF   (rt_t* ctx, bc_cont* line)
    236 {
    237 	var_cont* var = stk_at(ctx->stack, 0);
    238 	var_cont* new = var_new(TYPE);
    239 
    240 	var_data_type* data = var_data_alloc_TYPE(var->type);
    241 
    242 	var_set(new, data, TYPE);
    243 
    244 	stk_push(ctx->stack, new);
    245 
    246 	pc_inc(ctx->pc, 1);
    247 }
    248 void _ins_def_CAST     (rt_t* ctx, bc_cont* line)
    249 {
    250 	pc_inc(ctx->pc, 1);
    251 }
    252 
    253 void _ins_def_ADD      (rt_t* ctx, bc_cont* line)
    254 {
    255 	var_cont* A = stk_pop(ctx->stack);
    256 	var_cont* B = stk_pop(ctx->stack);
    257 
    258 	var_cont* var = var_add(A, B);
    259 
    260 	stk_push(ctx->stack, var);
    261 
    262 	pc_inc(ctx->pc, 1);
    263 }
    264 void _ins_def_SUB      (rt_t* ctx, bc_cont* line)
    265 {
    266 	var_cont* A = stk_pop(ctx->stack);
    267 	var_cont* B = stk_pop(ctx->stack);
    268 
    269 	var_cont* var = var_sub(A, B);
    270 
    271 	stk_push(ctx->stack, var);
    272 
    273 	pc_inc(ctx->pc, 1);
    274 }
    275 void _ins_def_MULT     (rt_t* ctx, bc_cont* line)
    276 {
    277 	var_cont* A = stk_pop(ctx->stack);
    278 	var_cont* B = stk_pop(ctx->stack);
    279 
    280 	var_cont* var = var_mult(A, B);
    281 
    282 	stk_push(ctx->stack, var);
    283 
    284 	pc_inc(ctx->pc, 1);
    285 }
    286 void _ins_def_DIV      (rt_t* ctx, bc_cont* line)
    287 {
    288 	var_cont* A = stk_pop(ctx->stack);
    289 	var_cont* B = stk_pop(ctx->stack);
    290 
    291 	var_cont* var = var_div(A, B);
    292 
    293 	stk_push(ctx->stack, var);
    294 
    295 	pc_inc(ctx->pc, 1);
    296 }
    297 void _ins_def_POW      (rt_t* ctx, bc_cont* line)
    298 {
    299 	pc_inc(ctx->pc, 1);
    300 }
    301 void _ins_def_BRT      (rt_t* ctx, bc_cont* line)
    302 {
    303 	pc_inc(ctx->pc, 1);
    304 }
    305 void _ins_def_SIN      (rt_t* ctx, bc_cont* line)
    306 {
    307 	pc_inc(ctx->pc, 1);
    308 }
    309 void _ins_def_COS      (rt_t* ctx, bc_cont* line)
    310 {
    311 	pc_inc(ctx->pc, 1);
    312 }
    313 void _ins_def_TAN      (rt_t* ctx, bc_cont* line)
    314 {
    315 	pc_inc(ctx->pc, 1);
    316 }
    317 void _ins_def_ISIN     (rt_t* ctx, bc_cont* line)
    318 {
    319 	pc_inc(ctx->pc, 1);
    320 }
    321 void _ins_def_ICOS     (rt_t* ctx, bc_cont* line)
    322 {
    323 	pc_inc(ctx->pc, 1);
    324 }
    325 void _ins_def_ITAN     (rt_t* ctx, bc_cont* line)
    326 {
    327 	pc_inc(ctx->pc, 1);
    328 }
    329 void _ins_def_MOD      (rt_t* ctx, bc_cont* line)
    330 {
    331 	pc_inc(ctx->pc, 1);
    332 }
    333 void _ins_def_BOR      (rt_t* ctx, bc_cont* line)
    334 {
    335 	pc_inc(ctx->pc, 1);
    336 }
    337 void _ins_def_BXOR     (rt_t* ctx, bc_cont* line)
    338 {
    339 	pc_inc(ctx->pc, 1);
    340 }
    341 void _ins_def_BNAND    (rt_t* ctx, bc_cont* line)
    342 {
    343 	pc_inc(ctx->pc, 1);
    344 }
    345 
    346 void _ins_def_GTHAN    (rt_t* ctx, bc_cont* line)
    347 {
    348 	var_cont* A = stk_pop(ctx->stack);
    349 	var_cont* B = stk_pop(ctx->stack);
    350 
    351 	var_cont* C = var_gthan(A, B);
    352 
    353 	stk_push(ctx->stack, C);
    354 
    355 	pc_inc(ctx->pc, 1);
    356 }
    357 void _ins_def_LTHAN    (rt_t* ctx, bc_cont* line)
    358 {
    359 	var_cont* A = stk_pop(ctx->stack);
    360 	var_cont* B = stk_pop(ctx->stack);
    361 
    362 	var_cont* C = var_lthan(A, B);
    363 
    364 	stk_push(ctx->stack, C);
    365 
    366 	pc_inc(ctx->pc, 1);
    367 }
    368 void _ins_def_GTHAN_EQ (rt_t* ctx, bc_cont* line)
    369 {
    370 	var_cont* A = stk_pop(ctx->stack);
    371 	var_cont* B = stk_pop(ctx->stack);
    372 
    373 	var_cont* C = var_gthan_eq(A, B);
    374 
    375 	stk_push(ctx->stack, C);
    376 
    377 	pc_inc(ctx->pc, 1);
    378 }
    379 void _ins_def_LTHAN_EQ (rt_t* ctx, bc_cont* line)
    380 {
    381 	var_cont* A = stk_pop(ctx->stack);
    382 	var_cont* B = stk_pop(ctx->stack);
    383 
    384 	var_cont* C = var_gthan_eq(A, B);
    385 
    386 	stk_push(ctx->stack, C);
    387 
    388 	pc_inc(ctx->pc, 1);
    389 }
    390 void _ins_def_EQ       (rt_t* ctx, bc_cont* line)
    391 {
    392 	var_cont* A = stk_pop(ctx->stack);
    393 	var_cont* B = stk_pop(ctx->stack);
    394 
    395 	var_cont* C = var_eq(A, B);
    396 
    397 	stk_push(ctx->stack, C);
    398 
    399 	pc_inc(ctx->pc, 1);
    400 }
    401 void _ins_def_NEQ       (rt_t* ctx, bc_cont* line)
    402 {
    403 	var_cont* A = stk_pop(ctx->stack);
    404 	var_cont* B = stk_pop(ctx->stack);
    405 
    406 	var_cont* C = var_eq(A, B);
    407 
    408 	C = var_not(C);
    409 
    410 	stk_push(ctx->stack, C);
    411 
    412 	pc_inc(ctx->pc, 1);
    413 }
    414 
    415 void _ins_def_NOT      (rt_t* ctx, bc_cont* line)
    416 {
    417 	var_cont* A = stk_pop(ctx->stack);
    418 
    419 	var_cont* C = var_not(A);
    420 
    421 	stk_push(ctx->stack, C);
    422 
    423 	pc_inc(ctx->pc, 1);
    424 }
    425 void _ins_def_OR       (rt_t* ctx, bc_cont* line)
    426 {
    427 	pc_inc(ctx->pc, 1);
    428 }
    429 void _ins_def_AND      (rt_t* ctx, bc_cont* line)
    430 {
    431 	pc_inc(ctx->pc, 1);
    432 }
    433 
    434 /* HELPER FUNCTIONS */
    435 void _ins_def_loop_break(rt_t* ctx)
    436 {
    437 	while (pc_safe(ctx->pc))
    438 	{
    439 		pc_update(ctx->pc);
    440 		pc_inc(ctx->pc, 1);
    441 
    442 		if (ctx->pc->line->op == 0x6F)
    443 		{
    444 			break;
    445 		}
    446 	}
    447 }
    448 /* END HELPER FUNCIONS */
    449 void _ins_def_STARTL   (rt_t* ctx, bc_cont* line)
    450 {
    451 	pc_branch(ctx->pc, ctx->pc->address);
    452 	pc_inc(ctx->pc, 1);
    453 }
    454 void _ins_def_CLOOP    (rt_t* ctx, bc_cont* line)
    455 {
    456 	var_cont* var = stk_pop(ctx->stack);
    457 
    458 	int value = var_data_get_G_INT(var);
    459 
    460 	if (value < 1)
    461 	{
    462 		pc_return(ctx->pc);
    463 		_ins_def_loop_break(ctx);
    464 	} else
    465 	{
    466 		pc_inc(ctx->pc, 1);
    467 	}
    468 }
    469 void _ins_def_BREAK    (rt_t* ctx, bc_cont* line)
    470 {
    471 	pc_return(ctx->pc);
    472 	
    473 	_ins_def_loop_break(ctx);
    474 }
    475 void _ins_def_ENDL     (rt_t* ctx, bc_cont* line)
    476 {
    477 	pc_return(ctx->pc);
    478 }
    479 
    480 /* HELPER FUNCTIONS */
    481 void _ins_def_branch_to_end_if(rt_t* ctx)
    482 {
    483 	int level = 0;
    484 	while (pc_safe(ctx->pc))
    485 	{
    486 		pc_inc(ctx->pc, 1);
    487 		pc_update(ctx->pc);
    488 
    489 		// Is this instruction another IF statement?
    490 		if (ctx->pc->line->op == 0x72)
    491 		{
    492 			// Increment the if statement depth counter
    493 			level++;
    494 		} else
    495 		// Is the instruction an ELSE statement?
    496 		if (ctx->pc->line->op == 0x73)
    497 		{
    498 			// We're done here if we're in our scope
    499 			if (level == 0) break;
    500 		} else
    501 		// Is the instruction a DONE statement?
    502 		if (ctx->pc->line->op == 0x7E)
    503 		{
    504 			// And we're not in another if statement, we're done here
    505 			if (level == 0) break;
    506 
    507 			level--;
    508 		}
    509 	}
    510 
    511 	pc_inc(ctx->pc, 1);
    512 }
    513 /* END HELPER FUNCTIONS */
    514 void _ins_def_GOTO     (rt_t* ctx, bc_cont* line)
    515 {
    516 	int value = var_data_get_G_INT(line->varg[0]);
    517 
    518 	pc_branch(ctx->pc, value);
    519 }
    520 void _ins_def_JUMPF    (rt_t* ctx, bc_cont* line)
    521 {
    522 	int value = var_data_get_G_INT(line->varg[0]);
    523 
    524 	pc_inc(ctx->pc, value);
    525 }
    526 void _ins_def_IFDO     (rt_t* ctx, bc_cont* line)
    527 {
    528 	// Get the value off the stack
    529 	var_cont* var = stk_pop(ctx->stack);
    530 	int value = var_data_get_G_INT(var);
    531 
    532 	// If the value is false, find an ELSE statement or DONE statement.
    533 	if (value < 1)
    534 	{
    535 		_ins_def_branch_to_end_if(ctx);
    536 	} else
    537 	{
    538 		pc_inc(ctx->pc, 1);
    539 	}
    540 }
    541 void _ins_def_ELSE     (rt_t* ctx, bc_cont* line)
    542 {
    543 	pc_inc(ctx->pc, 1);
    544 	_ins_def_branch_to_end_if(ctx);
    545 }
    546 void _ins_def_DONE     (rt_t* ctx, bc_cont* line)
    547 {
    548 	pc_inc(ctx->pc, 1);
    549 }
    550 void _ins_def_CALL     (rt_t* ctx, bc_cont* line)
    551 {
    552 	int scope = var_data_get_G_INT(line->varg[0]);
    553 	int name  = var_data_get_G_INT(line->varg[1]);
    554 
    555 	// Call the function
    556 	proc_function_call(ctx, scope, name);
    557 
    558 	pc_inc(ctx->pc, 1);
    559 }
    560 
    561 void _ins_def_GETN     (rt_t* ctx, bc_cont* line)
    562 {
    563 	int name = var_data_get_G_INT(line->varg[0]);
    564 
    565 	var_cont* obj = stk_pop(ctx->stack);
    566 
    567 	ns_t* object = object_get(obj);
    568 
    569 	var_cont* var = object_get_name(object, name);
    570 
    571 	stk_push(ctx->stack, var);
    572 
    573 	pc_inc(ctx->pc, 1);
    574 }
    575 void _ins_def_SETN     (rt_t* ctx, bc_cont* line)
    576 {
    577 	int name = var_data_get_G_INT(line->varg[0]);
    578 
    579 	var_cont* obj = stk_pop(ctx->stack);
    580 	var_cont* var = stk_pop(ctx->stack);
    581 
    582 	ns_t* object = object_get(obj);
    583 	var_cont* set = var_data_cpy(var);
    584 
    585 	object_set_name(object, name, set);
    586 
    587 	pc_inc(ctx->pc, 1);
    588 }
    589 void _ins_def_CALLM    (rt_t* ctx, bc_cont* line)
    590 {
    591 	int name = var_data_get_G_INT(line->varg[0]);
    592 	// Pop the stack to get the object
    593 	var_cont* obj = stk_pop(ctx->stack);
    594 	// Get the objects variable data
    595 	ns_t* object = object_get(obj);
    596 	// Get the method to call
    597 	var_cont* var = object_get_name(object, name);
    598 	var_data_func* func = var_data_get_FUNC(var);
    599 	// Push current namespace context
    600 	ns_ctx_push(ctx->varctx, ctx->vars);
    601 
    602 	// Set current namespace to objects namespace
    603 	ctx->vars = object;
    604 	// Call the function
    605 	proc_function_call_handle(ctx, func);
    606 	// Update the program counter
    607 	pc_update(ctx->pc);
    608 	// Run code here so we can pop the namespace context
    609 	proc_run_to_return(ctx);
    610 	// Pop the namespace context
    611 	ctx->vars = ns_ctx_pop(ctx->varctx);
    612 
    613 	pc_inc(ctx->pc, 1);
    614 }
    615 void _ins_def_INDEXO   (rt_t* ctx, bc_cont* line)
    616 {
    617 	pc_inc(ctx->pc, 1);
    618 }
    619 void _ins_def_MODO     (rt_t* ctx, bc_cont* line)
    620 {
    621 	pc_inc(ctx->pc, 1);
    622 }
    623 
    624 void _ins_def_RETURN   (rt_t* ctx, bc_cont* line)
    625 {
    626 	// Pop a level in the stack and arguement stack
    627 	stk_poplevel(&ctx->stack);
    628 	stk_poplevel(&ctx->argstk);
    629 
    630 	// Pop the namespace and get the return value
    631 	var_cont* return_value = ns_pop(ctx->vars);
    632 
    633 	if (return_value->type != VOID)
    634 	{
    635 		// Push the return value to the stack
    636 		stk_push(ctx->stack, return_value);
    637 	}
    638 	else
    639 	{
    640 		var_del(return_value);
    641 	}
    642 
    643 	// Return to the callee
    644 	pc_return(ctx->pc);
    645 }
    646 void _ins_def_NEW      (rt_t* ctx, bc_cont* line)
    647 {
    648 	int scope = var_data_get_G_INT(line->varg[0]);
    649 	int name  = var_data_get_G_INT(line->varg[1]);
    650 
    651 	// Get the object builder
    652 	var_cont* var = proc_getvar(ctx, scope, name);
    653 	var_data_objbldr* builder = var_data_get_OBJBLDR(var);
    654 
    655 	// Init a new namespace of proper size
    656 	ns_t* new_ns = ns_init(builder->size);
    657 
    658 	// Push current namespace to namespace context
    659 	ns_ctx_push(ctx->varctx, ctx->vars);
    660 
    661 	// Set the current namespace to new namespace
    662 	ctx->vars = new_ns;
    663 
    664 	int offset = 1;
    665 	int i;
    666 	for (i = 0; i < builder->paramlen; i++)
    667 	{
    668 		// Pop the arguement stack
    669 		var_cont* arg = stk_pop(ctx->argstk);
    670 
    671 		// Is the arguement of the right type?
    672 		ASSERT(arg->type == builder->param[i], "Invalid arguement stack\n");
    673 
    674 		// Declare the name in the new namespace and pass the arguements
    675 		ns_dec(ctx->vars, arg->type, 0, i+offset);
    676 		ns_set(ctx->vars, 0, i+offset, arg);
    677 	}
    678 	// Push new stack levels for the stack and the arguement stack
    679 	stk_newlevel(&ctx->stack);
    680 	stk_newlevel(&ctx->argstk);
    681 
    682 	pc_branch(ctx->pc, builder->loc);
    683 }
    684 void _ins_def_ENDCLASS (rt_t* ctx, bc_cont* line)
    685 {
    686 	var_cont* new = var_new(OBJECT);
    687 
    688 	var_set(new, ctx->vars, OBJECT);
    689 
    690 	ns_dec(ctx->vars, OBJECT, 1, 0);
    691 	ns_set(ctx->vars, 1, 0, new);
    692 
    693 	stk_poplevel(&ctx->stack);
    694 	stk_poplevel(&ctx->argstk);
    695 
    696 	ctx->vars = ns_ctx_pop(ctx->varctx);
    697 
    698 	stk_push(ctx->stack, new);
    699 
    700 	pc_return(ctx->pc);
    701 	pc_inc(ctx->pc, 1);
    702 }
    703 void _ins_def_DENS     (rt_t* ctx, bc_cont* line)
    704 {
    705 	int name = var_data_get_G_INT(line->varg[0]);
    706 
    707 	ns_t* namespace = ns_init(MAXIMUM_TRACKING_VARS);
    708 
    709 	var_cont* ns_var = var_new(OBJECT);
    710 	var_set(ns_var, namespace, OBJECT);
    711 
    712 	ns_dec(ctx->names, OBJECT, 1, name);
    713 	ns_set(ctx->names, 1, name, ns_var);
    714 
    715 	ctx->vars = namespace;
    716 }
    717 void _ins_def_DECLASS  (rt_t* ctx, bc_cont* line)
    718 {
    719 	int     name = var_data_get_G_INT(line->varg[0]);
    720 	b_type* args = var_data_get_PLIST(line->varg[1]);
    721 	size_t  alen = line->sarg[1];
    722 
    723 	// Create a new variable for the object builder
    724 	var_cont* obj = var_new(OBJBLDR);
    725 
    726 	// Allocate memory for this variable
    727 	var_data_objbldr* data = var_data_alloc_OBJBLDR();
    728 
    729 	// Set this objects ID
    730 	data->id  = name;
    731 	// Set the location
    732 	data->loc = line->real_addr + 1;
    733 
    734 	/* Determine namespace size for this object
    735 	 */
    736 	int nsize;
    737 	for (nsize = 0; pc_safe(ctx->pc);)
    738 	{
    739 		// Are we at the end of the object builder?
    740 		if (ctx->pc->line->op == 0xF2)
    741 		{
    742 			break;
    743 		} else
    744 		// Are we declaring a variable or function?
    745 		if (ctx->pc->line->op == 0x20 || ctx->pc->line->op == 0xFF)
    746 		{
    747 			nsize++;
    748 		}
    749 
    750 		pc_inc(ctx->pc, 1);
    751 		pc_update(ctx->pc);
    752 	}
    753 
    754 	data->end      = ctx->pc->line->real_addr;
    755 	data->size     = nsize + alen + 1;
    756 	data->paramlen = alen;
    757 	data->param    = args;
    758 
    759 	// Throw the data in a variable container
    760 	var_set(obj, data, OBJBLDR);
    761 
    762 	// Declare a name for this object
    763 	proc_decvar(ctx, OBJBLDR, 1, name);
    764 	// Set the object to the name we just declared
    765 	proc_setvar(ctx, 1, name, obj);
    766 
    767 	pc_inc(ctx->pc, 1);
    768 	pc_update(ctx->pc);
    769 }
    770 void _ins_def_DEFUN    (rt_t* ctx, bc_cont* line)
    771 {
    772 	int     name = var_data_get_G_INT(line->varg[0]);
    773 	b_type  type = var_data_get_TYPE(line->varg[1]);
    774 	b_type* args = var_data_get_PLIST(line->varg[2]);
    775 	size_t  alen = line->sarg[2];
    776 
    777 	// Create a new variable for the new function
    778 	var_cont* func = var_new(FUNC);
    779 
    780 	// Allocate the data.
    781 	var_data_func* data = var_data_alloc_FUNC(type);
    782 
    783 	// Set the location of the functions body
    784 	data->loc = line->real_addr + 1;
    785 
    786 	int nsize;
    787 	/* Determine the namespace size by finding variable declarations in the
    788 	   functions body, Along with determining the end of the function.
    789 	 */
    790 	for (nsize = 0; pc_safe(ctx->pc);)
    791 	{
    792 		// Is this the end?
    793 		if (ctx->pc->line->op == 0xF0)
    794 		{
    795 			break;
    796 		} else
    797 		// Are we declaring a variable?
    798 		if (ctx->pc->line->op == 0x20)
    799 		{
    800 			// If so, increment the namespace size.
    801 			nsize++;
    802 		}
    803 
    804 		// Increment the program counter
    805 		pc_inc(ctx->pc, 1);
    806 		pc_update(ctx->pc);
    807 	}
    808 
    809 	pc_update(ctx->pc);
    810 	// Set all the values.
    811 	data->end      = ctx->pc->line->real_addr; // This is the end!
    812 	data->size     = nsize + alen + 1;         // How many names will this
    813 	                                           // function have?
    814 	data->type     = type;                     // Return type
    815 	data->paramlen = alen;                     // Set the arguement length
    816 	data->param    = args;                     // Set the parameter list
    817 
    818 	// Throw the data in a variable container
    819 	var_set(func, data, FUNC);
    820 
    821 	// Declare a name
    822 	proc_decvar(ctx, FUNC, 1, name);
    823 	// Set the name's value to the function we just defined
    824 	proc_setvar(ctx, 1, name, func);
    825 
    826 	pc_inc(ctx->pc, 1);
    827 	pc_update(ctx->pc);
    828 }