Skip to content

Commit 5364220

Browse files
authored
Merge pull request #3710 from onflow/bastian/optimize-account-values
Lazily compute fields of account type values
2 parents 0963441 + 5cc3100 commit 5364220

8 files changed

+271
-197
lines changed

interpreter/value_account.go

+17-28
Original file line numberDiff line numberDiff line change
@@ -55,52 +55,41 @@ func NewAccountValue(
5555
sema.AccountTypeAddressFieldName: address,
5656
}
5757

58-
var storage Value
59-
var contracts Value
60-
var keys Value
61-
var inbox Value
62-
var capabilities Value
63-
64-
computeField := func(name string, inter *Interpreter, locationRange LocationRange) Value {
58+
computeLazyStoredField := func(name string) Value {
6559
switch name {
6660
case sema.AccountTypeStorageFieldName:
67-
if storage == nil {
68-
storage = storageConstructor()
69-
}
70-
return storage
61+
return storageConstructor()
7162

7263
case sema.AccountTypeContractsFieldName:
73-
if contracts == nil {
74-
contracts = contractsConstructor()
75-
}
76-
return contracts
64+
return contractsConstructor()
7765

7866
case sema.AccountTypeKeysFieldName:
79-
if keys == nil {
80-
keys = keysConstructor()
81-
}
82-
return keys
67+
return keysConstructor()
8368

8469
case sema.AccountTypeInboxFieldName:
85-
if inbox == nil {
86-
inbox = inboxConstructor()
87-
}
88-
return inbox
70+
return inboxConstructor()
8971

9072
case sema.AccountTypeCapabilitiesFieldName:
91-
if capabilities == nil {
92-
capabilities = capabilitiesConstructor()
93-
}
94-
return capabilities
73+
return capabilitiesConstructor()
74+
}
75+
76+
return nil
77+
}
9578

79+
computeField := func(name string, _ *Interpreter, _ LocationRange) Value {
80+
switch name {
9681
case sema.AccountTypeBalanceFieldName:
9782
return accountBalanceGet()
9883

9984
case sema.AccountTypeAvailableBalanceFieldName:
10085
return accountAvailableBalanceGet()
10186
}
10287

103-
return nil
88+
field := computeLazyStoredField(name)
89+
if field != nil {
90+
fields[name] = field
91+
}
92+
return field
10493
}
10594

10695
var str string

interpreter/value_account_accountcapabilities.go

+32-11
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,35 @@ func NewAccountAccountCapabilitiesValue(
4141
issueWithTypeFunction BoundFunctionGenerator,
4242
) *SimpleCompositeValue {
4343

44+
var accountCapabilities *SimpleCompositeValue
45+
46+
fields := map[string]Value{}
47+
48+
computeLazyStoredField := func(name string) Value {
49+
switch name {
50+
case sema.Account_AccountCapabilitiesTypeGetControllerFunctionName:
51+
return getControllerFunction(accountCapabilities)
52+
case sema.Account_AccountCapabilitiesTypeGetControllersFunctionName:
53+
return getControllersFunction(accountCapabilities)
54+
case sema.Account_AccountCapabilitiesTypeForEachControllerFunctionName:
55+
return forEachControllerFunction(accountCapabilities)
56+
case sema.Account_AccountCapabilitiesTypeIssueFunctionName:
57+
return issueFunction(accountCapabilities)
58+
case sema.Account_AccountCapabilitiesTypeIssueWithTypeFunctionName:
59+
return issueWithTypeFunction(accountCapabilities)
60+
}
61+
62+
return nil
63+
}
64+
65+
computeField := func(name string, _ *Interpreter, _ LocationRange) Value {
66+
field := computeLazyStoredField(name)
67+
if field != nil {
68+
fields[name] = field
69+
}
70+
return field
71+
}
72+
4473
var str string
4574
stringer := func(interpreter *Interpreter, seenReferences SeenReferences, locationRange LocationRange) string {
4675
if str == "" {
@@ -51,24 +80,16 @@ func NewAccountAccountCapabilitiesValue(
5180
return str
5281
}
5382

54-
accountCapabilities := NewSimpleCompositeValue(
83+
accountCapabilities = NewSimpleCompositeValue(
5584
gauge,
5685
account_AccountCapabilitiesTypeID,
5786
account_AccountCapabilitiesStaticType,
5887
account_AccountCapabilitiesFieldNames,
59-
nil,
60-
nil,
88+
fields,
89+
computeField,
6190
nil,
6291
stringer,
6392
)
6493

65-
accountCapabilities.Fields = map[string]Value{
66-
sema.Account_AccountCapabilitiesTypeGetControllerFunctionName: getControllerFunction(accountCapabilities),
67-
sema.Account_AccountCapabilitiesTypeGetControllersFunctionName: getControllersFunction(accountCapabilities),
68-
sema.Account_AccountCapabilitiesTypeForEachControllerFunctionName: forEachControllerFunction(accountCapabilities),
69-
sema.Account_AccountCapabilitiesTypeIssueFunctionName: issueFunction(accountCapabilities),
70-
sema.Account_AccountCapabilitiesTypeIssueWithTypeFunctionName: issueWithTypeFunction(accountCapabilities),
71-
}
72-
7394
return accountCapabilities
7495
}

interpreter/value_account_capabilities.go

+31-23
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ import (
2929

3030
var account_CapabilitiesTypeID = sema.AccountCapabilitiesType.ID()
3131
var account_CapabilitiesStaticType StaticType = PrimitiveStaticTypeAccount_Capabilities
32+
var account_CapabilitiesFieldNames = []string{
33+
sema.Account_CapabilitiesTypeStorageFieldName,
34+
sema.Account_CapabilitiesTypeAccountFieldName,
35+
}
3236

3337
func NewAccountCapabilitiesValue(
3438
gauge common.MemoryGauge,
@@ -42,27 +46,39 @@ func NewAccountCapabilitiesValue(
4246
accountCapabilitiesConstructor func() Value,
4347
) Value {
4448

45-
var storageCapabilities Value
46-
var accountCapabilities Value
49+
var capabilities *SimpleCompositeValue
50+
51+
fields := map[string]Value{}
4752

48-
computeField := func(name string, inter *Interpreter, locationRange LocationRange) Value {
53+
computeLazyStoredField := func(name string) Value {
4954
switch name {
5055
case sema.Account_CapabilitiesTypeStorageFieldName:
51-
if storageCapabilities == nil {
52-
storageCapabilities = storageCapabilitiesConstructor()
53-
}
54-
return storageCapabilities
55-
56+
return storageCapabilitiesConstructor()
5657
case sema.Account_CapabilitiesTypeAccountFieldName:
57-
if accountCapabilities == nil {
58-
accountCapabilities = accountCapabilitiesConstructor()
59-
}
60-
return accountCapabilities
58+
return accountCapabilitiesConstructor()
59+
case sema.Account_CapabilitiesTypeGetFunctionName:
60+
return getFunction(capabilities)
61+
case sema.Account_CapabilitiesTypeBorrowFunctionName:
62+
return borrowFunction(capabilities)
63+
case sema.Account_CapabilitiesTypeExistsFunctionName:
64+
return existsFunction(capabilities)
65+
case sema.Account_CapabilitiesTypePublishFunctionName:
66+
return publishFunction(capabilities)
67+
case sema.Account_CapabilitiesTypeUnpublishFunctionName:
68+
return unpublishFunction(capabilities)
6169
}
6270

6371
return nil
6472
}
6573

74+
computeField := func(name string, _ *Interpreter, _ LocationRange) Value {
75+
field := computeLazyStoredField(name)
76+
if field != nil {
77+
fields[name] = field
78+
}
79+
return field
80+
}
81+
6682
var str string
6783
stringer := func(interpreter *Interpreter, seenReferences SeenReferences, locationRange LocationRange) string {
6884
if str == "" {
@@ -73,24 +89,16 @@ func NewAccountCapabilitiesValue(
7389
return str
7490
}
7591

76-
capabilities := NewSimpleCompositeValue(
92+
capabilities = NewSimpleCompositeValue(
7793
gauge,
7894
account_CapabilitiesTypeID,
7995
account_CapabilitiesStaticType,
80-
nil,
81-
nil,
96+
account_CapabilitiesFieldNames,
97+
fields,
8298
computeField,
8399
nil,
84100
stringer,
85101
)
86102

87-
capabilities.Fields = map[string]Value{
88-
sema.Account_CapabilitiesTypeGetFunctionName: getFunction(capabilities),
89-
sema.Account_CapabilitiesTypeBorrowFunctionName: borrowFunction(capabilities),
90-
sema.Account_CapabilitiesTypeExistsFunctionName: existsFunction(capabilities),
91-
sema.Account_CapabilitiesTypePublishFunctionName: publishFunction(capabilities),
92-
sema.Account_CapabilitiesTypeUnpublishFunctionName: unpublishFunction(capabilities),
93-
}
94-
95103
return capabilities
96104
}

interpreter/value_account_contracts.go

+33-18
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,42 @@ func NewAccountContractsValue(
4545
namesGetter ContractNamesGetter,
4646
) Value {
4747

48-
computeField := func(
49-
name string,
50-
interpreter *Interpreter,
51-
locationRange LocationRange,
52-
) Value {
48+
var accountContracts *SimpleCompositeValue
49+
50+
fields := map[string]Value{}
51+
52+
computeLazyStoredField := func(name string) Value {
5353
switch name {
54-
case sema.Account_ContractsTypeNamesFieldName:
55-
return namesGetter(interpreter, locationRange)
54+
case sema.Account_ContractsTypeAddFunctionName:
55+
return addFunction(accountContracts)
56+
case sema.Account_ContractsTypeGetFunctionName:
57+
return getFunction(accountContracts)
58+
case sema.Account_ContractsTypeBorrowFunctionName:
59+
return borrowFunction(accountContracts)
60+
case sema.Account_ContractsTypeRemoveFunctionName:
61+
return removeFunction(accountContracts)
62+
case sema.Account_ContractsTypeUpdateFunctionName:
63+
return updateFunction(accountContracts)
64+
case sema.Account_ContractsTypeTryUpdateFunctionName:
65+
return tryUpdateFunction(accountContracts)
5666
}
67+
5768
return nil
5869
}
5970

71+
computeField := func(name string, inter *Interpreter, locationRange LocationRange) Value {
72+
switch name {
73+
case sema.Account_ContractsTypeNamesFieldName:
74+
return namesGetter(inter, locationRange)
75+
}
76+
77+
field := computeLazyStoredField(name)
78+
if field != nil {
79+
fields[name] = field
80+
}
81+
return field
82+
}
83+
6084
var str string
6185
stringer := func(interpreter *Interpreter, seenReferences SeenReferences, locationRange LocationRange) string {
6286
if str == "" {
@@ -67,25 +91,16 @@ func NewAccountContractsValue(
6791
return str
6892
}
6993

70-
accountContracts := NewSimpleCompositeValue(
94+
accountContracts = NewSimpleCompositeValue(
7195
gauge,
7296
account_ContractsTypeID,
7397
account_ContractsStaticType,
7498
account_ContractsFieldNames,
75-
nil,
99+
fields,
76100
computeField,
77101
nil,
78102
stringer,
79103
)
80104

81-
accountContracts.Fields = map[string]Value{
82-
sema.Account_ContractsTypeAddFunctionName: addFunction(accountContracts),
83-
sema.Account_ContractsTypeGetFunctionName: getFunction(accountContracts),
84-
sema.Account_ContractsTypeBorrowFunctionName: borrowFunction(accountContracts),
85-
sema.Account_ContractsTypeRemoveFunctionName: removeFunction(accountContracts),
86-
sema.Account_ContractsTypeUpdateFunctionName: updateFunction(accountContracts),
87-
sema.Account_ContractsTypeTryUpdateFunctionName: tryUpdateFunction(accountContracts),
88-
}
89-
90105
return accountContracts
91106
}

interpreter/value_account_inbox.go

+30-10
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929

3030
var account_InboxTypeID = sema.Account_InboxType.ID()
3131
var account_InboxStaticType StaticType = PrimitiveStaticTypeAccount_Inbox
32+
var account_InboxFieldNames []string = nil
3233

3334
// NewAccountInboxValue constructs an Account.Inbox value.
3435
func NewAccountInboxValue(
@@ -39,6 +40,31 @@ func NewAccountInboxValue(
3940
claimFunction BoundFunctionGenerator,
4041
) Value {
4142

43+
var accountInbox *SimpleCompositeValue
44+
45+
fields := map[string]Value{}
46+
47+
computeLazyStoredField := func(name string) Value {
48+
switch name {
49+
case sema.Account_InboxTypePublishFunctionName:
50+
return publishFunction(accountInbox)
51+
case sema.Account_InboxTypeUnpublishFunctionName:
52+
return unpublishFunction(accountInbox)
53+
case sema.Account_InboxTypeClaimFunctionName:
54+
return claimFunction(accountInbox)
55+
}
56+
57+
return nil
58+
}
59+
60+
computeField := func(name string, _ *Interpreter, _ LocationRange) Value {
61+
field := computeLazyStoredField(name)
62+
if field != nil {
63+
fields[name] = field
64+
}
65+
return field
66+
}
67+
4268
var str string
4369
stringer := func(interpreter *Interpreter, seenReferences SeenReferences, locationRange LocationRange) string {
4470
if str == "" {
@@ -49,22 +75,16 @@ func NewAccountInboxValue(
4975
return str
5076
}
5177

52-
accountInbox := NewSimpleCompositeValue(
78+
accountInbox = NewSimpleCompositeValue(
5379
gauge,
5480
account_InboxTypeID,
5581
account_InboxStaticType,
56-
nil,
57-
nil,
58-
nil,
82+
account_InboxFieldNames,
83+
fields,
84+
computeField,
5985
nil,
6086
stringer,
6187
)
6288

63-
accountInbox.Fields = map[string]Value{
64-
sema.Account_InboxTypePublishFunctionName: publishFunction(accountInbox),
65-
sema.Account_InboxTypeUnpublishFunctionName: unpublishFunction(accountInbox),
66-
sema.Account_InboxTypeClaimFunctionName: claimFunction(accountInbox),
67-
}
68-
6989
return accountInbox
7090
}

0 commit comments

Comments
 (0)