Skip to content

Commit 6379704

Browse files
JeffBezansontkelman
authored andcommitted
allow GlobalRef nodes in more places (mostly assignments)
part of JuliaLang#10403
1 parent d53ea8e commit 6379704

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

src/codegen.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2873,14 +2873,18 @@ static void emit_assignment(jl_value_t *l, jl_value_t *r, jl_codectx_t *ctx)
28732873
return;
28742874
}
28752875
jl_sym_t *s = NULL;
2876+
jl_binding_t *bnd=NULL;
2877+
Value *bp=NULL;
28762878
if (jl_is_symbol(l))
28772879
s = (jl_sym_t*)l;
28782880
else if (jl_is_symbolnode(l))
28792881
s = jl_symbolnode_sym(l);
2882+
else if (jl_is_globalref(l))
2883+
bp = global_binding_pointer(jl_globalref_mod(l), jl_globalref_name(l), &bnd, true);
28802884
else
28812885
assert(false);
2882-
jl_binding_t *bnd=NULL;
2883-
Value *bp = var_binding_pointer(s, &bnd, true, ctx);
2886+
if (bp == NULL)
2887+
bp = var_binding_pointer(s, &bnd, true, ctx);
28842888
if (bnd) {
28852889
Value *rval = boxed(emit_expr(r, ctx, true),ctx);
28862890
#ifdef LLVM37
@@ -3096,8 +3100,8 @@ static Value *emit_expr(jl_value_t *expr, jl_codectx_t *ctx, bool isboxed,
30963100
jl_value_t *mn = args[0];
30973101
bool iskw = false;
30983102
Value *theF = NULL;
3099-
if (jl_is_expr(mn)) {
3100-
if (((jl_expr_t*)mn)->head == kw_sym) {
3103+
if (jl_is_expr(mn) || jl_is_globalref(mn)) {
3104+
if (jl_is_expr(mn) && ((jl_expr_t*)mn)->head == kw_sym) {
31013105
iskw = true;
31023106
mn = jl_exprarg(mn,0);
31033107
}

src/interpreter.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -221,20 +221,25 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, size_t nl, size_t ng
221221
if (genid >= ngensym || genid < 0)
222222
jl_error("assignment to invalid GenSym location");
223223
locals[nl*2 + genid] = rhs;
224-
gc_wb(jl_current_module, rhs); // not sure about jl_current_module
225224
return rhs;
226225
}
227-
assert(jl_is_symbol(sym));
228-
size_t i;
229-
for (i=0; i < nl; i++) {
230-
if (locals[i*2] == sym) {
231-
locals[i*2+1] = rhs;
232-
gc_wb(jl_current_module, rhs); // not sure about jl_current_module
233-
return rhs;
226+
if (jl_is_symbol(sym)) {
227+
size_t i;
228+
for (i=0; i < nl; i++) {
229+
if (locals[i*2] == sym) {
230+
locals[i*2+1] = rhs;
231+
return rhs;
232+
}
234233
}
235234
}
235+
jl_module_t *m = jl_current_module;
236+
if (jl_is_globalref(sym)) {
237+
m = jl_globalref_mod(sym);
238+
sym = jl_globalref_name(sym);
239+
}
240+
assert(jl_is_symbol(sym));
236241
JL_GC_PUSH1(&rhs);
237-
jl_binding_t *b = jl_get_binding_wr(jl_current_module, (jl_sym_t*)sym);
242+
jl_binding_t *b = jl_get_binding_wr(m, (jl_sym_t*)sym);
238243
jl_checked_assignment(b, rhs);
239244
JL_GC_POP();
240245
return rhs;
@@ -270,8 +275,8 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, size_t nl, size_t ng
270275
jl_binding_t *b=NULL;
271276
jl_value_t *gf=NULL;
272277
int kw=0;
273-
if (jl_is_expr(fname)) {
274-
if (((jl_expr_t*)fname)->head == kw_sym) {
278+
if (jl_is_expr(fname) || jl_is_globalref(fname)) {
279+
if (jl_is_expr(fname) && ((jl_expr_t*)fname)->head == kw_sym) {
275280
kw = 1;
276281
fname = (jl_sym_t*)jl_exprarg(fname, 0);
277282
}

src/toplevel.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ int jl_has_intrinsics(jl_expr_t *e, jl_module_t *m)
233233
jl_value_t *e0 = jl_exprarg(e,0);
234234
if (e->head == call_sym &&
235235
((jl_is_symbol(e0) && is_intrinsic(m,(jl_sym_t*)e0)) ||
236-
(jl_is_topnode(e0) && is_intrinsic(jl_base_relative_to(m),(jl_sym_t*)jl_fieldref(e0,0)))))
236+
(jl_is_topnode(e0) && is_intrinsic(jl_base_relative_to(m),(jl_sym_t*)jl_fieldref(e0,0))) ||
237+
(jl_is_globalref(e0) && is_intrinsic(jl_globalref_mod(e0), jl_globalref_name(e0)))))
237238
return 1;
238239
int i;
239240
for(i=0; i < jl_array_len(e->args); i++) {

0 commit comments

Comments
 (0)