Skip to content

Commit 91c5eb8

Browse files
committed
Added repo files
1 parent 739bead commit 91c5eb8

File tree

892 files changed

+376515
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

892 files changed

+376515
-0
lines changed

Diff for: API/APICast.h

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
* Copyright (C) 2006 Apple Computer, 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+
* 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.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.
24+
*/
25+
26+
#ifndef APICast_h
27+
#define APICast_h
28+
29+
#include "JSAPIValueWrapper.h"
30+
#include "JSGlobalObject.h"
31+
#include "JSValue.h"
32+
#include <wtf/UnusedParam.h>
33+
34+
namespace JSC {
35+
class ExecState;
36+
class PropertyNameArray;
37+
class JSGlobalData;
38+
class JSObject;
39+
class JSValue;
40+
}
41+
42+
typedef const struct OpaqueJSContextGroup* JSContextGroupRef;
43+
typedef const struct OpaqueJSContext* JSContextRef;
44+
typedef struct OpaqueJSContext* JSGlobalContextRef;
45+
typedef struct OpaqueJSPropertyNameAccumulator* JSPropertyNameAccumulatorRef;
46+
typedef const struct OpaqueJSValue* JSValueRef;
47+
typedef struct OpaqueJSValue* JSObjectRef;
48+
49+
/* Opaque typing convenience methods */
50+
51+
inline JSC::ExecState* toJS(JSContextRef c)
52+
{
53+
ASSERT(c);
54+
return reinterpret_cast<JSC::ExecState*>(const_cast<OpaqueJSContext*>(c));
55+
}
56+
57+
inline JSC::ExecState* toJS(JSGlobalContextRef c)
58+
{
59+
ASSERT(c);
60+
return reinterpret_cast<JSC::ExecState*>(c);
61+
}
62+
63+
inline JSC::JSValue toJS(JSC::ExecState* exec, JSValueRef v)
64+
{
65+
ASSERT_UNUSED(exec, exec);
66+
ASSERT(v);
67+
#if USE(JSVALUE32_64)
68+
JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v));
69+
if (!jsCell)
70+
return JSC::JSValue();
71+
if (jsCell->isAPIValueWrapper())
72+
return static_cast<JSC::JSAPIValueWrapper*>(jsCell)->value();
73+
return jsCell;
74+
#else
75+
return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v)));
76+
#endif
77+
}
78+
79+
inline JSC::JSValue toJSForGC(JSC::ExecState* exec, JSValueRef v)
80+
{
81+
ASSERT_UNUSED(exec, exec);
82+
ASSERT(v);
83+
#if USE(JSVALUE32_64)
84+
JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v));
85+
if (!jsCell)
86+
return JSC::JSValue();
87+
return jsCell;
88+
#else
89+
return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v)));
90+
#endif
91+
}
92+
93+
inline JSC::JSObject* toJS(JSObjectRef o)
94+
{
95+
return reinterpret_cast<JSC::JSObject*>(o);
96+
}
97+
98+
inline JSC::PropertyNameArray* toJS(JSPropertyNameAccumulatorRef a)
99+
{
100+
return reinterpret_cast<JSC::PropertyNameArray*>(a);
101+
}
102+
103+
inline JSC::JSGlobalData* toJS(JSContextGroupRef g)
104+
{
105+
return reinterpret_cast<JSC::JSGlobalData*>(const_cast<OpaqueJSContextGroup*>(g));
106+
}
107+
108+
inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v)
109+
{
110+
#if USE(JSVALUE32_64)
111+
if (!v)
112+
return 0;
113+
if (!v.isCell())
114+
return reinterpret_cast<JSValueRef>(JSC::jsAPIValueWrapper(exec, v).asCell());
115+
return reinterpret_cast<JSValueRef>(v.asCell());
116+
#else
117+
UNUSED_PARAM(exec);
118+
return reinterpret_cast<JSValueRef>(JSC::JSValue::encode(v));
119+
#endif
120+
}
121+
122+
inline JSObjectRef toRef(JSC::JSObject* o)
123+
{
124+
return reinterpret_cast<JSObjectRef>(o);
125+
}
126+
127+
inline JSObjectRef toRef(const JSC::JSObject* o)
128+
{
129+
return reinterpret_cast<JSObjectRef>(const_cast<JSC::JSObject*>(o));
130+
}
131+
132+
inline JSContextRef toRef(JSC::ExecState* e)
133+
{
134+
return reinterpret_cast<JSContextRef>(e);
135+
}
136+
137+
inline JSGlobalContextRef toGlobalRef(JSC::ExecState* e)
138+
{
139+
ASSERT(e == e->lexicalGlobalObject()->globalExec());
140+
return reinterpret_cast<JSGlobalContextRef>(e);
141+
}
142+
143+
inline JSPropertyNameAccumulatorRef toRef(JSC::PropertyNameArray* l)
144+
{
145+
return reinterpret_cast<JSPropertyNameAccumulatorRef>(l);
146+
}
147+
148+
inline JSContextGroupRef toRef(JSC::JSGlobalData* g)
149+
{
150+
return reinterpret_cast<JSContextGroupRef>(g);
151+
}
152+
153+
#endif // APICast_h

