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)))                                          | | ||||
| +---------------------------------------------+-----------------------------------------------------------------+ | ||||
| | *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 | ||||
| -------- | ||||
| @ -540,12 +550,19 @@ TBD | ||||
| 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:: | ||||
| 
 | ||||
|     TopLevelObject = 'object' '{' Code? ( Object | Data )* '}' | ||||
|     Object = 'object' StringLiteral '{' Code? ( Object | Data )* '}' | ||||
|     Code = 'code' Block | ||||
|     Data = 'data' StringLiteral HexLiteral | ||||
|     Data = 'data' StringLiteral ( HexLiteral | StringLiteral ) | ||||
|     HexLiteral = 'hex' ('"' ([0-9a-fA-F]{2})* '"' | '\'' ([0-9a-fA-F]{2})* '\'') | ||||
|     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. | ||||
|     // Every (other) named object or data section is serialized and | ||||
|     // 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 { | ||||
|             let size = datasize("runtime") | ||||
|             // first create "runtime.Contract2" | ||||
|             let size = datasize("runtime.Contract2") | ||||
|             let offset = allocate(size) | ||||
|             // This will turn into a memory->memory copy for eWASM and | ||||
|             // a codecopy for EVM | ||||
|             datacopy(dataoffset("runtime"), offset, size) | ||||
|             // this is a constructor and the runtime code is returned | ||||
|             datacopy(offset, dataoffset("runtime.Contract2"), size) | ||||
|             // 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) | ||||
|         } | ||||
| 
 | ||||
| @ -579,7 +610,7 @@ An example Yul Object is shown below: | ||||
|                 let offset = allocate(size) | ||||
|                 // This will turn into a memory->memory copy for eWASM and | ||||
|                 // a codecopy for EVM | ||||
|                 datacopy(dataoffset("Contract2"), offset, size) | ||||
|                 datacopy(offset, dataoffset("Contract2"), size) | ||||
|                 // constructor parameter is a single number 0x1234 | ||||
|                 mstore(add(offset, size), 0x1234) | ||||
|                 create(offset, add(size, 32)) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user