removed gc
This commit is contained in:
parent
eac3b23432
commit
efeb482128
113
src/gc/gc.c
113
src/gc/gc.c
|
@ -1,113 +0,0 @@
|
|||
//
|
||||
// Created by servostar on 5/7/24.
|
||||
//
|
||||
|
||||
#include <gc/gc.h>
|
||||
#include <sys/log.h>
|
||||
#include <string.h>
|
||||
|
||||
#undef malloc
|
||||
#undef free
|
||||
#undef realloc
|
||||
|
||||
#define GC_HEAP_PREALLOC_CNT 10
|
||||
|
||||
typedef struct GC_Heap_Statistics_t {
|
||||
size_t bytes;
|
||||
} GC_Heap_Statistics;
|
||||
|
||||
static struct GC_Heap_t {
|
||||
RAW_PTR* blocks;
|
||||
size_t cap;
|
||||
size_t len;
|
||||
GC_Heap_Statistics statistics;
|
||||
} GC_GLOBAL_HEAP;
|
||||
|
||||
static void __GC_teardown(void) {
|
||||
INFO("Used %ld bytes in total", GC_GLOBAL_HEAP.statistics.bytes);
|
||||
|
||||
if (GC_GLOBAL_HEAP.blocks == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < GC_GLOBAL_HEAP.len; i++) {
|
||||
free(GC_GLOBAL_HEAP.blocks[i]);
|
||||
}
|
||||
|
||||
free(GC_GLOBAL_HEAP.blocks);
|
||||
|
||||
GC_GLOBAL_HEAP.blocks = NULL;
|
||||
}
|
||||
|
||||
static void __GC_check_init(void) {
|
||||
if (GC_GLOBAL_HEAP.blocks == NULL) {
|
||||
GC_GLOBAL_HEAP.cap = GC_HEAP_PREALLOC_CNT;
|
||||
const size_t bytes = sizeof(RAW_PTR) * GC_GLOBAL_HEAP.cap;
|
||||
GC_GLOBAL_HEAP.blocks = malloc(bytes);
|
||||
GC_GLOBAL_HEAP.len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void GC_init(void) {
|
||||
atexit(__GC_teardown);
|
||||
}
|
||||
|
||||
static void __GC_check_overflow(void) {
|
||||
if (GC_GLOBAL_HEAP.len >= GC_GLOBAL_HEAP.cap) {
|
||||
GC_GLOBAL_HEAP.cap += GC_HEAP_PREALLOC_CNT;
|
||||
const size_t bytes = sizeof(RAW_PTR) * GC_GLOBAL_HEAP.cap;
|
||||
GC_GLOBAL_HEAP.blocks = realloc(GC_GLOBAL_HEAP.blocks, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
RAW_PTR GC_malloc(const size_t bytes) {
|
||||
const RAW_PTR ptr = malloc(bytes);
|
||||
|
||||
if (ptr == NULL) {
|
||||
FATAL("unable to allocate memory");
|
||||
}
|
||||
|
||||
__GC_check_init();
|
||||
__GC_check_overflow();
|
||||
|
||||
GC_GLOBAL_HEAP.blocks[GC_GLOBAL_HEAP.len++] = ptr;
|
||||
|
||||
GC_GLOBAL_HEAP.statistics.bytes += bytes;
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void __GC_swap_ptr(RAW_PTR old, RAW_PTR new) {
|
||||
for (size_t i = 0; i < GC_GLOBAL_HEAP.len; i++) {
|
||||
if (GC_GLOBAL_HEAP.blocks[i] == old) {
|
||||
GC_GLOBAL_HEAP.blocks[i] = new;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RAW_PTR GC_realloc(RAW_PTR ptr, size_t bytes) {
|
||||
const RAW_PTR new_ptr = (RAW_PTR) realloc(ptr, bytes);
|
||||
|
||||
if (new_ptr == NULL) {
|
||||
FATAL("unable to reallocate memory");
|
||||
}
|
||||
|
||||
__GC_swap_ptr(ptr, new_ptr);
|
||||
|
||||
return new_ptr;
|
||||
}
|
||||
|
||||
void GC_free(RAW_PTR ptr) {
|
||||
DEBUG("freeing memory: %p", ptr);
|
||||
|
||||
for (size_t i = 0; i < GC_GLOBAL_HEAP.len; i++) {
|
||||
|
||||
if (ptr == GC_GLOBAL_HEAP.blocks[i]) {
|
||||
free(GC_GLOBAL_HEAP.blocks[i]);
|
||||
|
||||
GC_GLOBAL_HEAP.len--;
|
||||
|
||||
memcpy(&GC_GLOBAL_HEAP.blocks[i], &GC_GLOBAL_HEAP.blocks[i + 1], GC_GLOBAL_HEAP.len - i);
|
||||
}
|
||||
}
|
||||
}
|
24
src/gc/gc.h
24
src/gc/gc.h
|
@ -1,24 +0,0 @@
|
|||
//
|
||||
// Created by servostar on 5/7/24.
|
||||
//
|
||||
|
||||
#ifndef GC_H
|
||||
#define GC_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#define malloc GC_malloc
|
||||
#define free GC_free
|
||||
#define realloc GC_realloc
|
||||
|
||||
typedef void* RAW_PTR;
|
||||
|
||||
void GC_init(void);
|
||||
|
||||
RAW_PTR GC_malloc(size_t bytes);
|
||||
|
||||
RAW_PTR GC_realloc(RAW_PTR ptr, size_t bytes);
|
||||
|
||||
void GC_free(RAW_PTR ptr);
|
||||
|
||||
#endif //GC_H
|
|
@ -2,7 +2,6 @@
|
|||
%{
|
||||
#include <yacc/parser.tab.h>
|
||||
#include <sys/log.h>
|
||||
#include <gc/gc.h>
|
||||
|
||||
int yyLineNumber = 1;
|
||||
int yylex();
|
||||
|
|
73
src/main.c
73
src/main.c
|
@ -1,82 +1,71 @@
|
|||
#include <ast/ast.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/log.h>
|
||||
#include <yacc/parser.tab.h>
|
||||
#include <ast/ast.h>
|
||||
#include <gc/gc.h>
|
||||
|
||||
#define LOG_LEVEL LOG_LEVEL_DEBUG
|
||||
|
||||
extern FILE* yyin;
|
||||
extern FILE *yyin;
|
||||
|
||||
/**
|
||||
* @brief Log a debug message to inform about beginning exit procedures
|
||||
*
|
||||
*/
|
||||
void notify_exit(void)
|
||||
{
|
||||
DEBUG("Exiting gemstone...");
|
||||
}
|
||||
void notify_exit(void) { DEBUG("Exiting gemstone..."); }
|
||||
|
||||
/**
|
||||
* @brief Closes File after compiling.
|
||||
*
|
||||
*/
|
||||
|
||||
void close_file(void)
|
||||
{
|
||||
if (NULL != yyin)
|
||||
{
|
||||
fclose(yyin);
|
||||
}
|
||||
void close_file(void) {
|
||||
if (NULL != yyin) {
|
||||
fclose(yyin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Run compiler setup here
|
||||
*
|
||||
*/
|
||||
void setup(void)
|
||||
{
|
||||
// setup preample
|
||||
void setup(void) {
|
||||
// setup preample
|
||||
|
||||
log_init();
|
||||
DEBUG("starting gemstone...");
|
||||
log_init();
|
||||
DEBUG("starting gemstone...");
|
||||
|
||||
#if LOG_LEVEL <= LOG_LEVEL_DEBUG
|
||||
atexit(¬ify_exit);
|
||||
atexit(¬ify_exit);
|
||||
#endif
|
||||
|
||||
// actual setup
|
||||
AST_init();
|
||||
// actual setup
|
||||
AST_init();
|
||||
|
||||
GC_init();
|
||||
|
||||
DEBUG("finished starting up gemstone...");
|
||||
DEBUG("finished starting up gemstone...");
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
setup();
|
||||
atexit(close_file);
|
||||
setup();
|
||||
atexit(close_file);
|
||||
|
||||
// Check for file input as argument
|
||||
if (2 != argc)
|
||||
{
|
||||
INFO("Usage: %s <filename>\n", argv[0]);
|
||||
PANIC("No File could be found");
|
||||
}
|
||||
// Check for file input as argument
|
||||
if (2 != argc) {
|
||||
INFO("Usage: %s <filename>\n", argv[0]);
|
||||
PANIC("No File could be found");
|
||||
}
|
||||
|
||||
// filename as first argument
|
||||
char *filename = argv[1];
|
||||
// filename as first argument
|
||||
char *filename = argv[1];
|
||||
|
||||
FILE *file = fopen(filename, "r");
|
||||
FILE *file = fopen(filename, "r");
|
||||
|
||||
if (NULL == file)
|
||||
{
|
||||
PANIC("File couldn't be opened!");
|
||||
}
|
||||
yyin = file;
|
||||
if (NULL == file) {
|
||||
PANIC("File couldn't be opened!");
|
||||
}
|
||||
yyin = file;
|
||||
|
||||
yyparse();
|
||||
yyparse();
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
|
@ -2,7 +2,6 @@
|
|||
#define _SYS_ERR_H_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <gc/gc.h>
|
||||
|
||||
#define LOG_DEFAULT_STREAM stderr
|
||||
|
||||
|
|
Loading…
Reference in New Issue