1/*
2 *  Copyright (C) 2003, 2006, 2008 Apple Inc.
3 *
4 *  This library is free software; you can redistribute it and/or
5 *  modify it under the terms of the GNU Library General Public
6 *  License as published by the Free Software Foundation; either
7 *  version 2 of the License, or (at your option) any later version.
8 *
9 *  This library is distributed in the hope that it will be useful,
10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 *  Library General Public License for more details.
13 *
14 *  You should have received a copy of the GNU Library General Public License
15 *  along with this library; see the file COPYING.LIB.  If not, write to
16 *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 *  Boston, MA 02110-1301, USA.
18 *
19 */
20
21#include "config.h"
22#include "ScopeChain.h"
23
24#include "JSActivation.h"
25#include "JSGlobalObject.h"
26#include "JSObject.h"
27#include "PropertyNameArray.h"
28#include <stdio.h>
29
30namespace JSC {
31
32#ifndef NDEBUG
33
34void ScopeChainNode::print()
35{
36    ScopeChainIterator scopeEnd = end();
37    for (ScopeChainIterator scopeIter = begin(); scopeIter != scopeEnd; ++scopeIter) {
38        JSObject* o = scopeIter->get();
39        PropertyNameArray propertyNames(globalObject->globalExec());
40        o->getPropertyNames(globalObject->globalExec(), propertyNames);
41        PropertyNameArray::const_iterator propEnd = propertyNames.end();
42
43        fprintf(stderr, "----- [scope %p] -----\n", o);
44        for (PropertyNameArray::const_iterator propIter = propertyNames.begin(); propIter != propEnd; propIter++) {
45            Identifier name = *propIter;
46            fprintf(stderr, "%s, ", name.ustring().utf8().data());
47        }
48        fprintf(stderr, "\n");
49    }
50}
51
52#endif
53
54const ClassInfo ScopeChainNode::s_info = { "ScopeChainNode", 0, 0, 0 };
55
56int ScopeChainNode::localDepth()
57{
58    int scopeDepth = 0;
59    ScopeChainIterator iter = this->begin();
60    ScopeChainIterator end = this->end();
61    while (!(*iter)->inherits(&JSActivation::s_info)) {
62        ++iter;
63        if (iter == end)
64            break;
65        ++scopeDepth;
66    }
67    return scopeDepth;
68}
69
70void ScopeChainNode::markChildren(MarkStack& markStack)
71{
72    if (next)
73        markStack.append(&next);
74    markStack.append(&object);
75    markStack.append(&globalObject);
76    markStack.append(&globalThis);
77}
78
79} // namespace JSC
80