forked from RareSkills/Udemy-Yul-Code
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Video-07-09-Memory-Operations.sol
151 lines (133 loc) · 3.4 KB
/
Video-07-09-Memory-Operations.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.17;
contract Memory {
struct Point {
uint256 x;
uint256 y;
}
event MemoryPointer(bytes32);
event MemoryPointerMsize(bytes32, bytes32);
function highAccess() external pure {
assembly {
// pop just throws away the return value
pop(mload(0xffffffffffffffff))
}
}
function mstore8() external pure {
assembly {
mstore8(0x00, 7)
mstore(0x00, 7)
}
}
function memPointer() external {
bytes32 x40;
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
Point memory p = Point({x: 1, y: 2});
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
}
function memPointerV2() external {
bytes32 x40;
bytes32 _msize;
assembly {
x40 := mload(0x40)
_msize := msize()
}
emit MemoryPointerMsize(x40, _msize);
Point memory p = Point({x: 1, y: 2});
assembly {
x40 := mload(0x40)
_msize := msize()
}
emit MemoryPointerMsize(x40, _msize);
assembly {
pop(mload(0xff))
x40 := mload(0x40)
_msize := msize()
}
emit MemoryPointerMsize(x40, _msize);
}
function fixedArray() external {
bytes32 x40;
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
uint256[2] memory arr = [uint256(5), uint256(6)];
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
}
function abiEncode() external {
bytes32 x40;
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
abi.encode(uint256(5), uint256(19));
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
}
function abiEncode2() external {
bytes32 x40;
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
abi.encode(uint256(5), uint128(19));
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
}
function abiEncodePacked() external {
bytes32 x40;
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
abi.encodePacked(uint256(5), uint128(19));
assembly {
x40 := mload(0x40)
}
emit MemoryPointer(x40);
}
event Debug(bytes32, bytes32, bytes32, bytes32);
function args(uint256[] memory arr) external {
bytes32 location;
bytes32 len;
bytes32 valueAtIndex0;
bytes32 valueAtIndex1;
assembly {
location := arr
len := mload(arr)
valueAtIndex0 := mload(add(arr, 0x20))
valueAtIndex1 := mload(add(arr, 0x40))
// ...
}
emit Debug(location, len, valueAtIndex0, valueAtIndex1);
}
function breakFreeMemoryPointer(uint256[1] memory foo)
external
view
returns (uint256)
{
assembly {
mstore(0x40, 0x80)
}
uint256[1] memory bar = [uint256(6)];
return foo[0];
}
uint8[] foo = [1, 2, 3, 4, 5, 6];
function unpacked() external {
uint8[] memory bar = foo;
}
}