From f40482aa29f687b4630744457844bad7f45ec614 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Thu, 6 Oct 2016 23:30:22 +0100 Subject: Maybe types; value, ok := maybe_value(x) --- src/exact_value.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/exact_value.cpp') diff --git a/src/exact_value.cpp b/src/exact_value.cpp index 6cdc0c033..83e9d5ad6 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -25,7 +25,7 @@ struct ExactValue { String value_string; i64 value_integer; f64 value_float; - void * value_pointer; + i64 value_pointer; AstNode *value_compound; }; }; @@ -93,7 +93,7 @@ ExactValue make_exact_value_float(f64 f) { ExactValue make_exact_value_pointer(void *ptr) { ExactValue result = {ExactValue_Pointer}; - result.value_pointer = ptr; + result.value_pointer = cast(i64)cast(intptr)ptr; return result; } @@ -121,8 +121,14 @@ ExactValue exact_value_to_integer(ExactValue v) { switch (v.kind) { case ExactValue_Integer: return v; - case ExactValue_Float: - return make_exact_value_integer(cast(i64)v.value_float); + case ExactValue_Float: { + i64 i = cast(i64)v.value_float; + f64 f = cast(f64)i; + if (f == v.value_float) { + return make_exact_value_integer(i); + } + } break; + case ExactValue_Pointer: return make_exact_value_integer(cast(i64)cast(intptr)v.value_pointer); } -- cgit v1.2.3