Skip to content

Commit 11cb9d0

Browse files
authored
Merge pull request #92 from HarlonWang/feature/2.5.0
Feature/2.4.3
2 parents 90f8b9c + bd5a16d commit 11cb9d0

File tree

7 files changed

+77
-25
lines changed

7 files changed

+77
-25
lines changed

native/cpp/quickjs_context_jni.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,15 @@ Java_com_whl_quickjs_wrapper_QuickJSContext_getMemoryUsedSize(JNIEnv *env, jobje
279279
JSMemoryUsage usage;
280280
JS_ComputeMemoryUsage(rt, &usage);
281281
return (jlong)usage.memory_used_size;
282+
}
283+
extern "C"
284+
JNIEXPORT void JNICALL
285+
Java_com_whl_quickjs_wrapper_QuickJSContext_setGCThreshold(JNIEnv *env, jobject thiz, jlong runtime,
286+
jint size) {
287+
auto *rt = reinterpret_cast<JSRuntime*>(runtime);
288+
// use -1 to disable automatic GC
289+
if (size < 0) {
290+
size = -1;
291+
}
292+
JS_SetGCThreshold(rt, size);
282293
}

wrapper-android/src/androidTest/java/com/whl/quickjs/wrapper/QuickJSTest.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import java.io.InputStreamReader;
2525
import java.util.ArrayList;
2626
import java.util.HashMap;
27+
import java.util.LinkedHashMap;
2728
import java.util.List;
29+
import java.util.Map;
2830
import java.util.regex.Matcher;
2931
import java.util.regex.Pattern;
3032

@@ -1017,11 +1019,11 @@ public void testJSCallFunctionReleased() {
10171019
JSObject jsObject = jsContext.createNewJSObject();
10181020
JSCallFunction function = args -> null;
10191021
jsObject.setProperty("test", function);
1020-
// jsObject.release();
1022+
jsObject.release();
10211023
}
10221024

10231025
// QuickJSLoader.initConsoleLog 方法里有调用过一次 setProperty,总数还剩1个
1024-
// assertEquals(1, jsContext.getCallFunctionMapSize());
1026+
assertEquals(1, jsContext.getCallFunctionMapSize());
10251027
jsContext.releaseObjectRecords();
10261028
jsContext.releaseObjectRecords();
10271029
jsContext.destroy();
@@ -1213,6 +1215,27 @@ public void testObjectToMapFilter() {
12131215
}
12141216
}
12151217

