start working on runtime
This commit is contained in:
@@ -1,13 +1,14 @@
|
|||||||
#include "hashmap.h"
|
#include "hashmap.h"
|
||||||
|
|
||||||
|
#include <gc/gc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "../memory.h"
|
#include "../memory.h"
|
||||||
|
|
||||||
struct table *createTable(int size)
|
struct table *createTable(int size)
|
||||||
{
|
{
|
||||||
struct table *t = (struct table *)checked_malloc(sizeof(struct table));
|
struct table *t = (struct table *)ar_alloc(sizeof(struct table));
|
||||||
t->size = size;
|
t->size = size;
|
||||||
t->list = (struct node **)checked_malloc(sizeof(struct node *) * size);
|
t->list = (struct node **)ar_alloc(sizeof(struct node *) * size);
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < size; i++)
|
for (i = 0; i < size; i++)
|
||||||
t->list[i] = NULL;
|
t->list[i] = NULL;
|
||||||
@@ -49,7 +50,7 @@ void insert(struct table *t, int key, void* val)
|
|||||||
{
|
{
|
||||||
int pos = hashCode(t, key);
|
int pos = hashCode(t, key);
|
||||||
struct node *list = t->list[pos];
|
struct node *list = t->list[pos];
|
||||||
struct node *newNode = (struct node *)checked_malloc(sizeof(struct node));
|
struct node *newNode = (struct node *)ar_alloc(sizeof(struct node));
|
||||||
struct node *temp = list;
|
struct node *temp = list;
|
||||||
while (temp)
|
while (temp)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
#ifndef HASHMAP_H
|
#ifndef HASHMAP_H
|
||||||
#define HASHMAP_H
|
#define HASHMAP_H
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
struct node
|
struct node
|
||||||
{
|
{
|
||||||
int key;
|
size_t key;
|
||||||
void *val;
|
void *val;
|
||||||
struct node *next;
|
struct node *next;
|
||||||
};
|
};
|
||||||
struct table
|
struct table
|
||||||
{
|
{
|
||||||
int size;
|
size_t size;
|
||||||
|
size_t count;
|
||||||
struct node **list;
|
struct node **list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
23
src/runtime/runtime.c
Normal file
23
src/runtime/runtime.c
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#include "runtime.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
uint64_t pop_bytecode(Translated *translated, RuntimeState *state) {
|
||||||
|
uint64_t *instruction = darray_get(&translated->bytecode, state->head++);
|
||||||
|
return *instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
void run_instruction(Translated *translated, RuntimeState *state) {
|
||||||
|
uint64_t opcode = pop_bytecode(translated, state);
|
||||||
|
switch (opcode) { case OP_LOAD_NULL: }
|
||||||
|
}
|
||||||
|
|
||||||
|
void runtime(Translated translated) {
|
||||||
|
RuntimeState state = {
|
||||||
|
checked_malloc(translated.registerCount * sizeof(size_t)), 0};
|
||||||
|
|
||||||
|
while (state.head < translated.bytecode.size)
|
||||||
|
run_instruction(&translated, &state);
|
||||||
|
free(state.registers);
|
||||||
|
}
|
||||||
19
src/runtime/runtime.h
Normal file
19
src/runtime/runtime.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef RUNTIME_H
|
||||||
|
#define RUNTIME_H
|
||||||
|
#include "../translator/translator.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t *registers;
|
||||||
|
size_t head;
|
||||||
|
} RuntimeState;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
} ArObject;
|
||||||
|
|
||||||
|
void run_instruction(Translated *translated, RuntimeState *state);
|
||||||
|
|
||||||
|
void runtime(Translated translated);
|
||||||
|
|
||||||
|
#endif // RUNTIME_H
|
||||||
@@ -4,11 +4,11 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
size_t translate_parsed_string(Translated *translated, ParsedString parsedString, size_t to_register) {
|
size_t translate_parsed_string(Translated *translated, ParsedString parsedString) {
|
||||||
size_t string_pos = arena_push(&translated->constants, parsedString.string, parsedString.length);
|
size_t string_pos = arena_push(&translated->constants, parsedString.string, parsedString.length);
|
||||||
set_registers(translated, to_register+1);
|
set_registers(translated, 1);
|
||||||
size_t start = push_instruction_code(translated, OP_LOAD_CONST);
|
size_t start = push_instruction_code(translated, OP_LOAD_CONST);
|
||||||
push_instruction_code(translated, to_register);
|
push_instruction_code(translated, 0);
|
||||||
push_instruction_code(translated, TYPE_OP_STRING);
|
push_instruction_code(translated, TYPE_OP_STRING);
|
||||||
push_instruction_code(translated,parsedString.length);
|
push_instruction_code(translated,parsedString.length);
|
||||||
push_instruction_code(translated, string_pos);
|
push_instruction_code(translated, string_pos);
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
#include "../translator.h"
|
#include "../translator.h"
|
||||||
#include "../../parser/string/string.h"
|
#include "../../parser/string/string.h"
|
||||||
|
|
||||||
size_t translate_parsed_string(Translated *translated, ParsedString parsedString, size_t to_register);
|
size_t translate_parsed_string(Translated *translated, ParsedString parsedString);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -82,7 +82,7 @@ void set_registers(Translated *translator, size_t count) {
|
|||||||
size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) {
|
size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) {
|
||||||
switch (parsedValue->type) {
|
switch (parsedValue->type) {
|
||||||
case AST_STRING:
|
case AST_STRING:
|
||||||
return translate_parsed_string(translated, *((ParsedString*)parsedValue->data), 0);
|
return translate_parsed_string(translated, *((ParsedString*)parsedValue->data));
|
||||||
case AST_DECLARATION:
|
case AST_DECLARATION:
|
||||||
return translate_parsed_declaration(translated, *((DArray*)parsedValue->data));
|
return translate_parsed_declaration(translated, *((DArray*)parsedValue->data));
|
||||||
case AST_NUMBER:
|
case AST_NUMBER:
|
||||||
|
|||||||
Reference in New Issue
Block a user