bool xxx::ByteBuffer::Read( T*& v ) { bool b; if( !Read( b ) ) return false; if( b ) { uint _offset, _offset_bak = (uint)offset; if( !VarRead( _offset ) ) return false; if( _offset == _offset_bak ) { assert( !v ); // todo: obj pool support ? v = new T(); if( !Read( *v ) ) { delete v; v = nullptr; return false; } idxStore->Insert( _offset, v ); // todo: check } else { v = (T*)idxStore->At( _offset ); } } else { v = nullptr; } return true; }
PINSTR CCodeList_Maker::Code_general(int type, HLType t) { // 只有type == enum_RR时,返回值才有用 if (t == i_Unknown) { t=i_Unknown; } PINSTR p = new INSTR; //new_INSTR p->type = t; switch (type) { case enum_00: InstrAddTail(p); return p; case enum_RR: { TransVar(&p->var_r1, 0); // 0 means xcpu.op[0] TransVar(&p->var_r2, 1); // 1 means xcpu.op[1] VarRead(p->va_r1); VarRead(p->va_r2); } InstrAddTail(p); return p; case enum_WR: { TransVar(&p->var_w, 0); // 0 means xcpu.op[0] TransVar(&p->var_r1, 1); // 1 means xcpu.op[1] if (t == i_Lea) { p->type = i_Assign; if (p->var_r1.type != v_Tem) { // 比如象 lea eax,[ebp] p->type = i_GetAddr; } } else { VarRead(p->va_r1); //VarWrite(&p->var_w); if (p->var_w.type == v_Tem) { WriteToAddress(p); return NULL; // 因为这里没人会用这个返回值 } } } InstrAddTail(p); return p; case enum_AR: { VAR v; TransVar(&v, 0); // 0 means xcpu.op[0] TransVar(&p->var_r2, 1); // 1 means xcpu.op[1] p->var_r1 = v; p->var_w = v; VarRead(p->va_r2); VarRead(p->va_r1); //VarWrite(&p->var_w); if (p->var_w.type == v_Tem) { WriteToAddress(p); return NULL; // 因为这里没人会用这个返回值 } } InstrAddTail(p); return p; default: alert("why here 325426"); return NULL; } //return NULL; }