diff --git a/src/main.c b/src/main.c index 716190d..cb0dbe5 100644 --- a/src/main.c +++ b/src/main.c @@ -86,15 +86,13 @@ int load_cache(Translated *translated_dest, char *joined_paths, uint64_t hash) { FILE *bytecode_file = fopen(joined_paths, "rb"); if (!bytecode_file) return 1; - char file_identifier_from_cache[sizeof(FILE_IDENTIFIER)]; - file_identifier_from_cache[strlen(FILE_IDENTIFIER)] = '\0'; + char file_identifier_from_cache[sizeof(FILE_IDENTIFIER)] = {0}; if (fread(&file_identifier_from_cache, 1, sizeof(file_identifier_from_cache) - 1, bytecode_file) != sizeof(file_identifier_from_cache) - 1 || memcmp(file_identifier_from_cache, FILE_IDENTIFIER, sizeof(file_identifier_from_cache)) != 0) { - fclose(bytecode_file); - return 1; + goto FAILED; } uint32_t read_version; diff --git a/src/parser/assignable/access/access.c b/src/parser/assignable/access/access.c index b989d76..713699e 100644 --- a/src/parser/assignable/access/access.c +++ b/src/parser/assignable/access/access.c @@ -22,7 +22,9 @@ ParsedValue *parse_access(char *file, DArray *tokens, size_t *index, ParsedValue *parsedString = parse_string(token, false); darray_push(&parsedAccess->access, parsedString); free(parsedString); + parsedAccess->access_fields = true; } else { + parsedAccess->access_fields = false; while (true) { skip_newlines_and_indents(tokens, index); error_if_finished(file, tokens, index); diff --git a/src/parser/assignable/access/access.h b/src/parser/assignable/access/access.h index a05ee86..2237213 100644 --- a/src/parser/assignable/access/access.h +++ b/src/parser/assignable/access/access.h @@ -5,6 +5,7 @@ typedef struct { ParsedValue to_access; + bool access_fields; DArray access; } ParsedAccess; diff --git a/src/translator/identifier/identifier.c b/src/translator/identifier/identifier.c new file mode 100644 index 0000000..47c8b76 --- /dev/null +++ b/src/translator/identifier/identifier.c @@ -0,0 +1,15 @@ +#include "../translator.h" +#include "identifier.h" +#include +#include +#include + +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; +} \ No newline at end of file diff --git a/src/translator/identifier/identifier.h b/src/translator/identifier/identifier.h new file mode 100644 index 0000000..83728c8 --- /dev/null +++ b/src/translator/identifier/identifier.h @@ -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 \ No newline at end of file diff --git a/src/translator/translator.c b/src/translator/translator.c index a1dfc53..176829f 100644 --- a/src/translator/translator.c +++ b/src/translator/translator.c @@ -3,6 +3,7 @@ #include "../hashmap/hashmap.h" #include "declaration/declaration.h" #include "function/function.h" +#include "identifier/identifier.h" #include "number/number.h" #include "string/string.h" #include @@ -122,6 +123,8 @@ size_t translate_parsed(Translated *translated, ParsedValue *parsedValue) { case AST_FUNCTION: return translate_parsed_function(translated, (ParsedFunction *)parsedValue->data); + case AST_IDENTIFIER: + return translate_parsed_identifier(translated, (char *)parsedValue->data); } return 0; } diff --git a/src/translator/translator.h b/src/translator/translator.h index 425d618..95b44df 100644 --- a/src/translator/translator.h +++ b/src/translator/translator.h @@ -8,7 +8,7 @@ #include #include -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 struct { diff --git a/testing.ar b/testing.ar new file mode 100644 index 0000000..ec747fa --- /dev/null +++ b/testing.ar @@ -0,0 +1 @@ +null \ No newline at end of file