2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-14 00:32:11 +00:00

Special case for $(x:G)

[SVN r83812]
This commit is contained in:
Steven Watanabe
2013-04-08 17:40:28 +00:00
parent 19540a5426
commit 62b79b8ebe
2 changed files with 67 additions and 9 deletions

View File

@@ -103,6 +103,7 @@ void backtrace_line( FRAME * );
#define INSTR_APPLY_INDEX_GROUP 44
#define INSTR_APPLY_INDEX_MODIFIERS_GROUP 45
#define INSTR_COMBINE_STRINGS 46
#define INSTR_GET_GRIST 64
#define INSTR_INCLUDE 47
#define INSTR_RULE 48
@@ -1623,10 +1624,30 @@ static void var_parse_group_compile( VAR_PARSE_GROUP const * parse,
static void var_parse_var_compile( VAR_PARSE_VAR const * parse, compiler * c )
{
int expand_name = 0;
int is_get_grist = 0;
int has_modifiers = 0;
/* Special case common modifiers */
if ( parse->modifiers->size == 1 )
{
VAR_PARSE_GROUP * mod = dynamic_array_at( VAR_PARSE_GROUP *, parse->modifiers, 0 );
if ( mod->elems->size == 1 )
{
VAR_PARSE * mod1 = dynamic_array_at( VAR_PARSE *, mod->elems, 0 );
if ( mod1->type == VAR_PARSE_TYPE_STRING )
{
OBJECT * s = ( (VAR_PARSE_STRING *)mod1 )->s;
if ( ! strcmp ( object_str( s ), "G" ) )
{
is_get_grist = 1;
}
}
}
}
/* If there are modifiers, emit them in reverse order. */
if ( parse->modifiers->size > 0 )
if ( parse->modifiers->size > 0 && !is_get_grist )
{
int i;
has_modifiers = 1;
for ( i = 0; i < parse->modifiers->size; ++i )
var_parse_group_compile( dynamic_array_at( VAR_PARSE_GROUP *,
parse->modifiers, parse->modifiers->size - i - 1 ), c );
@@ -1660,23 +1681,29 @@ static void var_parse_var_compile( VAR_PARSE_VAR const * parse, compiler * c )
}
/** Select the instruction for expanding the variable. */
if ( !parse->modifiers->size && !parse->subscript && !expand_name )
if ( !has_modifiers && !parse->subscript && !expand_name )
;
else if ( !parse->modifiers->size && !parse->subscript && expand_name )
else if ( !has_modifiers && !parse->subscript && expand_name )
compile_emit( c, INSTR_PUSH_GROUP, 0 );
else if ( !parse->modifiers->size && parse->subscript && !expand_name )
else if ( !has_modifiers && parse->subscript && !expand_name )
compile_emit( c, INSTR_APPLY_INDEX, 0 );
else if ( !parse->modifiers->size && parse->subscript && expand_name )
else if ( !has_modifiers && parse->subscript && expand_name )
compile_emit( c, INSTR_APPLY_INDEX_GROUP, 0 );
if ( parse->modifiers->size && !parse->subscript && !expand_name )
else if ( has_modifiers && !parse->subscript && !expand_name )
compile_emit( c, INSTR_APPLY_MODIFIERS, parse->modifiers->size );
else if ( parse->modifiers->size && !parse->subscript && expand_name )
else if ( has_modifiers && !parse->subscript && expand_name )
compile_emit( c, INSTR_APPLY_MODIFIERS_GROUP, parse->modifiers->size );
else if ( parse->modifiers->size && parse->subscript && !expand_name )
else if ( has_modifiers && parse->subscript && !expand_name )
compile_emit( c, INSTR_APPLY_INDEX_MODIFIERS, parse->modifiers->size );
else if ( parse->modifiers->size && parse->subscript && expand_name )
else if ( has_modifiers && parse->subscript && expand_name )
compile_emit( c, INSTR_APPLY_INDEX_MODIFIERS_GROUP,
parse->modifiers->size );
/* Now apply any special modifiers */
if ( is_get_grist )
{
compile_emit( c, INSTR_GET_GRIST, 0 );
}
}
static void var_parse_string_compile( VAR_PARSE_STRING const * parse,
@@ -4127,6 +4154,36 @@ LIST * function_run( FUNCTION * function_, FRAME * frame, STACK * s )
break;
}
case INSTR_GET_GRIST:
{
LIST * vals = stack_pop( s );
LIST * result = L0;
LISTITER iter, end;
for ( iter = list_begin( vals ), end = list_end( vals ); iter != end; ++iter )
{
OBJECT * new_object;
const char * value = object_str( list_item( iter ) );
const char * p;
if ( value[ 0 ] == '<' && ( p = strchr( value, '>' ) ) )
{
if( p[ 1 ] )
new_object = object_new_range( value, p - value + 1 );
else
new_object = object_copy( list_item( iter ) );
}
else
{
new_object = object_copy( constant_empty );
}
result = list_push_back( result, new_object );
}
list_free( vals );
stack_push( s, result );
break;
}
case INSTR_INCLUDE:
{
LIST * nt = stack_pop( s );