34 #include "../include/v8stdint.h"
48 : unicode_cache_(unicode_cache),
50 harmony_scoping_(
false),
51 harmony_modules_(
false),
52 harmony_numeric_literals_(
false) { }
62 has_line_terminator_before_next_ =
true;
68 uc32 Scanner::ScanHexNumber(
int expected_length) {
69 ASSERT(expected_length <= 4);
71 uc32 digits[4] = { 0, 0, 0, 0 };
73 for (
int i = 0; i < expected_length; i++) {
82 for (
int j = i-1; j >= 0; j--) {
99 static const byte one_char_tokens[] = {
233 has_line_terminator_before_next_ =
false;
234 has_multiline_comment_before_next_ =
false;
235 if (static_cast<unsigned>(c0_) <= 0x7f) {
237 if (token != Token::ILLEGAL) {
238 int pos = source_pos();
240 next_.location.beg_pos = pos;
241 next_.location.end_pos = pos + 1;
243 return current_.token;
247 return current_.token;
252 static inline bool IsLittleEndianByteOrderMark(
uc32 c) {
264 bool Scanner::SkipWhiteSpace() {
265 int start_position = source_pos();
272 has_line_terminator_before_next_ =
true;
274 !IsLittleEndianByteOrderMark(c0_)) {
284 if (c0_ ==
'-' && has_line_terminator_before_next_) {
290 SkipSingleLineComment();
299 return source_pos() != start_position;
316 return Token::WHITESPACE;
330 has_multiline_comment_before_next_ =
true;
335 if (ch ==
'*' && c0_ ==
'/') {
337 return Token::WHITESPACE;
342 return Token::ILLEGAL;
352 if (c0_ ==
'-')
return SkipSingleLineComment();
361 void Scanner::Scan() {
362 next_.literal_chars =
NULL;
366 next_.location.beg_pos = source_pos();
372 token = Token::WHITESPACE;
377 has_line_terminator_before_next_ =
true;
378 token = Token::WHITESPACE;
382 token = ScanString();
389 token = Select(Token::LTE);
390 }
else if (c0_ ==
'<') {
391 token = Select(
'=', Token::ASSIGN_SHL, Token::SHL);
392 }
else if (c0_ ==
'!') {
393 token = ScanHtmlComment();
403 token = Select(Token::GTE);
404 }
else if (c0_ ==
'>') {
408 token = Select(Token::ASSIGN_SAR);
409 }
else if (c0_ ==
'>') {
410 token = Select(
'=', Token::ASSIGN_SHR, Token::SHR);
423 token = Select(
'=', Token::EQ_STRICT,
Token::EQ);
425 token = Token::ASSIGN;
433 token = Select(
'=', Token::NE_STRICT, Token::NE);
443 token = Select(Token::INC);
444 }
else if (c0_ ==
'=') {
445 token = Select(Token::ASSIGN_ADD);
456 if (c0_ ==
'>' && has_line_terminator_before_next_) {
459 token = SkipSingleLineComment();
463 }
else if (c0_ ==
'=') {
464 token = Select(Token::ASSIGN_SUB);
472 token = Select(
'=', Token::ASSIGN_MUL,
Token::MUL);
477 token = Select(
'=', Token::ASSIGN_MOD, Token::MOD);
484 token = SkipSingleLineComment();
485 }
else if (c0_ ==
'*') {
486 token = SkipMultiLineComment();
487 }
else if (c0_ ==
'=') {
488 token = Select(Token::ASSIGN_DIV);
499 }
else if (c0_ ==
'=') {
500 token = Select(Token::ASSIGN_BIT_AND);
502 token = Token::BIT_AND;
511 }
else if (c0_ ==
'=') {
512 token = Select(Token::ASSIGN_BIT_OR);
514 token = Token::BIT_OR;
520 token = Select(
'=', Token::ASSIGN_BIT_XOR, Token::BIT_XOR);
527 token = ScanNumber(
true);
529 token = Token::PERIOD;
534 token = Select(Token::COLON);
538 token = Select(Token::SEMICOLON);
546 token = Select(Token::LPAREN);
550 token = Select(Token::RPAREN);
554 token = Select(Token::LBRACK);
558 token = Select(Token::RBRACK);
562 token = Select(Token::LBRACE);
566 token = Select(Token::RBRACE);
570 token = Select(Token::CONDITIONAL);
574 token = Select(Token::BIT_NOT);
579 token = ScanIdentifierOrKeyword();
581 token = ScanNumber(
false);
582 }
else if (SkipWhiteSpace()) {
583 token = Token::WHITESPACE;
584 }
else if (c0_ < 0) {
587 token = Select(Token::ILLEGAL);
594 }
while (token == Token::WHITESPACE);
596 next_.location.end_pos = source_pos();
604 if (pos == next_.location.beg_pos)
return;
605 int current_pos = source_pos();
606 ASSERT_EQ(next_.location.end_pos, current_pos);
608 ASSERT(pos >= current_pos);
609 if (pos != current_pos) {
615 has_line_terminator_before_next_ =
false;
616 has_multiline_comment_before_next_ =
false;
622 bool Scanner::ScanEscape() {
639 case 'b' : c =
'\b';
break;
640 case 'f' : c =
'\f';
break;
641 case 'n' : c =
'\n';
break;
642 case 'r' : c =
'\r';
break;
643 case 't' : c =
'\t';
break;
645 c = ScanHexNumber(4);
646 if (c < 0)
return false;
649 case 'v' : c =
'\v';
break;
651 c = ScanHexNumber(2);
652 if (c < 0)
return false;
662 case '7' : c = ScanOctalEscape(c, 2);
break;
675 uc32 Scanner::ScanOctalEscape(
uc32 c,
int length) {
678 for (; i < length; i++) {
680 if (d < 0 || d > 7)
break;
682 if (nx >= 256)
break;
691 if (c !=
'0' || i > 0) {
692 octal_pos_ = Location(source_pos() - i - 1, source_pos() - 1);
702 LiteralScope literal(
this);
703 while (c0_ != quote && c0_ >= 0
708 if (c0_ < 0 || !ScanEscape())
return Token::ILLEGAL;
713 if (c0_ != quote)
return Token::ILLEGAL;
721 void Scanner::ScanDecimalDigits() {
723 AddLiteralCharAdvance();
730 enum { DECIMAL, HEX, OCTAL, IMPLICIT_OCTAL, BINARY } kind = DECIMAL;
732 LiteralScope literal(
this);
741 int start_pos = source_pos();
742 AddLiteralCharAdvance();
746 if (c0_ ==
'x' || c0_ ==
'X') {
749 AddLiteralCharAdvance();
752 return Token::ILLEGAL;
755 AddLiteralCharAdvance();
757 }
else if (harmony_numeric_literals_ && (c0_ ==
'o' || c0_ ==
'O')) {
759 AddLiteralCharAdvance();
762 return Token::ILLEGAL;
765 AddLiteralCharAdvance();
767 }
else if (harmony_numeric_literals_ && (c0_ ==
'b' || c0_ ==
'B')) {
769 AddLiteralCharAdvance();
772 return Token::ILLEGAL;
775 AddLiteralCharAdvance();
777 }
else if (
'0' <= c0_ && c0_ <=
'7') {
779 kind = IMPLICIT_OCTAL;
781 if (c0_ ==
'8' || c0_ ==
'9') {
785 if (c0_ <
'0' ||
'7' < c0_) {
787 octal_pos_ = Location(start_pos, source_pos());
790 AddLiteralCharAdvance();
796 if (kind == DECIMAL) {
799 AddLiteralCharAdvance();
806 if (c0_ ==
'e' || c0_ ==
'E') {
808 if (kind != DECIMAL)
return Token::ILLEGAL;
810 AddLiteralCharAdvance();
811 if (c0_ ==
'+' || c0_ ==
'-')
812 AddLiteralCharAdvance();
815 return Token::ILLEGAL;
825 return Token::ILLEGAL;
829 return Token::NUMBER;
833 uc32 Scanner::ScanIdentifierUnicodeEscape() {
835 if (c0_ !=
'u')
return -1;
837 uc32 result = ScanHexNumber(4);
838 if (result < 0) PushBack(
'u');
846 #define KEYWORDS(KEYWORD_GROUP, KEYWORD) \
848 KEYWORD("break", Token::BREAK) \
850 KEYWORD("case", Token::CASE) \
851 KEYWORD("catch", Token::CATCH) \
852 KEYWORD("class", Token::FUTURE_RESERVED_WORD) \
853 KEYWORD("const", Token::CONST) \
854 KEYWORD("continue", Token::CONTINUE) \
856 KEYWORD("debugger", Token::DEBUGGER) \
857 KEYWORD("default", Token::DEFAULT) \
858 KEYWORD("delete", Token::DELETE) \
859 KEYWORD("do", Token::DO) \
861 KEYWORD("else", Token::ELSE) \
862 KEYWORD("enum", Token::FUTURE_RESERVED_WORD) \
863 KEYWORD("export", harmony_modules \
864 ? Token::EXPORT : Token::FUTURE_RESERVED_WORD) \
865 KEYWORD("extends", Token::FUTURE_RESERVED_WORD) \
867 KEYWORD("false", Token::FALSE_LITERAL) \
868 KEYWORD("finally", Token::FINALLY) \
869 KEYWORD("for", Token::FOR) \
870 KEYWORD("function", Token::FUNCTION) \
872 KEYWORD("if", Token::IF) \
873 KEYWORD("implements", Token::FUTURE_STRICT_RESERVED_WORD) \
874 KEYWORD("import", harmony_modules \
875 ? Token::IMPORT : Token::FUTURE_RESERVED_WORD) \
876 KEYWORD("in", Token::IN) \
877 KEYWORD("instanceof", Token::INSTANCEOF) \
878 KEYWORD("interface", Token::FUTURE_STRICT_RESERVED_WORD) \
880 KEYWORD("let", harmony_scoping \
881 ? Token::LET : Token::FUTURE_STRICT_RESERVED_WORD) \
883 KEYWORD("new", Token::NEW) \
884 KEYWORD("null", Token::NULL_LITERAL) \
886 KEYWORD("package", Token::FUTURE_STRICT_RESERVED_WORD) \
887 KEYWORD("private", Token::FUTURE_STRICT_RESERVED_WORD) \
888 KEYWORD("protected", Token::FUTURE_STRICT_RESERVED_WORD) \
889 KEYWORD("public", Token::FUTURE_STRICT_RESERVED_WORD) \
891 KEYWORD("return", Token::RETURN) \
893 KEYWORD("static", Token::FUTURE_STRICT_RESERVED_WORD) \
894 KEYWORD("super", Token::FUTURE_RESERVED_WORD) \
895 KEYWORD("switch", Token::SWITCH) \
897 KEYWORD("this", Token::THIS) \
898 KEYWORD("throw", Token::THROW) \
899 KEYWORD("true", Token::TRUE_LITERAL) \
900 KEYWORD("try", Token::TRY) \
901 KEYWORD("typeof", Token::TYPEOF) \
903 KEYWORD("var", Token::VAR) \
904 KEYWORD("void", Token::VOID) \
906 KEYWORD("while", Token::WHILE) \
907 KEYWORD("with", Token::WITH) \
909 KEYWORD("yield", Token::YIELD)
912 static Token::Value KeywordOrIdentifierToken(
const uint8_t* input,
914 bool harmony_scoping,
915 bool harmony_modules) {
916 ASSERT(input_length >= 1);
917 const int kMinLength = 2;
918 const int kMaxLength = 10;
919 if (input_length < kMinLength || input_length > kMaxLength) {
920 return Token::IDENTIFIER;
924 #define KEYWORD_GROUP_CASE(ch) \
927 #define KEYWORD(keyword, token) \
931 const int keyword_length = sizeof(keyword) - 1; \
932 STATIC_ASSERT(keyword_length >= kMinLength); \
933 STATIC_ASSERT(keyword_length <= kMaxLength); \
934 if (input_length == keyword_length && \
935 input[1] == keyword[1] && \
936 (keyword_length <= 2 || input[2] == keyword[2]) && \
937 (keyword_length <= 3 || input[3] == keyword[3]) && \
938 (keyword_length <= 4 || input[4] == keyword[4]) && \
939 (keyword_length <= 5 || input[5] == keyword[5]) && \
940 (keyword_length <= 6 || input[6] == keyword[6]) && \
941 (keyword_length <= 7 || input[7] == keyword[7]) && \
942 (keyword_length <= 8 || input[8] == keyword[8]) && \
943 (keyword_length <= 9 || input[9] == keyword[9])) { \
949 return Token::IDENTIFIER;
955 LiteralScope literal(
this);
958 uc32 c = ScanIdentifierUnicodeEscape();
963 return Token::ILLEGAL;
966 return ScanIdentifierSuffix(&literal);
969 uc32 first_char = c0_;
971 AddLiteralChar(first_char);
976 uc32 next_char = c0_;
978 AddLiteralChar(next_char);
982 return ScanIdentifierSuffix(&literal);
987 if (next_.literal_chars->is_one_byte()) {
988 Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal();
989 return KeywordOrIdentifierToken(chars.start(),
995 return Token::IDENTIFIER;
999 Token::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) {
1003 uc32 c = ScanIdentifierUnicodeEscape();
1008 return Token::ILLEGAL;
1012 AddLiteralChar(c0_);
1016 literal->Complete();
1018 return Token::IDENTIFIER;
1024 bool in_character_class =
false;
1028 next_.location.beg_pos = source_pos() - (seen_equal ? 2 : 1);
1029 next_.location.end_pos = source_pos() - (seen_equal ? 1 : 0);
1036 AddLiteralChar(
'=');
1039 while (c0_ !=
'/' || in_character_class) {
1042 AddLiteralCharAdvance();
1044 AddLiteralCharAdvance();
1056 if (c0_ ==
'[') in_character_class =
true;
1057 if (c0_ ==
']') in_character_class =
false;
1058 AddLiteralCharAdvance();
1069 bool Scanner::ScanLiteralUnicodeEscape() {
1071 uc32 chars_read[6] = {
'\\',
'u', 0, 0, 0, 0};
1079 chars_read[i] = c0_;
1087 PushBack(chars_read[i]);
1092 for (
int i = 0; i < 6; i++) {
1093 AddLiteralChar(chars_read[i]);
1104 AddLiteralCharAdvance();
1106 if (!ScanLiteralUnicodeEscape()) {
1114 next_.location.end_pos = source_pos() - 1;
1121 if (is_next_literal_one_byte()) {
1126 next_literal_two_byte_string(), tenured);
1132 if (is_literal_one_byte()) {
1134 literal_one_byte_string());
1137 literal_two_byte_string());
1143 ASSERT(is_literal_one_byte());
1151 return finder->
AddNumber(literal_one_byte_string(), value);
1156 if (is_literal_one_byte()) {
1164 if (is_literal_one_byte()) {
1173 return AddSymbol(key,
true, value);
1185 uint32_t hash = Hash(key, is_one_byte);
1186 byte* encoding = BackupKey(key, is_one_byte);
1187 HashMap::Entry* entry = map_.
Lookup(encoding, hash,
true);
1188 int old_value =
static_cast<int>(
reinterpret_cast<intptr_t
>(entry->value));
1190 reinterpret_cast<void*
>(
static_cast<intptr_t
>(value | old_value));
1198 if (IsNumberCanonical(key)) {
1208 string =
"Infinity";
1216 length),
true, value);
1226 int length = number.
length();
1227 if (number.
length() > 15)
return false;
1228 if (number[pos] ==
'0') {
1231 while (pos < length &&
1232 static_cast<unsigned>(number[pos] -
'0') <= (
'9' -
'0')) pos++;
1234 if (length == pos)
return true;
1235 if (number[pos] !=
'.')
return false;
1237 bool invalid_last_digit =
true;
1238 while (pos < length) {
1239 uint8_t digit = number[pos] -
'0';
1240 if (digit >
'9' -
'0')
return false;
1241 invalid_last_digit = (digit == 0);
1244 return !invalid_last_digit;
1248 uint32_t DuplicateFinder::Hash(Vector<const uint8_t> key,
bool is_one_byte) {
1251 int length = key.
length();
1252 uint32_t hash = (length << 1) | (is_one_byte ? 1 : 0) ;
1253 for (
int i = 0; i < length; i++) {
1254 uint32_t c = key[i];
1255 hash = (hash + c) * 1025;
1256 hash ^= (hash >> 6);
1262 bool DuplicateFinder::Match(
void* first,
void* second) {
1270 uint32_t length_one_byte_field = 0;
1274 if (c1 != *s2)
return false;
1275 length_one_byte_field = (length_one_byte_field << 7) | (c1 & 0x7f);
1278 }
while ((c1 & 0x80) != 0);
1279 int length =
static_cast<int>(length_one_byte_field >> 1);
1280 return memcmp(s1, s2, length) == 0;
1284 byte* DuplicateFinder::BackupKey(Vector<const uint8_t> bytes,
1286 uint32_t one_byte_length = (bytes.length() << 1) | (is_one_byte ? 1 : 0);
1290 if (one_byte_length >= (1 << 7)) {
1291 if (one_byte_length >= (1 << 14)) {
1292 if (one_byte_length >= (1 << 21)) {
1293 if (one_byte_length >= (1 << 28)) {
1295 static_cast<uint8_t>((one_byte_length >> 28) | 0x80));
1298 static_cast<uint8_t>((one_byte_length >> 21) | 0x80u));
1301 static_cast<uint8_t>((one_byte_length >> 14) | 0x80u));
1303 backing_store_.
Add(static_cast<uint8_t>((one_byte_length >> 7) | 0x80u));
1305 backing_store_.
Add(static_cast<uint8_t>(one_byte_length & 0x7f));
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter NULL
bool IsIdentifierPart(unibrow::uchar c)
Handle< String > NewStringFromOneByte(Vector< const uint8_t > str, PretenureFlag pretenure=NOT_TENURED)
int FindSymbol(DuplicateFinder *finder, int value)
int AddOneByteSymbol(Vector< const uint8_t > key, int value)
bool IsWhiteSpace(unibrow::uchar c)
Scanner(UnicodeCache *scanner_contants)
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function not JSFunction itself flushes the cache of optimized code for closures on every GC functions with arguments object maximum number of escape analysis fix point iterations allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms concurrent on stack replacement do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes number of stack frames inspected by the profiler percentage of ICs that must have type info to allow optimization extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long expose natives in global object expose freeBuffer extension expose gc extension under the specified name expose externalize string extension number of stack frames to capture disable builtin natives files print name of functions for which code is generated use random jit cookie to mask large constants trace lazy optimization use adaptive optimizations always try to OSR functions trace optimize function deoptimization minimum length for automatic enable preparsing maximum number of optimization attempts before giving up cache prototype transitions trace debugging JSON request response trace out of bounds accesses to external arrays trace_js_array_abuse automatically set the debug break flag when debugger commands are in the queue abort by crashing maximum length of function source code printed in a stack trace max size of the new max size of the old max size of executable always perform global GCs print one trace line following each garbage collection do not print trace line after scavenger collection print statistics of the maximum memory committed for the heap in only print modified registers Don t break for ASM_UNIMPLEMENTED_BREAK macros print stack trace when an illegal exception is thrown randomize hashes to avoid predictable hash Fixed seed to use to hash property Print the time it takes to deserialize the snapshot testing_bool_flag testing_int_flag string flag tmp file in which to serialize heap Print the time it takes to lazily compile hydrogen code stubs concurrent_recompilation concurrent_sweeping Print usage including on console Map counters to a file Enable debugger compile events enable GDBJIT enable GDBJIT interface for all code objects dump only objects containing this substring stress the GC compactor to flush out pretty print source code print source AST function name where to insert a breakpoint print scopes for builtins trace contexts operations print stuff during garbage collection report code statistics after GC report handles after GC trace cache state transitions print interface inference details prints when objects are turned into dictionaries report heap spill statistics along with trace isolate state changes trace regexp bytecode execution Minimal Log all events to the log file Log API events to the log file Log heap samples on garbage collection for the hp2ps tool log positions Log suspect operations Used with turns on browser compatible mode for profiling v8 log
#define ASSERT(condition)
virtual void LogTwoByteSymbol(int start, Vector< const uint16_t > literal)
#define KEYWORD(keyword, token)
double StringToDouble(UnicodeCache *unicode_cache, const char *str, int flags, double empty_string_val)
Vector< T > AddBlock(int size, T initial_value)
int AddTwoByteSymbol(Vector< const uint16_t > key, int value)
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function not JSFunction itself flushes the cache of optimized code for closures on every GC functions with arguments object maximum number of escape analysis fix point iterations allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms concurrent on stack replacement do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes number of stack frames inspected by the profiler percentage of ICs that must have type info to allow optimization extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long expose natives in global object expose freeBuffer extension expose gc extension under the specified name expose externalize string extension number of stack frames to capture disable builtin natives files print name of functions for which code is generated use random jit cookie to mask large constants trace lazy optimization use adaptive optimizations always try to OSR functions trace optimize function deoptimization minimum length for automatic enable preparsing maximum number of optimization attempts before giving up cache prototype transitions trace debugging JSON request response trace out of bounds accesses to external arrays trace_js_array_abuse automatically set the debug break flag when debugger commands are in the queue abort by crashing maximum length of function source code printed in a stack trace max size of the new max size of the old max size of executable always perform global GCs print one trace line following each garbage collection do not print trace line after scavenger collection print statistics of the maximum memory committed for the heap in only print modified registers Don t break for ASM_UNIMPLEMENTED_BREAK macros print stack trace when an illegal exception is thrown randomize hashes to avoid predictable hash Fixed seed to use to hash property Print the time it takes to deserialize the snapshot testing_bool_flag testing_int_flag string flag tmp file in which to serialize heap Print the time it takes to lazily compile hydrogen code stubs concurrent_recompilation concurrent_sweeping Print usage including flags
const char * DoubleToCString(double v, Vector< char > buffer)
void SeekForward(int pos)
#define KEYWORD_GROUP_CASE(ch)
int AddNumber(Vector< const uint8_t > key, int value)
#define KEYWORDS(KEYWORD_GROUP, KEYWORD)
bool IsBinaryDigit(uc32 c)
Entry * Lookup(void *key, uint32_t hash, bool insert, AllocationPolicy allocator=AllocationPolicy())
Handle< String > NewStringFromTwoByte(Vector< const uc16 > str, PretenureFlag pretenure=NOT_TENURED)
void Initialize(Utf16CharacterStream *source)
bool IsLineTerminator(unibrow::uchar c)
int StrLength(const char *string)
int FindNumber(DuplicateFinder *finder, int value)
bool IsCarriageReturn(uc32 c)
Handle< String > InternalizeTwoByteString(Vector< const uc16 > str)
Vector< T > EndSequence()
Handle< String > InternalizeOneByteString(Vector< const uint8_t > str)
void LogSymbol(ParserRecorder *log, int position)
#define ASSERT_EQ(v1, v2)
bool IsOctalDigit(uc32 c)
Handle< String > AllocateNextLiteralString(Isolate *isolate, PretenureFlag tenured)
virtual void LogOneByteSymbol(int start, Vector< const uint8_t > literal)
bool IsIdentifierStart(unibrow::uchar c)
unsigned SeekForward(unsigned code_unit_count)
bool ScanRegExpPattern(bool seen_equal)
Handle< String > AllocateInternalizedString(Isolate *isolate)
bool IsDecimalDigit(uc32 c)