[Laszlo-dev] [Laszlo-checkins] r14763 - in openlaszlo/trunk: WEB-INF/lps/lfc WEB-INF/lps/lfc/compiler WEB-INF/lps/lfc/debugger WEB-INF/lps/server/src/org/openlaszlo/sc test
Max Carlson
max at openlaszlo.org
Fri Sep 18 21:26:42 PDT 2009
FYI, I see this warning when compiling swf8 debug as of r14763:
Warning: Assignment to free variable $reportedError in
compiler/LzBootstrapDebugService.lzs (561)
ptw at openlaszlo.org wrote:
> Author: ptw
> Date: 2009-09-16 12:13:37 -0700 (Wed, 16 Sep 2009)
> New Revision: 14763
>
> Added:
> openlaszlo/trunk/test/lpp-8222.lzx
> Modified:
> openlaszlo/trunk/WEB-INF/lps/lfc/build.xml
> openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzBootstrapDebugService.lzs
> openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzDebugStub.lzs
> openlaszlo/trunk/WEB-INF/lps/lfc/debugger/LzDebug.lzs
> openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
> openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
> Log:
> Change 20090915-ptw-g by ptw at repo-man.home on 2009-09-15 13:50:47 EDT
> in /Users/ptw/OpenLaszlo/trunk-2
> for http://svn.openlaszlo.org/openlaszlo/trunk
>
> Summary: Improve debugging of runtime errors
>
> Bugs Fixed: LPP-8222 "User errors" don't work if catcherrors is turned on
>
> Technical Reviewer: a.bargull at intensis.de (pending)
> QA Reviewer: henry (Message-ID: <8c61fad60909161137o72fcd980gf1f717844991d3e2 at mail.gmail.com>),
> circlecycle at gmail.com (Message-ID: <4AB06957.6010400 at gmail.com>
> )
>
> Release Notes:
>
> The debugger will now, by default, intercept runtime errors
> (instances of Error that are thrown by the runtime or program) and
> report them, to minimize the need to use the platform debuggers
> for DHTML and swf9 (or later) when debugging LZX programs.
>
> These reports can be silenced by throwing values that are not
> instances of Error (the best choice if you are using try/catch for
> control flow, not for error situations), or by adding: #pragma
> "throwsError=true" to the function or method contaning the throw.
>
> The reporting feature is independent of the lps.properties setting
> compiler.catcherrors (which can be used to ignore runtime errors
> in production code), however the #pragma will also prevent
> compiler.catcherrors from interfering with the throw of an Error
> object.
>
> [This feature is not implemented in swf8, because uncaught errors
> are always ignored in that runtime.]
>
> Details:
> test/lpp-8222: test throwing of a non-error, throwing an
> uncaught error, throwing a caught error, and throwing a caught
> error using the #pragma. The test is self-documenting and adapts
> to the settings of debug and catcherrors.
>
> LzDebug: Document the reporting of errors by the debugger and how
> to silence the reports.
>
> build.xml: Build swf10 first, since it has the strictest
> compiler, so you don't waste time building other runtimes that
> will only be broken.
>
> LzDebugStub, LzBootstrapDebugService: Add a handler for reporting
> errors (and eliminating multiple reports). Remove the old
> top-level error handler, which is no longer needed.
>
> JavascriptGenerator: Based on compiler.catcherrors, #pragma
> "throwsError", and debug, construct an appropriate catch block
> that records, reports, and re-throws or not.
>
> Tests:
> test/lpp-8222 X debug=true/false X compiler.catcherrors=true/false
> X lzr=dhtml/swf9.
>
>
>
> Modified: openlaszlo/trunk/WEB-INF/lps/lfc/build.xml
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/lfc/build.xml 2009-09-16 13:34:27 UTC (rev 14762)
> +++ openlaszlo/trunk/WEB-INF/lps/lfc/build.xml 2009-09-16 19:13:37 UTC (rev 14763)
> @@ -161,42 +161,12 @@
> var LFCdir = lfc.getProperty("LFCdir") + '/';
>
> importPackage(java.io);
> - // build the dhtml lfc if we're supposed to
> - if (lfc.getProperty("build.lfc.runtime.dhtml")) {
> - var plain = LFCdir + "LFCdhtml.js";
> - if (!(new File(plain)).exists()) {
> - dobuild(plain, "dhtml", "");
> - }
> - if (buildDebug) {
> - var dest = LFCdir + "LFCdhtml-debug.js";
> - if (!(new File(dest)).exists()) {
> - // TODO: [2006-06-07 ptw] (LPP-2034) When the LFC is 'clean' of
> - // warnings, the options can be changed to simply --debug
> - dobuild(dest,
> - "dhtml",
> - "--option nameFunctions --option disableTrackLines --option warnGlobalAssignments '-D$debug=true'");
> - }
> - var dest = LFCdir + "LFCdhtml-backtrace.js";
> - if (!(new File(dest)).exists()) {
> - // TODO: [2006-06-07 ptw] (LPP-2034) When the LFC is 'clean' of
> - // warnings, the options can be changed to simply -g3
> - dobuild(dest,
> - "dhtml",
> - "--option debugBacktrace --option nameFunctions --option disableTrackLines --option warnGlobalAssignments '-D$debug=true'");
> - }
> - }
> - if (buildProfile) {
> - var profile = LFCdir + "LFCdhtml-profile.js";
> - if (!(new File(profile)).exists()) {
> - dobuild(profile, "dhtml", "--profile");
> - }
> - }
> - }
>
> - var swfruntimes = [7, 8, 9, 10];
> + var swfruntimes = [ 10, 9, 8 ];
>
> - for (var s in swfruntimes) {
> - var v = swfruntimes[s];
> + // Build the strictest first, so we fail early
> + for (var i = 0, l = swfruntimes.length; i < l; i++) {
> + var v = swfruntimes[i];
>
> var ext = (v >= 9) ? ".swc" : ".lzl";
> var shlibopt = "--option buildSharedLibrary=true ";
> @@ -241,6 +211,39 @@
> }
> }
> }
> +
> +
> + // build the dhtml lfc if we're supposed to
> + if (lfc.getProperty("build.lfc.runtime.dhtml")) {
> + var plain = LFCdir + "LFCdhtml.js";
> + if (!(new File(plain)).exists()) {
> + dobuild(plain, "dhtml", "");
> + }
> + if (buildDebug) {
> + var dest = LFCdir + "LFCdhtml-debug.js";
> + if (!(new File(dest)).exists()) {
> + // TODO: [2006-06-07 ptw] (LPP-2034) When the LFC is 'clean' of
> + // warnings, the options can be changed to simply --debug
> + dobuild(dest,
> + "dhtml",
> + "--option nameFunctions --option disableTrackLines --option warnGlobalAssignments '-D$debug=true'");
> + }
> + var dest = LFCdir + "LFCdhtml-backtrace.js";
> + if (!(new File(dest)).exists()) {
> + // TODO: [2006-06-07 ptw] (LPP-2034) When the LFC is 'clean' of
> + // warnings, the options can be changed to simply -g3
> + dobuild(dest,
> + "dhtml",
> + "--option debugBacktrace --option nameFunctions --option disableTrackLines --option warnGlobalAssignments '-D$debug=true'");
> + }
> + }
> + if (buildProfile) {
> + var profile = LFCdir + "LFCdhtml-profile.js";
> + if (!(new File(profile)).exists()) {
> + dobuild(profile, "dhtml", "--profile");
> + }
> + }
> + }
> ]]> </script>
> <ant dir="${schema.dir}" target="lfc.schema" />
>
>
> Modified: openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzBootstrapDebugService.lzs
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzBootstrapDebugService.lzs 2009-09-16 13:34:27 UTC (rev 14762)
> +++ openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzBootstrapDebugService.lzs 2009-09-16 19:13:37 UTC (rev 14763)
> @@ -553,6 +553,17 @@
> // debugger bugs reported.
>
> /** @access private */
> +var $reportedError = null;
> +
> +/** @access private */
> +function $reportException (fileName, lineNumber, e) {
> + if (e !== $reportedError) {
> + $reportedError = e;
> + $reportSourceWarning(fileName, lineNumber, e.name + ": " + e.message, true);
> + }
> +}
> +
> +/** @access private */
> function $reportUndefinedObjectProperty (filename, lineNumber, propertyName) {
> #pragma "warnUndefinedReferences=false"
> if (! arguments.callee._dbg_recursive_call) {
> @@ -631,27 +642,3 @@
> $reportUndefinedMethod._dbg_recursive_call = false;
>
>
> -if ($js1) {
> - /**
> - * We can't use evalCarefully everywhere, so we also install a default
> - * error handler
> - */
> - if (typeof window.addEventListener == 'function') {
> - // The DOM 1 interface is more useful than the DOM 2 interface
> - window.onerror = function (errorString, fileName, lineNo) {
> -#pragma "warnUndefinedReferences=false"
> - if (Debug.uncaughtBacktraceStack) {
> - // If backtracing has caught our stack info, use that rather
> - // than browser info
> - errorString = new String(errorString);
> - errorString.$lzsc$b = Debug.uncaughtBacktraceStack;
> - Debug.uncaughtBacktraceStack = null;
> - fileName = null;
> - lineNo = null;
> - }
> - $reportSourceWarning(fileName, lineNo, errorString, true);
> - // pass through to browser debugger
> - return false;
> - }
> - }
> -}
>
> Modified: openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzDebugStub.lzs
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzDebugStub.lzs 2009-09-16 13:34:27 UTC (rev 14762)
> +++ openlaszlo/trunk/WEB-INF/lps/lfc/compiler/LzDebugStub.lzs 2009-09-16 19:13:37 UTC (rev 14763)
> @@ -44,6 +44,13 @@
> }
>
> /**
> + * Avoid reporting the same exception when re-thrown
> + *
> + * @access private
> + */
> + static var reportedError = null;
> +
> + /**
> * Report an exception to the debug window
> *
> * @param String fileName: The source file
> @@ -53,7 +60,10 @@
> * @access private
> */
> static function reportException (fileName, lineNumber, e) {
> - $reportSourceWarning(fileName, lineNumber, e.name + ": " + e.message, true);
> + if (e !== reportedError) {
> + reportedError = e;
> + $reportSourceWarning(fileName, lineNumber, e.name + ": " + e.message, true);
> + }
> }
> };
> } else {
>
> Modified: openlaszlo/trunk/WEB-INF/lps/lfc/debugger/LzDebug.lzs
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/lfc/debugger/LzDebug.lzs 2009-09-16 13:34:27 UTC (rev 14762)
> +++ openlaszlo/trunk/WEB-INF/lps/lfc/debugger/LzDebug.lzs 2009-09-16 19:13:37 UTC (rev 14763)
> @@ -86,6 +86,13 @@
> * </canvas>]]>
> * </programlisting></example>
> *
> + * By default, the debugger will intercept runtime errors (instances
> + * of Error that are thrown by the runtime or program) and report
> + * them. These reports can be silenced by throwing values that are
> + * not instances of Error, or by adding <code>#pragma
> + * "throwsErrors=true"</code> to the function or method containing the
> + * throw.
> + *
> * <p>The optional <xref linkend="lz.debug"/> tag controls the appearance of
> * the debugger console window when debugging is on.</p>
> *
>
> Modified: openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java 2009-09-16 13:34:27 UTC (rev 14762)
> +++ openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java 2009-09-16 19:13:37 UTC (rev 14763)
> @@ -503,11 +503,12 @@
> public static String SWF9_APPLICATION_PREAMBLE = "SWF9applicationPreamble";
> public static String SWF9_APP_CLASSNAME = "SWF9MainClassName";
> public static String SWF9_WRAPPER_CLASSNAME = "SWF9WrapperClassName";
> - public static String SWF9_LFC_CLASSNAME = "SWF9LFCClassName";
> + public static String SWF9_LFC_CLASSNAME = "SWF9LFCClassName";
> public static String SWF9_LOADABLE_LIB = "SWF9LoadableLib";
> public static String SWF9_USE_RUNTIME_SHARED_LIB = "SWF9RuntimeSharedLib";
> public static String SWF8_LOADABLE_LIB = "SWF8LoadableLib";
> public static String TRACK_LINES = "trackLines";
> + public static String THROWS_ERROR = "throwsError";
> public static String VALIDATE_CACHES = "validateCaches";
> public static String WARN_UNDEFINED_REFERENCES = "warnUndefinedReferences";
> public static String WARN_GLOBAL_ASSIGNMENTS = "warnGlobalAssignments";
>
> Modified: openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
> ===================================================================
> --- openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java 2009-09-16 13:34:27 UTC (rev 14762)
> +++ openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java 2009-09-16 19:13:37 UTC (rev 14763)
> @@ -1248,11 +1248,21 @@
> // put the function end before other annotations
> suffix.add(0, (meterFunctionEvent(node, "returns", meterFunctionName)));
> }
> - // If backtrace or catch-exceptions is on, we create an error
> + // If debug or compiler.catcherrors is on, we create an error
> // handler to catch the error and return a type-safe null value
> // (to emulate the behavior of as2).
> - boolean catchExceptions = (options.getBoolean(Compiler.DEBUG_BACKTRACE) ||
> - options.getBoolean(Compiler.CATCH_FUNCTION_EXCEPTIONS));
> + // Non-errors will simply be re-thrown by the catch logic.
> + boolean catchExceptions = options.getBoolean(Compiler.CATCH_FUNCTION_EXCEPTIONS);
> + // NOTE: [2009-09-14 ptw] `#pragma "throwsError=true"` can be used
> + // to selectively disable the catching of errors when it is
> + // intentional on the part of the user program, but better
> + // practice would be for user programs to use non-Error object as
> + // the value to be thrown.
> + boolean throwExceptions = options.getBoolean(Compiler.THROWS_ERROR);
> + // If debugging is on and the user has not explicitly declared
> + // their intention to throw an error, report Errors
> + boolean debugExceptions = (options.getBoolean(Compiler.DEBUG) ||
> + options.getBoolean(Compiler.DEBUG_SWF9));
> // Analyze local variables (and functions)
> VariableAnalyzer analyzer =
> new VariableAnalyzer(params,
> @@ -1268,21 +1278,38 @@
> catchExceptions = analyzer.dereferenced;
> }
> String tryType = "";
> - if (catchExceptions) {
> - // If debugging is on, we report the caught error
> - if (options.getBoolean(Compiler.DEBUG) || options.getBoolean(Compiler.DEBUG_SWF9)) {
> - // TODO: [2009-03-20 dda] In DHTML, having trouble successfully defining
> - // the $lzsc$runtime class, so we'll report the warning more directly.
> - if (this instanceof SWF9Generator) {
> - error.add(parseFragment("$lzsc$runtime.reportException(" +
> - ScriptCompiler.quote(filename) + ", " +
> - lineno + ", $lzsc$e);"));
> - } else {
> - error.add(parseFragment("$reportSourceWarning(" +
> - ScriptCompiler.quote(filename) + ", " +
> - lineno + ", $lzsc$e.name + \": \" + $lzsc$e.message, true);"));
> + if (catchExceptions || throwExceptions || debugExceptions) {
> + String fragment = "";
> + fragment += "if ($lzsc$e is Error) {";
> + if (throwExceptions) {
> + fragment += " lz.$lzsc$thrownError = $lzsc$e";
> + } else {
> + // Don't process errors declared to be thrown
> + fragment += " if (lz['$lzsc$thrownError'] === $lzsc$e) { throw $lzsc$e; }";
> + if (debugExceptions) {
> + // TODO: [2009-03-20 dda] In DHTML, having trouble
> + // successfully defining the $lzsc$runtime class, so we'll
> + // report the warning more directly.
> + if (this instanceof SWF9Generator) {
> + fragment += " $lzsc$runtime.reportException(";
> + } else {
> + fragment += " $reportException(";
> + }
> + fragment += ScriptCompiler.quote(filename) + ", " + lineno + ", $lzsc$e);";
> }
> }
> + // Only neuter Errors if catcherrors is on
> + if (! catchExceptions) {
> + fragment += "}" +
> + "throw $lzsc$e;";
> + } else {
> + fragment +=
> + "} else {" +
> + " throw $lzsc$e;" +
> + "}";
> + }
> + error.add(parseFragment(fragment));
> +
> // Currently we only do this for the back-end that enforces types
> if (this instanceof SWF9Generator) {
> // In either case, we return a type-safe null value that is as
>
> Added: openlaszlo/trunk/test/lpp-8222.lzx
>
>
> Property changes on: openlaszlo/trunk/test/lpp-8222.lzx
> ___________________________________________________________________
> Name: svn:mime-type
> + text/plain
> Name: svn:eol-style
> + native
>
>
> _______________________________________________
> Laszlo-checkins mailing list
> Laszlo-checkins at openlaszlo.org
> http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins
--
Regards,
Max Carlson
OpenLaszlo.org
More information about the Laszlo-dev
mailing list