@@ -24,11 +24,11 @@ library TreeNodeCbor {
2424 CidCbor.CidIndex t; // tree
2525 }
2626
27- function readNodeE (bytes memory cborData , uint byteIdx ) internal pure returns (TreeNodeE[] memory ret , uint ) {
27+ function readNodeE (bytes memory cborData , uint byteIdx ) internal pure returns (TreeNodeE[] memory , uint ) {
2828 uint arrayLen;
2929 (arrayLen, byteIdx) = cborData.readFixedArray (byteIdx);
3030
31- ret = new TreeNodeE [](arrayLen);
31+ TreeNodeE[] memory ret = new TreeNodeE [](arrayLen);
3232 for (uint i = 0 ; i < arrayLen; i++ ) {
3333 (ret[i], byteIdx) = readE (cborData, byteIdx);
3434 }
@@ -58,28 +58,25 @@ library TreeNodeCbor {
5858 (t, byteIdx) = CidCbor.readNullableCidIndex (cborData, byteIdx);
5959 } else if (mapKey == "v " ) {
6060 (v, byteIdx) = CidCbor.readNullableCidIndex (cborData, byteIdx);
61+ } else {
62+ revert ("unexpected node entry field " );
6163 }
6264 }
6365
6466 return (TreeNodeE (p, k, v, t), byteIdx);
6567 }
6668
6769 function buildEntryKeys (TreeNodeE[] memory e ) internal pure returns (TreeNodeEntry[] memory ) {
68- return buildEntryKeys_assembly (e);
69- }
70-
71- function buildEntryKeys_assembly (TreeNodeE[] memory e ) internal pure returns (TreeNodeEntry[] memory ) {
7270 TreeNodeEntry[] memory entries = new TreeNodeEntry [](e.length );
7371 bytes memory previousKey = new bytes (0 );
7472 for (uint i = 0 ; i < e.length ; i++ ) {
7573 uint8 p = e[i].p;
7674 bytes memory k = e[i].k;
7775 bytes memory key = new bytes (p + k.length );
78- //console.log("i=%s", i);
79- //console.log("before assembly p=%s k.length=%s key.length=%s", p, k.length, key.length);
8076 // Calculate number of words needed
8177 uint pWords = (p + 31 ) / 32 ; // ceil(p/32)
8278 uint kWords = (k.length + 31 ) / 32 ; // ceil(k.length/32)
79+ // init loop variable
8380 uint j;
8481
8582 assembly {
@@ -91,26 +88,6 @@ library TreeNodeCbor {
9188 mstore (add (add (key, 0x20 ), add (p, mul (j, 32 ))), mload (add (k, add (0x20 , mul (j, 32 )))))
9289 }
9390 }
94- //console.log("after assembly key=%s key.length=%s", string(key), key.length);
95- entries[i] = TreeNodeEntry (string (key), e[i].v, e[i].t);
96- previousKey = key;
97- }
98- return entries;
99- }
100-
101- function buildEntryKeys_loop (TreeNodeE[] memory e ) internal pure returns (TreeNodeEntry[] memory ) {
102- TreeNodeEntry[] memory entries = new TreeNodeEntry [](e.length );
103- bytes memory previousKey = new bytes (0 );
104- for (uint i = 0 ; i < e.length ; i++ ) {
105- uint8 p = e[i].p;
106- bytes memory k = e[i].k;
107- bytes memory key = new bytes (p + k.length );
108- for (uint j = 0 ; j < p; j++ ) {
109- key[j] = previousKey[j];
110- }
111- for (uint j = p; j < p + k.length ; j++ ) {
112- key[j] = k[j - p];
113- }
11491 entries[i] = TreeNodeEntry (string (key), e[i].v, e[i].t);
11592 previousKey = key;
11693 }
@@ -130,6 +107,8 @@ library TreeNodeCbor {
130107 TreeNodeE[] memory e;
131108 (e, byteIdx) = readNodeE (cborData, byteIdx);
132109 node.entries = buildEntryKeys (e);
110+ } else {
111+ revert ("unexpected node field " );
133112 }
134113 }
135114 return (node, byteIdx);
0 commit comments