Skip to content

Commit fcbe620

Browse files
committed
feat(DaedalusVm): add overrideFunction API
1 parent 7ca8863 commit fcbe620

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

include/zenkit-capi/DaedalusVm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,7 @@ ZkDaedalusVm_initInstance(ZkDaedalusVm* slf, ZkDaedalusSymbol* sym, ZkDaedalusIn
4545
ZKC_API void ZkDaedalusVm_initInstanceDirect(ZkDaedalusVm* slf, ZkDaedalusInstance* sym);
4646
ZKC_API void
4747
ZkDaedalusVm_registerExternal(ZkDaedalusVm* slf, ZkDaedalusSymbol* sym, ZkDaedalusVmExternalCallback cb, void* ctx);
48+
ZKC_API void
49+
ZkDaedalusVm_overrideFunction(ZkDaedalusVm* slf, char const* name, ZkDaedalusVmExternalCallback cb, void* ctx);
4850
ZKC_API void ZkDaedalusVm_registerExternalDefault(ZkDaedalusVm* slf, ZkDaedalusVmExternalDefaultCallback cb, void* ctx);
4951
ZKC_API void ZkDaedalusVm_printStackTrace(ZkDaedalusVm* slf);

src/DaedalusVm.cc

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ ZkDaedalusInstance* ZkDaedalusVm_popInstance(ZkDaedalusVm* slf) {
157157
ZKC_CHECK_NULL(slf);
158158

159159
try {
160-
auto instance = slf->handle.pop_instance();
161-
if (instance == nullptr) {
162-
return nullptr;
163-
}
164-
ZKC_RETURN_CATCH(new ZkDaedalusInstance(instance));
165-
} catch (zenkit::DaedalusScriptError const& e) {
166-
ZKC_LOG_ERROR("Failed to pop instance: %s", e.what());
167-
return nullptr;
168-
}
160+
auto instance = slf->handle.pop_instance();
161+
if (instance == nullptr) {
162+
return nullptr;
163+
}
164+
ZKC_RETURN_CATCH(new ZkDaedalusInstance(instance));
165+
} catch (zenkit::DaedalusScriptError const& e) {
166+
ZKC_LOG_ERROR("Failed to pop instance: %s", e.what());
167+
return nullptr;
168+
}
169169
}
170170

171171
ZkDaedalusInstance* ZkDaedalusVm_getGlobalSelf(ZkDaedalusVm* slf) {
@@ -439,6 +439,15 @@ void ZkDaedalusVm_registerExternal(ZkDaedalusVm* slf,
439439
slf->externals.insert_or_assign(sym->index(), [cb, ctx](ZkDaedalusVm* vm) { cb(ctx, vm); });
440440
}
441441

442+
void ZkDaedalusVm_overrideFunction(ZkDaedalusVm* slf, char const* name, ZkDaedalusVmExternalCallback cb, void* ctx) {
443+
ZKC_TRACE_FN();
444+
ZKC_CHECK_NULLV(slf, name, cb);
445+
slf->handle.override_function(name, [slf, ctx, cb](zenkit::DaedalusVm&) -> zenkit::DaedalusNakedCall {
446+
cb(ctx, slf);
447+
return {};
448+
});
449+
}
450+
442451
void ZkDaedalusVm_registerExternalDefault(ZkDaedalusVm* slf, ZkDaedalusVmExternalDefaultCallback cb, void* ctx) {
443452
ZKC_TRACE_FN();
444453
ZKC_CHECK_NULLV(slf);

0 commit comments

Comments
 (0)