I guess I'm actually not understanding the problem you are trying to solve with 
copying the label set in CodeGenerator.  Can you explain further?

On 2010-08-09, at 15:12, P T Withington wrote:

> Question:
> 
> At CodeGenerator#780, you are making a new context, but sharing the parent 
> labelSet.  It seems when when you exit that context, you will leave the (now 
> no longer in scope) label in the parent label set.  That doesn't seem right 
> to me.
> 
> On 2010-08-06, at 12:20, André Bargull wrote:
> 
>> Change 20100806-bargull-8dg by barg...@bargull02 on 2010-08-06 14:49:37
>> in /home/anba/src/svn/openlaszlo/trunk
>> for http://svn.openlaszlo.org/openlaszlo/trunk
>> 
>> Summary: fix break and continue bugs in sc.CodeGenerator
>> 
>> Bugs Fixed: LPP-8340 (cannot use 'continue' in 'switch' block), LPP-8493 
>> (do/while loop and continue in flash runtimes)
>> 
>> Technical Reviewer: ptw
>> QA Reviewer: henry
>> 
>> Details:
>> The CodeGenerator used only the context-variable to detect contiguous 
>> statements for the label set (cf. ECMAScript 3rd edt., chapter 12 
>> Statements).
>> This doesn't work because that way you cannot differentiate between "LBL: { 
>> while (1) {} }" and "LBL: while (1) {}". For both code snippets, the same 
>> context tree is generated. I didn't want to introduce more contexts to 
>> detect this case, because context is also used for other purposes.
>> Therefore label sets are now handled this way:
>> - TranslationContext gets a labelSet object, initially the labelSet is null
>> - when visiting a labelled statement a new context is created, this context 
>> initializes labelSet to a new HashSet, except if the parent statement is 
>> also a labelled statement, in that case the labelSet is shared among both 
>> contexts
>> - when visiting an iteration or switch statement a new context is created, 
>> if the statement is enclosed by a labelled statement, the labelSet is shared 
>> among both contexts
>> - and TranslationContext#findLabeledContext() respects now the ECMAScript 
>> semantics where break and continue statements may appear
>> 
>> Also changed visitDoWhileStatement() to use different labels for continue 
>> and the loop-start, so executing a continue statement still tests the loop 
>> condition.
>> 
>> 
>> Tests:
>> smokecheck in all runtimes
>> 
>> Files:
>> A test/smoke/ecmaContinueBreak.lzl
>> M test/smoke/smokecheck.lzx
>> M WEB-INF/lps/server/src/org/openlaszlo/sc/TranslationContext.java
>> M WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
>> 
>> Changeset: 
>> http://svn.openlaszlo.org/openlaszlo/patches/20100806-bargull-8dg.tar
>> 
> 


Reply via email to