-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Adding new extensions
bang edited this page Aug 18, 2015
·
3 revisions
##API
All extensions should extend JPExtension
:
@interface JPExtension : NSObject
+ (void)main:(JSContext *)context;
+ (void *)formatPointerJSToOC:(JSValue *)val;
+ (id)formatPointerOCToJS:(void *)pointer;
+ (id)formatJSToOC:(JSValue *)val;
+ (id)formatOCToJS:(id)obj;
+ (int)sizeOfStructTypes:(NSString *)structTypes;
+ (void)getStructDataWidthDict:(void *)structData dict:(NSDictionary *)dict structDefine:(NSDictionary *)structDefine;
+ (NSDictionary *)getDictOfStruct:(void *)structData structDefine:(NSDictionary *)structDefine;
@end
##Add C function support
The +main:
method in JPExtension
will be executed when the extension added to JPEngine
, so we can add JS methods in +main:
.
The 4 formatXXX
methods are used for translate types through OC and JS, use -formatPointerJSToOC:
/ -formatJSToOC:
to convert params from JS to OC, use -formatPointerOCToJS:
/ -formatOCToJS:
to convert return value from OC to JS. Example:
@interface JPMemory : JPExtension
@end
@implementation JPMemory
+ (void)main:(JSContext *)context
{
context[@"malloc"] = ^id(size_t size) {
void *m = malloc(size);
return [self formatPointerOCToJS:m];
};
context[@"free"] = ^id(JSValue *jsVal) {
void *m = [self formatPointerJSToOC:jsVal];
free(m)
};
}
@end
Now we can use malloc()
and free()
in JS:
require('JPEngine').addExtensions(['JPMemory'])
var m = malloc(1024)
free(m)