HRESULT CLR_RT_HeapBlock_Array::CreateInstance( CLR_RT_HeapBlock& reference, CLR_UINT32 length, CLR_RT_Assembly* assm, CLR_UINT32 tk )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_RT_HeapBlock         ref;
    CLR_RT_TypeDef_Instance  cls;
    CLR_RT_TypeSpec_Instance def;

    if(cls.ResolveToken( tk, assm ))
    {
        ref.SetReflection( cls );
    }
    else if(def.ResolveToken( tk, assm ))
    {
        TINYCLR_CHECK_HRESULT(ref.SetReflection( def ));
    }
    else
    {
        TINYCLR_SET_AND_LEAVE(CLR_E_WRONG_TYPE);
    }

    ref.ReflectionData().m_levels++;

    TINYCLR_SET_AND_LEAVE(CreateInstance( reference, length, ref.ReflectionData() ));

    TINYCLR_NOCLEANUP();
}
Ejemplo n.º 2
0
HRESULT MethodCompiler::Opcode::Initialize( MethodCompiler* mc, CLR_OFFSET offset, CLR_OFFSET* targets )
{
    TINYCLR_HEADER();

    CLR_PMETADATA ip = mc->m_ipStart + offset;

    //--//

    memset( this, 0, sizeof(*this) );

    m_op        = CLR_ReadNextOpcodeCompressed( ip );
    m_ol        = &c_CLR_RT_OpcodeLookup[ m_op ];

    m_ipOffset  = offset;

    m_stackPop  = m_ol->StackPop ();
    m_stackPush = m_ol->StackPush();

    m_token     = CLR_EmptyToken;
    m_value.SetDataId( CLR_RT_HEAPBLOCK_RAW_ID(DATATYPE_FIRST_INVALID, 0, 1) );

    //--//

    switch(m_ol->m_opParam)
    {
    case CLR_OpcodeParam_Field:
        {
            FETCH_ARG_COMPRESSED_FIELDTOKEN(arg,ip);

            m_token = arg;
        }
        break;

    case CLR_OpcodeParam_Method:
        {
            FETCH_ARG_COMPRESSED_METHODTOKEN(arg,ip);

            m_token = arg;
        }
        break;

    case CLR_OpcodeParam_Type:
        {
            FETCH_ARG_COMPRESSED_TYPETOKEN(arg,ip);

            m_token = arg;
        }
        break;

    case CLR_OpcodeParam_String:
        {
            FETCH_ARG_COMPRESSED_STRINGTOKEN(arg,ip);

            m_token = arg;
        }
        break;

    case CLR_OpcodeParam_Tok:
        {
            FETCH_ARG_TOKEN(arg,ip);

            m_token = arg;
        }
        break;

    case CLR_OpcodeParam_Sig:
        TINYCLR_SET_AND_LEAVE(CLR_E_JITTER_OPCODE_UNSUPPORTED);

    case CLR_OpcodeParam_BrTarget:
        {
            FETCH_ARG_INT16(arg,ip);

            m_numTargets = 1;

            if(targets)
            {
                *targets++ = (CLR_OFFSET)(ip - mc->m_ipStart + arg);
            }
        }
        break;

    case CLR_OpcodeParam_ShortBrTarget:
        {
            FETCH_ARG_INT8(arg,ip);

            m_numTargets = 1;

            if(targets)
            {
                *targets++ = (CLR_OFFSET)(ip - mc->m_ipStart + arg);
            }
        }
        break;

    case CLR_OpcodeParam_I:
        {
            FETCH_ARG_INT32(arg,ip);

            m_value.SetInteger( arg );
        }
        break;

    case CLR_OpcodeParam_I8:
        {
            FETCH_ARG_INT64(arg,ip);

            m_value.SetInteger( arg );
        }
        break;

    case CLR_OpcodeParam_None:
        if(m_ol->m_flags & CLR_RT_OpcodeLookup::ATTRIB_HAS_INDEX)
        {
            m_value.SetInteger( (CLR_UINT32)m_ol->m_index );
        }

        if(m_ol->m_flags & CLR_RT_OpcodeLookup::ATTRIB_HAS_I4)
        {
            m_value.SetInteger( (CLR_INT32)m_ol->m_index );
        }
        break;

    case CLR_OpcodeParam_R:
        {
            FETCH_ARG_UINT64(arg,ip);

            m_value.SetDoubleFromBits( arg );
        }
        break;

    case CLR_OpcodeParam_Switch:
        {
            FETCH_ARG_UINT8(arg,ip);

            m_numTargets = arg;

            CLR_UINT32 base = (CLR_UINT32)(ip - mc->m_ipStart + arg * sizeof(CLR_INT16));

            while(arg--)
            {
                CLR_INT32 offset; TINYCLR_READ_UNALIGNED_INT16( offset, ip );

                if(targets)
                {
                    *targets++ = (CLR_OFFSET)(base + offset);
                }
            }
        }
        break;

    case CLR_OpcodeParam_Var:
        {
            FETCH_ARG_UINT16(arg,ip);

            m_value.SetInteger( (CLR_UINT32)m_ol->m_index );
        }
        break;

    case CLR_OpcodeParam_ShortI:
        {
            FETCH_ARG_INT8(arg,ip);

            m_value.SetInteger( (CLR_INT32)arg );
        }
        break;

    case CLR_OpcodeParam_ShortR:
        {
            FETCH_ARG_UINT32(arg,ip);

            m_value.SetFloatFromBits( arg );
        }
        break;

    case CLR_OpcodeParam_ShortVar:
        {
            FETCH_ARG_UINT8(arg,ip);

            m_value.SetInteger( (CLR_UINT32)arg );
        }
        break;
    }

    if(m_token != CLR_EmptyToken)
    {
        CLR_RT_Assembly* assm = mc->m_mdInst.m_assm;

        switch(CLR_TypeFromTk( m_token ))
        {
        case TBL_TypeRef:
        case TBL_TypeDef:
            {
                if(m_tdInst.ResolveToken( m_token, assm ) == false)
                {
                    TINYCLR_SET_AND_LEAVE(CLR_E_JITTER_OPCODE_INVALID_TOKEN__TYPE);
                }
            }
            break;

        case TBL_MethodRef:
        case TBL_MethodDef:
            {
                if(m_mdInst.ResolveToken( m_token, assm ) == false)
                {
                    TINYCLR_SET_AND_LEAVE(CLR_E_JITTER_OPCODE_INVALID_TOKEN__METHOD);
                }

                if(m_ol->m_flowCtrl == CLR_FlowControl_CALL)
                {
                    m_stackPop += m_mdInst.m_target->numArgs;

                    if(m_ol->m_logicalOpcode == LO_NewObject)
                    {
                        m_stackPop -= 1;
                    }

                    if(m_mdInst.m_target->retVal != DATATYPE_VOID)
                    {
                        m_stackPush += 1;
                    }
                }
            }
            break;

        case TBL_FieldRef:
        case TBL_FieldDef:
            {
                if(m_fdInst.ResolveToken( m_token, assm ) == false)
                {
                    TINYCLR_SET_AND_LEAVE(CLR_E_JITTER_OPCODE_INVALID_TOKEN__FIELD);
                }
            }
            break;

        case TBL_TypeSpec:
            {
                CLR_RT_TypeSpec_Instance sig;
                CLR_RT_TypeDescriptor    desc;

                if(sig.ResolveToken( m_token, assm ) == false)
                {
                    TINYCLR_SET_AND_LEAVE(CLR_E_JITTER_OPCODE_INVALID_TOKEN__TYPE);
                }

                TINYCLR_CHECK_HRESULT(desc.InitializeFromTypeSpec( sig ));

                m_tdInst.InitializeFromIndex( desc.m_reflex.m_data.m_type );
                m_tdInstLevels =              desc.m_reflex.m_levels;
            }
            break;

        case TBL_Strings:
            break;

        default:
            TINYCLR_SET_AND_LEAVE(CLR_E_JITTER_OPCODE_INVALID_SIGNATURE);
        }
    }

    m_ipLength  = (CLR_OFFSET)(ip - mc->m_ipStart - m_ipOffset);

    TINYCLR_NOCLEANUP();
}