@@ -1263,6 +1263,7 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
12631263 cp += sizeof (bc_lib_rec_t );
12641264 }
12651265 }
1266+
12661267 // build import-symbol table
12671268 if (prog_symcount ) {
12681269 prog_symtable = (bc_symbol_rec_t * )malloc (prog_symcount * sizeof (bc_symbol_rec_t ));
@@ -1271,21 +1272,22 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
12711272 cp += sizeof (bc_symbol_rec_t );
12721273 }
12731274 }
1275+
12741276 // create system stack
12751277 prog_stack_alloc = SB_EXEC_STACK_SIZE ;
12761278 prog_stack = malloc (sizeof (stknode_t ) * prog_stack_alloc );
12771279 prog_stack_count = 0 ;
12781280 prog_timer = NULL ;
12791281
12801282 // create eval's stack
1281- eval_size = 64 ;
1283+ eval_size = SB_EVAL_STACK_SIZE ;
12821284 eval_stk = malloc (sizeof (var_t ) * eval_size );
1285+ memset (eval_stk , 0 , sizeof (var_t ) * eval_size );
12831286 eval_sp = 0 ;
12841287
12851288 // initialize the rest tasks globals
12861289 prog_error = 0 ;
12871290 prog_line = 0 ;
1288-
12891291 prog_dp = data_org = hdr .data_ip ;
12901292 prog_length = hdr .bc_count ;
12911293 prog_source = cp ;
@@ -1385,7 +1387,6 @@ int brun_create_task(const char *filename, byte *preloaded_bc, int libf) {
13851387int exec_close_task () {
13861388 word i ;
13871389 stknode_t node ;
1388-
13891390 if (ctask -> bytecode ) {
13901391 // clean up - format list
13911392 free_format ();
@@ -1402,15 +1403,14 @@ int exec_close_task() {
14021403 free (prog_stack );
14031404 // clean up - variables
14041405 for (i = 0 ; i < (int ) prog_varcount ; i ++ ) {
1405- int j , shared ;
14061406 // do not free imported variables
1407- shared = -1 ;
1407+ int shared = -1 ;
1408+ int j ;
14081409 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- }
1410+ if (prog_symtable [j ].type == stt_variable &&
1411+ prog_symtable [j ].var_id == i ) {
1412+ shared = j ;
1413+ break ;
14141414 }
14151415 }
14161416
@@ -1503,8 +1503,13 @@ void exec_sync_variables(int dir) {
15031503 activate_task (ps -> task_id );
15041504 vp = tvar [us -> vid ];
15051505
1506+ // pointer assignment (shared var_t pointer)
15061507 activate_task (tid );
1507- tvar [ps -> var_id ] = vp ; // pointer assignment (shared var_t pointer)
1508+ if (tvar [ps -> var_id ] != vp ) {
1509+ v_free (tvar [ps -> var_id ]);
1510+ free (tvar [ps -> var_id ]);
1511+ }
1512+ tvar [ps -> var_id ] = vp ;
15081513 } else {
15091514 activate_task (tid );
15101515 vp = tvar [ps -> var_id ];
0 commit comments