From e683d7d9260b8b30a9182ce6a92487edf5c1b67d Mon Sep 17 00:00:00 2001 From: "Brian T. Rice" Date: Wed, 16 Feb 2011 18:05:52 -0800 Subject: [PATCH] Fix for the Compiler logic to Nil the environment on a CompiledMethod when not needed. --- src/mobius/compiler.slate | 2 +- src/syntax/node.slate | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/mobius/compiler.slate b/src/mobius/compiler.slate index da865ce..ebaeed4 100644 --- a/src/mobius/compiler.slate +++ b/src/mobius/compiler.slate @@ -317,7 +317,7 @@ and push it onto the stack." [ topLevel `defaultsTo: False. newBlock ::= CompiledMethod new `>> - [environment := block allSelectorsSentImplicitly isEmpty ifFalse: + [environment := block bodyIncludesImplicitSends ifTrue: [gen contexts isEmpty ifTrue: [block parentScope topLevel namespace] ifFalse: [gen currentMethod environment]]. diff --git a/src/syntax/node.slate b/src/syntax/node.slate index 8647ab1..0b136a6 100644 --- a/src/syntax/node.slate +++ b/src/syntax/node.slate @@ -838,8 +838,18 @@ b@(nodes Block traits) allSelectorsSentToInputs [ [| :result | b inputVariables keysDo: - [| :index | result ; (b allSelectorsSentToInputAt: index)]. - ] writingAs: Set + [| :index | result ; (b allSelectorsSentToInputAt: index)] + ] writingAs: Set +]. + +b@(nodes Block traits) bodyIncludesImplicitSends +[ + b statements do: + [| :statement | statement walk: + [| :node | (node is: nodes Message) /\ + [node arguments includes: nodes ImplicitArgument] + ifTrue: [^ True]]]. + False ]. b@(nodes Block traits) allSelectorsSentImplicitly @@ -847,11 +857,13 @@ b@(nodes Block traits) allSelectorsSentImplicitly [| :result | b statements do: [| :statement | statement walk: - [| :node | (node is: nodes Message) - ifTrue: [node arguments do: - [| :arg | (arg is: nodes LoadVariable) /\ - [arg variable = nodes ImplicitArgument] - ifTrue: [result nextPut: node selector]]]]]] writingAs: Set + [| :node | (node is: nodes Message) ifTrue: + [node arguments do: + [| :arg | + arg = nodes ImplicitArgument + \/ [(arg is: nodes LoadVariable) + /\ [arg variable = nodes ImplicitArgument]] + ifTrue: [result nextPut: node selector]]]]]] writingAs: Set ]. nodes define: #MethodDefinition &parents: {nodes Block} -- 2.11.4.GIT