Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
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;
}