Compare commits

..

No commits in common. "b06efe88a289bd008b1ab63fa79163d8a6eefb5b" and "71964e8aead32d9ef98c529a63fe90e5e2d7a5af" have entirely different histories.

2 changed files with 16 additions and 35 deletions

View file

@ -130,23 +130,21 @@ When authoring a new module, use this as a base plate:
} }
Memory Management Bindings
----------------- --------
If a custom type needs memory to function, it should Binding modules should default to static linking and take
always assume the memory it requested came from an arena an optional '#module_parameter' to link dynamically.
allocator. This means it is the responsibility of the Libraries should be pinned to a specific version, and all
arena to free the memory, not the custom data type. binaries (.dll, .dylib, etc.) *must* be checked into
source control. If possible, use the release build of the
library that includes debug information.
In other words: Bindings should stay as close as possible to the original
library. To jai-ify the bindings, create a submodule
called 'wrapper' that import and wraps the api.
Do *not* add procedures that 'free' or 'delete' the memory See: 'thirdparty/raylib' for example bindings.
allocated by the data type.
Instead, add procedures that 'reset' the data type,
allowing the already allocated memory to be reused. For
examples, see the 'reset' procedures in 'jc/kv'
or 'jc/array'.
OS-Specific Code OS-Specific Code
@ -179,19 +177,3 @@ When writing code for a specific architecture, use
the 'jc/arch' module. NEVER create a new file unless the 'jc/arch' module. NEVER create a new file unless
absolutely needed. absolutely needed.
Bindings
--------
Binding modules should default to static linking and take
an optional '#module_parameter' to link dynamically.
Libraries should be pinned to a specific version, and all
binaries (.dll, .dylib, etc.) *must* be checked into
source control. If possible, use the release build of the
library that includes debug information.
Bindings should stay as close as possible to the original
library. To jai-ify the bindings, create a submodule
called 'wrapper' that import and wraps the api.
See: 'thirdparty/raylib' for example bindings.

View file

@ -1,9 +1,5 @@
// @todo(judah): replace array_add // @todo(judah): replace array_add
init :: inline (arr: *[..]$T, allocator: Allocator) {
arr.allocator = allocator;
}
append :: inline (arr: *[..]$T, value: T) -> *T { append :: inline (arr: *[..]$T, value: T) -> *T {
ptr := basic.array_add(arr,, allocator = arr.allocator); ptr := basic.array_add(arr,, allocator = arr.allocator);
ptr.* = value; ptr.* = value;
@ -25,8 +21,11 @@ resize :: inline (arr: *[..]$T, new_size: int) {
basic.array_reserve(arr, new_size,, allocator = arr.allocator); basic.array_reserve(arr, new_size,, allocator = arr.allocator);
} }
reset :: inline (arr: *[..]$T) { reset :: inline (arr: *[..]$T, $keep_memory := true) {
arr.count = 0; arr.count = 0;
#if !keep_memory {
mem.release_memory(arr.data,, allocator = arr.allocator);
}
} }