PassByConstruction
From Erights
m (→Example) |
Kevin Reid (Talk | contribs) (terminology, more links) |
||
| Line 1: | Line 1: | ||
| - | When objects are transfered to another [[vat]], they arrive as | + | When objects are transfered to another [[vat]], they arrive as [[far reference|far references]] by default. To reconstruct the object as a [[near reference]] in the receiving vat, Pass By Construction (pbc) can be used. |
| - | To mark an object as pbc, it has to | + | |
| + | To mark an object as pbc, it has to be approved by the <code>pbc</code> auditor: | ||
<code> | <code> | ||
def foo implements pbc { | def foo implements pbc { | ||
| - | to __optUncall() { return [1, "add", [2]] } | + | to [[Miranda optUncall|__optUncall]]() { return [1, "add", [2]] } |
# ... | # ... | ||
} | } | ||
</code> | </code> | ||
| - | + | __optUncall is a [[miranda message]]. When the object is sent out of the [[current vat]], __optUncall/0 is called by the [[comm system]], and the result of the call is used as the structure to represent the object to the destination [[vat]]. | |
| - | The triple returned by __optUncall has this format: | + | The triple returned by __optUncall, a '''portrayal''', has this format: |
<pre> | <pre> | ||
| - | [ | + | [<var>recipient</var> :[[near]], <var>verb</var> :[[String]], <var>args</var> :[[List]]] |
</pre> | </pre> | ||
| - | + | which together specify a call to perform in the receiving vat; the object is unserialized as the result of this call. | |
| - | + | ||
==Example== | ==Example== | ||
Revision as of 13:44, 21 April 2007
When objects are transfered to another vat, they arrive as far references by default. To reconstruct the object as a near reference in the receiving vat, Pass By Construction (pbc) can be used.
To mark an object as pbc, it has to be approved by the pbc auditor:
def foo implements pbc {
to __optUncall() { return [1, "add", [2]] }
# ...
}
__optUncall is a miranda message. When the object is sent out of the current vat, __optUncall/0 is called by the comm system, and the result of the call is used as the structure to represent the object to the destination vat.
The triple returned by __optUncall, a portrayal, has this format:
[<var>recipient</var> :[[near]], <var>verb</var> :[[String]], <var>args</var> :[[List]]]
which together specify a call to perform in the receiving vat; the object is unserialized as the result of this call.
Example
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc. This code should be positioned in a file in the java classpath at the location "tests/makeVector.emaker"
def makeVector implements pbc {
to run(var x, var y) {
def vector implements pbc {
to getX() :any { return x }
to getY() :any { return y }
to __optUncall() :any { return [makeVector, "run", [x,y]] }
to __printOn(out) {out.print(`<Vector $x $y>`)}
}
return vector
}
to __optUncall() :any {
return [<import>, "get", ["tests.makeVector"]]
}
}
Example of usage:
# create a new Vector object
? def makeVector := <import:tests.makeVector>
# value: <makeVector>
? def vector := makeVector(6.6,7.7)
# value: <Vector 6.6 7.7>
? introducer.onTheAir()
# value: ["3DES_SDH_M2", "3DES_SDH_M"]
# function for creating a new local vat
? def seedVatAuthor := <elang:interp.seedVatAuthor>(<unsafe>).virtualize(introducer)
# value: <virtualSeedVat>
# Run this source code in the new vat. The method accepts a pbc object and prints it.
? def scriptSource:="def run(thing :pbc) {println(`Thing: $thing`)}"
# value: "def run(thing :near) {println(`Thing: $thing`)}"
# create the new vat. Return a far reference to the object and a reference to the vat object
? def [scriptObj, vat] := seedVatAuthor(scriptSource)
# value: [<Promise>, <Vat newVirtualSeedVat in <runs in newVirtualSeedVat>>]
# pass the pbc object into the new vat
? scriptObj <- run(vector)
# value: <Remote Promise>
? Thing: <Vector 6.6 7.7>

