From 099995e7dd5f420f96f8c8be19013d36e54b13d2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 20 Oct 2018 13:02:30 +0100 Subject: [PATCH] Add basics for context-based Logger --- core/log/log.odin | 34 ++++++++++++++++++++++++++++++++++ core/runtime/core.odin | 4 ++++ src/ir.cpp | 1 + 3 files changed, 39 insertions(+) create mode 100644 core/log/log.odin diff --git a/core/log/log.odin b/core/log/log.odin new file mode 100644 index 000000000..fac2fbe5b --- /dev/null +++ b/core/log/log.odin @@ -0,0 +1,34 @@ +package log + +Level :: enum { + Debug, + Info, + Warning, + Error, + Fatal, +} + +Option :: enum { + Level, + Time, + File, + Line, + Procedure, +} +Options :: bit_set[Option]; + +Logger_Proc :: #type proc(data: rawptr, level: Level, ident, text: string, options: Options, location := #caller_location); + +Logger :: struct { + procedure: Logger_Proc, + data: rawptr, +} + + +nil_logger_proc :: proc(data: rawptr, level: Level, ident, text: string, options: Options, location := #caller_location) { + // Do nothing +} + +nil_logger :: proc() -> Logger { + return Logger{nil_logger_proc, nil}; +} diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 3b88a0412..3fe66c4a5 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -5,6 +5,7 @@ package runtime import "core:os" import "core:mem" +import "core:log" // Naming Conventions: // In general, Ada_Case for types and snake_case for values @@ -193,6 +194,8 @@ Context :: struct { assertion_failure_proc: Assertion_Failure_Proc, + logger: log.Logger, + user_data: any, user_index: int, @@ -321,6 +324,7 @@ __init_context :: proc "contextless" (c: ^Context) { c.temp_allocator = mem.scratch_allocator(&global_scratch_allocator_data); c.thread_id = os.current_thread_id(); c.assertion_failure_proc = default_assertion_failure_proc; + c.logger = log.nil_logger(); } @(builtin) diff --git a/src/ir.cpp b/src/ir.cpp index e2dabcbe9..5884b2d30 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -1767,6 +1767,7 @@ irValue *ir_find_or_generate_context_ptr(irProcedure *proc) { // 1 will be handled later ir_emit_store(proc, ir_emit_struct_ep(proc, c, 2), ir_emit_package_call(proc, "os", "current_thread_id", args)); ir_emit_store(proc, ir_emit_struct_ep(proc, c, 3), ir_get_package_value(proc->module, str_lit("runtime"), str_lit("default_assertion_failure_proc"))); + ir_emit_store(proc, ir_emit_struct_ep(proc, c, 4), ir_emit_package_call(proc, "log", "nil_logger", args)); array_init(&args, heap_allocator(), 1); args[0] = ir_get_package_value(proc->module, str_lit("runtime"), str_lit("global_scratch_allocator_data"));