Merge pull request #2852 from mrcarlberg/msg_send_return_undefined_when_receiver_is_undefined

New: msgSend will return undefined instead of nil when the receiver is undefined.
This commit is contained in:
cacaodev
2019-08-31 11:28:17 +02:00
committed by GitHub
22 changed files with 77 additions and 37 deletions
+2 -2
View File
@@ -463,7 +463,7 @@ var CPBrowserDelegate_browser_acceptDrop_atRow_column_dropOperation_
- (id)itemAtRow:(CPInteger)row inColumn:(CPInteger)column
{
return [_tableDelegates[column] childAtIndex:row];
return [_tableDelegates[column] childAtIndex:row] || nil;
}
- (BOOL)isLeafItem:(id)item
@@ -473,7 +473,7 @@ var CPBrowserDelegate_browser_acceptDrop_atRow_column_dropOperation_
- (id)parentForItemsInColumn:(CPInteger)column
{
return [_tableDelegates[column] _item];
return [_tableDelegates[column] _item] || nil;
}
- (CPSet)selectedItems
+30 -10
View File
@@ -2447,7 +2447,9 @@ ArrayLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = (CPArray.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPArray, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : (___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : (___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.method_msgSend[\"init\"] || _objj_forward)(___r");
buffer.concat(st.receiverLevel + "");
@@ -2457,7 +2459,9 @@ ArrayLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = CPArray.isa.objj_msgSend0(CPArray, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : ___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.objj_msgSend0(___r");
buffer.concat(st.receiverLevel + "");
@@ -2472,7 +2476,9 @@ ArrayLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = (CPArray.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPArray, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : (___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : (___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.method_msgSend[\"initWithObjects:count:\"] || _objj_forward)(___r");
buffer.concat(st.receiverLevel + "");
@@ -2482,7 +2488,9 @@ ArrayLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = CPArray.isa.objj_msgSend0(CPArray, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : ___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.objj_msgSend2(___r");
buffer.concat(st.receiverLevel + "");
@@ -2541,7 +2549,9 @@ DictionaryLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = (CPDictionary.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPDictionary, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : (___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : (___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.method_msgSend[\"init\"] || _objj_forward)(___r");
buffer.concat(st.receiverLevel + "");
@@ -2551,7 +2561,9 @@ DictionaryLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = CPDictionary.isa.objj_msgSend0(CPDictionary, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : ___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.objj_msgSend0(___r");
buffer.concat(st.receiverLevel + "");
@@ -2566,7 +2578,9 @@ DictionaryLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = (CPDictionary.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPDictionary, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : (___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : (___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.method_msgSend[\"initWithObjects:forKeys:\"] || _objj_forward)(___r");
buffer.concat(st.receiverLevel + "");
@@ -2576,7 +2590,9 @@ DictionaryLiteral: function(node, st, c) {
buffer.concat(++st.receiverLevel + "");
buffer.concat(" = CPDictionary.isa.objj_msgSend0(CPDictionary, \"alloc\"), ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" == null ? null : ___r");
buffer.concat(" == null ? ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(" : ___r");
buffer.concat(st.receiverLevel + "");
buffer.concat(".isa.objj_msgSend2(___r");
buffer.concat(st.receiverLevel + "");
@@ -3408,7 +3424,9 @@ MessageSendExpression: function(node, st, c) {
if (receiverIsNotSelf) {
buffer.concat("(", node);
c(nodeObject, st, "Expression");
buffer.concat(" == null ? null : ", node);
buffer.concat(" == null ? ", node);
c(nodeObject, st, "Expression");
buffer.concat(" : ", node);
}
if (inlineMsgSend)
buffer.concat("(", node);
@@ -3421,7 +3439,9 @@ MessageSendExpression: function(node, st, c) {
c(nodeObject, st, "Expression");
buffer.concat(")", node);
buffer.concat(", ___r" + st.receiverLevel, node);
buffer.concat(" == null ? null : ", node);
buffer.concat(" == null ? ", node);
buffer.concat("___r" + st.receiverLevel, node);
buffer.concat(" : ", node);
if (inlineMsgSend)
buffer.concat("(", node);
buffer.concat("___r" + st.receiverLevel, node);
+1 -1
View File
@@ -838,7 +838,7 @@ var __objj_msgSend__StackDepth = 0;
GLOBAL(objj_msgSend) = function(/*id*/ aReceiver, /*SEL*/ aSelector)
{
if (aReceiver == nil)
return nil;
return aReceiver;
var isa = aReceiver.isa;
@@ -41,6 +41,16 @@
return anotherNumber - aNumber;
}
-(id)nil
{
return nil;
}
-(id)undefined
{
return undefined;
}
@end
@implementation MethodTest : OJTestCase
@@ -135,4 +145,14 @@
[self assert:method_getNumberOfArguments(method) equals:3];
}
- (void)testReturnNil
{
[self assert:[[testClass nil] someSelector] equals:null];
}
- (void)testReturnUndefined
{
[self assert:[[testClass undefined] someSelector] equals:undefined];
}
@end
@@ -1,2 +1,2 @@
(object==null?null:(object.isa.method_msgSend[":"]||_objj_forward)(object,":",argument));
(object==null?object:(object.isa.method_msgSend[":"]||_objj_forward)(object,":",argument));
@@ -1,2 +1,2 @@
(object==null?null:object.isa.objj_msgSend1(object,":",argument));
(object==null?object:object.isa.objj_msgSend1(object,":",argument));
@@ -1,2 +1,2 @@
var a=0;
((___r1=a++<2?small_target:big_target),___r1==null?null:(___r1.isa.method_msgSend["doStuff"]||_objj_forward)(___r1,"doStuff"));
((___r1=a++<2?small_target:big_target),___r1==null?___r1:(___r1.isa.method_msgSend["doStuff"]||_objj_forward)(___r1,"doStuff"));
@@ -1,2 +1,2 @@
var a=0;
((___r1=a++<2?small_target:big_target),___r1==null?null:___r1.isa.objj_msgSend0(___r1,"doStuff"));
((___r1=a++<2?small_target:big_target),___r1==null?___r1:___r1.isa.objj_msgSend0(___r1,"doStuff"));
@@ -1 +1 @@
(object==null?null:(object.isa.method_msgSend["for:in:nil:"]||_objj_forward)(object,"for:in:nil:",a,b,nil));
(object==null?object:(object.isa.method_msgSend["for:in:nil:"]||_objj_forward)(object,"for:in:nil:",a,b,nil));
@@ -1 +1 @@
(object==null?null:object.isa.objj_msgSend3(object,"for:in:nil:",a,b,nil));
(object==null?object:object.isa.objj_msgSend3(object,"for:in:nil:",a,b,nil));
@@ -1,2 +1,2 @@
(object==null?null:(object.isa.method_msgSend["label:label2:label3:label4:"]||_objj_forward)(object,"label:label2:label3:label4:",argument,argument2,argument3,argument4));
(object==null?object:(object.isa.method_msgSend["label:label2:label3:label4:"]||_objj_forward)(object,"label:label2:label3:label4:",argument,argument2,argument3,argument4));
@@ -1,2 +1,2 @@
(object==null?null:object.isa.objj_msgSend(object,"label:label2:label3:label4:",argument,argument2,argument3,argument4));
(object==null?object:object.isa.objj_msgSend(object,"label:label2:label3:label4:",argument,argument2,argument3,argument4));
@@ -1,2 +1,2 @@
(CPArray.isa.method_msgSend["new"]||_objj_forward)(CPArray,"new");
(object==null?null:(object.isa.method_msgSend["message"]||_objj_forward)(object,"message"));
(object==null?object:(object.isa.method_msgSend["message"]||_objj_forward)(object,"message"));
@@ -1,2 +1,2 @@
CPArray.isa.objj_msgSend0(CPArray,"new");
(object==null?null:object.isa.objj_msgSend0(object,"message"));
(object==null?object:object.isa.objj_msgSend0(object,"message"));
@@ -1,2 +1,2 @@
(CPArray.isa.method_msgSend["arrayWithArray:"]||_objj_forward)(CPArray,"arrayWithArray:",[]);
(object==null?null:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",argument));
(object==null?object:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",argument));
@@ -1,2 +1,2 @@
CPArray.isa.objj_msgSend1(CPArray,"arrayWithArray:",[]);
(object==null?null:object.isa.objj_msgSend1(object,"label:",argument));
(object==null?object:object.isa.objj_msgSend1(object,"label:",argument));
@@ -3,9 +3,9 @@ objj_registerClassPair(the_class);
class_addMethods(the_class,[new objj_method(sel_getUid("mySelector"),function $MyClass__mySelector(_1,_2){
(_1.isa.method_msgSend["init"]||_objj_forward)(_1,"init");
_1=nil;
(_1==null?null:(_1.isa.method_msgSend["init"]||_objj_forward)(_1,"init"));
(_1==null?_1:(_1.isa.method_msgSend["init"]||_objj_forward)(_1,"init"));
},["id"]),new objj_method(sel_getUid("mySelector2"),function $MyClass__mySelector2(_3,_4){
(_3.isa.method_msgSend["init"]||_objj_forward)(_3,"init");
eval("self = null;");
(_3==null?null:(_3.isa.method_msgSend["init"]||_objj_forward)(_3,"init"));
(_3==null?_3:(_3.isa.method_msgSend["init"]||_objj_forward)(_3,"init"));
},["id"])]);
@@ -3,9 +3,9 @@ objj_registerClassPair(the_class);
class_addMethods(the_class,[new objj_method(sel_getUid("mySelector"),function $MyClass__mySelector(_1,_2){
_1.isa.objj_msgSend0(_1,"init");
_1=nil;
(_1==null?null:_1.isa.objj_msgSend0(_1,"init"));
(_1==null?_1:_1.isa.objj_msgSend0(_1,"init"));
},["id"]),new objj_method(sel_getUid("mySelector2"),function $MyClass__mySelector2(_3,_4){
_3.isa.objj_msgSend0(_3,"init");
eval("self = null;");
(_3==null?null:_3.isa.objj_msgSend0(_3,"init"));
(_3==null?_3:_3.isa.objj_msgSend0(_3,"init"));
},["id"])]);
@@ -1,4 +1,4 @@
(object==null?null:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",condition?true:false));
(object==null?null:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",condition?true:false));
(object==null?null:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",condition?true:false));
(object==null?object:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",condition?true:false));
(object==null?object:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",condition?true:false));
(object==null?object:(object.isa.method_msgSend["label:"]||_objj_forward)(object,"label:",condition?true:false));
@@ -1,4 +1,4 @@
(object==null?null:object.isa.objj_msgSend1(object,"label:",condition?true:false));
(object==null?null:object.isa.objj_msgSend1(object,"label:",condition?true:false));
(object==null?null:object.isa.objj_msgSend1(object,"label:",condition?true:false));
(object==null?object:object.isa.objj_msgSend1(object,"label:",condition?true:false));
(object==null?object:object.isa.objj_msgSend1(object,"label:",condition?true:false));
(object==null?object:object.isa.objj_msgSend1(object,"label:",condition?true:false));
@@ -1,3 +1,3 @@
x=function(){
return (someIval==null?null:(someIval.isa.method_msgSend["someMethod"]||_objj_forward)(someIval,"someMethod"));
return (someIval==null?someIval:(someIval.isa.method_msgSend["someMethod"]||_objj_forward)(someIval,"someMethod"));
};
@@ -1,3 +1,3 @@
x=function(){
return (someIval==null?null:someIval.isa.objj_msgSend0(someIval,"someMethod"));
return (someIval==null?someIval:someIval.isa.objj_msgSend0(someIval,"someMethod"));
};