refactor(compress): move stream result policy to Rust

Move the post-call ZSTD_compressStream2_c policy into Rust: adapter errors now short-circuit before buffer publication, successful calls publish buffer expectations before calculating pending output, and the private C context remains behind a callback projection. Add ABI assertions and ordering tests for both paths.

Test Plan: git diff --cached --check; focused Rust tests added; full capped Rust/native/original-suite verification will run after the MT slice is integrated.
This commit is contained in:
2026-07-21 07:15:23 +02:00
parent 8ae0dfa49d
commit fc9aeee92b
2 changed files with 220 additions and 4 deletions
+67 -4
View File
@@ -774,6 +774,43 @@ size_t ZSTD_compressStream2_c(ZSTD_CCtx* cctx,
ZSTD_outBuffer* output,
ZSTD_inBuffer* input,
ZSTD_EndDirective endOp);
typedef void (*ZSTD_rust_compressStream2SetBufferExpectations_f)(
void* context, const void* output, const void* input);
typedef struct {
void* callbackContext;
ZSTD_rust_compressStream2SetBufferExpectations_f setBufferExpectations;
const void* output;
const void* input;
size_t compressResult;
size_t outBuffContentSize;
size_t outBuffFlushedSize;
} ZSTD_rust_compressStream2ResultPolicyState;
size_t ZSTD_rust_compressStream2ResultPolicy(
const ZSTD_rust_compressStream2ResultPolicyState* state);
typedef char ZSTD_rust_compress_stream2_result_policy_state_layout[
(offsetof(ZSTD_rust_compressStream2ResultPolicyState, callbackContext)
== 0
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
setBufferExpectations)
== sizeof(void*)
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState, output)
== 2 * sizeof(void*)
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState, input)
== 3 * sizeof(void*)
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
compressResult)
== 4 * sizeof(void*)
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
outBuffContentSize)
== 5 * sizeof(void*)
&& offsetof(ZSTD_rust_compressStream2ResultPolicyState,
outBuffFlushedSize)
== 6 * sizeof(void*)
&& sizeof(ZSTD_rust_compressStream2SetBufferExpectations_f)
== sizeof(void*)
&& sizeof(ZSTD_rust_compressStream2ResultPolicyState)
== 7 * sizeof(void*))
? 1 : -1];
typedef struct {
size_t outputPos;
size_t outputSize;
@@ -8005,6 +8042,15 @@ ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, const ZSTD_outBuffer* output, const
input);
}
static void ZSTD_rust_compressStream2_setBufferExpectations(
void* context, const void* output, const void* input)
{
ZSTD_setBufferExpectations(
(ZSTD_CCtx*)context,
(const ZSTD_outBuffer*)output,
(const ZSTD_inBuffer*)input);
}
/* Validate that the input/output buffers match the expectations set by
* ZSTD_setBufferExpectations.
*/
@@ -8529,10 +8575,27 @@ size_t ZSTD_compressStream2_c( ZSTD_CCtx* cctx,
return flushMin;
}
#endif /* ZSTD_MULTITHREAD */
FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) , "");
DEBUGLOG(5, "completed ZSTD_compressStream2");
ZSTD_setBufferExpectations(cctx, output, input);
return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */
{ size_t const compressResult =
ZSTD_compressStream_generic(cctx, output, input, endOp);
if (!ERR_isError(compressResult)) {
DEBUGLOG(5, "completed ZSTD_compressStream2");
}
{ ZSTD_rust_compressStream2ResultPolicyState const state = {
cctx,
ZSTD_rust_compressStream2_setBufferExpectations,
output,
input,
compressResult,
cctx->outBuffContentSize,
cctx->outBuffFlushedSize
};
{ size_t const policyResult =
ZSTD_rust_compressStream2ResultPolicy(&state);
FORWARD_IF_ERROR(policyResult, "");
return policyResult;
}
}
}
}
size_t ZSTD_compressStream2_simpleArgs (