TC-O Samples

Note

Be warned, even small object-oriented Tiger programs may generate complicated desugared outputs. At first, you are encouraged to run the tests with LLVM.

empty-class.tig
let
  class A {}
in
end
tc -X --object-desugar -A empty-class.tig
$ tc -X --object-desugar -A empty-class.tig
/* == Abstract Syntax Tree. == */

function _main() =
  let
    type _variant_Object = { exact_type : int }
    type _variant_A_0 = { exact_type : int }
    var _id_Object := 0
    var _id_A_0 := 1
    function _upcast_A_0_to_Object(source : _variant_A_0) : _variant_Object =
      _variant_Object { exact_type = _id_A_0 }
    function _new_Object() : _variant_Object =
      _variant_Object { exact_type = _id_Object }
  in
    (
      let
        function _new_A_0() : _variant_A_0 =
          let
          in
            _variant_A_0 { exact_type = _id_A_0 }
          end
      in
        ()
      end;
      ()
    )
  end
$ echo $?
0
simple-class.tig
let
  class B
  {
    var a := 42
    method m() : int = self.a
  }
  var b := new B
in
  b.a := 51
end
tc -X --object-desugar -A simple-class.tig
$ tc -X --object-desugar -A simple-class.tig
/* == Abstract Syntax Tree. == */

function _main() =
  let
    type _variant_Object = {
      exact_type : int,
      field_B_1 : _contents_B_1
    }
    type _contents_B_1 = { a : int }
    type _variant_B_1 = {
      exact_type : int,
      field_B_1 : _contents_B_1
    }
    var _id_Object := 0
    var _id_B_1 := 1
    function _upcast_B_1_to_Object(source : _variant_B_1) : _variant_Object =
      _variant_Object {
        exact_type = _id_B_1,
        field_B_1 = source.field_B_1
      }
    function _new_Object() : _variant_Object =
      _variant_Object {
        exact_type = _id_Object,
        field_B_1 = nil
      }
  in
    (
      let
        function _new_B_1() : _variant_B_1 =
          let
            var contents_B_1 := _contents_B_1 { a = 42 }
          in
            _variant_B_1 {
              exact_type = _id_B_1,
              field_B_1 = contents_B_1
            }
          end
        function _method_B_1_m(self : _variant_B_1) : int =
          self.field_B_1.a
        function _dispatch_B_1_m(self : _variant_B_1) : int =
          _method_B_1_m(self)
        var b_2 := _new_B_1()
      in
        b_2.field_B_1.a := 51
      end;
      ()
    )
  end
$ echo $?
0
override.tig
let
  class C
  {
    var a := 0
    method m() : int = self.a
  }
  class D extends C
  {
    var b := 9
    /* Override C.m().  */
    method m() : int = self.a + self.b
  }
  var d : D := new D
  /* Valid upcast due to inclusion polymorphism.  */
  var c : C := d
in
  c.a := 42;
  /* Note that accessing `c.b' is not allowed, since `c' is
     statically known as a `C', even though it is actually a `D'
     at run time.  */
  let
    /* Polymorphic call.  */
    var res := c.m()
  in
    print_int(res);
    print("\n")
  end
end
tc --object-desugar -A override.tig
$ tc --object-desugar -A override.tig
/* == Abstract Syntax Tree. == */

primitive print(string_0 : string)
primitive print_err(string_1 : string)
primitive print_int(int_2 : int)
primitive flush()
primitive getchar() : string
primitive ord(string_3 : string) : int
primitive chr(code_4 : int) : string
primitive size(string_5 : string) : int
primitive streq(s1_6 : string, s2_7 : string) : int
primitive strcmp(s1_8 : string, s2_9 : string) : int
primitive substring(string_10 : string, start_11 : int, length_12 : int) : string
primitive concat(fst_13 : string, snd_14 : string) : string
primitive not(boolean_15 : int) : int
primitive exit(status_16 : int)
primitive gc_enable(enable_17 : int)
primitive gc_run()
function _main() =
  let
    type _variant_Object = {
      exact_type : int,
      field_C_19 : _contents_C_19,
      field_D_21 : _contents_D_21
    }
    type _contents_C_19 = { a : int }
    type _variant_C_19 = {
      exact_type : int,
      field_C_19 : _contents_C_19,
      field_D_21 : _contents_D_21
    }
    type _contents_D_21 = { b : int }
    type _variant_D_21 = {
      exact_type : int,
      field_D_21 : _contents_D_21,
      field_C_19 : _contents_C_19
    }
    var _id_Object := 0
    var _id_C_19 := 1
    var _id_D_21 := 2
    function _upcast_C_19_to_Object(source : _variant_C_19) : _variant_Object =
      _variant_Object {
        exact_type = _id_C_19,
        field_C_19 = source.field_C_19,
        field_D_21 = source.field_D_21
      }
    function _upcast_D_21_to_C_19(source : _variant_D_21) : _variant_C_19 =
      _variant_C_19 {
        exact_type = _id_D_21,
        field_C_19 = source.field_C_19,
        field_D_21 = source.field_D_21
      }
    function _upcast_D_21_to_Object(source : _variant_D_21) : _variant_Object =
      _variant_Object {
        exact_type = _id_D_21,
        field_C_19 = source.field_C_19,
        field_D_21 = source.field_D_21
      }
    function _new_Object() : _variant_Object =
      _variant_Object {
        exact_type = _id_Object,
        field_C_19 = nil,
        field_D_21 = nil
      }
  in
    (
      let
        function _new_C_19() : _variant_C_19 =
          let
            var contents_C_19 := _contents_C_19 { a = 0 }
          in
            _variant_C_19 {
              exact_type = _id_C_19,
              field_C_19 = contents_C_19,
              field_D_21 = nil
            }
          end
        function _downcast_C_19_to_D_21(source : _variant_C_19) : _variant_D_21 =
          _variant_D_21 {
            exact_type = _id_D_21,
            field_D_21 = source.field_D_21,
            field_C_19 = source.field_C_19
          }
        function _method_C_19_m(self : _variant_C_19) : int =
          self.field_C_19.a
        function _dispatch_C_19_m(self : _variant_C_19) : int =
          if self.exact_type = _id_D_21
            then _method_D_21_m(_downcast_C_19_to_D_21(self))
            else _method_C_19_m(self)
        function _new_D_21() : _variant_D_21 =
          let
            var contents_D_21 := _contents_D_21 { b = 9 }
            var contents_C_19 := _contents_C_19 { a = 0 }
          in
            _variant_D_21 {
              exact_type = _id_D_21,
              field_D_21 = contents_D_21,
              field_C_19 = contents_C_19
            }
          end
        function _method_D_21_m(self : _variant_D_21) : int =
          self.field_C_19.a + self.field_D_21.b
        function _dispatch_D_21_m(self : _variant_D_21) : int =
          _method_D_21_m(self)
        var d_22 : _variant_D_21 := _new_D_21()
        var c_23 : _variant_C_19 := _upcast_D_21_to_C_19(d_22)
      in
        (
          c_23.field_C_19.a := 42;
          let
            var res_24 := _dispatch_C_19_m(c_23)
          in
            (
              print_int(res_24);
              print("\n")
            )
          end
        )
      end;
      ()
    )
  end
$ echo $?
0
tc --object-desugar -L override.tig > override.lir
$ tc --object-desugar -L override.tig > override.lir

$ echo $?
0
ovm override.lir
$ ovm override.lir
51
$ echo $?
0