Skip to content

Commit 6eb534b

Browse files
MaxDesiatovkateinoigakukun
authored andcommitted
Add JSDictionary type for Embedded Swift compat
1 parent 620365b commit 6eb534b

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

Runtime/src/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,8 @@ export class SwiftRuntime {
517517
return this.memory.retain(array.slice());
518518
},
519519

520+
swjs_create_object: () => { return this.memory.retain({}); },
521+
520522
swjs_load_typed_array: (ref: ref, buffer: pointer) => {
521523
const memory = this.memory;
522524
const typedArray = memory.getObject(ref);

Runtime/src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export interface ImportedFunctions {
102102
elementsPtr: pointer,
103103
length: number
104104
): number;
105+
swjs_create_object(): number;
105106
swjs_load_typed_array(ref: ref, buffer: pointer): void;
106107
swjs_release(ref: number): void;
107108
swjs_release_remote(tid: number, ref: number): void;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import _CJavaScriptKit
2+
3+
public final class JSDictionary {
4+
private let ref: JSObject
5+
6+
init(ref: JSObject) { self.ref = ref }
7+
8+
public init() { ref = JSObject(id: swjs_create_object()) }
9+
10+
public subscript(key: String) -> JSValue {
11+
get { ref[dynamicMember: key] }
12+
set { ref[dynamicMember: key] = newValue }
13+
}
14+
}
15+
16+
extension JSDictionary: ExpressibleByDictionaryLiteral {
17+
public convenience init(dictionaryLiteral elements: (String, JSValue)...) {
18+
self.init()
19+
20+
for (key, value) in elements { self[key] = value }
21+
}
22+
}
23+
24+
extension JSDictionary: ConvertibleToJSValue {
25+
public var jsValue: JSValue { .object(ref) }
26+
}
27+
28+
extension JSDictionary: ConstructibleFromJSValue {
29+
public static func construct(from value: JSValue) -> JSDictionary? {
30+
guard let object = value.object else { return nil }
31+
32+
return JSDictionary(ref: object)
33+
}
34+
}

Sources/_CJavaScriptKit/include/_CJavaScriptKit.h

+2
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ IMPORT_JS_FUNCTION(swjs_terminate_worker_thread, void, (int tid))
314314

315315
IMPORT_JS_FUNCTION(swjs_get_worker_thread_id, int, (void))
316316

317+
IMPORT_JS_FUNCTION(swjs_create_object, JavaScriptObjectRef, (void))
318+
317319
int swjs_get_worker_thread_id_cached(void);
318320

319321
/// Requests sending a JavaScript object to another worker thread.

0 commit comments

Comments
 (0)