Skip to content

Commit 8f3eb00

Browse files
authored
Several fixes with DateTime and TimeSpan (#3117)
***NO_CI***
1 parent a923903 commit 8f3eb00

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

src/CLR/CorLib/corlib_native.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ struct Library_corlib_native_System_TimeSpan
467467

468468
//--//
469469

470+
static CLR_INT64 *NewObject(CLR_RT_StackFrame &stack);
470471
static CLR_INT64 *GetValuePtr(CLR_RT_StackFrame &stack);
471472
static CLR_INT64 *GetValuePtr(CLR_RT_HeapBlock &ref);
472473

@@ -495,6 +496,7 @@ struct Library_corlib_native_System_DateTime
495496

496497
//--//
497498

499+
static CLR_INT64 *NewObject(CLR_RT_StackFrame &stack);
498500
static CLR_INT64 *GetValuePtr(CLR_RT_StackFrame &stack);
499501
static CLR_INT64 *GetValuePtr(CLR_RT_HeapBlock &ref);
500502

src/CLR/CorLib/corlib_native_System_DateTime.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,17 @@ HRESULT Library_corlib_native_System_DateTime::GetTodayAsTicks___STATIC__I8(CLR_
176176

177177
//--//
178178

179+
CLR_INT64 *Library_corlib_native_System_DateTime::NewObject(CLR_RT_StackFrame &stack)
180+
{
181+
NATIVE_PROFILE_CLR_CORE();
182+
CLR_RT_HeapBlock &ref = stack.PushValue();
183+
184+
ref.SetDataId(CLR_RT_HEAPBLOCK_RAW_ID(DATATYPE_DATETIME, 0, 1));
185+
ref.ClearData();
186+
187+
return (CLR_INT64 *)&ref.NumericByRef().s8;
188+
}
189+
179190
CLR_INT64 *Library_corlib_native_System_DateTime::GetValuePtr(CLR_RT_StackFrame &stack)
180191
{
181192
NATIVE_PROFILE_CLR_CORE();
@@ -191,8 +202,12 @@ CLR_INT64 *Library_corlib_native_System_DateTime::GetValuePtr(CLR_RT_HeapBlock &
191202
if (dt == DATATYPE_OBJECT || dt == DATATYPE_BYREF)
192203
{
193204
obj = obj->Dereference();
205+
194206
if (!obj)
207+
{
195208
return NULL;
209+
}
210+
196211
dt = obj->DataType();
197212
}
198213

@@ -201,8 +216,12 @@ CLR_INT64 *Library_corlib_native_System_DateTime::GetValuePtr(CLR_RT_HeapBlock &
201216
if (dt == DATATYPE_OBJECT)
202217
{
203218
obj = obj->Dereference();
219+
204220
if (!obj)
221+
{
205222
return NULL;
223+
}
224+
206225
dt = obj->DataType();
207226
}
208227

src/CLR/CorLib/corlib_native_System_TimeSpan.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ HRESULT Library_corlib_native_System_TimeSpan::CompareTo___I4__OBJECT(CLR_RT_Sta
126126
NATIVE_PROFILE_CLR_CORE();
127127
NANOCLR_HEADER();
128128

129-
CLR_RT_HeapBlock *pRight = stack.Arg1().Dereference();
129+
CLR_RT_HeapBlock const *pRight = stack.Arg1().Dereference();
130130

131131
if (pRight)
132132
{
@@ -144,10 +144,10 @@ HRESULT Library_corlib_native_System_TimeSpan::Compare___STATIC__I4__SystemTimeS
144144
NATIVE_PROFILE_CLR_CORE();
145145
NANOCLR_HEADER();
146146

147-
CLR_INT64 *pLeft;
148-
CLR_INT64 *pRight;
149-
CLR_RT_HeapBlock resLeft;
150-
CLR_RT_HeapBlock resRight;
147+
CLR_INT64 const *pLeft;
148+
CLR_INT64 const *pRight;
149+
CLR_RT_HeapBlock resLeft{};
150+
CLR_RT_HeapBlock resRight{};
151151

152152
pLeft = Library_corlib_native_System_TimeSpan::GetValuePtr(stack);
153153
FAULT_ON_NULL(pLeft);
@@ -178,6 +178,17 @@ HRESULT Library_corlib_native_System_TimeSpan::Equals___STATIC__BOOLEAN__SystemT
178178

179179
//--//
180180

181+
CLR_INT64 *Library_corlib_native_System_TimeSpan::NewObject(CLR_RT_StackFrame &stack)
182+
{
183+
NATIVE_PROFILE_CLR_CORE();
184+
CLR_RT_HeapBlock &ref = stack.PushValue();
185+
186+
ref.SetDataId(CLR_RT_HEAPBLOCK_RAW_ID(DATATYPE_TIMESPAN, 0, 1));
187+
ref.ClearData();
188+
189+
return (CLR_INT64 *)&ref.NumericByRef().s8;
190+
}
191+
181192
CLR_INT64 *Library_corlib_native_System_TimeSpan::GetValuePtr(CLR_RT_StackFrame &stack)
182193
{
183194
NATIVE_PROFILE_CLR_CORE();
@@ -193,8 +204,11 @@ CLR_INT64 *Library_corlib_native_System_TimeSpan::GetValuePtr(CLR_RT_HeapBlock &
193204
if (dt == DATATYPE_OBJECT || dt == DATATYPE_BYREF)
194205
{
195206
obj = obj->Dereference();
207+
196208
if (!obj)
209+
{
197210
return NULL;
211+
}
198212

199213
dt = obj->DataType();
200214
}

src/CLR/Core/TypeSystemLookup.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ const CLR_RT_DataTypeLookup c_CLR_RT_DataTypeLookup[] =
8282
{ DT_NUM | DT_INT | DT_SGN | DT_PRIM | DT_DIR | DT_OPT | DT_MT, 64, DT_I8, DT_T(I8 ), DT_CNV(I8 ), DT_CLS(m_Int64 ), DT_NOREL(CLR_RT_HeapBlock ) DT_OPT_NAME(I8 ) }, // DATATYPE_I8
8383
{ DT_NUM | DT_INT | DT_PRIM | DT_DIR | DT_OPT | DT_MT, 64, DT_U8, DT_T(I8 ), DT_CNV(U8 ), DT_CLS(m_UInt64 ), DT_NOREL(CLR_RT_HeapBlock ) DT_OPT_NAME(U8 ) }, // DATATYPE_U8
8484
{ DT_NUM | DT_SGN | DT_PRIM | DT_DIR | DT_OPT | DT_MT, 64, DT_I8, DT_T(R8 ), DT_CNV(R8 ), DT_CLS(m_Double ), DT_NOREL(CLR_RT_HeapBlock ) DT_OPT_NAME(R8 ) }, // DATATYPE_R8
85-
{ DT_INT | DT_SGN | DT_VALUE | DT_DIR | DT_OPT | DT_MT, 64, DT_BL, DT_T(DATETIME ), DT_CNV(END ), DT_CLS(m_DateTime ), DT_REL (CLR_RT_HeapBlock ::Relocate_Cls ) DT_OPT_NAME(DATETIME ) }, // DATATYPE_DATETIME
86-
{ DT_INT | DT_SGN | DT_VALUE | DT_DIR | DT_OPT | DT_MT, 64, DT_BL, DT_T(TIMESPAN ), DT_CNV(END ), DT_CLS(m_TimeSpan ), DT_REL (CLR_RT_HeapBlock ::Relocate_Cls ) DT_OPT_NAME(TIMESPAN ) }, // DATATYPE_TIMESPAN
85+
{ DT_INT | DT_SGN | DT_VALUE | DT_DIR | DT_OPT | DT_MT, 64, DT_BL, DT_T(DATETIME ), DT_CNV(END ), DT_CLS(m_DateTime ), DT_NOREL(CLR_RT_HeapBlock ) DT_OPT_NAME(DATETIME ) }, // DATATYPE_DATETIME
86+
{ DT_INT | DT_SGN | DT_VALUE | DT_DIR | DT_OPT | DT_MT, 64, DT_BL, DT_T(TIMESPAN ), DT_CNV(END ), DT_CLS(m_TimeSpan ), DT_NOREL(CLR_RT_HeapBlock ) DT_OPT_NAME(TIMESPAN ) }, // DATATYPE_TIMESPAN
8787
{ DT_REF | DT_PRIM | DT_DIR | DT_MT, DT_VS, DT_BL, DT_T(STRING ), DT_CNV(STRING ), DT_CLS(m_String ), DT_REL (CLR_RT_HeapBlock ::Relocate_String ) DT_OPT_NAME(STRING ) }, // DATATYPE_STRING
8888
//
8989
{ DT_REF | DT_DIR | DT_MT, DT_NA, DT_BL, DT_T(OBJECT ), DT_CNV(OBJECT ), DT_CLS(m_Object ), DT_REL (CLR_RT_HeapBlock ::Relocate_Obj ) DT_OPT_NAME(OBJECT ) }, // DATATYPE_OBJECT

0 commit comments

Comments
 (0)