diff --git a/base/boot.jl b/base/boot.jl index 0e8cc513b89d00..ada91f6bdcd84f 100644 --- a/base/boot.jl +++ b/base/boot.jl @@ -74,6 +74,10 @@ #abstract Ref{T} #bitstype {32|64} Ptr{T} <: Ref{T} +#immutable Banana{T} +# value::T +#end + # types for the front end #type Expr @@ -124,6 +128,7 @@ export Any, DataType, Vararg, ANY, NTuple, Tuple, Type, TypeConstructor, TypeName, TypeVar, Union, Void, SimpleVector, AbstractArray, DenseArray, + Banana, # special objects Box, Function, Builtin, IntrinsicFunction, LambdaInfo, Method, MethodTable, Module, Symbol, Task, Array, WeakRef, diff --git a/src/builtins.c b/src/builtins.c index d75442e9ee099a..22a75a804d1df2 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -1146,6 +1146,7 @@ void jl_init_primitives(void) add_builtin("TypeConstructor", (jl_value_t*)jl_typector_type); add_builtin("Tuple", (jl_value_t*)jl_anytuple_type); add_builtin("NTuple", (jl_value_t*)jl_ntuple_type); + add_builtin("Banana", (jl_value_t*)jl_banana_type); add_builtin("Vararg", (jl_value_t*)jl_vararg_type); add_builtin("Type", (jl_value_t*)jl_type_type); add_builtin("DataType", (jl_value_t*)jl_datatype_type); diff --git a/src/cgutils.cpp b/src/cgutils.cpp index 43c011e359d345..07bac700dd94ba 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -898,6 +898,16 @@ static Value *julia_binding_gv(jl_binding_t *b) return julia_binding_gv(bv); } +static int is_banana_type(jl_value_t* t) +{ + assert(jl_is_datatype(t)); + printf("t = %s\n", jl_symbol_name_(((jl_datatype_t*)(t))->name->name)); + printf("jl_banana_type = %s\n", jl_symbol_name_(((jl_datatype_t*)(jl_banana_type))->name->name)); + bool result = ((jl_datatype_t*)(t))->name == ((jl_datatype_t*)(jl_banana_type))->name; + printf("result = %d\n", result); + return result; +} + // --- mapping between julia and llvm types --- static Type *julia_struct_to_llvm(jl_value_t *jt, bool *isboxed); @@ -949,13 +959,6 @@ JL_DLLEXPORT Type *julia_type_to_llvm(jl_value_t *jt, bool *isboxed) } } -static bool is_banana_type(jl_value_t*ty) { - jl_datatype_t *jst = (jl_datatype_t*)ty; - const char *name = jl_symbol_name_(jst->name->name); - size_t ntypes = jl_datatype_nfields(jst); - return ntypes==1 && !jst->mutabl && strcmp(name,"Banana")==0; -} - static Type *julia_struct_to_llvm(jl_value_t *jt, bool *isboxed) { // this function converts a Julia Type into the equivalent LLVM struct diff --git a/src/jltypes.c b/src/jltypes.c index d591bb899e29bf..c3b25b0f54cda8 100644 --- a/src/jltypes.c +++ b/src/jltypes.c @@ -31,6 +31,7 @@ jl_typename_t *jl_tuple_typename; jl_tupletype_t *jl_anytuple_type; jl_datatype_t *jl_ntuple_type; jl_typename_t *jl_ntuple_typename; +jl_datatype_t *jl_banana_type; jl_datatype_t *jl_vararg_type; jl_datatype_t *jl_tvar_type; jl_datatype_t *jl_uniontype_type; @@ -3528,6 +3529,14 @@ void jl_init_types(void) (jl_datatype_t*)jl_apply_type((jl_value_t*)jl_ref_type, tv), tv, sizeof(void*)*8); + // Banana{T} + tv = jl_svec1(tvar("T")); + jl_banana_type = + jl_new_datatype(jl_symbol("Banana"), jl_any_type, tv, + jl_svec(1, jl_symbol("value")), + tv, + 0, 0, 1); + // Type{T} jl_typetype_tvar = jl_new_typevar(jl_symbol("T"), (jl_value_t*)jl_bottom_type,(jl_value_t*)jl_any_type); diff --git a/src/julia.h b/src/julia.h index 2d94fb2aeba57d..f8069525f67b2e 100644 --- a/src/julia.h +++ b/src/julia.h @@ -529,6 +529,7 @@ extern JL_DLLEXPORT jl_datatype_t *jl_symbol_type; extern JL_DLLEXPORT jl_datatype_t *jl_gensym_type; extern JL_DLLEXPORT jl_datatype_t *jl_simplevector_type; extern JL_DLLEXPORT jl_typename_t *jl_tuple_typename; +extern JL_DLLEXPORT jl_datatype_t *jl_banana_type; extern JL_DLLEXPORT jl_datatype_t *jl_anytuple_type; #define jl_tuple_type jl_anytuple_type extern JL_DLLEXPORT jl_datatype_t *jl_ntuple_type;