start supporting identifiers in bytecode
This commit is contained in:
@@ -86,15 +86,13 @@ int load_cache(Translated *translated_dest, char *joined_paths, uint64_t hash) {
|
|||||||
FILE *bytecode_file = fopen(joined_paths, "rb");
|
FILE *bytecode_file = fopen(joined_paths, "rb");
|
||||||
if (!bytecode_file)
|
if (!bytecode_file)
|
||||||
return 1;
|
return 1;
|
||||||
char file_identifier_from_cache[sizeof(FILE_IDENTIFIER)];
|
char file_identifier_from_cache[sizeof(FILE_IDENTIFIER)] = {0};
|
||||||
file_identifier_from_cache[strlen(FILE_IDENTIFIER)] = '\0';
|
|
||||||
if (fread(&file_identifier_from_cache, 1,
|
if (fread(&file_identifier_from_cache, 1,
|
||||||
sizeof(file_identifier_from_cache) - 1,
|
sizeof(file_identifier_from_cache) - 1,
|
||||||
bytecode_file) != sizeof(file_identifier_from_cache) - 1 ||
|
bytecode_file) != sizeof(file_identifier_from_cache) - 1 ||
|
||||||
memcmp(file_identifier_from_cache, FILE_IDENTIFIER,
|
memcmp(file_identifier_from_cache, FILE_IDENTIFIER,
|
||||||
sizeof(file_identifier_from_cache)) != 0) {
|
sizeof(file_identifier_from_cache)) != 0) {
|
||||||
fclose(bytecode_file);
|
goto FAILED;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t read_version;
|
uint32_t read_version;
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ ParsedValue *parse_access(char *file, DArray *tokens, size_t *index,
|
|||||||
ParsedValue *parsedString = parse_string(token, false);
|
ParsedValue *parsedString = parse_string(token, false);
|
||||||
darray_push(&parsedAccess->access, parsedString);
|
darray_push(&parsedAccess->access, parsedString);
|
||||||
free(parsedString);
|
free(parsedString);
|
||||||
|
parsedAccess->access_fields = true;
|
||||||
} else {
|
} else {
|
||||||
|
parsedAccess->access_fields = false;
|
||||||
while (true) {
|
while (true) {
|
||||||
skip_newlines_and_indents(tokens, index);
|
skip_newlines_and_indents(tokens, index);
|
||||||
error_if_finished(file, tokens, index);
|
error_if_finished(file, tokens, index);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ParsedValue to_access;
|
ParsedValue to_access;
|
||||||
|
bool access_fields;
|
||||||
DArray access;
|
DArray access;
|
||||||
} ParsedAccess;
|
} ParsedAccess;
|
||||||
|
|
||||||
|
|||||||
15
src/translator/identifier/identifier.c
Normal file
15
src/translator/identifier/identifier.c
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include "../translator.h"
|
||||||
|
#include "identifier.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
size_t translate_parsed_identifier(Translated *translated, char* identifier) {
|
||||||
|
size_t length = strlen(identifier);
|
||||||
|
size_t identifier_pos = arena_push(&translated->constants, identifier, length);
|
||||||
|
set_registers(translated, 1);
|
||||||
|
size_t start = push_instruction_byte(translated, OP_IDENTIFIER);
|
||||||
|
push_instruction_code(translated,length);
|
||||||
|
push_instruction_code(translated, identifier_pos);
|
||||||
|
return start;
|
||||||
|
}
|
||||||
8
src/translator/identifier/identifier.h
Normal file
8
src/translator/identifier/identifier.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef BYTECODE_IDENTIFIER_H
|
||||||
|
#define BYTECODE_IDENTIFIER_H
|
||||||
|
#include "../translator.h"
|
||||||
|
#include "../../parser/assignable/identifier/identifier.h"
|
||||||
|
|
||||||
|
size_t translate_parsed_identifier(Translated *translated, char* identifier);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "../hashmap/hashmap.h"
|
#include "../hashmap/hashmap.h"
|
||||||
#include "declaration/declaration.h"
|
#include "declaration/declaration.h"
|
||||||
#include "function/function.h"
|
#include "function/function.h"
|
||||||
|
#include "identifier/identifier.h"
|
||||||
#include "number/number.h"
|
#include "number/number.h"
|
||||||
#include "string/string.h"
|
#include "string/string.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@@ -122,6 +123,8 @@ size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) {
|
|||||||
case AST_FUNCTION:
|
case AST_FUNCTION:
|
||||||
return translate_parsed_function(translated,
|
return translate_parsed_function(translated,
|
||||||
(ParsedFunction *)parsedValue->data);
|
(ParsedFunction *)parsedValue->data);
|
||||||
|
case AST_IDENTIFIER:
|
||||||
|
return translate_parsed_identifier(translated, (char *)parsedValue->data);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef enum { OP_LOAD_CONST, OP_DECLARE, OP_LOAD_NULL, OP_LOAD_FUNCTION } OperationType;
|
typedef enum { OP_LOAD_CONST, OP_DECLARE, OP_LOAD_NULL, OP_LOAD_FUNCTION, OP_IDENTIFIER } OperationType;
|
||||||
typedef enum { TYPE_OP_STRING, TYPE_OP_NUMBER } types;
|
typedef enum { TYPE_OP_STRING, TYPE_OP_NUMBER } types;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
1
testing.ar
Normal file
1
testing.ar
Normal file
@@ -0,0 +1 @@
|
|||||||
|
null
|
||||||
Reference in New Issue
Block a user