arr.count = 0;
}
-ensure_capacity :: proc (arr: ^[..] $T, cap: u32) {
- if arr.capacity >= cap do return;
+ensure_capacity :: proc (arr: ^[..] $T, cap: u32) -> bool {
+ if arr.capacity >= cap do return true;
while cap > arr.capacity do arr.capacity <<= 1;
- arr.data = cresize(arr.data, sizeof T * arr.capacity);
+ new_data := cresize(arr.data, sizeof T * arr.capacity);
+ if new_data == null do return false;
+ arr.data = new_data;
+ return true;
}
-push :: proc (arr: ^[..] $T, x: T) {
- ensure_capacity(arr, arr.count + 1);
+push :: proc (arr: ^[..] $T, x: T) -> bool {
+ if !ensure_capacity(arr, arr.count + 1) do return false;
arr.data[arr.count] = x;
arr.count += 1;
+ return true;
}
-insert :: proc (arr: ^[..] $T, idx: u32, x: T) {
- ensure_capacity(arr, arr.count + 1);
+insert :: proc (arr: ^[..] $T, idx: u32, x: T) -> bool {
+ if !ensure_capacity(arr, arr.count + 1) do return false;
arr.count += 1;
while i := arr.count; i > idx {
}
arr.data[idx] = x;
+ return true;
}
remove :: proc (arr: ^[..] $T, elem: T) {
if data.capacity < len_total do #context_scope {
context.allocator = alloc;
- array.ensure_capacity(^data, len_total);
+ if !array.ensure_capacity(^data, len_total) do return sb;
}
for i: 0 .. s.count do data[data.count + i] = s[i];
if count == 0 do return;
adv := 0;
- while data[adv] != #char "\n" do adv += 1;
+ while data[adv] != #char "\n" && adv <= count - 1 do adv += 1;
data += adv + 1;
count -= adv + 1;
}
}
- print("The program \"");
- print(program);
- print("\" calculates the value ");
- print(accumulator);
- print("\n");
+ printf("The program \"%s\" calculates the value %i\n", program, accumulator);
}
assignment->right = builtin_context_variable;
context_tmp->next = (AstNode *) assignment;
- AstBlock* context_block = parse_block(parser);
- needs_semicolon = 0;
- assignment->next = (AstNode *) context_block;
-
AstBinaryOp* assignment2 = make_node(AstBinaryOp, Ast_Kind_Binary_Op);
assignment2->operation = Binary_Op_Assign;
assignment2->left = builtin_context_variable;
assignment2->right = (AstTyped *) context_tmp;
- context_block->next = (AstNode *) assignment2;
+
+ AstDefer* defer_node = make_node(AstDefer, Ast_Kind_Defer);
+ defer_node->stmt = (AstNode *) assignment2;
+ assignment->next = (AstNode *) defer_node;
+
+ AstBlock* context_block = parse_block(parser);
+ needs_semicolon = 0;
+ defer_node->next = (AstNode *) context_block;
retval = (AstNode *) context_tmp;
break;