mirror of
https://github.com/Tencent/Hippy.git
synced 2026-10-18 13:40:41 +08:00
d9576d4819
* refactor(ios): Revert rename Hippy prefix part3 * refactor(ios): Revert rename from Hippy prefix to NativeRender part1 the original rename pr is #2165 * refactor(ios): Revert rename from Hippy prefix to NativeRender part2 * refactor(ios): Revert rename Hippy prefix part4 * refactor(ios): Revert rename Hippy prefix part5 * refactor(ios): Revert rename Hippy prefix part 6 * refactor(ios): Revert rename Hippy prefix part 7 * refactor(ios): make hippy3 native component compatible with hippy2 * refactor(ios): Revert rename Hippy prefix part 8 * refactor(ios): Revert rename Hippy prefix part 9 * refactor(ios): Revert rename Hippy prefix part 10 * refactor(ios): Revert rename Hippy prefix to NativeRender part 11 * refactor(ios): Revert rename and sdk frame refactor part 12 * refactor(ios): Revert rename and sdk frame refactor part 13 HippyRootView and sdk start related change * feat(ios): Improve method of getting UI state and Add NightMode sync from hippy2 * fix(ios): bridge and rootView's memory issue when dealloc * refactor(ios): Revert rename and sdk frame refactor part 14 * fix(ios): listview and waterfall reload animation bug * fix(ios): fix hippy3 podspec's bug remove all deprecated Header Search Path settings in user_target_xcconfig
103 lines
3.5 KiB
Objective-C
103 lines
3.5 KiB
Objective-C
/*!
|
|
* iOS SDK
|
|
*
|
|
* Tencent is pleased to support the open source community by making
|
|
* Hippy available.
|
|
*
|
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company.
|
|
* All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#import "HippyJSStackFrame.h"
|
|
#import "HippyLog.h"
|
|
#import "HippyUtils.h"
|
|
|
|
static NSRegularExpression *HippyJSStackFrameRegex(void) {
|
|
static dispatch_once_t onceToken;
|
|
static NSRegularExpression *_regex;
|
|
dispatch_once(&onceToken, ^{
|
|
NSError *regexError;
|
|
_regex = [NSRegularExpression regularExpressionWithPattern:@"^([^@]+)@(.*):(\\d+):(\\d+)$" options:0 error:®exError];
|
|
if (regexError) {
|
|
HippyLogError(@"Failed to build regex: %@", [regexError localizedDescription]);
|
|
}
|
|
});
|
|
return _regex;
|
|
}
|
|
|
|
@implementation HippyJSStackFrame
|
|
|
|
- (instancetype)initWithMethodName:(NSString *)methodName file:(NSString *)file lineNumber:(NSInteger)lineNumber column:(NSInteger)column {
|
|
if (self = [super init]) {
|
|
_methodName = methodName;
|
|
_file = file;
|
|
_lineNumber = lineNumber;
|
|
_column = column;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (NSDictionary *)toDictionary {
|
|
return @{
|
|
@"methodName": HippyNullIfNil(self.methodName),
|
|
@"file": HippyNullIfNil(self.file),
|
|
@"lineNumber": @(self.lineNumber),
|
|
@"column": @(self.column)
|
|
};
|
|
}
|
|
|
|
+ (instancetype)stackFrameWithLine:(NSString *)line {
|
|
NSTextCheckingResult *match = [HippyJSStackFrameRegex() firstMatchInString:line options:0 range:NSMakeRange(0, line.length)];
|
|
if (!match) {
|
|
return nil;
|
|
}
|
|
|
|
NSString *methodName = [line substringWithRange:[match rangeAtIndex:1]];
|
|
NSString *file = [line substringWithRange:[match rangeAtIndex:2]];
|
|
NSString *lineNumber = [line substringWithRange:[match rangeAtIndex:3]];
|
|
NSString *column = [line substringWithRange:[match rangeAtIndex:4]];
|
|
|
|
return [[self alloc] initWithMethodName:methodName file:file lineNumber:[lineNumber integerValue] column:[column integerValue]];
|
|
}
|
|
|
|
+ (instancetype)stackFrameWithDictionary:(NSDictionary *)dict {
|
|
return [[self alloc] initWithMethodName:dict[@"methodName"] file:dict[@"file"] lineNumber:[dict[@"lineNumber"] integerValue]
|
|
column:[dict[@"column"] integerValue]];
|
|
}
|
|
|
|
+ (NSArray<HippyJSStackFrame *> *)stackFramesWithLines:(NSString *)lines {
|
|
NSMutableArray *stack = [NSMutableArray new];
|
|
for (NSString *line in [lines componentsSeparatedByString:@"\n"]) {
|
|
HippyJSStackFrame *frame = [self stackFrameWithLine:line];
|
|
if (frame) {
|
|
[stack addObject:frame];
|
|
}
|
|
}
|
|
return stack;
|
|
}
|
|
|
|
+ (NSArray<HippyJSStackFrame *> *)stackFramesWithDictionaries:(NSArray<NSDictionary *> *)dicts {
|
|
NSMutableArray *stack = [NSMutableArray new];
|
|
for (NSDictionary *dict in dicts) {
|
|
HippyJSStackFrame *frame = [self stackFrameWithDictionary:dict];
|
|
if (frame) {
|
|
[stack addObject:frame];
|
|
}
|
|
}
|
|
return stack;
|
|
}
|
|
|
|
@end
|