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}