void DWENTRY DWBeginStruct( dw_client cli, dw_handle struct_hdl, dw_size_t size, const char * name, dw_addr_offset start_scope, uint flags ) { abbrev_code abbrev; dw_st kind; start_scope = start_scope; SetHandleLocation( cli, struct_hdl ); kind = GetExtra( cli, struct_hdl )->structure.kind; abbrev = 0; switch( kind ){ case DW_ST_CLASS: abbrev = AB_CLASS_TYPE; break; case DW_ST_STRUCT: abbrev = AB_STRUCT_TYPE; break; case DW_ST_UNION: abbrev = AB_UNION_TYPE; break; } DestroyExtra( cli, struct_hdl ); abbrev |= AB_SIBLING | AB_START_REF; emitCommonTypeInfo( cli, abbrev , name, flags ); /* AT_byte_size */ InfoULEB128( cli, size ); EndDIE( cli ); StartChildren( cli ); }
VMFrame *VMFrameStack::PopFrame() { if (Blocks == NULL) { return NULL; } VMFrame *frame = Blocks->LastFrame; if (frame == NULL) { return NULL; } auto Func = static_cast<VMScriptFunction *>(frame->Func); if (Func->SpecialInits.Size()) { Func->DestroyExtra(frame->GetExtra()); } // Free any string registers this frame had. FString *regs = frame->GetRegS(); for (int i = frame->NumRegS; i != 0; --i) { (regs++)->~FString(); } VMFrame *parent = frame->ParentFrame; if (parent == NULL) { // Popping the last frame off the stack. if (Blocks != NULL) { assert(Blocks->NextBlock == NULL); Blocks->LastFrame = NULL; Blocks->InitFreeSpace(); } return NULL; } if ((VM_UBYTE *)parent < (VM_UBYTE *)Blocks || (VM_UBYTE *)parent >= (VM_UBYTE *)Blocks + Blocks->BlockSize) { // Parent frame is in a different block, so move this one to the unused list. BlockHeader *next = Blocks->NextBlock; assert(next != NULL); assert((VM_UBYTE *)parent >= (VM_UBYTE *)next && (VM_UBYTE *)parent < (VM_UBYTE *)next + next->BlockSize); Blocks->NextBlock = UnusedBlocks; UnusedBlocks = Blocks; Blocks = next; } else { Blocks->LastFrame = parent; Blocks->FreeSpace = (VM_UBYTE *)frame; } return parent; }