1218+
@Test
1219+
public void testObjectToCustomMap() {
1220+
try (QuickJSContext context = createContext()) {
1221+
StringBuilder expected = new StringBuilder("{");
1222+
JSObject object = context.createNewJSObject();
1223+
for (int i = 0; i < 100; i++) {
1224+
object.setProperty(Integer.toString(i), i);
1225+
expected.append(i).append("=").append(i);
1226+
if (i != 99) {
1227+
expected.append(", ");
1228+
}
1229+
}
1230+
expected.append("}");
1231+
Map<String, Object> linkedMap = object.toMap(null, null, LinkedHashMap::new);
1232+
HashMap<String, Object> hashMap = object.toMap();
1233+
assertEquals(expected.toString(), linkedMap.toString());
1234+
assertNotEquals(expected.toString(), hashMap.toString());
1235+
object.release();
1236+
}
1237+
}
1238+
12161239
@Test
12171240
public void testObjectLeakDetection() {
12181241
try (QuickJSContext context = createContext()) {

wrapper-java/src/main/java/com/whl/quickjs/wrapper/JSObject.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.ArrayList;
44
import java.util.HashMap;
5+
import java.util.Map;
56

67
public interface JSObject {
78

@@ -63,6 +64,6 @@ public interface JSObject {
6364

6465
HashMap<String, Object> toMap(MapFilter filter);
6566
ArrayList<Object> toArray(MapFilter filter);
66-
HashMap<String, Object> toMap(MapFilter filter, Object extra);
67-
ArrayList<Object> toArray(MapFilter filter, Object extra);
67+
Map<String, Object> toMap(MapFilter filter, Object extra, MapCreator mapCreator);
68+
ArrayList<Object> toArray(MapFilter filter, Object extra, MapCreator mapCreator);
6869
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.whl.quickjs.wrapper;
2+
3+
import java.util.Map;
4+
5+
/**
6+
* Created by Harlon Wang on 2025/1/21.
7+
*/
8+
public interface MapCreator {
9+
Map<String, Object> get();
10+
}

wrapper-java/src/main/java/com/whl/quickjs/wrapper/QuickJSArray.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.HashMap;
55
import java.util.HashSet;
6+
import java.util.Map;
67

78
/**
89
* Created by Harlon Wang on 2024/2/13.
@@ -38,7 +39,7 @@ public HashMap<String, Object> toMap() {
3839

3940
@Override
4041
public HashMap<String, Object> toMap(MapFilter filter) {
41-
return toMap(filter, null);
42+
return (HashMap<String, Object>) toMap(filter, null, null);
4243
}
4344

4445
@Override
@@ -48,20 +49,20 @@ public ArrayList<Object> toArray() {
4849

4950
@Override
5051
public ArrayList<Object> toArray(MapFilter filter) {
51-
return toArray(filter, null);
52+
return toArray(filter, null, HashMap::new);
5253
}
5354

5455
@Override
55-
public ArrayList<Object> toArray(MapFilter filter, Object extra) {
56+
public ArrayList<Object> toArray(MapFilter filter, Object extra, MapCreator creator) {
5657
ArrayList<Object> arrayList = new ArrayList<>(length());
5758
HashSet<Long> circulars = new HashSet<>();
58-
convertToMap(this, arrayList, circulars, filter, extra);
59+
convertToMap(this, arrayList, circulars, filter, extra, creator);
5960
circulars.clear();
6061
return arrayList;
6162
}
6263

6364
@Override
64-
public HashMap<String, Object> toMap(MapFilter filter, Object extra) {
65+
public Map<String, Object> toMap(MapFilter filter, Object extra, MapCreator mapCreator) {
6566
throw new UnsupportedOperationException("Array types are not yet supported for conversion to map. You should use toArray.");
6667
}
6768
}

wrapper-java/src/main/java/com/whl/quickjs/wrapper/QuickJSContext.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public void setMaxStackSize(int maxStackSize) {
117117
setMaxStackSize(runtime, maxStackSize);
118118
}
119119

120+
public void setGCThreshold(int thresholdSize) {
121+
setGCThreshold(runtime, thresholdSize);
122+
}
123+
120124
public void runGC() {
121125
runGC(runtime);
122126
}
@@ -588,6 +592,7 @@ public Object getOwnPropertyNames(JSObject object) {
588592
private native void dumpMemoryUsage(long runtime, String fileName);
589593
private native void dumpObjects(long runtime, String fileName);
590594
private native long getMemoryUsedSize(long runtime);
595+
private native void setGCThreshold(long runtime, int size);
591596

592597
// context
593598
private native long createContext(long runtime);

wrapper-java/src/main/java/com/whl/quickjs/wrapper/QuickJSObject.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Arrays;
77
import java.util.HashMap;
88
import java.util.HashSet;
9+
import java.util.Map;
910

1011
/**
1112
* Created by Harlon Wang on 2024/2/12.
@@ -265,33 +266,33 @@ public ArrayList<Object> toArray() {
265266

266267
@Override
267268
public HashMap<String, Object> toMap(MapFilter filter) {
268-
return toMap(filter, null);
269+
return (HashMap<String, Object>) toMap(filter, null, HashMap::new);
269270
}
270271

271272
@Override
272-
public HashMap<String, Object> toMap(MapFilter filter, Object extra) {
273-
HashMap<String, Object> objectMap = new HashMap<>();
273+
public Map<String, Object> toMap(MapFilter filter, Object extra, MapCreator mapCreator) {
274+
Map<String, Object> objectMap = mapCreator.get();
274275
HashSet<Long> circulars = new HashSet<>();
275-
convertToMap(this, objectMap, circulars, filter, extra);
276+
convertToMap(this, objectMap, circulars, filter, extra, mapCreator);
276277
circulars.clear();
277278
return objectMap;
278279
}
279280

280281
@Override
281-
public ArrayList<Object> toArray(MapFilter filter, Object extra) {
282+
public ArrayList<Object> toArray(MapFilter filter, Object extra, MapCreator mapCreator) {
282283
throw new UnsupportedOperationException("Object types are not yet supported for conversion to array. You should use toMap.");
283284

284285
}
285286

286287
@Override
287288
public ArrayList<Object> toArray(MapFilter filter) {
288-
return toArray(filter, null);
289+
return toArray(filter, null, null);
289290
}
290291

291292
/**
292293
* 注意点:循环引用的对象会被过滤掉
293294
*/
294-
protected void convertToMap(Object target, Object map, HashSet<Long> circulars, MapFilter filter, Object extra) {
295+
protected void convertToMap(Object target, Object map, HashSet<Long> circulars, MapFilter filter, Object extra, MapCreator mapCreator) {
295296
circulars.add(((JSObject) target).getPointer());
296297

297298
boolean isArray = target instanceof JSArray;
@@ -326,9 +327,9 @@ protected void convertToMap(Object target, Object map, HashSet<Long> circulars,
326327

327328
if (value instanceof JSArray) {
328329
ArrayList<Object> list = new ArrayList<>(((JSArray) value).length());
329-
convertToMap(value, list, circulars, filter, extra);
330-
if (map instanceof HashMap) {
331-
((HashMap<String, Object>) map).put(key, list);
330+
convertToMap(value, list, circulars, filter, extra, mapCreator);
331+
if (map instanceof Map) {
332+
((Map<String, Object>) map).put(key, list);
332333
} else if (map instanceof ArrayList){
333334
((ArrayList<Object>) map).add(list);
334335
}
@@ -337,10 +338,10 @@ protected void convertToMap(Object target, Object map, HashSet<Long> circulars,
337338
}
338339

339340
if (value instanceof JSObject) {
340-
HashMap<String, Object> valueMap = new HashMap<>();
341-
convertToMap(value, valueMap, circulars, filter, extra);
342-
if (map instanceof HashMap) {
343-
((HashMap<String, Object>) map).put(key, valueMap);
341+
Map<String, Object> valueMap = mapCreator.get();
342+
convertToMap(value, valueMap, circulars, filter, extra, mapCreator);
343+
if (map instanceof Map) {
344+
((Map<String, Object>) map).put(key, valueMap);
344345
} else if (map instanceof ArrayList){
345346
((ArrayList<Object>) map).add(valueMap);
346347
}
@@ -349,8 +350,8 @@ protected void convertToMap(Object target, Object map, HashSet<Long> circulars,
349350
}
350351

351352
// Primitive types.
352-
if (map instanceof HashMap) {
353-
((HashMap<String, Object>) map).put(key, value);
353+
if (map instanceof Map) {
354+
((Map<String, Object>) map).put(key, value);
354355
} else if (map instanceof ArrayList){
355356
((ArrayList<Object>) map).add(value);
356357
}

0 commit comments

Comments
 (0)