Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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