Skip to content

Commit ac5f133

Browse files
authored
Fix Timeout.InfiniteTimeSpan (#1724)
1 parent 8959d92 commit ac5f133

File tree

1 file changed

+99
-65
lines changed

1 file changed

+99
-65
lines changed

src/CLR/CorLib/corlib_native_System_TimeSpan.cpp

Lines changed: 99 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -5,136 +5,169 @@
55
//
66
#include "CorLib.h"
77

8-
9-
HRESULT Library_corlib_native_System_TimeSpan::Equals___BOOLEAN__OBJECT( CLR_RT_StackFrame& stack )
8+
HRESULT Library_corlib_native_System_TimeSpan::Equals___BOOLEAN__OBJECT(CLR_RT_StackFrame &stack)
109
{
1110
NATIVE_PROFILE_CLR_CORE();
1211
NANOCLR_HEADER();
1312

14-
NANOCLR_CHECK_HRESULT(CompareTo___I4__OBJECT( stack ));
13+
NANOCLR_CHECK_HRESULT(CompareTo___I4__OBJECT(stack));
1514

1615
{
17-
CLR_RT_HeapBlock& res = stack.TopValue();
16+
CLR_RT_HeapBlock &res = stack.TopValue();
1817

19-
res.SetBoolean( res.NumericByRef().s4 == 0 );
18+
res.SetBoolean(res.NumericByRef().s4 == 0);
2019
}
2120

2221
NANOCLR_NOCLEANUP();
2322
}
2423

25-
HRESULT Library_corlib_native_System_TimeSpan::ToString___STRING( CLR_RT_StackFrame& stack )
24+
HRESULT Library_corlib_native_System_TimeSpan::ToString___STRING(CLR_RT_StackFrame &stack)
2625
{
2726
NATIVE_PROFILE_CLR_CORE();
2827
NANOCLR_HEADER();
2928

30-
char rgBuffer[ 128 ];
31-
char* szBuffer = rgBuffer;
32-
size_t iBuffer = ARRAYSIZE(rgBuffer);
33-
CLR_INT64* val = GetValuePtr( stack ); FAULT_ON_NULL(val);
29+
char rgBuffer[128];
30+
char *szBuffer = rgBuffer;
31+
size_t iBuffer = ARRAYSIZE(rgBuffer);
32+
CLR_INT64 *val = GetValuePtr(stack);
33+
FAULT_ON_NULL(val);
3434

35-
HAL_Time_TimeSpanToStringEx( *val, szBuffer, iBuffer );
35+
HAL_Time_TimeSpanToStringEx(*val, szBuffer, iBuffer);
3636

37-
NANOCLR_SET_AND_LEAVE(stack.SetResult_String( rgBuffer ));
37+
NANOCLR_SET_AND_LEAVE(stack.SetResult_String(rgBuffer));
3838

3939
NANOCLR_NOCLEANUP();
4040
}
4141

42-
HRESULT Library_corlib_native_System_TimeSpan::_ctor___VOID__I4__I4__I4( CLR_RT_StackFrame& stack )
42+
HRESULT Library_corlib_native_System_TimeSpan::_ctor___VOID__I4__I4__I4(CLR_RT_StackFrame &stack)
4343
{
4444
NATIVE_PROFILE_CLR_CORE();
4545
NANOCLR_HEADER();
4646

47-
CLR_RT_HeapBlock* pArgs = &(stack.Arg1());
48-
CLR_INT64* val = GetValuePtr( stack ); FAULT_ON_NULL(val);
47+
CLR_RT_HeapBlock *pArgs = &(stack.Arg1());
48+
CLR_INT64 *val = GetValuePtr(stack);
49+
FAULT_ON_NULL(val);
4950

50-
ConstructTimeSpan( val, 0, pArgs[ 0 ].NumericByRef().s4, pArgs[ 1 ].NumericByRef().s4, pArgs[ 2 ].NumericByRef().s4, 0 );
51+
ConstructTimeSpan(val, 0, pArgs[0].NumericByRef().s4, pArgs[1].NumericByRef().s4, pArgs[2].NumericByRef().s4, 0);
5152

5253
NANOCLR_NOCLEANUP();
5354
}
5455

55-
HRESULT Library_corlib_native_System_TimeSpan::_ctor___VOID__I4__I4__I4__I4( CLR_RT_StackFrame& stack )
56+
HRESULT Library_corlib_native_System_TimeSpan::_ctor___VOID__I4__I4__I4__I4(CLR_RT_StackFrame &stack)
5657
{
5758
NATIVE_PROFILE_CLR_CORE();
5859
NANOCLR_HEADER();
5960

60-
CLR_RT_HeapBlock* pArgs = &(stack.Arg1());
61-
CLR_INT64* val = GetValuePtr( stack ); FAULT_ON_NULL(val);
61+
CLR_RT_HeapBlock *pArgs = &(stack.Arg1());
62+
CLR_INT64 *val = GetValuePtr(stack);
63+
FAULT_ON_NULL(val);
6264

63-
ConstructTimeSpan( val, pArgs[ 0 ].NumericByRef().s4, pArgs[ 1 ].NumericByRef().s4, pArgs[ 2 ].NumericByRef().s4, pArgs[ 3 ].NumericByRef().s4, 0 );
65+
ConstructTimeSpan(
66+
val,
67+
pArgs[0].NumericByRef().s4,
68+
pArgs[1].NumericByRef().s4,
69+
pArgs[2].NumericByRef().s4,
70+
pArgs[3].NumericByRef().s4,
71+
0);
6472

6573
NANOCLR_NOCLEANUP();
6674
}
6775

68-
HRESULT Library_corlib_native_System_TimeSpan::_ctor___VOID__I4__I4__I4__I4__I4( CLR_RT_StackFrame& stack )
76+
HRESULT Library_corlib_native_System_TimeSpan::_ctor___VOID__I4__I4__I4__I4__I4(CLR_RT_StackFrame &stack)
6977
{
7078
NATIVE_PROFILE_CLR_CORE();
7179
NANOCLR_HEADER();
7280

73-
CLR_RT_HeapBlock* pArgs = &(stack.Arg1());
74-
CLR_INT64* val = GetValuePtr( stack ); FAULT_ON_NULL(val);
81+
CLR_RT_HeapBlock *pArgs = &(stack.Arg1());
82+
CLR_INT64 *val = GetValuePtr(stack);
83+
FAULT_ON_NULL(val);
7584

76-
ConstructTimeSpan( val, pArgs[ 0 ].NumericByRef().s4, pArgs[ 1 ].NumericByRef().s4, pArgs[ 2 ].NumericByRef().s4, pArgs[ 3 ].NumericByRef().s4, pArgs[ 4 ].NumericByRef().s4 );
85+
ConstructTimeSpan(
86+
val,
87+
pArgs[0].NumericByRef().s4,
88+
pArgs[1].NumericByRef().s4,
89+
pArgs[2].NumericByRef().s4,
90+
pArgs[3].NumericByRef().s4,
91+
pArgs[4].NumericByRef().s4);
7792

7893
NANOCLR_NOCLEANUP();
7994
}
8095

81-
void Library_corlib_native_System_TimeSpan::ConstructTimeSpan( CLR_INT64* val, CLR_INT32 days, CLR_INT32 hours, CLR_INT32 minutes, CLR_INT32 seconds, CLR_INT32 msec )
96+
void Library_corlib_native_System_TimeSpan::ConstructTimeSpan(
97+
CLR_INT64 *val,
98+
CLR_INT32 days,
99+
CLR_INT32 hours,
100+
CLR_INT32 minutes,
101+
CLR_INT32 seconds,
102+
CLR_INT32 msec)
82103

83104
{
84-
*val = ((CLR_INT64)days) * TIME_CONVERSION__ONEDAY +
85-
hours * TIME_CONVERSION__ONEHOUR +
86-
minutes * TIME_CONVERSION__ONEMINUTE +
87-
seconds * TIME_CONVERSION__ONESECOND;
105+
*val = ((CLR_INT64)days) * TIME_CONVERSION__ONEDAY + hours * TIME_CONVERSION__ONEHOUR +
106+
minutes * TIME_CONVERSION__ONEMINUTE + seconds * TIME_CONVERSION__ONESECOND;
88107

89108
*val *= 1000;
90-
*val += msec;
91-
*val *= TIME_CONVERSION__TICKUNITS;
109+
110+
if ((*val == 0) && (msec == -1))
111+
{
112+
// this is the edge case for creating a System.Threading.Timeout.InfiniteTimeSpan
113+
*val = -1;
114+
}
115+
else
116+
{
117+
// remaining situation, just take the milliseconds value as it is and convert to ticks
118+
*val += msec;
119+
*val *= TIME_CONVERSION__TICKUNITS;
120+
}
92121
}
93122

94-
HRESULT Library_corlib_native_System_TimeSpan::CompareTo___I4__OBJECT( CLR_RT_StackFrame& stack )
123+
HRESULT Library_corlib_native_System_TimeSpan::CompareTo___I4__OBJECT(CLR_RT_StackFrame &stack)
95124
{
96125
NATIVE_PROFILE_CLR_CORE();
97126
NANOCLR_HEADER();
98127

99-
CLR_RT_HeapBlock* pRight = stack.Arg1().Dereference();
128+
CLR_RT_HeapBlock *pRight = stack.Arg1().Dereference();
100129

101-
if(pRight)
130+
if (pRight)
102131
{
103-
NANOCLR_SET_AND_LEAVE(Compare___STATIC__I4__SystemTimeSpan__SystemTimeSpan( stack ));
132+
NANOCLR_SET_AND_LEAVE(Compare___STATIC__I4__SystemTimeSpan__SystemTimeSpan(stack));
104133
}
105134

106-
stack.SetResult_I4( 1 );
135+
stack.SetResult_I4(1);
107136

108137
NANOCLR_NOCLEANUP();
109138
}
110139

111-
HRESULT Library_corlib_native_System_TimeSpan::Compare___STATIC__I4__SystemTimeSpan__SystemTimeSpan( CLR_RT_StackFrame& stack )
140+
HRESULT Library_corlib_native_System_TimeSpan::Compare___STATIC__I4__SystemTimeSpan__SystemTimeSpan(
141+
CLR_RT_StackFrame &stack)
112142
{
113143
NATIVE_PROFILE_CLR_CORE();
114144
NANOCLR_HEADER();
115145

116-
CLR_INT64* pLeft;
117-
CLR_INT64* pRight;
146+
CLR_INT64 *pLeft;
147+
CLR_INT64 *pRight;
118148
CLR_RT_HeapBlock resLeft;
119149
CLR_RT_HeapBlock resRight;
120150

121-
pLeft = Library_corlib_native_System_TimeSpan::GetValuePtr( stack ); FAULT_ON_NULL(pLeft);
122-
pRight = Library_corlib_native_System_TimeSpan::GetValuePtr( stack.Arg1() ); FAULT_ON_NULL(pRight);
151+
pLeft = Library_corlib_native_System_TimeSpan::GetValuePtr(stack);
152+
FAULT_ON_NULL(pLeft);
153+
pRight = Library_corlib_native_System_TimeSpan::GetValuePtr(stack.Arg1());
154+
FAULT_ON_NULL(pRight);
123155

124-
resLeft .SetInteger( *pLeft );
125-
resRight.SetInteger( *pRight );
156+
resLeft.SetInteger(*pLeft);
157+
resRight.SetInteger(*pRight);
126158

127-
stack.SetResult_I4( CLR_RT_HeapBlock::Compare_Signed_Values( resLeft, resRight ) );
159+
stack.SetResult_I4(CLR_RT_HeapBlock::Compare_Signed_Values(resLeft, resRight));
128160

129161
NANOCLR_NOCLEANUP();
130162
}
131163

132-
HRESULT Library_corlib_native_System_TimeSpan::Equals___STATIC__BOOLEAN__SystemTimeSpan__SystemTimeSpan( CLR_RT_StackFrame& stack )
164+
HRESULT Library_corlib_native_System_TimeSpan::Equals___STATIC__BOOLEAN__SystemTimeSpan__SystemTimeSpan(
165+
CLR_RT_StackFrame &stack)
133166
{
134167
NATIVE_PROFILE_CLR_CORE();
135168
NANOCLR_HEADER();
136169

137-
NANOCLR_CHECK_HRESULT(Compare___STATIC__I4__SystemTimeSpan__SystemTimeSpan( stack ));
170+
NANOCLR_CHECK_HRESULT(Compare___STATIC__I4__SystemTimeSpan__SystemTimeSpan(stack));
138171

139172
stack.ConvertResultToBoolean();
140173

@@ -143,51 +176,52 @@ HRESULT Library_corlib_native_System_TimeSpan::Equals___STATIC__BOOLEAN__SystemT
143176

144177
//--//
145178

146-
CLR_INT64* Library_corlib_native_System_TimeSpan::NewObject( CLR_RT_StackFrame& stack )
179+
CLR_INT64 *Library_corlib_native_System_TimeSpan::NewObject(CLR_RT_StackFrame &stack)
147180
{
148181
NATIVE_PROFILE_CLR_CORE();
149-
CLR_RT_HeapBlock& ref = stack.PushValue();
182+
CLR_RT_HeapBlock &ref = stack.PushValue();
150183

151-
ref.SetDataId( CLR_RT_HEAPBLOCK_RAW_ID( DATATYPE_TIMESPAN, 0, 1 ) );
152-
ref.ClearData( );
184+
ref.SetDataId(CLR_RT_HEAPBLOCK_RAW_ID(DATATYPE_TIMESPAN, 0, 1));
185+
ref.ClearData();
153186

154-
return (CLR_INT64*)&ref.NumericByRef().s8;
187+
return (CLR_INT64 *)&ref.NumericByRef().s8;
155188
}
156189

157-
CLR_INT64* Library_corlib_native_System_TimeSpan::GetValuePtr( CLR_RT_StackFrame& stack )
190+
CLR_INT64 *Library_corlib_native_System_TimeSpan::GetValuePtr(CLR_RT_StackFrame &stack)
158191
{
159192
NATIVE_PROFILE_CLR_CORE();
160-
return GetValuePtr( stack.Arg0() );
193+
return GetValuePtr(stack.Arg0());
161194
}
162195

163-
CLR_INT64* Library_corlib_native_System_TimeSpan::GetValuePtr( CLR_RT_HeapBlock& ref )
196+
CLR_INT64 *Library_corlib_native_System_TimeSpan::GetValuePtr(CLR_RT_HeapBlock &ref)
164197
{
165198
NATIVE_PROFILE_CLR_CORE();
166-
CLR_RT_HeapBlock* obj = &ref;
167-
CLR_DataType dt = obj->DataType();
199+
CLR_RT_HeapBlock *obj = &ref;
200+
CLR_DataType dt = obj->DataType();
168201

169-
if(dt == DATATYPE_OBJECT || dt == DATATYPE_BYREF)
202+
if (dt == DATATYPE_OBJECT || dt == DATATYPE_BYREF)
170203
{
171-
obj = obj->Dereference(); if(!obj) return NULL;
204+
obj = obj->Dereference();
205+
if (!obj)
206+
return NULL;
172207

173208
dt = obj->DataType();
174209
}
175210

176-
if(dt == DATATYPE_TIMESPAN)
211+
if (dt == DATATYPE_TIMESPAN)
177212
{
178-
return (CLR_INT64*)&obj->NumericByRef().s8;
213+
return (CLR_INT64 *)&obj->NumericByRef().s8;
179214
}
180215

181-
if(dt == DATATYPE_I8)
216+
if (dt == DATATYPE_I8)
182217
{
183-
return (CLR_INT64*)&obj->NumericByRef().s8;
218+
return (CLR_INT64 *)&obj->NumericByRef().s8;
184219
}
185220

186-
if(dt == DATATYPE_VALUETYPE && obj->ObjectCls().m_data == g_CLR_RT_WellKnownTypes.m_TimeSpan.m_data)
221+
if (dt == DATATYPE_VALUETYPE && obj->ObjectCls().m_data == g_CLR_RT_WellKnownTypes.m_TimeSpan.m_data)
187222
{
188-
return (CLR_INT64*)&obj[ FIELD___ticks ].NumericByRef().s8;
223+
return (CLR_INT64 *)&obj[FIELD___ticks].NumericByRef().s8;
189224
}
190225

191226
return NULL;
192227
}
193-

0 commit comments

Comments
 (0)