Hi,
Changing to
emitClosureStart();
emitAssignedValue(assignedNode);
MemberAccessExpressionNode
maenode = (MemberAccessExpressionNode)assignedNode;
emitClosureEnd(maenode.getLeftOperandNode(), definition);
Results in
org.apache.royale.utils.Language.as(c, MyButton).clickFunction =
org.apache.royale.utils.Language.closure(this.parentApplication.buttonFunction,
'Function');
Which fails with
TypeError: Object.defineProperty called on non-object
Watch
Call Stack
org.apache.royale.utils.Language.closure
Language.js:281
MyBox.addElement
MyBox.js:39
From: Greg Dove<mailto:[email protected]>
Sent: Monday, April 6, 2020 12:07 AM
To: Apache Royale Development<mailto:[email protected]>
Subject: Re: [royale-compiler] 01/01: Works on given test case. Hope I didn't
break anything.
Take a look at emitClosureStart and emitClosureEnd I think those will help
out.
On Mon, Apr 6, 2020 at 9:01 AM Greg Dove <[email protected]> wrote:
>
> You might find a place in the code where there is something already that
> has 'needClosure' logic, but the logic that sets it to true does not yet
> include the specific case you are dealing with.
>
> On Mon, Apr 6, 2020 at 8:53 AM Greg Dove <[email protected]> wrote:
>
>> I think it's a great start Yishay. But I'd suggest you look for other
>> areas of the compiler code where there is a generation of Language.closure
>> output. This should do the same thing I think, but be consistent.
>>
>>
>> On Mon, Apr 6, 2020 at 8:51 AM <[email protected]> wrote:
>>
>>> This is an automated email from the ASF dual-hosted git repository.
>>>
>>> yishayw pushed a commit to branch issue_143
>>> in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
>>>
>>> commit 634cb4f3362c75317538ba0daedafd19742d00df
>>> Author: DESKTOP-RH4S838\Yishay <[email protected]>
>>> AuthorDate: Sun Apr 5 23:48:11 2020 +0300
>>>
>>> Works on given test case. Hope I didn't break anything.
>>>
>>> Reference #143
>>> ---
>>> .../royale/compiler/internal/codegen/js/JSEmitter.java | 15
>>> ++++++++++++++-
>>> 1 file changed, 14 insertions(+), 1 deletion(-)
>>>
>>> diff --git
>>> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
>>> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
>>> index d24adca..24c65f3 100644
>>> ---
>>> a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
>>> +++
>>> b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/JSEmitter.java
>>> @@ -40,6 +40,7 @@ import
>>> org.apache.royale.compiler.definitions.metadata.IMetaTag;
>>> import
>>> org.apache.royale.compiler.definitions.metadata.IMetaTagAttribute;
>>> import org.apache.royale.compiler.internal.codegen.as.ASEmitter;
>>> import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
>>> +import
>>> org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
>>> import
>>> org.apache.royale.compiler.internal.codegen.js.jx.BlockCloseEmitter;
>>> import
>>> org.apache.royale.compiler.internal.codegen.js.jx.BlockOpenEmitter;
>>> import org.apache.royale.compiler.internal.codegen.js.jx.CatchEmitter;
>>> @@ -914,7 +915,19 @@ public class JSEmitter extends ASEmitter implements
>>> IJSEmitter
>>> {
>>> write(coercionStart);
>>> }
>>> - emitAssignedValue(assignedNode);
>>> + if
>>> (project.getBuiltinType(BuiltinType.FUNCTION).equals(definition) &&
>>> + assignedNode instanceof
>>> MemberAccessExpressionNode) {
>>> + write(JSGoogEmitterTokens.GOOG_BIND.getToken() +
>>> +
>>> ASEmitterTokens.PAREN_OPEN.getToken()
>>> + );
>>> + emitAssignedValue(assignedNode);
>>> + write(ASEmitterTokens.COMMA.getToken());
>>> + MemberAccessExpressionNode maenode =
>>> (MemberAccessExpressionNode)assignedNode;
>>> + getWalker().walk(maenode.getLeftOperandNode());
>>> + write(ASEmitterTokens.PAREN_CLOSE.getToken());
>>> + } else {
>>> + emitAssignedValue(assignedNode);
>>> + }
>>> if (coercionStart != null)
>>> {
>>> if (coercionEnd != null)
>>>
>>>