about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorNguyễn Gia Phong <cnx@loang.net>2023-07-31 15:22:48 +0900
committerNguyễn Gia Phong <cnx@loang.net>2023-07-31 15:22:48 +0900
commit4062c1afe336c8ff1610950839ff36a7ff3829a8 (patch)
tree031aeb35cf881a35eb10b9500e1c31857373d5ff
parent066a6031c1ab72991e872bad8b48eb258a32acb0 (diff)
downloadklee-4062c1afe336c8ff1610950839ff36a7ff3829a8.tar.gz
Support 1-byte metavariables
-rw-r--r--lib/Core/ExecutionState.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/Core/ExecutionState.cpp b/lib/Core/ExecutionState.cpp
index f635c40c..163d82e9 100644
--- a/lib/Core/ExecutionState.cpp
+++ b/lib/Core/ExecutionState.cpp
@@ -386,13 +386,18 @@ std::string extractMetaEnvVar(ref<Expr> e) {
   if (constant->isFalse()) // the else branch
     return extractMetaEnvVar(eq->right);
 
-  if (eq->right.get()->getKind() != Expr::Concat)
-    return "";
-  const auto concat = dyn_cast<ConcatExpr>(eq->right.get());
-  if (concat->getLeft().get()->getKind() != Expr::Read)
-    return "";
+  ReadExpr* read;
+  if (eq->right.get()->getKind() == Expr::Read) {
+    read = dyn_cast<ReadExpr>(eq->right.get());
+  } else {
+    if (eq->right.get()->getKind() != Expr::Concat)
+      return "";
+    const auto concat = dyn_cast<ConcatExpr>(eq->right.get());
+    if (concat->getLeft().get()->getKind() != Expr::Read)
+      return "";
+    read = dyn_cast<ReadExpr>(concat->getLeft().get());
+  }
 
-  const auto read = dyn_cast<ReadExpr>(concat->getLeft().get());
   const auto& name = read->updates.root->name;
   // string::starts_with requires C++20
   if (name.substr(0, 8) != "__choose")