| 569 | } |
| 570 | |
| 571 | context_t create_subcontext(const context_t &cxt) |
| 572 | { |
| 573 | cs_impl::init_extensions(); |
| 574 | context_t context = std::make_shared<context_type>(); |
| 575 | context->instance = std::make_shared<instance_type>(context, cxt->instance->fiber_sp, current_process->stack_size); |
| 576 | context->compiler = cxt->compiler; |
| 577 | context->cmd_args = cxt->cmd_args; |
| 578 | // Init Runtime |
| 579 | context->instance->storage |
| 580 | // Internal Types |
| 581 | .add_buildin_type("char", []() -> var |
| 582 | { return var::make<char>('\0'); }, typeid(char), cs_impl::char_ext) |
| 583 | .add_buildin_type("number", []() -> var |
| 584 | { return var::make<numeric>(0); }, typeid(numeric)) |
| 585 | .add_buildin_type("integer", []() -> var |
| 586 | { return var::make<numeric>(0); }, typeid(numeric)) |
| 587 | .add_buildin_type("float", []() -> var |
| 588 | { return var::make<numeric>(0.0); }, typeid(numeric)) |
| 589 | .add_buildin_type("boolean", []() -> var |
| 590 | { return var::make<boolean>(true); }, typeid(boolean)) |
| 591 | .add_buildin_type("pointer", []() -> var |
| 592 | { return var::make<pointer>(null_pointer); }, typeid(pointer)) |
| 593 | .add_buildin_type("string", []() -> var |
| 594 | { return var::make<string>(); }, typeid(string), cs_impl::string_ext) |
| 595 | .add_buildin_type("list", []() -> var |
| 596 | { return var::make<list>(); }, typeid(list), cs_impl::list_ext) |
| 597 | .add_buildin_type("array", []() -> var |
| 598 | { return var::make<array>(); }, typeid(array), cs_impl::array_ext) |
| 599 | .add_buildin_type("pair", []() -> var |
| 600 | { return var::make<pair>(numeric(0), numeric(0)); }, typeid(pair), cs_impl::pair_ext) |
| 601 | .add_buildin_type("hash_set", []() -> var |
| 602 | { return var::make<hash_set>(); }, typeid(hash_set), cs_impl::hash_set_ext) |
| 603 | .add_buildin_type("hash_map", []() -> var |
| 604 | { return var::make<hash_map>(); }, typeid(hash_map), cs_impl::hash_map_ext) |
| 605 | // Context |
| 606 | .add_buildin_var("context", var::make_constant<context_t>(context)) |
| 607 | // Add Internal Functions to storage |
| 608 | .add_buildin_var("range", var::make_protect<callable>(range, callable::types::request_fold)) |
| 609 | .add_buildin_var("to_integer", make_cni(to_integer, true)) |
| 610 | .add_buildin_var("to_string", make_cni(to_string, true)) |
| 611 | .add_buildin_var("type", make_cni(type, true)) |
| 612 | .add_buildin_var("clone", make_cni(clone)) |
| 613 | .add_buildin_var("move", make_cni(move)) |
| 614 | .add_buildin_var("swap", make_cni(swap, true)) |
| 615 | .add_buildin_var("is_a", make_cni(is_a, true)) |
| 616 | // Add extensions to storage |
| 617 | .add_buildin_var("exception", make_namespace(cs_impl::except_ext)) |
| 618 | .add_buildin_var("iostream", make_namespace(cs_impl::iostream_ext)) |
| 619 | .add_buildin_var("system", make_namespace(cs_impl::system_ext)) |
| 620 | .add_buildin_var("fiber", make_namespace(cs_impl::fiber_ext)) |
| 621 | .add_buildin_var("runtime", make_namespace(cs_impl::runtime_ext)) |
| 622 | .add_buildin_var("math", make_namespace(cs_impl::math_ext)); |
| 623 | return context; |
| 624 | } |
| 625 | |
| 626 | void collect_garbage() |
| 627 | { |
no test coverage detected