@@ -469,7 +469,6 @@ void cmd_chain(void) {
469469 */
470470void cmd_run (int retf ) {
471471 var_t var ;
472-
473472 v_init (& var );
474473 eval (& var );
475474 IF_ERR_RETURN ;
@@ -482,7 +481,7 @@ void cmd_run(int retf) {
482481 v_free (& var );
483482 }
484483
485- if (!dev_run (fileName , retf )) {
484+ if (!dev_run (fileName , NULL , retf )) {
486485 err_run_err (fileName );
487486 }
488487}
@@ -1196,7 +1195,9 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
11961195 lseek (h , sizeof (unit_sym_t ) * uft .sym_count , SEEK_CUR );
11971196 }
11981197 read (h , & hdr , sizeof (bc_head_t ));
1199-
1198+ if (hdr .sbver != SB_DWORD_VER ) {
1199+ panic ("File '%s' version incorrect" , fname );
1200+ }
12001201 source = malloc (hdr .size + 4 );
12011202 lseek (h , 0 , SEEK_SET );
12021203 read (h , source , hdr .size );
@@ -1263,6 +1264,7 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
12631264 cp += sizeof (bc_lib_rec_t );
12641265 }
12651266 }
1267+
12661268 // build import-symbol table
12671269 if (prog_symcount ) {
12681270 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) {
12711273 cp += sizeof (bc_symbol_rec_t );
12721274 }
12731275 }
1276+
12741277 // create system stack
12751278 prog_stack_alloc = SB_EXEC_STACK_SIZE ;
12761279 prog_stack = malloc (sizeof (stknode_t ) * prog_stack_alloc );
12771280 prog_stack_count = 0 ;
12781281 prog_timer = NULL ;
12791282
12801283 // create eval's stack
1281- eval_size = 64 ;
1284+ eval_size = SB_EVAL_STACK_SIZE ;
12821285 eval_stk = malloc (sizeof (var_t ) * eval_size );
1286+ memset (eval_stk , 0 , sizeof (var_t ) * eval_size );
12831287 eval_sp = 0 ;
12841288
12851289 // initialize the rest tasks globals
12861290 prog_error = 0 ;
12871291 prog_line = 0 ;
1288-
12891292 prog_dp = data_org = hdr .data_ip ;
12901293 prog_length = hdr .bc_count ;
12911294 prog_source = cp ;
@@ -1385,7 +1388,6 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
13851388int exec_close_task () {
13861389 word i ;
13871390 stknode_t node ;
1388-
13891391 if (ctask -> bytecode ) {
13901392 // clean up - format list
13911393 free_format ();
@@ -1402,15 +1404,14 @@ int exec_close_task() {
14021404 free (prog_stack );
14031405 // clean up - variables
14041406 for (i = 0 ; i < (int ) prog_varcount ; i ++ ) {
1405- int j , shared ;
14061407 // do not free imported variables
1407- shared = -1 ;
1408+ int shared = -1 ;
1409+ int j ;
14081410 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 ;
14141415 }
14151416 }
14161417
@@ -1503,8 +1504,13 @@ void exec_sync_variables(int dir) {
15031504 activate_task (ps -> task_id );
15041505 vp = tvar [us -> vid ];
15051506
1507+ // pointer assignment (shared var_t pointer)
15061508 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 ;
15081514 } else {
15091515 activate_task (tid );
15101516 vp = tvar [ps -> var_id ];
0 commit comments