mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Small changes to yul object specification.
This commit is contained in:
parent
aaa50189a9
commit
5783ebb93d
43
docs/yul.rst
43
docs/yul.rst
@ -515,6 +515,16 @@ The following functions must be available:
|
|||||||
+---------------------------------------------+-----------------------------------------------------------------+
|
+---------------------------------------------+-----------------------------------------------------------------+
|
||||||
| keccak256(p:u256, s:u256) -> v:u256 | keccak(mem[p...(p+s))) |
|
| keccak256(p:u256, s:u256) -> v:u256 | keccak(mem[p...(p+s))) |
|
||||||
+---------------------------------------------+-----------------------------------------------------------------+
|
+---------------------------------------------+-----------------------------------------------------------------+
|
||||||
|
| *Object access* | |
|
||||||
|
+---------------------------------------------+-----------------------------------------------------------------+
|
||||||
|
| datasize(name:string) -> size:u256 | size of the data object in bytes, name has to be string literal |
|
||||||
|
+---------------------------------------------+-----------------------------------------------------------------+
|
||||||
|
| dataoffset(name:string) -> offset:u256 | offset of the data object inside the data area in bytes, |
|
||||||
|
| | name has to be string literal |
|
||||||
|
+---------------------------------------------+-----------------------------------------------------------------+
|
||||||
|
| datacopy(dst:u256, src:u256, len:u256) | copy len bytes from the data area starting at offset src bytes |
|
||||||
|
| | to memory at position dst |
|
||||||
|
+---------------------------------------------+-----------------------------------------------------------------+
|
||||||
|
|
||||||
Backends
|
Backends
|
||||||
--------
|
--------
|
||||||
@ -540,12 +550,19 @@ TBD
|
|||||||
Specification of Yul Object
|
Specification of Yul Object
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
Yul objects are used to group named code and data sections.
|
||||||
|
The functions ``datasize``, ``dataoffset`` and ``datacopy``
|
||||||
|
can be used to access these sections from within code.
|
||||||
|
Hex strings can be used to specify data in hex encoding,
|
||||||
|
regular strings in native encoding. For code,
|
||||||
|
``datacopy`` will access its assembled binary representation.
|
||||||
|
|
||||||
Grammar::
|
Grammar::
|
||||||
|
|
||||||
TopLevelObject = 'object' '{' Code? ( Object | Data )* '}'
|
TopLevelObject = 'object' '{' Code? ( Object | Data )* '}'
|
||||||
Object = 'object' StringLiteral '{' Code? ( Object | Data )* '}'
|
Object = 'object' StringLiteral '{' Code? ( Object | Data )* '}'
|
||||||
Code = 'code' Block
|
Code = 'code' Block
|
||||||
Data = 'data' StringLiteral HexLiteral
|
Data = 'data' StringLiteral ( HexLiteral | StringLiteral )
|
||||||
HexLiteral = 'hex' ('"' ([0-9a-fA-F]{2})* '"' | '\'' ([0-9a-fA-F]{2})* '\'')
|
HexLiteral = 'hex' ('"' ([0-9a-fA-F]{2})* '"' | '\'' ([0-9a-fA-F]{2})* '\'')
|
||||||
StringLiteral = '"' ([^"\r\n\\] | '\\' .)* '"'
|
StringLiteral = '"' ([^"\r\n\\] | '\\' .)* '"'
|
||||||
|
|
||||||
@ -558,14 +575,28 @@ An example Yul Object is shown below:
|
|||||||
// Code consists of a single object. A single "code" node is the code of the object.
|
// Code consists of a single object. A single "code" node is the code of the object.
|
||||||
// Every (other) named object or data section is serialized and
|
// Every (other) named object or data section is serialized and
|
||||||
// made accessible to the special built-in functions datacopy / dataoffset / datasize
|
// made accessible to the special built-in functions datacopy / dataoffset / datasize
|
||||||
object {
|
// Access to nested objects can be performed by joining the names using ``.``.
|
||||||
|
// The current object and sub-objects and data items inside the current object
|
||||||
|
// are in scope without nested access.
|
||||||
|
object "Contract1" {
|
||||||
code {
|
code {
|
||||||
let size = datasize("runtime")
|
// first create "runtime.Contract2"
|
||||||
|
let size = datasize("runtime.Contract2")
|
||||||
let offset = allocate(size)
|
let offset = allocate(size)
|
||||||
// This will turn into a memory->memory copy for eWASM and
|
// This will turn into a memory->memory copy for eWASM and
|
||||||
// a codecopy for EVM
|
// a codecopy for EVM
|
||||||
datacopy(dataoffset("runtime"), offset, size)
|
datacopy(offset, dataoffset("runtime.Contract2"), size)
|
||||||
// this is a constructor and the runtime code is returned
|
// constructor parameter is a single number 0x1234
|
||||||
|
mstore(add(offset, size), 0x1234)
|
||||||
|
create(offset, add(size, 32))
|
||||||
|
|
||||||
|
// now return the runtime object (this is
|
||||||
|
// constructor code)
|
||||||
|
size := datasize("runtime")
|
||||||
|
offset := allocate(size)
|
||||||
|
// This will turn into a memory->memory copy for eWASM and
|
||||||
|
// a codecopy for EVM
|
||||||
|
datacopy(offset, dataoffset("runtime"), size)
|
||||||
return(offset, size)
|
return(offset, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,7 +610,7 @@ An example Yul Object is shown below:
|
|||||||
let offset = allocate(size)
|
let offset = allocate(size)
|
||||||
// This will turn into a memory->memory copy for eWASM and
|
// This will turn into a memory->memory copy for eWASM and
|
||||||
// a codecopy for EVM
|
// a codecopy for EVM
|
||||||
datacopy(dataoffset("Contract2"), offset, size)
|
datacopy(offset, dataoffset("Contract2"), size)
|
||||||
// constructor parameter is a single number 0x1234
|
// constructor parameter is a single number 0x1234
|
||||||
mstore(add(offset, size), 0x1234)
|
mstore(add(offset, size), 0x1234)
|
||||||
create(offset, add(size, 32))
|
create(offset, add(size, 32))
|
||||||
|
Loading…
Reference in New Issue
Block a user