library #lib;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:_internal" as _in;

import "dart:ffi";

class MyFinalizable extends core::Object implements ffi::Finalizable {
  field core::int _internalValue = 4;
  synthetic constructor •() → self::MyFinalizable
    : super core::Object::•()
    ;
  method capturingThis() → () → core::int {
    return block {
      final synthesized () → core::int :expressionValueWrappedFinalizable = () → core::int {
        final core::int result = this.{self::MyFinalizable::_internalValue}{core::int};
        return block {
          final synthesized core::int :expressionValueWrappedFinalizable = result;
          _in::reachabilityFence(this);
        } =>:expressionValueWrappedFinalizable;
      };
      _in::reachabilityFence(this);
    } =>:expressionValueWrappedFinalizable;
  }
  method capturingThis2() → () → core::int {
    return block {
      final synthesized () → core::int :expressionValueWrappedFinalizable = () → core::int {
        return block {
          final synthesized core::int :expressionValueWrappedFinalizable = this.{self::MyFinalizable::_internalValue}{core::int};
          _in::reachabilityFence(this);
        } =>:expressionValueWrappedFinalizable;
      };
      _in::reachabilityFence(this);
    } =>:expressionValueWrappedFinalizable;
  }
  method capturingThis3() → () → core::int {
    return block {
      final synthesized () → core::int :expressionValueWrappedFinalizable = () → core::int {
        return block {
          final synthesized core::int :expressionValueWrappedFinalizable = this.{self::MyFinalizable::_internalValue}{core::int};
          _in::reachabilityFence(this);
        } =>:expressionValueWrappedFinalizable;
      };
      _in::reachabilityFence(this);
    } =>:expressionValueWrappedFinalizable;
  }
  method capturingThis4() → () → core::int {
    return block {
      final synthesized () → core::int :expressionValueWrappedFinalizable = () → core::int {
        if(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int} =={core::num::==}{(core::Object) → core::bool} 42) {
          return block {
            final synthesized core::int :expressionValueWrappedFinalizable = 3;
            _in::reachabilityFence(this);
          } =>:expressionValueWrappedFinalizable;
        }
        return block {
          final synthesized core::int :expressionValueWrappedFinalizable = this.{self::MyFinalizable::_internalValue}{core::int};
          _in::reachabilityFence(this);
        } =>:expressionValueWrappedFinalizable;
      };
      _in::reachabilityFence(this);
    } =>:expressionValueWrappedFinalizable;
  }
}
static method main() → void {}
