return null;
}
-malloc :: proc (size: u32) -> rawptr do return alloc(heap_allocator, size);
-mfree :: proc (ptr: rawptr) do free(heap_allocator, ptr);
-mresize :: proc (ptr: rawptr, size: u32) -> rawptr do return resize(heap_allocator, ptr, size);
-
-
#private
ScratchState :: struct {
null :: cast(rawptr) 0;
+DEFAULT_ALLOCATION_ALIGNMENT :: 16
+
AllocAction :: enum {
Alloc;
Free;
}
alloc :: proc (use a: Allocator, size: u32) -> rawptr {
- return func(data, AllocAction.Alloc, size, 16, null);
+ return func(data, AllocAction.Alloc, size, DEFAULT_ALLOCATION_ALIGNMENT, null);
}
resize :: proc (use a: Allocator, ptr: rawptr, size: u32) -> rawptr {
- return func(data, AllocAction.Resize, size, 16, ptr);
+ return func(data, AllocAction.Resize, size, DEFAULT_ALLOCATION_ALIGNMENT, ptr);
}
free :: proc (use a: Allocator, ptr: rawptr) {
len2 :: string_length(s2);
data := cast(^u8) calloc(len1 + len2);
- for i: 0, len1 do data[i] = s1.data[i];
- for i: 0, len2 do data[i + len1] = s2.data[i];
+ for i: 0, len1 do data[i] = s1[i];
+ for i: 0, len2 do data[i + len1] = s2[i];
return string.{ data, len1 + len2 };
}
// It documents the string_split function
string_split :: proc (str: string, delim: u8) -> []string {
delim_count := 0;
- for i: 0, str.count do if str.data[i] == delim do delim_count += 1;
+ for i: 0, str.count do if str[i] == delim do delim_count += 1;
strarr := cast(^string) calloc(sizeof string * (delim_count + 1));
begin := 0;
for i: 0, str.count {
- if str.data[i] == delim {
+ if str[i] == delim {
strarr[curr_str] = str.data[begin : i];
begin = i + 1;
curr_str += 1;
string_substr :: proc (str: string, sub: string) -> string {
for i: 0, str.count {
- while j := 0; j < sub.count && str.data[i + j] == sub.data[j] {
+ while j := 0; j < sub.count && str[i + j] == sub[j] {
j += 1;
if j == sub.count do return str.data[i : i + j];
}
string_contains :: proc (str: string, c: u8) -> bool {
- for i: 0, str.count do if str.data[i] == c do return true;
+ for i: 0, str.count do if str[i] == c do return true;
return false;
}
len_total :: len + str.count;
if cap >= len_total {
- for i: 0, str.count do data[len + i] = str.data[i];
+ for i: 0, str.count do data[len + i] = str[i];
len += str.count;
return sb;
}
data = new_data;
cap = new_cap;
- for i: 0, str.count do data[len + i] = str.data[i];
+ for i: 0, str.count do data[len + i] = str[i];
len += str.count;
return sb;
}
while n > 0l {
m :: n % base;
- *c = s.data[cast(u32) m];
+ *c = s[cast(u32) m];
len += 1;
c -= 1;
args_sizes_get(^argc, ^argv_buf_size);
- argv := cast(^^u8) malloc(sizeof ^u8 * argc);
- argv_buf := cast(^u8) malloc(argv_buf_size);
+ argv := cast(^^u8) calloc(sizeof ^u8 * argc);
+ argv_buf := cast(^u8) calloc(argv_buf_size);
args_get(argv, argv_buf);
struct AstDereference { AstTyped_base; AstTyped *expr; };
struct AstArrayAccess { AstTyped_base; AstTyped *addr; AstTyped *expr; u64 elem_size; };
struct AstSlice { AstTyped_base; AstTyped *addr; AstTyped *lo, *hi; u64 elem_size; };
-struct AstFieldAccess { AstTyped_base; AstTyped *expr; u64 offset; };
+struct AstFieldAccess { AstTyped_base; AstTyped *expr; u32 offset; u32 idx; };
struct AstSizeOf { AstTyped_base; AstType *so_type; u64 size; };
struct AstAlignOf { AstTyped_base; AstType *ao_type; u64 alignment; };
struct AstFileContents { AstTyped_base; OnyxToken *filename; };
};
};
};
+struct AstPolyProc {
+ AstNode_base;
+
+ Scope *poly_scope;
+
+ AstFunction* func;
+};
struct AstOverloadedFunction {
AstTyped_base;
b32 type_is_numeric(Type* type);
b32 type_is_compound(Type* type);
b32 type_results_in_void(Type* type);
+b32 type_is_array_accessible(Type* type);
b32 type_is_structlike(Type* type);
b32 type_is_structlike_strict(Type* type);
u32 type_structlike_mem_count(Type* type);
print_arr :: proc (sb: ^StringBuilder, arr: []i32) {
sb |> string_builder_clear();
- a := arr.data;
-
for i: 0, arr.count {
- sb |> sba(cast(u64) a[i]) |> sba(" ");
+ sb |> sba(cast(u64) arr[i]) |> sba(" ");
}
sb |> sba("\n") |> string_builder_to_string() |> print();
}
-make_i32_arr :: proc (a := heap_allocator, len := 10) -> [] i32 {
+make_i32_arr :: proc (a := context.allocator, len := 10) -> [] i32 {
arr := cast(^i32) alloc(a, sizeof i32 * len);
return arr[0 : len];
}
|> sba(cast(u64) args.count)
|> sba(" arguments.\n");
- for i: 0, args.count do ^sb |> sba(args.data[i]) |> sba(" ");
+ for i: 0, args.count do ^sb |> sba(args[i]) |> sba(" ");
^sb |> sba("\n")
|> string_builder_to_string()
|> print();
- cont := file_get_contents(string_make(args.data[1]));
+ cont := file_get_contents(string_make(args[1]));
defer cfree(cont.data);
print(cont);
string_builder_clear(^sb);
for i: 0, matches.count {
- ^sb |> sba(matches.data[i])
+ ^sb |> sba(matches[i])
|> sba("\n");
}
acc := 0;
for i: 0, tokens.count {
- switch tokens.data[i].data[0] {
+ switch tokens[i][0] {
case #char "+" do acc += 1;
case #char "-" do acc -= 1;
case #char "*" do acc *= 2;
case #default {
print("Unexpected token: ");
- print_u64(cast(u64) tokens.data[i].data[0], 16l);
+ print_u64(cast(u64) tokens[i][0], 16l);
print("\n");
// This breaks out of the for loop
return 0;
}
-//make_slice :: proc (ptr: ^$T, count: u32) -> [] T {
-// return ptr[0 : count];
-//}
\ No newline at end of file
+// make_slice :: proc (ptr: ^$T, count: u32) -> [] T {
+// return ptr[0 : count];
+// }
\ No newline at end of file
if (check_expression(&aa->addr)) return 1;
if (check_expression(&aa->expr)) return 1;
- if (!type_is_pointer(aa->addr->type)) {
+ if (!type_is_array_accessible(aa->addr->type)) {
onyx_message_add(Msg_Type_Literal,
aa->token->pos,
"expected pointer or array type for left of array access");
aa->type = aa->addr->type->Pointer.elem;
else if (aa->addr->type->kind == Type_Kind_Array)
aa->type = aa->addr->type->Array.elem;
+ else if (aa->addr->type->kind == Type_Kind_Slice) {
+ // If we are accessing on a slice, implicitly add a field access for the data member
+
+ StructMember smem;
+ type_lookup_member(aa->addr->type, "data", &smem);
+
+ AstFieldAccess* fa = onyx_ast_node_new(semstate.node_allocator, sizeof(AstFieldAccess), Ast_Kind_Field_Access);
+ fa->token = aa->addr->token;
+ fa->type = smem.type;
+ fa->offset = smem.offset;
+ fa->idx = smem.idx;
+ fa->expr = aa->addr;
+
+ aa->addr = (AstTyped *) fa;
+ aa->type = aa->addr->type->Pointer.elem;
+ }
else {
onyx_message_add(Msg_Type_Literal,
aa->token->pos,
}
field->offset = smem.offset;
+ field->idx = smem.idx;
field->type = smem.type;
token_toggle_end(field->token);
return "<anonymous enum>";
case Type_Kind_Function: return bh_aprintf(global_scratch_allocator, "proc (...) -> %s", type_get_name(type->Function.return_type));
+ case Type_Kind_Slice: return bh_aprintf(global_scratch_allocator, "[] %s", type_get_name(type->Slice.ptr_to_data->Pointer.elem));
default: return "unknown";
}
&& (type->Function.return_type->Basic.kind == Basic_Kind_Void));
}
+b32 type_is_array_accessible(Type* type) {
+ if (type_is_pointer(type)) return 1;
+ if (type->kind == Type_Kind_Slice) return 1;
+ return 0;
+}
+
b32 type_is_structlike(Type* type) {
if (type->kind == Type_Kind_Struct) return 1;
if (type->kind == Type_Kind_Slice) return 1;
AstFieldAccess* field = (AstFieldAccess *) expr;
if (field->expr->kind == Ast_Kind_Param && type_is_structlike_strict(field->expr->type)) {
- StructMember smem;
-
- token_toggle_end(field->token);
- type_lookup_member(field->expr->type, field->token->text, &smem);
- token_toggle_end(field->token);
-
- u64 localidx = bh_imap_get(&mod->local_map, (u64) field->expr) + smem.idx;
+ u64 localidx = bh_imap_get(&mod->local_map, (u64) field->expr) + field->idx;
WIL(WI_LOCAL_GET, localidx);
break;
AstFieldAccess* field = (AstFieldAccess* ) expr;
if (field->expr->kind == Ast_Kind_Param && type_is_structlike_strict(field->expr->type)) {
- StructMember smem;
-
- token_toggle_end(field->token);
- type_lookup_member(field->expr->type, field->token->text, &smem);
- token_toggle_end(field->token);
-
- u64 localidx = bh_imap_get(&mod->local_map, (u64) field->expr) + smem.idx;
+ u64 localidx = bh_imap_get(&mod->local_map, (u64) field->expr) + field->idx;
WIL(WI_LOCAL_GET, localidx);
break;