change bits and pieces everywhere about var meta
This commit is contained in:
parent
a95d0e7fd8
commit
f2520e7d02
6 changed files with 44 additions and 47 deletions
|
@ -1,36 +1,12 @@
|
||||||
const (
|
|
||||||
test_var = 1 + 3
|
|
||||||
)
|
|
||||||
|
|
||||||
fn f() i32 {
|
fn f() i32 {
|
||||||
// var a = 3;
|
var a = 3;
|
||||||
// return a;
|
return a;
|
||||||
return 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn f2() i32 {
|
fn f2() i32 {
|
||||||
return f() + 2;
|
return f() + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//fn f2() bool {
|
|
||||||
// return 1 > 10;
|
|
||||||
//}
|
|
||||||
|
|
||||||
enum B {
|
|
||||||
a
|
|
||||||
b
|
|
||||||
c
|
|
||||||
}
|
|
||||||
|
|
||||||
enum C {
|
|
||||||
blah
|
|
||||||
bluh
|
|
||||||
}
|
|
||||||
|
|
||||||
fn test_function() B {
|
|
||||||
return B.b;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn func_refer_param(b: i32) i32 {
|
fn func_refer_param(b: i32) i32 {
|
||||||
return b * 231 + b;
|
return b * 231 + b;
|
||||||
}
|
}
|
||||||
|
@ -52,10 +28,6 @@ fn add(a: i32, b: i32) i32 {
|
||||||
return a + b;
|
return a + b;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn and_fn() bool {
|
|
||||||
return true and false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// type is void by default
|
// type is void by default
|
||||||
//fn main() {
|
//fn main() {
|
||||||
// print("piss\n");
|
// print("piss\n");
|
||||||
|
|
|
@ -280,7 +280,7 @@ pub const TypeSolver = struct {
|
||||||
.Variable => |vari| {
|
.Variable => |vari| {
|
||||||
self.setErrToken(vari);
|
self.setErrToken(vari);
|
||||||
var metadata = try ctx.resolveVarType(vari.lexeme, true);
|
var metadata = try ctx.resolveVarType(vari.lexeme, true);
|
||||||
try ctx.insertMetadata(expr, metadata.?);
|
try ctx.insertMetadata(vari.lexeme, metadata.?);
|
||||||
return metadata.?.typ;
|
return metadata.?.typ;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
14
src/ast.zig
14
src/ast.zig
|
@ -187,7 +187,19 @@ pub const VarDeclStmt = struct {
|
||||||
llvm_alloca: ?llvm.LLVMValueRef = null,
|
llvm_alloca: ?llvm.LLVMValueRef = null,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Stmt = union(enum) {
|
pub const StmtType = enum {
|
||||||
|
Expr,
|
||||||
|
Println,
|
||||||
|
|
||||||
|
VarDecl,
|
||||||
|
If,
|
||||||
|
Loop,
|
||||||
|
For,
|
||||||
|
|
||||||
|
Return,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Stmt = union(StmtType) {
|
||||||
Expr: *Expr,
|
Expr: *Expr,
|
||||||
Println: *Expr,
|
Println: *Expr,
|
||||||
|
|
||||||
|
|
|
@ -353,7 +353,7 @@ fn prettyType(typ: SymbolUnderlyingType) []const u8 {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn printScope(scope: *Scope, ident: usize) void {
|
pub fn printScope(scope: *Scope, ident: usize) void {
|
||||||
print(ident, "scope '{}' at addr {}\n", scope.id, &scope);
|
print(ident, "scope '{}' at addr {}\n", scope.id, @ptrToInt(scope));
|
||||||
|
|
||||||
var it = scope.env.iterator();
|
var it = scope.env.iterator();
|
||||||
while (it.next()) |kv| {
|
while (it.next()) |kv| {
|
||||||
|
|
|
@ -227,10 +227,10 @@ pub const Codegen = struct {
|
||||||
},
|
},
|
||||||
|
|
||||||
.Variable => |vari| {
|
.Variable => |vari| {
|
||||||
var kv_opt = self.ctx.metadata_map.get(expr);
|
var kv_opt = self.ctx.current_scope.?.meta_map.get(vari.lexeme);
|
||||||
|
|
||||||
if (kv_opt == null) {
|
if (kv_opt == null) {
|
||||||
std.debug.warn("variable {} not fully analyzed\n", vari);
|
std.debug.warn("variable {} not fully analyzed\n", vari.lexeme);
|
||||||
return CompileError.EmitError;
|
return CompileError.EmitError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,6 +238,7 @@ pub const Codegen = struct {
|
||||||
// is coming from the scope or from the function
|
// is coming from the scope or from the function
|
||||||
|
|
||||||
var metadata = kv_opt.?.value;
|
var metadata = kv_opt.?.value;
|
||||||
|
std.debug.warn("!! LOAD FROM VAR META {}\n", @ptrToInt(metadata));
|
||||||
|
|
||||||
var buf = try self.allocator.alloc(u8, 512);
|
var buf = try self.allocator.alloc(u8, 512);
|
||||||
errdefer self.allocator.free(buf);
|
errdefer self.allocator.free(buf);
|
||||||
|
@ -247,8 +248,6 @@ pub const Codegen = struct {
|
||||||
var load_cstr = try std.cstr.addNullByte(self.allocator, load_str);
|
var load_cstr = try std.cstr.addNullByte(self.allocator, load_str);
|
||||||
errdefer self.allocator.free(load_cstr);
|
errdefer self.allocator.free(load_cstr);
|
||||||
|
|
||||||
std.debug.warn("!! LOAD FROM VAR META {}\n", @ptrToInt(metadata));
|
|
||||||
|
|
||||||
return switch (metadata.using) {
|
return switch (metadata.using) {
|
||||||
.Function => blk: {
|
.Function => blk: {
|
||||||
var param = metadata.from_function.?.parameters.get(vari.lexeme).?.value;
|
var param = metadata.from_function.?.parameters.get(vari.lexeme).?.value;
|
||||||
|
@ -271,6 +270,8 @@ pub const Codegen = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emitStmt(self: *Codegen, builder: var, stmt: *ast.Stmt) anyerror!void {
|
fn emitStmt(self: *Codegen, builder: var, stmt: *ast.Stmt) anyerror!void {
|
||||||
|
std.debug.warn("cgen: emitting stmt {}\n", ast.StmtType(stmt.*));
|
||||||
|
|
||||||
switch (stmt.*) {
|
switch (stmt.*) {
|
||||||
.Expr => |expr| _ = try self.emitExpr(builder, expr),
|
.Expr => |expr| _ = try self.emitExpr(builder, expr),
|
||||||
|
|
||||||
|
@ -472,13 +473,15 @@ pub const Codegen = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.ctx.setScope(fn_sym.scope);
|
self.ctx.setScope(fn_sym.scope);
|
||||||
defer self.ctx.dumpScope();
|
|
||||||
|
|
||||||
|
// TODO check if stmt is return and if we already
|
||||||
|
// returned before
|
||||||
var body_slice = decl.body.toSlice();
|
var body_slice = decl.body.toSlice();
|
||||||
for (body_slice) |_, idx| {
|
for (body_slice) |_, idx| {
|
||||||
try self.emitStmt(builder, &body_slice[idx]);
|
try self.emitStmt(builder, &body_slice[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.ctx.dumpScope();
|
||||||
std.debug.warn("cgen: generated function '{}'\n", name);
|
std.debug.warn("cgen: generated function '{}'\n", name);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ pub const ScopeList = std.ArrayList(*Scope);
|
||||||
pub const Scope = struct {
|
pub const Scope = struct {
|
||||||
parent: ?*Scope,
|
parent: ?*Scope,
|
||||||
env: UnderlyingTypeMap,
|
env: UnderlyingTypeMap,
|
||||||
|
meta_map: VariableMetadataMap,
|
||||||
|
|
||||||
/// List of children in the scope.
|
/// List of children in the scope.
|
||||||
children: ScopeList,
|
children: ScopeList,
|
||||||
|
@ -56,7 +57,9 @@ pub const Scope = struct {
|
||||||
.children = ScopeList.init(allocator),
|
.children = ScopeList.init(allocator),
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.id = id,
|
.id = id,
|
||||||
|
.meta_map = VariableMetadataMap.init(allocator),
|
||||||
};
|
};
|
||||||
|
|
||||||
return scope;
|
return scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,6 +103,9 @@ pub const FunctionSymbol = struct {
|
||||||
parameter_list: TypeList,
|
parameter_list: TypeList,
|
||||||
|
|
||||||
scope: *Scope,
|
scope: *Scope,
|
||||||
|
|
||||||
|
// only contains metadata for parameters (i really need to simplify this)
|
||||||
|
meta_map: VariableMetadataMap,
|
||||||
};
|
};
|
||||||
|
|
||||||
// structs are hashmaps pointing to SymbolUnderlyingType
|
// structs are hashmaps pointing to SymbolUnderlyingType
|
||||||
|
@ -170,7 +176,7 @@ pub const VariableMetadata = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO rm const?
|
// TODO rm const?
|
||||||
pub const VariableMetadataMap = std.AutoHashMap(*const ast.Expr, *VariableMetadata);
|
pub const VariableMetadataMap = std.StringHashMap(*VariableMetadata);
|
||||||
|
|
||||||
/// Represents the context for a full compiler run.
|
/// Represents the context for a full compiler run.
|
||||||
/// This is used to manage the symbol table for the compilation unit, etc.
|
/// This is used to manage the symbol table for the compilation unit, etc.
|
||||||
|
@ -181,19 +187,15 @@ pub const CompilationContext = struct {
|
||||||
cur_function: ?*FunctionSymbol = null,
|
cur_function: ?*FunctionSymbol = null,
|
||||||
current_scope: ?*Scope = null,
|
current_scope: ?*Scope = null,
|
||||||
|
|
||||||
metadata_map: VariableMetadataMap,
|
|
||||||
|
|
||||||
pub fn init(allocator: *std.mem.Allocator) CompilationContext {
|
pub fn init(allocator: *std.mem.Allocator) CompilationContext {
|
||||||
return CompilationContext{
|
return CompilationContext{
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.symbol_table = SymbolTable.init(allocator),
|
.symbol_table = SymbolTable.init(allocator),
|
||||||
.metadata_map = VariableMetadataMap.init(allocator),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *@This()) void {
|
pub fn deinit(self: *@This()) void {
|
||||||
self.symbol_table.deinit();
|
self.symbol_table.deinit();
|
||||||
self.metadata_map.deinit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new scope out of the current one and set it as the current.
|
/// Create a new scope out of the current one and set it as the current.
|
||||||
|
@ -309,6 +311,8 @@ pub const CompilationContext = struct {
|
||||||
.parameters = param_map,
|
.parameters = param_map,
|
||||||
.parameter_list = param_types,
|
.parameter_list = param_types,
|
||||||
.scope = scope,
|
.scope = scope,
|
||||||
|
|
||||||
|
.meta_map = VariableMetadataMap.init(self.allocator),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -417,9 +421,15 @@ pub const CompilationContext = struct {
|
||||||
return CompilationError.UnknownName;
|
return CompilationError.UnknownName;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insertMetadata(self: *@This(), ptr: *const ast.Expr, metadata: *VariableMetadata) !void {
|
pub fn insertMetadata(self: *@This(), name: []const u8, metadata: *VariableMetadata) !void {
|
||||||
std.debug.assert(ast.ExprType(ptr.*) == .Variable);
|
if (self.current_scope) |scope| {
|
||||||
std.debug.warn("COMP CTX inserting metadata, expr={}, meta={}\n", @ptrToInt(ptr), @ptrToInt(metadata));
|
_ = try scope.meta_map.put(name, metadata);
|
||||||
_ = try self.metadata_map.put(ptr, metadata);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.cur_function) |func| {
|
||||||
|
_ = try func.meta_map.put(name, metadata);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue