Implement global struct
This commit is contained in:
parent
27e8d13748
commit
aba6b2d22b
@ -151,7 +151,31 @@ arena_initialize = fn (initialization: ArenaInitialization) &Arena
|
|||||||
return 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
|
[export] main = fn [cc(c)] () s32
|
||||||
{
|
{
|
||||||
|
global_state_initialize();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3596,7 +3596,6 @@ const Converter = struct {
|
|||||||
const value_start_ch = converter.content[value_offset];
|
const value_start_ch = converter.content[value_offset];
|
||||||
var value = switch (value_start_ch) {
|
var value = switch (value_start_ch) {
|
||||||
'a'...'z', 'A'...'Z', '_' => b: {
|
'a'...'z', 'A'...'Z', '_' => b: {
|
||||||
if (module.current_function) |current_function| {
|
|
||||||
const identifier = converter.parse_identifier();
|
const identifier = converter.parse_identifier();
|
||||||
|
|
||||||
if (string_to_enum(ValueKeyword, identifier)) |value_keyword| switch (value_keyword) {
|
if (string_to_enum(ValueKeyword, identifier)) |value_keyword| switch (value_keyword) {
|
||||||
@ -3624,7 +3623,9 @@ const Converter = struct {
|
|||||||
module.llvm.builder.clear_insertion_position();
|
module.llvm.builder.clear_insertion_position();
|
||||||
return module.unreachable_value;
|
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();
|
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();
|
converter.skip_space();
|
||||||
@ -3843,7 +3844,6 @@ const Converter = struct {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
converter.report_error();
|
converter.report_error();
|
||||||
}
|
}
|
||||||
@ -4909,11 +4909,14 @@ pub noinline fn convert(arena: *Arena, options: ConvertOptions) void {
|
|||||||
|
|
||||||
converter.skip_space();
|
converter.skip_space();
|
||||||
|
|
||||||
|
var global_keyword = false;
|
||||||
if (is_identifier_start_ch(converter.content[converter.offset])) {
|
if (is_identifier_start_ch(converter.content[converter.offset])) {
|
||||||
const global_string = converter.parse_identifier();
|
const global_string = converter.parse_identifier();
|
||||||
converter.skip_space();
|
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" => {
|
.@"fn" => {
|
||||||
var calling_convention = CallingConvention.c;
|
var calling_convention = CallingConvention.c;
|
||||||
const function_attributes = Function.Attributes{};
|
const function_attributes = Function.Attributes{};
|
||||||
@ -5797,10 +5800,13 @@ pub noinline fn convert(arena: *Arena, options: ConvertOptions) void {
|
|||||||
.name = global_name,
|
.name = global_name,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
} else {
|
|
||||||
converter.report_error();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
converter.offset -= global_string.len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!global_keyword) {
|
||||||
if (global_type) |expected_type| {
|
if (global_type) |expected_type| {
|
||||||
const value = converter.parse_value(module, expected_type, .value);
|
const value = converter.parse_value(module, expected_type, .value);
|
||||||
|
|
||||||
|
@ -416,3 +416,7 @@ test "pointer_cast" {
|
|||||||
test "struct_assignment" {
|
test "struct_assignment" {
|
||||||
try invsrc(@src());
|
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