Changeset 414:3984ca7e86af in livinglogic.java.ul4

Show
Ignore:
Timestamp:
07/22/11 13:17:55 (8 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Tags:
exp-42
Message:

Fixed location handling bugs with subtemplates. Create sub templates in annotate().

Files:
5 modified

Legend:

Unmodified
Added
Removed
  • pom.xml

    r412 r414  
    44    <groupId>com.livinglogic</groupId> 
    55    <artifactId>ul4</artifactId> 
    6     <version>0.42</version> 
     6    <version>0.43</version> 
    77    <name>UL4</name> 
    88    <build> 
  • src/main/java/com/livinglogic/ul4/InterpretedTemplate.java

    r412 r414  
    129129 
    130130    /** 
    131      * The template source. 
     131     * The template source (of the top-level template, i.e. subtemplates always get the full source). 
    132132     */ 
    133133    public String source; 
     
    202202        this.opcodeEndIndex = opcodeEndIndex; 
    203203        this.defaultLocale = Locale.ENGLISH; 
     204        // The subtemplate must always be annotated, because if it isn't it would 
     205        // annotate all opcodes/locations even those of the parent and would 
     206        // store its name in the parents location. As subtemplates are created 
     207        // during the annotate() call of the parent, we can savely set our own 
     208        // annotate flag to true to prevent reannotation. 
     209        this.annotated = true; 
    204210    } 
    205211 
     
    793799        int jump = defStart; 
    794800        int size = opcodes.size(); 
    795         String defName = opcodes.get(defStart).arg; 
     801        Opcode defOpcode = opcodes.get(defStart); 
     802        String defName = defOpcode.arg; 
    796803        for (int i = defStart+1; i < size; ++i) 
    797804        { 
    798805            Opcode opcode = opcodes.get(i); 
    799             opcode.location.fixName(opcode.name == Opcode.OC_ENDDEF ? name : defName); 
     806            opcode.location.fixName(opcode.name != Opcode.OC_ENDDEF ? defName : name); 
    800807            switch (opcode.name) 
    801808            { 
    802809                case Opcode.OC_IF: 
    803                     i = annotateIf(i, forDepth, defName); 
     810                    i = annotateIf(i, 0, defName); 
    804811                    break; 
    805812                case Opcode.OC_FOR: 
    806                     i = annotateFor(i, forDepth, defName); 
     813                    i = annotateFor(i, 0, defName); 
    807814                    break; 
    808815                case Opcode.OC_DEF: 
    809                     i = annotateDef(i, forDepth, defName); 
     816                    i = annotateDef(i, 0, defName); 
    810817                    break; 
    811818                case Opcode.OC_ELSE: 
     
    820827                    throw new BlockException("endfor in def"); 
    821828                case Opcode.OC_ENDDEF: 
    822                     opcodes.get(defStart).jump = i; 
     829                    defOpcode.jump = i; 
     830                    defOpcode.template = new InterpretedTemplate( 
     831                        this, 
     832                        defOpcode.arg, 
     833                        defOpcode.location.endtag, // end of the <?def?> tag 
     834                        opcode.location.starttag, // start of the <?end def?> tag 
     835                        defStart+1, // first opcode after the def 
     836                        i // the enddef opcode, i.e. one after the <?def?> content 
     837                    ); 
    823838                    return i; 
    824839            } 
     
    10241039                catch (Exception ex) 
    10251040                { 
    1026                     throw new LocationException(ex, opcodes.get(pc).location); 
     1041                    Opcode code = opcodes.get(pc-1); 
     1042                    throw new LocationException(ex, code, pc-1); 
    10271043                } 
    10281044            } 
     
    16461662                            } 
    16471663                        case Opcode.OC_DEF: 
    1648                             variables.put(code.arg, new InterpretedTemplate(InterpretedTemplate.this, code.arg, code.location.endtag, opcodes.get(code.jump).location.starttag, pc+1, code.jump)); 
     1664                            variables.put(code.arg, code.template); 
    16491665                            pc = code.jump+1; 
    16501666                            continue; 
     
    16581674                catch (Exception ex) 
    16591675                { 
    1660                     throw new LocationException(ex, code.location); 
     1676                    throw new LocationException(ex, code, pc); 
    16611677                } 
    16621678                ++pc; 
     
    20272043        int indent = 1; 
    20282044 
    2029         buffer.append("def " + name + " {\n"); 
     2045        buffer.append("def " + name + "(**vars) {\n"); 
    20302046        int size = opcodes.size(); 
    20312047        for (int i = 0; i < size; ++i) 
  • src/main/java/com/livinglogic/ul4/LocationException.java

    r412 r414  
    44{ 
    55    protected Location location; 
     6    protected Opcode opcode; 
     7    protected int opcodeIndex; 
    68 
    79    public LocationException(Throwable cause, Location location) 
     
    911        super(cause); 
    1012        this.location = location; 
     13        this.opcode = null; 
     14        this.opcodeIndex = -1; 
     15    } 
     16 
     17    public LocationException(Throwable cause, Opcode opcode, int opcodeIndex) 
     18    { 
     19        super(cause); 
     20        this.location = opcode.location; 
     21        this.opcode = opcode; 
     22        this.opcodeIndex = opcodeIndex; 
    1123    } 
    1224 
    1325    public String toString() 
    1426    { 
    15         return "com.livinglogic.ul4.LocationException: in " + location; 
     27        String msg = "com.livinglogic.ul4.LocationException: in " + opcode.location; 
     28        if (opcode != null) 
     29            msg += " opcode #" + opcodeIndex + ": " + opcode; 
     30        return msg; 
    1631    } 
    1732} 
  • src/main/java/com/livinglogic/ul4/Opcode.java

    r406 r414  
    195195    public int argcode; 
    196196    public Location location; 
    197     public int jump; 
     197    public int jump; // store the index of the "corresponding" opcode, e.g. the "endfor" opcode for a "for" opcode (set by InterpretedTemplate.annotate()) 
     198    public InterpretedTemplate template; // if the opcode if a "def" opcode, store the subtemplate here (set by InterpretedTemplate.annotate()) 
    198199 
    199200    public static int name2code(String name) 
     
    796797        this.location = location; 
    797798        this.jump = -1; 
     799        this.template = null; 
    798800    } 
    799801 
  • src/main/resources/versiondoc.txt

    r412 r414  
     1exp-43: 
     2------- 
     3Comments: 
     4* Fixed location handling bugs with subtemplates. 
     5* Sub templates are now created by annotate(). 
     6 
     7 
    18exp-42: 
    29-------