2 * Copyright (C) 2012 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
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "ResolveGlobalStatus.h"
29 #include "CodeBlock.h"
30 #include "JSCJSValue.h"
31 #include "Operations.h"
32 #include "Structure.h"
36 static ResolveGlobalStatus
computeForStructure(CodeBlock
* codeBlock
, Structure
* structure
, Identifier
& identifier
)
38 unsigned attributesIgnored
;
39 JSCell
* specificValue
;
40 PropertyOffset offset
= structure
->get(*codeBlock
->vm(), identifier
, attributesIgnored
, specificValue
);
41 if (structure
->isDictionary())
43 if (!isValidOffset(offset
))
44 return ResolveGlobalStatus();
46 return ResolveGlobalStatus(ResolveGlobalStatus::Simple
, structure
, offset
, specificValue
);
49 ResolveGlobalStatus
ResolveGlobalStatus::computeFor(CodeBlock
* codeBlock
, int, ResolveOperation
* operation
, Identifier
& identifier
)
51 ASSERT(operation
->m_operation
== ResolveOperation::GetAndReturnGlobalProperty
);
52 if (!operation
->m_structure
)
53 return ResolveGlobalStatus();
55 return computeForStructure(codeBlock
, operation
->m_structure
.get(), identifier
);