diff --git a/Sources/Fuzzilli/Environment/ArkTSEnvironment.swift b/Sources/Fuzzilli/Environment/ArkTSEnvironment.swift new file mode 100644 index 0000000000000000000000000000000000000000..b3d5caab8c4b765c9b7d2787120bfeb8156573c2 --- /dev/null +++ b/Sources/Fuzzilli/Environment/ArkTSEnvironment.swift @@ -0,0 +1,34 @@ +public class ArkTSEnvironment: JavaScriptEnvironment { + public override init(additionalBuiltins: [String: ILType] = [:], additionalObjectGroups: [ObjectGroup] = []) { + var mutableAdditionalObjectGroups = additionalObjectGroups + mutableAdditionalObjectGroups.append(ArkTSEnvironment.arkTSStacks) + + var mutableAdditionalBuiltins = additionalBuiltins + mutableAdditionalBuiltins["Stack"] = ArkTSEnvironment.arkTSStackConstructor + + super.init(additionalBuiltins: mutableAdditionalBuiltins, additionalObjectGroups: mutableAdditionalObjectGroups) + } + + /// Type of a ArkTS Stack object. + static let arkTSStack = ILType.iterable + ILType.object(ofGroup: "Stack", withProperties: ["length"], withMethods: ["push", "pop", "peek", "locate", "forEach", "isEmpty"]) + + /// Type of the ArkTS Stack constructor builtin. + static let arkTSStackConstructor = ILType.constructor([] => arkTSStack) + + /// ObjectGroup modelling ArkTS Stack objects + static let arkTSStacks = ObjectGroup( + name: "Stack", + instanceType: arkTSStack, + properties: [ + "length" : .number, + ], + methods: [ + "push" : [.anything] => .anything, + "pop" : [] => .anything, + "peek" : [] => .anything, + "locate" : [.anything] => .number, + "forEach" : [.function([.anything, .opt(.number), .opt(arkTSStack)] => .undefined), .opt(.object())] => .undefined, + "isEmpty" : [] => .boolean, + ] + ) +}