rustscript-embedded 0.3.3

Embedded RustScript VMBC runtime with a no_std host-function ABI
#include <Arduino.h>

#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <limits>

#include "rustscript_embedded.h"
#include "rustscript_framework.h"
#include "rustscript_loader.h"

extern "C" void *rustscript_platform_alloc(size_t size, size_t align) {
    if (size == 0 || align == 0 || (align & (align - 1)) != 0) {
        return nullptr;
    }
    if (align <= alignof(std::max_align_t)) {
        return std::malloc(size);
    }
    if (size > std::numeric_limits<size_t>::max() - align - sizeof(void *)) {
        return nullptr;
    }
    void *raw = std::malloc(size + align - 1 + sizeof(void *));
    if (raw == nullptr) {
        return nullptr;
    }
    const uintptr_t start = reinterpret_cast<uintptr_t>(raw) + sizeof(void *);
    const uintptr_t aligned = (start + align - 1) & ~(static_cast<uintptr_t>(align) - 1);
    reinterpret_cast<void **>(aligned)[-1] = raw;
    return reinterpret_cast<void *>(aligned);
}

extern "C" void rustscript_platform_dealloc(void *pointer, size_t, size_t align) {
    if (pointer == nullptr) {
        return;
    }
    if (align <= alignof(std::max_align_t)) {
        std::free(pointer);
        return;
    }
    std::free(reinterpret_cast<void **>(pointer)[-1]);
}

void setup() {
    Serial.begin(115200);
    delay(250);

    RustScriptImage image{};
    if (!rustscript_load_sd(&image)) {
        rustscript_load_partition(&image);
    }
    if (image.data == nullptr) {
        Serial.println("rss:boot=no-script");
        rustscript_repl();
        return;
    }

    Serial.print("rss:boot=");
    Serial.println(image.source);
    const int32_t status = rustscript_run_vmbc(
        image.data,
        image.len,
        rustscript_dispatch_host,
        nullptr,
        1000000
    );
    rustscript_free_image(&image);
    Serial.print("rss:status=");
    Serial.println(status);
    rustscript_repl();
}

void loop() {
    delay(1000);
}