--- parser3/src/main/execute.C 2010/04/19 19:39:54 1.360 +++ parser3/src/main/execute.C 2010/05/25 03:58:25 1.362 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_EXECUTE_C="$Date: 2010/04/19 19:39:54 $"; +static const char * const IDENT_EXECUTE_C="$Date: 2010/05/25 03:58:25 $"; #include "pa_opcode.h" #include "pa_array.h" @@ -33,11 +33,7 @@ char *opcode_name[]={ // actions "WITH_ROOT", "WITH_SELF", "WITH_READ", "WITH_WRITE", -#ifdef OPTIMIZE_BYTECODE_GET_CLASS "VALUE__GET_CLASS", -#else - "GET_CLASS", -#endif "CONSTRUCT_VALUE", "CONSTRUCT_EXPR", "CURLY_CODE__CONSTRUCT", "WRITE_VALUE", "WRITE_EXPR_RESULT", "STRING__WRITE", #ifdef OPTIMIZE_BYTECODE_GET_ELEMENT @@ -167,9 +163,7 @@ void debug_dump(SAPI_Info& sapi_info, in if( opcode==OP::OP_VALUE || opcode==OP::OP_STRING__WRITE -#ifdef OPTIMIZE_BYTECODE_GET_CLASS || opcode==OP::OP_VALUE__GET_CLASS -#endif #ifdef OPTIMIZE_BYTECODE_GET_ELEMENT || opcode==OP::OP_VALUE__GET_ELEMENT || opcode==OP::OP_VALUE__GET_ELEMENT__WRITE @@ -263,8 +257,6 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - -#ifdef OPTIMIZE_BYTECODE_GET_CLASS case OP::OP_VALUE__GET_CLASS: { // maybe they do ^class:method[] call, remember the fact @@ -285,23 +277,6 @@ void Request::execute(ArrayOperation& op stack.push(*class_value); break; } -#else - case OP::OP_GET_CLASS: - { - // maybe they do ^class:method[] call, remember the fact - wcontext->set_somebody_entered_some_class(); - - const String& name=stack.pop().string(); debug_name=&name; - Value* value=get_class(name); - if(!value) - throw Exception(PARSER_RUNTIME, - &name, - "class is undefined"); - - stack.push(*value); - break; - } -#endif // OP_WITH case OP::OP_WITH_ROOT: { @@ -1603,3 +1578,67 @@ const String* Request::execute_virtual_m return 0; } + +const String* Request::get_method_filename(const Method* method){ + if(ArrayOperation* code=method->parser_code) + if(code){ + Operation::Origin origin={0, 0, 0}; + Array_iterator i(*code); + while( i.has_next() ){ + switch( i.next().code ){ + case OP::OP_CURLY_CODE__STORE_PARAM: + case OP::OP_EXPR_CODE__STORE_PARAM: + case OP::OP_CURLY_CODE__CONSTRUCT: + case OP::OP_NESTED_CODE: + case OP::OP_OBJECT_POOL: + case OP::OP_STRING_POOL: + case OP::OP_CALL: + case OP::OP_CALL__WRITE: + { + i.next(); // skip local ops + i.next(); // skip next opcode + // continue execution + } + case OP::OP_CONSTRUCT_OBJECT: + case OP::OP_CONSTRUCT_OBJECT__WRITE: + case OP::OP_VALUE: + case OP::OP_STRING__WRITE: + case OP::OP_VALUE__GET_CLASS: +#ifdef OPTIMIZE_BYTECODE_GET_OBJECT_ELEMENT + case OP::OP_GET_OBJECT_ELEMENT: + case OP::OP_GET_OBJECT_ELEMENT__WRITE: +#endif +#ifdef OPTIMIZE_BYTECODE_GET_OBJECT_VAR_ELEMENT + case OP::OP_GET_OBJECT_VAR_ELEMENT: + case OP::OP_GET_OBJECT_VAR_ELEMENT__WRITE: +#endif +#ifdef OPTIMIZE_BYTECODE_GET_ELEMENT + case OP::OP_VALUE__GET_ELEMENT: + case OP::OP_VALUE__GET_ELEMENT__WRITE: + case OP::OP_VALUE__GET_ELEMENT_OR_OPERATOR: + case OP::OP_WITH_ROOT__VALUE__GET_ELEMENT: +#endif +#ifdef OPTIMIZE_BYTECODE_GET_SELF_ELEMENT + case OP::OP_WITH_SELF__VALUE__GET_ELEMENT: + case OP::OP_WITH_SELF__VALUE__GET_ELEMENT__WRITE: +#endif +#ifdef OPTIMIZE_BYTECODE_CONSTRUCT + case OP::OP_WITH_ROOT__VALUE__CONSTRUCT_EXPR: + case OP::OP_WITH_ROOT__VALUE__CONSTRUCT_VALUE: + case OP::OP_WITH_WRITE__VALUE__CONSTRUCT_EXPR: + case OP::OP_WITH_WRITE__VALUE__CONSTRUCT_VALUE: + case OP::OP_WITH_SELF__VALUE__CONSTRUCT_EXPR: + case OP::OP_WITH_SELF__VALUE__CONSTRUCT_VALUE: +#endif + { + origin=i.next().origin; + break; + } + } + if(origin.file_no) + return get_used_filename(origin.file_no); + } + } + return 0; +} +