From 50a1c33adb70bf4eb92f58cab363d84b34550b37 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Fri, 18 Sep 2020 14:42:50 -0700 Subject: [PATCH] Adjust code lines. --- content/blog/13_compiler_cleanup/index.md | 25 +++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/content/blog/13_compiler_cleanup/index.md b/content/blog/13_compiler_cleanup/index.md index ee28252..6f1dc6d 100644 --- a/content/blog/13_compiler_cleanup/index.md +++ b/content/blog/13_compiler_cleanup/index.md @@ -535,7 +535,7 @@ In general, this change is also rather mechanical, but, to maintain a balance between exceptions and assertions, here are a couple more assertions from `type_env`: -{{< codelines "C++" "compiler/13/type_env.cpp" 77 78 >}} +{{< codelines "C++" "compiler/13/type_env.cpp" 81 82 >}} Once again, it should not be possible for the compiler to try generalize the type of a variable that doesn't @@ -621,7 +621,7 @@ Now that we've started using assertions, I also think it's worth to put our new invariant -- "only global definitions have mangled names" -- into code: -{{< codelines "C++" "compiler/13/type_env.cpp" 35 44 >}} +{{< codelines "C++" "compiler/13/type_env.cpp" 36 45 >}} Furthermore, we'll _require_ that a global definition has a mangled name. This way, we can be more confident @@ -631,11 +631,24 @@ this, we change `get_mangled_name` to stop returning the input string if a mangled name was not found; now that we _must_ have a mangled name, doing so is effectively obscuring the error. Instead, -we add another assertion: if an environment scope doesn't -contain a mangled name for a variable, then it _must_ -have a parent. We end up with the following: +we add two assertions. First, if an environment scope doesn't +contain a variable, then it _must_ have a parent. +If it does contain variable, that variable _must_ have +a mangled name. We end up with the following: -{{< codelines "C++" "compiler/13/type_env.cpp" 46 52 >}} +{{< codelines "C++" "compiler/13/type_env.cpp" 47 55 >}} + +For this to work, we make one more change. Now that we've +enabled C++17, we have access to `std::optional`. We +can thus represent the presence or absence of mangled +names using an optional field, rather than with the empty string `""`. +I hear that C++ compilers have pretty good +[empty string optimizations](https://www.youtube.com/watch?v=kPR8h4-qZdk), +but nonetheless, I think it makes more sense semantically +to use "absent" (`nullopt`) instead of "empty" (`""`). +Here's the definition of `type_env::variable_data` now: + +{{< codelines "C++" "compiler/13/type_env.hpp" 16 25 >}} Since looking up a mangled name for non-global variable will now result in an assertion failure, we have to change