1414
1515static JSContext *globalContext;
1616
17+ static NSString *mangledNameFromClass (Class cls)
18+ {
19+ return [NSString stringWithFormat: @" __JSB_%@ " , NSStringFromClass (cls)];
20+ }
21+
1722static NSString *propertyNameFromSelector (SEL selector)
1823{
1924 NSArray *split = [NSStringFromSelector (selector) componentsSeparatedByString: @" :" ];
@@ -140,6 +145,10 @@ static void setReturnValue(JSValue *value, NSInvocation *invocation)
140145 NSMethodSignature *methodSignature = invocation.methodSignature ;
141146 const char *type = methodSignature.methodReturnType ;
142147
148+ if (strcmp (type, @encode (void )) == 0 ) {
149+ return ;
150+ }
151+
143152 if (strcmp (type, @encode (char )) == 0 ||
144153 strcmp (type, @encode (short )) == 0 ||
145154 strcmp (type, @encode (int )) == 0 ||
@@ -159,8 +168,10 @@ static void setReturnValue(JSValue *value, NSInvocation *invocation)
159168 BOOL returnValue = value.toBool ;
160169 [invocation setReturnValue: &returnValue];
161170 } else if (strcmp (type, @encode (float )) == 0 ||
162- strcmp (type, @encode (double )) == 0 ||
163171 strcmp (type, @encode (CGFloat)) == 0 ) {
172+ float returnValue = value.toDouble ;
173+ [invocation setReturnValue: &returnValue];
174+ } else if (strcmp (type, @encode (double )) == 0 ) {
164175 double returnValue = value.toDouble ;
165176 [invocation setReturnValue: &returnValue];
166177 } else {
@@ -169,7 +180,7 @@ static void setReturnValue(JSValue *value, NSInvocation *invocation)
169180 }
170181}
171182
172- static void setupForwardingImplementations (Class cls, JSValue *functions)
183+ static void setupForwardingImplementations (Class targetClass, Class cls, JSValue *functions)
173184{
174185 unsigned int count = 0 ;
175186 Method *methods = class_copyMethodList (cls, &count);
@@ -180,7 +191,7 @@ static void setupForwardingImplementations(Class cls, JSValue *functions)
180191 NSString *propertyName = propertyNameFromSelector (description->name );
181192 JSValue *function = functions[propertyName];
182193 if (!function.isUndefined ) {
183- method_setImplementation (m, _objc_msgForward);
194+ class_addMethod (targetClass, description-> name , _objc_msgForward, description-> types );
184195 }
185196 }
186197 if (methods) {
@@ -189,19 +200,24 @@ static void setupForwardingImplementations(Class cls, JSValue *functions)
189200
190201 Class superClass = class_getSuperclass (cls);
191202 if (superClass) {
192- setupForwardingImplementations (superClass, functions);
203+ setupForwardingImplementations (targetClass, superClass, functions);
193204 }
194205}
195206
196207static void forwardInvocation (id self, SEL _cmd, NSInvocation *invocation)
197208{
209+ JSContext *context = globalContext;
210+ context[@" self" ] = self;
211+
198212 NSString *propertyName = propertyNameFromSelector (invocation.selector );
199- JSValue *value = globalContext[NSStringFromClass ([self class ])][@" instanceMembers" ][propertyName];
213+ JSValue *value = globalContext[mangledNameFromClass ([self class ])][@" instanceMembers" ][propertyName];
200214
201215 NSArray *arguments = extractArguments (invocation);
202216 JSValue *returnValue = [value callWithArguments: arguments];
203217
204218 setReturnValue (returnValue, invocation);
219+
220+ context[@" self" ] = [NSNull null ];
205221}
206222
207223static NSMethodSignature *methodSignatureForSelector (id self, SEL _cmd, SEL selector)
@@ -221,7 +237,7 @@ static void forwardInvocation(id self, SEL _cmd, NSInvocation *invocation)
221237static BOOL respondsToSelector (id self, SEL _cmd, SEL selector)
222238{
223239 NSString *propertyName = propertyNameFromSelector (selector);
224- JSValue *value = globalContext[NSStringFromClass ([self class ])][@" instanceMembers" ][propertyName];
240+ JSValue *value = globalContext[mangledNameFromClass ([self class ])][@" instanceMembers" ][propertyName];
225241
226242 return !value.isUndefined ;
227243}
@@ -243,11 +259,15 @@ + (void)initialize
243259
244260 globalContext[@" JSB" ] = [JSBScriptingSupport class ];
245261 [globalContext evaluateScript:
246- @" JSB.Class = {};"
262+ @" JSB.Class = (function() {"
263+ @" var namespace = {"
264+ @" define: function(declaration, instanceMembers, staticMembers) {"
265+ @" return JSB.defineClass(declaration, instanceMembers, staticMembers);"
266+ @" }"
267+ @" };"
247268 @" "
248- @" JSB.Class.define = function(declaration, instanceMembers, staticMembers) {"
249- @" JSB.defineClass(declaration, instanceMembers, staticMembers);"
250- @" };"
269+ @" return namespace;"
270+ @" })();"
251271 ];
252272 });
253273}
@@ -259,9 +279,9 @@ + (JSContext *)globalContext
259279 return globalContext;
260280}
261281
262- + (void )defineClass : (NSString *)declaration
263- instanceMembers : (JSValue *)instanceMembers
264- staticMembers : (JSValue *)staticMembers
282+ + (id )defineClass : (NSString *)declaration
283+ instanceMembers : (JSValue *)instanceMembers
284+ staticMembers : (JSValue *)staticMembers
265285{
266286 NSScanner *scanner = [NSScanner scannerWithString: declaration];
267287
@@ -289,7 +309,7 @@ + (void)defineClass:(NSString *)declaration
289309
290310 Class superClass = class_getSuperclass (cls);
291311 if (superClass) {
292- setupForwardingImplementations (superClass, instanceMembers);
312+ setupForwardingImplementations (cls, superClass, instanceMembers);
293313 }
294314
295315 NSString *types;
@@ -309,14 +329,15 @@ + (void)defineClass:(NSString *)declaration
309329 }
310330
311331 class_addProtocol (cls, @protocol (JSBNSObject));
312- #if DEBUG
313- class_addProtocol (cls, @protocol (JSBScriptingSupport));
314- #endif
315332
316- globalContext[className] = cls;
317- globalContext[className][@" instanceMembers" ] = instanceMembers;
333+ globalContext[mangledNameFromClass (cls)] = cls;
334+ globalContext[mangledNameFromClass (cls)][@" instanceMembers" ] = instanceMembers;
335+
336+ return cls;
318337}
319338
339+ #pragma mark - for debug
340+
320341+ (void )dump : (id )object
321342{
322343 NSLog (@" %@ " , object);
0 commit comments