| Index: courgette/encoded_program.cc
 | 
| ===================================================================
 | 
| --- courgette/encoded_program.cc	(revision 21002)
 | 
| +++ courgette/encoded_program.cc	(working copy)
 | 
| @@ -30,20 +30,6 @@
 | 
|  
 | 
|  const int kStreamLimit = 9;
 | 
|  
 | 
| -// Binary assembly language operations.
 | 
| -enum EncodedProgram::OP {
 | 
| -  ORIGIN,    // ORIGIN <rva> - set address for subsequent assembly.
 | 
| -  COPY,      // COPY <count> <bytes> - copy bytes to output.
 | 
| -  COPY1,     // COPY1 <byte> - same as COPY 1 <byte>.
 | 
| -  REL32,     // REL32 <index> - emit rel32 encoded reference to address at
 | 
| -             // address table offset <index>
 | 
| -  ABS32,     // ABS32 <index> - emit abs32 encoded reference to address at
 | 
| -             // address table offset <index>
 | 
| -  MAKE_BASE_RELOCATION_TABLE,  // Emit base relocation table blocks.
 | 
| -  OP_LAST
 | 
| -};
 | 
| -
 | 
| -
 | 
|  // Constructor is here rather than in the header.  Although the constructor
 | 
|  // appears to do nothing it is fact quite large because of the implict calls to
 | 
|  // field constructors.  Ditto for the destructor.
 | 
| @@ -499,32 +485,38 @@
 | 
|  // RelocBlock has the layout of a block of relocations in the base relocation
 | 
|  // table file format.
 | 
|  //
 | 
| -class RelocBlock {
 | 
| - public:
 | 
| +struct RelocBlockPOD {
 | 
|    uint32 page_rva;
 | 
|    uint32 block_size;
 | 
|    uint16 relocs[4096];  // Allow up to one relocation per byte of a 4k page.
 | 
| +};
 | 
|  
 | 
| -  RelocBlock() : page_rva(~0), block_size(8) {}
 | 
| +COMPILE_ASSERT(offsetof(RelocBlockPOD, relocs) == 8, reloc_block_header_size);
 | 
|  
 | 
| +class RelocBlock {
 | 
| + public:
 | 
| +  RelocBlock() {
 | 
| +    pod.page_rva = ~0;
 | 
| +    pod.block_size = 8;
 | 
| +  }
 | 
| +
 | 
|    void Add(uint16 item) {
 | 
| -    relocs[(block_size-8)/2] = item;
 | 
| -    block_size += 2;
 | 
| +    pod.relocs[(pod.block_size-8)/2] = item;
 | 
| +    pod.block_size += 2;
 | 
|    }
 | 
|  
 | 
|    void Flush(SinkStream* buffer) {
 | 
| -    if (block_size != 8) {
 | 
| -      if (block_size % 4 != 0) {  // Pad to make size multiple of 4 bytes.
 | 
| +    if (pod.block_size != 8) {
 | 
| +      if (pod.block_size % 4 != 0) {  // Pad to make size multiple of 4 bytes.
 | 
|          Add(0);
 | 
|        }
 | 
| -      buffer->Write(this, block_size);
 | 
| -      block_size = 8;
 | 
| +      buffer->Write(&pod, pod.block_size);
 | 
| +      pod.block_size = 8;
 | 
|      }
 | 
|    }
 | 
| +  RelocBlockPOD pod;
 | 
|  };
 | 
|  
 | 
| -COMPILE_ASSERT(offsetof(RelocBlock, relocs) == 8, reloc_block_header_size);
 | 
| -
 | 
|  void EncodedProgram::GenerateBaseRelocations(SinkStream* buffer) {
 | 
|    std::sort(abs32_relocs_.begin(), abs32_relocs_.end());
 | 
|  
 | 
| @@ -533,9 +525,9 @@
 | 
|    for (size_t i = 0;  i < abs32_relocs_.size();  ++i) {
 | 
|      uint32 rva = abs32_relocs_[i];
 | 
|      uint32 page_rva = rva & ~0xFFF;
 | 
| -    if (page_rva != block.page_rva) {
 | 
| +    if (page_rva != block.pod.page_rva) {
 | 
|        block.Flush(buffer);
 | 
| -      block.page_rva = page_rva;
 | 
| +      block.pod.page_rva = page_rva;
 | 
|      }
 | 
|      block.Add(0x3000 | (rva & 0xFFF));
 | 
|    }
 | 
| 
 | 
| Property changes on: courgette/encoded_program.cc
 | 
| ___________________________________________________________________
 | 
| Name: svn:eol-style
 | 
|    + LF
 | 
| 
 | 
| 
 |