default_allocators_nil.odin 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package runtime
  2. nil_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode,
  3. size, alignment: int,
  4. old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) {
  5. switch mode {
  6. case .Alloc, .Alloc_Non_Zeroed:
  7. return nil, .Out_Of_Memory
  8. case .Free:
  9. return nil, .None
  10. case .Free_All:
  11. return nil, .Mode_Not_Implemented
  12. case .Resize, .Resize_Non_Zeroed:
  13. if size == 0 {
  14. return nil, .None
  15. }
  16. return nil, .Out_Of_Memory
  17. case .Query_Features:
  18. return nil, .Mode_Not_Implemented
  19. case .Query_Info:
  20. return nil, .Mode_Not_Implemented
  21. }
  22. return nil, .None
  23. }
  24. @(require_results)
  25. nil_allocator :: proc "contextless" () -> Allocator {
  26. return Allocator{
  27. procedure = nil_allocator_proc,
  28. data = nil,
  29. }
  30. }
  31. panic_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode,
  32. size, alignment: int,
  33. old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) {
  34. switch mode {
  35. case .Alloc:
  36. if size > 0 {
  37. panic("panic allocator, .Alloc called", loc=loc)
  38. }
  39. case .Alloc_Non_Zeroed:
  40. if size > 0 {
  41. panic("panic allocator, .Alloc_Non_Zeroed called", loc=loc)
  42. }
  43. case .Resize:
  44. if size > 0 {
  45. panic("panic allocator, .Resize called", loc=loc)
  46. }
  47. case .Resize_Non_Zeroed:
  48. if size > 0 {
  49. panic("panic allocator, .Alloc_Non_Zeroed called", loc=loc)
  50. }
  51. case .Free:
  52. if old_memory != nil {
  53. panic("panic allocator, .Free called", loc=loc)
  54. }
  55. case .Free_All:
  56. panic("panic allocator, .Free_All called", loc=loc)
  57. case .Query_Features:
  58. set := (^Allocator_Mode_Set)(old_memory)
  59. if set != nil {
  60. set^ = {.Query_Features}
  61. }
  62. return nil, nil
  63. case .Query_Info:
  64. panic("panic allocator, .Query_Info called", loc=loc)
  65. }
  66. return nil, nil
  67. }
  68. @(require_results)
  69. panic_allocator :: proc() -> Allocator {
  70. return Allocator{
  71. procedure = panic_allocator_proc,
  72. data = nil,
  73. }
  74. }