Skip to content

Commit bdaf750

Browse files
authored
Merge pull request #901 from quoid/investigate-memory-usage2
fix: further reduces memory usage
2 parents dcb047e + b0990a5 commit bdaf750

1 file changed

Lines changed: 13 additions & 14 deletions

File tree

xcode/Ext-Safari/Functions.swift

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,20 @@ func isEncoded(_ str: String) -> Bool {
9494
return false
9595
}
9696

97+
// parser REs - force try b/c pattern is known to be valid regex
98+
let re0 = try! NSRegularExpression(pattern: #"(?:(\/\/ ==UserScript==[ \t]*?\r?\n([\S\s]*?)\r?\n\/\/ ==\/UserScript==)([\S\s]*)|(\/\* ==UserStyle==[ \t]*?\r?\n([\S\s]*?)\r?\n==\/UserStyle== \*\/)([\S\s]*))"#, options: [])
99+
// RE for meta line
100+
let re1 = try! NSRegularExpression(pattern: #"^(?:[ \t]*(?:\/\/)?[ \t]*@)([\w-]+)[ \t]+([^\s]+[^\r\n\t\v\f]*)"#, options: [])
101+
// this pattern checks for specific keys that won't have values
102+
let re2 = try! NSRegularExpression(pattern: #"^(?:[ \t]*(?:\/\/)?[ \t]*@)(noframes)[ \t]*$"#, options: [])
103+
97104
// parser
98105
func parse(_ content: String) -> [String: Any]? {
99106
// returns structured data from content of file
100107
// will fail to parse if metablock or required @name key missing
101-
let pattern = #"(?:(\/\/ ==UserScript==[ \t]*?\r?\n([\S\s]*?)\r?\n\/\/ ==\/UserScript==)([\S\s]*)|(\/\* ==UserStyle==[ \t]*?\r?\n([\S\s]*?)\r?\n==\/UserStyle== \*\/)([\S\s]*))"#
102-
// force try b/c pattern is known to be valid regex
103-
let regex = try! NSRegularExpression(pattern: pattern, options: [])
104108
let range = NSRange(location: 0, length: content.utf16.count)
105109
// return nil/fail if metablock missing
106-
guard let match = regex.firstMatch(in: content, options: [], range: range) else {
110+
guard let match = re0.firstMatch(in: content, options: [], range: range) else {
107111
logger?.debug("\(#function, privacy: .public) - Non matched content: \(content, privacy: .public)")
108112
return nil
109113
}
@@ -134,12 +138,6 @@ func parse(_ content: String) -> [String: Any]? {
134138
var metadata = [:] as [String: [String]]
135139
// iterate through the possible metadata keys in file
136140
if let metas = Range(match.range(at: g2), in: content) {
137-
let p = #"^(?:[ \t]*(?:\/\/)?[ \t]*@)([\w-]+)[ \t]+([^\s]+[^\r\n\t\v\f]*)"#
138-
// this pattern checks for specific keys that won't have values
139-
let p2 = #"^(?:[ \t]*(?:\/\/)?[ \t]*@)(noframes)[ \t]*$"#
140-
// force try b/c pattern is known to be valid regex
141-
let re = try! NSRegularExpression(pattern: p, options: [])
142-
let re2 = try! NSRegularExpression(pattern: p2, options: [])
143141
// split metadatas by new line
144142
let metaArray = content[metas].split(whereSeparator: \.isNewline)
145143
// loop through metadata lines and populate metadata dictionary
@@ -148,7 +146,7 @@ func parse(_ content: String) -> [String: Any]? {
148146
let metaString = String(meta).trimmingCharacters(in: .whitespaces)
149147
let range = NSRange(location: 0, length: metaString.utf16.count)
150148
// key lines not properly prefixed & without values will be skipped
151-
if let m = re.firstMatch(in: metaString, options: [], range: range) {
149+
if let m = re1.firstMatch(in: metaString, options: [], range: range) {
152150
// force unwrap key & value since matches regex above
153151
let key = metaString[Range(m.range(at: 1), in: metaString)!]
154152
let value = metaString[Range(m.range(at: 2), in: metaString)!]
@@ -1003,6 +1001,9 @@ func stringToRegex(_ stringPattern: String) -> NSRegularExpression? {
10031001
return regex
10041002
}
10051003

1004+
// RE for parse matchPattern
1005+
let re3 = try! NSRegularExpression(pattern: #"^(http:|https:|\*:)\/\/((?:\*\.)?(?:[a-z0-9-]+\.)+(?:[a-z0-9]+)|\*\.[a-z]+|\*|[a-z0-9]+)(\/[^\s]*)$"#, options: .caseInsensitive)
1006+
10061007
func match(_ url: String, _ matchPattern: String) -> Bool {
10071008
guard
10081009
let parts = jsLikeURL(url),
@@ -1028,10 +1029,8 @@ func match(_ url: String, _ matchPattern: String) -> Bool {
10281029
if (ptcl != "http:" && ptcl != "https:") {
10291030
return false
10301031
}
1031-
let partsPattern = #"^(http:|https:|\*:)\/\/((?:\*\.)?(?:[a-z0-9-]+\.)+(?:[a-z0-9]+)|\*\.[a-z]+|\*|[a-z0-9]+)(\/[^\s]*)$"#
1032-
let partsPatternReg = try! NSRegularExpression(pattern: partsPattern, options: .caseInsensitive)
10331032
let range = NSMakeRange(0, matchPattern.utf16.count)
1034-
guard let parts = partsPatternReg.firstMatch(in: matchPattern, options: [], range: range) else {
1033+
guard let parts = re3.firstMatch(in: matchPattern, options: [], range: range) else {
10351034
logger?.error("\(#function, privacy: .public) - malformed regex match pattern - \(matchPattern, privacy: .public)")
10361035
return false
10371036
}

0 commit comments

Comments
 (0)