hashmap changes
This commit is contained in:
parent
56be677c7a
commit
0265eddb2e
3 changed files with 27 additions and 26 deletions
|
@ -80,14 +80,14 @@ pub const Analyzer = struct {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return switch (sym.?.value.*) {
|
return switch (sym.?.*) {
|
||||||
.Struct => SymbolUnderlyingType{ .Struct = val },
|
.Struct => SymbolUnderlyingType{ .Struct = val },
|
||||||
.Enum => SymbolUnderlyingType{ .Enum = val },
|
.Enum => SymbolUnderlyingType{ .Enum = val },
|
||||||
|
|
||||||
else => blk: {
|
else => blk: {
|
||||||
self.doError("expected struct or enum for '{}', got {}", .{
|
self.doError("expected struct or enum for '{}', got {}", .{
|
||||||
val,
|
val,
|
||||||
@tagName(@as(comp.SymbolType, sym.?.value.*)),
|
@tagName(@as(comp.SymbolType, sym.?.*)),
|
||||||
});
|
});
|
||||||
break :blk null;
|
break :blk null;
|
||||||
},
|
},
|
||||||
|
@ -314,7 +314,7 @@ pub const Analyzer = struct {
|
||||||
.Enum => |enum_identifier| {
|
.Enum => |enum_identifier| {
|
||||||
// fetch an enum off symbol table, then we use the
|
// fetch an enum off symbol table, then we use the
|
||||||
// identifier map to ensure get.name exists in the enum
|
// identifier map to ensure get.name exists in the enum
|
||||||
var map = ctx.symbol_table.get(enum_identifier).?.value.Enum;
|
var map = ctx.symbol_table.get(enum_identifier).?.Enum;
|
||||||
const name = get.name.lexeme;
|
const name = get.name.lexeme;
|
||||||
|
|
||||||
var kv = map.get(name);
|
var kv = map.get(name);
|
||||||
|
@ -355,8 +355,8 @@ pub const Analyzer = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var value_type = try self.resolveExprType(ctx, assign.value);
|
var value_type = try self.resolveExprType(ctx, assign.value);
|
||||||
try self.expectSymUnTypeEqual(var_type.?.value, value_type);
|
try self.expectSymUnTypeEqual(var_type.?, value_type);
|
||||||
return var_type.?.value;
|
return var_type.?;
|
||||||
},
|
},
|
||||||
|
|
||||||
.Set => @panic("TODO analysis of Set exprs"),
|
.Set => @panic("TODO analysis of Set exprs"),
|
||||||
|
@ -496,8 +496,8 @@ pub const Analyzer = struct {
|
||||||
if (ret_type != null)
|
if (ret_type != null)
|
||||||
self.doError("Return type was not fully resolved", .{});
|
self.doError("Return type was not fully resolved", .{});
|
||||||
|
|
||||||
if (parameters.len != decl.params.len)
|
if (parameters.items.len != decl.params.items.len)
|
||||||
self.doError("Fully analyzed {} parameters, wanted {}", .{ parameters.len, decl.params.len });
|
self.doError("Fully analyzed {} parameters, wanted {}", .{ parameters.items.len, decl.params.items.len });
|
||||||
|
|
||||||
return CompileError.TypeError;
|
return CompileError.TypeError;
|
||||||
}
|
}
|
||||||
|
@ -534,7 +534,7 @@ pub const Analyzer = struct {
|
||||||
|
|
||||||
// we don't return type errors from the main loop so we can
|
// we don't return type errors from the main loop so we can
|
||||||
// keep going and find more type errors
|
// keep going and find more type errors
|
||||||
if (types.len == struc.fields.len)
|
if (types.items.len == struc.fields.items.len)
|
||||||
try ctx.insertStruct(struc, types);
|
try ctx.insertStruct(struc, types);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ pub const Codegen = struct {
|
||||||
},
|
},
|
||||||
|
|
||||||
.Struct, .Enum => |lex| blk: {
|
.Struct, .Enum => |lex| blk: {
|
||||||
var sym_data = self.ctx.symbol_table.get(lex).?.value;
|
var sym_data = self.ctx.symbol_table.get(lex).?;
|
||||||
break :blk switch (sym_data.*) {
|
break :blk switch (sym_data.*) {
|
||||||
.Struct => unreachable,
|
.Struct => unreachable,
|
||||||
.Enum => llvm.LLVMInt32Type(),
|
.Enum => llvm.LLVMInt32Type(),
|
||||||
|
@ -76,7 +76,7 @@ pub const Codegen = struct {
|
||||||
get.name.lexeme,
|
get.name.lexeme,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return llvm.LLVMConstInt(llvm.LLVMInt32Type(), val.?.value, 1);
|
return llvm.LLVMConstInt(llvm.LLVMInt32Type(), val.?, 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
.Struct => @panic("TODO handle struct"),
|
.Struct => @panic("TODO handle struct"),
|
||||||
|
@ -194,7 +194,7 @@ pub const Codegen = struct {
|
||||||
|
|
||||||
return llvm.LLVMBuildCall(
|
return llvm.LLVMBuildCall(
|
||||||
builder,
|
builder,
|
||||||
llvm_func.?.value,
|
llvm_func.?,
|
||||||
args_slice.ptr,
|
args_slice.ptr,
|
||||||
@intCast(c_uint, args_slice.len),
|
@intCast(c_uint, args_slice.len),
|
||||||
"call",
|
"call",
|
||||||
|
@ -203,10 +203,10 @@ pub const Codegen = struct {
|
||||||
|
|
||||||
.Assign => |assign| {
|
.Assign => |assign| {
|
||||||
const name = assign.name.lexeme;
|
const name = assign.name.lexeme;
|
||||||
var meta = self.ctx.current_scope.?.meta_map.get(name).?.value;
|
var meta = self.ctx.current_scope.?.meta_map.get(name).?;
|
||||||
var assign_expr = try self.emitExpr(builder, assign.value);
|
var assign_expr = try self.emitExpr(builder, assign.value);
|
||||||
var llvm_alloca: llvm.LLVMValueRef = switch (meta.using) {
|
var llvm_alloca: llvm.LLVMValueRef = switch (meta.using) {
|
||||||
.Function => meta.from_function.?.parameters.get(name).?.value.llvm_alloca.?,
|
.Function => meta.from_function.?.parameters.get(name).?.llvm_alloca.?,
|
||||||
.Scope => meta.llvm_alloca.?,
|
.Scope => meta.llvm_alloca.?,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ pub const Codegen = struct {
|
||||||
// we have metadata, which means we can check if the variable
|
// we have metadata, which means we can check if the variable
|
||||||
// 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.?;
|
||||||
std.debug.warn("!! LOAD FROM VAR META {}\n", .{@ptrToInt(metadata)});
|
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);
|
||||||
|
@ -237,13 +237,13 @@ pub const Codegen = struct {
|
||||||
|
|
||||||
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).?;
|
||||||
break :blk llvm.LLVMBuildLoad(builder, param.llvm_alloca.?, load_cstr.ptr);
|
break :blk llvm.LLVMBuildLoad(builder, param.llvm_alloca.?, load_cstr.ptr);
|
||||||
},
|
},
|
||||||
|
|
||||||
.Scope => blk: {
|
.Scope => blk: {
|
||||||
var llvm_alloca = metadata.llvm_alloca.?;
|
var llvm_alloca = metadata.llvm_alloca.?;
|
||||||
//var var_typ = metadata.from_scope.?.env.get(vari.lexeme).?.value;
|
//var var_typ = metadata.from_scope.?.env.get(vari.lexeme).?;
|
||||||
break :blk llvm.LLVMBuildLoad(builder, llvm_alloca, load_cstr.ptr);
|
break :blk llvm.LLVMBuildLoad(builder, llvm_alloca, load_cstr.ptr);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -361,7 +361,7 @@ pub const Codegen = struct {
|
||||||
// analyze pass and the current scope contains the variable's
|
// analyze pass and the current scope contains the variable's
|
||||||
// type(hopefully), so we resolve it
|
// type(hopefully), so we resolve it
|
||||||
const name = vardecl.name.lexeme;
|
const name = vardecl.name.lexeme;
|
||||||
var var_metadata = self.ctx.current_scope.?.meta_map.get(name).?.value;
|
var var_metadata = self.ctx.current_scope.?.meta_map.get(name).?;
|
||||||
|
|
||||||
var name_cstr = try std.cstr.addNullByte(self.allocator, name);
|
var name_cstr = try std.cstr.addNullByte(self.allocator, name);
|
||||||
errdefer self.allocator.free(name_cstr);
|
errdefer self.allocator.free(name_cstr);
|
||||||
|
@ -392,7 +392,7 @@ pub const Codegen = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn getFnSymbol(self: *@This(), name: []const u8) *comp.FunctionSymbol {
|
fn getFnSymbol(self: *@This(), name: []const u8) *comp.FunctionSymbol {
|
||||||
var fn_sym_search = self.ctx.symbol_table.get(name).?.value;
|
var fn_sym_search = self.ctx.symbol_table.get(name).?;
|
||||||
std.debug.assert(@as(comp.SymbolType, fn_sym_search.*) == .Function);
|
std.debug.assert(@as(comp.SymbolType, fn_sym_search.*) == .Function);
|
||||||
return &fn_sym_search.Function;
|
return &fn_sym_search.Function;
|
||||||
}
|
}
|
||||||
|
@ -421,7 +421,7 @@ pub const Codegen = struct {
|
||||||
for (decl.params.items) |param| {
|
for (decl.params.items) |param| {
|
||||||
try param_types.append(try self.typeToLLVM(fn_sym.parameters.get(
|
try param_types.append(try self.typeToLLVM(fn_sym.parameters.get(
|
||||||
param.name.lexeme,
|
param.name.lexeme,
|
||||||
).?.value.typ));
|
).?.typ));
|
||||||
}
|
}
|
||||||
|
|
||||||
var llvm_ret_type = llvm.LLVMFunctionType(
|
var llvm_ret_type = llvm.LLVMFunctionType(
|
||||||
|
@ -446,7 +446,7 @@ pub const Codegen = struct {
|
||||||
// the stack
|
// the stack
|
||||||
var params_slice = decl.params.items;
|
var params_slice = decl.params.items;
|
||||||
for (params_slice) |param_node, idx| {
|
for (params_slice) |param_node, idx| {
|
||||||
var param = fn_sym.parameters.get(param_node.name.lexeme).?.value;
|
var param = fn_sym.parameters.get(param_node.name.lexeme).?;
|
||||||
|
|
||||||
const param_name_cstr = try std.cstr.addNullByte(self.allocator, param_node.name.lexeme);
|
const param_name_cstr = try std.cstr.addNullByte(self.allocator, param_node.name.lexeme);
|
||||||
errdefer self.allocator.free(param_name_cstr);
|
errdefer self.allocator.free(param_name_cstr);
|
||||||
|
@ -483,7 +483,7 @@ pub const Codegen = struct {
|
||||||
for (constdecls.items) |constdecl| {
|
for (constdecls.items) |constdecl| {
|
||||||
const name = constdecl.name.lexeme;
|
const name = constdecl.name.lexeme;
|
||||||
|
|
||||||
var const_type = self.ctx.symbol_table.get(name).?.value;
|
var const_type = self.ctx.symbol_table.get(name).?;
|
||||||
var const_llvm_type = try self.typeToLLVM(const_type.Const);
|
var const_llvm_type = try self.typeToLLVM(const_type.Const);
|
||||||
|
|
||||||
const const_name = try std.cstr.addNullByte(self.allocator, name);
|
const const_name = try std.cstr.addNullByte(self.allocator, name);
|
||||||
|
|
|
@ -76,7 +76,8 @@ pub const Scope = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: *const @This()) void {
|
pub fn deinit(self: *const @This()) void {
|
||||||
self.env.deinit();
|
// XXX: fix this someday
|
||||||
|
// self.env.deinit();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -318,7 +319,7 @@ pub const CompilationContext = struct {
|
||||||
_ = try self.symbol_table.put(lex, symbol);
|
_ = try self.symbol_table.put(lex, symbol);
|
||||||
|
|
||||||
var kv = self.symbol_table.get(lex);
|
var kv = self.symbol_table.get(lex);
|
||||||
self.cur_function = &kv.?.value.Function;
|
self.cur_function = &kv.?.Function;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insertEnum(self: *@This(), enu: ast.Enum) !void {
|
pub fn insertEnum(self: *@This(), enu: ast.Enum) !void {
|
||||||
|
@ -352,7 +353,7 @@ pub const CompilationContext = struct {
|
||||||
return CompilationError.TypeError;
|
return CompilationError.TypeError;
|
||||||
}
|
}
|
||||||
|
|
||||||
var value = sym_kv.?.value;
|
var value = sym_kv.?;
|
||||||
|
|
||||||
var sym_typ = @as(SymbolType, value.*);
|
var sym_typ = @as(SymbolType, value.*);
|
||||||
if (sym_typ != typ) {
|
if (sym_typ != typ) {
|
||||||
|
@ -378,7 +379,7 @@ pub const CompilationContext = struct {
|
||||||
return try VariableMetadata.withScope(
|
return try VariableMetadata.withScope(
|
||||||
self.allocator,
|
self.allocator,
|
||||||
scope,
|
scope,
|
||||||
kv.value,
|
kv,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
@ -408,7 +409,7 @@ pub const CompilationContext = struct {
|
||||||
return try VariableMetadata.withParam(
|
return try VariableMetadata.withParam(
|
||||||
self.allocator,
|
self.allocator,
|
||||||
cur_function,
|
cur_function,
|
||||||
kv.value.typ,
|
kv.typ,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
|
Loading…
Reference in a new issue