--- parser3/src/main/compile_tools.h 2016/04/01 16:27:32 1.110 +++ parser3/src/main/compile_tools.h 2026/04/25 13:38:46 1.123 @@ -1,14 +1,14 @@ /** @file Parser: compiler support helper functions decls. - Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) - Author: Alexandr Petrosian (http://paf.design.ru) + Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com) + Authors: Konstantin Morshnev , Alexandr Petrosian */ #ifndef COMPILE_TOOLS #define COMPILE_TOOLS -#define IDENT_COMPILE_TOOLS_H "$Id: compile_tools.h,v 1.110 2016/04/01 16:27:32 moko Exp $" +#define IDENT_COMPILE_TOOLS_H "$Id: compile_tools.h,v 1.123 2026/04/25 13:38:46 moko Exp $" #include "pa_opcode.h" #include "pa_types.h" @@ -18,11 +18,6 @@ /// used to track source column number #define TAB_SIZE 8 -#define METHOD_CALL_TYPE_STATIC "static" -#define METHOD_CALL_TYPE_DYNAMIC "dynamic" -const String method_call_type_static(METHOD_CALL_TYPE_STATIC); -const String method_call_type_dynamic(METHOD_CALL_TYPE_DYNAMIC); - enum lexical_state { LS_USER, LS_NAME_SQUARE_PART, LS_USER_COMMENT, @@ -89,10 +84,11 @@ public: bool in_call_value; bool explicit_result; bool append; + bool array; //@} /// output: filled input 'methods' and 'error' if any - char error[MAX_STRING]; + const char *error; Parse_control(Request& arequest, VStateless_class* aclass, @@ -119,12 +115,14 @@ public: ls_sp(0), in_call_value(false), explicit_result(false), - append(false) { + append(false), + array(false), + error("") { *cclasses+=aclass; } - /// true if exception should be rised + /// false if exception should be rised bool class_add(){ if(cclass_new){ cclass=cclass_new; @@ -132,19 +130,16 @@ public: cclass_new=0; append=false; // append to request's classes - if(!request.allow_class_replace) - return request.classes().put_dont_replace(cclass->type(), cclass) != 0; - request.classes().put(cclass->type(), cclass); + return request.add_class(cclass->type(), cclass); } - return false; + return true; } VStateless_class* get_existed_class(VStateless_class* aclass){ // checking existence of the class during processing @OPTIONS\npartial - // method should't use get_class because the last one will call operator @autouse[] if the class wasn't loaded + // can't use get_class because it will call @autouse[] if the class wasn't loaded if(aclass) - if(Value* class_value=request.classes().get(aclass->type())) - return class_value->get_class(); + return request.classes().get(aclass->type()); return 0; } @@ -287,21 +282,19 @@ bool change_first(ArrayOperation& opcode #ifdef OPTIMIZE_BYTECODE_GET_OBJECT_ELEMENT // OP_VALUE+origin+value+OP_GET_ELEMENT+OP_VALUE+origin+value+OP_GET_ELEMENT => OP_GET_OBJECT_ELEMENT+origin+value+origin+value -inline bool maybe_make_get_object_element(ArrayOperation& opcodes, ArrayOperation& diving_code, size_t divine_count){ - if(divine_count<8) - return false; - - assert(diving_code[0].code==OP::OP_VALUE); +inline bool maybe_make_get_object_element(ArrayOperation& opcodes, ArrayOperation& diving_code, size_t diving_count){ if( - diving_code[3].code==OP::OP_GET_ELEMENT + diving_count>=8 + && diving_code[0].code==OP::OP_VALUE + && diving_code[3].code==OP::OP_GET_ELEMENT && diving_code[4].code==OP::OP_VALUE && diving_code[7].code==OP::OP_GET_ELEMENT ){ O(opcodes, OP::OP_GET_OBJECT_ELEMENT); - P(opcodes, diving_code, 1/*offset*/, 2/*limit*/); // copy first origin+value + P(opcodes, diving_code, 1 /*offset*/, 2 /*limit*/); // copy first origin+value P(opcodes, diving_code, 5, 2); // second origin+value - if(divine_count>8) - P(opcodes, diving_code, 8/*offset*/); // tail + if(diving_count>8) + P(opcodes, diving_code, 8 /*offset*/); // tail return true; } return false; @@ -311,20 +304,18 @@ inline bool maybe_make_get_object_elemen #ifdef OPTIMIZE_BYTECODE_GET_OBJECT_VAR_ELEMENT // OP_VALUE+origin+value+OP_GET_ELEMENT+OP_WITH_READ+OP_VALUE+origin+value+OP_GET_ELEMENT+OP_GET_ELEMENT => OP_GET_OBJECT_VAR_ELEMENT+origin+value+origin+value -inline bool maybe_make_get_object_var_element(ArrayOperation& opcodes, ArrayOperation& diving_code, size_t divine_count){ - if(divine_count!=10) - return false; - - assert(diving_code[0].code==OP::OP_VALUE); +inline bool maybe_make_get_object_var_element(ArrayOperation& opcodes, ArrayOperation& diving_code, size_t diving_count){ if( - diving_code[3].code==OP::OP_GET_ELEMENT + diving_count==10 + && diving_code[0].code==OP::OP_VALUE + && diving_code[3].code==OP::OP_GET_ELEMENT && diving_code[4].code==OP::OP_WITH_READ && diving_code[5].code==OP::OP_VALUE && diving_code[8].code==OP::OP_GET_ELEMENT && diving_code[9].code==OP::OP_GET_ELEMENT ){ O(opcodes, OP::OP_GET_OBJECT_VAR_ELEMENT); - P(opcodes, diving_code, 1/*offset*/, 2/*limit*/); // copy first origin+value + P(opcodes, diving_code, 1 /*offset*/, 2 /*limit*/); // copy first origin+value P(opcodes, diving_code, 6, 2); // second origin+value return true; } @@ -333,11 +324,11 @@ inline bool maybe_make_get_object_var_el #endif -bool maybe_make_self(ArrayOperation& opcodes, ArrayOperation& diving_code, size_t divine_count); +bool maybe_make_self(ArrayOperation& opcodes, ArrayOperation& diving_code, size_t diving_count); -#ifdef OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL bool maybe_append_simple_diving_code(ArrayOperation& code, ArrayOperation& diving_code); +#ifdef OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL bool is_special_element(ArrayOperation& opcodes); #endif