typename RawAllocator<EntryT, RefT>::HandleType RawAllocator<EntryT, RefT>::alloc(size_t numElems, size_t extraElems) { _store.ensureBufferCapacity(_typeId, numElems + extraElems); uint32_t activeBufferId = _store.getActiveBufferId(_typeId); BufferState &state = _store.getBufferState(activeBufferId); assert(state.isActive()); size_t oldBufferSize = state.size(); EntryT *buffer = _store.getBufferEntry<EntryT>(activeBufferId, oldBufferSize); state.pushed_back(numElems); return HandleType(RefT(oldBufferSize, activeBufferId), buffer); }
HandleType operator*() const { return HandleType(*map_, index_); }
const char *PageDestToStr(PageDestType destType) { #define HandleType(type) if (destType == Dest_ ## type) return #type; #define HandleTypeDialog(type) if (destType == Dest_ ## type ## Dialog) return #type; // common actions HandleType(ScrollTo); HandleType(LaunchURL); HandleType(LaunchEmbedded); HandleType(LaunchFile); // named actions HandleType(NextPage); HandleType(PrevPage); HandleType(FirstPage); HandleType(LastPage); HandleTypeDialog(Find); HandleType(FullScreen); HandleType(GoBack); HandleType(GoForward); HandleTypeDialog(GoToPage); HandleTypeDialog(Print); HandleTypeDialog(SaveAs); HandleTypeDialog(ZoomTo); #undef HandleType #undef HandleTypeDialog CrashIf(destType != Dest_None); return NULL; }
bool ElfInterface::ReadProgramHeaders(const EhdrType& ehdr) { uint64_t offset = ehdr.e_phoff; for (size_t i = 0; i < ehdr.e_phnum; i++, offset += ehdr.e_phentsize) { PhdrType phdr; if (!memory_->ReadField(offset, &phdr, &phdr.p_type, sizeof(phdr.p_type))) { return false; } if (HandleType(offset, phdr.p_type)) { continue; } switch (phdr.p_type) { case PT_LOAD: { // Get the flags first, if this isn't an executable header, ignore it. if (!memory_->ReadField(offset, &phdr, &phdr.p_flags, sizeof(phdr.p_flags))) { return false; } if ((phdr.p_flags & PF_X) == 0) { continue; } if (!memory_->ReadField(offset, &phdr, &phdr.p_vaddr, sizeof(phdr.p_vaddr))) { return false; } if (!memory_->ReadField(offset, &phdr, &phdr.p_offset, sizeof(phdr.p_offset))) { return false; } if (!memory_->ReadField(offset, &phdr, &phdr.p_memsz, sizeof(phdr.p_memsz))) { return false; } pt_loads_[phdr.p_offset] = LoadInfo{phdr.p_offset, phdr.p_vaddr, static_cast<size_t>(phdr.p_memsz)}; if (phdr.p_offset == 0) { load_bias_ = phdr.p_vaddr; } break; } case PT_GNU_EH_FRAME: if (!memory_->ReadField(offset, &phdr, &phdr.p_offset, sizeof(phdr.p_offset))) { return false; } eh_frame_offset_ = phdr.p_offset; if (!memory_->ReadField(offset, &phdr, &phdr.p_memsz, sizeof(phdr.p_memsz))) { return false; } eh_frame_size_ = phdr.p_memsz; break; case PT_DYNAMIC: if (!memory_->ReadField(offset, &phdr, &phdr.p_offset, sizeof(phdr.p_offset))) { return false; } dynamic_offset_ = phdr.p_offset; if (!memory_->ReadField(offset, &phdr, &phdr.p_memsz, sizeof(phdr.p_memsz))) { return false; } dynamic_size_ = phdr.p_memsz; break; } } return true; }