--- parser3/src/main/compile.y 2009/05/24 07:32:40 1.243 +++ parser3/src/main/compile.y 2009/06/05 23:07:38 1.246 @@ -5,7 +5,7 @@ Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: compile.y,v 1.243 2009/05/24 07:32:40 misha Exp $ + $Id: compile.y,v 1.246 2009/06/05 23:07:38 misha Exp $ */ /** @@ -319,38 +319,39 @@ action: get | put | call; get: get_value { $$=N(); YYSTYPE code=$1; + #ifdef OPTIMIZE_BYTECODE_GET_ELEMENT if(!maybe_change_first_opcode(*code, OP::OP_VALUE__GET_ELEMENT, /*=>*/OP::OP_VALUE__GET_ELEMENT__WRITE)) #endif - { - size_t count=code->count(); - size_t len=6; + { + size_t count=code->count(); +#ifdef OPTIMIZE_BYTECODE_GET_SELF_ELEMENT + if( + count!=3 + || !maybe_change_first_opcode(*code, OP::OP_WITH_SELF__VALUE__GET_ELEMENT, /*=>*/OP::OP_WITH_SELF__VALUE__GET_ELEMENT__WRITE) + ) +#endif #ifdef OPTIMIZE_BYTECODE_GET_OBJECT_ELEMENT - if( - count==len - && maybe_change_first_opcode(*code, OP::OP_GET_OBJECT_ELEMENT, OP::OP_GET_ELEMENT, /*=>*/OP::OP_GET_OBJECT_ELEMENT__WRITE) - ){ - //P(*$$, *code, 0/*offset*/, count-1/*limit*/); // someday skip last OP_GET_ELEMENT - //break; - } else + if( + count!=5 + || !maybe_change_first_opcode(*code, OP::OP_GET_OBJECT_ELEMENT, /*=>*/OP::OP_GET_OBJECT_ELEMENT__WRITE) + ) #endif #ifdef OPTIMIZE_BYTECODE_GET_OBJECT_VAR_ELEMENT - if( - count==len - && maybe_change_first_opcode(*code, OP::OP_GET_OBJECT_VAR_ELEMENT, OP::OP_GET_ELEMENT, /*=>*/OP::OP_GET_OBJECT_VAR_ELEMENT__WRITE) - ){ - //P(*$$, *code, 0/*offset*/, count-1/*limit*/); // someday skip last OP_GET_ELEMENT - //break; - } else + if( + count!=5 + || !maybe_change_first_opcode(*code, OP::OP_GET_OBJECT_VAR_ELEMENT, /*=>*/OP::OP_GET_OBJECT_VAR_ELEMENT__WRITE) + ) #endif - - changetail_or_append(*code, - OP::OP_GET_ELEMENT, false, /*=>*/OP::OP_GET_ELEMENT__WRITE, - /*or */OP::OP_WRITE_VALUE - ); /* value=pop; wcontext.write(value) */ + { + changetail_or_append(*code, + OP::OP_GET_ELEMENT, false, /*=>*/OP::OP_GET_ELEMENT__WRITE, + /*or */OP::OP_WRITE_VALUE + ); /* value=pop; wcontext.write(value) */ } + } P(*$$, *code); }; get_value: '$' get_name_value { $$=$2 }; @@ -367,21 +368,28 @@ name_without_curly_rdive_read: name_with // self.xxx... => xxx... // OP_VALUE+origin+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+... if(first_name && *first_name==SELF_ELEMENT_NAME) { - O(*$$, OP::OP_WITH_SELF); /* stack: starting context */ - P(*$$, *diving_code, - /* skip over... */ - count>=4?4/*OP_VALUE+origin+string+OP_GET_ELEMENTx*/:3/*OP::OP_+origin+string*/); +#ifdef OPTIMIZE_BYTECODE_GET_SELF_ELEMENT + if(maybe_make_with_self_get_element(*$$, *diving_code, count)){ + // optimization for $self.field and ^self.method + } else +#endif + { + O(*$$, OP::OP_WITH_SELF); /* stack: starting context */ + P(*$$, *diving_code, + /* skip over... */ + count>=4?4/*OP_VALUE+origin+string+OP_GET_ELEMENTx*/:3/*OP::OP_+origin+string*/); + } } #ifdef OPTIMIZE_BYTECODE_GET_OBJECT_ELEMENT else if(maybe_make_get_object_element(*$$, *diving_code, count)){ - // optimisation for $object.field + ^object.method[ + // optimization for $object.field + ^object.method[ } #endif #ifdef OPTIMIZE_BYTECODE_GET_OBJECT_VAR_ELEMENT else if(maybe_make_get_object_var_element(*$$, *diving_code, count)){ - // optimisation for $object.$var + // optimization for $object.$var } #endif @@ -417,12 +425,9 @@ name_without_curly_rdive_code: name_adva put: '$' name_expr_wdive construct { $$=N(); -#if defined(OPTIMIZE_BYTECODE_CONSTRUCT) || defined(OPTIMIZE_BYTECODE_CALL_CONSTRUCT) - if(maybe_make_root_or_write_construct(*$$, *$2, *$3)){ - // $a(1), $.a(1), $a[b], $.a[b] - // $a($b), $.a($b), $a[$b], $.a[$b] - // $a($b.c), $.a($b.c), $a[$b.c], $.a[$b.c] - // $a($b.$c), $.a($b.$c), $a[$b.$c], $.a[$b.$c] +#ifdef OPTIMIZE_BYTECODE_CONSTRUCT + if(maybe_optimize_construct(*$$, *$2, *$3)){ + // $a(expr), $.a(expr), $a[value], $.a[value], $self.a[value], $self.a(expr) } else #endif { @@ -458,7 +463,7 @@ name_expr_wdive_write: '.' name_expr_div }; name_expr_wdive_class: class_prefix name_expr_dive_code { $$=$1; P(*$$, *$2) }; -construct: +construct: construct_square | construct_round | construct_curly @@ -679,7 +684,7 @@ class_static_prefix: STRING ':' { } #ifdef OPTIMIZE_BYTECODE_GET_CLASS // optimized OP_VALUE+origin+string+OP_GET_CLASS => OP_VALUE__GET_CLASS+origin+string - maybe_change_first_opcode(*$$, OP::OP_VALUE, OP::OP_VALUE__GET_CLASS, true/*assert if top opcode != OP_VALUE*/) + maybe_change_first_opcode(*$$, OP::OP_VALUE, OP::OP_VALUE__GET_CLASS) #else O(*$$, OP::OP_GET_CLASS); #endif