119 lines
3 KiB
C++
119 lines
3 KiB
C++
/** @file DClosure.cpp
|
|
*
|
|
* @author Roland Conybeare, Feb 2026
|
|
**/
|
|
|
|
#include "Closure.hpp"
|
|
#include "LambdaExpr.hpp"
|
|
#include "LocalEnv.hpp"
|
|
#include "VsmRcx.hpp"
|
|
#include <xo/indentlog/scope.hpp>
|
|
#include <cstddef>
|
|
|
|
namespace xo {
|
|
using xo::mm::AGCObject;
|
|
using xo::print::APrintable;
|
|
|
|
namespace scm {
|
|
|
|
DClosure::DClosure(const DLambdaExpr * lm,
|
|
const DLocalEnv * env)
|
|
: lambda_{lm}, env_{env}
|
|
{}
|
|
|
|
DClosure *
|
|
DClosure::make(obj<AAllocator> mm,
|
|
const DLambdaExpr * lm,
|
|
const DLocalEnv * env)
|
|
{
|
|
void * mem = mm.alloc_for<DClosure>();
|
|
|
|
return new (mem) DClosure(lm, env);
|
|
}
|
|
|
|
obj<AGCObject>
|
|
DClosure::apply_nocheck(obj<ARuntimeContext> rcx,
|
|
const DArray * args)
|
|
{
|
|
scope log(XO_DEBUG(true));
|
|
|
|
auto vsm_rcx
|
|
= obj<ARuntimeContext,DVsmRcx>::from(rcx);
|
|
|
|
log && log(xtag("vsm_rcx.data", (void*)vsm_rcx.data()));
|
|
|
|
// let's try a not-implemented error
|
|
|
|
// don't want to clutter Procedure facet, since it's
|
|
// lower-level than xo-interpreter2
|
|
|
|
#ifdef NOT_YET
|
|
// TODO: verify arguments against type signature.
|
|
// unless we have evidence that program is type correct
|
|
|
|
int32_t n_args = this->n_args();
|
|
|
|
if (n_args != args->size()) {
|
|
//
|
|
}
|
|
#endif
|
|
|
|
|
|
(void)args;
|
|
|
|
assert(false);
|
|
}
|
|
|
|
size_t
|
|
DClosure::shallow_size() const noexcept {
|
|
return sizeof(DClosure);
|
|
}
|
|
|
|
DClosure *
|
|
DClosure::shallow_copy(obj<AAllocator> mm) const noexcept {
|
|
DClosure * copy = (DClosure *)mm.alloc_copy((std::byte *)this);
|
|
|
|
if (copy)
|
|
*copy = *this;
|
|
|
|
return copy;
|
|
}
|
|
|
|
std::size_t
|
|
DClosure::forward_children(obj<ACollector> gc) noexcept
|
|
{
|
|
{
|
|
auto iface = xo::facet::impl_for<AGCObject,DLambdaExpr>();
|
|
gc.forward_inplace(&iface, (void **)(&lambda_));
|
|
|
|
}
|
|
{
|
|
auto iface = xo::facet::impl_for<AGCObject,DLocalEnv>();
|
|
gc.forward_inplace(&iface, (void **)(&env_));
|
|
}
|
|
|
|
return shallow_size();
|
|
}
|
|
|
|
// ----- printable facet -----
|
|
|
|
bool
|
|
DClosure::pretty(const ppindentinfo & ppii) const
|
|
{
|
|
obj<APrintable,DLambdaExpr> lambda_pr(const_cast<DLambdaExpr *>(lambda_));
|
|
obj<APrintable,DLocalEnv> env_pr(const_cast<DLocalEnv *>(env_));
|
|
|
|
bool lambda_present = lambda_pr;
|
|
bool env_present = env_pr;
|
|
|
|
return ppii.pps()->pretty_struct
|
|
(ppii,
|
|
"DClosure",
|
|
refrtag("lambda", lambda_pr, lambda_present),
|
|
refrtag("env", env_pr, env_present));
|
|
}
|
|
|
|
} /*namespace scm*/
|
|
} /*namespace xo*/
|
|
|
|
/* end DClosure.cpp */
|