On Dec 7, 2007, at 12:36 PM, P T Withington wrote:

Maybe we just need to think a bit more about how we are going to convert the user application into something compilable.

I guess we decided that the user application needs to be a class? The question is, whether the globals in the old app should be instance variables, or, should they be class variables? If LzTestManager were a class variable, then it would be 'in scope' without needing `with(this)`.

I just tried
  static var LzTestManager
and it is not seen.   I need to qualify it ---
   DefaultApplication.LzTestManager.failAssertion(errmsg);

But, I think the real problem here is just that LzTestManager needs to be class-ified, rather than trying to simulate the old Object way of doing things. In which case the reference to LzTestManager would just need to be replaced with `this`, or, removed altogether if you rely on AS3's implicit with this inside methods

there is an implicit this inside methods, but this is a closure, so explicit qualification appears to be needed. In java for this situation you have access to anything declared final, but final cannot be used on vars in AS3.

Are you suggesting .lzx code changes?

(which reminds me: the compiler should _not_ insert it's own `with (this)` when generating for AS3, and makes me wonder if we should simulate the same in our script class methods in addition to LZX methods).

On 2007-12-07, at 12:25 EST, Donald Anderson wrote:

I'm trying to get lztest-node compiled in SWF9, and I see a compiler error
coming from the included lztestmanager.lzx:

LzTestManager.assertTrue = function(condition, assertion) {
   if (!condition)  {
       var errmsg = "FAIL: assertTrue('" + condition + "') failed"
                   + (assertion ? ': ' + assertion : '');
==>        LzTestManager.failAssertion(errmsg);
   }
}

On the indicated line, LzTestManager shows up as undefined.
I've declared LzTestManager as an instance variable of the
application class that was created, so the LzTestManager.assertTrue
reference is not a problem. The indicated one is a problem because the
associated block for a function expression does not automatically
inherit the surrounding scope.

What is needed is a with(this), like:

LzTestManager.assertTrue = function(condition, assertion) {
 with (this) {
   if (!condition)  {
       var errmsg = "FAIL: assertTrue('" + condition + "') failed"
                   + (assertion ? ': ' + assertion : '');
       LzTestManager.failAssertion(errmsg);
   }
 }
}

I could do this when we generate code for function expression blocks.
One concern is that this may be done in a static method or block
(where there is no 'this'). I think we can detect if we're in a static
context, so I'm not too worried about that.  The other approach is
adding with(this) to existing code -- is that out of the question?
I know there are many of these constructions in our source tree,
and I'm guessing it would affect user's code, you all know that better than I.

- Don

--

Don Anderson
Java/C/C++, Berkeley DB, systems consultant

Voice:  617-547-7881
Email:  [EMAIL PROTECTED]
WWW:    http://www.ddanderson.com




--

Don Anderson
Java/C/C++, Berkeley DB, systems consultant

Voice:  617-547-7881
Email:  [EMAIL PROTECTED]
WWW:    http://www.ddanderson.com

Reply via email to