cgen: add g.options_typedefs, g.shared_types, g.channel_definitions

pull/6163/head
Delyan Angelov 2020-08-18 11:45:36 +03:00
parent ed156838e6
commit 937a3e14c5
1 changed files with 22 additions and 4 deletions

View File

@ -43,6 +43,9 @@ mut:
comptime_defines strings.Builder // custom defines, given by -d/-define flags on the CLI
pcs_declarations strings.Builder // -prof profile counter declarations for each function
hotcode_definitions strings.Builder // -live declarations & functions
shared_types strings.Builder // shared/lock types
channel_definitions strings.Builder // channel related code
options_typedefs strings.Builder // Option typedefs
options strings.Builder // `Option_xxxx` types
json_forward_decls strings.Builder // json type forward decls
enum_typedefs strings.Builder // enum types
@ -128,7 +131,10 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string
comptime_defines: strings.new_builder(100)
pcs_declarations: strings.new_builder(100)
hotcode_definitions: strings.new_builder(100)
options_typedefs: strings.new_builder(100)
options: strings.new_builder(100)
shared_types: strings.new_builder(100)
channel_definitions: strings.new_builder(100)
json_forward_decls: strings.new_builder(100)
enum_typedefs: strings.new_builder(100)
sql_buf: strings.new_builder(100)
@ -226,6 +232,18 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string
b.writeln('\n// V hotcode definitions:')
b.write(g.hotcode_definitions.str())
}
if g.options_typedefs.len > 0 {
b.writeln('\n// V option typedefs:')
b.write(g.options_typedefs.str())
}
if g.shared_types.len > 0 {
b.writeln('\n// V shared types:')
b.write(g.shared_types.str())
}
if g.channel_definitions.len > 0 {
b.writeln('\n// V channel code:')
b.write(g.channel_definitions.str())
}
if g.stringliterals.len > 0 {
b.writeln('\n// V stringliterals:')
b.write(g.stringliterals.str())
@ -412,7 +430,7 @@ fn (mut g Gen) register_optional(t table.Type) string {
if styp !in g.optionals {
no_ptr := base.replace('*', '_ptr')
typ := if base == 'void' { 'void*' } else { base }
g.hotcode_definitions.writeln('typedef struct {
g.options_typedefs.writeln('typedef struct {
$typ data;
string error;
int ecode;
@ -435,7 +453,7 @@ fn (mut g Gen) find_or_register_shared(t table.Type, base string) string {
return sh_typ
}
mtx_typ := 'sync__RwMutex'
g.hotcode_definitions.writeln('struct $sh_typ { $base val; $mtx_typ* mtx; };')
g.shared_types.writeln('struct $sh_typ { $base val; $mtx_typ* mtx; };')
g.typedefs2.writeln('typedef struct $sh_typ $sh_typ;')
// println('registered shared type $sh_typ')
g.shareds << t_idx
@ -502,13 +520,13 @@ typedef struct {
styp := util.no_dots(typ.name)
g.type_definitions.writeln('typedef chan $styp;')
el_stype := g.typ(typ.chan_info().elem_type)
g.hotcode_definitions.writeln('
g.channel_definitions.writeln('
static inline $el_stype __${styp}_popval($styp ch) {
$el_stype val;
sync__Channel_try_pop_priv(ch, &val, false);
return val;
}')
g.hotcode_definitions.writeln('
g.channel_definitions.writeln('
static inline void __${styp}_pushval($styp ch, $el_stype val) {
sync__Channel_try_push_priv(ch, &val, false);
}')