Changeset 402:6235a6f4b2ab in livinglogic.java.ul4

Show
Ignore:
Timestamp:
04/07/11 14:55:05 (8 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Tags:
exp-39
Message:

Fixed offsets into the source and the opcodes list for subtemplates.

Now the subtemplates doesn't use substrings/list for the source and the
opcodes, but uses the complete string/list from the parent, and keeps the
starting and ending offsets.

Files:
2 modified

Legend:

Unmodified
Added
Removed
  • docs/versiondoc.txt

    r399 r402  
     1exp-39: 
     2------- 
     3Comments: 
     4* Fixed offsets into the source and the opcodes list for subtemplates. 
     5 
     6 
    17exp-38: 
    28------- 
  • library/src/com/livinglogic/ul4/InterpretedTemplate.java

    r393 r402  
    132132 
    133133    /** 
     134     * Offsets into <code>source</code>, where the real source code starts and ends (used for subtemplates) 
     135     */ 
     136    private int sourceStartIndex; 
     137    private int sourceEndIndex; 
     138    /** 
     139     * Offsets into <code>opcodes</code>, where the real opcodes start and end (used for subtemplates) 
     140     */ 
     141    private int opcodeStartIndex; 
     142    private int opcodeEndIndex; 
     143 
     144    /** 
    134145     * The locale to be used when formatting int, float or date objects. 
    135146     */ 
    136     public Locale defaultLocale; 
     147    private Locale defaultLocale; 
    137148 
    138149    /** 
     
    154165     * Creates an template object for a source string and a list of opcodes. 
    155166     */ 
    156     public InterpretedTemplate(String source, List<Opcode> opcodes, String startdelim, String enddelim, int startindex, int endindex) 
     167    public InterpretedTemplate(String source, List<Opcode> opcodes, String startdelim, String enddelim) 
    157168    { 
    158169        this.source = source; 
    159170        this.startdelim = startdelim; 
    160171        this.enddelim = enddelim; 
    161         this.opcodes = opcodes.subList(startindex, endindex); 
     172        this.opcodes = opcodes; 
     173        this.sourceStartIndex = 0; 
     174        this.sourceEndIndex = source.length(); 
     175        this.opcodeStartIndex = 0; 
     176        this.opcodeEndIndex = opcodes.size(); 
    162177        this.defaultLocale = Locale.ENGLISH; 
    163178    } 
    164179 
    165180    /** 
    166      * Creates an template object for a source string and a list of opcodes. 
    167      */ 
    168     public InterpretedTemplate(String source, List<Opcode> opcodes, String startdelim, String enddelim) 
    169     { 
    170         this.source = source; 
    171         this.startdelim = startdelim; 
    172         this.enddelim = enddelim; 
    173         this.opcodes = opcodes.subList(0, opcodes.size()); 
    174         this.defaultLocale = Locale.GERMANY; 
     181     * Creates an template object as a subtemplate of another template. 
     182     */ 
     183    public InterpretedTemplate(InterpretedTemplate parent, int sourceStartIndex, int sourceEndIndex, int opcodeStartIndex, int opcodeEndIndex) 
     184    { 
     185        this.source = parent.source; 
     186        this.startdelim = parent.startdelim; 
     187        this.enddelim = parent.enddelim; 
     188        this.opcodes = parent.opcodes; 
     189        this.sourceStartIndex = sourceStartIndex; 
     190        this.sourceEndIndex = sourceEndIndex; 
     191        this.opcodeStartIndex = opcodeStartIndex; 
     192        this.opcodeEndIndex = opcodeEndIndex; 
     193        this.defaultLocale = Locale.ENGLISH; 
    175194    } 
    176195 
     
    181200    { 
    182201        opcodes.add(new Opcode(name, -1, -1, -1, -1, -1, null, location)); 
     202        ++opcodeEndIndex; 
    183203    } 
    184204 
     
    189209    { 
    190210        opcodes.add(new Opcode(name, -1, -1, -1, -1, -1, arg, location)); 
     211        ++opcodeEndIndex; 
    191212    } 
    192213 
     
    197218    { 
    198219        opcodes.add(new Opcode(name, r1, -1, -1, -1, -1, null, location)); 
     220        ++opcodeEndIndex; 
    199221    } 
    200222 
     
    205227    { 
    206228        opcodes.add(new Opcode(name, r1, -1, -1, -1, -1, arg, location)); 
     229        ++opcodeEndIndex; 
    207230    } 
    208231 
     
    213236    { 
    214237        opcodes.add(new Opcode(name, r1, r2, -1, -1, -1, null, location)); 
     238        ++opcodeEndIndex; 
    215239    } 
    216240 
     
    221245    { 
    222246        opcodes.add(new Opcode(name, r1, r2, -1, -1, -1, arg, location)); 
     247        ++opcodeEndIndex; 
    223248    } 
    224249 
     
    229254    { 
    230255        opcodes.add(new Opcode(name, r1, r2, r3, -1, -1, null, location)); 
     256        ++opcodeEndIndex; 
    231257    } 
    232258 
     
    237263    { 
    238264        opcodes.add(new Opcode(name, r1, r2, r3, -1, -1, arg, location)); 
     265        ++opcodeEndIndex; 
    239266    } 
    240267 
     
    245272    { 
    246273        opcodes.add(new Opcode(name, r1, r2, r3, r4, -1, null, location)); 
     274        ++opcodeEndIndex; 
    247275    } 
    248276 
     
    253281    { 
    254282        opcodes.add(new Opcode(name, r1, r2, r3, r4, -1, arg, location)); 
     283        ++opcodeEndIndex; 
    255284    } 
    256285 
     
    261290    { 
    262291        opcodes.add(new Opcode(name, r1, r2, r3, r4, r5, null, location)); 
     292        ++opcodeEndIndex; 
    263293    } 
    264294 
     
    269299    { 
    270300        opcodes.add(new Opcode(name, r1, r2, r3, r4, r5, arg, location)); 
     301        ++opcodeEndIndex; 
     302    } 
     303 
     304    /** 
     305     * Appends a new opcode to {@link opcodes}. 
     306     */ 
     307    public void opcode(String name, int r1, int r2, int r3, int r4, int r5, String arg, Location location) 
     308    { 
     309        opcodes.add(new Opcode(name, r1, r2, r3, r4, r5, arg, location)); 
     310        ++opcodeEndIndex; 
    271311    } 
    272312 
     
    438478        readchar(bufferedReader, '\n'); 
    439479        retVal.source = readstr(bufferedReader, "SRC"); 
     480        retVal.sourceEndIndex = retVal.source.length(); 
    440481        readchar(bufferedReader, '\n'); 
    441482        int count = readint(bufferedReader, "n"); 
     
    483524                throw new RuntimeException("Short read!"); 
    484525            } 
    485             retVal.opcodes.add(new Opcode(code, r1, r2, r3, r4, r5, arg, location)); 
     526            retVal.opcode(code, r1, r2, r3, r4, r5, arg, location); 
    486527            readchar(bufferedReader, '\n'); 
    487528        } 
     
    864905         * The current program counter 
    865906         */ 
    866         private int pc = 0; 
     907        private int pc; 
    867908 
    868909        /** 
     
    907948                variables = new HashMap<String, Object>(); 
    908949            this.variables = variables; 
     950            pc = opcodeStartIndex; 
    909951            getNextChunk(); 
    910952        } 
     
    944986                } 
    945987            } 
    946             int opcodecount = opcodes.size(); 
    947             while (pc < opcodecount) 
     988            int lastOpcode = opcodeEndIndex; 
     989            while (pc < lastOpcode) 
    948990            { 
    949991                Opcode code = opcodes.get(pc); 
     
    15631605                            } 
    15641606                        case Opcode.OC_DEF: 
    1565                             variables.put(code.arg, new InterpretedTemplate(source.substring(code.location.endtag, opcodes.get(code.jump).location.starttag), opcodes, startdelim, enddelim, pc+1, code.jump)); 
     1607                            variables.put(code.arg, new InterpretedTemplate(InterpretedTemplate.this, code.location.endtag, opcodes.get(code.jump).location.starttag, pc+1, code.jump)); 
    15661608                            pc = code.jump+1; 
    15671609                            continue;