Skip to content

Commit

Permalink
first step to introducing modules, making them first-class (add Modul…
Browse files Browse the repository at this point in the history
…e type)

required some reorganization of initialization to isolate code that creates global name bindings
  • Loading branch information
JeffBezanson committed Jan 14, 2012
1 parent 0f8aafe commit 30bdf1c
Show file tree
Hide file tree
Showing 11 changed files with 205 additions and 180 deletions.
5 changes: 4 additions & 1 deletion src/alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ jl_struct_type_t *jl_topnode_type;
jl_bits_type_t *jl_intrinsic_type;
jl_struct_type_t *jl_methtable_type;
jl_struct_type_t *jl_lambda_info_type;
jl_struct_type_t *jl_module_type;
jl_struct_type_t *jl_errorexception_type=NULL;
jl_struct_type_t *jl_typeerror_type;
jl_struct_type_t *jl_loaderror_type;
Expand Down Expand Up @@ -282,7 +283,8 @@ DLLEXPORT
jl_lambda_info_t *jl_new_lambda_info(jl_value_t *ast, jl_tuple_t *sparams)
{
jl_lambda_info_t *li =
(jl_lambda_info_t*)newobj((jl_type_t*)jl_lambda_info_type, 15);
(jl_lambda_info_t*)newobj((jl_type_t*)jl_lambda_info_type,
LAMBDA_INFO_NW);
li->ast = ast;
li->file = (jl_value_t*)null_sym;
li->line = jl_box_long(0);
Expand All @@ -293,6 +295,7 @@ jl_lambda_info_t *jl_new_lambda_info(jl_value_t *ast, jl_tuple_t *sparams)
li->line = jl_exprarg(body1, 0);
}
}
li->module = jl_system_module;
li->sparams = sparams;
li->tfunc = (jl_value_t*)jl_null;
li->fptr = NULL;
Expand Down
13 changes: 3 additions & 10 deletions src/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -1230,16 +1230,6 @@ static void add_builtin_func(const char *name, jl_fptr_t f)
add_builtin(name, (jl_value_t*)jl_new_closure(f, NULL));
}

void jl_add_builtin_func(const char *name, jl_fptr_t f)
{
return add_builtin_func(name, f);
}

void jl_add_builtin(const char *name, jl_value_t *v)
{
return add_builtin(name, v);
}

void jl_init_primitives(void)
{
add_builtin_func("is", jl_f_is);
Expand All @@ -1256,6 +1246,7 @@ void jl_init_primitives(void)
add_builtin_func("invoke", jl_f_invoke);
add_builtin_func("eval", jl_f_top_eval);
add_builtin_func("isbound", jl_f_isbound);
add_builtin_func("yieldto", jl_f_yieldto);

// functions for internal use
add_builtin_func("tupleref", jl_f_tupleref);
Expand Down Expand Up @@ -1299,12 +1290,14 @@ void jl_init_primitives(void)
// todo: this should only be visible to compiler components
add_builtin("Undef", (jl_value_t*)jl_undef_type);

add_builtin("Module", (jl_value_t*)jl_module_type);
add_builtin("Symbol", (jl_value_t*)jl_sym_type);
add_builtin("IntrinsicFunction", (jl_value_t*)jl_intrinsic_type);
add_builtin("Function", (jl_value_t*)jl_function_type);
add_builtin("LambdaStaticData", (jl_value_t*)jl_lambda_info_type);
add_builtin("Ptr", (jl_value_t*)jl_pointer_type);
add_builtin("Box", (jl_value_t*)jl_box_type);
add_builtin("Task", (jl_value_t*)jl_task_type);

add_builtin("AbstractArray", (jl_value_t*)jl_abstractarray_type);
add_builtin("Array", (jl_value_t*)jl_array_type);
Expand Down
48 changes: 46 additions & 2 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2024,7 +2024,7 @@ static void init_julia_llvm_env(Module *m)
FPM->doInitialization();
}

