diff --git a/Sources/FuzzilliCli/Profiles/ArkProfile.swift b/Sources/FuzzilliCli/Profiles/ArkProfile.swift index a2f961a50da5a2aadcca0cb70ffde24cb486c9e0..0f6234dbda01b8f7a6cd2dfb3e030f94325258d8 100644 --- a/Sources/FuzzilliCli/Profiles/ArkProfile.swift +++ b/Sources/FuzzilliCli/Profiles/ArkProfile.swift @@ -27,7 +27,7 @@ fileprivate let RunNearStackLimitGenerator = CodeGenerator("RunNearStackLimitGen /// ArkTS Generators fileprivate let ArkTSObjectInstanceGenerator = ValueGenerator("ArkTSObjectInstanceGenerator") { b, n in - let builtin = chooseUniform(from: ["Stack", "HashMap", "HashSet", "LinkedList", "List"]) + let builtin = chooseUniform(from: ["Stack", "HashMap", "HashSet", "LinkedList", "List", "ArrayList"]) let constructor = b.loadBuiltin(builtin) b.construct(constructor) } @@ -49,6 +49,8 @@ fileprivate let arkTSHashSet = ILType.iterable + ILType.object(ofGroup: "HashSet fileprivate let arkTSLinkedList = ILType.iterable + ILType.object(ofGroup: "LinkedList", withProperties: ["length"], withMethods: ["add", "addFirst", "insert", "has", "get", "getLastIndexOf", "getIndexOf", "removeByIndex", "removeFirst", "removeLast", "remove", "removeFirstFound", "removeLastFound", "clone", "forEach", "clear", "set", "convertToArray", "getFirst", "getLast"]) /// Type of a ArkTS List object. fileprivate let arkTSList = ILType.iterable + ILType.object(ofGroup: "List", withProperties: ["length"], withMethods: ["add", "insert", "has", "get", "getLastIndexOf", "getIndexOf", "equal", "removeByIndex", "remove", "replaceAllElements", "forEach", "sort", "getSubList", "clear", "set", "convertToArray", "isEmpty", "getFirst", "getLast"]) +/// Type of a ArkTS ArrayList object. +fileprivate let arkTSArrayList = ILType.iterable + ILType.object(ofGroup: "ArrayList", withProperties: ["length"], withMethods: ["add", "insert", "has", "getIndexOf", "getLastIndexOf", "removeByIndex", "remove", "removeByRange", "replaceAllElements", "forEach", "sort", "subArrayList", "clear", "clone", "getCapacity", "convertToArray", "isEmpty", "increaseCapacityTo", "trimToCurrentLength"]) /// Tpye of a ArkTS CollectionsMap object fileprivate let collectionsMap = ILType.iterable + ILType.object(ofGroup: "SharedMap", withProperties: ["size"], withMethods: ["entries", "keys", "values", "clear", "delete", "forEach", "get", "has", "set"]) @@ -63,10 +65,13 @@ fileprivate let arkTSHashSetConstructor = ILType.constructor([] => arkTSHashSet) fileprivate let arkTSLinkedListConstructor = ILType.constructor([] => arkTSLinkedList) /// Type of the ArkTS List constructor builtin. fileprivate let arkTSListConstructor = ILType.constructor([] => arkTSList) +/// Type of the ArkTS ArrayList constructor builtin. +fileprivate let arkTSArrayListConstructor = ILType.constructor([] => arkTSArrayList) /// Type of the ArkTs CollectionsMap constructor builtin. fileprivate let collectionsMapConstructor = ILType.constructor([.object()] => collectionsMap) + /// ObjectGroup modelling ArkTS Stack objects fileprivate let arkTSStacks = ObjectGroup( name: "Stack", @@ -208,6 +213,36 @@ fileprivate let arkTSLists = ObjectGroup( ] ) +// ObjectGroup modelling ArkTS ArrayList objects +fileprivate let arkTSArrayLists = ObjectGroup( + name: "ArrayList", + instanceType: arkTSArrayList, + properties: [ + "length" : .number, + ], + methods: [ + "add" : [.anything] => .boolean, + "insert" : [.anything, .number] => .undefined, + "has" : [.anything] => .boolean, + "getIndexOf" : [.anything] => .number, + "getLastIndexOf" : [.anything] => .number, + "removeByIndex" : [.number] => .anything, + "remove" : [.anything] => .boolean, + "removeByRange" : [.number, .number] => .undefined, + "replaceAllElements" : [.function([.anything, .opt(.number), .opt(arkTSArrayList)] => .anything), .opt(.object())] => .undefined, + "forEach" : [.function([.anything, .opt(.number), .opt(arkTSArrayList)] => .undefined), .opt(.object())] => .undefined, + "sort" : [.opt(.function([.anything, .anything] => .number))] => .undefined, + "subArrayList" : [.number, .number] => arkTSArrayList, + "clear" : [] => .undefined, + "clone" : [] => arkTSArrayList, + "getCapacity" : [] => .number, + "convertToArray" : [] => .jsArray, + "isEmpty" : [] => .boolean, + "increaseCapacityTo" : [.number] => .undefined, + "trimToCurrentLength": [] => .undefined, + ] +) + let arkProfile = Profile( processArgs: { randomize in var args = [ @@ -230,6 +265,7 @@ let arkProfile = Profile( var HashSet = arkPrivate.Load(arkPrivate.HashSet); var LinkedList = arkPrivate.Load(arkPrivate.LinkedList); var List = arkPrivate.Load(arkPrivate.List); + var ArrayList = arkPrivate.Load(arkPrivate.ArrayList); function bgc() { for(let i=0; i<0x10000; i+=1) {new String();} @@ -279,6 +315,7 @@ let arkProfile = Profile( "HashSet" : arkTSHashSetConstructor, "LinkedList" : arkTSLinkedListConstructor, "List" : arkTSListConstructor, + "ArrayList" : arkTSArrayListConstructor, ], additionalObjectGroups: [ @@ -288,6 +325,7 @@ let arkProfile = Profile( arkTSHashSets, arkTSLinkedLists, arkTSLists, + arkTSArrayLists, ], optionalPostProcessor: nil