Diff for: API/APIShims.h

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* Copyright (C) 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+
* 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.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.
24+
*/
25+
26+
#ifndef APIShims_h
27+
#define APIShims_h
28+
29+
#include "CallFrame.h"
30+
#include "GCActivityCallback.h"
31+
#include "JSLock.h"
32+
#include <wtf/WTFThreadData.h>
33+
34+
namespace JSC {
35+
36+
class APIEntryShimWithoutLock {
37+
protected:
38+
APIEntryShimWithoutLock(JSGlobalData* globalData, bool registerThread)
39+
: m_globalData(globalData)
40+
, m_entryIdentifierTable(wtfThreadData().setCurrentIdentifierTable(globalData->identifierTable))
41+
{
42+
UNUSED_PARAM(registerThread);
43+
#if ENABLE(JSC_MULTIPLE_THREADS)
44+
if (registerThread)
45+
globalData->heap.machineThreads().addCurrentThread();
46+
#endif
47+
m_globalData->heap.activityCallback()->synchronize();
48+
m_globalData->timeoutChecker.start();
49+
}
50+
51+
~APIEntryShimWithoutLock()
52+
{
53+
m_globalData->timeoutChecker.stop();
54+
wtfThreadData().setCurrentIdentifierTable(m_entryIdentifierTable);
55+
}
56+
57+
private:
58+
JSGlobalData* m_globalData;
59+
IdentifierTable* m_entryIdentifierTable;
60+
};
61+
62+
class APIEntryShim : public APIEntryShimWithoutLock {
63+
public:
64+
// Normal API entry
65+
APIEntryShim(ExecState* exec, bool registerThread = true)
66+
: APIEntryShimWithoutLock(&exec->globalData(), registerThread)
67+
, m_lock(exec)
68+
{
69+
}
70+
71+
// JSPropertyNameAccumulator only has a globalData.
72+
APIEntryShim(JSGlobalData* globalData, bool registerThread = true)
73+
: APIEntryShimWithoutLock(globalData, registerThread)
74+
, m_lock(globalData->isSharedInstance() ? LockForReal : SilenceAssertionsOnly)
75+
{
76+
}
77+
78+
private:
79+
JSLock m_lock;
80+
};
81+
82+
class APICallbackShim {
83+
public:
84+
APICallbackShim(ExecState* exec)
85+
: m_dropAllLocks(exec)
86+
, m_globalData(&exec->globalData())
87+
{
88+
wtfThreadData().resetCurrentIdentifierTable();
89+
}
90+
91+
~APICallbackShim()
92+
{
93+
m_globalData->heap.activityCallback()->synchronize();
94+
wtfThreadData().setCurrentIdentifierTable(m_globalData->identifierTable);
95+
}
96+
97+
private:
98+
JSLock::DropAllLocks m_dropAllLocks;
99+
JSGlobalData* m_globalData;
100+
};
101+
102+
}
103+
104+
#endif

Diff for: API/JSBase.cpp

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
* Copyright (C) 2006, 2007 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+
* 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.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.
24+
*/
25+
26+
#include "config.h"
27+
#include "JSBase.h"
28+
#include "JSBasePrivate.h"
29+
30+
#include "APICast.h"
31+
#include "APIShims.h"
32+
#include "Completion.h"
33+
#include "OpaqueJSString.h"
34+
#include "SourceCode.h"
35+
#include <interpreter/CallFrame.h>
36+
#include <runtime/InitializeThreading.h>
37+
#include <runtime/Completion.h>
38+
#include <runtime/JSGlobalObject.h>
39+
#include <runtime/JSLock.h>
40+
#include <runtime/JSObject.h>
41+
#include <wtf/text/StringHash.h>
42+
43+
using namespace JSC;
44+
45+
JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
46+
{
47+
ExecState* exec = toJS(ctx);
48+
APIEntryShim entryShim(exec);
49+
50+
JSObject* jsThisObject = toJS(thisObject);
51+
52+
// evaluate sets "this" to the global object if it is NULL
53+
JSGlobalObject* globalObject = exec->dynamicGlobalObject();
54+
SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber);
55+
Completion completion = evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), source, jsThisObject);
56+
57+
if (completion.complType() == Throw) {
58+
if (exception)
59+
*exception = toRef(exec, completion.value());
60+
return 0;
61+
}
62+
63+
if (completion.value())
64+
return toRef(exec, completion.value());
65+
66+
// happens, for example, when the only statement is an empty (';') statement
67+
return toRef(exec, jsUndefined());
68+
}
69+
70+
bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
71+
{
72+
ExecState* exec = toJS(ctx);
73+
APIEntryShim entryShim(exec);
74+
75+
SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber);
76+
Completion completion = checkSyntax(exec->dynamicGlobalObject()->globalExec(), source);
77+
if (completion.complType() == Throw) {
78+
if (exception)
79+
*exception = toRef(exec, completion.value());
80+
return false;
81+
}
82+
83+
return true;
84+
}
85+
86+
void JSGarbageCollect(JSContextRef ctx)
87+
{
88+
// We used to recommend passing NULL as an argument here, which caused the only heap to be collected.
89+
// As there is no longer a shared heap, the previously recommended usage became a no-op (but the GC
90+
// will happen when the context group is destroyed).
91+
// Because the function argument was originally ignored, some clients may pass their released context here,
92+
// in which case there is a risk of crashing if another thread performs GC on the same heap in between.
93+
if (!ctx)
94+
return;
95+
96+
ExecState* exec = toJS(ctx);
97+
APIEntryShim entryShim(exec, false);
98+
99+
JSGlobalData& globalData = exec->globalData();
100+
if (!globalData.heap.isBusy())
101+
globalData.heap.collectAllGarbage();
102+
103+
// FIXME: Perhaps we should trigger a second mark and sweep
104+
// once the garbage collector is done if this is called when
105+
// the collector is busy.
106+
}
107+
108+
void JSReportExtraMemoryCost(JSContextRef ctx, size_t size)
109+
{
110+
ExecState* exec = toJS(ctx);
111+
APIEntryShim entryShim(exec);
112+
exec->globalData().heap.reportExtraMemoryCost(size);
113+
}

0 commit comments

Comments
 (0)