extern "C" void jl_init_codegen()
extern "C" void jl_init_codegen(void)
{
#ifdef DEBUG
llvm::JITEmitDebugInfo = true;
Expand All @@ -2040,9 +2040,53 @@ extern "C" void jl_init_codegen()

init_julia_llvm_env(jl_Module);

jl_init_intrinsic_functions();
jl_jit_events = new JuliaJITEventListener();
jl_ExecutionEngine->RegisterJITEventListener(jl_jit_events);

BOX_F(int8,int32); BOX_F(uint8,uint32);
BOX_F(int16,int16); BOX_F(uint16,uint16);
BOX_F(int32,int32); BOX_F(uint32,uint32);
BOX_F(int64,int64); BOX_F(uint64,uint64);
BOX_F(float32,float32); BOX_F(float64,float64);
BOX_F(char,char);

box8_func = boxfunc_llvm(ft2arg(jl_pvalue_llvmt, jl_pvalue_llvmt, T_int8),
"jl_box8", (void*)*jl_box8);
box16_func = boxfunc_llvm(ft2arg(jl_pvalue_llvmt, jl_pvalue_llvmt, T_int16),
"jl_box16", (void*)*jl_box16);
box32_func = boxfunc_llvm(ft2arg(jl_pvalue_llvmt, jl_pvalue_llvmt, T_int32),
"jl_box32", (void*)*jl_box32);
box64_func = boxfunc_llvm(ft2arg(jl_pvalue_llvmt, jl_pvalue_llvmt, T_int64),
"jl_box64", (void*)*jl_box64);

std::vector<Type*> toptrargs(0);
toptrargs.push_back(jl_pvalue_llvmt);
toptrargs.push_back(jl_pvalue_llvmt);
toptrargs.push_back(T_int32);
value_to_pointer_func =
Function::Create(FunctionType::get(T_pint8, toptrargs, false),
Function::ExternalLinkage, "jl_value_to_pointer",
jl_Module);
jl_ExecutionEngine->addGlobalMapping(value_to_pointer_func,
(void*)&jl_value_to_pointer);

temp_arg_area = (char*)allocb_permanent(arg_area_sz);
arg_area_loc = 0;

std::vector<Type*> noargs(0);
save_arg_area_loc_func =
Function::Create(FunctionType::get(T_uint64, noargs, false),
Function::ExternalLinkage, "save_arg_area_loc",
jl_Module);
jl_ExecutionEngine->addGlobalMapping(save_arg_area_loc_func,
(void*)&save_arg_area_loc);

restore_arg_area_loc_func =
Function::Create(ft1arg(T_void, T_uint64),
Function::ExternalLinkage, "restore_arg_area_loc",
jl_Module);
jl_ExecutionEngine->addGlobalMapping(restore_arg_area_loc_func,
(void*)&restore_arg_area_loc);
}

