From 7480608e795c4979d3832661788f9e629faad671 Mon Sep 17 00:00:00 2001 From: Herman Venter Date: Fri, 20 Jul 2018 18:25:25 -0700 Subject: [PATCH] Provide a way to temporarily disable effects tracking (#2304) Summary: Release note: Provide a way to temporarily disable effects tracking The default error handler constructs a new Error object in order to reuse its logic for obtaining a call stack. Since the object is then thrown a away, it makes no sense to keep tracking its properties and doing so makes debugging more painful. Pull Request resolved: https://github.com/facebook/prepack/pull/2304 Differential Revision: D8945121 Pulled By: hermanventer fbshipit-source-id: 68fb8b84c2ef937fcdf3ecaccdff5041779424d5 --- src/realm.js | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/realm.js b/src/realm.js index dd641aa27..03147d3a5 100644 --- a/src/realm.js +++ b/src/realm.js @@ -854,8 +854,32 @@ export class Realm { return [effects, nodeAst, nodeIO]; } + // Use this to evaluate code for internal purposes, so that the tracked state does not get polluted + evaluateWithoutEffects(f: () => T): T { + // Save old state and set up undefined state + let savedGenerator = this.generator; + let savedBindings = this.modifiedBindings; + let savedProperties = this.modifiedProperties; + let savedCreatedObjects = this.createdObjects; + let saved_completion = this.savedCompletion; + try { + this.generator = undefined; + this.modifiedBindings = undefined; + this.modifiedProperties = undefined; + this.createdObjects = undefined; + this.savedCompletion = undefined; + return f(); + } finally { + this.generator = savedGenerator; + this.modifiedBindings = savedBindings; + this.modifiedProperties = savedProperties; + this.createdObjects = savedCreatedObjects; + this.savedCompletion = saved_completion; + } + } + evaluateForEffects(f: () => Completion | Value, state: any, generatorName: string): Effects { - // Save old state and set up empty state for ast + // Save old state and set up empty state let [savedBindings, savedProperties] = this.getAndResetModifiedMaps(); let saved_generator = this.generator; let saved_createdObjects = this.createdObjects; @@ -1764,7 +1788,7 @@ export class Realm { // Return value indicates whether the caller should try to recover from the error or not. handleError(diagnostic: CompilerDiagnostic): ErrorHandlerResult { if (!diagnostic.callStack && this.contextStack.length > 0) { - let error = Construct(this, this.intrinsics.Error); + let error = this.evaluateWithoutEffects(() => Construct(this, this.intrinsics.Error)); let stack = error._SafeGetDataPropertyValue("stack"); if (stack instanceof StringValue) diagnostic.callStack = stack.value; }