Skip to content

Instantly share code, notes, and snippets.

@vtjnash
Created December 6, 2016 15:22
Show Gist options
  • Save vtjnash/3775a58db1efe7489e5922ad1eb117f3 to your computer and use it in GitHub Desktop.
Save vtjnash/3775a58db1efe7489e5922ad1eb117f3 to your computer and use it in GitHub Desktop.
diff --git a/src/interpreter.c b/src/interpreter.c
index 5c89505..d84191d9 100644
--- a/src/interpreter.c
+++ b/src/interpreter.c
@@ -246,6 +246,10 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
}
else if (ex->head == method_sym) {
jl_sym_t *fname = (jl_sym_t*)args[0];
+ if (jl_is_globalref(fname)) {
+ modu = jl_globalref_mod(fname);
+ fname = jl_globalref_name(fname);
+ }
assert(jl_expr_nargs(ex) != 1 || jl_is_symbol(fname));
if (jl_is_symbol(fname)) {
@@ -271,18 +275,29 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
return jl_nothing;
}
else if (ex->head == const_sym) {
- jl_value_t *sym = args[0];
+ jl_sym_t *sym = (jl_sym_t*)args[0];
+ if (jl_is_globalref(sym)) {
+ modu = jl_globalref_mod(sym);
+ sym = jl_globalref_name(sym);
+ }
assert(jl_is_symbol(sym));
- jl_binding_t *b = jl_get_binding_wr(modu, (jl_sym_t*)sym);
+ jl_binding_t *b = jl_get_binding_wr(modu, sym);
jl_declare_constant(b);
return (jl_value_t*)jl_nothing;
}
else if (ex->head == global_sym) {
// create uninitialized mutable binding for "global x" decl
// TODO: handle type decls
- for (size_t i=0; i < jl_array_len(ex->args); i++) {
- assert(jl_is_symbol(args[i]));
- jl_get_binding_wr(modu, (jl_sym_t*)args[i]);
+ size_t i, l = jl_array_len(ex->args);
+ for (i = 0; i < l; i++) {
+ jl_sym_t *gsym = (jl_sym_t*)args[i];
+ jl_module_t *gmodu = modu;
+ if (jl_is_globalref(gsym)) {
+ gmodu = jl_globalref_mod(gsym);
+ gsym = jl_globalref_name(gsym);
+ }
+ assert(jl_is_symbol(gsym));
+ jl_get_binding_wr(gmodu, gsym);
}
return (jl_value_t*)jl_nothing;
}
@@ -296,6 +311,10 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
jl_datatype_t *dt = NULL;
JL_GC_PUSH4(&para, &super, &temp, &dt);
assert(jl_is_svec(para));
+ if (jl_is_globalref(name)) {
+ modu = jl_globalref_mod(name);
+ name = (jl_value_t*)jl_globalref_name(name);
+ }
assert(jl_is_symbol(name));
dt = jl_new_abstracttype(name, NULL, (jl_svec_t*)para);
jl_binding_t *b = jl_get_binding_wr(modu, (jl_sym_t*)name);
@@ -328,6 +347,10 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
jl_value_t *super = NULL, *para = NULL, *vnb = NULL, *temp = NULL;
jl_datatype_t *dt = NULL;
JL_GC_PUSH4(&para, &super, &temp, &dt);
+ if (jl_is_globalref(name)) {
+ modu = jl_globalref_mod(name);
+ name = (jl_value_t*)jl_globalref_name(name);
+ }
assert(jl_is_symbol(name));
para = eval(args[1], s);
assert(jl_is_svec(para));
@@ -367,13 +390,17 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
if (inside_typedef)
jl_error("cannot eval a new data type definition while defining another type");
jl_value_t *name = args[0];
- assert(jl_is_symbol(name));
jl_value_t *para = eval(args[1], s);
- assert(jl_is_svec(para));
jl_value_t *temp = NULL;
jl_value_t *super = NULL;
jl_datatype_t *dt = NULL;
JL_GC_PUSH4(&para, &super, &temp, &dt);
+ if (jl_is_globalref(name)) {
+ modu = jl_globalref_mod(name);
+ name = (jl_value_t*)jl_globalref_name(name);
+ }
+ assert(jl_is_symbol(name));
+ assert(jl_is_svec(para));
temp = eval(args[2], s); // field names
#ifndef NDEBUG
size_t i, l = jl_svec_len(para);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment