@@ -469,7 +469,6 @@ void cmd_chain(void) {
469
469
*/
470
470
void cmd_run (int retf ) {
471
471
var_t var ;
472
-
473
472
v_init (& var );
474
473
eval (& var );
475
474
IF_ERR_RETURN ;
@@ -482,7 +481,7 @@ void cmd_run(int retf) {
482
481
v_free (& var );
483
482
}
484
483
485
- if (!dev_run (fileName , retf )) {
484
+ if (!dev_run (fileName , NULL , retf )) {
486
485
err_run_err (fileName );
487
486
}
488
487
}
@@ -1196,7 +1195,9 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
1196
1195
lseek (h , sizeof (unit_sym_t ) * uft .sym_count , SEEK_CUR );
1197
1196
}
1198
1197
read (h , & hdr , sizeof (bc_head_t ));
1199
-
1198
+ if (hdr .sbver != SB_DWORD_VER ) {
1199
+ panic ("File '%s' version incorrect" , fname );
1200
+ }
1200
1201
source = malloc (hdr .size + 4 );
1201
1202
lseek (h , 0 , SEEK_SET );
1202
1203
read (h , source , hdr .size );
@@ -1263,6 +1264,7 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
1263
1264
cp += sizeof (bc_lib_rec_t );
1264
1265
}
1265
1266
}
1267
+
1266
1268
// build import-symbol table
1267
1269
if (prog_symcount ) {
1268
1270
prog_symtable = (bc_symbol_rec_t * )malloc (prog_symcount * sizeof (bc_symbol_rec_t ));
@@ -1271,21 +1273,22 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
1271
1273
cp += sizeof (bc_symbol_rec_t );
1272
1274
}
1273
1275
}
1276
+
1274
1277
// create system stack
1275
1278
prog_stack_alloc = SB_EXEC_STACK_SIZE ;
1276
1279
prog_stack = malloc (sizeof (stknode_t ) * prog_stack_alloc );
1277
1280
prog_stack_count = 0 ;
1278
1281
prog_timer = NULL ;
1279
1282
1280
1283
// create eval's stack
1281
- eval_size = 64 ;
1284
+ eval_size = SB_EVAL_STACK_SIZE ;
1282
1285
eval_stk = malloc (sizeof (var_t ) * eval_size );
1286
+ memset (eval_stk , 0 , sizeof (var_t ) * eval_size );
1283
1287
eval_sp = 0 ;
1284
1288
1285
1289
// initialize the rest tasks globals
1286
1290
prog_error = 0 ;
1287
1291
prog_line = 0 ;
1288
-
1289
1292
prog_dp = data_org = hdr .data_ip ;
1290
1293
prog_length = hdr .bc_count ;
1291
1294
prog_source = cp ;
@@ -1385,7 +1388,6 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
1385
1388
int exec_close_task () {
1386
1389
word i ;
1387
1390
stknode_t node ;
1388
-
1389
1391
if (ctask -> bytecode ) {
1390
1392
// clean up - format list
1391
1393
free_format ();
@@ -1402,15 +1404,14 @@ int exec_close_task() {
1402
1404
free (prog_stack );
1403
1405
// clean up - variables
1404
1406
for (i = 0 ; i < (int ) prog_varcount ; i ++ ) {
1405
- int j , shared ;
1406
1407
// do not free imported variables
1407
- shared = -1 ;
1408
+ int shared = -1 ;
1409
+ int j ;
1408
1410
for (j = 0 ; j < prog_symcount ; j ++ ) {
1409
- if (prog_symtable [j ].type == stt_variable ) {
1410
- if (prog_symtable [j ].var_id == i ) {
1411
- shared = i ;
1412
- break ;
1413
- }
1411
+ if (prog_symtable [j ].type == stt_variable &&
1412
+ prog_symtable [j ].var_id == i ) {
1413
+ shared = j ;
1414
+ break ;
1414
1415
}
1415
1416
}
1416
1417
@@ -1503,8 +1504,13 @@ void exec_sync_variables(int dir) {
1503
1504
activate_task (ps -> task_id );
1504
1505
vp = tvar [us -> vid ];
1505
1506
1507
+ // pointer assignment (shared var_t pointer)
1506
1508
activate_task (tid );
1507
- tvar [ps -> var_id ] = vp ; // pointer assignment (shared var_t pointer)
1509
+ if (tvar [ps -> var_id ] != vp ) {
1510
+ v_free (tvar [ps -> var_id ]);
1511
+ free (tvar [ps -> var_id ]);
1512
+ }
1513
+ tvar [ps -> var_id ] = vp ;
1508
1514
} else {
1509
1515
activate_task (tid );
1510
1516
vp = tvar [ps -> var_id ];
0 commit comments