1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

String.ToConstNativeW

This commit is contained in:
Brian Fiete 2022-02-13 06:53:14 -05:00
parent 6c714bacdc
commit b341b6d3b4
3 changed files with 16 additions and 2 deletions

View file

@ -7,6 +7,7 @@ using System.Collections;
using System.Diagnostics; using System.Diagnostics;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Interop;
using System; using System;
namespace System namespace System
@ -2450,6 +2451,16 @@ namespace System
buf buf
} }
[Comptime(ConstEval=true)]
public Span<c_wchar> ToConstNativeW()
{
int encodedLen = UTF16.GetEncodedLen(this);
var buf = new char16[encodedLen + 1]* ( ? );
UTF16.Encode(this, buf, encodedLen);
buf[encodedLen] = 0;
return .(buf, encodedLen + 1);
}
public static bool Equals(char8* str1, char8* str2) public static bool Equals(char8* str1, char8* str2)
{ {
for (int i = 0; true; i++) for (int i = 0; true; i++)

View file

@ -2636,6 +2636,8 @@ bool BfMethodMatcher::CheckType(BfTypeInstance* typeInstance, BfTypedValue targe
if (isResolvingVarField) if (isResolvingVarField)
{ {
BF_ASSERT(mModule->mBfIRBuilder->mIgnoreWrites);
// Don't even consider - we can't do method calls on ourselves when we are resolving var fields, because // Don't even consider - we can't do method calls on ourselves when we are resolving var fields, because
// we are not allowed to generate methods when our field types are unknown. We may fix this in the future, // we are not allowed to generate methods when our field types are unknown. We may fix this in the future,
// but currently it breaks out expected order of operations. One issue is that our call signatures change // but currently it breaks out expected order of operations. One issue is that our call signatures change

View file

@ -4195,8 +4195,9 @@ BfTypedValue CeContext::Call(BfAstNode* targetSrc, BfModule* module, BfMethodIns
SetAndRestoreValue<BfTypeDef*> prevCallerActiveTypeDef(mCallerActiveTypeDef, module->GetActiveTypeDef()); SetAndRestoreValue<BfTypeDef*> prevCallerActiveTypeDef(mCallerActiveTypeDef, module->GetActiveTypeDef());
SetAndRestoreValue<BfType*> prevExpectingType(mCurExpectingType, expectingType); SetAndRestoreValue<BfType*> prevExpectingType(mCurExpectingType, expectingType);
SetAndRestoreValue<bool> prevCtxResolvingVar(module->mContext->mResolvingVarField, false);
SetAndRestoreValue<BfMethodInstance*> moduleCurMethodInstance(module->mCurMethodInstance, methodInstance); SetAndRestoreValue<BfMethodInstance*> moduleCurMethodInstance(module->mCurMethodInstance, methodInstance);
SetAndRestoreValue<BfTypeInstance*> moduleCurTypeInstance(module->mCurTypeInstance, methodInstance->GetOwner()); SetAndRestoreValue<BfTypeInstance*> moduleCurTypeInstance(module->mCurTypeInstance, methodInstance->GetOwner());
SetAndRestoreValue<int> prevCurExecuteId(mCurModule->mCompiler->mCurCEExecuteId, mCeMachine->mExecuteId); SetAndRestoreValue<int> prevCurExecuteId(mCurModule->mCompiler->mCurCEExecuteId, mCeMachine->mExecuteId);
@ -4561,7 +4562,7 @@ BfTypedValue CeContext::Call(BfAstNode* targetSrc, BfModule* module, BfMethodIns
else if ((retInstAddr != 0) || (allocThisInstAddr != 0)) else if ((retInstAddr != 0) || (allocThisInstAddr != 0))
{ {
auto* retPtr = memStart + retInstAddr; auto* retPtr = memStart + retInstAddr;
if (allocThisInstAddr != 0) if ((allocThisInstAddr != 0) && (methodInstance->mMethodDef->mMethodType == BfMethodType_Ctor))
{ {
retPtr = memStart + allocThisAddr; retPtr = memStart + allocThisAddr;
returnType = thisType; returnType = thisType;