Skip to content

Commit

Permalink
fix #20804, keyword args in defining UnionAll-typed function
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed Feb 25, 2017
1 parent 399da3c commit 495114c
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 4 deletions.
2 changes: 1 addition & 1 deletion base/boot.jl
Expand Up @@ -236,7 +236,7 @@ eval(m::Module, e::ANY) = ccall(:jl_toplevel_eval_in, Any, (Any, Any), m, e)

kwfunc(f::ANY) = ccall(:jl_get_keyword_sorter, Any, (Any,), f)

kwftype(t::ANY) = typeof(ccall(:jl_get_kwsorter, Any, (Any,), t.name))
kwftype(t::ANY) = typeof(ccall(:jl_get_kwsorter, Any, (Any,), t))

mutable struct Box
contents::Any
Expand Down
2 changes: 1 addition & 1 deletion src/dump.c
Expand Up @@ -1366,7 +1366,7 @@ static jl_value_t *jl_deserialize_datatype(jl_serializer_state *s, int pos, jl_v
}
if (tag == 9) {
jl_datatype_t *primarydt = (jl_datatype_t*)jl_deserialize_value(s, NULL);
jl_value_t *dtv = jl_typeof(jl_get_kwsorter(primarydt->name));
jl_value_t *dtv = jl_typeof(jl_get_kwsorter((jl_value_t*)primarydt));
backref_list.items[pos] = dtv;
return dtv;
}
Expand Down
6 changes: 5 additions & 1 deletion src/gf.c
Expand Up @@ -2402,8 +2402,12 @@ jl_function_t *jl_new_generic_function_with_supertype(jl_sym_t *name, jl_module_
return (jl_function_t*)f;
}

JL_DLLEXPORT jl_function_t *jl_get_kwsorter(jl_typename_t *tn)
JL_DLLEXPORT jl_function_t *jl_get_kwsorter(jl_value_t *ty)
{
jl_datatype_t *dt = jl_argument_datatype(ty);
if (dt == NULL)
jl_error("cannot get keyword sorter for abstract type");
jl_typename_t *tn = dt->name;
jl_methtable_t *mt = tn->mt;
if (!mt->kwsorter) {
JL_LOCK(&mt->writelock);
Expand Down
2 changes: 1 addition & 1 deletion src/julia.h
Expand Up @@ -1038,7 +1038,7 @@ JL_DLLEXPORT void jl_method_def(jl_svec_t *argdata, jl_code_info_t *f, jl_value_
JL_DLLEXPORT jl_code_info_t *jl_code_for_staged(jl_method_instance_t *linfo);
JL_DLLEXPORT jl_code_info_t *jl_copy_code_info(jl_code_info_t *src);
JL_DLLEXPORT size_t jl_get_world_counter(void);
JL_DLLEXPORT jl_function_t *jl_get_kwsorter(jl_typename_t *tn);
JL_DLLEXPORT jl_function_t *jl_get_kwsorter(jl_value_t *ty);
JL_DLLEXPORT jl_value_t *jl_box_bool(int8_t x);
JL_DLLEXPORT jl_value_t *jl_box_int8(int8_t x);
JL_DLLEXPORT jl_value_t *jl_box_uint8(uint8_t x);
Expand Down
1 change: 1 addition & 0 deletions src/julia_internal.h
Expand Up @@ -375,6 +375,7 @@ jl_method_instance_t *jl_method_lookup(jl_methtable_t *mt, jl_value_t **args, si
jl_value_t *jl_gf_invoke(jl_tupletype_t *types, jl_value_t **args, size_t nargs);

JL_DLLEXPORT jl_datatype_t *jl_first_argument_datatype(jl_value_t *argtypes);
jl_datatype_t *jl_argument_datatype(jl_value_t *argt);

jl_value_t *jl_nth_slot_type(jl_value_t *sig, size_t i);
void jl_compute_field_offsets(jl_datatype_t *st);
Expand Down
6 changes: 6 additions & 0 deletions src/method.c
Expand Up @@ -576,6 +576,12 @@ JL_DLLEXPORT jl_datatype_t *jl_first_argument_datatype(jl_value_t *argtypes)
return first_arg_datatype(argtypes, 0);
}

// get DataType implied by a single given type
jl_datatype_t *jl_argument_datatype(jl_value_t *argt)
{
return first_arg_datatype(argt, 1);
}

extern tracer_cb jl_newmeth_tracer;
JL_DLLEXPORT void jl_method_def(jl_svec_t *argdata,
jl_code_info_t *f,
Expand Down
10 changes: 10 additions & 0 deletions test/keywordargs.jl
Expand Up @@ -248,3 +248,13 @@ f7045(x::Real; y=true) = y ? 2 : 3
@test f7045(1.0) === 1
@test f7045(1, y=false) === 3
@test f7045(1.0, y=false) === 3

# issue #20804
struct T20804{T}
y::T
end
(f::T20804)(;x=10) = f.y + x
let x = T20804(4)
@test x() == 14
@test x(x=8) == 12
end

0 comments on commit 495114c

Please sign in to comment.