Branch: Tag:

2014-08-16

2014-08-16 21:45:10 by Per Hedbor <ph@opera.com>

Added a few more global variable opcodes.

Gotta catch em all!

This time:

PRIVATE_IF_DIRECT_GLOBAL and ASSIGN_PRIVATE_IF_DIRECT_GLOBAL

These will fetch or assign a global variable if the currently
executing program is the program the object is cloned from.

These are only slightly slower than the F_PRIVATE_GLOBAL family of
opcodes, and the overhead if the global is not actually private is
minimal.

Missing: [ASSIGN_]PRIVATE_IF_DIRECT_TYPED_GLOBAL[_AND_POP] and
ASSIGN_PRIVATE_IF_DIRECT_GLOBAL_AND_POP.

702:    struct reference *ref = PTR_FROM_INT(Pike_compiler->new_program, n);    struct identifier *id = ID_FROM_PTR(Pike_compiler->new_program, ref);    -  if( (ref->id_flags & (ID_PRIVATE|ID_FINAL)) -  && !(id->identifier_flags & IDENTIFIER_NO_THIS_REF) +  if(!(id->identifier_flags & IDENTIFIER_NO_THIS_REF)    && !IDENTIFIER_IS_ALIAS(id->identifier_flags) -  && IDENTIFIER_IS_VARIABLE(id->identifier_flags) -  && !ref->inherit_offset) +  && IDENTIFIER_IS_VARIABLE(id->identifier_flags))    {    /* fprintf( stderr, "private global %d\n", (INT32)id->func.offset ); */ -  +  if( ref->id_flags & (ID_PRIVATE|ID_FINAL) ) +  {    if( id->run_time_type == PIKE_T_MIXED )    emit1(F_PRIVATE_GLOBAL, id->func.offset);    else    emit2(F_PRIVATE_TYPED_GLOBAL, id->func.offset, id->run_time_type); -  +  return;    } -  else +  +  if( (id->func.offset < 65536) && (n<65536) ) +  { +  +  if( id->run_time_type == PIKE_T_MIXED ) +  { +  emit2(F_PRIVATE_IF_DIRECT_GLOBAL, id->func.offset, n); +  return; +  } + /* else */ + /* { */ + /* INT32 mix = id->func.offset | (n<<16); */ + /* emit2(F_PRIVATE_IF_DIRECT_TYPED_GLOBAL, mix, id->run_time_type); */ +  } +  } +     emit1(F_GLOBAL, n);   }   
724:    struct reference *ref = PTR_FROM_INT(Pike_compiler->new_program, n);    struct identifier *id = ID_FROM_PTR(Pike_compiler->new_program, ref);    -  if( (ref->id_flags & (ID_PRIVATE|ID_FINAL)) -  && !(id->identifier_flags & IDENTIFIER_NO_THIS_REF) +  if( !(id->identifier_flags & IDENTIFIER_NO_THIS_REF)    && !IDENTIFIER_IS_ALIAS(id->identifier_flags) -  && IDENTIFIER_IS_VARIABLE(id->identifier_flags) -  && !ref->inherit_offset ) +  && IDENTIFIER_IS_VARIABLE(id->identifier_flags))    { -  +  if( (ref->id_flags & (ID_PRIVATE|ID_FINAL)) ) +  {    if( id->run_time_type == PIKE_T_MIXED )    emit1((and_pop?F_ASSIGN_PRIVATE_GLOBAL_AND_POP:F_ASSIGN_PRIVATE_GLOBAL),    id->func.offset);    else    emit2((and_pop?F_ASSIGN_PRIVATE_TYPED_GLOBAL_AND_POP:F_ASSIGN_PRIVATE_TYPED_GLOBAL),    id->func.offset, id->run_time_type); -  +  return;    } -  else +  if( id->run_time_type == PIKE_T_MIXED )    { -  emit1((and_pop?F_ASSIGN_GLOBAL_AND_POP:F_ASSIGN_GLOBAL), n); +  emit2(F_ASSIGN_PRIVATE_IF_DIRECT_GLOBAL, id->func.offset, n ); +  if( and_pop ) +  emit0(F_POP_VALUE); +  return;    }    } -  +  emit1((and_pop?F_ASSIGN_GLOBAL_AND_POP:F_ASSIGN_GLOBAL), n); + }      static int emit_ltosval_call_and_assign( node *lval, node *func, node *args )   {