Changeset 35368 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Jul 25, 2008, 8:52:24 PM (17 years ago)
Author:
[email protected]
Message:

Bug 19718: Named anonymous functions are slow accessing global variables
<https://bugs.webkit.org/show_bug.cgi?id=19718>

Reviewed by Cameron Zwarich.

To fix this we switch over to an activation-like scope object for
on which we attach the function name property, and add logic to
prevent cross scope assignment to read only properties.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r35309 r35368  
    3030#include "ExecState.h"
    3131#include "JSGlobalObject.h"
     32#include "JSStaticScopeObject.h"
    3233#include "Parser.h"
    3334#include "PropertyNameArray.h"
     
    429430    int index = 0;
    430431    size_t depth = 0;
    431     if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
     432    if (generator.findScopedProperty(m_ident, index, depth, false) && index != missingSymbolMarker()) {
    432433        RegisterID* func = generator.emitGetScopedVar(generator.newTemporary(), depth, index);
    433434        return generator.emitCall(generator.finalDestination(dst), func, 0, m_args.get(), m_divot, m_startOffset, m_endOffset);
     
    487488    int index = 0;
    488489    size_t depth = 0;
    489     if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
     490    if (generator.findScopedProperty(m_ident, index, depth, true) && index != missingSymbolMarker()) {
    490491        RefPtr<RegisterID> value = generator.emitGetScopedVar(generator.newTemporary(), depth, index);
    491492        RegisterID* oldValue;
     
    670671    int index = 0;
    671672    size_t depth = 0;
    672     if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
     673    if (generator.findScopedProperty(m_ident, index, depth, false) && index != missingSymbolMarker()) {
    673674        RefPtr<RegisterID> propDst = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index);
    674675        emitPreIncOrDec(generator, propDst.get(), m_operator);
     
    873874    int index = 0;
    874875    size_t depth = 0;
    875     if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
     876    if (generator.findScopedProperty(m_ident, index, depth, true) && index != missingSymbolMarker()) {
    876877        RefPtr<RegisterID> src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index);
    877878        RegisterID* src2 = generator.emitNode(m_right.get());
     
    904905    int index = 0;
    905906    size_t depth = 0;
    906     if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
     907    if (generator.findScopedProperty(m_ident, index, depth, true) && index != missingSymbolMarker()) {
    907908        if (dst == ignoredResult())
    908909            dst = 0;
     
    18401841
    18411842    if (!m_ident.isNull()) {
    1842         JSObject* functionScopeObject = new (exec) JSObject;
    1843         functionScopeObject->putDirect(m_ident, func, ReadOnly | DontDelete);
     1843        JSStaticScopeObject* functionScopeObject = new (exec) JSStaticScopeObject(m_ident, func, ReadOnly | DontDelete);
    18441844        func->scope().push(functionScopeObject);
    18451845    }
Note: See TracChangeset for help on using the changeset viewer.