@@ -213,6 +213,7 @@ definitions via the `cx` parameter:
213
213
class Context :
214
214
opts: CanonicalOptions
215
215
inst: ComponentInstance
216
+ called_as_export: bool
216
217
```
217
218
218
219
The ` opts ` field represents the [ ` canonopt ` ] values supplied to
@@ -238,6 +239,11 @@ class ComponentInstance:
238
239
# ...
239
240
```
240
241
242
+ Lastly, the ` called_as_export ` field indicates whether the lifted function is
243
+ being called through a component export or whether this is an internal call,
244
+ (for example, when a child component calls an import that is defined by its
245
+ parent component).
246
+
241
247
242
248
### Loading
243
249
@@ -1206,29 +1212,29 @@ component*.
1206
1212
1207
1213
Given the above closure arguments, ` canon_lift ` is defined:
1208
1214
``` python
1209
- def canon_lift (callee_cx , callee , ft , args , called_as_export ):
1210
- if called_as_export:
1211
- trap_if(not callee_cx .inst.may_enter)
1212
- callee_cx .inst.may_enter = False
1215
+ def canon_lift (cx , callee , ft , args ):
1216
+ if cx. called_as_export:
1217
+ trap_if(not cx .inst.may_enter)
1218
+ cx .inst.may_enter = False
1213
1219
else :
1214
- assert (not callee_cx .inst.may_enter)
1220
+ assert (not cx .inst.may_enter)
1215
1221
1216
- assert (callee_cx .inst.may_leave)
1217
- callee_cx .inst.may_leave = False
1218
- flat_args = lower_values(callee_cx , MAX_FLAT_PARAMS , args, ft.param_types())
1219
- callee_cx .inst.may_leave = True
1222
+ assert (cx .inst.may_leave)
1223
+ cx .inst.may_leave = False
1224
+ flat_args = lower_values(cx , MAX_FLAT_PARAMS , args, ft.param_types())
1225
+ cx .inst.may_leave = True
1220
1226
1221
1227
try :
1222
1228
flat_results = callee(flat_args)
1223
1229
except CoreWebAssemblyException:
1224
1230
trap()
1225
1231
1226
- results = lift_values(callee_cx , MAX_FLAT_RESULTS , ValueIter(flat_results), ft.result_types())
1232
+ results = lift_values(cx , MAX_FLAT_RESULTS , ValueIter(flat_results), ft.result_types())
1227
1233
def post_return ():
1228
- if callee_cx .opts.post_return is not None :
1229
- callee_cx .opts.post_return(flat_results)
1230
- if called_as_export:
1231
- callee_cx .inst.may_enter = True
1234
+ if cx .opts.post_return is not None :
1235
+ cx .opts.post_return(flat_results)
1236
+ if cx. called_as_export:
1237
+ cx .inst.may_enter = True
1232
1238
1233
1239
return (results, post_return)
1234
1240
```
@@ -1239,15 +1245,13 @@ boundaries. Thus, if a component wishes to signal an error, it must use some
1239
1245
sort of explicit type such as ` result ` (whose ` error ` case particular language
1240
1246
bindings may choose to map to and from exceptions).
1241
1247
1242
- The ` called_as_export ` parameter indicates whether ` canon_lift ` is being called
1243
- as part of a component export or whether this ` canon_lift ` is being called
1244
- internally (for example, by a child component instance). By clearing
1245
- ` may_enter ` for the duration of ` canon_lift ` when called as an export, the
1246
- dynamic traps ensure that components cannot be reentered, which is a [ component
1247
- invariant] . Furthermore, because ` may_enter ` is not cleared on the exceptional
1248
- exit path taken by ` trap() ` , if there is a trap during Core WebAssembly
1249
- execution or lifting/lowering, the component is left permanently un-enterable,
1250
- ensuring the lockdown-after-trap [ component invariant] .
1248
+ By clearing ` may_enter ` for the duration of ` canon_lift ` when the function is
1249
+ called as an export, the dynamic traps ensure that components cannot be
1250
+ reentered, ensuring the non-reentrance [ component invariant] . Furthermore,
1251
+ because ` may_enter ` is not cleared on the exceptional exit path taken by
1252
+ ` trap() ` , if there is a trap during Core WebAssembly execution of lifting or
1253
+ lowering, the component is left permanently un-enterable, ensuring the
1254
+ lockdown-after-trap [ component invariant] .
1251
1255
1252
1256
The contract assumed by ` canon_lift ` (and ensured by ` canon_lower ` below) is
1253
1257
that the caller of ` canon_lift ` * must* call ` post_return ` right after lowering
@@ -1274,17 +1278,17 @@ Thus, from the perspective of Core WebAssembly, `$f` is a [function instance]
1274
1278
containing a ` hostfunc ` that closes over ` $opts ` , ` $inst ` , ` $callee ` and ` $ft `
1275
1279
and, when called from Core WebAssembly code, calls ` canon_lower ` , which is defined as:
1276
1280
``` python
1277
- def canon_lower (caller_cx , callee , ft , flat_args ):
1278
- trap_if(not caller_cx .inst.may_leave)
1281
+ def canon_lower (cx , callee , ft , flat_args ):
1282
+ trap_if(not cx .inst.may_leave)
1279
1283
1280
1284
flat_args = ValueIter(flat_args)
1281
- args = lift_values(caller_cx , MAX_FLAT_PARAMS , flat_args, ft.param_types())
1285
+ args = lift_values(cx , MAX_FLAT_PARAMS , flat_args, ft.param_types())
1282
1286
1283
1287
results, post_return = callee(args)
1284
1288
1285
- caller_cx .inst.may_leave = False
1286
- flat_results = lower_values(caller_cx , MAX_FLAT_RESULTS , results, ft.result_types(), flat_args)
1287
- caller_cx .inst.may_leave = True
1289
+ cx .inst.may_leave = False
1290
+ flat_results = lower_values(cx , MAX_FLAT_RESULTS , results, ft.result_types(), flat_args)
1291
+ cx .inst.may_leave = True
1288
1292
1289
1293
post_return()
1290
1294
0 commit comments