pr47 0.1.4-CHARLIE

A semi-experimental programming language. Still working in progress.
Documentation
use std::any::TypeId;
use std::ptr::NonNull;
use std::time::{Duration, Instant};
use xjbutil::boxed_slice;

use xjbutil::void::Void;

use crate::data::traits::StaticBase;
use crate::data::tyck::{TyckInfo, TyckInfoPool};
use crate::data::Value;
use crate::ffi::{DataOption, FFIException, Signature};
use crate::ffi::sync_fn::{FunctionBase, VMContext};

impl StaticBase<Instant> for Void {}
impl StaticBase<Duration> for Void {}

pub struct DurationForMillisBind();

impl FunctionBase for DurationForMillisBind {
    fn signature(tyck_info_pool: &mut TyckInfoPool) -> Signature {
        let i64_type: NonNull<TyckInfo> =
            tyck_info_pool.create_plain_type(TypeId::of::<i64>());
        let duration_type: NonNull<TyckInfo> =
            tyck_info_pool.create_plain_type(TypeId::of::<Duration>());

        Signature {
            func_type: tyck_info_pool.create_function_type(&[i64_type], &[duration_type], &[]),
            param_options: boxed_slice![DataOption::Copy],
            ret_option: boxed_slice![DataOption::Move]
        }
    }

    unsafe fn call_rtlc<CTX: VMContext>(
        context: &mut CTX,
        args: &[Value],
        rets: &[*mut Value]
    ) -> Result<(), FFIException> {
        Self::call_unchecked(context, args, rets)
    }

    unsafe fn call_unchecked<CTX: VMContext>(
        context: &mut CTX,
        args: &[Value],
        rets: &[*mut Value]
    ) -> Result<(), FFIException> {
        let millis: i64 = args.get_unchecked(0).vt_data.inner.int_value;
        let duration: Duration = Duration::from_millis(millis as u64);

        let value: Value = Value::new_owned(duration);
        context.add_heap_managed(value);
        **rets.get_unchecked(0) = value;

        Ok(())
    }
}