Skip to content

Commit 0428853

Browse files
authored
Merge pull request #2 from skiptools/de-intl
Use non-international version of jsc on Android for size savings; test improvements
2 parents d6139e2 + 9374a02 commit 0428853

File tree

4 files changed

+19
-61
lines changed

4 files changed

+19
-61
lines changed

Sources/SkipScript/JSContext.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ extension JSInstance {
194194
public class JSValue {
195195
public let context: JSContext
196196
public let value: JSValueRef
197-
private var functionCallback: JSFunctionInfo? = nil
198197

199198
public init(jsValueRef: JSValueRef, in context: JSContext) {
200199
self.context = context

Sources/SkipScript/Skip/skip.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@ build:
2020
- block: 'dependencies'
2121
contents:
2222
# JSC is now on Maven central (https://github.com/facebook/react-native/pull/47972): https://repo1.maven.org/maven2/io/github/react-native-community/jsc-android/2026004.0.1/
23-
- 'implementation("io.github.react-native-community:jsc-android-intl:2026004.0.1")'
23+
- 'implementation("io.github.react-native-community:jsc-android:2026004.0.1")' # 26.9 MB
24+
#- 'implementation("io.github.react-native-community:jsc-android-intl:2026004.0.1")' # international version: 53.7 MB
2425
- 'implementation("com.facebook.fbjni:fbjni:0.7.0")' # needed for libc++_shared.so, else no symbol "_ZNSt6__ndk122__libcpp_verbose_abortEPKcz"
2526

26-
# non-international version
27-
#- 'implementation("io.github.react-native-community:jsc-android:2026004.0.1")'
28-
2927
#- 'implementation("org.webkit:android-jsc-cppruntime:r245459@aar")'
3028
# the -intl variant is bigger (24M vs. 13M), but it is needed for locale support
3129
#- 'implementation("org.webkit:android-jsc-intl:r245459@aar")'

Tests/SkipScriptTests/JSContextTests.swift

Lines changed: 4 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ class JSContextTests : XCTestCase {
8484
}
8585

8686
func testIntl() throws {
87+
// the Skip side uses jsc-android rather than jsc-android-intl for size savings
88+
// TODO: provide a separate SkipScriptIntl target that depends on jsc-android-intl
89+
#if !SKIP
8790
let ctx = try XCTUnwrap(JSContext())
8891

8992
XCTAssertEqual("12,34 €", ctx.evaluateScript("new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(12.34)")?.toString())
@@ -104,6 +107,7 @@ class JSContextTests : XCTestCase {
104107

105108
XCTAssertEqual("10/24/2022", ctx.evaluateScript("new Intl.DateTimeFormat('en-US', {timeZone: 'UTC'}).format(new Date('2022-10-24'))")?.toString())
106109
XCTAssertEqual("24/10/2022", ctx.evaluateScript("new Intl.DateTimeFormat('fr-FR', {timeZone: 'UTC'}).format(new Date('2022-10-24'))")?.toString())
110+
#endif
107111
}
108112

109113
func testProxy() throws {
@@ -164,56 +168,6 @@ class JSContextTests : XCTestCase {
164168
XCTAssertEqual(false, ctx.objectForKeyedSubscript("boolProp").toObject() as? Bool)
165169
}
166170

167-
func testJSCCallbacks() throws {
168-
let jsc = JavaScriptCore.JSGlobalContextCreate(nil)
169-
defer { JavaScriptCore.JSGlobalContextRelease(jsc) }
170-
let ctx = try XCTUnwrap(JSContext(jsGlobalContextRef: jsc))
171-
172-
func eval(_ script: String) throws -> JSValue {
173-
let result = ctx.evaluateScript(script)
174-
if let exception = ctx.exception {
175-
throw JSEvalException(exception: exception)
176-
}
177-
if let result = result {
178-
return result
179-
} else {
180-
throw JSEvalException()
181-
}
182-
}
183-
184-
XCTAssertEqual("test", try eval("'te' + 'st'").toString())
185-
186-
let callbackName = JavaScriptCore.JSStringCreateWithUTF8CString("skip_cb")
187-
defer { JavaScriptCore.JSStringRelease(callbackName) }
188-
189-
#if !SKIP
190-
func callbackPtr(ctx: JSContextRef?, function: JSObjectRef?, thisObject: JSObjectRef?, argumentCount: Int, arguments: UnsafePointer<JSValueRef?>?, exception: UnsafeMutablePointer<JSValueRef?>?) -> JSValueRef? {
191-
JavaScriptCore.JSValueMakeNumber(ctx, callbackResult)
192-
}
193-
#else
194-
let callbackPtr = JSCCallback()
195-
#endif
196-
197-
let callbackFunction = JavaScriptCore.JSObjectMakeFunctionWithCallback(jsc, callbackName, callbackPtr)
198-
199-
// invoke the callback directly
200-
let f = try XCTUnwrap(JavaScriptCore.JSObjectCallAsFunction(jsc, callbackFunction, nil, 0, nil, nil))
201-
XCTAssertEqual(callbackResult, JavaScriptCore.JSValueToNumber(jsc, f, nil))
202-
203-
if !isAndroid { // crashes on Android, passes on Robolectric
204-
JavaScriptCore.JSObjectSetProperty(jsc, jsc, callbackName, callbackFunction, JSPropertyAttributes(kJSPropertyAttributeNone), nil)
205-
XCTAssertEqual(callbackResult.description, try eval("skip_cb()").toString())
206-
}
207-
}
208-
209-
#if SKIP
210-
class JSCCallback : com.sun.jna.Callback {
211-
func callback(ctx: JSContextRef?, function: JSObjectRef?, thisObject: JSObjectRef?, argumentCount: Int32, arguments: UnsafeMutableRawPointer?, exception: UnsafeMutableRawPointer?) -> JSValueRef {
212-
JavaScriptCore.JSValueMakeNumber(ctx!, callbackResult)
213-
}
214-
}
215-
#endif
216-
217171
func testJSCAPILow() throws {
218172
let ctx = JavaScriptCore.JSGlobalContextCreate(nil)
219173
defer { JavaScriptCore.JSGlobalContextRelease(ctx) }

Tests/SkipScriptTests/SkipContextTests.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ class SkipContextTests : XCTestCase {
4343
}
4444
for k in 1...100 {
4545
let num = Double.random(in: 0.0...1000.0)
46-
let result = ctx.evaluateScript("sum(\(j), \(k), \(num))")
47-
XCTAssertEqual(Double(i) + Double(j) + Double(k) + num, result?.toDouble(), "\(i)-\(j)-\(k) failure")
46+
let args = [JSValue(double: Double(j), in: ctx), JSValue(double: Double(k), in: ctx), JSValue(double: num, in: ctx)]
47+
let result = try ctx.objectForKeyedSubscript("sum").call(withArguments: args)
48+
XCTAssertEqual(Double(i) + Double(j) + Double(k) + num, result.toDouble(), "\(i)-\(j)-\(k) failure")
4849
}
4950
}
5051
}
@@ -59,7 +60,6 @@ class SkipContextTests : XCTestCase {
5960
ctx.setObject(stringify, forKeyedSubscript: "stringify")
6061
XCTAssertEqual("", ctx.evaluateScript("stringify()")?.toString())
6162

62-
// call with args crashes on Android with SIGSEGV with Problematic frame: [jna9291175543343818311.tmp+0x7448] Java_com_sun_jna_Native__1getPointer+0x0
6363
XCTAssertEqual("", ctx.evaluateScript("stringify('')")?.toString())
6464
XCTAssertEqual("ABC", ctx.evaluateScript("stringify('A', 'BC')")?.toString())
6565
XCTAssertEqual("true12X", ctx.evaluateScript("stringify(true, 1, 2, 'X')")?.toString())
@@ -103,9 +103,16 @@ class SkipContextTests : XCTestCase {
103103
XCTAssertFalse(r0.isUndefined)
104104
XCTAssertEqual(1.0, r0.toDouble())
105105
}
106-
}
107106

108-
XCTAssertTrue(sum.isFunction)
109-
XCTAssertTrue(ctx.objectForKeyedSubscript("ob").objectForKeyedSubscript("sum").isFunction)
107+
do {
108+
// call with many args
109+
XCTAssertTrue(sum.isFunction)
110+
let sumf = ctx.objectForKeyedSubscript("ob").objectForKeyedSubscript("sum")
111+
XCTAssertTrue(sumf.isFunction)
112+
let args = (1..<1_000).map({ JSValue(double: Double($0), in: ctx) })
113+
let result = try sumf.call(withArguments: args)
114+
XCTAssertEqual(499_500.0, result.toDouble())
115+
}
116+
}
110117
}
111118
}

0 commit comments

Comments
 (0)