The internal flash player function avmplus::describeMetadata() [1] iterates over arrays/objects with a for-each loop. So inserting an `undefined` property to the Object or Array prototype will cause an exception. That means we need to guard all invocations of describeType() in the code. Maybe we should also report this to Adobe, but otoh fudging with Object./Array.prototype is never a good idea and possibly they'll just respond with the advice to make the properties not-enumerable by calling Object#setPropertyIsEnumerable().

Here's a simple test case if anyone is interested in it:
---
function() :void {
  Array.prototype.a = void 0;
  try {
    var description:XML = describeType({});
  } finally {
    delete Array.prototype.a;
  }
})()
---


[1] http://code.google.com/p/redshell/source/browse/core/DescribeType.as

On 12/1/2010 4:09 AM, P T Withington wrote:
Oh blast. Is something in the debugger iterating over an Array using for-in 
when it should only be iterating over indices?

On Nov 30, 2010, at 18:28, André Bargull<[email protected]>  wrote:

Does the code alter built-in prototypes like Object.prototype or Array.prototype? For 
example try to evaluate the following function in the debugger, it will also trigger the 
TypeError "#1010".

(function(){ Array.prototype.a=void 0; try { Debug.inspect({}); } finally { 
delete Array.prototype.a; } })()


On 11/30/2010 11:01 PM, P T Withington wrote:
Hey, I just noticed that the backtrace has a slot named 'undefined' too, and it 
has an undefined value.

I wonder if it is something about the app that has made the debugger decide 
that every object has a slot named 'undefined'?

LzError is not a dynamic class, so it will give an error if you try to access a 
slot that does not exist, whereas LzBacktrace is dynamic, so a reference to a 
non-existent slot will just return `undefined` [which we print `(void 0)`].

On 2010-11-30, at 15:52, Henry Minsky wrote:

That is an improvement, the backtrace from the error is
clickable/inspectable now.

But do you have any idea what that "undefined: Error.." means when I inspect
the LzError object ?

lzx>   Debug.inspect(«LzError(128)| @../../foundation/restricted/D…»)
«LzError(128)#3| @../../foundation/restricted/DefinitionLoader.lzx#137:
TypeError: Error #1010: A term is undefined and has no …» {
  backtrace: «Backtrace(26)| loadRegistryFile<- getDefinitionNode<-
getDefinition<- handle oninit<- sendEvent<- __LZcallInit<- __LZc…»
  file: '../../foundation/restricted/DefinitionLoader.lzx'
  length: 128
  line: 137
  message: 'TypeError: Error #1010: A term is undefined and has no
properties.'
  undefined: Error: ReferenceError: Error #… computing description
}
«LzError(128)#3| @../../foundation/restricted/DefinitionLoader.lzx#137:
TypeError: Error #1010: A term is undefined and has no properties.»
lzx>   Debug.inspect(«Backtrace(26)| loadRegistryFile<- getDefini…»)
«Backtrace(26)#5| loadRegistryFile<- getDefinitionNode<- getDefinition<-
handle oninit<- sendEvent<- __LZcallInit<- __LZc…» {
  length: 26
  undefined: (void 0)
  0: sendEvent @lfc/events/LaszloEvents.lzs#627
  1: checkQ @lfc/services/LzInstantiator.lzs#250
  2: makeSomeViews @lfc/services/LzInstantiator.lzs#314
  3: __LZinstantiationDone @lfc/views/LaszloCanvas.lzs#732
  4: __LZcallInit @lfc/views/LaszloCanvas.lzs#801
  5: sendEvent @lfc/events/LaszloEvents.lzs#627
  6: handle oninit @ManagementCenter.lzx#256
  7: startApp @ManagementCenter.lzx#145
  8: $lzc$class_wcfMainWorkbench @#34
  9: $lzc$class_basecomponent @#446
  10: LzView @lfc/views/LaszloView.lzs#51
  11: LzNode @lfc/core/LzNode.lzs#351
  12: createChildren @lfc/core/LzNode.lzs#1440
  13: createImmediate @lfc/services/LzInstantiator.lzs#336
  14: makeSomeViews @lfc/services/LzInstantiator.lzs#314
  15: __LZinstantiationDone @lfc/views/LaszloView.lzs#555
  16: __LZinstantiationDone @lfc/core/LzNode.lzs#1084
  17: __LZcallInit @lfc/core/LzNode.lzs#1135
  18: __LZcallInit @lfc/core/LzNode.lzs#1135
  19: __LZcallInit @lfc/core/LzNode.lzs#1135
  20: __LZcallInit @lfc/core/LzNode.lzs#1160
  21: sendEvent @lfc/events/LaszloEvents.lzs#627
  22: handle oninit @ApplicationMenu.lzx#195
  23: getDefinition @../../foundation/restricted/DefinitionLoader.lzx#266
  24: getDefinitionNode
@../../foundation/restricted/DefinitionLoader.lzx#234
  25: loadRegistryFile @../../foundation/restricted/DefinitionLoader.lzx#137

}
«Backtrace(26)#5| loadRegistryFile<- getDefinitionNode<- getDefinition<-
handle oninit<- sendEvent<- __LZcallInit<- __LZcallInit<- __LZcal…»
lzx>

On Tue, Nov 30, 2010 at 3:18 PM, P T Withington<[email protected]>   wrote:

Change ptw-20101130-MEn by [email protected] on 2010-11-30 14:08:04 EST
   in /Users/ptw/OpenLaszlo/trunk-3
   for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: Be more careful in Debug.inspect

Bugs Fixed: LPP-9553 Inspecting a Backtrace in SWF10 gets error when
printing to debug console

Technical Reviewer: [email protected] (pending)
QA Reviewer: [email protected] (pending)

Overview:

   Move the slot-dereference from inspectInternal to
   computeSlotDescription (which is already guarded).

Tests:

   Henry will test against the gigantic test case he has that is to
   large to fit in the margins of this note.

Files:
M       WEB-INF/lps/lfc/debugger/LzDebug.lzs

Changeset:
http://svn.openlaszlo.org/openlaszlo/patches/ptw-20101130-MEn.tar



--
Henry Minsky
Software Architect
[email protected]



Reply via email to