Skip to content

Commit 73d0d3b

Browse files
committed
Make get_flatbuffer_result generic
Signed-off-by: Ludvig Liljenberg <[email protected]>
1 parent 4b3bd98 commit 73d0d3b

File tree

5 files changed

+165
-163
lines changed

5 files changed

+165
-163
lines changed

src/hyperlight_common/src/flatbuffer_wrappers/util.rs

Lines changed: 119 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -16,141 +16,156 @@ limitations under the License.
1616

1717
use alloc::vec::Vec;
1818

19-
use flatbuffers::{FlatBufferBuilder, UnionWIPOffset, WIPOffset};
19+
use flatbuffers::FlatBufferBuilder;
2020

2121
use crate::flatbuffers::hyperlight::generated::{
22-
hldouble as Fbhldouble, hldoubleArgs as FbhldoubleArgs, hlfloat as Fbhlfloat,
23-
hlfloatArgs as FbhlfloatArgs, hlint as Fbhlint, hlintArgs as FbhlintArgs, hllong as Fbhllong,
24-
hllongArgs as FbhllongArgs, hlsizeprefixedbuffer as Fbhlsizeprefixedbuffer,
22+
hlbool as Fbhlbool, hlboolArgs as FbhlboolArgs, hldouble as Fbhldouble,
23+
hldoubleArgs as FbhldoubleArgs, hlfloat as Fbhlfloat, hlfloatArgs as FbhlfloatArgs,
24+
hlint as Fbhlint, hlintArgs as FbhlintArgs, hllong as Fbhllong, hllongArgs as FbhllongArgs,
25+
hlsizeprefixedbuffer as Fbhlsizeprefixedbuffer,
2526
hlsizeprefixedbufferArgs as FbhlsizeprefixedbufferArgs, hlstring as Fbhlstring,
2627
hlstringArgs as FbhlstringArgs, hluint as Fbhluint, hluintArgs as FbhluintArgs,
2728
hlulong as Fbhlulong, hlulongArgs as FbhlulongArgs, hlvoid as Fbhlvoid,
2829
hlvoidArgs as FbhlvoidArgs, FunctionCallResult as FbFunctionCallResult,
2930
FunctionCallResultArgs as FbFunctionCallResultArgs, ReturnValue as FbReturnValue,
3031
};
3132

32-
pub fn get_flatbuffer_result_from_double(value: f64) -> Vec<u8> {
33+
/// Flatbuffer-encodes the given value
34+
pub fn get_flatbuffer_result<T: FlatbufferSerializable>(val: T) -> Vec<u8> {
3335
let mut builder = FlatBufferBuilder::new();
34-
let hldouble = Fbhldouble::create(&mut builder, &FbhldoubleArgs { value });
36+
let res = &T::serialize(&val, &mut builder);
37+
let result_offset = FbFunctionCallResult::create(&mut builder, res);
3538

36-
let rt = FbReturnValue::hldouble;
37-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hldouble.as_union_value());
39+
builder.finish_size_prefixed(result_offset, None);
3840

39-
get_flatbuffer_result(&mut builder, rt, rv)
41+
builder.finished_data().to_vec()
4042
}
4143

42-
pub fn get_flatbuffer_result_from_float(value: f32) -> Vec<u8> {
43-
let mut builder = FlatBufferBuilder::new();
44-
let hlfloat = Fbhlfloat::create(&mut builder, &FbhlfloatArgs { value });
45-
46-
let rt = FbReturnValue::hlfloat;
47-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hlfloat.as_union_value());
48-
49-
get_flatbuffer_result(&mut builder, rt, rv)
44+
pub trait FlatbufferSerializable {
45+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs;
5046
}
5147

52-
pub fn get_flatbuffer_result_from_int(value: i32) -> Vec<u8> {
53-
let mut builder = FlatBufferBuilder::new();
54-
let hlint = Fbhlint::create(&mut builder, &FbhlintArgs { value });
55-
56-
let rt = FbReturnValue::hlint;
57-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hlint.as_union_value());
48+
/// Implementations for basic types below
5849
59-
get_flatbuffer_result(&mut builder, rt, rv)
50+
impl FlatbufferSerializable for () {
51+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
52+
FbFunctionCallResultArgs {
53+
return_value: Some(Fbhlvoid::create(builder, &FbhlvoidArgs {}).as_union_value()),
54+
return_value_type: FbReturnValue::hlvoid,
55+
}
56+
}
6057
}
6158

