Skip to content

Commit 5eb012a

Browse files
committed
Avoid FFI calls for errmsg, out that are not used
1 parent cef818f commit 5eb012a

File tree

3 files changed

+47
-46
lines changed

3 files changed

+47
-46
lines changed

internal/api/lib.go

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func InitCache(dataDir string, supportedFeatures string, cacheSize uint32, insta
4949
f := makeView(supportedFeaturesBytes)
5050
defer runtime.KeepAlive(supportedFeaturesBytes)
5151

52-
errmsg := newUnmanagedVector(nil)
52+
errmsg := uninitializedUnmanagedVector()
5353
out := C.CachePtr{}
5454

5555
err := C.init_cache(d, f, cu32(cacheSize), cu32(instanceMemoryLimit), &errmsg, &out)
@@ -67,8 +67,8 @@ func ReleaseCache(cache Cache) {
6767
func StoreCode(cache Cache, wasm []byte) ([]byte, error) {
6868
w := makeView(wasm)
6969
defer runtime.KeepAlive(wasm)
70-
errmsg := newUnmanagedVector(nil)
71-
out := newUnmanagedVector(nil)
70+
errmsg := uninitializedUnmanagedVector()
71+
out := uninitializedUnmanagedVector()
7272
err := C.save_wasm(toCachePtr(cache), w, &errmsg, &out)
7373
if err != C.ErrorCode_Success {
7474
return nil, ffiErrorWithMessage2(err, errmsg)
@@ -90,8 +90,8 @@ func RemoveCode(cache Cache, checksum []byte) error {
9090
func GetCode(cache Cache, checksum []byte) ([]byte, error) {
9191
cs := makeView(checksum)
9292
defer runtime.KeepAlive(checksum)
93-
errmsg := newUnmanagedVector(nil)
94-
out := newUnmanagedVector(nil)
93+
errmsg := uninitializedUnmanagedVector()
94+
out := uninitializedUnmanagedVector()
9595
err := C.load_wasm(toCachePtr(cache), cs, &errmsg, &out)
9696
if err != C.ErrorCode_Success {
9797
return nil, ffiErrorWithMessage2(err, errmsg)
@@ -102,7 +102,7 @@ func GetCode(cache Cache, checksum []byte) ([]byte, error) {
102102
func Pin(cache Cache, checksum []byte) error {
103103
cs := makeView(checksum)
104104
defer runtime.KeepAlive(checksum)
105-
errmsg := newUnmanagedVector(nil)
105+
errmsg := uninitializedUnmanagedVector()
106106
err := C.pin(toCachePtr(cache), cs, &errmsg)
107107
if err != C.ErrorCode_Success {
108108
return ffiErrorWithMessage2(err, errmsg)
@@ -113,7 +113,7 @@ func Pin(cache Cache, checksum []byte) error {
113113
func Unpin(cache Cache, checksum []byte) error {
114114
cs := makeView(checksum)
115115
defer runtime.KeepAlive(checksum)
116-
errmsg := newUnmanagedVector(nil)
116+
errmsg := uninitializedUnmanagedVector()
117117
err := C.unpin(toCachePtr(cache), cs, &errmsg)
118118
if err != C.ErrorCode_Success {
119119
return ffiErrorWithMessage2(err, errmsg)
@@ -124,7 +124,7 @@ func Unpin(cache Cache, checksum []byte) error {
124124
func AnalyzeCode(cache Cache, checksum []byte) (*types.AnalysisReport, error) {
125125
cs := makeView(checksum)
126126
defer runtime.KeepAlive(checksum)
127-
errmsg := newUnmanagedVector(nil)
127+
errmsg := uninitializedUnmanagedVector()
128128
out := C.AnalysisReport{}
129129
err := C.analyze_code(toCachePtr(cache), cs, &errmsg, &out)
130130
if err != C.ErrorCode_Success {
@@ -140,7 +140,7 @@ func AnalyzeCode(cache Cache, checksum []byte) (*types.AnalysisReport, error) {
140140
}
141141

142142
func GetMetrics(cache Cache) (*types.Metrics, error) {
143-
errmsg := newUnmanagedVector(nil)
143+
errmsg := uninitializedUnmanagedVector()
144144
metrics := C.Metrics{}
145145
err := C.get_metrics(toCachePtr(cache), &errmsg, &metrics)
146146
if err != C.ErrorCode_Success {
@@ -189,8 +189,8 @@ func Instantiate(
189189
a := buildAPI(api)
190190
q := buildQuerier(querier)
191191
var gasUsed cu64
192-
errmsg := newUnmanagedVector(nil)
193-
out := newUnmanagedVector(nil)
192+
errmsg := uninitializedUnmanagedVector()
193+
out := uninitializedUnmanagedVector()
194194

195195
err := C.instantiate(toCachePtr(cache), cs, e, i, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
196196
if err != C.ErrorCode_Success {
@@ -230,8 +230,8 @@ func Execute(
230230
a := buildAPI(api)
231231
q := buildQuerier(querier)
232232
var gasUsed cu64
233-
errmsg := newUnmanagedVector(nil)
234-
out := newUnmanagedVector(nil)
233+
errmsg := uninitializedUnmanagedVector()
234+
out := uninitializedUnmanagedVector()
235235

236236
err := C.execute(toCachePtr(cache), cs, e, i, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
237237
if err != C.ErrorCode_Success {
@@ -268,8 +268,8 @@ func Migrate(
268268
a := buildAPI(api)
269269
q := buildQuerier(querier)
270270
var gasUsed cu64
271-
errmsg := newUnmanagedVector(nil)
272-
out := newUnmanagedVector(nil)
271+
errmsg := uninitializedUnmanagedVector()
272+
out := uninitializedUnmanagedVector()
273273

274274
err := C.migrate(toCachePtr(cache), cs, e, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
275275
if err != C.ErrorCode_Success {
@@ -306,8 +306,8 @@ func Sudo(
306306
a := buildAPI(api)
307307
q := buildQuerier(querier)
308308
var gasUsed cu64
309-
errmsg := newUnmanagedVector(nil)
310-
out := newUnmanagedVector(nil)
309+
errmsg := uninitializedUnmanagedVector()
310+
out := uninitializedUnmanagedVector()
311311

312312
err := C.sudo(toCachePtr(cache), cs, e, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
313313
if err != C.ErrorCode_Success {
@@ -344,8 +344,8 @@ func Reply(
344344
a := buildAPI(api)
345345
q := buildQuerier(querier)
346346
var gasUsed cu64
347-
errmsg := newUnmanagedVector(nil)
348-
out := newUnmanagedVector(nil)
347+
errmsg := uninitializedUnmanagedVector()
348+
out := uninitializedUnmanagedVector()
349349

350350
err := C.reply(toCachePtr(cache), cs, e, r, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
351351
if err != C.ErrorCode_Success {
@@ -382,8 +382,8 @@ func Query(
382382
a := buildAPI(api)
383383
q := buildQuerier(querier)
384384
var gasUsed cu64
385-
errmsg := newUnmanagedVector(nil)
386-
out := newUnmanagedVector(nil)
385+
errmsg := uninitializedUnmanagedVector()
386+
out := uninitializedUnmanagedVector()
387387

388388
err := C.query(toCachePtr(cache), cs, e, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
389389
if err != C.ErrorCode_Success {
@@ -420,8 +420,8 @@ func IBCChannelOpen(
420420
a := buildAPI(api)
421421
q := buildQuerier(querier)
422422
var gasUsed cu64
423-
errmsg := newUnmanagedVector(nil)
424-
out := newUnmanagedVector(nil)
423+
errmsg := uninitializedUnmanagedVector()
424+
out := uninitializedUnmanagedVector()
425425

426426
err := C.ibc_channel_open(toCachePtr(cache), cs, e, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
427427
if err != C.ErrorCode_Success {
@@ -458,8 +458,8 @@ func IBCChannelConnect(
458458
a := buildAPI(api)
459459
q := buildQuerier(querier)
460460
var gasUsed cu64
461-
errmsg := newUnmanagedVector(nil)
462-
out := newUnmanagedVector(nil)
461+
errmsg := uninitializedUnmanagedVector()
462+
out := uninitializedUnmanagedVector()
463463

464464
err := C.ibc_channel_connect(toCachePtr(cache), cs, e, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
465465
if err != C.ErrorCode_Success {
@@ -496,8 +496,8 @@ func IBCChannelClose(
496496
a := buildAPI(api)
497497
q := buildQuerier(querier)
498498
var gasUsed cu64
499-
errmsg := newUnmanagedVector(nil)
500-
out := newUnmanagedVector(nil)
499+
errmsg := uninitializedUnmanagedVector()
500+
out := uninitializedUnmanagedVector()
501501

502502
err := C.ibc_channel_close(toCachePtr(cache), cs, e, m, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
503503
if err != C.ErrorCode_Success {
@@ -534,8 +534,8 @@ func IBCPacketReceive(
534534
a := buildAPI(api)
535535
q := buildQuerier(querier)
536536
var gasUsed cu64
537-
errmsg := newUnmanagedVector(nil)
538-
out := newUnmanagedVector(nil)
537+
errmsg := uninitializedUnmanagedVector()
538+
out := uninitializedUnmanagedVector()
539539

540540
err := C.ibc_packet_receive(toCachePtr(cache), cs, e, pa, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
541541
if err != C.ErrorCode_Success {
@@ -572,8 +572,8 @@ func IBCPacketAck(
572572
a := buildAPI(api)
573573
q := buildQuerier(querier)
574574
var gasUsed cu64
575-
errmsg := newUnmanagedVector(nil)
576-
out := newUnmanagedVector(nil)
575+
errmsg := uninitializedUnmanagedVector()
576+
out := uninitializedUnmanagedVector()
577577

578578
err := C.ibc_packet_ack(toCachePtr(cache), cs, e, ac, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
579579
if err != C.ErrorCode_Success {
@@ -610,8 +610,8 @@ func IBCPacketTimeout(
610610
a := buildAPI(api)
611611
q := buildQuerier(querier)
612612
var gasUsed cu64
613-
errmsg := newUnmanagedVector(nil)
614-
out := newUnmanagedVector(nil)
613+
errmsg := uninitializedUnmanagedVector()
614+
out := uninitializedUnmanagedVector()
615615

616616
err := C.ibc_packet_timeout(toCachePtr(cache), cs, e, pa, db, a, q, cu64(gasLimit), cbool(printDebug), &gasUsed, &errmsg, &out)
617617
if err != C.ErrorCode_Success {

internal/api/memory.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ func constructUnmanagedVector(is_none cbool, ptr cu8_ptr, len cusize, cap cusize
3939
}
4040
}
4141

42+
// uninitializedUnmanagedVector returns an invalid C.UnmanagedVector
43+
// instance. Only use then after someone wrote an instance to it.
44+
func uninitializedUnmanagedVector() C.UnmanagedVector {
45+
return C.UnmanagedVector{}
46+
}
47+
4248
func newUnmanagedVector(data []byte) C.UnmanagedVector {
4349
if data == nil {
4450
return C.new_unmanaged_vector(cbool(true), cu8_ptr(nil), cusize(0))

libwasmvm/src/error/rust.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -130,27 +130,22 @@ impl ErrorCode {
130130
}
131131
}
132132

133-
pub fn set_error(err: RustError, error_msg: Option<&mut UnmanagedVector>) -> ErrorCode {
133+
/// Takes the `RustError`, writes the error message to
134+
/// the `error_msg` pointer and returns an Error code.
135+
pub fn set_error_msg(err: RustError, error_msg: Option<&mut UnmanagedVector>) -> ErrorCode {
134136
if let Some(error_msg) = error_msg {
135-
if error_msg.is_some() {
136-
panic!(
137-
"There is an old error message in the given pointer that has not been \
138-
cleaned up. Error message pointers should not be reused for multiple calls."
139-
)
140-
}
141-
142137
let msg: Vec<u8> = err.to_string().into();
143138
*error_msg = UnmanagedVector::new(Some(msg));
144139
} else {
145140
// The caller provided a nil pointer for the error message.
146141
// That's not nice but we can live with it.
147142
}
148143

149-
let errno: ErrorCode = match err {
144+
let code: ErrorCode = match err {
150145
RustError::OutOfGas { .. } => ErrorCode::OutOfGas,
151146
_ => ErrorCode::Other,
152147
};
153-
errno
148+
code
154149
}
155150

156151
pub fn set_out<T>(value: T, out_ptr: Option<&mut T>) {
@@ -174,7 +169,7 @@ pub fn to_c_result_binary(
174169
set_out(value, out_ptr);
175170
ErrorCode::Success
176171
}
177-
Err(error) => set_error(error, error_msg_ptr),
172+
Err(error) => set_error_msg(error, error_msg_ptr),
178173
};
179174
code.to_int()
180175
}
@@ -191,7 +186,7 @@ pub fn to_c_result<T>(
191186
set_out(value, out_ptr);
192187
ErrorCode::Success
193188
}
194-
Err(error) => set_error(error, error_msg_ptr),
189+
Err(error) => set_error_msg(error, error_msg_ptr),
195190
};
196191
code.to_int()
197192
}
@@ -204,7 +199,7 @@ pub fn to_c_result_unit(
204199
) -> i32 {
205200
let code = match result {
206201
Ok(_) => ErrorCode::Success,
207-
Err(error) => set_error(error, error_msg_ptr),
202+
Err(error) => set_error_msg(error, error_msg_ptr),
208203
};
209204
code.to_int()
210205
}

0 commit comments

Comments
 (0)