HRESULT Library_corlib_native_System_Reflection_Assembly::GetTypes___SZARRAY_SystemType( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_Assembly_Instance assm; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), assm )); { CLR_RT_Assembly* pASSM = assm.m_assm; CLR_UINT32 num = pASSM->m_pTablesSize[ TBL_TypeDef ]; CLR_RT_HeapBlock& top = stack.PushValue(); TINYCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance( top, num, g_CLR_RT_WellKnownTypes.m_Type )); if(num) { CLR_RT_HeapBlock* pArray = (CLR_RT_HeapBlock*)top.DereferenceArray()->GetFirstElement(); for(CLR_UINT32 i=0; i<num; i++, pArray++) { CLR_RT_TypeDef_Index idx; idx.Set( pASSM->m_idx, i ); pArray->SetReflection( idx ); } } } TINYCLR_NOCLEANUP(); }
HRESULT Library_spot_native_Microsoft_SPOT_Reflection::GetTypesImplementingInterface___STATIC__SZARRAY_mscorlibSystemType__mscorlibSystemType( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_HeapBlock& top = stack.PushValueAndClear(); int tot = 0; CLR_RT_HeapBlock* pArray = NULL; CLR_RT_TypeDef_Instance tdMatch; CLR_RT_HeapBlock* hbType = stack.Arg0().Dereference(); TINYCLR_CHECK_HRESULT(Library_corlib_native_System_RuntimeType::GetTypeDescriptor( *hbType, tdMatch )); if((tdMatch.m_target->flags & CLR_RECORD_TYPEDEF::TD_Semantics_Mask) != CLR_RECORD_TYPEDEF::TD_Semantics_Interface) { TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_PARAMETER); } for(int pass=0; pass<2; pass++) { int count = 0; TINYCLR_FOREACH_ASSEMBLY_IN_CURRENT_APPDOMAIN(g_CLR_RT_TypeSystem) { const CLR_RECORD_TYPEDEF* td = pASSM->GetTypeDef( 0 ); int tblSize = pASSM->m_pTablesSize[ TBL_TypeDef ]; for(int i=0; i<tblSize; i++, td++) { if(td->flags & CLR_RECORD_TYPEDEF::TD_Abstract) continue; CLR_RT_TypeDef_Index idx; idx.Set( pASSM->m_idx, i ); if(CLR_RT_ExecutionEngine::IsInstanceOf( idx, tdMatch )) { if(pass == 0) { tot++; } else { CLR_RT_HeapBlock* hbObj; TINYCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex(pArray[count], g_CLR_RT_WellKnownTypes.m_TypeStatic)); hbObj = pArray[count].Dereference(); hbObj->SetReflection( idx ); } count++; } } } TINYCLR_FOREACH_ASSEMBLY_IN_CURRENT_APPDOMAIN_END(); if(pass == 0) { if(tot == 0) break; TINYCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance( top, tot, g_CLR_RT_WellKnownTypes.m_TypeStatic )); CLR_RT_HeapBlock_Array* array = top.DereferenceArray(); pArray = (CLR_RT_HeapBlock*)array->GetFirstElement(); } } TINYCLR_NOCLEANUP(); }
HRESULT CLR_RT_StackFrame::HandleSynchronized( bool fAcquire, bool fGlobal ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_HeapBlock refType; CLR_RT_HeapBlock* obj; CLR_RT_HeapBlock ref; CLR_RT_HeapBlock** ppGlobalLock; CLR_RT_HeapBlock* pGlobalLock; if(fGlobal) { obj = &ref; #if defined(TINYCLR_APPDOMAINS) //With AppDomains enabled, the global lock is no longer global. It is only global wrt the AppDomain/ //Do we need a GlobalGlobalLock? (an attribute on GloballySynchronized (GlobalAcrossAppDomain?) ppGlobalLock = &g_CLR_RT_ExecutionEngine.GetCurrentAppDomain()->m_globalLock; #else ppGlobalLock = &g_CLR_RT_ExecutionEngine.m_globalLock; #endif pGlobalLock = *ppGlobalLock; if(pGlobalLock) { obj->SetObjectReference( pGlobalLock ); } else { // // Create an private object to implement global locks. // TINYCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex( *obj, g_CLR_RT_WellKnownTypes.m_Object )); *ppGlobalLock = obj->Dereference(); } } else if(m_call.m_target->flags & CLR_RECORD_METHODDEF::MD_Static) { CLR_RT_TypeDef_Index idx; idx.Set( m_call.Assembly(), m_call.CrossReference().GetOwner() ); refType.SetReflection( idx ); obj = &refType; } else { obj = &Arg0(); } if(fAcquire) { TINYCLR_SET_AND_LEAVE(g_CLR_RT_ExecutionEngine.LockObject( *obj, m_owningSubThread, TIMEOUT_INFINITE, false )); } else { TINYCLR_SET_AND_LEAVE(g_CLR_RT_ExecutionEngine.UnlockObject( *obj, m_owningSubThread )); } TINYCLR_NOCLEANUP(); }