| 1632 | } |
| 1633 | |
| 1634 | static JAM_FUNCTION * compile_to_function( compiler * c ) |
| 1635 | { |
| 1636 | JAM_FUNCTION * const result = (JAM_FUNCTION*)BJAM_MALLOC( sizeof( JAM_FUNCTION ) ); |
| 1637 | int32_t i; |
| 1638 | result->base.type = FUNCTION_JAM; |
| 1639 | result->base.reference_count = 1; |
| 1640 | result->base.formal_arguments = 0; |
| 1641 | result->base.num_formal_arguments = 0; |
| 1642 | |
| 1643 | result->base.rulename = 0; |
| 1644 | |
| 1645 | result->code_size = c->code->size; |
| 1646 | result->code = (instruction*)BJAM_MALLOC( c->code->size * sizeof( instruction ) ); |
| 1647 | memcpy( result->code, c->code->data, c->code->size * sizeof( instruction ) ); |
| 1648 | |
| 1649 | result->constants = (OBJECT**)BJAM_MALLOC( c->constants->size * sizeof( OBJECT * ) ); |
| 1650 | if ( c->constants->size != 0 ) |
| 1651 | memcpy( result->constants, c->constants->data, |
| 1652 | c->constants->size * sizeof( OBJECT * ) ); |
| 1653 | result->num_constants = c->constants->size; |
| 1654 | |
| 1655 | result->num_subfunctions = c->rules->size; |
| 1656 | result->functions = (SUBFUNCTION*)BJAM_MALLOC( c->rules->size * sizeof( SUBFUNCTION ) ); |
| 1657 | for ( i = 0; i < c->rules->size; ++i ) |
| 1658 | { |
| 1659 | struct stored_rule * const rule = &dynamic_array_at( struct stored_rule, |
| 1660 | c->rules, i ); |
| 1661 | result->functions[ i ].name = rule->name; |
| 1662 | result->functions[ i ].code = function_compile( rule->parse ); |
| 1663 | result->functions[ i ].code->num_formal_arguments = rule->num_arguments; |
| 1664 | result->functions[ i ].code->formal_arguments = rule->arguments; |
| 1665 | result->functions[ i ].local = rule->local; |
| 1666 | } |
| 1667 | |
| 1668 | result->actions = (SUBACTION*)BJAM_MALLOC( c->actions->size * sizeof( SUBACTION ) ); |
| 1669 | if ( c->actions->size != 0 ) |
| 1670 | memcpy( result->actions, c->actions->data, |
| 1671 | c->actions->size * sizeof( SUBACTION ) ); |
| 1672 | result->num_subactions = c->actions->size; |
| 1673 | |
| 1674 | result->generic = 0; |
| 1675 | |
| 1676 | result->file = 0; |
| 1677 | result->line = -1; |
| 1678 | |
| 1679 | return result; |
| 1680 | } |
| 1681 | |
| 1682 | |
| 1683 | /* |
no test coverage detected