This closes #94 issue on Github.
static nxt_int_t njs_generate_function_debug(njs_vm_t *vm, nxt_str_t *name,
njs_function_lambda_t *lambda, njs_parser_node_t *node);
-static void njs_generate_syntax_error(njs_vm_t *vm, njs_parser_node_t *node,
- const char *fmt, ...);
-
#define njs_generate_code(generator, type, code) \
do { \
njs_code_offset_diff(generator, patch->jump_offset)
+#define njs_generate_syntax_error(vm, node, fmt, ...) \
+ njs_parser_node_error(vm, node, NJS_OBJECT_SYNTAX_ERROR, fmt, ##__VA_ARGS__)
+
static const nxt_str_t no_label = { 0, NULL };
return NXT_OK;
}
-
-
-static void
-njs_generate_syntax_error(njs_vm_t *vm, njs_parser_node_t *node,
- const char *fmt, ...)
-{
- size_t width;
- u_char msg[NXT_MAX_ERROR_STR];
- u_char *p, *end;
- va_list args;
- njs_parser_scope_t *scope;
-
- p = msg;
- end = msg + NXT_MAX_ERROR_STR;
-
- va_start(args, fmt);
- p = nxt_vsprintf(p, end, fmt, args);
- va_end(args);
-
- scope = node->scope;
-
- width = nxt_length(" in ") + scope->file.length + NXT_INT_T_LEN;
-
- if (p > end - width) {
- p = end - width;
- }
-
- if (scope->file.start != NULL) {
- p = nxt_sprintf(p, end, " in %V:%uD", &scope->file, node->token_line);
-
- } else {
- p = nxt_sprintf(p, end, " in %uD", node->token_line);
- }
-
- njs_error_new(vm, &vm->retval, NJS_OBJECT_SYNTAX_ERROR, msg, p - msg);
-}
case NJS_TOKEN_NAME:
nxt_thread_log_debug("JS: %V", name);
+ node->token_line = parser->lexer->token_line;
+
ext = njs_external_lookup(vm, name, hash);
if (ext != NULL) {
}
-void
-njs_parser_error(njs_vm_t *vm, njs_parser_t *parser, njs_value_type_t type,
- const char *fmt, ...)
+static void
+njs_parser_scope_error(njs_vm_t *vm, njs_parser_scope_t *scope,
+ njs_value_type_t type, uint32_t line, const char *fmt, va_list args)
{
- size_t width;
- u_char *p, *end;
- u_char msg[NXT_MAX_ERROR_STR];
- va_list args;
- njs_lexer_t *lexer;
+ size_t width;
+ u_char msg[NXT_MAX_ERROR_STR];
+ u_char *p, *end;
+ nxt_str_t *file;
+
+ file = &scope->file;
p = msg;
end = msg + NXT_MAX_ERROR_STR;
- va_start(args, fmt);
p = nxt_vsprintf(p, end, fmt, args);
- va_end(args);
- lexer = parser->lexer;
-
- width = nxt_length(" in ") + lexer->file.length + NXT_INT_T_LEN;
+ width = nxt_length(" in ") + file->length + NXT_INT_T_LEN;
if (p > end - width) {
p = end - width;
}
- if (lexer->file.start != NULL) {
- p = nxt_sprintf(p, end, " in %V:%uD", &lexer->file, lexer->line);
+ if (file->start != NULL) {
+ p = nxt_sprintf(p, end, " in %V:%uD", file, line);
} else {
- p = nxt_sprintf(p, end, " in %uD", lexer->line);
+ p = nxt_sprintf(p, end, " in %uD", line);
}
njs_error_new(vm, &vm->retval, type, msg, p - msg);
- }
+}
+
+
+void
+njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
+ njs_value_type_t type, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ njs_parser_scope_error(vm, parser->scope, type, parser->lexer->line, fmt,
+ args);
+ va_end(args);
+}
+
+
+void
+njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
+ njs_value_type_t type, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ njs_parser_scope_error(vm, node->scope, type, node->token_line, fmt, args);
+ va_end(args);
+}
nxt_bool_t njs_parser_has_side_effect(njs_parser_node_t *node);
u_char *njs_parser_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td,
u_char *start);
-void njs_parser_error(njs_vm_t *vm, njs_parser_t *parser,
+void njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
njs_value_type_t type, const char *fmt, ...);
+void njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
+ njs_value_type_t type, const char *fmt, ...);
+
+
+#define njs_parser_syntax_error(vm, parser, fmt, ...) \
+ njs_parser_lexer_error(vm, parser, NJS_OBJECT_SYNTAX_ERROR, fmt, \
+ ##__VA_ARGS__)
-#define njs_parser_syntax_error(vm, parser, fmt, ...) \
- njs_parser_error(vm, parser, NJS_OBJECT_SYNTAX_ERROR, fmt, ##__VA_ARGS__)
-#define njs_parser_ref_error(vm, parser, fmt, ...) \
- njs_parser_error(vm, parser, NJS_OBJECT_REF_ERROR, fmt, ##__VA_ARGS__)
+#define njs_parser_ref_error(vm, parser, fmt, ...) \
+ njs_parser_lexer_error(vm, parser, NJS_OBJECT_REF_ERROR, fmt, ##__VA_ARGS__)
nxt_inline njs_parser_node_t *
not_found:
- njs_parser_ref_error(vm, vm->parser, "\"%V\" is not defined", &vr->name);
+ njs_parser_node_error(vm, node, NJS_OBJECT_REF_ERROR,
+ "\"%V\" is not defined", &vr->name);
return NULL;
}
{ nxt_string("a"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },
+ { nxt_string("\na"),
+ nxt_string("ReferenceError: \"a\" is not defined in 2") },
+
+ { nxt_string("\n\na"),
+ nxt_string("ReferenceError: \"a\" is not defined in 3") },
+
{ nxt_string("a + a"),
nxt_string("ReferenceError: \"a\" is not defined in 1") },