1
1
// SPDX-License-Identifier: CC0-1.0
2
2
3
+ use core:: fmt;
3
4
use core:: marker:: PhantomData ;
4
5
use core:: mem:: ManuallyDrop ;
5
6
use core:: ptr:: NonNull ;
@@ -8,7 +9,7 @@ use core::ptr::NonNull;
8
9
pub use self :: alloc_only:: * ;
9
10
use crate :: ffi:: types:: { c_uint, c_void, AlignedType } ;
10
11
use crate :: ffi:: { self , CPtr } ;
11
- use crate :: { Error , Secp256k1 } ;
12
+ use crate :: Secp256k1 ;
12
13
13
14
#[ cfg( all( feature = "global-context" , feature = "std" ) ) ]
14
15
/// Module implementing a singleton pattern for a global `Secp256k1` context.
@@ -320,14 +321,31 @@ unsafe impl<'buf> PreallocatedContext<'buf> for AllPreallocated<'buf> {}
320
321
unsafe impl < ' buf > PreallocatedContext < ' buf > for SignOnlyPreallocated < ' buf > { }
321
322
unsafe impl < ' buf > PreallocatedContext < ' buf > for VerifyOnlyPreallocated < ' buf > { }
322
323
324
+ /// Not enough preallocated memory for the requested buffer size.
325
+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
326
+ #[ non_exhaustive]
327
+ #[ allow( missing_copy_implementations) ] // Don't implement Copy when we use non_exhaustive.
328
+ pub struct NotEnoughMemoryError ;
329
+
330
+ impl fmt:: Display for NotEnoughMemoryError {
331
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
332
+ f. write_str ( "not enough preallocated memory for the requested buffer size" )
333
+ }
334
+ }
335
+
336
+ #[ cfg( feature = "std" ) ]
337
+ impl std:: error:: Error for NotEnoughMemoryError { }
338
+
323
339
impl < ' buf , C : Context + PreallocatedContext < ' buf > > Secp256k1 < C > {
324
340
/// Lets you create a context with a preallocated buffer in a generic manner (sign/verify/all).
325
- pub fn preallocated_gen_new ( buf : & ' buf mut [ AlignedType ] ) -> Result < Secp256k1 < C > , Error > {
341
+ pub fn preallocated_gen_new (
342
+ buf : & ' buf mut [ AlignedType ] ,
343
+ ) -> Result < Secp256k1 < C > , NotEnoughMemoryError > {
326
344
#[ cfg( target_arch = "wasm32" ) ]
327
345
ffi:: types:: sanity_checks_for_wasm ( ) ;
328
346
329
347
if buf. len ( ) < Self :: preallocate_size_gen ( ) {
330
- return Err ( Error :: NotEnoughMemory ) ;
348
+ return Err ( NotEnoughMemoryError ) ;
331
349
}
332
350
// Safe because buf is not null since it is not empty.
333
351
let buf = unsafe { NonNull :: new_unchecked ( buf. as_mut_c_ptr ( ) as * mut c_void ) } ;
@@ -343,7 +361,7 @@ impl<'buf> Secp256k1<AllPreallocated<'buf>> {
343
361
/// Creates a new Secp256k1 context with all capabilities.
344
362
pub fn preallocated_new (
345
363
buf : & ' buf mut [ AlignedType ] ,
346
- ) -> Result < Secp256k1 < AllPreallocated < ' buf > > , Error > {
364
+ ) -> Result < Secp256k1 < AllPreallocated < ' buf > > , NotEnoughMemoryError > {
347
365
Secp256k1 :: preallocated_gen_new ( buf)
348
366
}
349
367
/// Uses the ffi `secp256k1_context_preallocated_size` to check the memory size needed for a context.
@@ -378,7 +396,7 @@ impl<'buf> Secp256k1<SignOnlyPreallocated<'buf>> {
378
396
/// Creates a new Secp256k1 context that can only be used for signing.
379
397
pub fn preallocated_signing_only (
380
398
buf : & ' buf mut [ AlignedType ] ,
381
- ) -> Result < Secp256k1 < SignOnlyPreallocated < ' buf > > , Error > {
399
+ ) -> Result < Secp256k1 < SignOnlyPreallocated < ' buf > > , NotEnoughMemoryError > {
382
400
Secp256k1 :: preallocated_gen_new ( buf)
383
401
}
384
402
@@ -402,7 +420,7 @@ impl<'buf> Secp256k1<VerifyOnlyPreallocated<'buf>> {
402
420
/// Creates a new Secp256k1 context that can only be used for verification
403
421
pub fn preallocated_verification_only (
404
422
buf : & ' buf mut [ AlignedType ] ,
405
- ) -> Result < Secp256k1 < VerifyOnlyPreallocated < ' buf > > , Error > {
423
+ ) -> Result < Secp256k1 < VerifyOnlyPreallocated < ' buf > > , NotEnoughMemoryError > {
406
424
Secp256k1 :: preallocated_gen_new ( buf)
407
425
}
408
426
0 commit comments