Implement global struct
This commit is contained in:
parent
27e8d13748
commit
aba6b2d22b
@ -151,7 +151,31 @@ arena_initialize = fn (initialization: ArenaInitialization) &Arena
|
||||
return arena;
|
||||
}
|
||||
|
||||
arena_initialize_default = fn (initial_size: u64) &Arena
|
||||
{
|
||||
return arena_initialize({
|
||||
.reserved_size = 4 * 1024 * 1024 * 1024,
|
||||
.granularity = 4 * 1024,
|
||||
.initial_size = initial_size,
|
||||
});
|
||||
}
|
||||
|
||||
GlobalState = struct
|
||||
{
|
||||
arena: &Arena,
|
||||
}
|
||||
|
||||
global_state: GlobalState = undefined;
|
||||
|
||||
global_state_initialize = fn () void
|
||||
{
|
||||
global_state = {
|
||||
.arena = arena_initialize_default(2 * 1024 * 1024),
|
||||
};
|
||||
}
|
||||
|
||||
[export] main = fn [cc(c)] () s32
|
||||
{
|
||||
global_state_initialize();
|
||||
return 0;
|
||||
}
|
||||
|
@ -3596,7 +3596,6 @@ const Converter = struct {
|
||||
const value_start_ch = converter.content[value_offset];
|
||||
var value = switch (value_start_ch) {
|
||||
'a'...'z', 'A'...'Z', '_' => b: {
|
||||
if (module.current_function) |current_function| {
|
||||
const identifier = converter.parse_identifier();
|
||||
|
||||
if (string_to_enum(ValueKeyword, identifier)) |value_keyword| switch (value_keyword) {
|
||||
@ -3624,7 +3623,9 @@ const Converter = struct {
|
||||
module.llvm.builder.clear_insertion_position();
|
||||
return module.unreachable_value;
|
||||
},
|
||||
} else {
|
||||
};
|
||||
|
||||
if (module.current_function) |current_function| {
|
||||
const variable = if (current_function.value.bb.function.locals.find(identifier)) |local| local else if (current_function.value.bb.function.arguments.find(identifier)) |argument| argument else if (module.globals.find(identifier)) |global| global else converter.report_error();
|
||||
|
||||
converter.skip_space();
|
||||
@ -3843,7 +3844,6 @@ const Converter = struct {
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
converter.report_error();
|
||||
}
|
||||
@ -4909,11 +4909,14 @@ pub noinline fn convert(arena: *Arena, options: ConvertOptions) void {
|
||||
|
||||
converter.skip_space();
|
||||
|
||||
var global_keyword = false;
|
||||
if (is_identifier_start_ch(converter.content[converter.offset])) {
|
||||
const global_string = converter.parse_identifier();
|
||||
converter.skip_space();
|
||||
|
||||
if (string_to_enum(GlobalKind, global_string)) |global_kind| switch (global_kind) {
|
||||
if (string_to_enum(GlobalKind, global_string)) |global_kind| {
|
||||
global_keyword = true;
|
||||
switch (global_kind) {
|
||||
.@"fn" => {
|
||||
var calling_convention = CallingConvention.c;
|
||||
const function_attributes = Function.Attributes{};
|
||||
@ -5797,10 +5800,13 @@ pub noinline fn convert(arena: *Arena, options: ConvertOptions) void {
|
||||
.name = global_name,
|
||||
});
|
||||
},
|
||||
} else {
|
||||
converter.report_error();
|
||||
}
|
||||
} else {
|
||||
converter.offset -= global_string.len;
|
||||
}
|
||||
}
|
||||
|
||||
if (!global_keyword) {
|
||||
if (global_type) |expected_type| {
|
||||
const value = converter.parse_value(module, expected_type, .value);
|
||||
|
||||
|
@ -416,3 +416,7 @@ test "pointer_cast" {
|
||||
test "struct_assignment" {
|
||||
try invsrc(@src());
|
||||
}
|
||||
|
||||
test "global_struct" {
|
||||
try invsrc(@src());
|
||||
}
|
||||
|
28
tests/global_struct.bbb
Normal file
28
tests/global_struct.bbb
Normal file
@ -0,0 +1,28 @@
|
||||
S = struct
|
||||
{
|
||||
a: u32,
|
||||
b: u32,
|
||||
c: u32,
|
||||
}
|
||||
|
||||
s: S = {
|
||||
.a = 1,
|
||||
.b = 2,
|
||||
.c = 3,
|
||||
};
|
||||
|
||||
require = fn (ok: u1) void
|
||||
{
|
||||
if (!ok)
|
||||
{
|
||||
#trap();
|
||||
}
|
||||
}
|
||||
|
||||
[export] main = fn () s32
|
||||
{
|
||||
require(s.a == 1);
|
||||
require(s.b == 2);
|
||||
require(s.c == 3);
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user