diff --git a/packages/arb-avm-cpp/cmachine/arbcore.go b/packages/arb-avm-cpp/cmachine/arbcore.go index 866244a239..b62b30b8c6 100644 --- a/packages/arb-avm-cpp/cmachine/arbcore.go +++ b/packages/arb-avm-cpp/cmachine/arbcore.go @@ -90,28 +90,24 @@ func (ac *ArbCore) PrintCoreThreadBacktrace() { C.arbCorePrintCoreThreadBacktrace(ac.c) } +// Note: the slices field of the returned struct needs manually freed by C.free func sequencerBatchItemsToByteSliceArray(batchItems []inbox.SequencerBatchItem) C.struct_ByteSliceArrayStruct { return bytesArrayToByteSliceArray(encodeSequencerBatchItems(batchItems)) } +// Note: the slices field of the returned struct needs manually freed by C.free func delayedMessagesToByteSliceArray(delayedMessages []inbox.DelayedMessage) C.struct_ByteSliceArrayStruct { return bytesArrayToByteSliceArray(encodeDelayedMessages(delayedMessages)) } -func u256ArrayToByteSliceArray(nums []*big.Int) C.struct_ByteSliceArrayStruct { - var data [][]byte - for _, num := range nums { - data = append(data, math.U256Bytes(num)) - } - return bytesArrayToByteSliceArray(data) -} - func (ac *ArbCore) DeliverMessages(previousMessageCount *big.Int, previousSeqBatchAcc common.Hash, seqBatchItems []inbox.SequencerBatchItem, delayedMessages []inbox.DelayedMessage, reorgSeqBatchItemCount *big.Int) bool { defer runtime.KeepAlive(ac) previousMessageCountPtr := unsafeDataPointer(math.U256Bytes(previousMessageCount)) previousSeqBatchAccPtr := unsafeDataPointer(previousSeqBatchAcc.Bytes()) seqBatchItemsSlice := sequencerBatchItemsToByteSliceArray(seqBatchItems) + defer C.free(seqBatchItemsSlice.slices) delayedMessagesSlice := delayedMessagesToByteSliceArray(delayedMessages) + defer C.free(delayedMessagesSlice.slices) var cReorgSeqBatchItemCount unsafe.Pointer if reorgSeqBatchItemCount != nil { diff --git a/packages/arb-avm-cpp/cmachine/machine.go b/packages/arb-avm-cpp/cmachine/machine.go index 9752ed3505..d5d26acf40 100644 --- a/packages/arb-avm-cpp/cmachine/machine.go +++ b/packages/arb-avm-cpp/cmachine/machine.go @@ -171,6 +171,7 @@ func (m *Machine) ExecuteAssertion( ) } +// Note: the slices field of the returned struct needs manually freed by C.free func bytesArrayToByteSliceArray(bytes [][]byte) C.struct_ByteSliceArrayStruct { byteSlices := encodeByteSliceList(bytes) sliceArrayData := C.malloc(C.size_t(C.sizeof_struct_ByteSliceStruct * len(byteSlices))) @@ -190,6 +191,7 @@ func (m *Machine) ExecuteAssertionAdvanced( ) (*protocol.ExecutionAssertion, []value.Value, uint64, error) { defer runtime.KeepAlive(m) conf := C.machineExecutionConfigCreate() + defer C.machineExecutionConfigDestroy(conf) C.machineExecutionConfigSetMaxGas(conf, C.uint64_t(maxGas), boolToCInt(goOverGas)) @@ -197,8 +199,6 @@ func (m *Machine) ExecuteAssertionAdvanced( defer C.free(msgData.slices) C.machineExecutionConfigSetInboxMessages(conf, msgData) - C.machineExecutionConfigSetInboxMessages(conf, msgData) - sideloadsData := bytesArrayToByteSliceArray(encodeInboxMessages(sideloads)) defer C.free(sideloadsData.slices) C.machineExecutionConfigSetSideloads(conf, sideloadsData)