package main import "core:mem" main :: proc() { // In each scope, there is an implicit value named context. This // context variable is local to each scope and is implicitly passed // by pointer to any procedure call in that scope (if the procedure // has the Odin calling convention). // The main purpose of the implicit context system is for the ability // to intercept third-party code and libraries and modify their // functionality. One such case is modifying how a library allocates // something or logs something. In C, this was usually achieved with // the library defining macros which could be overridden so that the // user could define what they wanted. However, not many libraries // supported this in many languages by default which meant intercepting // third-party code to see what it does and to change how it does it is // not possible. c := context // copy the current scope's context context.user_index = 456 { context.allocator = my_custom_allocator() context.user_index = 123 what_a_fool_believes() // the `context` for this scope is implicitly passed to `what_a_fool_believes` } // `context` value is local to the scope it is in assert(context.user_index == 456) what_a_fool_believes :: proc() { c := context // this `context` is the same as the parent procedure that it was called from // From this example, context.user_index == 123 // An context.allocator is assigned to the return value of `my_custom_allocator()` assert(context.user_index == 123) // The memory management procedure use the `context.allocator` by // default unless explicitly specified otherwise china_grove := new(int) free(china_grove) _ = c } my_custom_allocator :: mem.nil_allocator _ = c // By default, the context value has default values for its parameters which is // decided in the package runtime. What the defaults are are compiler specific. // To see what the implicit context value contains, please see the following // definition in package runtime. }