From 9a16d186a6373a7d7aeadd9ca2dec8813ab4aa16 Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Sun, 27 Jul 2014 13:03:39 -0400 Subject: [PATCH] prevent merging of type error code from different locations. fixes #7372 --- src/builtins.c | 6 ++++++ src/cgutils.cpp | 5 +++-- src/codegen.cpp | 6 +++--- src/julia.h | 2 ++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/builtins.c b/src/builtins.c index 393100db0e62e..900c6a118dd44 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -84,6 +84,12 @@ void jl_type_error_rt(const char *fname, const char *context, jl_throw(ex); } +void jl_type_error_rt_line(const char *fname, const char *context, + jl_value_t *ty, jl_value_t *got, int line) +{ + jl_type_error_rt(fname, context, ty, got); +} + void jl_type_error(const char *fname, jl_value_t *expected, jl_value_t *got) { jl_type_error_rt(fname, "", expected, got); diff --git a/src/cgutils.cpp b/src/cgutils.cpp index b39d1d7cf6895..d9ed4325ac878 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -770,9 +770,10 @@ static void emit_type_error(Value *x, jl_value_t *type, const std::string &msg, ArrayRef(zeros)); Value *msg_val = builder.CreateGEP(stringConst(msg), ArrayRef(zeros)); - builder.CreateCall4(prepare_call(jltypeerror_func), + builder.CreateCall5(prepare_call(jltypeerror_func), fname_val, msg_val, - literal_pointer_val(type), boxed(x,ctx)); + literal_pointer_val(type), boxed(x,ctx), + ConstantInt::get(T_int32, ctx->lineno)); } static void emit_typecheck(Value *x, jl_value_t *type, const std::string &msg, diff --git a/src/codegen.cpp b/src/codegen.cpp index 57ee3efca8789..880152e875de2 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -4116,13 +4116,13 @@ static void init_julia_llvm_env(Module *m) te_args.push_back(T_pint8); te_args.push_back(jl_pvalue_llvmt); te_args.push_back(jl_pvalue_llvmt); + te_args.push_back(T_int32); jltypeerror_func = Function::Create(FunctionType::get(T_void, te_args, false), Function::ExternalLinkage, - "jl_type_error_rt", m); + "jl_type_error_rt_line", m); jltypeerror_func->setDoesNotReturn(); - add_named_global(jltypeerror_func, - (void*)&jl_type_error_rt); + add_named_global(jltypeerror_func, (void*)&jl_type_error_rt_line); std::vector args_2ptrs(0); args_2ptrs.push_back(jl_pvalue_llvmt); diff --git a/src/julia.h b/src/julia.h index 8d75a4555d3d3..da529eb990f89 100644 --- a/src/julia.h +++ b/src/julia.h @@ -835,6 +835,8 @@ DLLEXPORT void jl_too_many_args(const char *fname, int max); DLLEXPORT void jl_type_error(const char *fname, jl_value_t *expected, jl_value_t *got); DLLEXPORT void jl_type_error_rt(const char *fname, const char *context, jl_value_t *ty, jl_value_t *got); +DLLEXPORT void jl_type_error_rt_line(const char *fname, const char *context, + jl_value_t *ty, jl_value_t *got, int line); jl_value_t *jl_no_method_error(jl_function_t *f, jl_value_t **args, size_t na); DLLEXPORT void jl_undefined_var_error(jl_sym_t *var); void jl_check_type_tuple(jl_tuple_t *t, jl_sym_t *name, const char *ctx);