about summary refs log tree commit diff stats
path: root/010vm.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-17 00:52:23 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-17 00:52:23 -0700
commit6f8f9fb53b5a7ef26496d496a4b93266c78d6332 (patch)
treedd7c6f97ead76e5a2e9026eb49d72f29de417e86 /010vm.cc
parent304963834dbe1e9f019a818e0dbf9c63647fa1c4 (diff)
downloadmu-6f8f9fb53b5a7ef26496d496a4b93266c78d6332.tar.gz
1390 - support non-integer literals
Since '3.14159:literal' looks ugly, we'll just say '3.14159'. It's not
like non-integers can be confused for anything but literals.

Once I tried to turn reagent values into doubles, I uncovered a bug:
arithmetic using signed integers is busted; if either operand of
subtraction is unsigned the result is unsigned as well. If it needs to
be negative: ka-boom. It was only masked because I was eventually
storing the result in a long long int, where it was out of range, and so
overflowing into the correct signed value. Once I switched to doubles
the unsigned value would indeed fit without overflowing. Ka-boom.

Yet another reminder that unsigned integers suck. I started using them
mostly to avoid warnings in loops when comparing with .size(), which is
usually a size_t.

Who knows what other crap lurks here. Just use signed integers
everywhere. (And avoid bitwise operators.)
Diffstat (limited to '010vm.cc')
-rw-r--r--010vm.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/010vm.cc b/010vm.cc
index c5e13543..6b94e4a3 100644
--- a/010vm.cc
+++ b/010vm.cc
@@ -41,12 +41,12 @@ struct instruction {
 struct reagent {
   vector<pair<string, vector<string> > > properties;
   string name;
-  long long int value;
+  double value;
   bool initialized;
   vector<type_number> types;
   reagent(string s);
   reagent();
-  void set_value(long long int v) { value = v; initialized = true; }
+  void set_value(double v) { value = v; initialized = true; }
   string to_string() const;
 };