Skip to content

Commit 63e11fb

Browse files
Alloc with String length
1 parent 348129d commit 63e11fb

File tree

2 files changed

+37
-21
lines changed

2 files changed

+37
-21
lines changed

src/swift/Sources/JavaScriptKit/JSValue.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,25 @@ public func getJSValue(this: JSRef, name: String) -> JSValue {
5656
public func setJSValue(this: JSRef, name: String, value: JSValue) {
5757

5858
let kind: JavaScriptValueKind
59-
let payload: JavaScriptPayload
59+
let payload1: JavaScriptPayload
60+
let payload2: JavaScriptPayload
6061
switch value {
6162
case let .boolean(boolValue):
6263
kind = JavaScriptValueKind_Boolean
63-
payload = boolValue ? 1 : 0
64+
payload1 = boolValue ? 1 : 0
65+
payload2 = 0
6466
case var .string(stringValue):
6567
kind = JavaScriptValueKind_String
6668
stringValue.withUTF8 { bufferPtr in
6769
let ptrValue = UInt32(UInt(bitPattern: bufferPtr.baseAddress!))
68-
_set_js_value(this.id, name, Int32(name.count), kind, ptrValue, 0)
70+
_set_js_value(
71+
this.id, name, Int32(name.count),
72+
kind, ptrValue, JavaScriptPayload(bufferPtr.count)
73+
)
6974
}
7075
return
7176
}
72-
_set_js_value(this.id, name, Int32(name.count), kind, payload, 0)
77+
_set_js_value(this.id, name, Int32(name.count), kind, payload1, payload2)
7378
}
7479

7580

@@ -86,5 +91,7 @@ func _get_js_value(
8691
_ kind: UnsafeMutablePointer<JavaScriptValueKind>!,
8792
_ payload1: UnsafeMutablePointer<JavaScriptPayload>!,
8893
_ payload2: UnsafeMutablePointer<JavaScriptPayload>!) { fatalError() }
89-
func _load_string(_ ref: JavaScriptValueId, _ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
94+
func _load_string(
95+
_ ref: JavaScriptValueId,
96+
_ buffer: UnsafeMutablePointer<UInt8>!) { fatalError() }
9097
#endif

src/web/src/index.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@ export class SwiftRuntime {
6464
return textDecoder.decode(uint8Memory.subarray(ptr, ptr + len));
6565
}
6666

67-
const readStringUntilNull = (ptr: pointer) => {
68-
const uint8Memory = new Uint8Array(memory().buffer);
69-
return textDecoder.decode(uint8Memory.slice(ptr));
70-
}
71-
7267
const writeString = (ptr: pointer, value: string) => {
7368
const bytes = textEncoder.encode(value);
7469
const uint8Memory = new Uint8Array(memory().buffer);
@@ -86,16 +81,19 @@ export class SwiftRuntime {
8681
uint8Memory[ptr + 3] = value & 0xff000000
8782
}
8883

89-
const decodeValue = (kind: JavaScriptValueKind, payload: number) => {
84+
const decodeValue = (
85+
kind: JavaScriptValueKind,
86+
payload1: number, payload2: number
87+
) => {
9088
switch (kind) {
9189
case JavaScriptValueKind.Boolean: {
92-
switch (payload) {
90+
switch (payload1) {
9391
case 0: return false
9492
case 1: return true
9593
}
9694
}
9795
case JavaScriptValueKind.String: {
98-
return readStringUntilNull(payload)
96+
return readString(payload1, payload2)
9997
}
10098
case JavaScriptValueKind.Object: {
10199
}
@@ -108,13 +106,15 @@ export class SwiftRuntime {
108106
switch (typeof value) {
109107
case "boolean":
110108
return {
111-
kind: 0,
112-
payload: value ? 1 : 0,
109+
kind: JavaScriptValueKind.Boolean,
110+
payload1: value ? 1 : 0,
111+
payload2: 0,
113112
}
114113
case "string": {
115114
return {
116115
kind: JavaScriptValueKind.String,
117-
payload: allocValue(value),
116+
payload1: allocValue(value),
117+
payload2: value.length,
118118
}
119119
}
120120
default:
@@ -123,16 +123,25 @@ export class SwiftRuntime {
123123
}
124124

125125
return {
126-
swjs_set_js_value: (ref: ref, name: pointer, length: number, kind: JavaScriptValueKind, payload: number) => {
126+
swjs_set_js_value: (
127+
ref: ref, name: pointer, length: number,
128+
kind: JavaScriptValueKind,
129+
payload1: number, payload2: number
130+
) => {
127131
const obj = this._heapValues[ref];
128-
Reflect.set(obj, readString(name, length), decodeValue(kind, payload))
132+
Reflect.set(obj, readString(name, length), decodeValue(kind, payload1, payload2))
129133
},
130-
swjs_get_js_value: (ref: ref, name: pointer, length: number, kind_ptr: pointer, payload_ptr: pointer) => {
134+
swjs_get_js_value: (
135+
ref: ref, name: pointer, length: number,
136+
kind_ptr: pointer,
137+
payload1_ptr: pointer, payload2_ptr: pointer
138+
) => {
131139
const obj = this._heapValues[ref];
132140
const result = Reflect.get(obj, readString(name, length));
133-
const { kind, payload } = encodeValue(result);
141+
const { kind, payload1, payload2 } = encodeValue(result);
134142
writeUint32(kind_ptr, kind);
135-
writeUint32(payload_ptr, payload);
143+
writeUint32(payload1_ptr, payload1);
144+
writeUint32(payload2_ptr, payload2);
136145
},
137146
swjs_load_string: (ref: ref, buffer: pointer) => {
138147
const string = this._heapValues[ref];

0 commit comments

Comments
 (0)