cgen: fix an interface index generation bug

pull/6635/head
Delyan Angelov 2020-10-16 15:16:36 +03:00
parent 3af700d950
commit 11ee68e799
1 changed files with 11 additions and 6 deletions

View File

@ -5208,7 +5208,6 @@ fn (mut g Gen) interface_table() string {
if inter_info.types.len == 0 { if inter_info.types.len == 0 {
continue continue
} }
sb.writeln('// NR interfaced types= $inter_info.types.len')
// interface_name is for example Speaker // interface_name is for example Speaker
interface_name := c_name(ityp.name) interface_name := c_name(ityp.name)
// generate a struct that references interface methods // generate a struct that references interface methods
@ -5242,17 +5241,21 @@ fn (mut g Gen) interface_table() string {
cast_functions.write('// Casting functions for interface "$interface_name"') cast_functions.write('// Casting functions for interface "$interface_name"')
mut methods_wrapper := strings.new_builder(100) mut methods_wrapper := strings.new_builder(100)
methods_wrapper.writeln('// Methods wrapper for interface "$interface_name"') methods_wrapper.writeln('// Methods wrapper for interface "$interface_name"')
mut already_generated_mwrappers := map[string]bool{} mut already_generated_mwrappers := map[string]int{}
for i, st in inter_info.types { iinidx_minimum_base := 1000 // NB: NOT 0, to avoid map entries set to 0 later, so `if already_generated_mwrappers[name] > 0 {` works.
mut current_iinidx := iinidx_minimum_base
for st in inter_info.types {
// cctype is the Cleaned Concrete Type name, *without ptr*, // cctype is the Cleaned Concrete Type name, *without ptr*,
// i.e. cctype is always just Cat, not Cat_ptr: // i.e. cctype is always just Cat, not Cat_ptr:
cctype := g.cc_type(st) cctype := g.cc_type(st)
// Speaker_Cat_index = 0 // Speaker_Cat_index = 0
interface_index_name := '_${interface_name}_${cctype}_index' interface_index_name := '_${interface_name}_${cctype}_index'
if already_generated_mwrappers[interface_index_name] { if already_generated_mwrappers[interface_index_name] > 0 {
continue continue
} }
already_generated_mwrappers[interface_index_name] = true already_generated_mwrappers[interface_index_name] = current_iinidx
current_iinidx++
// eprintln('>>> current_iinidx: ${current_iinidx-iinidx_minimum_base} | interface_index_name: $interface_index_name')
cast_functions.writeln(' cast_functions.writeln('
_Interface I_${cctype}_to_Interface_${interface_name}($cctype* x) { _Interface I_${cctype}_to_Interface_${interface_name}($cctype* x) {
return (_Interface) { return (_Interface) {
@ -5311,8 +5314,10 @@ _Interface* I_${cctype}_to_Interface_${interface_name}_ptr($cctype* x) {
methods_struct.writeln('\t\t.${c_name(method.name)} = $method_call,') methods_struct.writeln('\t\t.${c_name(method.name)} = $method_call,')
} }
methods_struct.writeln('\t},') methods_struct.writeln('\t},')
sb.writeln('int $interface_index_name = $i;') iin_idx := already_generated_mwrappers[interface_index_name] - iinidx_minimum_base
sb.writeln('int $interface_index_name = $iin_idx;')
} }
sb.writeln('// ^^^ number of types for interface $interface_name: ${current_iinidx - iinidx_minimum_base}')
methods_struct.writeln('};') methods_struct.writeln('};')
// add line return after interface index declarations // add line return after interface index declarations
sb.writeln('') sb.writeln('')