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); }
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); }
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; }