77#include " absl/strings/numbers.h"
88#include " absl/strings/str_format.h"
99#include " absl/strings/str_join.h"
10+ #include " absl/strings/match.h"
1011#include " common/escaping.h"
1112#include " common/operators.h"
1213#include " parser/balancer.h"
@@ -400,9 +401,13 @@ antlrcpp::Any ParserVisitor::visitInt(CelParser::IntContext* ctx) {
400401 if (ctx->sign ) {
401402 value = ctx->sign ->getText ();
402403 }
404+ int base = 10 ;
405+ if (absl::StartsWith (ctx->tok ->getText (), " 0x" )) {
406+ base = 16 ;
407+ }
403408 value += ctx->tok ->getText ();
404409 int64_t int_value;
405- if (absl::SimpleAtoi (value, &int_value)) {
410+ if (absl::numbers_internal::safe_strto64_base (value, &int_value, base )) {
406411 return sf_->newLiteralInt (ctx, int_value);
407412 } else {
408413 return sf_->reportError (ctx, " invalid int literal" );
@@ -415,8 +420,12 @@ antlrcpp::Any ParserVisitor::visitUint(CelParser::UintContext* ctx) {
415420 if (!value.empty ()) {
416421 value.resize (value.size () - 1 );
417422 }
423+ int base = 10 ;
424+ if (absl::StartsWith (value, " 0x" )) {
425+ base = 16 ;
426+ }
418427 uint64_t uint_value;
419- if (absl::SimpleAtoi (value, &uint_value)) {
428+ if (absl::numbers_internal::safe_strtou64_base (value, &uint_value, base )) {
420429 return sf_->newLiteralUint (ctx, uint_value);
421430 } else {
422431 return sf_->reportError (ctx, " invalid uint literal" );
0 commit comments