CC = gcc CFLAGS = -Wall -Wextra -Werror -std=gnu99 -O3 -march=native -I. LDFLAGS = -ldl -lm LEXER_SOURCES = lexer/lexer_tokenizer.c lexer/lexer_keywords.c lexer/lexer_literals.c LEXER_OBJECTS = $(LEXER_SOURCES:.c=.o) PARSER_SOURCES = parser/parser.c parser/parser_expressions.c parser/parser_statements.c parser/parser_declarations.c PARSER_OBJECTS = $(PARSER_SOURCES:.c=.o) TYPES_SOURCES = types/types.c TYPES_OBJECTS = $(TYPES_SOURCES:.c=.o) SEMANTIC_SOURCES = semantic/symbol_table.c semantic/semantic.c SEMANTIC_OBJECTS = $(SEMANTIC_SOURCES:.c=.o) IR_SOURCES = ir/ir.c ir/ir_gen.c IR_OBJECTS = $(IR_SOURCES:.c=.o) GC_SOURCES = runtime/gc/gc.c runtime/gc/gc_heap.c runtime/gc/gc_mark.c runtime/gc/gc_sweep.c runtime/gc/gc_roots.c GC_OBJECTS = $(GC_SOURCES:.c=.o) RUNTIME_CORE_SOURCES = runtime/runtime_value.c runtime/runtime_stack.c runtime/runtime_static.c runtime/runtime_exception.c runtime/runtime_intern.c runtime/runtime_lookup.c RUNTIME_SOURCES = runtime/runtime.c $(RUNTIME_CORE_SOURCES) runtime/runtime_array.c runtime/runtime_object.c runtime/runtime_collections.c runtime/runtime_socket.c runtime/runtime_method_ref.c runtime/labeltable.c runtime/methodcache.c runtime/fastframe.c runtime/superinst.c $(GC_SOURCES) RUNTIME_OBJECTS = $(RUNTIME_SOURCES:.c=.o) LOADER_SOURCES = loader/loader.c LOADER_OBJECTS = $(LOADER_SOURCES:.c=.o) REPL_SOURCES = repl/repl.c repl/repl_session.c repl/repl_input.c repl/repl_executor.c repl/repl_output.c repl/repl_commands.c repl/repl_history.c REPL_OBJECTS = $(REPL_SOURCES:.c=.o) PHASE0_SOURCES = runtime/fastframe.c runtime/labeltable.c runtime/methodcache.c PHASE0_OBJECTS = $(PHASE0_SOURCES:.c=.o) TEST_LEXER_SOURCES = tests/test_lexer.c TEST_LEXER_OBJECTS = $(TEST_LEXER_SOURCES:.c=.o) TEST_PARSER_SOURCES = tests/test_parser.c TEST_PARSER_OBJECTS = $(TEST_PARSER_SOURCES:.c=.o) TEST_SEMANTIC_SOURCES = tests/test_semantic.c TEST_SEMANTIC_OBJECTS = $(TEST_SEMANTIC_SOURCES:.c=.o) TEST_IR_SOURCES = tests/test_ir.c TEST_IR_OBJECTS = $(TEST_IR_SOURCES:.c=.o) TEST_RUNTIME_SOURCES = tests/test_runtime.c TEST_RUNTIME_OBJECTS = $(TEST_RUNTIME_SOURCES:.c=.o) TEST_STRINGS_SOURCES = tests/test_strings.c TEST_STRINGS_OBJECTS = $(TEST_STRINGS_SOURCES:.c=.o) TEST_ARRAYS_SOURCES = tests/test_arrays.c TEST_ARRAYS_OBJECTS = $(TEST_ARRAYS_SOURCES:.c=.o) TEST_OBJECTS_SOURCES = tests/test_objects.c TEST_OBJECTS_OBJECTS = $(TEST_OBJECTS_SOURCES:.c=.o) TEST_OVERLOADING_SOURCES = tests/test_overloading.c TEST_OVERLOADING_OBJECTS = $(TEST_OVERLOADING_SOURCES:.c=.o) TEST_OVERLOADING_RUNTIME_SOURCES = tests/test_overloading_runtime.c TEST_OVERLOADING_RUNTIME_OBJECTS = $(TEST_OVERLOADING_RUNTIME_SOURCES:.c=.o) TEST_INSTANCE_SOURCES = tests/test_instance_methods.c TEST_INSTANCE_OBJECTS = $(TEST_INSTANCE_SOURCES:.c=.o) TEST_FILEIO_SOURCES = tests/test_fileio.c TEST_FILEIO_OBJECTS = $(TEST_FILEIO_SOURCES:.c=.o) TEST_DOWHILE_SOURCES = tests/test_dowhile.c TEST_DOWHILE_OBJECTS = $(TEST_DOWHILE_SOURCES:.c=.o) TEST_SWITCH_SOURCES = tests/test_switch.c TEST_SWITCH_OBJECTS = $(TEST_SWITCH_SOURCES:.c=.o) TEST_MATH_SOURCES = tests/test_math.c TEST_MATH_OBJECTS = $(TEST_MATH_SOURCES:.c=.o) TEST_STRING_METHODS_SOURCES = tests/test_string_methods.c TEST_STRING_METHODS_OBJECTS = $(TEST_STRING_METHODS_SOURCES:.c=.o) TEST_STATIC_SOURCES = tests/test_static.c TEST_STATIC_OBJECTS = $(TEST_STATIC_SOURCES:.c=.o) TEST_INTERFACES_SOURCES = tests/test_interfaces.c TEST_INTERFACES_OBJECTS = $(TEST_INTERFACES_SOURCES:.c=.o) TEST_EXCEPTIONS_SOURCES = tests/test_exceptions.c TEST_EXCEPTIONS_OBJECTS = $(TEST_EXCEPTIONS_SOURCES:.c=.o) TEST_TERNARY_SOURCES = tests/test_ternary.c TEST_TERNARY_OBJECTS = $(TEST_TERNARY_SOURCES:.c=.o) TEST_BITWISE_SOURCES = tests/test_bitwise.c TEST_BITWISE_OBJECTS = $(TEST_BITWISE_SOURCES:.c=.o) TEST_ENHANCED_FOR_SOURCES = tests/test_enhanced_for.c TEST_ENHANCED_FOR_OBJECTS = $(TEST_ENHANCED_FOR_SOURCES:.c=.o) TEST_ARRAY_INIT_SOURCES = tests/test_array_init.c TEST_ARRAY_INIT_OBJECTS = $(TEST_ARRAY_INIT_SOURCES:.c=.o) TEST_INSTANCEOF_SOURCES = tests/test_instanceof.c TEST_INSTANCEOF_OBJECTS = $(TEST_INSTANCEOF_SOURCES:.c=.o) TEST_SHORTCIRCUIT_SOURCES = tests/test_shortcircuit.c TEST_SHORTCIRCUIT_OBJECTS = $(TEST_SHORTCIRCUIT_SOURCES:.c=.o) TEST_MULTIDIM_ARRAYS_SOURCES = tests/test_multidim_arrays.c TEST_MULTIDIM_ARRAYS_OBJECTS = $(TEST_MULTIDIM_ARRAYS_SOURCES:.c=.o) TEST_STATIC_INIT_SOURCES = tests/test_static_init.c TEST_STATIC_INIT_OBJECTS = $(TEST_STATIC_INIT_SOURCES:.c=.o) TEST_NEGATIVE_SOURCES = tests/test_negative.c TEST_NEGATIVE_OBJECTS = $(TEST_NEGATIVE_SOURCES:.c=.o) TEST_ENUMS_SOURCES = tests/test_enums.c TEST_ENUMS_OBJECTS = $(TEST_ENUMS_SOURCES:.c=.o) TEST_COLLECTIONS_SOURCES = tests/test_collections.c TEST_COLLECTIONS_OBJECTS = $(TEST_COLLECTIONS_SOURCES:.c=.o) TEST_SUPER_SOURCES = tests/test_super.c TEST_SUPER_OBJECTS = $(TEST_SUPER_SOURCES:.c=.o) TEST_INHERITANCE_SOURCES = tests/test_inheritance.c TEST_INHERITANCE_OBJECTS = $(TEST_INHERITANCE_SOURCES:.c=.o) TEST_BREAK_SOURCES = tests/test_break.c TEST_BREAK_OBJECTS = $(TEST_BREAK_SOURCES:.c=.o) TEST_ELSEIF_SOURCES = tests/test_elseif.c TEST_ELSEIF_OBJECTS = $(TEST_ELSEIF_SOURCES:.c=.o) TEST_FORLOOP_SOURCES = tests/test_forloop.c TEST_FORLOOP_OBJECTS = $(TEST_FORLOOP_SOURCES:.c=.o) TEST_PRINTLN_SOURCES = tests/test_println.c TEST_PRINTLN_OBJECTS = $(TEST_PRINTLN_SOURCES:.c=.o) TEST_LOADER_SOURCES = tests/test_loader.c TEST_LOADER_OBJECTS = $(TEST_LOADER_SOURCES:.c=.o) TEST_OBJECT_METHODS_SOURCES = tests/test_object_methods.c TEST_OBJECT_METHODS_OBJECTS = $(TEST_OBJECT_METHODS_SOURCES:.c=.o) TEST_AUTOBOX_SOURCES = tests/test_autobox.c TEST_AUTOBOX_OBJECTS = $(TEST_AUTOBOX_SOURCES:.c=.o) TEST_SOCKETS_SOURCES = tests/test_sockets.c TEST_SOCKETS_OBJECTS = $(TEST_SOCKETS_SOURCES:.c=.o) TEST_METHOD_REF_SOURCES = tests/test_method_ref.c TEST_METHOD_REF_OBJECTS = $(TEST_METHOD_REF_SOURCES:.c=.o) TEST_GC_SOURCES = tests/test_gc.c TEST_GC_OBJECTS = $(TEST_GC_SOURCES:.c=.o) UNITTEST_SOURCES = tests/unittest.c UNITTEST_OBJECTS = $(UNITTEST_SOURCES:.c=.o) TEST_UNITTEST_DEMO_SOURCES = tests/test_unittest_demo.c TEST_UNITTEST_DEMO_OBJECTS = $(TEST_UNITTEST_DEMO_SOURCES:.c=.o) all: rava test_lexer test_parser test_semantic test_ir test_runtime test_strings test_arrays test_objects test_instance_methods test_fileio test_dowhile test_switch test_math test_string_methods test_static test_interfaces test_exceptions test_ternary test_bitwise test_enhanced_for test_array_init test_instanceof test_shortcircuit test_multidim_arrays test_static_init test_negative test_enums test_collections test_super test_inheritance test_break test_elseif test_forloop test_println test_loader test_object_methods test_autobox test_sockets test_method_ref test_gc test_lexer: $(LEXER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_LEXER_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_parser: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_PARSER_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_semantic: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_SEMANTIC_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_ir: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) runtime/labeltable.o $(UNITTEST_OBJECTS) $(TEST_IR_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_runtime: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_RUNTIME_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_strings: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_STRINGS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_arrays: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_ARRAYS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_objects: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_OBJECTS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_overloading: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_OVERLOADING_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_overloading_runtime: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_OVERLOADING_RUNTIME_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_instance_methods: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_INSTANCE_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_fileio: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_FILEIO_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_dowhile: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_DOWHILE_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_switch: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_SWITCH_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_math: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_MATH_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_string_methods: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_STRING_METHODS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_static: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_STATIC_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_interfaces: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_INTERFACES_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_exceptions: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_EXCEPTIONS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_ternary: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_TERNARY_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_bitwise: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_BITWISE_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_enhanced_for: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_ENHANCED_FOR_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_array_init: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_ARRAY_INIT_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_instanceof: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_INSTANCEOF_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_shortcircuit: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_SHORTCIRCUIT_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_multidim_arrays: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_MULTIDIM_ARRAYS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_static_init: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_STATIC_INIT_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_negative: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_NEGATIVE_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_enums: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_ENUMS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_collections: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_COLLECTIONS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_super: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_SUPER_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_inheritance: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_INHERITANCE_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_break: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_BREAK_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_elseif: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_ELSEIF_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_forloop: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_FORLOOP_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_println: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_PRINTLN_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_loader: $(LOADER_OBJECTS) $(RUNTIME_OBJECTS) $(IR_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_LOADER_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_object_methods: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_OBJECT_METHODS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_autobox: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_AUTOBOX_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_sockets: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_SOCKETS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_method_ref: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_METHOD_REF_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_gc: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_GC_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_unittest_demo: $(UNITTEST_OBJECTS) $(TEST_UNITTEST_DEMO_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ TEST_BENCHMARK_SOURCES = tests/test_benchmark.c TEST_BENCHMARK_OBJECTS = $(TEST_BENCHMARK_SOURCES:.c=.o) test_benchmark: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(TEST_BENCHMARK_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) benchmark: test_benchmark @echo "" @echo "========================================" @echo " RAVA INTERPRETER" @echo "========================================" @./test_benchmark @echo "" @echo "========================================" @echo " PYTHON 3" @echo "========================================" @python3 examples/benchmark.py @echo "" @if command -v javac >/dev/null 2>&1; then \ echo "========================================"; \ echo " JAVA (OpenJDK)"; \ echo "========================================"; \ javac examples/20_Benchmark.java -d /tmp; \ java -cp /tmp Benchmark; \ rm -f /tmp/Benchmark.class; \ else \ echo "========================================"; \ echo " JAVA (OpenJDK) - SKIPPED"; \ echo "========================================"; \ echo "Java/JDK not installed. Install with: apt install default-jdk"; \ fi @echo "" rava: rava.o $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(REPL_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lreadline examples: rava @echo "=== Running All Examples ===" @for f in examples/*.java; do \ echo "--- $$f ---"; \ ./rava "$$f" || true; \ echo ""; \ done @echo "=== Examples Complete ===" test_nanbox: tests/test_nanbox.c runtime/nanbox.h $(UNITTEST_OBJECTS) $(CC) $(CFLAGS) -o $@ tests/test_nanbox.c $(UNITTEST_OBJECTS) $(LDFLAGS) test_fastframe: tests/test_fastframe.c runtime/fastframe.c runtime/nanbox.h runtime/fastframe.h $(UNITTEST_OBJECTS) $(CC) $(CFLAGS) -o $@ tests/test_fastframe.c runtime/fastframe.c $(UNITTEST_OBJECTS) $(LDFLAGS) test_labeltable: tests/test_labeltable.c runtime/labeltable.c $(IR_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(UNITTEST_OBJECTS) $(CC) $(CFLAGS) -o $@ tests/test_labeltable.c runtime/labeltable.c $(IR_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(UNITTEST_OBJECTS) $(LDFLAGS) test_methodcache: tests/test_methodcache.c runtime/methodcache.c runtime/methodcache.h $(UNITTEST_OBJECTS) $(CC) $(CFLAGS) -o $@ tests/test_methodcache.c runtime/methodcache.c $(UNITTEST_OBJECTS) $(LDFLAGS) test_phase0: test_nanbox test_fastframe test_labeltable test_methodcache @echo "=== Running Phase 0 Tests ===" @./test_nanbox @./test_fastframe @./test_labeltable @./test_methodcache @echo "=== All Phase 0 Tests Passed ===" ALL_SOURCES = $(LEXER_SOURCES) $(PARSER_SOURCES) $(TYPES_SOURCES) $(SEMANTIC_SOURCES) $(IR_SOURCES) $(RUNTIME_SOURCES) $(TEST_BENCHMARK_SOURCES) test_benchmark_pgo_gen: rm -f *.gcda */*.gcda $(CC) -Wall -Wextra -std=gnu99 -O3 -march=native -I. -fprofile-generate -o test_benchmark_pgo $(ALL_SOURCES) $(LDFLAGS) pgo_run: test_benchmark_pgo_gen ./test_benchmark_pgo ./test_benchmark_pgo ./test_benchmark_pgo test_benchmark_pgo: pgo_run $(CC) -Wall -Wextra -std=gnu99 -O3 -march=native -I. -fprofile-use -fprofile-correction -o test_benchmark_pgo $(ALL_SOURCES) $(LDFLAGS) pgo: test_benchmark_pgo @echo "=== PGO Benchmark ===" ./test_benchmark_pgo clean: rm -f $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(LOADER_OBJECTS) $(REPL_OBJECTS) \ $(PHASE0_OBJECTS) $(UNITTEST_OBJECTS) $(TEST_UNITTEST_DEMO_OBJECTS) \ $(TEST_LEXER_OBJECTS) $(TEST_PARSER_OBJECTS) $(TEST_SEMANTIC_OBJECTS) $(TEST_IR_OBJECTS) $(TEST_RUNTIME_OBJECTS) \ $(TEST_STRINGS_OBJECTS) $(TEST_ARRAYS_OBJECTS) $(TEST_OBJECTS_OBJECTS) $(TEST_INSTANCE_OBJECTS) $(TEST_FILEIO_OBJECTS) \ $(TEST_DOWHILE_OBJECTS) $(TEST_SWITCH_OBJECTS) $(TEST_MATH_OBJECTS) $(TEST_STRING_METHODS_OBJECTS) $(TEST_STATIC_OBJECTS) $(TEST_INTERFACES_OBJECTS) $(TEST_EXCEPTIONS_OBJECTS) $(TEST_TERNARY_OBJECTS) $(TEST_BITWISE_OBJECTS) $(TEST_ENHANCED_FOR_OBJECTS) $(TEST_ARRAY_INIT_OBJECTS) $(TEST_INSTANCEOF_OBJECTS) $(TEST_SHORTCIRCUIT_OBJECTS) $(TEST_MULTIDIM_ARRAYS_OBJECTS) $(TEST_STATIC_INIT_OBJECTS) $(TEST_NEGATIVE_OBJECTS) $(TEST_ENUMS_OBJECTS) $(TEST_COLLECTIONS_OBJECTS) $(TEST_SUPER_OBJECTS) $(TEST_INHERITANCE_OBJECTS) $(TEST_BREAK_OBJECTS) $(TEST_ELSEIF_OBJECTS) $(TEST_FORLOOP_OBJECTS) $(TEST_PRINTLN_OBJECTS) $(TEST_LOADER_OBJECTS) $(TEST_OBJECT_METHODS_OBJECTS) $(TEST_AUTOBOX_OBJECTS) $(TEST_SOCKETS_OBJECTS) $(TEST_METHOD_REF_OBJECTS) $(TEST_GC_OBJECTS) $(TEST_BENCHMARK_OBJECTS) \ test_lexer test_parser test_semantic test_ir test_runtime test_strings test_arrays test_objects test_instance_methods test_fileio test_dowhile test_switch test_math test_string_methods test_static test_interfaces test_exceptions test_ternary test_bitwise test_enhanced_for test_array_init test_instanceof test_shortcircuit test_multidim_arrays test_static_init test_negative test_enums test_collections test_super test_inheritance test_break test_elseif test_forloop test_println test_loader test_object_methods test_autobox test_sockets test_method_ref test_gc test_benchmark \ test_nanbox test_fastframe test_labeltable test_methodcache test_benchmark_pgo test_unittest_demo rava rava.o *.gcda */*.gcda .PHONY: all clean benchmark test_phase0 pgo test_benchmark_pgo_gen pgo_run test_benchmark_pgo test test_repl examples coverage coverage-clean coverage-report COVERAGE_CFLAGS = -Wall -Wextra -Werror -std=gnu99 -O0 -g --coverage -I. COVERAGE_LDFLAGS = -ldl -lm --coverage coverage-clean: rm -f *.gcda *.gcno *.gcov rm -f */*.gcda */*.gcno */*.gcov rm -f */*/*.gcda */*/*.gcno */*/*.gcov rm -rf coverage_report coverage: coverage-clean @echo "=== Building with coverage instrumentation ===" $(MAKE) clean $(MAKE) CC="$(CC)" CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all $(MAKE) CC="$(CC)" CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" test_overloading test_overloading_runtime @echo "" @echo "=== Running ALL tests to collect coverage data ===" -./test_lexer -./test_parser -./test_semantic -./test_ir -./test_runtime -./test_strings -./test_arrays -./test_objects -./test_instance_methods -./test_fileio -./test_dowhile -./test_switch -./test_math -./test_string_methods -./test_static -./test_static_init -./test_interfaces -./test_exceptions -./test_ternary -./test_bitwise -./test_enhanced_for -./test_array_init -./test_instanceof -./test_shortcircuit -./test_multidim_arrays -./test_negative -./test_enums -./test_collections -./test_super -./test_inheritance -./test_break -./test_elseif -./test_forloop -./test_println -./test_loader -./test_object_methods -./test_autobox -./test_sockets -./test_method_ref -./test_gc -./test_nanbox -./test_fastframe -./test_labeltable -./test_methodcache -./test_benchmark -./test_overloading -./test_overloading_runtime @echo "" @echo "=== Running ALL example programs ===" -./rava examples/01_Fibonacci.java Fibonacci main -./rava examples/02_PrimeNumbers.java PrimeNumbers main -./rava examples/03_FactorialVariations.java FactorialVariations main -./rava examples/04_GCD_LCM.java GCD_LCM main -./rava examples/05_PowerFunction.java PowerFunction main -./rava examples/06_ArrayOperations.java ArrayOperations main -./rava examples/06_BubbleSort.java BubbleSort main -./rava examples/07_CollatzConjecture.java CollatzConjecture main -./rava examples/08_PascalTriangle.java PascalTriangle main -./rava examples/09_TowerOfHanoi.java TowerOfHanoi main -./rava examples/10_AckermannFunction.java AckermannFunction main -./rava examples/11_ArrayOperations.java ArrayOperations main -./rava examples/11_SimpleArray.java SimpleArray main -./rava examples/11_TowerOfHanoiStatic.java TowerOfHanoiStatic main -./rava examples/12_StringBasics.java StringBasics main -./rava examples/13_SimpleObject.java SimpleObject main -./rava examples/14_InstanceMethods.java InstanceMethods main -./rava examples/15_FileIO.java FileIO main -./rava examples/16_ForLoop.java ForLoop main -./rava examples/17_Inheritance.java Inheritance main -./rava examples/18_ElseIf.java ElseIf main -./rava examples/19_BreakContinue.java BreakContinue main -./rava examples/20_Benchmark.java Benchmark main -./rava examples/21_DoWhile.java DoWhile main -./rava examples/HelloWorld.java HelloWorld main @echo "" @echo "=== Generating coverage report ===" $(MAKE) coverage-report coverage-report: @echo "=== Coverage Summary ===" @echo "" @for dir in lexer parser types semantic ir runtime loader; do \ echo "--- $$dir/ ---"; \ for f in $$dir/*.c; do \ gcov -n "$$f" 2>/dev/null | grep -A1 "^File" | grep -v "^--$$" || true; \ done; \ echo ""; \ done @echo "=== Detailed .gcov files generated in source directories ===" @echo "Run 'gcov ' for detailed line-by-line coverage" @echo "Run 'make coverage-html' for HTML report (requires lcov)" coverage-html: @echo "=== Generating HTML coverage report ===" @which lcov > /dev/null || (echo "ERROR: lcov not installed. Run: sudo apt-get install lcov" && exit 1) lcov --capture --directory . --output-file coverage.info --ignore-errors inconsistent,unused lcov --remove coverage.info '/usr/*' '*/tests/*' --output-file coverage.info --ignore-errors inconsistent,unused genhtml coverage.info --output-directory coverage_report --ignore-errors inconsistent,unused @echo "" @echo "=== HTML report generated in coverage_report/ ===" @xdg-open coverage_report/index.html 2>/dev/null || open coverage_report/index.html 2>/dev/null || echo "Open coverage_report/index.html in a browser" test: all @echo "=== Running All Tests ===" @./test_lexer && ./test_parser && ./test_semantic && ./test_ir && ./test_runtime && \ ./test_strings && ./test_arrays && ./test_objects && ./test_instance_methods && \ ./test_fileio && ./test_dowhile && ./test_switch && ./test_math && ./test_string_methods && \ ./test_static && ./test_interfaces && ./test_exceptions && ./test_ternary && \ ./test_bitwise && ./test_enhanced_for && ./test_array_init && ./test_instanceof && \ ./test_shortcircuit && ./test_multidim_arrays && ./test_static_init && ./test_negative && \ ./test_enums && ./test_collections && ./test_super && ./test_inheritance && ./test_break && \ ./test_elseif && ./test_forloop && ./test_println && ./test_loader && ./test_object_methods && \ ./test_autobox && ./test_sockets && ./test_method_ref && ./test_gc && \ ./repl/run_tests.sh && \ echo "" && echo "=== All Tests Passed ===" test_repl: rava @echo "=== Running REPL Tests ===" @./repl/run_tests.sh