def fill_constructor(constructor: nodes.ConstructorImplementation, klass: nodes.Class, vtable_init_mangler: mangler.Mangler, _this, _override_table: dict): inner_vtable_init_for_virtuality = [virtual for virtual in klass._ctype.fields if (type(virtual) is nodes.Method or type(virtual) is nodes.Destructor) and virtual.accessibility.virtual is True] inner_vtable_init_for_virtuality_stringified = '\n'.join(["vtable->{0} = &{1};".format( vtable_init_mangler.callable().params([_this] + virtual._ctype._params).type( virtual._ctype._identifier).name(virtual._name).mangle(), vtable_init_mangler.virtual().params([_this] + virtual._ctype._params).name(virtual._name).type( virtual._ctype._identifier).mangle() ) for virtual in inner_vtable_init_for_virtuality]) _overriding_table = [] if len(klass.parents): for name, override in _override_table.items(): for _override in override: if _override["pre"] is True: _overriding_table.insert(0, "vtable->{0} = &{1};".format( '___' + '___'.join([str(len(n)) + n for n in _override['name']]) + '__8callable__' + str( len(name)) + name, vtable_init_mangler.callable().name(name).mangle() )) else: _overriding_table.insert(0, "(*(this->{0}))->{1} = &{2};".format( _override['vtable'], '___' + '___'.join([str(len(n)) + n for n in _override['name']]) + '__8callable__' + str( len(name)) + name, vtable_init_mangler.callable().name(name).mangle() )) constructor.body.body = kooc.Kooc().parse( "int main() {" + inner_vtable_init_for_virtuality_stringified + '\n'.join(_overriding_table) + "}").body[ 0].body.body + constructor.body.body pass
def kooc_resolution(self: cnorm.nodes.Decl, ast: cnorm.nodes.BlockStmt, _mangler: mangler.Mangler, parents): res = node.Node.kooc_resolution(self, ast, _mangler, parents) if res is not None: if hasattr(res, '_ctype'): if res._ctype._storage == 0: _mangler.type(res._ctype._identifier).variable() if hasattr(res._ctype, '_params'): _mangler.callable().params(res._ctype._params) elif res._ctype._storage == 2 or res._ctype._storage == 1: _mangler.type_definition() if '@' in res._ctype._identifier: res._ctype._identifier = identifier_mangling(res._ctype._identifier) self._name = _mangler.name(self._name).mangle() return res
def kooc_resolution(self: nodes.MethodImplementation, ast: cnorm.nodes.BlockStmt, _mangler: mangler.Mangler, parents: list): if hasattr(self, 'virtual'): self._name = _mangler.virtual().name(self._name).mangle() _callable = (kooc.Kooc().parse("""int main() { int* vtable = ((void*)this) - 8; return (double)((*vtable)->""" + _mangler.callable().mangle() + """)(""" + ', '.join( [p._name for p in self._ctype._params]) + """); }""")).body[0] _callable._name = _mangler.callable().mangle() _callable._ctype._params = self._ctype._params _callable._ctype._identifier = self._ctype._identifier _callable.body.body[1].expr.params[0]._identifier = self._ctype._identifier _callable.body.body[0]._ctype._identifier = '__6vtable' + self._ctype._params[0]._ctype._identifier return [self, _callable] else: self._name = _mangler.callable().name(self._name).mangle() return self