@@ -1167,10 +1167,21 @@ LUA_API void lua_settable(lua_State *L, int idx)
11671167 o = lj_meta_tset_owner (L , t , L -> top - 2 , & owner );
11681168 if (o ) {
11691169 TValue * key = L -> top - 2 , * val = L -> top - 1 ;
1170- if (lj_tab_trystoretv_cas_keyed (L , owner , o , key , val ) ==
1171- LJ_TAB_STORE_CAS_OK ) {
1170+ int weakwr = lj_gc2_weak_write_begin (L , owner );
1171+ int rc ;
1172+ if (weakwr )
11721173 lj_gc2_barrier_weak_write (L , owner , key , val );
1173- lj_gc2_barrier_tv_pair (L , obj2gco (owner ), o );
1174+ rc = lj_tab_trystoretv_cas_keyed (L , owner , o , key , val );
1175+ if (weakwr ) {
1176+ lj_gc2_barrier_weak_write (L , owner , key , val );
1177+ lj_gc2_barrier_tv_pair (L , obj2gco (owner ), val );
1178+ lj_gc2_weak_write_end (L , weakwr );
1179+ }
1180+ if (rc == LJ_TAB_STORE_CAS_OK ) {
1181+ if (!weakwr ) {
1182+ lj_gc2_barrier_weak_write (L , owner , key , val );
1183+ lj_gc2_barrier_tv_pair (L , obj2gco (owner ), o );
1184+ }
11741185 L -> top = key ;
11751186 return ;
11761187 }
@@ -1199,10 +1210,21 @@ LUA_API void lua_setfield(lua_State *L, int idx, const char *k)
11991210 o = lj_meta_tset_owner (L , t , & key , & owner );
12001211 if (o ) {
12011212 TValue * val = L -> top - 1 ;
1202- if (lj_tab_trystoretv_cas_keyed (L , owner , o , & key , val ) ==
1203- LJ_TAB_STORE_CAS_OK ) {
1213+ int weakwr = lj_gc2_weak_write_begin (L , owner );
1214+ int rc ;
1215+ if (weakwr )
12041216 lj_gc2_barrier_weak_write (L , owner , & key , val );
1205- lj_gc2_barrier_tv_pair (L , obj2gco (owner ), o );
1217+ rc = lj_tab_trystoretv_cas_keyed (L , owner , o , & key , val );
1218+ if (weakwr ) {
1219+ lj_gc2_barrier_weak_write (L , owner , & key , val );
1220+ lj_gc2_barrier_tv_pair (L , obj2gco (owner ), val );
1221+ lj_gc2_weak_write_end (L , weakwr );
1222+ }
1223+ if (rc == LJ_TAB_STORE_CAS_OK ) {
1224+ if (!weakwr ) {
1225+ lj_gc2_barrier_weak_write (L , owner , & key , val );
1226+ lj_gc2_barrier_tv_pair (L , obj2gco (owner ), o );
1227+ }
12061228 L -> top = val ;
12071229 return ;
12081230 }
@@ -1223,17 +1245,32 @@ LUA_API void lua_rawset(lua_State *L, int idx)
12231245 TValue snap ;
12241246 GCtab * t = tabV (index2adr_read (L , idx , & snap ));
12251247 TValue * dst , * key ;
1248+ int barrier_done = 0 ;
12261249 lj_checkapi_slot (2 );
12271250 key = L -> top - 2 ;
12281251 for (;;) {
1252+ int weakwr , rc ;
12291253 dst = lj_tab_set (L , t , key );
1230- if (lj_tab_trystoretv_cas_keyed (L , t , dst , key , key + 1 ) ==
1231- LJ_TAB_STORE_CAS_OK )
1254+ weakwr = lj_gc2_weak_write_begin (L , t );
1255+ if (weakwr )
1256+ lj_gc2_barrier_weak_write (L , t , key , key + 1 );
1257+ rc = lj_tab_trystoretv_cas_keyed (L , t , dst , key , key + 1 );
1258+ if (weakwr ) {
1259+ lj_gc2_barrier_weak_write (L , t , key , key + 1 );
1260+ lj_gc2_barrier_tv_pair (L , obj2gco (t ), key + 1 );
1261+ lj_gc_pubtab (L , t );
1262+ lj_gc2_weak_write_end (L , weakwr );
1263+ if (rc == LJ_TAB_STORE_CAS_OK )
1264+ barrier_done = 1 ;
1265+ }
1266+ if (rc == LJ_TAB_STORE_CAS_OK )
12321267 break ;
12331268 lj_tab_store_wait_l (L ); /* C API rawset saw stale/FORWARD slot. */
12341269 }
1235- lj_gc2_barrier_weak_write (L , t , key , key + 1 );
1236- lj_gc_pubtab (L , t );
1270+ if (!barrier_done ) {
1271+ lj_gc2_barrier_weak_write (L , t , key , key + 1 );
1272+ lj_gc_pubtab (L , t );
1273+ }
12371274 L -> top = key ;
12381275}
12391276
@@ -1243,18 +1280,33 @@ LUA_API void lua_rawseti(lua_State *L, int idx, int n)
12431280 GCtab * t = tabV (index2adr_read (L , idx , & snap ));
12441281 TValue * dst , * src ;
12451282 TValue key ;
1283+ int barrier_done = 0 ;
12461284 lj_checkapi_slot (1 );
12471285 src = L -> top - 1 ;
12481286 setintV (& key , n );
12491287 for (;;) {
1288+ int weakwr , rc ;
12501289 dst = lj_tab_setint (L , t , n );
1251- if (lj_tab_trystoretv_cas_keyed (L , t , dst , & key , src ) ==
1252- LJ_TAB_STORE_CAS_OK )
1290+ weakwr = lj_gc2_weak_write_begin (L , t );
1291+ if (weakwr )
1292+ lj_gc2_barrier_weak_write (L , t , & key , src );
1293+ rc = lj_tab_trystoretv_cas_keyed (L , t , dst , & key , src );
1294+ if (weakwr ) {
1295+ lj_gc2_barrier_weak_write (L , t , & key , src );
1296+ lj_gc2_barrier_tv_pair (L , obj2gco (t ), src );
1297+ lj_gc_pubtabtv (L , t , dst );
1298+ lj_gc2_weak_write_end (L , weakwr );
1299+ if (rc == LJ_TAB_STORE_CAS_OK )
1300+ barrier_done = 1 ;
1301+ }
1302+ if (rc == LJ_TAB_STORE_CAS_OK )
12531303 break ;
12541304 lj_tab_store_wait_l (L ); /* C API rawseti saw stale/FORWARD slot. */
12551305 }
1256- lj_gc2_barrier_weak_write (L , t , & key , src );
1257- lj_gc_pubtabtv (L , t , dst );
1306+ if (!barrier_done ) {
1307+ lj_gc2_barrier_weak_write (L , t , & key , src );
1308+ lj_gc_pubtabtv (L , t , dst );
1309+ }
12581310 L -> top = src ;
12591311}
12601312
0 commit comments