Skip to content

Commit c2e9f1e

Browse files
committed
开启 OBJC API。 支持 JSContext 了。 把编译完的包 也一起传了上来。
1 parent c652026 commit c2e9f1e

31 files changed

+3911
-49
lines changed

JavaScriptCore-iOS-Static.xcconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ SECTORDER_FLAGS_iphoneos = ;
2525

2626
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
2727
GCC_OPTIMIZATION_LEVEL = 3;
28-
GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) HAVE_DTRACE=$(HAVE_DTRACE) WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST HAVE_HEADER_DETECTION_H JSC_OBJC_API_ENABLED=0 JSC_OBJC_API_AVAILABLE_MAC_OS_X_1080 $(FEATURE_DEFINES) $(GCC_PREPROCESSOR_DEFINITIONS) __MAC_OS_X_VERSION_MIN_REQUIRED=0 ENABLE_YARR_JIT=0;
28+
GCC_PREPROCESSOR_DEFINITIONS = $(DEBUG_DEFINES) HAVE_DTRACE=$(HAVE_DTRACE) WEBKIT_VERSION_MIN_REQUIRED=WEBKIT_VERSION_LATEST HAVE_HEADER_DETECTION_H JSC_OBJC_API_ENABLED=1 JSC_OBJC_API_AVAILABLE_MAC_OS_X_1080 $(FEATURE_DEFINES) $(GCC_PREPROCESSOR_DEFINITIONS) __MAC_OS_X_VERSION_MIN_REQUIRED=0 ENABLE_YARR_JIT=0;
2929

3030
ENABLE_REMOTE_INSPECTOR = ENABLE_REMOTE_INSPECTOR=0; // Requires XPC
3131

