1/*
2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef JSPropertyNameIterator_h
30#define JSPropertyNameIterator_h
31
32#include "JSObject.h"
33#include "JSString.h"
34#include "Operations.h"
35#include "PropertyNameArray.h"
36#include "StructureChain.h"
37
38namespace JSC {
39
40 class Identifier;
41 class JSObject;
42
43 class JSPropertyNameIterator : public JSCell {
44 friend class JIT;
45
46 public:
47 static JSPropertyNameIterator* create(ExecState*, JSObject*);
48
49 static PassRefPtr<Structure> createStructure(JSValue prototype)
50 {
51 return Structure::create(prototype, typeInfo: TypeInfo(CompoundType, OverridesMarkChildren));
52 }
53
54 virtual bool isPropertyNameIterator() const { return true; }
55
56 virtual void markChildren(MarkStack&);
57
58 bool getOffset(size_t i, int& offset)
59 {
60 if (i >= m_numCacheableSlots)
61 return false;
62 offset = i;
63 return true;
64 }
65
66 JSValue get(ExecState*, JSObject*, size_t i);
67 size_t size() { return m_jsStringsSize; }
68
69 void setCachedStructure(Structure* structure) { m_cachedStructure = structure; }
70 Structure* cachedStructure() { return m_cachedStructure; }
71
72 void setCachedPrototypeChain(NonNullPassRefPtr<StructureChain> cachedPrototypeChain) { m_cachedPrototypeChain = cachedPrototypeChain; }
73 StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); }
74
75 private:
76 JSPropertyNameIterator(ExecState*, PropertyNameArrayData* propertyNameArrayData, size_t numCacheableSlot);
77
78 Structure* m_cachedStructure;
79 RefPtr<StructureChain> m_cachedPrototypeChain;
80 uint32_t m_numCacheableSlots;
81 uint32_t m_jsStringsSize;
82 OwnArrayPtr<JSValue> m_jsStrings;
83 };
84
85inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, PropertyNameArrayData* propertyNameArrayData, size_t numCacheableSlots)
86 : JSCell(exec->globalData().propertyNameIteratorStructure.get())
87 , m_cachedStructure(0)
88 , m_numCacheableSlots(numCacheableSlots)
89 , m_jsStringsSize(propertyNameArrayData->propertyNameVector().size())
90 , m_jsStrings(new JSValue[m_jsStringsSize])
91{
92 PropertyNameArrayData::PropertyNameVector& propertyNameVector = propertyNameArrayData->propertyNameVector();
93 for (size_t i = 0; i < m_jsStringsSize; ++i)
94 m_jsStrings[i] = jsOwnedString(exec, s: propertyNameVector[i].ustring());
95}
96
97inline void Structure::setEnumerationCache(JSPropertyNameIterator* enumerationCache)
98{
99 ASSERT(!isDictionary());
100 m_enumerationCache = enumerationCache;
101}
102
103} // namespace JSC
104
105#endif // JSPropertyNameIterator_h
106

source code of qtscript/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSPropertyNameIterator.h