HRESULT CLR_RT_HeapBlock_Array::ClearElements( int index, int length )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    const CLR_RT_ReflectionDef_Index& reflex = ReflectionDataConst();
    CLR_UINT8*                        data   = GetElement( index );

    CLR_RT_Memory::ZeroFill( data, length * m_sizeOfElement );

    if(m_fReference)
    {
        CLR_DataType      dt        = (CLR_DataType)m_typeOfElement;
        bool              fAllocate = (reflex.m_levels == 1 && dt == DATATYPE_VALUETYPE);
        CLR_RT_HeapBlock* ptr       = (CLR_RT_HeapBlock*)data;

        switch(dt)
        {
        case DATATYPE_VALUETYPE:
        case DATATYPE_CLASS:
        case DATATYPE_WEAKCLASS:
            dt = DATATYPE_OBJECT;
            break;
        }

        while(length > 0)
        {
            ptr->SetDataId( CLR_RT_HEAPBLOCK_RAW_ID(dt,0,1) );

            if(fAllocate)
            {
                TINYCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex( *ptr, reflex.m_data.m_type ));
            }

            ptr++; length--;
        }
    }

    TINYCLR_NOCLEANUP();
}