@@ -209,6 +209,49 @@ TEST(ToUint32) {
209209 ft.CheckThrows (factory->match_symbol ());
210210}
211211
212+ namespace {
213+ void IsValidPositiveSmiCase (Isolate* isolate, intptr_t value, bool expected) {
214+ const int kNumParams = 0 ;
215+ CodeAssemblerTester asm_tester (isolate, kNumParams );
216+
217+ CodeStubAssembler m (asm_tester.state ());
218+ m.Return (
219+ m.SelectBooleanConstant (m.IsValidPositiveSmi (m.IntPtrConstant (value))));
220+
221+ FunctionTester ft (asm_tester.GenerateCode (), kNumParams );
222+ MaybeHandle<Object> maybe_handle = ft.Call ();
223+
224+ if (expected) {
225+ CHECK (maybe_handle.ToHandleChecked ()->IsTrue (isolate));
226+ } else {
227+ CHECK (maybe_handle.ToHandleChecked ()->IsFalse (isolate));
228+ }
229+ }
230+ } // namespace
231+
232+ TEST (IsValidPositiveSmi) {
233+ Isolate* isolate (CcTest::InitIsolateOnce ());
234+
235+ IsValidPositiveSmiCase (isolate, -1 , false );
236+ IsValidPositiveSmiCase (isolate, 0 , true );
237+ IsValidPositiveSmiCase (isolate, 1 , true );
238+
239+ #ifdef V8_TARGET_ARCH_32_BIT
240+ IsValidPositiveSmiCase (isolate, 0x3FFFFFFFU , true );
241+ IsValidPositiveSmiCase (isolate, 0xC0000000U , false );
242+ IsValidPositiveSmiCase (isolate, 0x40000000U , false );
243+ IsValidPositiveSmiCase (isolate, 0xBFFFFFFFU , false );
244+ #else
245+ typedef std::numeric_limits<int32_t > int32_limits;
246+ IsValidPositiveSmiCase (isolate, int32_limits::max (), true );
247+ IsValidPositiveSmiCase (isolate, int32_limits::min (), false );
248+ IsValidPositiveSmiCase (isolate,
249+ static_cast <intptr_t >(int32_limits::max ()) + 1 , false );
250+ IsValidPositiveSmiCase (isolate,
251+ static_cast <intptr_t >(int32_limits::min ()) - 1 , false );
252+ #endif
253+ }
254+
212255TEST (FixedArrayAccessSmiIndex) {
213256 Isolate* isolate (CcTest::InitIsolateOnce ());
214257 CodeAssemblerTester asm_tester (isolate);
0 commit comments