Skip to content

Commit 1517840

Browse files
committed
Fix consteval a bit
1 parent e002191 commit 1517840

4 files changed

Lines changed: 50 additions & 22 deletions

File tree

src/builtins.pr

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,37 @@ export let bool_ = bool_t.id
7777
export let string_ = typechecking::array(char_)
7878
scope::create_type(builtins, parser::make_identifier("string"), parser::ShareMarker::EXPORT, typechecking::make_type_ref(string_))
7979

80-
export let float_ = create_float_type("float", size_of float)
81-
export let double_ = create_float_type("double", size_of double)
80+
export def get_int_of_size(size: size_t, unsig: bool) -> typechecking::TypeId {
81+
if unsig {
82+
switch size {
83+
case 1; return uint8_
84+
case 2; return uint16_
85+
case 4; return uint32_
86+
case 8; return uint64_
87+
case 16; return uint128_
88+
}
89+
} else {
90+
switch size {
91+
case 1; return int8_
92+
case 2; return int16_
93+
case 4; return int32_
94+
case 8; return int64_
95+
case 16; return int128_
96+
}
97+
}
98+
return 0
99+
}
100+
101+
def register(name: Str, tpe: typechecking::TypeId) -> typechecking::TypeId {
102+
scope::create_type(builtins, parser::make_identifier(name), parser::ShareMarker::EXPORT, typechecking::make_type_ref(tpe))
103+
return tpe
104+
}
105+
82106
export let float32_ = create_float_type("float32", size_of float32)
83107
export let float64_ = create_float_type("float64", size_of float64)
84108
export let float80_ = create_float_type("float80", size_of float80)
85-
86-
export let byte_ = create_int_type("byte", size_of byte, false)
87-
export let short_ = create_int_type("short", size_of short, false)
88-
export let int_ = create_int_type("int", size_of int, false)
89-
export let long_ = create_int_type("long", size_of long, false)
90-
91-
export let ubyte_ = create_int_type("ubyte", size_of ubyte, true)
92-
export let ushort_ = create_int_type("ushort", size_of ushort, true)
93-
export let uint_ = create_int_type("uint", size_of uint, true)
94-
export let ulong_ = create_int_type("ulong", size_of ulong, true)
109+
export let float_ = register("float", float32_)
110+
export let double_ = register("double", float64_)
95111

96112
export let int8_ = create_int_type("int8", size_of int8, false)
97113
export let int16_ = create_int_type("int16", size_of int16, false)
@@ -105,7 +121,17 @@ export let uint32_ = create_int_type("uint32", size_of uint32, true)
105121
export let uint64_ = create_int_type("uint64", size_of uint64, true)
106122
export let uint128_ = create_int_type("uint128", 16, true)
107123

108-
export let size_t_ = create_int_type("size_t", size_of size_t, true)
124+
export let byte_ = register("byte", get_int_of_size(size_of byte, false))
125+
export let short_ = register("short", get_int_of_size(size_of short, false))
126+
export let int_ = register("int", get_int_of_size(size_of int, false))
127+
export let long_ = register("long", get_int_of_size(size_of long, false))
128+
129+
export let ubyte_ = register("ubyte", get_int_of_size(size_of ubyte, true))
130+
export let ushort_ = register("ushort", get_int_of_size(size_of ushort, true))
131+
export let uint_ = register("uint", get_int_of_size(size_of uint, true))
132+
export let ulong_ = register("ulong", get_int_of_size(size_of ulong, true))
133+
134+
export let size_t_ = register("size_t", create_int_type("size_t", size_of size_t, true))
109135

110136
#if not defined WIN32 {
111137
let va_list_ident = parser::make_identifier("__va_list_tag")

src/consteval.pr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ export def compile_function(value: &scope::Value, context: &scope::Scope, argume
814814
var node = value.node
815815
var module = value.module
816816

817-
var is_repurposed = false // When There's no node and we find a new function we don't need to typecheck anymore
817+
/*var is_repurposed = false // When There's no node and we find a new function we don't need to typecheck anymore
818818
if not node {
819819
if not arguments { return value }
820820

@@ -831,10 +831,10 @@ export def compile_function(value: &scope::Value, context: &scope::Scope, argume
831831
return value
832832
}
833833
module = new_value.module
834-
}
834+
}*/
835835

836836
var function = node.value.def_.function
837-
if function.is_typechecked and not is_repurposed { return value }
837+
//if function.is_typechecked and not is_repurposed { return value }
838838

839839
let is_polymorph = typechecking::is_polymorph(function.fdef.parameter_t)
840840
if not is_polymorph {

src/eval.pr

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,8 @@ export def get(mem: *, tpe: &typechecking::Type) -> compiler::Value {
185185

186186
export def get_address(loc: compiler::Value, state: &State) -> * {
187187
if loc.kind == compiler::ValueKind::LOCAL {
188-
let mem = get_stack_frame(state).locals.get_or_default(loc.name, null)
188+
let frame = get_stack_frame(state)
189+
let mem = frame.locals.get_or_default(loc.name, null)
189190
if not mem {
190191
errors::errorv("Couldn't find memory for `", loc.name, "`")
191192
}
@@ -250,7 +251,6 @@ def set(mem: *, tpe: &typechecking::Type, value: compiler::Value) {
250251
errors::errorv("Tried to assign a null pointer")
251252
return
252253
}
253-
if not tpe { return }
254254
if value.kind == compiler::ValueKind::UNDEF { return }
255255
if value.kind == compiler::ValueKind::ZEROINITIALIZER {
256256
cstd::memset(mem, 0, tpe.size)
@@ -538,7 +538,7 @@ def eval_Alloca(insn: &compiler::Insn, state: &State) {
538538
let mem = frame.mem.allocate(size) // TODO: We shouldn't have to initialize this
539539
ret.tpe = typechecking::pointer(ret.tpe)
540540
let ptr = [ kind = compiler::ValueKind::POINTER, tpe = ret.tpe, i = mem !int64 ] !compiler::Value
541-
let addr = frame.mem.allocate(size)
541+
let addr = frame.mem.allocate(ret.tpe.resolve().size)
542542
frame.locals(ret.name) = addr
543543
set(addr, ret.tpe, ptr)
544544
}
@@ -1019,6 +1019,7 @@ def eval_Call(insn: &compiler::Insn, state: &State) {
10191019
codegen::emit_block(std::stdout(), block)
10201020
block = block.next
10211021
}
1022+
print("==========================\n")
10221023
}
10231024

10241025
eval(function.block, state)
@@ -1123,9 +1124,9 @@ def eval_Inttoptr(insn: &compiler::Insn, state: &State) {
11231124
}
11241125

11251126
def eval_insn(insn: &compiler::Insn, state: &State) {
1126-
//if toolchain::trace_consteval {
1127-
// codegen::emit(std::stdout(), insn)
1128-
//}
1127+
if toolchain::trace_consteval {
1128+
codegen::emit(std::stdout(), insn)
1129+
}
11291130
switch insn.kind !int {
11301131
case compiler::InsnKind::INSERTVALUE
11311132
eval_InsertValue(insn, state)

std/arena.pr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export def allocate(arena: &Arena, type T) -> *T {
3535
}
3636

3737
export def allocate(arena: &Arena, size: size_t) -> * {
38+
assert size > 0, "Cannot allocate zero bytes"
3839
var end = arena.end
3940
if not end {
4041
arena.start = make_region(arena.region_capacity)

0 commit comments

Comments
 (0)