lexer->prev_start = lexer->start;
+ if (lexer->lexer_token != NULL) {
+ lexer->prev_token = lexer->lexer_token->token;
+ nxt_mp_free(vm->mem_pool, lexer->lexer_token);
+ }
+
if (nxt_queue_is_empty(&lexer->preread)) {
lt = njs_lexer_token_push(vm, lexer);
if (nxt_slow_path(lt == NULL)) {
}
}
- lt = njs_lexer_token_pop(lexer);
-
- if (lexer->lexer_token != NULL && lexer->lexer_token != lt) {
- lexer->prev_token = lexer->lexer_token->token;
- nxt_mp_free(vm->mem_pool, lexer->lexer_token);
- }
-
- lexer->lexer_token = lt;
+ lexer->lexer_token = njs_lexer_token_pop(lexer);
return njs_lexer_token_name_resolve(lexer, lexer->lexer_token);
}
}
+nxt_int_t
+njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer)
+{
+ njs_lexer_token_t *lt;
+
+ lt = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_lexer_token_t));
+ if (nxt_slow_path(lt == NULL)) {
+ return NXT_ERROR;
+ }
+
+ *lt = *lexer->lexer_token;
+
+ nxt_queue_insert_head(&lexer->preread, <->link);
+
+ return NXT_OK;
+}
+
+
static njs_token_t
njs_lexer_token_name_resolve(njs_lexer_t *lexer, njs_lexer_token_t *lt)
{
njs_token_t njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer);
njs_token_t njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer,
size_t offset);
+nxt_int_t njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer);
nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
void njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt);
-#define njs_lexer_rollback(lexer) \
- do { \
- nxt_queue_insert_head(&(lexer)->preread, &(lexer)->lexer_token->link); \
- } while (0)
-
#endif /* _NJS_LEXER_H_INCLUDED_ */
njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser,
njs_token_t token)
{
+ nxt_int_t ret;
njs_parser_node_t *node;
njs_vmcode_operation_t operation;
/* Automatic semicolon insertion. */
if (parser->lexer->prev_token == NJS_TOKEN_LINE_END) {
- njs_lexer_rollback(parser->lexer);
+ ret = njs_lexer_rollback(vm, parser->lexer);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return NJS_TOKEN_ERROR;
+ }
+
return NJS_TOKEN_SEMICOLON;
}