Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. diff --git a/src/interpreter.c b/src/interpreter.c
  2. index 5c89505..d84191d9 100644
  3. --- a/src/interpreter.c
  4. +++ b/src/interpreter.c
  5. @@ -246,6 +246,10 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
  6. }
  7. else if (ex->head == method_sym) {
  8. jl_sym_t *fname = (jl_sym_t*)args[0];
  9. + if (jl_is_globalref(fname)) {
  10. + modu = jl_globalref_mod(fname);
  11. + fname = jl_globalref_name(fname);
  12. + }
  13. assert(jl_expr_nargs(ex) != 1 || jl_is_symbol(fname));
  14.  
  15. if (jl_is_symbol(fname)) {
  16. @@ -271,18 +275,29 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
  17. return jl_nothing;
  18. }
  19. else if (ex->head == const_sym) {
  20. - jl_value_t *sym = args[0];
  21. + jl_sym_t *sym = (jl_sym_t*)args[0];
  22. + if (jl_is_globalref(sym)) {
  23. + modu = jl_globalref_mod(sym);
  24. + sym = jl_globalref_name(sym);
  25. + }
  26. assert(jl_is_symbol(sym));
  27. - jl_binding_t *b = jl_get_binding_wr(modu, (jl_sym_t*)sym);
  28. + jl_binding_t *b = jl_get_binding_wr(modu, sym);
  29. jl_declare_constant(b);
  30. return (jl_value_t*)jl_nothing;
  31. }
  32. else if (ex->head == global_sym) {
  33. // create uninitialized mutable binding for "global x" decl
  34. // TODO: handle type decls
  35. - for (size_t i=0; i < jl_array_len(ex->args); i++) {
  36. - assert(jl_is_symbol(args[i]));
  37. - jl_get_binding_wr(modu, (jl_sym_t*)args[i]);
  38. + size_t i, l = jl_array_len(ex->args);
  39. + for (i = 0; i < l; i++) {
  40. + jl_sym_t *gsym = (jl_sym_t*)args[i];
  41. + jl_module_t *gmodu = modu;
  42. + if (jl_is_globalref(gsym)) {
  43. + gmodu = jl_globalref_mod(gsym);
  44. + gsym = jl_globalref_name(gsym);
  45. + }
  46. + assert(jl_is_symbol(gsym));
  47. + jl_get_binding_wr(gmodu, gsym);
  48. }
  49. return (jl_value_t*)jl_nothing;
  50. }
  51. @@ -296,6 +311,10 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
  52. jl_datatype_t *dt = NULL;
  53. JL_GC_PUSH4(&para, &super, &temp, &dt);
  54. assert(jl_is_svec(para));
  55. + if (jl_is_globalref(name)) {
  56. + modu = jl_globalref_mod(name);
  57. + name = (jl_value_t*)jl_globalref_name(name);
  58. + }
  59. assert(jl_is_symbol(name));
  60. dt = jl_new_abstracttype(name, NULL, (jl_svec_t*)para);
  61. jl_binding_t *b = jl_get_binding_wr(modu, (jl_sym_t*)name);
  62. @@ -328,6 +347,10 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
  63. jl_value_t *super = NULL, *para = NULL, *vnb = NULL, *temp = NULL;
  64. jl_datatype_t *dt = NULL;
  65. JL_GC_PUSH4(&para, &super, &temp, &dt);
  66. + if (jl_is_globalref(name)) {
  67. + modu = jl_globalref_mod(name);
  68. + name = (jl_value_t*)jl_globalref_name(name);
  69. + }
  70. assert(jl_is_symbol(name));
  71. para = eval(args[1], s);
  72. assert(jl_is_svec(para));
  73. @@ -367,13 +390,17 @@ static jl_value_t *eval(jl_value_t *e, interpreter_state *s)
  74. if (inside_typedef)
  75. jl_error("cannot eval a new data type definition while defining another type");
  76. jl_value_t *name = args[0];
  77. - assert(jl_is_symbol(name));
  78. jl_value_t *para = eval(args[1], s);
  79. - assert(jl_is_svec(para));
  80. jl_value_t *temp = NULL;
  81. jl_value_t *super = NULL;
  82. jl_datatype_t *dt = NULL;
  83. JL_GC_PUSH4(&para, &super, &temp, &dt);
  84. + if (jl_is_globalref(name)) {
  85. + modu = jl_globalref_mod(name);
  86. + name = (jl_value_t*)jl_globalref_name(name);
  87. + }
  88. + assert(jl_is_symbol(name));
  89. + assert(jl_is_svec(para));
  90. temp = eval(args[2], s); // field names
  91. #ifndef NDEBUG
  92. size_t i, l = jl_svec_len(para);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement