Introduced a TempAssign utility because I just couldn't watch this anymore. YMMV.
authorolehougaard <olehougaard@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 15 Dec 2008 08:55:35 +0000 (08:55 +0000)
committerolehougaard <olehougaard@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 15 Dec 2008 08:55:35 +0000 (08:55 +0000)
Review URL: http://codereview.chromium.org/14422

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@976 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/codegen-ia32.cc
src/utils.h

index 8e5420b66f834528e9e4487a19472dce8825d1e1..82fe877f87f31d685a11361f4180fd90dadbea16 100644 (file)
@@ -2057,10 +2057,9 @@ void CodeGenerator::VisitTryCatch(TryCatch* node) {
   }
 
   // Generate code for the statements in the try block.
-  bool was_inside_try = is_inside_try_;
-  is_inside_try_ = true;
-  VisitStatements(node->try_block()->statements());
-  is_inside_try_ = was_inside_try;
+  { TempAssign<bool> temp(&is_inside_try_, true);
+    VisitStatements(node->try_block()->statements());
+  }
 
   // Stop the introduced shadowing and count the number of required unlinks.
   // After shadowing stops, the original labels are unshadowed and the
@@ -2155,10 +2154,9 @@ void CodeGenerator::VisitTryFinally(TryFinally* node) {
   }
 
   // Generate code for the statements in the try block.
-  bool was_inside_try = is_inside_try_;
-  is_inside_try_ = true;
-  VisitStatements(node->try_block()->statements());
-  is_inside_try_ = was_inside_try;
+  { TempAssign<bool> temp(&is_inside_try_, true);
+    VisitStatements(node->try_block()->statements());
+  }
 
   // Stop the introduced shadowing and count the number of required unlinks.
   // After shadowing stops, the original labels are unshadowed and the
index 4a47841cd9e8e5b5cacf26a3506dcefd64a00a98..c8a43863f4170e6b5a085801a56382ddb316218e 100644 (file)
@@ -372,6 +372,23 @@ class Vector {
 };
 
 
+// A temporary assignment sets a (non-local) variable to a value on
+// construction and resets it the value on destruction.
+template <typename T>
+class TempAssign {
+ public:
+  TempAssign(T* var, T value): var_(var), old_value_(*var) {
+    *var = value;
+  }
+
+  ~TempAssign() { *var_ = old_value_; }
+
+ private:
+  T* var_;
+  T old_value_;
+};
+
+
 template <typename T, int kSize>
 class EmbeddedVector : public Vector<T> {
  public: