Пример #1
0
    def initialize(
            self, obligation_instances: List['GuardedObligationInstance'],
            translator: 'AbstractTranslator', ctx: Context,
            overriding_check: bool = False) -> List[Stmt]:
        """Construct a list of statements that initialize measure map.

        If ``overriding_check`` is ``True``, then adds to measures ``1``
        to allow overridden method to have the same measure.
        """
        position = translator.no_position(ctx)
        info = translator.no_info(ctx)
        measures = []
        for instance in obligation_instances:
            if instance.obligation_instance.is_fresh():
                continue
            guard_expression = instance.create_guard_expression()
            value = instance.obligation_instance.get_measure()
            if overriding_check:
                value = sil.Inc(value)
            measure = self._create_measure(
                guard_expression,
                instance.obligation_instance.get_target(), value)
            measures.append(measure)
        assign = sil.Assign(
            self._map_var,
            sil.PSeq(self._measure_domain.get_type(), measures))
        statement = assign.translate(translator, ctx, position, info)
        return [statement]
Пример #2
0
 def _set_loop_check_before(self) -> None:
     """Set the variable indicating that we are before loop."""
     if obligation_config.disable_all:
         return
     assign = sil.Assign(self._loop_obligation_info.loop_check_before_var,
                         sil.TrueLit())
     info = self._to_info('We are before loop.')
     self._append_statement(assign, info=info)
Пример #3
0
 def _save_must_terminate_amount(
         self, amount_var: PythonVar) -> None:
     """Save the current permission amount to a variable."""
     if obligation_config.disable_termination_check:
         return
     predicate = self._get_must_terminate_predicate()
     assign = sil.Assign(amount_var, sil.CurrentPerm(predicate))
     info = self._to_info('Save current MustTerminate amount.')
     self._append_statement(assign, info=info)
Пример #4
0
 def _save_loop_termination(self) -> None:
     """Save if loop promises to terminate into a variable."""
     if obligation_config.disable_termination_check:
         return
     assign = sil.Assign(
         self._loop_obligation_info.termination_flag_var,
         self._loop_obligation_info.create_termination_check(True))
     info = self._to_info('Save loop termination promise.')
     self._append_statement(assign, info=info)
Пример #5
0
 def _set_loop_check_after_body(self) -> None:
     """Set the variable indicating that we are after loop body."""
     if obligation_config.disable_all:
         return
     assign = sil.Assign(self._loop_obligation_info.loop_check_before_var,
                         sil.FalseLit())
     info = self._to_info('We are after loop body.')
     statement = assign.translate(self._translator, self._ctx,
                                  self._position, info)
     self._obligation_loop.append_body(statement)