@@ -137,7 +137,7 @@ string TestFileParser::parseFunctionSignature()
137
137
138
138
u256 TestFileParser::parseFunctionCallValue ()
139
139
{
140
- u256 value = convertNumber (parseNumber ());
140
+ u256 value = convertNumber (parseDecimalNumber ());
141
141
expect (Token::Ether);
142
142
return value;
143
143
}
@@ -203,16 +203,23 @@ tuple<bytes, ABIType, string> TestFileParser::parseABITypeLiteral()
203
203
abiType = ABIType{ABIType::SignedDec, ABIType::AlignRight, 32 };
204
204
expect (Token::Sub);
205
205
rawString += formatToken (Token::Sub);
206
- string parsed = parseNumber ();
206
+ string parsed = parseDecimalNumber ();
207
207
rawString += parsed;
208
208
number = convertNumber (parsed) * -1 ;
209
209
}
210
210
else
211
211
{
212
- if (accept (Token::Number))
212
+ if (accept (Token::HexNumber))
213
+ {
214
+ abiType = ABIType{ABIType::Hex, ABIType::AlignLeft, 32 };
215
+ string parsed = parseHexNumber ();
216
+ rawString += parsed;
217
+ return make_tuple (convertHexNumber (parsed), abiType, rawString);
218
+ }
219
+ else if (accept (Token::Number))
213
220
{
214
221
abiType = ABIType{ABIType::UnsignedDec, ABIType::AlignRight, 32 };
215
- string parsed = parseNumber ();
222
+ string parsed = parseDecimalNumber ();
216
223
rawString += parsed;
217
224
number = convertNumber (parsed);
218
225
}
@@ -263,16 +270,24 @@ string TestFileParser::parseComment()
263
270
return string{};
264
271
}
265
272
266
- string TestFileParser::parseNumber ()
273
+ string TestFileParser::parseDecimalNumber ()
267
274
{
268
275
string literal = m_scanner.currentLiteral ();
269
276
expect (Token::Number);
270
277
return literal;
271
278
}
272
279
280
+ string TestFileParser::parseHexNumber ()
281
+ {
282
+ string literal = m_scanner.currentLiteral ();
283
+ expect (Token::HexNumber);
284
+ return literal;
285
+ }
286
+
273
287
u256 TestFileParser::convertNumber (string const & _literal)
274
288
{
275
- try {
289
+ try
290
+ {
276
291
return u256{_literal};
277
292
}
278
293
catch (std::exception const &)
@@ -281,6 +296,26 @@ u256 TestFileParser::convertNumber(string const& _literal)
281
296
}
282
297
}
283
298
299
+ bytes TestFileParser::convertHexNumber (string const & _literal)
300
+ {
301
+ try
302
+ {
303
+ if (_literal.size () % 2 )
304
+ {
305
+ throw Error (Error::Type::ParserError, " Hex number encoding invalid." );
306
+ }
307
+ else
308
+ {
309
+ bytes result = fromHex (_literal);
310
+ return result + bytes (32 - result.size (), 0 );
311
+ }
312
+ }
313
+ catch (std::exception const &)
314
+ {
315
+ throw Error (Error::Type::ParserError, " Hex number encoding invalid." );
316
+ }
317
+ }
318
+
284
319
void TestFileParser::Scanner::readStream (istream& _stream)
285
320
{
286
321
std::string line;
@@ -348,7 +383,16 @@ void TestFileParser::Scanner::scanNextToken()
348
383
token = selectToken (detectedToken.first , detectedToken.second );
349
384
}
350
385
else if (langutil::isDecimalDigit (current ()))
351
- token = selectToken (Token::Number, scanNumber ());
386
+ {
387
+ if (current () == ' 0' && peek () == ' x' )
388
+ {
389
+ advance ();
390
+ advance ();
391
+ token = selectToken (Token::HexNumber, " 0x" + scanHexNumber ());
392
+ }
393
+ else
394
+ token = selectToken (Token::Number, scanDecimalNumber ());
395
+ }
352
396
else if (langutil::isWhiteSpace (current ()))
353
397
token = selectToken (Token::Whitespace);
354
398
else if (isEndOfLine ())
@@ -385,7 +429,7 @@ string TestFileParser::Scanner::scanIdentifierOrKeyword()
385
429
return identifier;
386
430
}
387
431
388
- string TestFileParser::Scanner::scanNumber ()
432
+ string TestFileParser::Scanner::scanDecimalNumber ()
389
433
{
390
434
string number;
391
435
number += current ();
@@ -396,3 +440,15 @@ string TestFileParser::Scanner::scanNumber()
396
440
}
397
441
return number;
398
442
}
443
+
444
+ string TestFileParser::Scanner::scanHexNumber ()
445
+ {
446
+ string number;
447
+ number += current ();
448
+ while (langutil::isHexDigit (peek ()))
449
+ {
450
+ advance ();
451
+ number += current ();
452
+ }
453
+ return number;
454
+ }
0 commit comments