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)`.

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 (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


Reply via email to