@@ -17,6 +17,12 @@ inline int32_t LLV8::LoadValue<int32_t>(int64_t addr, Error& err) {
17
17
return LoadUnsigned (addr, 4 , err);
18
18
}
19
19
20
+ template <>
21
+ inline CheckedType<int32_t > LLV8::LoadValue<CheckedType<int32_t >>(
22
+ int64_t addr) {
23
+ return LoadUnsigned<int32_t >(addr, 4 );
24
+ }
25
+
20
26
template <class T >
21
27
inline T LLV8::LoadValue (int64_t addr, Error& err) {
22
28
int64_t ptr;
@@ -363,7 +369,23 @@ inline int64_t String::Encoding(Error& err) {
363
369
return type & v8 ()->string ()->kEncodingMask ;
364
370
}
365
371
366
- ACCESSOR (String, Length, string()->kLengthOffset , Smi)
372
+ inline CheckedType<int32_t > String::Length (Error& err) {
373
+ RETURN_IF_INVALID ((*this ), CheckedType<int32_t >());
374
+
375
+ if (v8 ()->string ()->kLengthIsSmi ) {
376
+ Smi len = LoadFieldValue<Smi>(v8 ()->string ()->kLengthOffset , err);
377
+ RETURN_IF_INVALID (len, CheckedType<int32_t >());
378
+
379
+ return CheckedType<int32_t >(len.GetValue ());
380
+ }
381
+
382
+ CheckedType<int32_t > len = v8 ()->LoadValue <CheckedType<int32_t >>(
383
+ LeaField (v8 ()->string ()->kLengthOffset ));
384
+ RETURN_IF_INVALID (len, CheckedType<int32_t >());
385
+
386
+ return len;
387
+ }
388
+
367
389
368
390
ACCESSOR (Script, Name, script()->kNameOffset , String)
369
391
ACCESSOR (Script, LineOffset, script()->kLineOffsetOffset , Smi)
@@ -610,16 +632,16 @@ inline int64_t FixedTypedArrayBase::GetExternal(Error& err) {
610
632
611
633
inline std::string OneByteString::ToString (Error& err) {
612
634
int64_t chars = LeaField (v8 ()->one_byte_string ()->kCharsOffset );
613
- Smi len = Length (err);
614
- if (err. Fail ()) return std::string ();
615
- return v8 ()->LoadString (chars, len. GetValue () , err);
635
+ CheckedType< int32_t > len = Length (err);
636
+ RETURN_IF_INVALID (len, std::string () );
637
+ return v8 ()->LoadString (chars, * len, err);
616
638
}
617
639
618
640
inline std::string TwoByteString::ToString (Error& err) {
619
641
int64_t chars = LeaField (v8 ()->two_byte_string ()->kCharsOffset );
620
- Smi len = Length (err);
621
- if (err. Fail ()) return std::string ();
622
- return v8 ()->LoadTwoByteString (chars, len. GetValue () , err);
642
+ CheckedType< int32_t > len = Length (err);
643
+ RETURN_IF_INVALID (len, std::string () );
644
+ return v8 ()->LoadTwoByteString (chars, * len, err);
623
645
}
624
646
625
647
inline std::string ConsString::ToString (Error& err) {
@@ -653,24 +675,23 @@ inline std::string SlicedString::ToString(Error& err) {
653
675
Smi offset = Offset (err);
654
676
if (err.Fail ()) return std::string ();
655
677
656
- Smi length = Length (err);
657
- if (err. Fail ()) return std::string ();
678
+ CheckedType< int32_t > length = Length (err);
679
+ RETURN_IF_INVALID (length, std::string () );
658
680
659
681
std::string tmp = parent.ToString (err);
660
682
if (err.Fail ()) return std::string ();
661
683
662
684
int64_t off = offset.GetValue ();
663
- int64_t len = length.GetValue ();
664
685
int64_t tmp_size = tmp.size ();
665
- if (off > tmp_size || len > tmp_size) {
686
+ if (off > tmp_size || *length > tmp_size) {
666
687
err = Error::Failure (" Failed to display sliced string 0x%016" PRIx64
667
- " (offset = 0x%016" PRIx64 " , length = 0x%016 " PRIx64
668
- " ) from parent string 0x%016" PRIx64
688
+ " (offset = 0x%016" PRIx64
689
+ " , length = %d ) from parent string 0x%016" PRIx64
669
690
" (length = 0x%016" PRIx64 " )" ,
670
- raw (), off, len , parent.raw (), tmp_size);
691
+ raw (), off, *length , parent.raw (), tmp_size);
671
692
return std::string (err.GetMessage ());
672
693
}
673
- return tmp.substr (offset.GetValue (), length. GetValue () );
694
+ return tmp.substr (offset.GetValue (), * length);
674
695
}
675
696
676
697
inline std::string ThinString::ToString (Error& err) {
0 commit comments