Skip to content

Commit c291d9d

Browse files
committed
capi: remove dependency on try_blocks
Uses an IIFE + return type changes to remove the need for try blocks
1 parent 8b2ff57 commit c291d9d

File tree

9 files changed

+42
-32
lines changed

9 files changed

+42
-32
lines changed

librashader-capi/src/error.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,12 @@ impl LibrashaderError {
211211
}
212212

213213
macro_rules! assert_non_null {
214-
($value:ident) => {
214+
(@EXPORT $value:ident) => {
215215
if $value.is_null() || !$crate::ffi::ptr_is_aligned($value) {
216216
return $crate::error::LibrashaderError::InvalidParameter(stringify!($value)).export();
217217
}
218218
};
219-
(noexport $value:ident) => {
219+
($value:ident) => {
220220
if $value.is_null() || !$crate::ffi::ptr_is_aligned($value) {
221221
return Err($crate::error::LibrashaderError::InvalidParameter(
222222
stringify!($value),
@@ -228,14 +228,18 @@ macro_rules! assert_non_null {
228228
macro_rules! assert_some_ptr {
229229
($value:ident) => {
230230
if $value.is_none() {
231-
return $crate::error::LibrashaderError::InvalidParameter(stringify!($value)).export();
231+
return Err($crate::error::LibrashaderError::InvalidParameter(
232+
stringify!($value),
233+
));
232234
}
233235

234236
let $value = unsafe { $value.as_ref().unwrap_unchecked().as_ref() };
235237
};
236238
(mut $value:ident) => {
237239
if $value.is_none() {
238-
return $crate::error::LibrashaderError::InvalidParameter(stringify!($value)).export();
240+
return Err($crate::error::LibrashaderError::InvalidParameter(
241+
stringify!($value),
242+
));
239243
}
240244

241245
let $value = unsafe { $value.as_mut().unwrap_unchecked().as_mut() };

librashader-capi/src/ffi.rs

+22-15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
#[macro_export]
2+
macro_rules! wrap_ok {
3+
($e:expr) => {
4+
::core::iter::empty().try_fold($e, |_, __x: ::core::convert::Infallible| match __x {})
5+
};
6+
}
7+
18
macro_rules! ffi_body {
29
(nopanic $body:block) => {
310
{
4-
let result: Result<(), $crate::error::LibrashaderError> = try {
11+
let result: Result<(), $crate::error::LibrashaderError> = (|| $crate::ffi::wrap_ok!({
512
$body
6-
};
13+
}))();
714

815
let Err(e) = result else {
916
return $crate::error::LibrashaderError::ok()
@@ -22,13 +29,13 @@ macro_rules! ffi_body {
2229
};
2330
(nopanic |$($ref_capture:ident),*|; mut |$($mut_capture:ident),*| $body:block) => {
2431
{
25-
$($crate::error::assert_non_null!($ref_capture);)*
32+
$($crate::error::assert_non_null!(@EXPORT $ref_capture);)*
2633
$(let $ref_capture = unsafe { &*$ref_capture };)*
27-
$($crate::error::assert_non_null!($mut_capture);)*
34+
$($crate::error::assert_non_null!(@EXPORT $mut_capture);)*
2835
$(let $mut_capture = unsafe { &mut *$mut_capture };)*
29-
let result: Result<(), $crate::error::LibrashaderError> = try {
36+
let result: Result<(), $crate::error::LibrashaderError> = (|| $crate::ffi::wrap_ok!({
3037
$body
31-
};
38+
}))();
3239

3340
let Err(e) = result else {
3441
return $crate::error::LibrashaderError::ok()
@@ -47,11 +54,11 @@ macro_rules! ffi_body {
4754
};
4855
(nopanic mut |$($mut_capture:ident),*| $body:block) => {
4956
{
50-
$($crate::error::assert_non_null!($mut_capture);)*
57+
$($crate::error::assert_non_null!(@EXPORT $mut_capture);)*
5158
$(let $mut_capture = unsafe { &mut *$mut_capture };)*
52-
let result: Result<(), $crate::error::LibrashaderError> = try {
59+
let result: Result<(), $crate::error::LibrashaderError> = (|| $crate::ffi::wrap_ok!({
5360
$body
54-
};
61+
}))();
5562

5663
let Err(e) = result else {
5764
return $crate::error::LibrashaderError::ok()
@@ -70,11 +77,11 @@ macro_rules! ffi_body {
7077
};
7178
(nopanic |$($ref_capture:ident),*| $body:block) => {
7279
{
73-
$($crate::error::assert_non_null!($ref_capture);)*
80+
$($crate::error::assert_non_null!(@EXPORT $ref_capture);)*
7481
$(let $ref_capture = unsafe { &*$ref_capture };)*
75-
let result: Result<(), $crate::error::LibrashaderError> = try {
82+
let result: Result<(), $crate::error::LibrashaderError> = (|| $crate::ffi::wrap_ok!({
7683
$body
77-
};
84+
}))();
7885

7986
let Err(e) = result else {
8087
return $crate::error::LibrashaderError::ok()
@@ -231,16 +238,16 @@ pub unsafe fn boxed_slice_from_raw_parts<T>(ptr: *mut T, len: usize) -> Box<[T]>
231238
unsafe { Box::from_raw(std::slice::from_raw_parts_mut(ptr, len)) }
232239
}
233240

234-
#[allow(unstable_name_collisions)]
235241
pub fn ptr_is_aligned<T: Sized>(ptr: *const T) -> bool {
236-
use sptr::Strict;
237242
let align = std::mem::align_of::<T>();
238243
if !align.is_power_of_two() {
239244
panic!("is_aligned_to: align is not a power-of-two");
240245
}
241-
ptr.addr() & (align - 1) == 0
246+
sptr::Strict::addr(ptr) & (align - 1) == 0
242247
}
243248

244249
pub(crate) use extern_fn;
245250
pub(crate) use ffi_body;
251+
pub(crate) use wrap_ok;
252+
246253
use std::mem::ManuallyDrop;

librashader-capi/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
//! called from one thread at a time.
6565
6666
#![allow(non_camel_case_types)]
67-
#![feature(try_blocks)]
6867
#![deny(unsafe_op_in_unsafe_fn)]
6968
#![deny(deprecated)]
7069

librashader-capi/src/runtime/d3d11/filter_chain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ extern_fn! {
268268
let name = name.to_str()?;
269269

270270
if chain.parameters().set_parameter_value(name, value).is_none() {
271-
return LibrashaderError::UnknownShaderParameter(param_name).export()
271+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
272272
}
273273
}
274274
}
@@ -293,7 +293,7 @@ extern_fn! {
293293
let name = name.to_str()?;
294294

295295
let Some(value) = chain.parameters().parameter_value(name) else {
296-
return LibrashaderError::UnknownShaderParameter(param_name).export()
296+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
297297
};
298298

299299
out.write(MaybeUninit::new(value));

librashader-capi/src/runtime/d3d12/filter_chain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ extern_fn! {
288288
let name = name.to_str()?;
289289

290290
if chain.parameters().set_parameter_value(name, value).is_none() {
291-
return LibrashaderError::UnknownShaderParameter(param_name).export()
291+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
292292
}
293293
}
294294
}
@@ -313,7 +313,7 @@ extern_fn! {
313313
let name = name.to_str()?;
314314

315315
let Some(value) = chain.parameters().parameter_value(name) else {
316-
return LibrashaderError::UnknownShaderParameter(param_name).export()
316+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
317317
};
318318

319319
out.write(MaybeUninit::new(value));

librashader-capi/src/runtime/d3d9/filter_chain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ extern_fn! {
178178
let name = name.to_str()?;
179179

180180
if chain.parameters().set_parameter_value(name, value).is_none() {
181-
return LibrashaderError::UnknownShaderParameter(param_name).export()
181+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
182182
}
183183
}
184184
}
@@ -203,7 +203,7 @@ extern_fn! {
203203
let name = name.to_str()?;
204204

205205
let Some(value) = chain.parameters().parameter_value(name) else {
206-
return LibrashaderError::UnknownShaderParameter(param_name).export()
206+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
207207
};
208208

209209
out.write(MaybeUninit::new(value));

librashader-capi/src/runtime/gl/filter_chain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ extern_fn! {
235235
let name = name.to_str()?;
236236

237237
if chain.parameters().set_parameter_value(name, value).is_none() {
238-
return LibrashaderError::UnknownShaderParameter(param_name).export()
238+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
239239
}
240240
}
241241
}
@@ -260,7 +260,7 @@ extern_fn! {
260260
let name = name.to_str()?;
261261

262262
let Some(value) = chain.parameters().parameter_value(name) else {
263-
return LibrashaderError::UnknownShaderParameter(param_name).export()
263+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
264264
};
265265

266266
out.write(MaybeUninit::new(value));

librashader-capi/src/runtime/mtl/filter_chain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ extern_fn! {
236236
let name = name.to_str()?;
237237

238238
if chain.parameters().set_parameter_value(name, value).is_none() {
239-
return LibrashaderError::UnknownShaderParameter(param_name).export()
239+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
240240
}
241241
}
242242
}
@@ -261,7 +261,7 @@ extern_fn! {
261261
let name = name.to_str()?;
262262

263263
let Some(value) = chain.parameters().parameter_value(name) else {
264-
return LibrashaderError::UnknownShaderParameter(param_name).export()
264+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
265265
};
266266

267267
out.write(MaybeUninit::new(value));

librashader-capi/src/runtime/vk/filter_chain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ extern_fn! {
314314
let name = name.to_str()?;
315315

316316
if chain.parameters().set_parameter_value(name, value).is_none() {
317-
return LibrashaderError::UnknownShaderParameter(param_name).export()
317+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
318318
}
319319
}
320320
}
@@ -339,7 +339,7 @@ extern_fn! {
339339
let name = name.to_str()?;
340340

341341
let Some(value) = chain.parameters().parameter_value(name) else {
342-
return LibrashaderError::UnknownShaderParameter(param_name).export()
342+
return Err(LibrashaderError::UnknownShaderParameter(param_name))
343343
};
344344

345345
out.write(MaybeUninit::new(value));

0 commit comments

Comments
 (0)