Esempio n. 1
0
/**
 * CTRWalkerRunBlock
 *
 * Processes the execution of a block of code.
 */
ctr_object* ctr_cwlk_run(ctr_tnode* program) {
	ctr_object* result = NULL;
	char wasReturn = 0;
	ctr_tlistitem* li;
	li = program->nodes;
	while(li) {
		ctr_tnode* node = li->node;
		if (!li->node) {
			fprintf(stderr, CTR_ERR_MISSING );
			exit(1);
		}
		wasReturn = 0;
		result = ctr_cwlk_expr(node, &wasReturn);
		if ( wasReturn ) {
			break;
		}
		/* Perform garbage collection cycle */
		if ( ( ( ctr_gc_mode & 1 ) && ctr_gc_alloc > ( ctr_gc_memlimit * 0.8 ) ) || ctr_gc_mode & 4 ) {
			ctr_gc_internal_collect();
		}
		if (!li->next) break;
		li = li->next;
	}
	if (wasReturn == 0) result = NULL;
	return result;
}
Esempio n. 2
0
ctr_object *
ctr_cwlk_run (ctr_tnode * program)
{
  ctr_cwlk_msg_level++;
  ctr_object *result = NULL;
  char wasReturn = 0;
  ctr_tlistitem *li;
  li = program->nodes;
  while (li)
    {
      ctr_tnode *node = li->node;
      if (!li->node)
	{
	  // printf("Missing parse node\n");
	  // exit(1);
	  CtrStdFlow = ctr_build_string_from_cstring ("Missing Parse Node");
	  return NULL;
	}
      wasReturn = 0;
      result = ctr_cwlk_expr (node, &wasReturn);
      if (ctr_internal_next_return)
	{
	  wasReturn = 1;
	  ctr_internal_next_return = 0;
	  break;
	}
      if (wasReturn)
	{
	  break;
	}
      /* Perform garbage collection cycle */
      if (((ctr_gc_mode & 1) && ctr_gc_alloc > (ctr_gc_memlimit * 0.8)) || ctr_gc_mode & 4)
	{
	  ctr_gc_internal_collect ();	//collect on limit mode
	}
      if (!li->next)
	break;
      li = li->next;
    }
  if (wasReturn == 0 && !program->lexical)	//let the last value be returned on BLOCKMAP
    result = NULL;
  ctr_cwlk_msg_level--;
  return result;
}