/*
Expand Down
144 changes: 85 additions & 59 deletions src/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ static ptrint_t VALUE_TAGS;
// pointers to non-AST-ish objects in a compressed tree
static jl_array_t *tree_literal_values=NULL;

// queue of IdTables to rehash
static jl_array_t *idtable_list=NULL;
static jl_value_t *jl_idtable_type=NULL;
void jl_idtable_rehash(jl_array_t **pa, size_t newsz);

#define write_uint8(s, n) ios_putc((n), (s))
#define read_uint8(s) ((uint8_t)ios_getc(s))
#define write_int8(s, n) write_uint8(s, n)
Expand Down Expand Up @@ -167,6 +172,33 @@ static void jl_serialize_typecache(ios_t *s, jl_typename_t *tn)
jl_serialize_value(s, NULL);
}

static void jl_serialize_module(ios_t *s, jl_module_t *m)
{
writetag(s, jl_module_type);
jl_serialize_value(s, m->name);
size_t i;
void **table = m->bindings.table;
for(i=1; i < m->bindings.size; i+=2) {
if (table[i] != HT_NOTFOUND) {
jl_binding_t *b = (jl_binding_t*)table[i];
jl_serialize_value(s, b->name);
jl_serialize_value(s, b->value);
jl_serialize_value(s, b->type);
write_int8(s, b->constp);
write_int8(s, b->exportp);
}
}
jl_serialize_value(s, NULL);
table = m->macros.table;
for(i=1; i < m->macros.size; i+=2) {
if (table[i] != HT_NOTFOUND) {
jl_serialize_value(s, table[i-1]);
jl_serialize_value(s, table[i]);
}
}
jl_serialize_value(s, NULL);
}

static int is_ast_node(jl_value_t *v)
{
return jl_is_symbol(v) || jl_is_expr(v) ||
Expand Down Expand Up @@ -322,6 +354,10 @@ static void jl_serialize_value_(ios_t *s, jl_value_t *v)
jl_serialize_value(s, (jl_value_t*)li->inferred);
jl_serialize_value(s, (jl_value_t*)li->file);
jl_serialize_value(s, (jl_value_t*)li->line);
jl_serialize_value(s, (jl_value_t*)li->module);
}
else if (jl_typeis(v, jl_module_type)) {
jl_serialize_module(s, (jl_module_t*)v);
}
else if (jl_typeis(v, jl_methtable_type)) {
writetag(s, jl_methtable_type);
Expand Down Expand Up @@ -353,38 +389,16 @@ static void jl_serialize_value_(ios_t *s, jl_value_t *v)
jl_value_t *fld = ((jl_value_t**)v)[i+1];
jl_serialize_value(s, fld);
}
if (t == jl_idtable_type) {
jl_cell_1d_push(idtable_list, v);
}
}
else {
assert(0);
}
}
}

static void jl_serialize_module(ios_t *s, jl_module_t *m)
{
size_t i;
void **table = m->bindings.table;
for(i=1; i < m->bindings.size; i+=2) {
if (table[i] != HT_NOTFOUND) {
jl_binding_t *b = (jl_binding_t*)table[i];
jl_serialize_value(s, b->name);
jl_serialize_value(s, b->value);
jl_serialize_value(s, b->type);
write_int8(s, b->constp);
write_int8(s, b->exportp);
}
}
jl_serialize_value(s, NULL);
table = m->macros.table;
for(i=1; i < m->macros.size; i+=2) {
if (table[i] != HT_NOTFOUND) {
jl_serialize_value(s, table[i-1]);
jl_serialize_value(s, table[i]);
}
}
jl_serialize_value(s, NULL);
}

htable_t *jl_gc_get_finalizer_table();
/*
static void jl_serialize_finalizers(ios_t *s)
Expand Down Expand Up @@ -527,9 +541,6 @@ static typekey_stack_t *jl_deserialize_typecache(ios_t *s)
return tk;
}

jl_struct_type_t *jl_idtable_type=NULL;
void jl_idtable_rehash(jl_array_t **pa, size_t newsz);

static jl_value_t *jl_deserialize_value(ios_t *s)
{
int pos = ios_pos(s);
Expand Down Expand Up @@ -659,7 +670,8 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
}
else if (vtag == (jl_value_t*)jl_lambda_info_type) {
jl_lambda_info_t *li =
(jl_lambda_info_t*)newobj((jl_type_t*)jl_lambda_info_type, 15);
(jl_lambda_info_t*)newobj((jl_type_t*)jl_lambda_info_type,
LAMBDA_INFO_NW);
if (usetable)
ptrhash_put(&backref_table, (void*)(ptrint_t)pos, li);
li->ast = jl_deserialize_value(s);
Expand All @@ -671,6 +683,7 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
li->inferred = jl_deserialize_value(s);
li->file = jl_deserialize_value(s);
li->line = jl_deserialize_value(s);
li->module = (jl_module_t*)jl_deserialize_value(s);

li->fptr = NULL;
li->roots = NULL;
Expand All @@ -680,6 +693,30 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
li->unspecialized = NULL;
return (jl_value_t*)li;
}
else if (vtag == (jl_value_t*)jl_module_type) {
jl_module_t *m = jl_new_module(anonymous_sym);
if (usetable)
ptrhash_put(&backref_table, (void*)(ptrint_t)pos, m);
m->name = (jl_sym_t*)jl_deserialize_value(s);
while (1) {
jl_value_t *name = jl_deserialize_value(s);
if (name == NULL)
break;
jl_binding_t *b = jl_get_binding(m, (jl_sym_t*)name);
b->value = jl_deserialize_value(s);
b->type = (jl_type_t*)jl_deserialize_value(s);
b->constp = read_int8(s);
b->exportp = read_int8(s);
}
while (1) {
jl_value_t *name = jl_deserialize_value(s);
if (name == NULL)
break;
jl_set_expander(m, (jl_sym_t*)name,
(jl_function_t*)jl_deserialize_value(s));
}
return (jl_value_t*)m;
}
else if (vtag == (jl_value_t*)jl_methtable_type) {
jl_methtable_t *mt = (jl_methtable_t*)allocobj(sizeof(jl_methtable_t));
if (usetable)
Expand Down Expand Up @@ -737,10 +774,6 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
}
if (nf == 0 && typ->instance==NULL)
typ->instance = v;
if (typ == jl_idtable_type) {
jl_idtable_rehash(&((jl_array_t**)v)[1],
((jl_array_t**)v)[1]->length);
}
// TODO: put WeakRefs on the weak_refs list
return v;
}
Expand All @@ -751,26 +784,6 @@ static jl_value_t *jl_deserialize_value(ios_t *s)
return NULL;
}

static void jl_deserialize_module(ios_t *s, jl_module_t *m)
{
while (1) {
jl_value_t *name = jl_deserialize_value(s);
if (name == NULL)
break;
jl_binding_t *b = jl_get_binding(m, (jl_sym_t*)name);
b->value = jl_deserialize_value(s);
b->type = (jl_type_t*)jl_deserialize_value(s);
b->constp = read_int8(s);
b->exportp = read_int8(s);
}
while (1) {
jl_value_t *name = jl_deserialize_value(s);
if (name == NULL)
break;
jl_set_expander(m, (jl_sym_t*)name,
(jl_function_t*)jl_deserialize_value(s));
}
}
/*
static void jl_deserialize_finalizers(ios_t *s)
{
Expand All @@ -797,16 +810,20 @@ void jl_save_system_image(char *fname, char *startscriptname)
ios_t f;
ios_file(&f, fname, 1, 1, 1, 1);

jl_serialize_value(&f, jl_get_global(jl_system_module,
jl_symbol("IdTable")));
jl_idtable_type = jl_get_global(jl_system_module, jl_symbol("IdTable"));
idtable_list = jl_alloc_cell_1d(0);

jl_serialize_value(&f, jl_array_type->env);
jl_serialize_typecache(&f, jl_array_type->name);
jl_serialize_typecache(&f, jl_type_type->name);
jl_serialize_typecache(&f, jl_pointer_type->name);
jl_serialize_typecache(&f, jl_seq_type->name);
jl_serialize_typecache(&f, jl_abstractarray_type->name);

jl_serialize_module(&f, jl_system_module);
jl_serialize_value(&f, jl_system_module);

jl_serialize_value(&f, idtable_list);

//jl_serialize_finalizers(&f);
write_int32(&f, jl_get_t_uid_ctr());
write_int32(&f, jl_get_gs_ctr());
Expand Down Expand Up @@ -845,15 +862,22 @@ void jl_restore_system_image(char *fname)
jl_gc_disable();
#endif

jl_idtable_type = (jl_struct_type_t*)jl_deserialize_value(&f);
jl_array_type->env = jl_deserialize_value(&f);
jl_array_type->name->cache = jl_deserialize_typecache(&f);
jl_type_type->name->cache = jl_deserialize_typecache(&f);
jl_pointer_type->name->cache = jl_deserialize_typecache(&f);
jl_seq_type->name->cache = jl_deserialize_typecache(&f);
jl_abstractarray_type->name->cache = jl_deserialize_typecache(&f);

jl_deserialize_module(&f, jl_system_module);
jl_system_module = (jl_module_t*)jl_deserialize_value(&f);

jl_array_t *idtl = (jl_array_t*)jl_deserialize_value(&f);
// rehash IdTables
for(int i=0; i < idtl->length; i++) {
jl_value_t *v = jl_cellref(idtl, i);
jl_idtable_rehash(&((jl_array_t**)v)[1],
((jl_array_t**)v)[1]->length);
}

jl_get_builtin_hooks();
jl_array_uint8_type =
Expand Down Expand Up @@ -951,6 +975,7 @@ void jl_init_serializer(void)
(void*)LongExpr_tag, (void*)LiteralVal_tag,
jl_intrinsic_type, jl_methtable_type,
jl_typename_type, jl_lambda_info_type, jl_tvar_type,
jl_module_type,

jl_null, jl_any_type, jl_symbol("Any"),
jl_symbol("Array"), jl_symbol("TypeVar"),
Expand Down Expand Up @@ -1051,7 +1076,8 @@ void jl_init_serializer(void)
jl_typename_type->name, jl_type_type->name, jl_methtable_type->name,
jl_tvar_type->name,
jl_seq_type->name, jl_ntuple_type->name, jl_abstractarray_type->name,
jl_lambda_info_type->name, jl_box_type->name,
jl_lambda_info_type->name, jl_module_type->name,
jl_box_type->name,
jl_typector_type->name, jl_intrinsic_type->name, jl_undef_type->name,
jl_task_type->name,
jl_labelnode_type->name, jl_linenumbernode_type->name,
Expand Down
Loading

1 comment on commit 30bdf1c

@o-jasper
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: if there are modules, maybe you can allow people to specify dependencies for a module? Maybe also check for them, and give an error/warning if not all were specified.(or alternatively make the developer admit he is not taking it seriously enough)

Also nested namespaces could be used to make where test/examples/gui code etcetera standard for instance like this Section "Usage of package-project", bit of a plug, does Julia have an expression hook yet?(or is all such information already available?) Edit: this is where feature requests go, sorry.

Please sign in to comment.