undeclared variables getting through in Strict Compilation mode
J. Landman Gay
jacque at hyperactivesw.com
Tue Feb 17 07:14:55 CET 2015
On 2/16/2015 7:48 PM, Dr. Hawkins wrote:
> It used to be
> on prePreOpenStack
> local prefsDir, prefsFilNam, newPrefsDb, prTabNams
> local dcmd, theData, vtb
> put "SELECT pref, pval FROM prefs" into dcmd
> put revDataFromQuery(tab,vtb,prefsDb,dcmd) into prAry
> split prAry by vtb and tab
> It threw no error loading prAry, and it turned into the correct array.
> Single step into the calling handler, and prAry and the global prAry was
This is correct behavior, at least when explicit variables is off (if
it's on, you shouldn't be able to compile at all.) An undeclared
variable will be automatically created and will be local to that
> Strict compilation was set in the preferences; I checked. I can't use
> explicit variables without a significant code rewrite, as "long name"
> produces a result that is incompatible with, well, livecode.
I can't imagine why the long name would cause any trouble, but that's a
different problem. Anyway, "strict compilation" is the same thing as
explicit variables. Preferences just gives it a different, presumably
more descriptive, name.
The issue here seems to be that you had explicit variables turned on but
you didn't get a warning about the undeclared global variable.
> I added "global prAry" after the local declarations, and everything worked
Right. A global declared inside a handler can only be accessed within
that handler. If you want to see and use it in other handlers, you need
to declare it in each one where it's used. That's why when you stepped
out of the handler it seemed to disappear. If you had checked "the
globals" it should have been there, but you wouldn't see it in the
variable watcher because it isn't available to that particular handler
without a declaration.
The alternative is to declare it once outside of all handlers, where it
will be available to all of them below the declaration.
So, if I understand right, you had explicit variables turned on but you
didn't get a flag about the undeclared global. Instead, the editor acted
as though explicit variables was off and automatically created a local
variable. It may have something to do with the contortions the engine
goes through to prevent conflicts with libraries that don't declare
variables. (Richard G. discussed that a few days ago.) Basically it
needs to turn off explicit variables, compile, and then reset it again
to your preference setting.
Without that, people who don't use explicit variables couldn't employ
any libraries written by people who do.
Jacqueline Landman Gay | jacque at hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
More information about the use-livecode