浏览代码

updated linear approach to reading large data

Ayush Suresh 3 月之前
父节点
当前提交
a925700918
共有 1 个文件被更改,包括 7 次插入19 次删除
  1. 7 19
      target_chains/ton/contracts/contracts/common/utils.fc

+ 7 - 19
target_chains/ton/contracts/contracts/common/utils.fc

@@ -55,9 +55,11 @@ Note:
 -}
 -}
 (cell, slice) read_and_store_large_data(slice in_msg_body, int size) {
 (cell, slice) read_and_store_large_data(slice in_msg_body, int size) {
     cell chunks = null();
     cell chunks = null();
+    cell first_chunk = chunks;
+    cell next_chunk = begin_cell();
     int total_bits_loaded = 0;
     int total_bits_loaded = 0;
     builder current_builder = begin_cell();
     builder current_builder = begin_cell();
-    
+
     while ((~ in_msg_body.slice_empty?()) & (total_bits_loaded < size)) {
     while ((~ in_msg_body.slice_empty?()) & (total_bits_loaded < size)) {
         int bits_to_load = min(min(in_msg_body.slice_bits(), MAX_BITS - current_builder.builder_bits()), size - total_bits_loaded);
         int bits_to_load = min(min(in_msg_body.slice_bits(), MAX_BITS - current_builder.builder_bits()), size - total_bits_loaded);
         current_builder = current_builder.store_slice(in_msg_body~load_bits(bits_to_load));
         current_builder = current_builder.store_slice(in_msg_body~load_bits(bits_to_load));
@@ -70,9 +72,11 @@ Note:
             if (cell_null?(chunks)) {
             if (cell_null?(chunks)) {
                 chunks = current_chunk;
                 chunks = current_chunk;
             } else {
             } else {
-                chunks = begin_cell().store_slice(current_chunk.begin_parse()).store_ref(chunks).end_cell();
+                chunks = begin_cell().store_slice(current_chunk.begin_parse()).store_ref(next_chunk).end_cell();
             }
             }
             
             
+            chunks = next_chunk;
+            next_chunk = begin_cell();
             current_builder = begin_cell();
             current_builder = begin_cell();
         }
         }
         
         
@@ -81,23 +85,7 @@ Note:
         }
         }
     }
     }
     
     
-    ;; Now reverse the chunks to get correct order - this is still one reversal instead of two
-    cell final_result = null();
-    while (~ cell_null?(chunks)) {
-        slice chunk = chunks.begin_parse();
-        builder cb = begin_cell().store_slice(chunk~load_bits(chunk.slice_bits()));
-        if (~ cell_null?(final_result)) {
-            cb = cb.store_ref(final_result);
-        }
-        final_result = cb.end_cell();
-        if (chunk.slice_refs_empty?()) {
-            chunks = null();
-        } else {
-            chunks = chunk~load_ref();
-        }
-    }
-    
-    return (final_result, in_msg_body);
+    return (first_chunk, in_msg_body);
 }
 }
 
 
 (int) pubkey_to_eth_address(int x1, int x2) {
 (int) pubkey_to_eth_address(int x1, int x2) {