diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index e294fb48422..edfcd642fc5 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -498,7 +498,19 @@ Bytecode::CodeGenerationErrorOr NullLiteral::generate_bytecode(Bytecode::G Bytecode::CodeGenerationErrorOr BigIntLiteral::generate_bytecode(Bytecode::Generator& generator) const { - generator.emit(Crypto::SignedBigInteger::from_base(10, m_value.substring(0, m_value.length() - 1))); + // 1. Return the NumericValue of NumericLiteral as defined in 12.8.3. + auto integer = [&] { + if (m_value[0] == '0' && m_value.length() >= 3) + if (m_value[1] == 'x' || m_value[1] == 'X') + return Crypto::SignedBigInteger::from_base(16, m_value.substring(2, m_value.length() - 3)); + if (m_value[1] == 'o' || m_value[1] == 'O') + return Crypto::SignedBigInteger::from_base(8, m_value.substring(2, m_value.length() - 3)); + if (m_value[1] == 'b' || m_value[1] == 'B') + return Crypto::SignedBigInteger::from_base(2, m_value.substring(2, m_value.length() - 3)); + return Crypto::SignedBigInteger::from_base(10, m_value.substring(0, m_value.length() - 1)); + }(); + + generator.emit(integer); return {}; }