tizen beta release
[framework/web/webkit-efl.git] / Source / JavaScriptCore / runtime / ScopeChain.cpp
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
30 namespace JSC {
31
32 ScopeChainNode::~ScopeChainNode()
33 {
34 }
35
36 #ifndef NDEBUG
37
38 void ScopeChainNode::print()
39 {
40     ScopeChainIterator scopeEnd = end();
41     for (ScopeChainIterator scopeIter = begin(); scopeIter != scopeEnd; ++scopeIter) {
42         JSObject* o = scopeIter->get();
43         PropertyNameArray propertyNames(globalObject->globalExec());
44         o->methodTable()->getPropertyNames(o, globalObject->globalExec(), propertyNames, ExcludeDontEnumProperties);
45         PropertyNameArray::const_iterator propEnd = propertyNames.end();
46
47         fprintf(stderr, "----- [scope %p] -----\n", o);
48         for (PropertyNameArray::const_iterator propIter = propertyNames.begin(); propIter != propEnd; propIter++) {
49             Identifier name = *propIter;
50             fprintf(stderr, "%s, ", name.ustring().utf8().data());
51         }
52         fprintf(stderr, "\n");
53     }
54 }
55
56 #endif
57
58 const ClassInfo ScopeChainNode::s_info = { "ScopeChainNode", 0, 0, 0, CREATE_METHOD_TABLE(ScopeChainNode) };
59
60 int ScopeChainNode::localDepth()
61 {
62     int scopeDepth = 0;
63     ScopeChainIterator iter = this->begin();
64     ScopeChainIterator end = this->end();
65     while (!(*iter)->inherits(&JSActivation::s_info)) {
66         ++iter;
67         if (iter == end)
68             break;
69         ++scopeDepth;
70     }
71     return scopeDepth;
72 }
73
74 void ScopeChainNode::visitChildren(JSCell* cell, SlotVisitor& visitor)
75 {
76     ScopeChainNode* thisObject = jsCast<ScopeChainNode*>(cell);
77     ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info);
78     COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
79     ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren());
80     if (thisObject->next)
81         visitor.append(&thisObject->next);
82     visitor.append(&thisObject->object);
83     visitor.append(&thisObject->globalObject);
84     visitor.append(&thisObject->globalThis);
85 }
86
87 } // namespace JSC