Skip to content

Commit d79efa7

Browse files
committed
first commit (no xcode pro)
0 parents  commit d79efa7

File tree

2,127 files changed

+641041
-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.

2,127 files changed

+641041
-0
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.svn
2+
.DS_Store
3+
build/
4+
libiOSJavaScriptCore.a
5+
DerivedData/
6+
xcuserdata

API/APICast.h

Lines changed: 153 additions & 0 deletions
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

API/APIShims.h

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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 (registerThread)
44+
globalData->heap.machineThreads().addCurrentThread();
45+
m_globalData->heap.activityCallback()->synchronize();
46+
m_globalData->timeoutChecker.start();
47+
}
48+
49+
~APIEntryShimWithoutLock()
50+
{
51+
m_globalData->timeoutChecker.stop();
52+
wtfThreadData().setCurrentIdentifierTable(m_entryIdentifierTable);
53+
}
54+
55+
private:
56+
JSGlobalData* m_globalData;
57+
IdentifierTable* m_entryIdentifierTable;
58+
};
59+
60+
class APIEntryShim : public APIEntryShimWithoutLock {
61+
public:
62+
// Normal API entry
63+
APIEntryShim(ExecState* exec, bool registerThread = true)
64+
: APIEntryShimWithoutLock(&exec->globalData(), registerThread)
65+
, m_lock(exec)
66+
{
67+
}
68+
69+
// JSPropertyNameAccumulator only has a globalData.
70+
APIEntryShim(JSGlobalData* globalData, bool registerThread = true)
71+
: APIEntryShimWithoutLock(globalData, registerThread)
72+
, m_lock(globalData->isSharedInstance() ? LockForReal : SilenceAssertionsOnly)
73+
{
74+
}
75+
76+
private:
77+
JSLock m_lock;
78+
};
79+
80+
class APICallbackShim {
81+
public:
82+
APICallbackShim(ExecState* exec)
83+
: m_dropAllLocks(exec)
84+
, m_globalData(&exec->globalData())
85+
{
86+
wtfThreadData().resetCurrentIdentifierTable();
87+
}
88+
89+
~APICallbackShim()
90+
{
91+
m_globalData->heap.activityCallback()->synchronize();
92+
wtfThreadData().setCurrentIdentifierTable(m_globalData->identifierTable);
93+
}
94+
95+
private:
96+
JSLock::DropAllLocks m_dropAllLocks;
97+
JSGlobalData* m_globalData;
98+
};
99+
100+
}
101+
102+
#endif

API/JSBase.cpp

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

0 commit comments

Comments
 (0)