HRESULT Library_corlib_native_System_Reflection_Assembly::GetVersion___VOID__BYREF_I4__BYREF_I4__BYREF_I4__BYREF_I4( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_StackFrame* caller = stack.Caller(); if(caller == NULL) { TINYCLR_SET_AND_LEAVE(S_OK); } else { CLR_RT_Assembly_Instance assm; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), assm )); const CLR_RECORD_VERSION& version = assm.m_assm->m_header->version; // we do not check for the reference not to be NULL because this is an internal method stack.Arg1().Dereference()->NumericByRef().s4 = version.iMajorVersion; stack.Arg2().Dereference()->NumericByRef().s4 = version.iMinorVersion; stack.Arg3().Dereference()->NumericByRef().s4 = version.iBuildNumber; stack.Arg4().Dereference()->NumericByRef().s4 = version.iRevisionNumber; } TINYCLR_NOCLEANUP(); }
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_corlib_native_System_Reflection_Assembly::get_FullName___STRING( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); //The defines for maxFULLNAME and parameters for snprintf are currently not validated. CLR_RT_Assembly_Instance instance; CLR_RT_Assembly* assm; char buffer[ TINYCLR_MAX_ASSEMBLY_NAME * 2 ]; const CLR_RECORD_ASSEMBLY* header ; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), instance )); assm = instance.m_assm; header = assm->m_header; if(hal_strlen_s(assm->m_szName) > TINYCLR_MAX_ASSEMBLY_NAME) { TINYCLR_SET_AND_LEAVE(CLR_E_INVALID_PARAMETER); } hal_snprintf( buffer, TINYCLR_MAX_ASSEMBLY_NAME * 2, "%s, Version=%d.%d.%d.%d", assm->m_szName, header->version.iMajorVersion, header->version.iMinorVersion, header->version.iBuildNumber, header->version.iRevisionNumber ); stack.SetResult_String( buffer ); TINYCLR_NOCLEANUP(); #undef MAXFULLNAME }
HRESULT Library_corlib_native_System_Reflection_Assembly::GetManifestResourceNames___SZARRAY_STRING( 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_RT_HeapBlock& result = stack.PushValue(); TINYCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance( result, pAssm->m_pTablesSize[ TBL_ResourcesFiles ], g_CLR_RT_WellKnownTypes.m_String )); { CLR_RT_HeapBlock* pArray = (CLR_RT_HeapBlock*)result.Array()->GetFirstElement(); for(int idxResourceFile = 0; idxResourceFile < pAssm->m_pTablesSize[ TBL_ResourcesFiles ]; idxResourceFile++) { const CLR_RECORD_RESOURCE_FILE* resourceFile = pAssm->GetResourceFile( idxResourceFile ); TINYCLR_CHECK_HRESULT(CLR_RT_HeapBlock_String::CreateInstance( *pArray, pAssm->GetString( resourceFile->name ) )); pArray++; } } } TINYCLR_NOCLEANUP(); }
HRESULT Library_corlib_native_System_Reflection_Assembly::GetType___SystemType__STRING( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_Assembly_Instance assm; CLR_RT_TypeDef_Index td; CLR_RT_HeapBlock* hbRef; CLR_RT_HeapBlock* hbObj; LPCSTR szClass = stack.Arg1().RecoverString(); CLR_RT_HeapBlock* hbAsm = stack.Arg0().Dereference(); FAULT_ON_NULL(szClass); FAULT_ON_NULL(hbAsm); TINYCLR_CHECK_HRESULT(GetTypeDescriptor( *hbAsm, assm )); hbRef = &stack.PushValueAndClear(); if(g_CLR_RT_TypeSystem.FindTypeDef( szClass, assm.m_assm, td )) { TINYCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex(*hbRef, g_CLR_RT_WellKnownTypes.m_TypeStatic)); hbObj = hbRef->Dereference(); hbObj->SetReflection( td ); } TINYCLR_NOCLEANUP(); }
HRESULT Library_corlib_native_System_RuntimeType::GetInterfaces___SZARRAY_SystemType( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_TypeDef_Instance td; CLR_RT_HeapBlock& top = stack.PushValueAndClear(); CLR_RT_HeapBlock* ptr; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), td )); // // Scan the list of interfaces. // CLR_RT_SignatureParser parser; parser.Initialize_Interfaces( td.m_assm, td.m_target ); CLR_RT_SignatureParser::Element res; TINYCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance( top, parser.Available(), g_CLR_RT_WellKnownTypes.m_Type )); ptr = (CLR_RT_HeapBlock*)top.DereferenceArray()->GetFirstElement(); while(parser.Available() > 0) { TINYCLR_CHECK_HRESULT(parser.Advance( res )); ptr->SetReflection( res.m_cls ); ptr++; } TINYCLR_NOCLEANUP(); }
static void IO(Reader& reader, Value& value) { WString id, text; reader << id << text; if (id == L"") { value = Value(); } else { auto type = GetTypeDescriptor(id); if (type == GetTypeDescriptor<ITypeDescriptor>()) { type = GetTypeDescriptor(text); CHECK_ERROR(type, L"Failed to load type."); value = Value::From(type); } else { type->GetValueSerializer()->Parse(text, value); } } }
HRESULT Library_corlib_native_System_RuntimeType::GetTypeDescriptor( CLR_RT_HeapBlock& arg, CLR_RT_TypeDef_Instance& inst ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_UINT32 levels; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( arg, inst, &levels )); if(levels > 0) { inst.InitializeFromIndex( g_CLR_RT_WellKnownTypes.m_Array ); } TINYCLR_NOCLEANUP(); }
HRESULT Library_corlib_native_System_RuntimeType::get_Assembly___SystemReflectionAssembly( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_TypeDef_Instance td; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), td, NULL )); { CLR_RT_Assembly_Index idx; idx.Set( td.Assembly() ); CLR_RT_HeapBlock& top = stack.PushValue(); top.SetReflection( idx ); } TINYCLR_NOCLEANUP(); }
HRESULT Library_corlib_native_System_Reflection_Assembly::GetType___SystemType__STRING( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_Assembly_Instance assm; CLR_RT_TypeDef_Index td; CLR_RT_HeapBlock& top = stack.PushValueAndClear(); LPCSTR szClass = stack.Arg1().RecoverString(); FAULT_ON_NULL(szClass); TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), assm )); if(g_CLR_RT_TypeSystem.FindTypeDef( szClass, assm.m_assm, td )) { top.SetReflection( td ); } TINYCLR_NOCLEANUP(); }
HRESULT Library_corlib_native_System_RuntimeType::get_BaseType___SystemType( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_TypeDef_Instance td; CLR_UINT32 levels; CLR_RT_HeapBlock& top = stack.PushValueAndClear(); TINYCLR_CHECK_HRESULT(GetTypeDescriptor( stack.Arg0(), td, &levels )); if(levels > 0) { top.SetReflection( g_CLR_RT_WellKnownTypes.m_Array ); } else if(td.SwitchToParent()) { top.SetReflection( td ); } TINYCLR_NOCLEANUP(); }
HRESULT Library_corlib_native_System_RuntimeType::GetName( CLR_RT_HeapBlock& arg, bool fFullName, CLR_RT_HeapBlock& res ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); CLR_RT_TypeDef_Instance td; CLR_UINT32 levels; char rgBuffer[ 256 ]; LPSTR szBuffer; size_t iBuffer; TINYCLR_CHECK_HRESULT(GetTypeDescriptor( arg, td, &levels )); szBuffer = rgBuffer; iBuffer = MAXSTRLEN(rgBuffer); TINYCLR_CHECK_HRESULT(g_CLR_RT_TypeSystem.BuildTypeName( td, szBuffer, iBuffer, fFullName ? CLR_RT_TypeSystem::TYPENAME_FLAGS_FULL : 0, levels )); TINYCLR_SET_AND_LEAVE(CLR_RT_HeapBlock_String::CreateInstance( res, rgBuffer )); TINYCLR_NOCLEANUP(); }