• Toon Verwaest's avatar
    [parser] Handle 'this' with a special ThisExpression rather than VariableProxy · 3f2b5017
    Toon Verwaest authored
    "this" is a very common expression. By using a single ThisExpression object
    we can both avoid allocating many unnecessary VariableProxies and specialize
    the resolution of this since we know where it's declared up-front. This also
    avoids having to special-case "this" reference handling in the paths that would
    behave differently for "this" than for regular references; e.g., with-scopes.
    
    The tricky pieces are due to DebugEvaluate and this/super() used as default
    parameters of arrow functions. In the former case we replace the WITH_SCOPE
    with FUNCTION_SCOPE so that we make sure that "this" is intercepted, and still
    rely on regular dynamic variable lookup. Arrow functions are dealt with by
    marking "this" use in ArrowHeadParsingScopes. If the parenthesized expression
    ends up being an arrow function, we force context allocate on the outer scope
    (and mark "has_this_reference" on the FUNCTION_SCOPE so DebugEvaluate in the
    arrow function can expose "this").
    
    The CL also removes the now unused ThisFunction AST node.
    
    Change-Id: I0ca38ab92ff58c2f731e07db2fbe91df901681ef
    Reviewed-on: https://chromium-review.googlesource.com/c/1448313Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
    Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
    Commit-Queue: Toon Verwaest <verwaest@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#59393}
    3f2b5017
ast.cc 31.5 KB