Replace Byte pointer with a generic pointer type
This commit is contained in:
		@@ -180,6 +180,8 @@ namespace elna::boot
 | 
			
		||||
                build_procedure(definition->heading()), definition->parameter_names);
 | 
			
		||||
 | 
			
		||||
        this->symbols->enter(definition->identifier.identifier, info);
 | 
			
		||||
        this->symbols = std::make_shared<symbol_table>(this->symbols);
 | 
			
		||||
 | 
			
		||||
        if (definition->body.has_value())
 | 
			
		||||
        {
 | 
			
		||||
            for (constant_definition *const constant : definition->body.value().constants())
 | 
			
		||||
@@ -195,6 +197,7 @@ namespace elna::boot
 | 
			
		||||
                statement->accept(this);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this->symbols = this->symbols->scope();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void declaration_visitor::visit(assign_statement *statement)
 | 
			
		||||
 
 | 
			
		||||
@@ -350,7 +350,7 @@ namespace elna::boot
 | 
			
		||||
        result->enter("Word", std::make_shared<type_info>(type(std::make_shared<primitive_type>("Word"))));
 | 
			
		||||
        result->enter("Char", std::make_shared<type_info>(type(std::make_shared<primitive_type>("Char"))));
 | 
			
		||||
        result->enter("Bool", std::make_shared<type_info>(type(std::make_shared<primitive_type>("Bool"))));
 | 
			
		||||
        result->enter("Byte", std::make_shared<type_info>(type(std::make_shared<primitive_type>("Byte"))));
 | 
			
		||||
        result->enter("Pointer", std::make_shared<type_info>(type(std::make_shared<primitive_type>("Pointer"))));
 | 
			
		||||
        result->enter("Float", std::make_shared<type_info>(type(std::make_shared<primitive_type>("Float"))));
 | 
			
		||||
        result->enter("String", std::make_shared<type_info>(type(std::make_shared<primitive_type>("String"))));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace elna::gcc
 | 
			
		||||
        elna_int_type_node = long_integer_type_node;
 | 
			
		||||
        elna_word_type_node = size_type_node;
 | 
			
		||||
        elna_char_type_node = unsigned_char_type_node;
 | 
			
		||||
        elna_byte_type_node = make_unsigned_type(8);
 | 
			
		||||
        elna_pointer_type_node = ptr_type_node;
 | 
			
		||||
        elna_float_type_node = double_type_node;
 | 
			
		||||
 | 
			
		||||
        elna_bool_type_node = boolean_type_node;
 | 
			
		||||
@@ -70,7 +70,7 @@ namespace elna::gcc
 | 
			
		||||
        declare_builtin_type(symbol_table, "Word", elna_word_type_node);
 | 
			
		||||
        declare_builtin_type(symbol_table, "Char", elna_char_type_node);
 | 
			
		||||
        declare_builtin_type(symbol_table, "Bool", elna_bool_type_node);
 | 
			
		||||
        declare_builtin_type(symbol_table, "Byte", elna_byte_type_node);
 | 
			
		||||
        declare_builtin_type(symbol_table, "Pointer", elna_pointer_type_node);
 | 
			
		||||
        declare_builtin_type(symbol_table, "Float", elna_float_type_node);
 | 
			
		||||
 | 
			
		||||
        tree string_declaration = declare_builtin_type(symbol_table, "String", elna_string_type_node);
 | 
			
		||||
 
 | 
			
		||||
@@ -59,9 +59,9 @@ namespace elna::gcc
 | 
			
		||||
        {
 | 
			
		||||
            return "Bool";
 | 
			
		||||
        }
 | 
			
		||||
        else if (unqualified_type == elna_byte_type_node)
 | 
			
		||||
        else if (unqualified_type == elna_pointer_type_node)
 | 
			
		||||
        {
 | 
			
		||||
            return "Byte";
 | 
			
		||||
            return "Pointer";
 | 
			
		||||
        }
 | 
			
		||||
        else if (unqualified_type == elna_float_type_node)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -138,22 +138,27 @@ namespace elna::gcc
 | 
			
		||||
        {
 | 
			
		||||
            tree pointer{ NULL_TREE };
 | 
			
		||||
            tree offset{ NULL_TREE };
 | 
			
		||||
            tree pointer_type{ NULL_TREE };
 | 
			
		||||
 | 
			
		||||
            if (POINTER_TYPE_P(left_type) && is_integral_type(right_type))
 | 
			
		||||
            {
 | 
			
		||||
                pointer = left;
 | 
			
		||||
                offset = right;
 | 
			
		||||
                pointer_type = left_type;
 | 
			
		||||
            }
 | 
			
		||||
            else if (is_integral_type(left_type) && POINTER_TYPE_P(right_type))
 | 
			
		||||
            {
 | 
			
		||||
                pointer = right;
 | 
			
		||||
                offset = left;
 | 
			
		||||
                pointer_type = right_type;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                return error_mark_node;
 | 
			
		||||
            }
 | 
			
		||||
            tree size_exp = fold_convert(TREE_TYPE(offset), size_in_bytes(TREE_TYPE(TREE_TYPE(pointer))));
 | 
			
		||||
            tree size_exp = pointer_type == elna_pointer_type_node
 | 
			
		||||
                ? size_one_node
 | 
			
		||||
                : fold_convert(TREE_TYPE(offset), size_in_bytes(TREE_TYPE(TREE_TYPE(pointer))));
 | 
			
		||||
 | 
			
		||||
            offset = fold_build2(MULT_EXPR, TREE_TYPE(offset), offset, size_exp);
 | 
			
		||||
            offset = fold_convert(sizetype, offset);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ enum elna_tree_index
 | 
			
		||||
    ELNA_TI_WORD_TYPE,
 | 
			
		||||
    ELNA_TI_CHAR_TYPE,
 | 
			
		||||
    ELNA_TI_BOOL_TYPE,
 | 
			
		||||
    ELNA_TI_BYTE_TYPE,
 | 
			
		||||
    ELNA_TI_POINTER_TYPE,
 | 
			
		||||
    ELNA_TI_FLOAT_TYPE,
 | 
			
		||||
    ELNA_TI_STRING_TYPE,
 | 
			
		||||
    ELNA_TI_BOOL_TRUE,
 | 
			
		||||
@@ -41,7 +41,7 @@ extern GTY(()) hash_map<nofree_string_hash, tree> *elna_global_decls;
 | 
			
		||||
#define elna_word_type_node elna_global_trees[ELNA_TI_WORD_TYPE]
 | 
			
		||||
#define elna_char_type_node elna_global_trees[ELNA_TI_CHAR_TYPE]
 | 
			
		||||
#define elna_bool_type_node elna_global_trees[ELNA_TI_BOOL_TYPE]
 | 
			
		||||
#define elna_byte_type_node elna_global_trees[ELNA_TI_BYTE_TYPE]
 | 
			
		||||
#define elna_pointer_type_node elna_global_trees[ELNA_TI_POINTER_TYPE]
 | 
			
		||||
#define elna_float_type_node elna_global_trees[ELNA_TI_FLOAT_TYPE]
 | 
			
		||||
#define elna_string_type_node elna_global_trees[ELNA_TI_STRING_TYPE]
 | 
			
		||||
#define elna_bool_true_node elna_global_trees[ELNA_TI_BOOL_TRUE]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								source.elna
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								source.elna
									
									
									
									
									
								
							@@ -96,17 +96,17 @@ type
 | 
			
		||||
  end
 | 
			
		||||
  FILE* = record end
 | 
			
		||||
  StringBuffer* = record
 | 
			
		||||
    data: ^Byte
 | 
			
		||||
    data: Pointer
 | 
			
		||||
    size: Word
 | 
			
		||||
    capacity: Word
 | 
			
		||||
  end
 | 
			
		||||
  SourceCode = record
 | 
			
		||||
    position: Position
 | 
			
		||||
 | 
			
		||||
	input: ^Byte
 | 
			
		||||
	empty: proc(^Byte) -> Bool
 | 
			
		||||
	advance: proc(^Byte)
 | 
			
		||||
	head: proc(^Byte) -> Char
 | 
			
		||||
	input: Pointer
 | 
			
		||||
	empty: proc(Pointer) -> Bool
 | 
			
		||||
	advance: proc(Pointer)
 | 
			
		||||
	head: proc(Pointer) -> Char
 | 
			
		||||
  end
 | 
			
		||||
  Token* = record
 | 
			
		||||
    kind: TokenKind
 | 
			
		||||
@@ -137,13 +137,13 @@ proc fclose(stream: ^FILE) -> Int; extern
 | 
			
		||||
proc fseek(stream: ^FILE, off: Int, whence: Int) -> Int; extern
 | 
			
		||||
proc rewind(stream: ^FILE); extern
 | 
			
		||||
proc ftell(stream: ^FILE) -> Int; extern
 | 
			
		||||
proc fread(ptr: ^Byte, size: Word, nmemb: Word, stream: ^FILE) -> Word; extern
 | 
			
		||||
proc write(fd: Int, buf: ^Byte, Word: Int) -> Int; extern
 | 
			
		||||
proc fread(ptr: Pointer, size: Word, nmemb: Word, stream: ^FILE) -> Word; extern
 | 
			
		||||
proc write(fd: Int, buf: Pointer, Word: Int) -> Int; extern
 | 
			
		||||
 | 
			
		||||
proc malloc(size: Word) -> ^Byte; extern
 | 
			
		||||
proc free(ptr: ^Byte); extern
 | 
			
		||||
proc calloc(nmemb: Word, size: Word) -> ^Byte; extern
 | 
			
		||||
proc realloc(ptr: ^Byte, size: Word) -> ^Byte; extern
 | 
			
		||||
proc malloc(size: Word) -> Pointer; extern
 | 
			
		||||
proc free(ptr: Pointer); extern
 | 
			
		||||
proc calloc(nmemb: Word, size: Word) -> Pointer; extern
 | 
			
		||||
proc realloc(ptr: Pointer, size: Word) -> Pointer; extern
 | 
			
		||||
 | 
			
		||||
proc memset(ptr: ^Char, c: Int, n: Int) -> ^Char; extern
 | 
			
		||||
 | 
			
		||||
@@ -160,18 +160,18 @@ proc exit(code: Int) -> !; extern
 | 
			
		||||
  Standard procedures.
 | 
			
		||||
*)
 | 
			
		||||
 | 
			
		||||
proc reallocarray(ptr: ^Byte, n: Word, size: Word) -> ^Byte;
 | 
			
		||||
proc reallocarray(ptr: Pointer, n: Word, size: Word) -> Pointer;
 | 
			
		||||
  return realloc(ptr, n * size)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc write_s(value: String);
 | 
			
		||||
begin
 | 
			
		||||
  write(0, cast(value.ptr: ^Byte), cast(value.length: Int))
 | 
			
		||||
  write(0, cast(value.ptr: Pointer), cast(value.length: Int))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc write_z(value: ^Char);
 | 
			
		||||
begin
 | 
			
		||||
  write(0, cast(value: ^Byte), cast(strlen(value): Int))
 | 
			
		||||
  write(0, cast(value: Pointer), cast(strlen(value): Int))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc write_b(value: Bool);
 | 
			
		||||
@@ -185,7 +185,7 @@ end
 | 
			
		||||
 | 
			
		||||
proc write_c(value: Char);
 | 
			
		||||
begin
 | 
			
		||||
  write(0, cast(@value: ^Byte), 1)
 | 
			
		||||
  write(0, cast(@value: Pointer), 1)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc write_i(value: Int);
 | 
			
		||||
@@ -268,7 +268,7 @@ begin
 | 
			
		||||
    buffer^.capacity := buffer^.capacity + 1024u;
 | 
			
		||||
    buffer^.data := realloc(buffer^.data, buffer^.capacity)
 | 
			
		||||
  end;
 | 
			
		||||
  (buffer^.data + buffer^.size)^ := cast(char: Byte);
 | 
			
		||||
  cast(buffer^.data + buffer^.size: ^Char)^ := cast(char: Char);
 | 
			
		||||
  buffer^.size := buffer^.size + 1u
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@@ -306,21 +306,21 @@ begin
 | 
			
		||||
  return result
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc source_file_empty(source_input: ^Byte) -> Bool;
 | 
			
		||||
proc source_file_empty(source_input: Pointer) -> Bool;
 | 
			
		||||
var
 | 
			
		||||
  source_file: ^SourceFile
 | 
			
		||||
begin
 | 
			
		||||
  source_file := cast(source_input: ^SourceFile);
 | 
			
		||||
 | 
			
		||||
  if source_file^.index > source_file^.size then
 | 
			
		||||
    source_file^.size := fread(cast(@source_file^.buffer: ^Byte), 1u, 1024u, source_file^.handle);
 | 
			
		||||
    source_file^.size := fread(cast(@source_file^.buffer: Pointer), 1u, 1024u, source_file^.handle);
 | 
			
		||||
	source_file^.index := 1u
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  return source_file^.size = 0u
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc source_file_head(source_input: ^Byte) -> Char;
 | 
			
		||||
proc source_file_head(source_input: Pointer) -> Char;
 | 
			
		||||
var
 | 
			
		||||
  source_file: ^SourceFile
 | 
			
		||||
begin
 | 
			
		||||
@@ -329,7 +329,7 @@ begin
 | 
			
		||||
  return source_file^.buffer[source_file^.index]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
proc source_file_advance(source_input: ^Byte);
 | 
			
		||||
proc source_file_advance(source_input: Pointer);
 | 
			
		||||
var
 | 
			
		||||
  source_file: ^SourceFile
 | 
			
		||||
begin
 | 
			
		||||
@@ -597,7 +597,7 @@ var
 | 
			
		||||
  new_length: Word
 | 
			
		||||
begin
 | 
			
		||||
  new_length := lexer^.length + 1u;
 | 
			
		||||
  lexer^.data := cast(reallocarray(cast(lexer^.data: ^Byte), new_length, #size(Token)): ^Token);
 | 
			
		||||
  lexer^.data := cast(reallocarray(cast(lexer^.data: Pointer), new_length, #size(Token)): ^Token);
 | 
			
		||||
  (lexer^.data + lexer^.length)^ := token;
 | 
			
		||||
  lexer^.length := new_length
 | 
			
		||||
end
 | 
			
		||||
@@ -1069,7 +1069,7 @@ begin
 | 
			
		||||
	end;
 | 
			
		||||
 | 
			
		||||
	source_code.position := Position(1u, 1u);
 | 
			
		||||
	source_code.input := cast(source_file: ^Byte);
 | 
			
		||||
	source_code.input := cast(source_file: Pointer);
 | 
			
		||||
	source_code.empty := source_file_empty;
 | 
			
		||||
	source_code.head := source_file_head;
 | 
			
		||||
	source_code.advance := source_file_advance;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user