62-
pub fn get_flatbuffer_result_from_uint(value: u32) -> Vec<u8> {
63-
let mut builder = FlatBufferBuilder::new();
64-
let hluint = Fbhluint::create(&mut builder, &FbhluintArgs { value });
65-
66-
let rt = FbReturnValue::hluint;
67-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hluint.as_union_value());
68-
69-
get_flatbuffer_result(&mut builder, rt, rv)
59+
impl FlatbufferSerializable for &str {
60+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
61+
let string_offset = builder.create_string(self);
62+
FbFunctionCallResultArgs {
63+
return_value: Some(
64+
Fbhlstring::create(
65+
builder,
66+
&FbhlstringArgs {
67+
value: Some(string_offset),
68+
},
69+
)
70+
.as_union_value(),
71+
),
72+
return_value_type: FbReturnValue::hlstring,
73+
}
74+
}
7075
}
7176

72-
pub fn get_flatbuffer_result_from_long(value: i64) -> Vec<u8> {
73-
let mut builder = FlatBufferBuilder::new();
74-
let hllong = Fbhllong::create(&mut builder, &FbhllongArgs { value });
75-
76-
let rt = FbReturnValue::hllong;
77-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hllong.as_union_value());
78-
79-
get_flatbuffer_result(&mut builder, rt, rv)
77+
impl FlatbufferSerializable for &[u8] {
78+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
79+
let vec_offset = builder.create_vector(self);
80+
FbFunctionCallResultArgs {
81+
return_value: Some(
82+
Fbhlsizeprefixedbuffer::create(
83+
builder,
84+
&FbhlsizeprefixedbufferArgs {
85+
size_: self.len() as i32,
86+
value: Some(vec_offset),
87+
},
88+
)
89+
.as_union_value(),
90+
),
91+
return_value_type: FbReturnValue::hlsizeprefixedbuffer,
92+
}
93+
}
8094
}
8195

82-
pub fn get_flatbuffer_result_from_ulong(value: u64) -> Vec<u8> {
83-
let mut builder = FlatBufferBuilder::new();
84-
let hlulong = Fbhlulong::create(&mut builder, &FbhlulongArgs { value });
85-
86-
let rt = FbReturnValue::hlulong;
87-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hlulong.as_union_value());
88-
89-
get_flatbuffer_result(&mut builder, rt, rv)
96+
impl FlatbufferSerializable for f32 {
97+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
98+
FbFunctionCallResultArgs {
99+
return_value: Some(
100+
Fbhlfloat::create(builder, &FbhlfloatArgs { value: *self }).as_union_value(),
101+
),
102+
return_value_type: FbReturnValue::hlfloat,
103+
}
104+
}
90105
}
91106

92-
pub fn get_flatbuffer_result_from_void() -> Vec<u8> {
93-
let mut builder = FlatBufferBuilder::new();
94-
let hlvoid = Fbhlvoid::create(&mut builder, &FbhlvoidArgs {});
95-
96-
let rt = FbReturnValue::hlvoid;
97-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hlvoid.as_union_value());
98-
99-
get_flatbuffer_result(&mut builder, rt, rv)
107+
impl FlatbufferSerializable for f64 {
108+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
109+
FbFunctionCallResultArgs {
110+
return_value: Some(
111+
Fbhldouble::create(builder, &FbhldoubleArgs { value: *self }).as_union_value(),
112+
),
113+
return_value_type: FbReturnValue::hldouble,
114+
}
115+
}
100116
}
101117

102-
pub fn get_flatbuffer_result_from_string(value: &str) -> Vec<u8> {
103-
let mut builder = FlatBufferBuilder::new();
104-
105-
let string_offset = builder.create_string(value);
106-
let hlstring = Fbhlstring::create(
107-
&mut builder,
108-
&FbhlstringArgs {
109-
value: Some(string_offset),
110-
},
111-
);
112-
113-
let rt = FbReturnValue::hlstring;
114-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hlstring.as_union_value());
115-
116-
get_flatbuffer_result(&mut builder, rt, rv)
118+
impl FlatbufferSerializable for i32 {
119+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
120+
FbFunctionCallResultArgs {
121+
return_value: Some(
122+
Fbhlint::create(builder, &FbhlintArgs { value: *self }).as_union_value(),
123+
),
124+
return_value_type: FbReturnValue::hlint,
125+
}
126+
}
117127
}
118128

