#include #include #ifdef _WIN32 # include # include #else # include # include #endif #include "jit.h" static size_t page_size = 0; JitBuffer * jit_buffer_new(void) { #ifdef _WIN32 DWORD type; DWORD prot; SYSTEM_INFO sysinfo; if (page_size == 0) { GetSystemInfo(&sysinfo); page_size = sysinfo.dwPageSize; } type = MEM_RESERVE | MEM_COMMIT; prot = PAGE_READWRITE; return (VirtualAlloc(NULL, page_size, type, prot)); #else int prot; int flags; if (page_size == 0) { page_size = sysconf(_SC_PAGESIZE); } prot = PROT_READ | PROT_WRITE; flags = MAP_ANONYMOUS | MAP_PRIVATE; return (mmap(NULL, page_size, prot, flags, -1, 0)); #endif } void jit_buffer_finalize(JitBuffer *buff) { #ifdef _WIN32 DWORD old; VirtualProtect(buff, page_size, PAGE_EXECUTE_READ, &old); #else mprotect(buff, page_size, PROT_READ | PROT_EXEC); #endif } void jit_buffer_add(JitBuffer *buff, int size, void *value) { memcpy(buff->code + buff->count, value, size); buff->count += size; } void jit_buffer_execute(JitBuffer *buff) { } void jit_buffer_destroy(JitBuffer *buff) { #ifdef _WIN32 VirtualFree(buff, page_size, MEM_RELEASE); #else munmap(buff, page_size); #endif }