diff --git a/runtime.js b/runtime.js
index <HASH>..<HASH> 100644
--- a/runtime.js
+++ b/runtime.js
@@ -467,7 +467,7 @@
       return ContinueSentinel;
     },
 
-    complete: function(record) {
+    complete: function(record, afterLoc) {
       if (record.type === "throw") {
         throw record.arg;
       }
@@ -478,6 +478,8 @@
       } else if (record.type === "return") {
         this.rval = record.arg;
         this.next = "end";
+      } else if (record.type === "normal" && afterLoc) {
+        this.next = afterLoc;
       }
 
       return ContinueSentinel;
@@ -485,7 +487,7 @@
 
     finish: function(finallyLoc) {
       var entry = this._findFinallyEntry(finallyLoc);
-      return this.complete(entry.completion);
+      return this.complete(entry.completion, entry.afterLoc);
     },
 
     "catch": function(tryLoc) {
Allow finally blocks to complete normally.

Code emitted for try blocks contains a final jump to the initial location
of the finally block (if present), which of course requires modifying
context.next. Unless we set context.next back to the after-location of the
try statement (namely, the .afterLoc property of the finally entry), then
the finally block will terminate with a jump back to its own initial
location, likely leading to an infinite loop.