JavaScriptCore.framework/Headers

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Versions/Current/Headers
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Versions/Current/JavaScriptCore
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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 JSBase_h
27+
#define JSBase_h
28+
29+
#ifndef __cplusplus
30+
#include <stdbool.h>
31+
#endif
32+
33+
#ifdef __OBJC__
34+
#import <Foundation/Foundation.h>
35+
#endif
36+
37+
/* JavaScript engine interface */
38+
39+
/*! @typedef JSContextGroupRef A group that associates JavaScript contexts with one another. Contexts in the same group may share and exchange JavaScript objects. */
40+
typedef const struct OpaqueJSContextGroup* JSContextGroupRef;
41+
42+
/*! @typedef JSContextRef A JavaScript execution context. Holds the global object and other execution state. */
43+
typedef const struct OpaqueJSContext* JSContextRef;
44+
45+
/*! @typedef JSGlobalContextRef A global JavaScript execution context. A JSGlobalContext is a JSContext. */
46+
typedef struct OpaqueJSContext* JSGlobalContextRef;
47+
48+
/*! @typedef JSStringRef A UTF16 character buffer. The fundamental string representation in JavaScript. */
49+
typedef struct OpaqueJSString* JSStringRef;
50+
51+
/*! @typedef JSClassRef A JavaScript class. Used with JSObjectMake to construct objects with custom behavior. */
52+
typedef struct OpaqueJSClass* JSClassRef;
53+
54+
/*! @typedef JSPropertyNameArrayRef An array of JavaScript property names. */
55+
typedef struct OpaqueJSPropertyNameArray* JSPropertyNameArrayRef;
56+
57+
/*! @typedef JSPropertyNameAccumulatorRef An ordered set used to collect the names of a JavaScript object's properties. */
58+
typedef struct OpaqueJSPropertyNameAccumulator* JSPropertyNameAccumulatorRef;
59+
60+
61+
/* JavaScript data types */
62+
63+
/*! @typedef JSValueRef A JavaScript value. The base type for all JavaScript values, and polymorphic functions on them. */
64+
typedef const struct OpaqueJSValue* JSValueRef;
65+
66+
/*! @typedef JSObjectRef A JavaScript object. A JSObject is a JSValue. */
67+
typedef struct OpaqueJSValue* JSObjectRef;
68+
69+
/* JavaScript symbol exports */
70+
/* These rules should stay the same as in WebKit2/Shared/API/c/WKBase.h */
71+
72+
#undef JS_EXPORT
73+
#if defined(JS_NO_EXPORT)
74+
#define JS_EXPORT
75+
#elif defined(__GNUC__) && !defined(__CC_ARM) && !defined(__ARMCC__)
76+
#define JS_EXPORT __attribute__((visibility("default")))
77+
#elif defined(WIN32) || defined(_WIN32) || defined(_WIN32_WCE) || defined(__CC_ARM) || defined(__ARMCC__)
78+
#if defined(BUILDING_JavaScriptCore) || defined(STATICALLY_LINKED_WITH_JavaScriptCore)
79+
#define JS_EXPORT __declspec(dllexport)
80+
#else
81+
#define JS_EXPORT __declspec(dllimport)
82+
#endif
83+
#else /* !defined(JS_NO_EXPORT) */
84+
#define JS_EXPORT
85+
#endif /* defined(JS_NO_EXPORT) */
86+
87+
/* JS tests uses WTF but has no config.h, so we need to set the export defines here. */
88+
#ifndef WTF_EXPORT_PRIVATE
89+
#define WTF_EXPORT_PRIVATE JS_EXPORT
90+
#endif
91+
92+
#ifdef __cplusplus
93+
extern "C" {
94+
#endif
95+
96+
/* Script Evaluation */
97+
98+
/*!
99+
@function JSEvaluateScript
100+
@abstract Evaluates a string of JavaScript.
101+
@param ctx The execution context to use.
102+
@param script A JSString containing the script to evaluate.
103+
@param thisObject The object to use as "this," or NULL to use the global object as "this."
104+
@param sourceURL A JSString containing a URL for the script's source file. This is only used when reporting exceptions. Pass NULL if you do not care to include source file information in exceptions.
105+
@param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions.
106+
@param exception A pointer to a JSValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception.
107+
@result The JSValue that results from evaluating script, or NULL if an exception is thrown.
108+
*/
109+
JS_EXPORT JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
110+
111+
/*!
112+
@function JSCheckScriptSyntax
113+
@abstract Checks for syntax errors in a string of JavaScript.
114+
@param ctx The execution context to use.
115+
@param script A JSString containing the script to check for syntax errors.
116+
@param sourceURL A JSString containing a URL for the script's source file. This is only used when reporting exceptions. Pass NULL if you do not care to include source file information in exceptions.
117+
@param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions.
118+
@param exception A pointer to a JSValueRef in which to store a syntax error exception, if any. Pass NULL if you do not care to store a syntax error exception.
119+
@result true if the script is syntactically correct, otherwise false.
120+
*/
121+
JS_EXPORT bool JSCheckScriptSyntax(JSContextRef ctx, JSStringRef script, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);
122+
123+
/*!
124+
@function JSGarbageCollect
125+
@abstract Performs a JavaScript garbage collection.
126+
@param ctx The execution context to use.
127+
@discussion JavaScript values that are on the machine stack, in a register,
128+
protected by JSValueProtect, set as the global object of an execution context,
129+
or reachable from any such value will not be collected.
130+
131+
During JavaScript execution, you are not required to call this function; the
132+
JavaScript engine will garbage collect as needed. JavaScript values created
133+
within a context group are automatically destroyed when the last reference
134+
to the context group is released.
135+
*/
136+
JS_EXPORT void JSGarbageCollect(JSContextRef ctx);
137+
138+
#ifdef __cplusplus
139+
}
140+
#endif
141+
142+
/* Enable the Objective-C API for platforms with a modern runtime. */
143+
#if !defined(JSC_OBJC_API_ENABLED)
144+
#define JSC_OBJC_API_ENABLED (defined(__clang__) && defined(__APPLE__) && ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 && !defined(__i386__)) || (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE)))
145+
#endif
146+
147+
#endif /* JSBase_h */
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
/*
2+
* Copyright (C) 2013 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 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.
24+
*/
25+
26+
#ifndef JSContext_h
27+
#define JSContext_h
28+
29+
#include <JavaScriptCore/JavaScript.h>
30+
31+
#if JSC_OBJC_API_ENABLED
32+
33+
@class JSVirtualMachine, JSValue;
34+
35+
/*!
36+
@interface
37+
@discussion An instance of JSContext represents a JavaScript execution environment. All
38+
JavaScript execution takes place within a context.
39+
JSContext is also used to manage the life-cycle of objects within the
40+
JavaScript virtual machine. Every instance of JSValue is associated with a
41+
JSContext via a strong reference. The JSValue will keep the JSContext it
42+
references alive so long as the JSValue remains alive. When all of the JSValues
43+
that reference a particular JSContext have been deallocated the JSContext
44+
will be deallocated unless it has been previously retained.
45+
*/
46+
NS_CLASS_AVAILABLE(10_9, 7_0)
47+
@interface JSContext : NSObject
48+
49+
/*!
50+
@methodgroup Creating New JSContexts
51+
*/
52+
/*!
53+
@method
54+
@abstract Create a JSContext.
55+
@result The new context.
56+
*/
57+
- (instancetype)init;
58+
59+
/*!
60+
@method
61+
@abstract Create a JSContext in the specified virtual machine.
62+
@param virtualMachine The JSVirtualMachine in which the context will be created.
63+
@result The new context.
64+
*/
65+
- (instancetype)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;
66+
67+
/*!
68+
@methodgroup Evaluating Scripts
69+
*/
70+
/*!
71+
@method
72+
@abstract Evaluate a string of JavaScript code.
73+
@param script A string containing the JavaScript code to evaluate.
74+
@result The last value generated by the script.
75+
*/
76+
- (JSValue *)evaluateScript:(NSString *)script;
77+
78+
/*!
79+
@methodgroup Callback Accessors
80+
*/
81+
/*!
82+
@method
83+
@abstract Get the JSContext that is currently executing.
84+
@discussion This method may be called from within an Objective-C block or method invoked
85+
as a callback from JavaScript to retrieve the callback's context. Outside of
86+
a callback from JavaScript this method will return nil.
87+
@result The currently executing JSContext or nil if there isn't one.
88+
*/
89+
+ (JSContext *)currentContext;
90+
91+
/*!
92+
@method
93+
@abstract Get the <code>this</code> value of the currently executing method.
94+
@discussion This method may be called from within an Objective-C block or method invoked
95+
as a callback from JavaScript to retrieve the callback's this value. Outside
96+
of a callback from JavaScript this method will return nil.
97+
@result The current <code>this</code> value or nil if there isn't one.
98+
*/
99+
+ (JSValue *)currentThis;
100+
101+
/*!
102+
@method
103+
@abstract Get the arguments to the current callback.
104+
@discussion This method may be called from within an Objective-C block or method invoked
105+
as a callback from JavaScript to retrieve the callback's arguments, objects
106+
in the returned array are instances of JSValue. Outside of a callback from
107+
JavaScript this method will return nil.
108+
@result An NSArray of the arguments nil if there is no current callback.
109+
*/
110+
+ (NSArray *)currentArguments;
111+
112+
/*!
113+
@methodgroup Global Properties
114+
*/
115+
/*!
116+
@property
117+
@abstract Get the global object of the context.
118+
@discussion This method retrieves the global object of the JavaScript execution context.
119+
Instances of JSContext originating from WebKit will return a reference to the
120+
WindowProxy object.
121+
@result The global object.
122+
*/
123+
@property (readonly, strong) JSValue *globalObject;
124+
125+
/*!
126+
@property
127+
@discussion The <code>exception</code> property may be used to throw an exception to JavaScript.
128+
129+
Before a callback is made from JavaScript to an Objective-C block or method,
130+
the prior value of the exception property will be preserved and the property
131+
will be set to nil. After the callback has completed the new value of the
132+
exception property will be read, and prior value restored. If the new value
133+
of exception is not nil, the callback will result in that value being thrown.
134+
135+
This property may also be used to check for uncaught exceptions arising from
136+
API function calls (since the default behaviour of <code>exceptionHandler</code> is to
137+
assign an uncaught exception to this property).
138+
139+
If a JSValue originating from a different JSVirtualMachine than this context
140+
is assigned to this property, an Objective-C exception will be raised.
141+
*/
142+
@property (strong) JSValue *exception;
143+
144+
/*!
145+
@property
146+
@discussion If a call to an API function results in an uncaught JavaScript exception, the
147+
<code>exceptionHandler</code> block will be invoked. The default implementation for the
148+
exception handler will store the exception to the exception property on
149+
context. As a consequence the default behaviour is for unhandled exceptions
150+
occurring within a callback from JavaScript to be rethrown upon return.
151+
Setting this value to nil will result in all uncaught exceptions thrown from
152+
the API being silently consumed.
153+
*/
154+
@property (copy) void(^exceptionHandler)(JSContext *context, JSValue *exception);
155+
156+
/*!
157+
@property
158+
@discussion All instances of JSContext are associated with a single JSVirtualMachine. The
159+
virtual machine provides an "object space" or set of execution resources.
160+
*/
161+
@property (readonly, strong) JSVirtualMachine *virtualMachine;
162+
163+
/*!
164+
@property
165+
@discussion Name of the JSContext. Exposed when remote debugging the context.
166+
*/
167+
@property (copy) NSString *name;
168+
169+
@end
170+
171+
/*!
172+
@category
173+
@discussion Instances of JSContext implement the following methods in order to enable
174+
support for subscript access by key and index, for example:
175+
176+
@textblock
177+
JSContext *context;
178+
JSValue *v = context[@"X"]; // Get value for "X" from the global object.
179+
context[@"Y"] = v; // Assign 'v' to "Y" on the global object.
180+
@/textblock
181+
182+
An object key passed as a subscript will be converted to a JavaScript value,
183+
and then the value converted to a string used to resolve a property of the
184+
global object.
185+
*/
186+
@interface JSContext (SubscriptSupport)
187+
188+
/*!
189+
method
190+
@abstract Get a particular property on the global object.
191+
@param key
192+
@result The JSValue for the global object's property.
193+
*/
194+
- (JSValue *)objectForKeyedSubscript:(id)key;
195+
196+
/*!
197+
method
198+
@abstract Set a particular property on the global object.
199+
@param object
200+
@param key
201+
*/
202+
- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key;
203+
204+
@end
205+
206+
/*!
207+
@category
208+
@discussion These functions are for bridging between the C API and the Objective-C API.
209+
*/
210+
@interface JSContext (JSContextRefSupport)
211+
212+
/*!
213+
@method
214+
@abstract Create a JSContext, wrapping its C API counterpart.
215+
@param jsGlobalContextRef
216+
@result The JSContext equivalent of the provided JSGlobalContextRef.
217+
*/
218+
+ (JSContext *)contextWithJSGlobalContextRef:(JSGlobalContextRef)jsGlobalContextRef;
219+
220+
/*!
221+
@property
222+
@abstract Get the C API counterpart wrapped by a JSContext.
223+
@result The C API equivalent of this JSContext.
224+
*/
225+
@property (readonly) JSGlobalContextRef JSGlobalContextRef;
226+
@end
227+
228+
#endif
229+
230+
#endif // JSContext_h

0 commit comments

Comments
 (0)