修訂 | 4e914212d0dfbb3fd94b7157024526a81b1e795f (tree) |
---|---|
時間 | 2018-12-06 03:51:25 |
作者 | Agustina Arzille <avarzille@rise...> |
Commiter | Agustina Arzille |
Some fixes to the tuple interfaces
@@ -1343,7 +1343,7 @@ | ||
1343 | 1343 | |
1344 | 1344 | static inline void |
1345 | 1345 | import_sym (interpreter *interp, package *p, |
1346 | - object sym, object as = UNBOUND) | |
1346 | + object sym, object as = UNBOUND, bool locked = false) | |
1347 | 1347 | { |
1348 | 1348 | object snam; |
1349 | 1349 |
@@ -1362,7 +1362,7 @@ | ||
1362 | 1362 | |
1363 | 1363 | if (as == UNBOUND) |
1364 | 1364 | { |
1365 | - inherit_sym (interp, *sv, interp->xpkg); | |
1365 | + inherit_sym (interp, *sv, interp->xpkg, locked); | |
1366 | 1366 | return; |
1367 | 1367 | } |
1368 | 1368 |
@@ -1452,6 +1452,8 @@ | ||
1452 | 1452 | import_sym (interp, p, syms, as); |
1453 | 1453 | else |
1454 | 1454 | { |
1455 | + lwlock_guard g (&as_package(interp->xpkg)->lock); | |
1456 | + | |
1455 | 1457 | for (*sym_d = syms, *al_d = as; *sym_d != NIL; |
1456 | 1458 | *sym_d = xcdr (*sym_d), *al_d = xcdr (*al_d)) |
1457 | 1459 | { |
@@ -1459,7 +1461,7 @@ | ||
1459 | 1461 | import_alias_error (interp, "not be dotted"); |
1460 | 1462 | |
1461 | 1463 | import_sym (interp, p, *sym_a = xcar (*sym_d), |
1462 | - *al_d == NIL ? UNBOUND : (*al_a = xcar (*al_d))); | |
1464 | + *al_d == NIL ? UNBOUND : (*al_a = xcar (*al_d)), true); | |
1463 | 1465 | } |
1464 | 1466 | } |
1465 | 1467 | } |
@@ -141,10 +141,10 @@ | ||
141 | 141 | return (interp->retval); |
142 | 142 | } |
143 | 143 | |
144 | -object inherit_sym (interpreter *interp, object sym, object pkg) | |
144 | +object inherit_sym (interpreter *interp, object sym, object pkg, bool locked) | |
145 | 145 | { |
146 | 146 | package *p = as_package (pkg); |
147 | - bool tst = singlethr_p (); | |
147 | + bool tst = locked || singlethr_p (); | |
148 | 148 | |
149 | 149 | if (!tst) |
150 | 150 | lwlock_grab (&p->lock); |
@@ -136,7 +136,7 @@ | ||
136 | 136 | } |
137 | 137 | |
138 | 138 | QP_EXPORT object inherit_sym (interpreter *__interp, |
139 | - object __symbol, object __pkg); | |
139 | + object __symbol, object __pkg, bool __locked = false); | |
140 | 140 | |
141 | 141 | struct string; |
142 | 142 | struct reader; |
@@ -535,7 +535,7 @@ | ||
535 | 535 | |
536 | 536 | return (interp->retval); |
537 | 537 | } |
538 | - else if (!array_p (token) || as_array(token)->len < 2) | |
538 | + else if (!array_p (token) || as_array(token)->len <= NODE_OVERHEAD) | |
539 | 539 | interp->raise2 ("arg-error", "%iter:tuple: invalid token"); |
540 | 540 | else if (!adv) |
541 | 541 | qp_return (xaref (token, 0)); |
@@ -545,7 +545,7 @@ | ||
545 | 545 | { |
546 | 546 | if (*tmp == UNBOUND) |
547 | 547 | break; |
548 | - else if (!array_p (*tmp) || as_array(*tmp)->len < 2) | |
548 | + else if (!array_p (*tmp) || as_array(*tmp)->len <= NODE_OVERHEAD) | |
549 | 549 | interp->raise2 ("arg-error", "%iter:tuple: invalid token"); |
550 | 550 | |
551 | 551 | *tmp = xaref (*tmp, NODE_OVERHEAD); |
@@ -672,7 +672,6 @@ | ||
672 | 672 | tuple *tp1; |
673 | 673 | tuple *tp2; |
674 | 674 | tuple *ret; |
675 | - object space[SP_SIZE]; | |
676 | 675 | tuple_args args; |
677 | 676 | tuple::iterator i1; |
678 | 677 | tuple::iterator i2; |