示例#1
0
    def __init__(self, trimming_dict=None, progress_cb=None):
        self.trimming_dict = trimming_dict
        self.types_cast_to_void = set()
        self.progress_cb = progress_cb or (lambda *_: None)
        self.parser = parser.Parser(type_manager=self)
        self.variables = {}
        self.types = types.get_64bit_types()
        self.functions = functions.get_arithmetic_functions()
        self.functions.update(functions.get_builtins())
        self.expression_evaluator = (
            expression_evaluator_visitor.ExpressionEvaluatorVisitor(
                type_manager=self))

        self.dependency_visitor = type_collecting_visitor.DependencyVisitor(
            type_manager=self)

        self.field_collector = field_collecting_visitor.FieldCollectingVisitor(
            type_manager=self)

        self.layout_computer = layout_computing_visitor.LayoutComputingVisitor(
            type_manager=self)

        # Add the constants from the trimming dict. These represent global enum
        # values.
        if trimming_dict:
            self.variables = self.trimming_dict.get("$VARS", {})
示例#2
0
    def __init__(self, trimming_dict=None, progress_cb=None):
        self.trimming_dict = trimming_dict
        self.types_cast_to_void = set()
        self.progress_cb = progress_cb or (lambda *_: None)
        self.parser = c_parser.Parser(type_manager=self)
        self.variables = {}
        self.types = types.get_64bit_types()
        self.functions = functions.get_arithmetic_functions()
        self.functions.update(functions.get_builtins())
        self.expression_evaluator = (
            expression_evaluator_visitor.ExpressionEvaluatorVisitor(
                type_manager=self))

        self.dependency_visitor = type_collecting_visitor.DependencyVisitor(
            type_manager=self)

        self.field_collector = field_collecting_visitor.FieldCollectingVisitor(
            type_manager=self)

        self.layout_computer = layout_computing_visitor.LayoutComputingVisitor(
            type_manager=self)

        # Add the constants from the trimming dict. These represent global enum
        # values.
        if trimming_dict:
            self.variables = self.trimming_dict.get("$VARS", {})
示例#3
0
    def _get_layouts_and_types(self, program, layouts_to_compute):
        """Computes layouts and type definitions from AST tree."""
        expression_evaluator = self._get_expression_evaluator()
        type_collector = type_collecting_visitor.TypeCollectingVisitor(
            expression_evaluator)

        types = type_collector.collect_types(program)
        types.update(types_module.get_64bit_types())
        layout_computer = self._get_layout_computer(expression_evaluator, types)

        def _sizeof(type_name):
            return layout_computer.compute_layout(
                types[type_name]).bit_size // 8

        # Implement a sizeof function.
        self.functions_['sizeof'] = _sizeof

        layouts = {}
        for name in layouts_to_compute:
            layouts[name] = layout_computer.compute_layout(types[name])

        return layouts, types