diff --git a/src/ast.c b/src/ast.c index 76c109554bd57..b589fc6db8903 100644 --- a/src/ast.c +++ b/src/ast.c @@ -578,6 +578,11 @@ jl_value_t *jl_load_file_string(const char *text, char *filename) return jl_parse_eval_all(filename); } +DLLEXPORT jl_value_t* jl_toggle_fieldref() { + value_t e = fl_applyn(0, symbol_value(symbol("jl-toggle-fieldref"))); + return scm_to_julia(e,0); +} + // returns either an expression or a thunk jl_value_t *jl_expand(jl_value_t *expr) { diff --git a/src/codegen.cpp b/src/codegen.cpp index 358ace81ea058..33753b7ac4310 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1291,7 +1291,13 @@ jl_value_t *jl_static_eval(jl_value_t *ex, void *ctx_, jl_module_t *mod, } else if (jl_array_dim0(e->args) == 3 && fptr == &jl_f_get_field) { m = (jl_module_t*)jl_static_eval(jl_exprarg(e,1),ctx,mod,sp,ast,sparams,allow_alloc); - s = (jl_sym_t*)jl_static_eval(jl_exprarg(e,2),ctx,mod,sp,ast,sparams,allow_alloc); + if (jl_is_datatype(jl_exprarg(e,2)) && + ((jl_datatype_t*)jl_exprarg(e,2))->name == jl_fieldref_type->name) { + jl_value_t *frv = jl_svecref(((jl_datatype_t*)jl_exprarg(e,2))->parameters, 0); + s = (jl_sym_t*)jl_static_eval(frv,ctx,mod,sp,ast,sparams,allow_alloc); + } else { + s = (jl_sym_t*)jl_static_eval(jl_exprarg(e,2),ctx,mod,sp,ast,sparams,allow_alloc); + } if (m && jl_is_module(m) && s && jl_is_symbol(s)) { jl_binding_t *b = jl_get_binding(m, s); if (b && b->constp) diff --git a/src/jlfrontend.scm b/src/jlfrontend.scm index f565a6f298afd..d039d9915eb06 100644 --- a/src/jlfrontend.scm +++ b/src/jlfrontend.scm @@ -217,6 +217,10 @@ e (expand-toplevel-expr e)))))))))) +(define *fieldref* #f) +(define (jl-toggle-fieldref) + (set! *fieldref* (eq? *fieldref* #f))) + (define (jl-parser-current-lineno) (input-port-line (ts:port current-token-stream))) diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index 42f672e9fc8cf..281c8bfb11909 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -1637,7 +1637,11 @@ '|.| (lambda (e) - `(call (top getfield) ,(expand-forms (cadr e)) ,(expand-forms (caddr e)))) + (cond + ((eq? *fieldref* #f) + `(call (top getfield) ,(expand-forms (cadr e)) ,(expand-forms (caddr e)))) + (else + `(call (top getfield) ,(expand-forms (cadr e)) (call (top apply_type) (top FieldRef) ,(expand-forms (caddr e))))))) 'in (lambda (e) diff --git a/src/julia.h b/src/julia.h index 20ae5bdfa7c38..a4a44046c9df6 100644 --- a/src/julia.h +++ b/src/julia.h @@ -1197,6 +1197,8 @@ DLLEXPORT int add_library_mapping(char *lib, void *hnd); DLLEXPORT const char *jl_lookup_soname(const char *pfx, size_t n); #endif +DLLEXPORT jl_value_t* jl_toggle_fieldref(); + // compiler void jl_compile(jl_function_t *f); DLLEXPORT jl_value_t *jl_toplevel_eval(jl_value_t *v);