From 629b248f538b964c0480d40a1e5e7ad913ff6ea0 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Sun, 30 Jul 2017 19:01:02 +0100 Subject: Parallelization of the Parser ~66% reduction (unoptimized build) ~30% reduction (optimized build) --- src/main.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 13 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index abee3e4b0..0dcf16fc2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -172,6 +172,7 @@ enum BuildFlagKind { BuildFlag_OptimizationLevel, BuildFlag_ShowTimings, + BuildFlag_ThreadCount, BuildFlag_COUNT, }; @@ -202,9 +203,9 @@ void add_flag(Array *build_flags, BuildFlagKind kind, String name, Bu bool parse_build_flags(Array args) { Array build_flags = {}; array_init(&build_flags, heap_allocator(), BuildFlag_COUNT); - add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer); - add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None); - + add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer); + add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None); + add_flag(&build_flags, BuildFlag_ThreadCount, str_lit("thread-count"), BuildFlagParam_Integer); Array flag_args = args; @@ -291,27 +292,64 @@ bool parse_build_flags(Array args) { } } if (ok) { - switch (bf.kind) { - case BuildFlag_OptimizationLevel: - if (value.kind == ExactValue_Integer) { - build_context.optimization_level = cast(i32)i128_to_i64(value.value_integer); - } else { + switch (bf.param_kind) { + case BuildFlagParam_None: + if (value.kind != ExactValue_Invalid) { + gb_printf_err("%.*s expected no value, got %.*s", LIT(name), LIT(param)); + bad_flags = true; + ok = false; + } + break; + case BuildFlagParam_Boolean: + if (value.kind != ExactValue_Bool) { + gb_printf_err("%.*s expected a boolean, got %.*s", LIT(name), LIT(param)); + bad_flags = true; + ok = false; + } + break; + case BuildFlagParam_Integer: + if (value.kind != ExactValue_Integer) { gb_printf_err("%.*s expected an integer, got %.*s", LIT(name), LIT(param)); bad_flags = true; ok = false; } break; - case BuildFlag_ShowTimings: - if (value.kind == ExactValue_Invalid) { - build_context.show_timings = true; - } else { - gb_printf_err("%.*s expected no value, got %.*s", LIT(name), LIT(param)); + case BuildFlagParam_Float: + if (value.kind != ExactValue_Float) { + gb_printf_err("%.*s expected a floating pointer number, got %.*s", LIT(name), LIT(param)); + bad_flags = true; + ok = false; + } + break; + case BuildFlagParam_String: + if (value.kind != ExactValue_String) { + gb_printf_err("%.*s expected a string, got %.*s", LIT(name), LIT(param)); bad_flags = true; ok = false; } break; } + if (ok) switch (bf.kind) { + case BuildFlag_OptimizationLevel: + GB_ASSERT(value.kind == ExactValue_Integer); + build_context.optimization_level = cast(i32)i128_to_i64(value.value_integer); + break; + case BuildFlag_ShowTimings: + GB_ASSERT(value.kind == ExactValue_Invalid); + build_context.show_timings = true; + break; + case BuildFlag_ThreadCount: { + GB_ASSERT(value.kind == ExactValue_Integer); + isize count = cast(isize)i128_to_i64(value.value_integer); + if (count <= 0) { + gb_printf_err("%.*s expected a positive non-zero number, got %.*s", LIT(name), LIT(param)); + build_context.thread_count = 0; + } else { + build_context.thread_count = count; + } + } break; + } } -- cgit v1.2.3