forked from bang590/JSPatch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJPStructPointer.m
71 lines (66 loc) · 2.75 KB
/
JPStructPointer.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//
// JPStructPointer.m
// JSPatchDemo
//
// Created by bang on 15/8/13.
// Copyright (c) 2015年 bang. All rights reserved.
//
#import "JPStructPointer.h"
@implementation JPStructPointer
+ (void)main:(JSContext *)context
{
__weak JSContext *weakCtx = context;
context[@"newStruct"] = ^id(NSString *structName, JSValue *structDict) {
#define JP_NEW_STRUCT(_type, _method) \
if ([structName isEqualToString:@#_type]) { \
void *ret = malloc(sizeof(_type)); \
_type rect = [structDict _method]; \
ret = memcpy(ret, &rect, sizeof(_type)); \
return [self formatPointerOCToJS:ret]; \
}
JP_NEW_STRUCT(CGRect, toRect)
JP_NEW_STRUCT(CGPoint, toPoint)
JP_NEW_STRUCT(CGSize, toSize)
JP_NEW_STRUCT(NSRange, toRange)
@synchronized (weakCtx) {
NSDictionary *structDefine = [JPExtension registeredStruct][structName];
if (structDefine) {
int size = [self sizeOfStructTypes:structDefine[@"types"]];
void *ret = malloc(size);
memset(ret, 0, size);
[self getStructDataWidthDict:ret dict:[structDict toObject] structDefine:structDefine];
return [self formatPointerOCToJS:ret];
}
}
return nil;
};
context[@"pvalStruct"] = ^id(NSString *structName, JSValue *structPointer) {
if ([structName isEqualToString:@"CGRect"]) {
CGRect *rect = [self formatPointerJSToOC:structPointer];
return @{@"x": @(rect->origin.x), @"y": @(rect->origin.y), @"width": @(rect->size.width), @"height": @(rect->size.height)};
}
if ([structName isEqualToString:@"CGPoint"]) {
CGPoint *point = [self formatPointerJSToOC:structPointer];
return @{@"x": @(point->x), @"y": @(point->y)};
}
if ([structName isEqualToString:@"CGSize"]) {
CGSize *size = [self formatPointerJSToOC:structPointer];
return @{@"width": @(size->width), @"height": @(size->height)};
}
if ([structName isEqualToString:@"NSRange"]) {
NSRange *range = [self formatPointerJSToOC:structPointer];
return @{@"location": @(range->location), @"length": @(range->length)};
}
@synchronized (weakCtx) {
JSContext *context = [JPEngine context];
@synchronized (context) {
NSDictionary *structDefine = [JPExtension registeredStruct][structName];
if (structDefine) {
return [self getDictOfStruct:[self formatPointerJSToOC:structPointer] structDefine:structDefine];
}
}
}
return nil;
};
}
@end