BinStr* BinStrToUnicode(BinStr* pSource, bool Swap) { if(pSource) { pSource->appendInt8(0); BinStr* tmp = new BinStr(); char* pb = (char*)(pSource->ptr()); int l=pSource->length(), L = sizeof(WCHAR)*l; if(tmp) { WCHAR* wz = (WCHAR*)(tmp->getBuff(L)); if(wz) { memset(wz,0,L); WszMultiByteToWideChar(g_uCodePage,0,pb,-1,wz,l); tmp->remove(L-(DWORD)wcslen(wz)*sizeof(WCHAR)); #if BIGENDIAN if (Swap) SwapStringLength(wz, (DWORD)wcslen(wz)); #endif delete pSource; } else { delete tmp; tmp = NULL; fprintf(stderr,"\nOut of memory!\n"); } } else fprintf(stderr,"\nOut of memory!\n"); return tmp; } return NULL; }
void AsmMan::EmitDebuggableAttribute(mdToken tkOwner) { mdToken tkCA; Assembler* pAsm = (Assembler*)m_pAssembler; mdToken tkTypeSpec, tkMscorlib, tkParamType; BinStr *pbsSig = new BinStr(); BinStr* bsBytes = new BinStr();; char* szName; tkMscorlib = pAsm->m_fIsMscorlib ? 1 : pAsm->GetAsmRef("mscorlib"); tkTypeSpec = pAsm->ResolveClassRef(tkMscorlib,"System.Diagnostics.DebuggableAttribute",NULL); EmitAssemblyRefs(); // just in case we gained 'mscorlib' AsmRef in GetAsmRef above BOOL fOldStyle = FALSE; if(tkMscorlib == 1) fOldStyle = (m_pAssembly->usVerMajor == 1); else { AsmManAssembly *pAssembly = GetAsmRefByName("mscorlib"); _ASSERTE(pAssembly != NULL); PREFIX_ASSUME(pAssembly != NULL); fOldStyle = (pAssembly->usVerMajor == 1); } bsBytes->appendInt8(1); bsBytes->appendInt8(0); if(fOldStyle) { pbsSig->appendInt8(IMAGE_CEE_CS_CALLCONV_HASTHIS); corEmitInt(pbsSig,2); pbsSig->appendInt8(ELEMENT_TYPE_VOID); pbsSig->appendInt8(ELEMENT_TYPE_BOOLEAN); pbsSig->appendInt8(ELEMENT_TYPE_BOOLEAN); //New to old: 0x101->(true,true),0x03->(true,false),0x103->(true,true)+warning bsBytes->appendInt8(1); bsBytes->appendInt8((pAsm->m_dwIncludeDebugInfo==0x03 ? 0 : 1)); if(pAsm->m_dwIncludeDebugInfo == 0x103) { report->warn("\nOption /DEBUG=IMPL is invalid for legacy DebuggableAttribute, /DEBUG used.\n" ); } } else { BinStr bsSigArg; char buffer[80]; sprintf_s(buffer,80, "%s%c%s", "System.Diagnostics.DebuggableAttribute", NESTING_SEP, "DebuggingModes" ); tkParamType = pAsm->ResolveClassRef(tkMscorlib,buffer, NULL); bsSigArg.appendInt8(ELEMENT_TYPE_VALUETYPE); unsigned cnt = CorSigCompressToken(tkParamType, bsSigArg.getBuff(5)); bsSigArg.remove(5 - cnt); pbsSig->appendInt8(IMAGE_CEE_CS_CALLCONV_HASTHIS); corEmitInt(pbsSig,1); pbsSig->appendInt8(ELEMENT_TYPE_VOID); pbsSig->append(&bsSigArg); bsBytes->appendInt32(pAsm->m_dwIncludeDebugInfo); } bsBytes->appendInt8(0); bsBytes->appendInt8(0); szName = new char[16]; strcpy_s(szName,16,".ctor"); tkCA = pAsm->MakeMemberRef(tkTypeSpec,szName,pbsSig); pAsm->DefineCV(new CustomDescr(tkOwner,tkCA,bsBytes)); }