From e8e10d42246245d604975a7e837e59bb08884530 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 15 Apr 2014 13:52:41 +0200 Subject: [PATCH] Fixed: If receiver in the function objj_msgSend is a class we don't need to check if it is nil as a class can never be nil without the load has already failed. --- Objective-J/ObjJAcornCompiler.js | 12 +++++++++++- .../OutputTests/Messages/no-parameters.j | 2 +- .../OutputTests/Messages/no-parameters.js | 4 ++-- .../OutputTests/Messages/one-parameter.j | 2 +- .../OutputTests/Messages/one-parameter.js | 4 ++-- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 43f046e1a..83f61621b 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -2170,9 +2170,18 @@ MessageSendExpression: function(node, st, c) { // If it is 'self' we assume it will never be nil and remove that test var receiverIsIdentifier = nodeObject.type === "Identifier" && !(st.currentMethodType() === "-" && compiler.getIvarForClass(nodeObject.name, st) && !st.getLvar(nodeObject.name, true)), selfLvar, - receiverIsNotSelf = !receiverIsIdentifier || nodeObject.name !== "self" || !(selfLvar = st.getLvar("self", true)) || !selfLvar.scope || selfLvar.scope.assignmentToSelf; + receiverIsNotSelf; if (receiverIsIdentifier) { + var name = nodeObject.name, + selfLvar = st.getLvar(name); + + if (name === "self") { + receiverIsNotSelf = !selfLvar || !selfLvar.scope || selfLvar.scope.assignmentToSelf; + } else { + receiverIsNotSelf = !!selfLvar || !compiler.getClassDef(name); + } + if (receiverIsNotSelf) { buffer.concat("("); c(nodeObject, st, "Expression"); @@ -2180,6 +2189,7 @@ MessageSendExpression: function(node, st, c) { } c(nodeObject, st, "Expression"); } else { + receiverIsNotSelf = true; if (!st.receiverLevel) st.receiverLevel = 0; buffer.concat("((___r"); buffer.concat(++st.receiverLevel + ""); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.j b/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.j index 3292fea80..dc4f82b03 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.j @@ -1,2 +1,2 @@ - +[CPArray new]; [object message]; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.js b/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.js index 58a5cae2a..023c09bdf 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/no-parameters.js @@ -1,2 +1,2 @@ - -(object==null?null:object.isa.objj_msgSend0(object,"message")); +CPArray.isa.objj_msgSend0(CPArray,"new"); +(object==null?null:object.isa.objj_msgSend0(object,"message")); \ No newline at end of file diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.j b/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.j index dee678fde..8e01d2bab 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.j @@ -1,2 +1,2 @@ - +[CPArray arrayWithArray:[]]; [object label:argument]; diff --git a/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.js b/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.js index 99a3c5f0f..b8795333c 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.js +++ b/Tests/Objective-J/Preprocessor/OutputTests/Messages/one-parameter.js @@ -1,2 +1,2 @@ - -(object==null?null:object.isa.objj_msgSend1(object,"label:",argument)); +CPArray.isa.objj_msgSend1(CPArray,"arrayWithArray:",[]); +(object==null?null:object.isa.objj_msgSend1(object,"label:",argument)); \ No newline at end of file