@@ -210,31 +210,39 @@ The subsequent definitions of loading and storing a value from linear memory
210210require additional context, which is threaded through most subsequent
211211definitions via the ` cx `  parameter:
212212``` python 
213+ class  Context :
214+   opts: CanonicalOptions
215+   inst: ComponentInstance
216+   called_as_export: bool 
217+ ``` 
218+ 
219+ The ` opts `  field represents the [ ` canonopt ` ]  values supplied to
220+ currently-executing ` canon lift `  or ` canon lower ` :
221+ ``` python 
213222class  CanonicalOptions :
214223  memory: bytearray 
215224  string_encoding: str 
216225  realloc: Callable[[int ,int ,int ,int ],int ]
217226  post_return: Callable[[],None ]
227+ ``` 
218228
229+ The ` inst `  field represents the component instance that the currently-executing
230+ canonical definition is defined to execute inside. The ` may_enter `  and
231+ ` may_leave `  fields are used to enforce the [ component invariants] : ` may_leave ` 
232+ indicates whether the instance may call out to an import and the ` may_enter ` 
233+ state indicates whether the instance may be called from the outside world
234+ through an export.
235+ ``` python 
219236class  ComponentInstance :
220237  may_leave =  True 
221238  may_enter =  True 
222239  #  ...
223- 
224- class  Context :
225-   opts: CanonicalOptions
226-   inst: ComponentInstance
227240``` 
228- Going through the fields of ` Context ` :
229- 
230- The ` opts `  field represents the [ ` canonopt ` ]  values supplied to
231- currently-executing ` canon lift `  or ` canon lower ` .
232241
233- The ` inst `  field represents the component instance that the currently-executing
234- canonical definition is closed over. The ` may_enter `  and ` may_leave `  fields are
235- used to enforce the [ component invariants] : ` may_leave `  indicates whether the
236- instance may call out to an import and the ` may_enter `  state indicates whether
237- the instance may be called from the outside world through an export.
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).
238246
239247
240248### Loading  
@@ -1204,29 +1212,29 @@ component*.
12041212
12051213Given the above closure arguments, ` canon_lift `  is defined:
12061214``` python 
1207- def  canon_lift (callee_cx , callee , ft , args ,  called_as_export ):
1208-   if  called_as_export:
1209-     trap_if(not  callee_cx .inst.may_enter)
1210-     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 
12111219  else :
1212-     assert (not  callee_cx .inst.may_enter)
1220+     assert (not  cx .inst.may_enter)
12131221
1214-   assert (callee_cx .inst.may_leave)
1215-   callee_cx .inst.may_leave =  False 
1216-   flat_args =  lower_values(callee_cx , MAX_FLAT_PARAMS , args, ft.param_types())
1217-   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 
12181226
12191227  try :
12201228    flat_results =  callee(flat_args)
12211229  except  CoreWebAssemblyException:
12221230    trap()
12231231
1224-   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())
12251233  def  post_return ():
1226-     if  callee_cx .opts.post_return is  not  None :
1227-       callee_cx .opts.post_return(flat_results)
1228-     if  called_as_export:
1229-       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 
12301238
12311239  return  (results, post_return)
12321240``` 
@@ -1237,15 +1245,13 @@ boundaries. Thus, if a component wishes to signal an error, it must use some
12371245sort of explicit type such as ` result `  (whose ` error `  case particular language
12381246bindings may choose to map to and from exceptions).
12391247
1240- The ` called_as_export `  parameter indicates whether ` canon_lift `  is being called
1241- as part of a component export or whether this ` canon_lift `  is being called
1242- internally (for example, by a child component instance). By clearing
1243- ` may_enter `  for the duration of ` canon_lift `  when called as an export, the
1244- dynamic traps ensure that components cannot be reentered, which is a [ component
1245- invariant] . Furthermore, because ` may_enter `  is not cleared on the exceptional
1246- exit path taken by ` trap() ` , if there is a trap during Core WebAssembly
1247- execution or lifting/lowering, the component is left permanently un-enterable,
1248- 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] .
12491255
12501256The contract assumed by ` canon_lift `  (and ensured by ` canon_lower `  below) is
12511257that the caller of ` canon_lift `  * must*  call ` post_return `  right after lowering
@@ -1272,17 +1278,17 @@ Thus, from the perspective of Core WebAssembly, `$f` is a [function instance]
12721278containing a ` hostfunc `  that closes over ` $opts ` , ` $inst ` , ` $callee `  and ` $ft ` 
12731279and, when called from Core WebAssembly code, calls ` canon_lower ` , which is defined as:
12741280``` python 
1275- def  canon_lower (caller_cx , callee , ft , flat_args ):
1276-   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)
12771283
12781284  flat_args =  ValueIter(flat_args)
1279-   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())
12801286
12811287  results, post_return =  callee(args)
12821288
1283-   caller_cx .inst.may_leave =  False 
1284-   flat_results =  lower_values(caller_cx , MAX_FLAT_RESULTS , results, ft.result_types(), flat_args)
1285-   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 
12861292
12871293  post_return()
12881294
0 commit comments