-
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)
};
}
@endNow we can use malloc() and free() in JS:
require('JPEngine').addExtensions(['JPMemory'])
var m = malloc(1024)
free(m)