diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-10-06 23:30:22 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-10-06 23:30:22 +0100 |
| commit | f40482aa29f687b4630744457844bad7f45ec614 (patch) | |
| tree | f9d4cdec95d29197ce5a657c370eb3461e2cbbf4 /src/exact_value.cpp | |
| parent | 50301557b2425fc0b4dd213ad03fb635cbd6e454 (diff) | |
Maybe types; value, ok := maybe_value(x)
Diffstat (limited to 'src/exact_value.cpp')
| -rw-r--r-- | src/exact_value.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
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); } |