Skip to content

Commit 081bb95

Browse files
committed
Synthesize accessors for dynamic global variables
1 parent 9debb38 commit 081bb95

File tree

5 files changed

+30
-1
lines changed

5 files changed

+30
-1
lines changed

lib/SIL/SILDeclRef.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,8 @@ bool SILDeclRef::isDynamicallyReplaceable() const {
964964
return false;
965965

966966
if (kind == SILDeclRef::Kind::Destroyer ||
967-
kind == SILDeclRef::Kind::Initializer) {
967+
kind == SILDeclRef::Kind::Initializer ||
968+
kind == SILDeclRef::Kind::GlobalAccessor) {
968969
return false;
969970
}
970971

lib/Sema/CodeSynthesis.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,6 +2042,12 @@ void swift::maybeAddAccessorsToStorage(TypeChecker &TC,
20422042
return;
20432043

20442044
if (!dc->isTypeContext()) {
2045+
// dynamic globals need accessors.
2046+
if (dc->isModuleScopeContext() && storage->isDynamic() &&
2047+
!storage->isObjC()) {
2048+
addTrivialAccessorsToStorage(storage, TC);
2049+
return;
2050+
}
20452051
// Fixed-layout global variables don't get accessors.
20462052
if (!storage->isResilient())
20472053
return;

test/Interpreter/Inputs/dynamic_replacement_module.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#if MODULE
2+
public dynamic var public_global_var = "public_global_var"
3+
24
public dynamic func public_global_func() -> String {
35
return "public_global_func"
46
}
@@ -64,6 +66,8 @@ public enum PublicEnumeration<Q> {
6466
}
6567
}
6668
#elseif MODULENODYNAMIC
69+
public var public_global_var = "public_global_var"
70+
6771
public func public_global_func() -> String {
6872
return "public_global_func"
6973
}
@@ -134,6 +138,11 @@ import Module1
134138

135139
/// Public global functions, struct, class, and enum.
136140

141+
@_dynamicReplacement(for: public_global_var)
142+
public var replacement_for_public_global_var : String {
143+
return "replacement of " + public_global_var
144+
}
145+
137146
@_dynamicReplacement(for: public_global_func())
138147
public func replacement_for_public_global_func() -> String {
139148
return "replacement of " + public_global_func()

test/Interpreter/dynamic_replacement.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ func expectedResult(_ forOriginalLibrary: Bool, _ expectedOriginalString: Strin
7272
}
7373

7474
func checkExpectedResults(forOriginalLibrary useOrig: Bool) {
75+
expectTrue(public_global_var == expectedResult(useOrig, "public_global_var"))
76+
7577
expectTrue(public_global_func() ==
7678
expectedResult(useOrig, "public_global_func"))
7779
expectTrue(public_global_generic_func(Int.self) ==

test/SILGen/dynamically_replaceable.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,14 @@ extension GenericS {
271271
}
272272
}
273273
}
274+
275+
dynamic var globalX = 0
276+
// CHECK-LABEL: sil hidden [dynamically_replacable] @$s23dynamically_replaceable7globalXSivg : $@convention(thin) () -> Int
277+
// CHECK-LABEL: sil hidden [dynamically_replacable] @$s23dynamically_replaceable7globalXSivs : $@convention(thin) (Int) -> ()
278+
// CHECK-LABEL: sil hidden @$s23dynamically_replaceable7getsetXyS2iF
279+
// CHECK: dynamic_function_ref @$s23dynamically_replaceable7globalXSivs
280+
// CHECK: dynamic_function_ref @$s23dynamically_replaceable7globalXSivg
281+
func getsetX(_ x: Int) -> Int {
282+
globalX = x
283+
return globalX
284+
}

0 commit comments

Comments
 (0)