@@ -265,7 +265,7 @@ bool basic_hash_lines(struct basic_ctx *ctx, char **error) {
265265 return true;
266266}
267267
268- struct basic_ctx * basic_init (const char * program , uint32_t pid , const char * file , char * * error ) {
268+ struct basic_ctx * basic_init (const char * program , uint32_t pid , const char * file , char * * error , enum memory_model_t model ) {
269269 build_keyword_prefix_offsets ();
270270 build_builtin_fn_maps ();
271271 if (!isdigit (* program )) {
@@ -275,7 +275,7 @@ struct basic_ctx *basic_init(const char *program, uint32_t pid, const char *file
275275 * error = "Out of memory" ;
276276 return NULL ;
277277 }
278- struct basic_ctx * c = basic_init (numbered , pid , file , error );
278+ struct basic_ctx * c = basic_init (numbered , pid , file , error , model );
279279 kfree_null (& numbered );
280280 return c ;
281281 }
@@ -292,7 +292,7 @@ struct basic_ctx *basic_init(const char *program, uint32_t pid, const char *file
292292 * error = "Out of memory" ;
293293 return NULL ;
294294 }
295- buddy_init (ctx -> allocator , 6 , 26 , 26 );
295+ buddy_init (ctx -> allocator , 6 , ( int ) model , ( int ) model );
296296 ctx -> maps = hashmap_new_with_allocator (varmap_malloc , varmap_realloc , varmap_free , sizeof (basic_map_handle_entry ), 0 , SEED0 , SEED1 , int64_hash , int64_compare , elfree_map_handle_entry , ctx -> allocator );
297297 ctx -> active_restrictions = NULL ;
298298 ctx -> child_restrictions = NULL ;
@@ -669,13 +669,49 @@ void chain_statement(struct basic_ctx *ctx) {
669669 uint32_t cpu = logical_cpu_id ();
670670 process_t * proc = proc_cur (cpu );
671671 accept_or_return (CHAIN , ctx );
672+
672673 const char * pn = str_expr (ctx );
673- process_t * p = proc_load ( pn , proc -> pid , proc -> csd );
674+
674675 bool background = false;
676+ memory_model_t memory_model = mm_medium ;
677+
678+ /* Optional: , TRUE|FALSE */
675679 if (tokenizer_token (ctx ) == COMMA ) {
676680 tokenizer_next (ctx );
677681 background = expr (ctx );
678682 }
683+
684+ /* Optional: MEMORY SMALL|MEDIUM|LARGE|HUGE */
685+ if (tokenizer_token (ctx ) == MEMORY ) {
686+ tokenizer_next (ctx );
687+
688+ switch (tokenizer_token (ctx )) {
689+ case SMALL :
690+ memory_model = mm_small ;
691+ break ;
692+
693+ case MEDIUM :
694+ memory_model = mm_medium ;
695+ break ;
696+
697+ case LARGE :
698+ memory_model = mm_large ;
699+ break ;
700+
701+ case HUGE :
702+ memory_model = mm_huge ;
703+ break ;
704+
705+ default :
706+ tokenizer_error_print (ctx , "Expected SMALL, MEDIUM, LARGE or HUGE" );
707+ accept_or_return (NEWLINE , ctx );
708+ return ;
709+ }
710+
711+ tokenizer_next (ctx );
712+ }
713+
714+ process_t * p = proc_load (pn , proc -> pid , proc -> csd , memory_model );
679715 if (p == NULL ) {
680716 accept_or_return (NEWLINE , ctx );
681717 return ;
@@ -725,6 +761,7 @@ void chain_statement(struct basic_ctx *ctx) {
725761 if (!background ) {
726762 proc_wait (proc , p -> pid );
727763 }
764+
728765 accept_or_return (NEWLINE , ctx );
729766}
730767
0 commit comments