File: modify_accessor.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (120 lines) | stat: -rw-r--r-- 5,026 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// RUN: %target-swift-emit-silgen %s | %FileCheck %s

func readwrite(_ : inout String) {}

struct SimpleModify {
  var stored: String

  var modifiable: String {
    get {}
// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12SimpleModifyV10modifiableSSvM
// CHECK-SAME:    : $@yield_once @convention(method) (@inout SimpleModify) -> @yields @inout String {
// CHECK:         [[SELF:%.*]] = begin_access [modify] [unknown] %0 : $*SimpleModify
// CHECK-NEXT:    [[FIELD:%.*]] = struct_element_addr [[SELF]] : $*SimpleModify, #SimpleModify.stored
// CHECK-NEXT:    yield [[FIELD]] : $*String, resume bb1, unwind bb2
// CHECK:       bb1:
// CHECK-NEXT:    end_access [[SELF]] : $*SimpleModify
// CHECK-NEXT:    [[RET:%.*]] = tuple ()
// CHECK-NEXT:    return [[RET]] : $()
// CHECK:       bb2:
// CHECK-NEXT:    end_access [[SELF]] : $*SimpleModify
// CHECK-NEXT:    unwind
    _modify {
      yield &stored
    }
  }

// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12SimpleModifyV3set6stringySS_tF
// CHECK:         [[VALUE:%.*]] = copy_value %0 : $String
// CHECK-NEXT:    [[SELF:%.*]] = begin_access [modify] [unknown] %1 : $*SimpleModify
// CHECK-NEXT:    // function_ref
// CHECK-NEXT:    [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor12SimpleModifyV10modifiableSSvM
// CHECK-NEXT:    ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]]([[SELF]])
// CHECK-NEXT:    assign [[VALUE]] to [[FIELD]] : $*String
// CHECK-NEXT:    end_apply [[TOKEN]]
// CHECK-NEXT:    end_access [[SELF]] : $*SimpleModify
// CHECK-NEXT:    [[RET:%.*]] = tuple ()
// CHECK-NEXT:    return [[RET]] : $()
mutating func set(string: String) {
    modifiable = string
  }

// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12SimpleModifyV0A0yyF
// CHECK:         [[SELF:%.*]] = begin_access [modify] [unknown] %0 : $*SimpleModify
// CHECK-NEXT:    // function_ref
// CHECK-NEXT:    [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor12SimpleModifyV10modifiableSSvM
// CHECK-NEXT:    ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]]([[SELF]])
// CHECK-NEXT:    // function_ref
// CHECK-NEXT:    [[READWRITE:%.*]] = function_ref @$s15modify_accessor9readwriteyySSzF
// CHECK-NEXT:    apply [[READWRITE]]([[FIELD]])
// CHECK-NEXT:    end_apply [[TOKEN]]
// CHECK-NEXT:    end_access [[SELF]] : $*SimpleModify
// CHECK-NEXT:    [[RET:%.*]] = tuple ()
// CHECK-NEXT:    return [[RET]] : $()
  mutating func modify() {
    readwrite(&modifiable)
  }
}

class SetterSynthesisFromModify {
  var stored: String = "test"
  var modifiable: String {
    get { return stored }
// CHECK: sil hidden [transparent] [ossa] @$s15modify_accessor25SetterSynthesisFromModifyC10modifiableSSvs
// CHECK:         debug_value
// CHECK-NEXT:    debug_value
// CHECK-NEXT:    [[VALUE_BORROW:%.*]] = begin_borrow %0 : $String
// CHECK-NEXT:    [[VALUE:%.*]] = copy_value [[VALUE_BORROW]] : $String
// CHECK-NEXT:    // function_ref
// CHECK-NEXT:    [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor25SetterSynthesisFromModifyC10modifiableSSvM
// CHECK-NEXT:    ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]](%1)
// CHECK-NEXT:    assign [[VALUE]] to [[FIELD]] : $*String
// CHECK-NEXT:    end_apply [[TOKEN]]
// CHECK-NEXT:    end_borrow [[VALUE_BORROW]]
// CHECK-NEXT:    destroy_value %0 : $String
// CHECK-NEXT:    [[RET:%.*]] = tuple ()
// CHECK-NEXT:    return [[RET]] : $()
    _modify {
      yield &stored
    }
  }
}

struct ModifyAndSet {
  var stored: String

  var modifiable: String {
    get { return stored }
    _modify { yield &stored }
    set(value) { stored = value }
  }

// CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12ModifyAndSetV3set6stringySS_tF
// CHECK:         [[VALUE:%.*]] = copy_value %0 : $String
// CHECK-NEXT:    [[SELF:%.*]] = begin_access [modify] [unknown] %1 : $*ModifyAndSet
// CHECK-NEXT:    // function_ref
// CHECK-NEXT:    [[SETTERFN:%.*]] = function_ref @$s15modify_accessor12ModifyAndSetV10modifiableSSvs
// CHECK-NEXT:    apply [[SETTERFN]]([[VALUE]], [[SELF]])
// CHECK-NEXT:    end_access [[SELF]] : $*ModifyAndSet
// CHECK-NEXT:    [[RET:%.*]] = tuple ()
// CHECK-NEXT:    return [[RET]] : $()
  mutating func set(string: String) {
    modifiable = string
  }

  // CHECK-LABEL: sil hidden [ossa] @$s15modify_accessor12ModifyAndSetV0A0yyF
  // CHECK:         [[SELF:%.*]] = begin_access [modify] [unknown] %0 : $*ModifyAndSet
  // CHECK-NEXT:    // function_ref
  // CHECK-NEXT:    [[MODIFYFN:%.*]] = function_ref @$s15modify_accessor12ModifyAndSetV10modifiableSSvM
  // CHECK-NEXT:    ([[FIELD:%.*]], [[TOKEN:%.*]]) = begin_apply [[MODIFYFN]]([[SELF]])
  // CHECK-NEXT:    // function_ref
  // CHECK-NEXT:    [[READWRITE:%.*]] = function_ref @$s15modify_accessor9readwriteyySSzF
  // CHECK-NEXT:    apply [[READWRITE]]([[FIELD]])
  // CHECK-NEXT:    end_apply [[TOKEN]]
  // CHECK-NEXT:    end_access [[SELF]] : $*ModifyAndSet
  // CHECK-NEXT:    [[RET:%.*]] = tuple ()
  // CHECK-NEXT:    return [[RET]] : $()
  mutating func modify() {
    readwrite(&modifiable)
  }
}