2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
29 #ifndef JSVariableObject_h
30 #define JSVariableObject_h
32 #include "LocalStorage.h"
33 #include "SymbolTable.h"
38 class JSVariableObject
: public JSObject
{
40 SymbolTable
& symbolTable() { return *d
->symbolTable
; }
41 LocalStorage
& localStorage() { return d
->localStorage
; }
43 void saveLocalStorage(SavedProperties
&) const;
44 void restoreLocalStorage(const SavedProperties
&);
46 virtual bool deleteProperty(ExecState
*, const Identifier
&);
47 virtual void getPropertyNames(ExecState
*, PropertyNameArray
&);
52 // Subclasses of JSVariableObject can subclass this struct to add data
53 // without increasing their own size (since there's a hard limit on the
55 struct JSVariableObjectData
{
56 JSVariableObjectData() { }
57 JSVariableObjectData(SymbolTable
* s
)
58 : symbolTable(s
) // Subclass owns this pointer.
62 LocalStorage localStorage
; // Storage for variables in the symbol table.
63 SymbolTable
* symbolTable
; // Maps name -> index in localStorage.
66 JSVariableObject() { }
68 JSVariableObject(JSVariableObjectData
* data
)
69 : d(data
) // Subclass owns this pointer.
73 JSVariableObject(JSValue
* proto
, JSVariableObjectData
* data
)
75 , d(data
) // Subclass owns this pointer.
79 bool symbolTableGet(const Identifier
&, PropertySlot
&);
80 bool symbolTablePut(const Identifier
&, JSValue
*, bool checkReadOnly
);
82 JSVariableObjectData
* d
;
85 inline bool JSVariableObject::symbolTableGet(const Identifier
& propertyName
, PropertySlot
& slot
)
87 size_t index
= symbolTable().get(propertyName
.ustring().rep());
88 if (index
!= missingSymbolMarker()) {
90 // During initialization, the variable object needs to advertise that it has certain
91 // properties, even if they're not ready for access yet. This check verifies that
92 // no one tries to access such a property.
94 // In a release build, we optimize this check away and just return an invalid pointer.
95 // There's no harm in an invalid pointer, since no one dereferences it.
96 if (index
>= d
->localStorage
.size()) {
97 slot
.setUngettable(this);
101 slot
.setValueSlot(this, &d
->localStorage
[index
].value
);
107 inline bool JSVariableObject::symbolTablePut(const Identifier
& propertyName
, JSValue
* value
, bool checkReadOnly
)
109 size_t index
= symbolTable().get(propertyName
.ustring().rep());
110 if (index
== missingSymbolMarker())
112 LocalStorageEntry
& entry
= d
->localStorage
[index
];
113 if (checkReadOnly
&& (entry
.attributes
& ReadOnly
))
121 #endif // JSVariableObject_h