119-
pub fn get_flatbuffer_result_from_vec(data: &[u8]) -> Vec<u8> {
120-
let mut builder = FlatBufferBuilder::new();
121-
122-
let vec_offset = builder.create_vector(data);
123-
124-
let hlsizeprefixedbuffer = Fbhlsizeprefixedbuffer::create(
125-
&mut builder,
126-
&FbhlsizeprefixedbufferArgs {
127-
size_: data.len() as i32,
128-
value: Some(vec_offset),
129-
},
130-
);
131-
132-
// Indicate that the return value is a size-prefixed buffer.
133-
let rt = FbReturnValue::hlsizeprefixedbuffer;
134-
let rv: Option<WIPOffset<UnionWIPOffset>> = Some(hlsizeprefixedbuffer.as_union_value());
135-
136-
// Get the FlatBuffer result.
137-
get_flatbuffer_result(&mut builder, rt, rv)
129+
impl FlatbufferSerializable for i64 {
130+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
131+
FbFunctionCallResultArgs {
132+
return_value: Some(
133+
Fbhllong::create(builder, &FbhllongArgs { value: *self }).as_union_value(),
134+
),
135+
return_value_type: FbReturnValue::hllong,
136+
}
137+
}
138138
}
139139

140-
fn get_flatbuffer_result(
141-
builder: &mut FlatBufferBuilder,
142-
return_value_type: FbReturnValue,
143-
return_value: Option<WIPOffset<UnionWIPOffset>>,
144-
) -> Vec<u8> {
145-
let result_offset = FbFunctionCallResult::create(
146-
builder,
147-
&FbFunctionCallResultArgs {
148-
return_value,
149-
return_value_type,
150-
},
151-
);
140+
impl FlatbufferSerializable for u32 {
141+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
142+
FbFunctionCallResultArgs {
143+
return_value: Some(
144+
Fbhluint::create(builder, &FbhluintArgs { value: *self }).as_union_value(),
145+
),
146+
return_value_type: FbReturnValue::hluint,
147+
}
148+
}
149+
}
152150

153-
builder.finish_size_prefixed(result_offset, None);
151+
impl FlatbufferSerializable for u64 {
152+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
153+
FbFunctionCallResultArgs {
154+
return_value: Some(
155+
Fbhlulong::create(builder, &FbhlulongArgs { value: *self }).as_union_value(),
156+
),
157+
return_value_type: FbReturnValue::hlulong,
158+
}
159+
}
160+
}
154161

155-
builder.finished_data().to_vec()
162+
impl FlatbufferSerializable for bool {
163+
fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
164+
FbFunctionCallResultArgs {
165+
return_value: Some(
166+
Fbhlbool::create(builder, &FbhlboolArgs { value: *self }).as_union_value(),
167+
),
168+
return_value_type: FbReturnValue::hlbool,
169+
}
170+
}
156171
}

src/hyperlight_guest/src/host_function_call.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ limitations under the License.
1717
use alloc::string::ToString;
1818
use alloc::vec::Vec;
1919
use core::arch::global_asm;
20+
use hyperlight_common::flatbuffer_wrappers::util::get_flatbuffer_result;
2021

2122
use hyperlight_common::flatbuffer_wrappers::function_call::{FunctionCall, FunctionCallType};
2223
use hyperlight_common::flatbuffer_wrappers::function_types::{
2324
ParameterValue, ReturnType, ReturnValue,
2425
};
2526
use hyperlight_common::flatbuffer_wrappers::guest_error::ErrorCode;
26-
use hyperlight_common::flatbuffer_wrappers::util::get_flatbuffer_result_from_int;
2727
use hyperlight_common::mem::RunMode;
2828

