crossrealm.gno
3.35 Kb ยท 180 lines
1package crossrealm
2
3import (
4 "std"
5
6 "gno.land/p/demo/ownable"
7 "gno.land/p/demo/tests/p_crossrealm"
8 "gno.land/p/demo/ufmt"
9)
10
11type LocalStruct struct {
12 A int
13}
14
15func (ls *LocalStruct) String() string {
16 return ufmt.Sprintf("LocalStruct{%d}", ls.A)
17}
18
19// local is saved locally in this realm
20var local *LocalStruct
21
22func init() {
23 local = &LocalStruct{A: 123}
24}
25
26// Make1 returns a local object wrapped by a p struct
27func Make1() *p_crossrealm.Container {
28 return &p_crossrealm.Container{
29 A: 1,
30 B: local,
31 }
32}
33
34type Fooer interface {
35 Foo(realm)
36 Bar()
37}
38
39var fooer Fooer
40
41func SetFooer(cur realm, f Fooer) Fooer {
42 fooer = f
43 return fooer
44}
45
46func GetFooer() Fooer {
47 return fooer
48}
49
50func CallFooerFooCur(cur realm) {
51 fooer.Foo(cur)
52}
53
54func CallFooerFooCross(cur realm) {
55 fooer.Foo(cross)
56}
57
58func CallFooerBar() {
59 fooer.Bar()
60}
61
62func CallFooerBarCrossing(cur realm) {
63 fooer.Bar()
64}
65
66type FooerGetter func() Fooer
67
68var fooerGetter FooerGetter
69
70func SetFooerGetter(cur realm, fg FooerGetter) FooerGetter {
71 fooerGetter = fg
72 return fg
73}
74
75func GetFooerGetter() FooerGetter {
76 return fooerGetter
77}
78
79func CallFooerGetterBar() {
80 fooerGetter().Bar()
81}
82
83func CallFooerGetterBarCrossing(cur realm) {
84 fooerGetter().Bar()
85}
86
87func CallFooerGetterFooCur(cur realm) {
88 fooerGetter().Foo(cur)
89}
90
91func CallFooerGetterFooCross(cur realm) {
92 fooerGetter().Foo(cross)
93}
94
95// This is a top function that does switch realms.
96func ExecCrossing(cur realm, cb func() string) string {
97 return cb()
98}
99
100// This is a top function that doesn't switch realms.
101func Exec(cb func() string) string {
102 return cb()
103}
104
105// ------------------------------------
106var Closure func()
107
108func SetClosure(cur realm, f func()) {
109 Closure = f
110}
111
112func ExecuteClosure(cur realm) {
113 Closure()
114}
115
116var Closure2 func(realm)
117
118func SetClosure2(cur realm, f func(realm)) {
119 Closure2 = f
120}
121func ExecuteClosureCross(cur realm) {
122 Closure2(cross)
123}
124
125// Closure -> FooUpdate
126func PrintRealms(cur realm) {
127 ufmt.Printf("current realm: %s\n", std.CurrentRealm())
128 ufmt.Printf("previous realm: %s\n", std.PreviousRealm())
129}
130
131// -------------------------------------------------
132var Object any
133
134func SetObject(cur realm, x any) {
135 Object = x
136}
137
138func GetObject() any {
139 return Object
140}
141
142func EntryPoint() (noCros *ownable.Ownable) {
143 println("crossrealm EntryPoint: " + std.PreviousRealm().PkgPath())
144 println("crossrealm EntryPoint: " + std.PreviousRealm().Address())
145 println()
146 return PrevRealmNoCrossing()
147}
148
149func EntryPointWithCrossing() (withCros *ownable.Ownable) {
150 return PrevRealmCrossing(cross)
151}
152
153func PrevRealmNoCrossing() *ownable.Ownable {
154 println("crossrealm PreviousRealm no crossing: " + std.PreviousRealm().PkgPath())
155 println("crossrealm PreviousRealm no crossing: " + std.PreviousRealm().Address())
156 return ownable.New()
157}
158
159func PrevRealmCrossing(cur realm) *ownable.Ownable {
160 println("crossrealm PreviousRealm with crossing: " + std.PreviousRealm().PkgPath())
161 println("crossrealm PreviousRealm with crossing: " + std.PreviousRealm().Address())
162 return ownable.New()
163}
164
165func CurRealmNoCrossing() std.Realm {
166 return std.CurrentRealm()
167}
168func CurRealmCrossing(cur realm) std.Realm {
169 return std.CurrentRealm()
170}
171
172// call the package that returns current realm
173func PkgCurRealmNoCrossing() std.Realm {
174 return p_crossrealm.CurrentRealm()
175}
176
177// call the package that returns current realm
178func PkgCurRealmCrossing(cur realm) std.Realm {
179 return std.CurrentRealm()
180}