Exemplo n.º 1
0
void test_two_level_stack(void)
{
	names_stack *stack;
	unsigned int check_num;

	check_num = 0;
	stack = stack_new();

	stack_enter(stack);

	check_depth(check_num++, stack, "foo", 0);
	check_depth(check_num++, stack, "bar", 0);
	check_depth(check_num++, stack, "baz", 0);
	check_unsigned_int(stack_frame_size(stack), 0);

	stack_name_add(stack, "foo");
	stack_name_add(stack, "bar");

	check_depth(check_num++, stack, "foo", 1);
	check_depth(check_num++, stack, "bar", 2);
	check_depth(check_num++, stack, "baz", 0);
	check_unsigned_ints(stack_frame_size(stack), 2, "1");

	stack_enter(stack);
	check_unsigned_ints(stack_frame_size(stack), 0, "2");
	stack_name_add(stack, "baz");
	check_unsigned_ints(stack_frame_size(stack), 1, "3");
	stack_name_add(stack, "foo");
	check_unsigned_ints(stack_frame_size(stack), 2, "4");

	check_depth(check_num++, stack, "foo", 2);
	check_depth(check_num++, stack, "bar", 0);
	check_depth(check_num++, stack, "baz", 1);

	stack_leave(stack);
	check_unsigned_ints(stack_frame_size(stack), 2, "5");

	check_depth(check_num++, stack, "foo", 1);
	check_depth(check_num++, stack, "bar", 2);
	check_depth(check_num++, stack, "baz", 0);

	stack_leave(stack);
	check_unsigned_ints(stack_frame_size(stack), 0, "6");

	check_depth(check_num++, stack, "foo", 0);
	check_depth(check_num++, stack, "bar", 0);
	check_depth(check_num++, stack, "baz", 0);

	stack_destroy(stack);
}
Exemplo n.º 2
0
void test_create_destroy_works(void)
{
	names_stack *stack;

	stack = stack_new();
	stack_destroy(stack);

	stack = stack_new();
	stack_enter(stack);
	stack_name_add(stack, "baz");
	stack_name_add(stack, "foo");
	stack_destroy(stack);

	stack = stack_new();
	stack_enter(stack);
	stack_enter(stack);
	stack_enter(stack);
	stack_name_add(stack, "baz");
	stack_name_add(stack, "foo");
	stack_enter(stack);
	stack_name_add(stack, "foo");
	stack_name_add(stack, "baz");
	stack_enter(stack);
	stack_destroy(stack);
}
Exemplo n.º 3
0
int main(int argc, char *argv[])
{
	int result = 0;
	ref_t val, answer, assoc, name;
	FILE *input_fl = stdin, *output_fl = stdout;
	clock_t start_time, end_time;
	
#define FREE_AND_RETURN(x) {result = x; goto free_and_return;}

	if (parse_command_line(argc, argv, cmd_opt_decls) == -1)
	{
		printf("%s\n\n", get_error());
		print_usage();
		FREE_AND_RETURN(1);
	}

	if (help_flag)
	{
		print_usage();
		FREE_AND_RETURN(0);
	}

	if (input_fname)
	{
		input_fl = fopen(input_fname, "r");
		if (input_fl == 0)
		{
			printf("Could not open input file %s\n", input_fname);
			FREE_AND_RETURN(1);
		}
	}

	if (output_fname)
	{
		output_fl = fopen(output_fname, "w");
		if (output_fl == 0)
		{
			printf("Could not open output file %s\n", output_fname);
			FREE_AND_RETURN(1);
		}
	}

	if (trace_file_fname)
	{
		trace_fl = fopen(trace_file_fname, "w");
		if (trace_fl == 0)
		{
			printf("Could not open trace file %s\n", trace_file_fname);
			FREE_AND_RETURN(1);
		}
	}

	assoc = make_stack(nil());
	register_gc_root(assoc);
	stack_enter(assoc);

	name = make_symbol("t", 0);
	stack_let(assoc, name, name);
	release_ref(&name);
	
	register_core_lib(assoc);

	REG_FN(exit, assoc);
	REG_FN(trace, assoc);
	REG_FN(profile, assoc);
	REG_NAMED_FN("no-trace", slfe_no_trace, assoc);
	REG_NAMED_FN("dump-stack", slfe_dump_stack, assoc);

	if (trace_fl)
		set_trace_file(trace_fl);

	start_time = clock();

	finished = 0;
	while (! finished)
	{
		if (input_fl == stdin)
			printf("> ");

		val = read(input_fl);
		answer = eval(val, assoc);
		release_ref(&val);
		if (!quiet_flag)
		{
			println(answer, output_fl);
			fflush(output_fl);
		}
		release_ref(&answer);
		collect_garbage();
	}

	stack_enter(nil());
	unregister_gc_root(assoc);
	release_ref(&assoc);

	collect_garbage();

	end_time = clock();

	if (trace_fl)
		fprintf(trace_fl, "Total time taken: %f seconds\n", (float)(end_time - start_time) / (float)CLOCKS_PER_SEC);

#undef FREE_AND_RETURN

free_and_return:
	if (trace_fl && stats_flag)
		fprintf(trace_fl, "Total symbol evals: %d; total stack switches: %d\n", symbol_eval_count, stack_switch_count);

	if (input_fl != stdin) fclose(input_fl);
	if (output_fl != stdout) fclose(output_fl);
	if (trace_fl) fclose(trace_fl);

	if (input_fname) X_FREE(input_fname);
	if (output_fname) X_FREE(output_fname);
	if (trace_file_fname) X_FREE(trace_file_fname);

	return result;
}