2929
use crate::error::{HyperlightGuestError, Result};
@@ -195,7 +195,7 @@ pub fn print_output_as_guest_function(function_call: &FunctionCall) -> Result<Ve
195195
ReturnType::Int,
196196
)?;
197197
let res_i = get_host_value_return_as_int()?;
198-
Ok(get_flatbuffer_result_from_int(res_i))
198+
Ok(get_flatbuffer_result(res_i))
199199
} else {
200200
Err(HyperlightGuestError::new(
201201
ErrorCode::GuestError,

src/hyperlight_guest_capi/src/flatbuffer.rs

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
use alloc::boxed::Box;
22
use core::ffi::{c_char, CStr};
33

4-
use hyperlight_common::flatbuffer_wrappers::util::{
5-
get_flatbuffer_result_from_double, get_flatbuffer_result_from_float,
6-
get_flatbuffer_result_from_int, get_flatbuffer_result_from_long,
7-
get_flatbuffer_result_from_string, get_flatbuffer_result_from_uint,
8-
get_flatbuffer_result_from_ulong, get_flatbuffer_result_from_vec,
9-
get_flatbuffer_result_from_void,
10-
};
4+
use hyperlight_common::flatbuffer_wrappers::util::get_flatbuffer_result;
115
use hyperlight_guest::host_function_call::{
126
get_host_value_return_as_int, get_host_value_return_as_long, get_host_value_return_as_uint,
137
get_host_value_return_as_ulong,
@@ -21,57 +15,57 @@ use crate::types::FfiVec;
2115

2216
#[no_mangle]
2317
pub extern "C" fn hl_flatbuffer_result_from_Int(value: i32) -> Box<FfiVec> {
24-
let vec = get_flatbuffer_result_from_int(value);
18+
let vec = get_flatbuffer_result(value);
2519

2620
Box::new(unsafe { FfiVec::from_vec(vec) })
2721
}
2822

2923
#[no_mangle]
3024
pub extern "C" fn hl_flatbuffer_result_from_UInt(value: u32) -> Box<FfiVec> {
31-
let vec = get_flatbuffer_result_from_uint(value);
25+
let vec = get_flatbuffer_result(value);
3226

3327
Box::new(unsafe { FfiVec::from_vec(vec) })
3428
}
3529

3630
#[no_mangle]
3731
pub extern "C" fn hl_flatbuffer_result_from_Long(value: i64) -> Box<FfiVec> {
38-
let vec = get_flatbuffer_result_from_long(value);
32+
let vec = get_flatbuffer_result(value);
3933

4034
Box::new(unsafe { FfiVec::from_vec(vec) })
4135
}
4236

4337
#[no_mangle]
4438
pub extern "C" fn hl_flatbuffer_result_from_ULong(value: u64) -> Box<FfiVec> {
45-
let vec = get_flatbuffer_result_from_ulong(value);
39+
let vec = get_flatbuffer_result(value);
4640

4741
Box::new(unsafe { FfiVec::from_vec(vec) })
4842
}
4943

5044
#[no_mangle]
5145
pub extern "C" fn hl_flatbuffer_result_from_Float(value: f32) -> Box<FfiVec> {
52-
let vec = get_flatbuffer_result_from_float(value);
46+
let vec = get_flatbuffer_result(value);
5347

5448
Box::new(unsafe { FfiVec::from_vec(vec) })
5549
}
5650

5751
#[no_mangle]
5852
pub extern "C" fn hl_flatbuffer_result_from_Double(value: f64) -> Box<FfiVec> {
59-
let vec = get_flatbuffer_result_from_double(value);
53+
let vec = get_flatbuffer_result(value);
6054

6155
Box::new(unsafe { FfiVec::from_vec(vec) })
6256
}
6357

6458
#[no_mangle]
6559
pub extern "C" fn hl_flatbuffer_result_from_Void() -> Box<FfiVec> {
66-
let vec = get_flatbuffer_result_from_void();
60+
let vec = get_flatbuffer_result(());
6761

6862
Box::new(unsafe { FfiVec::from_vec(vec) })
6963
}
7064

7165
#[no_mangle]
7266
pub extern "C" fn hl_flatbuffer_result_from_String(value: *const c_char) -> Box<FfiVec> {
7367
let str = unsafe { CStr::from_ptr(value) };
74-
let vec = get_flatbuffer_result_from_string(str.to_string_lossy().as_ref());
68+
let vec = get_flatbuffer_result(str.to_string_lossy().as_ref());
7569

7670
Box::new(unsafe { FfiVec::from_vec(vec) })
7771
}
@@ -80,7 +74,7 @@ pub extern "C" fn hl_flatbuffer_result_from_String(value: *const c_char) -> Box<
8074
pub extern "C" fn hl_flatbuffer_result_from_Bytes(data: *const u8, len: usize) -> Box<FfiVec> {
8175
let slice = unsafe { core::slice::from_raw_parts(data, len) };
8276

83-
let vec = get_flatbuffer_result_from_vec(slice);
77+
let vec = get_flatbuffer_result(slice);
8478

8579
Box::new(unsafe { FfiVec::from_vec(vec) })
8680
}

0 commit comments

Comments
 (0)