From b689435c30c7f2050e0035d7d8bfa56923a519b8 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 28 Sep 2025 20:42:49 +0100 Subject: [PATCH 01/33] groundwork for vectors in script --- Engine/source/console/console.h | 33 +- Engine/source/console/torquescript/CMDgram.y | 11 + Engine/source/console/torquescript/ast.h | 11 + .../source/console/torquescript/astAlloc.cpp | 10 + .../source/console/torquescript/astNodes.cpp | 18 + .../source/console/torquescript/cmdgram.cpp | 1694 +++++++++-------- .../source/console/torquescript/codeBlock.cpp | 13 + .../console/torquescript/compiledEval.cpp | 43 + Engine/source/console/torquescript/compiler.h | 3 + 9 files changed, 1008 insertions(+), 828 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 82f953eb17..7216519897 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -125,7 +125,8 @@ enum ConsoleValueType cvFloat = -3, cvString = -2, cvSTEntry = -1, - cvConsoleValueType = 0 + cvConsoleValueType = 0, + cvVector = 1, }; class ConsoleValue @@ -160,7 +161,12 @@ class ConsoleValue TORQUE_FORCEINLINE void cleanupData() { - if (type <= cvString && bufferLen > 0) + if (type == cvVector && dataPtr) + { + delete static_cast*>(dataPtr); + dataPtr = nullptr; + } + else if (type <= cvString && bufferLen > 0) { dFree(s); bufferLen = 0; @@ -212,6 +218,17 @@ class ConsoleValue case cvNULL: std::cout << "Ref already cleared!"; break; + case cvVector: + if (ref.dataPtr) + { + Vector* newVec = new Vector(*static_cast*>(ref.dataPtr)); + setVector(newVec); + } + else + { + setVector(new Vector()); + } + break; case cvInteger: setInt(ref.i); break; @@ -268,6 +285,18 @@ class ConsoleValue return dAtoi(getConsoleData()); } + TORQUE_FORCEINLINE void setVector(Vector* v) + { + cleanupData(); + type = cvVector; + dataPtr = v; + } + + TORQUE_FORCEINLINE Vector* getVector() const + { + return (type == cvVector) ? static_cast*>(dataPtr) : NULL; + } + TORQUE_FORCEINLINE const char* getString() const { if (isStringType()) diff --git a/Engine/source/console/torquescript/CMDgram.y b/Engine/source/console/torquescript/CMDgram.y index 9e1b305435..fed644d766 100644 --- a/Engine/source/console/torquescript/CMDgram.y +++ b/Engine/source/console/torquescript/CMDgram.y @@ -461,6 +461,17 @@ expr { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, NULL); } | VAR '[' aidx_expr ']' { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); } + | '[' expr_list_decl ']' + { + Vector elems; + if ($2) { + // expr_list already chains ExprNodes using append(), + // so walk and collect them + for (ExprNode* e = $2; e; e = (ExprNode*)e->getNext()) + elems.push_back(e); + } + $$ = VectorExprNode::alloc(@1.first_line, elems); + } ; /* | rwDEFINE '(' var_list_decl ')' '{' statement_list '}' diff --git a/Engine/source/console/torquescript/ast.h b/Engine/source/console/torquescript/ast.h index 1c41958a3a..efccd51c78 100644 --- a/Engine/source/console/torquescript/ast.h +++ b/Engine/source/console/torquescript/ast.h @@ -134,6 +134,17 @@ struct ExprNode : StmtNode virtual ExprNodeName getExprNodeNameEnum() const { return NameExprNode; } }; +struct VectorExprNode : ExprNode +{ + Vector elements; ///< Elements of the vector literal + + static VectorExprNode* alloc(S32 lineNumber, const Vector& elements); + + U32 compile(CodeStream& codeStream, U32 ip, TypeReq type) override; + TypeReq getPreferredType() override { return TypeReqNone; } + DBG_STMT_TYPE(VectorExprNode); +}; + struct ReturnStmtNode : StmtNode { ExprNode* expr; diff --git a/Engine/source/console/torquescript/astAlloc.cpp b/Engine/source/console/torquescript/astAlloc.cpp index 9b149b598f..c775ab751c 100644 --- a/Engine/source/console/torquescript/astAlloc.cpp +++ b/Engine/source/console/torquescript/astAlloc.cpp @@ -37,6 +37,16 @@ using namespace Compiler; //------------------------------------------------------------ +VectorExprNode* VectorExprNode::alloc(S32 lineNumber, const Vector& elements) +{ + VectorExprNode* ret = (VectorExprNode*)consoleAlloc(sizeof(VectorExprNode)); + constructInPlace(ret); + ret->dbgLineNumber = lineNumber; + ret->optimizedNode = NULL; + ret->elements = elements; + return ret; +} + BreakStmtNode* BreakStmtNode::alloc(S32 lineNumber) { BreakStmtNode* ret = (BreakStmtNode*)consoleAlloc(sizeof(BreakStmtNode)); diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index df824c260a..6d709b8580 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -370,6 +370,24 @@ U32 IterStmtNode::compileStmt(CodeStream& codeStream, U32 ip) return codeStream.tell(); } +//------------------------------------------------------------ +// +U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) +{ + // Emit instruction to create vector + codeStream.emit(OP_CREATE_VECTOR); + codeStream.emit(elements.size()); + + for (U32 i = 0; i < elements.size(); i++) + { + ip = elements[i]->compile(codeStream, ip, TypeReqNone); + codeStream.emit(OP_VECTOR_PUSH); + } + + return ip; +} + +// //------------------------------------------------------------ U32 ConditionalExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) diff --git a/Engine/source/console/torquescript/cmdgram.cpp b/Engine/source/console/torquescript/cmdgram.cpp index ab15ffc736..762f389ab6 100644 --- a/Engine/source/console/torquescript/cmdgram.cpp +++ b/Engine/source/console/torquescript/cmdgram.cpp @@ -629,16 +629,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2858 +#define YYLAST 2978 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 100 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 41 /* YYNRULES -- Number of rules. */ -#define YYNRULES 162 +#define YYNRULES 163 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 380 +#define YYNSTATES 384 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 329 @@ -705,12 +705,12 @@ static const yytype_int16 yyrline[] = 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, - 454, 456, 458, 460, 462, 484, 486, 491, 493, 498, - 500, 505, 507, 509, 511, 513, 515, 517, 519, 521, - 523, 525, 527, 532, 534, 536, 538, 540, 542, 544, - 546, 548, 550, 555, 557, 559, 569, 571, 577, 578, - 583, 585, 591, 592, 597, 599, 604, 606, 608, 610, - 612, 617, 619 + 454, 456, 458, 460, 462, 464, 495, 497, 502, 504, + 509, 511, 516, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 543, 545, 547, 549, 551, 553, + 555, 557, 559, 561, 566, 568, 570, 580, 582, 588, + 589, 594, 596, 602, 603, 608, 610, 615, 617, 619, + 621, 623, 628, 630 }; #endif @@ -757,12 +757,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-310) +#define YYPACT_NINF (-303) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-76) +#define YYTABLE_NINF (-152) #define yytable_value_is_error(Yyn) \ 0 @@ -771,44 +771,45 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - -310, 31, 397, -310, 4, 2, 2, -3, 32, 27, - 167, 34, 489, 40, 41, 43, 2, 44, 47, 66, - 55, -310, 67, 115, -33, -310, -310, -310, -310, 1002, - 1002, 1002, 1002, 1002, -310, -310, -310, -310, -310, -310, - -310, -310, -310, -310, -310, 59, 2465, 2727, -310, 71, - -310, -310, -12, -310, 1002, 81, 82, -310, -310, 1002, - -310, -310, -310, 1115, -310, 1002, -310, -310, 124, 708, - 108, 129, 97, 1002, 1002, 107, 1002, 1002, 1002, -310, - -310, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, - 1002, 1002, -310, 1002, 133, -34, -34, 1169, -34, -34, - -310, 1002, 1002, 1002, 1002, 1002, 1002, 137, 1002, 1002, - 1002, 1002, 1002, 2, 2, 1002, 1002, 1002, 1002, 1002, - 1002, 1002, 1002, 1002, 1002, 1002, 750, -310, 141, 143, - 1223, 9, 1002, 1277, -310, 1331, 549, 127, 792, 1385, - 156, 162, 1002, 1439, 1493, 183, 1007, 1061, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - -39, 2465, 131, 149, 159, -310, 292, 292, -34, -34, - 2722, 2722, -43, 2606, 2664, -34, 2635, 2786, -310, -310, - 39, 39, 2693, 2693, 2722, 2722, 2577, 2548, 2786, 1547, - 2786, 1002, 2465, -310, 142, 154, 160, -310, 1002, 158, - 2465, 158, 489, 489, -310, -310, 1002, 319, 1601, 834, - 1002, 1002, 1655, 157, 161, 5, -310, -310, 179, 1002, - -310, 1002, 2747, -310, 1002, 1002, 1002, 1002, 1002, -31, - 165, 190, 141, 135, 197, 171, 171, 231, -310, 1709, - 489, 1763, 876, 918, 1817, 1871, 1925, 184, 217, 217, - 187, -310, 194, 1979, 2465, 1002, -310, 2465, 199, 200, - -38, 2519, -310, -310, -310, 204, 158, -310, 1002, 205, - 211, 489, -310, -310, 489, 489, 2033, 489, 2087, 960, - 489, 489, 193, 1002, 207, 210, -310, -310, -310, 2465, - -310, -310, -310, 594, 214, 171, 149, 216, 222, -310, - -310, -310, 489, -310, 489, 489, 2141, -310, -310, 70, - -5, 2465, -310, -310, -310, -310, 221, 213, 213, -310, - -310, -310, 489, 233, -30, 246, 224, 70, -310, 1002, - -310, 639, 226, 228, 227, 23, 213, 229, -310, 1002, - 1002, 1002, -29, 230, -310, 2465, 444, -310, 213, -310, - -310, 235, 23, -310, 2195, 2249, -23, 1002, 1002, -310, - 237, -310, 236, -310, -310, -310, 248, 2303, -19, -310, - -310, 1002, -310, 249, 684, 2357, 1002, -310, 2411, -310 + -303, 27, 401, -303, -5, -24, -24, -19, -16, -8, + 309, -4, 507, -3, 28, 30, -24, 31, 34, 7, + 35, -303, 41, 311, -27, -303, -303, -303, -303, 1063, + 1063, 1063, 1063, 1063, 1063, -303, -303, -303, -303, -303, + -303, -303, -303, -303, -303, -303, 29, 2627, 2851, -303, + 36, -303, -303, -25, -303, 1063, 37, 39, -303, -303, + 1063, -303, -303, -303, 1223, -303, 1063, -303, -303, 88, + 727, 66, 68, 51, 1063, 1063, 47, 1063, 1063, 1063, + -303, -303, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, + 1063, 1063, 1063, -303, 1063, 71, 33, 33, 1277, 33, + 33, 2627, 32, 62, -303, 1063, 1063, 1063, 1063, 1063, + 1063, 103, 1063, 1063, 1063, 1063, 1063, -24, -24, 1063, + 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, + 769, -303, 119, 133, 1331, 1087, 1063, 1385, -303, 1439, + 568, 117, 811, 1493, 152, 153, 1063, 1547, 1601, 174, + 1115, 1169, 2627, 2627, 2627, 2627, 2627, 2627, 2627, 2627, + 2627, 2627, 2627, 2627, -46, 122, 132, -303, -303, 1063, + 180, 180, 33, 33, -10, -10, -42, 2739, 2797, 33, + 2768, 2906, -303, -303, 733, 733, 2826, 2826, -10, -10, + 2710, 2681, 2906, 1655, 2906, 1063, 2627, -303, 130, 134, + 135, -303, 1063, 136, 2627, 136, 507, 507, -303, -303, + 1063, 853, 1709, 895, 1063, 1063, 1763, 137, 138, 12, + -303, -303, 151, 1063, -303, 1063, 2867, -303, 1063, 2627, + 1063, 1063, 1063, -15, 139, 156, 119, 96, 1817, 158, + 143, 143, 193, -303, 1871, 507, 1925, 937, 979, 1979, + 2033, 2087, 146, 177, 177, 147, -303, 155, 2141, 2627, + 1063, -303, 164, 169, -41, 170, -303, -303, -303, 172, + 136, -303, 1063, 173, 182, 507, -303, -303, 507, 507, + 2195, 507, 2249, 1021, 507, 507, 148, 1063, 178, 183, + -303, -303, -303, 2627, -303, -303, -303, 613, 149, 143, + 62, 185, 190, -303, -303, -303, 507, -303, 507, 507, + 2303, -303, -303, 58, -9, 2627, -303, -303, -303, -303, + 206, 131, 131, -303, -303, -303, 507, 214, -33, 227, + 210, 58, -303, 1063, -303, 658, 212, 219, 220, 20, + 131, 223, -303, 1063, 1063, 1063, -29, 221, -303, 2627, + 462, -303, 131, -303, -303, 228, 20, -303, 2357, 2411, + -34, 1063, 1063, -303, 230, -303, 229, -303, -303, -303, + 239, 2465, -18, -303, -303, 1063, -303, 241, 703, 2519, + 1063, -303, 2573, -303 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -819,61 +820,62 @@ static const yytype_uint8 yydefact[] = 3, 0, 2, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 88, 113, 111, 26, 112, 105, 106, 0, - 0, 0, 0, 0, 4, 7, 5, 6, 17, 135, - 18, 13, 14, 15, 16, 0, 0, 109, 110, 76, - 133, 134, 0, 119, 0, 0, 0, 19, 20, 0, - 108, 88, 21, 0, 76, 0, 11, 53, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, - 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 138, 148, 0, 86, 87, 0, 104, 103, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 149, 4, 7, 5, 6, 17, + 136, 18, 13, 14, 15, 16, 0, 0, 109, 110, + 76, 134, 135, 0, 120, 0, 0, 0, 19, 20, + 0, 108, 88, 21, 0, 76, 0, 11, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 140, 29, 0, - 0, 42, 42, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 136, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 161, - 0, 150, 0, 149, 0, 77, 82, 83, 84, 85, - 90, 91, 115, 81, 80, 79, 78, 102, 117, 118, - 97, 98, 94, 95, 92, 93, 99, 96, 100, 0, - 101, 0, 141, 31, 0, 30, 0, 120, 42, 40, - 43, 40, 0, 0, 52, 12, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 9, 146, 0, 0, - 24, 0, 114, 143, 0, 148, 148, 0, 0, 0, - 0, 0, 29, 0, 0, 44, 44, 61, 63, 0, + 123, 122, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 139, 149, 0, 86, 87, 0, 104, + 103, 151, 0, 150, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 0, 162, 0, 139, 151, 0, 0, - 0, 89, 142, 11, 32, 0, 40, 41, 0, 0, - 0, 0, 64, 72, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 147, 25, 137, - 144, 145, 116, 0, 0, 44, 45, 35, 39, 62, - 71, 70, 0, 68, 0, 0, 0, 73, 74, 152, - 0, 59, 54, 55, 27, 11, 0, 46, 46, 69, - 67, 66, 0, 0, 0, 0, 0, 153, 154, 0, - 11, 0, 37, 0, 0, 48, 47, 0, 65, 0, - 0, 0, 0, 0, 155, 60, 56, 28, 46, 50, - 34, 0, 49, 38, 0, 0, 0, 0, 0, 33, - 0, 58, 0, 51, 158, 156, 0, 0, 0, 11, - 36, 0, 157, 0, 57, 0, 0, 159, 0, 160 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 141, 29, 0, 0, 42, 42, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 137, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 162, 0, 0, 0, 77, 115, 0, + 82, 83, 84, 85, 90, 91, 116, 81, 80, 79, + 78, 102, 118, 119, 97, 98, 94, 95, 92, 93, + 99, 96, 100, 0, 101, 0, 142, 31, 0, 30, + 0, 121, 42, 40, 43, 40, 0, 0, 52, 12, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 9, 147, 0, 0, 24, 0, 114, 144, 149, 152, + 149, 0, 0, 0, 0, 0, 29, 0, 43, 0, + 44, 44, 61, 63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 163, + 0, 140, 0, 0, 0, 89, 143, 11, 32, 0, + 40, 41, 0, 0, 0, 0, 64, 72, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 148, 25, 138, 145, 146, 117, 0, 0, 44, + 45, 35, 39, 62, 71, 70, 0, 68, 0, 0, + 0, 73, 74, 153, 0, 59, 54, 55, 27, 11, + 0, 46, 46, 69, 67, 66, 0, 0, 0, 0, + 0, 154, 155, 0, 11, 0, 37, 0, 0, 48, + 47, 0, 65, 0, 0, 0, 0, 0, 156, 60, + 56, 28, 46, 50, 34, 0, 49, 38, 0, 0, + 0, 0, 0, 33, 0, 58, 0, 51, 159, 157, + 0, 0, 0, 11, 36, 0, 158, 0, 57, 0, + 0, 160, 0, 161 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -310, -310, -310, -310, -310, -310, -256, -1, -140, 64, - -310, -310, -94, -188, -121, -230, -309, -28, 30, -310, - -246, -310, -310, -310, -310, -310, -310, 38, -310, -310, - 19, -45, -2, -310, -310, -138, -187, -310, 0, -300, - -190 + -303, -303, -303, -303, -303, -303, -259, -1, -142, 61, + -303, -303, -47, -196, -124, -223, -298, -40, -96, -303, + -249, -303, -303, -303, -303, -303, -303, 38, -303, -303, + 16, -45, -2, -303, -303, -88, -193, -303, -14, -302, + -227 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 1, 2, 34, 35, 215, 136, 67, 37, 194, - 195, 38, 39, 235, 199, 269, 334, 335, 68, 40, - 284, 310, 41, 42, 43, 44, 45, 46, 47, 48, - 55, 92, 64, 50, 51, 162, 163, 326, 336, 328, - 160 + 0, 1, 2, 35, 36, 219, 140, 68, 38, 198, + 199, 39, 40, 240, 203, 273, 338, 339, 69, 41, + 288, 314, 42, 43, 44, 45, 46, 47, 48, 49, + 56, 93, 65, 51, 52, 102, 103, 330, 340, 332, + 164 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -881,425 +883,437 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 49, 36, 127, 285, 229, 216, 270, 293, 4, 337, - 49, 201, 226, 236, 5, 6, 60, 107, 221, 221, - 340, 357, 93, 329, 247, 56, 224, 344, 5, 6, - 262, 3, 113, 114, 221, 72, 344, 260, 221, 362, - 53, 20, 52, 128, 21, 61, 23, 24, 63, 227, - 26, 27, 28, 330, 29, 30, 57, 54, 94, 331, - 222, 292, 341, 358, 31, 316, 250, 95, 96, 97, - 98, 99, 32, 33, 346, 251, 366, 233, 295, 129, - 373, 296, 59, 101, 102, 103, 104, 258, 259, 65, - 107, 58, 130, 110, 323, 69, 70, 133, 71, 73, - 361, 198, 74, 135, 75, 113, 114, 139, 324, 325, - 76, 143, 144, 374, 146, 147, 148, 77, 100, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - -75, 161, 178, 179, 49, 205, 131, 132, 137, 166, - 167, 168, 169, 170, 171, 140, 173, 174, 175, 176, - 177, 356, 142, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 192, 78, 141, 145, 368, 200, - 200, 164, 5, 6, 60, 172, 208, 256, 193, 210, - 212, 196, 206, 79, 80, 211, 4, 223, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 230, 20, - 49, 49, 21, 61, 23, 24, 224, 91, 26, 27, - 28, 231, 29, 30, 225, 232, 234, 248, 5, 6, - 252, 249, 31, 333, 333, 263, 62, 264, 268, 161, - 32, 33, 237, 238, 266, 267, 200, 323, 49, 271, - 282, 351, 333, 283, 239, 241, 286, 244, 245, 246, - 287, 324, 325, 309, 333, 290, 291, 253, 351, 254, - 294, 297, 257, 161, 161, 159, 261, 298, 312, 49, - 273, 313, 49, 49, 315, 49, 317, 332, 49, 49, - 276, 278, 318, 339, 342, 343, 348, 349, 350, 359, - 353, 49, 205, 289, 363, 369, 265, 370, 371, 376, - 49, 299, 49, 49, 300, 301, 161, 303, 352, 327, - 307, 308, 0, 0, 0, 0, 0, 306, 0, 0, - 49, 311, 0, 0, 5, 6, 60, 0, 0, 49, - 205, 0, 319, 0, 320, 321, 0, 0, 103, 104, - 0, 0, 0, 107, 49, 205, 110, 0, 0, 0, - 0, 20, 338, 0, 21, 61, 23, 24, 113, 114, - 26, 27, 28, 0, 29, 30, 0, 345, 0, 0, - 0, 0, 49, 205, 31, 240, 0, 354, 355, 159, - 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 367, 159, 0, 0, 0, - 4, 0, 5, 6, 7, 0, 8, 0, 9, 375, - 10, 11, 12, 0, 378, 0, 0, 13, 14, 15, - 0, 16, 17, 0, 18, 0, 19, 0, 0, 20, - 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, - 28, 0, 29, 30, 0, 0, 0, 0, 0, 5, - 6, 7, 31, 8, 0, 9, 0, 10, 11, 12, - 32, 33, 0, 360, 13, 14, 15, 0, 16, 17, - 283, 18, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 5, 6, 7, 0, 8, 31, - 9, 0, 10, 11, 12, 0, 0, 32, 33, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, + 50, 37, 233, 131, 264, 289, 165, 220, 297, 241, + 50, 225, 205, 230, 54, 4, 225, 344, 274, 333, + 252, 361, 57, 225, 341, 5, 6, 3, 94, 348, + 132, 55, 73, 53, 105, 106, 107, 108, 348, 225, + 58, 111, 169, 59, 114, 76, 266, 60, 64, 334, + 231, 66, 70, 226, 366, 116, 117, 118, 296, 345, + 335, 119, 120, 362, 95, 370, 133, 96, 97, 98, + 99, 100, 101, 255, 299, 350, 320, 256, 237, 300, + 127, 377, 327, 71, 111, 72, 74, 129, 104, 75, + 77, 78, 135, 134, 136, -75, 328, 329, 137, 117, + 118, 365, 141, 144, 139, 145, 146, 149, 143, 166, + 242, 243, 147, 148, 378, 150, 151, 152, 360, 169, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 168, 101, 182, 183, 372, 5, 6, 50, 209, + 262, 176, 263, 170, 171, 172, 173, 174, 175, 277, + 177, 178, 179, 180, 181, 327, 197, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 196, 328, + 329, 200, 210, 204, 204, 214, 215, 4, 227, 303, + 212, 261, 304, 305, 216, 307, 234, 228, 311, 312, + 236, 235, 257, 268, 239, 270, 271, 253, 254, 267, + 272, 275, 286, 287, 50, 50, 290, 229, 313, 319, + 323, 291, 324, 325, 105, 106, 107, 108, 109, 110, + 294, 111, 112, 113, 114, 295, 107, 108, 298, 301, + 342, 111, 115, 101, 114, 116, 117, 118, 302, 316, + 238, 119, 120, 50, 317, 321, 117, 118, 244, 246, + 322, 249, 250, 251, 121, 122, 123, 124, 125, 126, + 127, 258, 336, 259, 343, 346, 101, 129, 101, 163, + 265, 347, 352, 50, 337, 337, 50, 50, 353, 50, + 363, 354, 50, 50, 357, 280, 282, 367, 373, 375, + 374, 380, 355, 337, 0, 50, 209, 269, 293, 331, + 356, 0, 0, 0, 50, 337, 50, 50, 0, 355, + 101, 0, 0, 0, 5, 6, 61, 0, 0, 0, + 0, 310, 0, 0, 50, 315, 0, 0, 0, 0, + 0, 0, 0, 50, 209, 0, 0, 0, 0, 0, + 0, 20, 0, 0, 21, 62, 23, 24, 50, 209, 26, 27, 28, 0, 29, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 66, - 0, 0, 32, 33, 5, 6, 7, 0, 8, 0, - 9, 0, 10, 11, 12, 0, 0, 0, 0, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 5, - 6, 7, 0, 8, 31, 9, 0, 10, 11, 12, - 204, 0, 32, 33, 13, 14, 15, 0, 16, 17, - 0, 18, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 5, 6, 7, 0, 8, 31, - 9, 0, 10, 11, 12, 314, 0, 32, 33, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 5, - 6, 7, 0, 8, 31, 9, 0, 10, 11, 12, - 347, 0, 32, 33, 13, 14, 15, 0, 16, 17, - 0, 18, 0, 5, 6, 60, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 20, 0, 0, 21, 61, 23, 24, 32, 33, 26, - 27, 28, 0, 29, 30, 5, 6, 60, 0, 0, - 0, 0, 0, 31, 0, 0, 0, 138, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 21, 61, 23, 24, 0, - 0, 26, 27, 28, 0, 29, 30, 5, 6, 60, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 191, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 21, 61, 23, - 24, 0, 0, 26, 27, 28, 0, 29, 30, 5, - 6, 60, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 207, 0, 0, 0, 32, 33, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, - 61, 23, 24, 0, 0, 26, 27, 28, 0, 29, - 30, 5, 6, 60, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 243, 0, 0, 0, 32, 33, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, - 0, 21, 61, 23, 24, 0, 0, 26, 27, 28, - 0, 29, 30, 5, 6, 60, 0, 0, 0, 0, - 0, 31, 275, 0, 0, 0, 0, 0, 0, 32, - 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 21, 61, 23, 24, 0, 0, 26, - 27, 28, 0, 29, 30, 5, 6, 60, 0, 0, - 0, 0, 0, 31, 277, 0, 0, 0, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 21, 61, 23, 24, 0, - 0, 26, 27, 28, 0, 29, 30, 5, 6, 60, - 0, 0, 0, 0, 0, 31, 305, 0, 0, 0, - 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 21, 61, 23, - 24, 0, 0, 26, 27, 28, 0, 29, 30, 0, - 0, 101, 102, 103, 104, 105, 106, 31, 107, 108, - 109, 110, 0, 217, 218, 32, 33, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 79, 0, 0, 31, 0, 0, 0, 63, 0, + 0, 349, 32, 33, 0, 0, 50, 209, 0, 80, + 81, 358, 359, 163, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 0, 0, 0, 0, 0, 371, + 163, 34, 0, 92, 4, 0, 5, 6, 7, 0, + 8, 0, 9, 379, 10, 11, 12, 0, 382, 0, + 0, 13, 14, 15, 0, 16, 17, 0, 18, 0, + 19, 0, 0, 20, 0, 0, 21, 22, 23, 24, + 0, 25, 26, 27, 28, 0, 29, 30, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 32, 33, 0, 5, 6, 7, + 0, 8, 0, 9, 0, 10, 11, 12, 0, 0, + 0, 364, 13, 14, 15, 0, 16, 17, 287, 18, + 0, 0, 0, 34, 20, 0, 0, 21, 22, 23, + 24, 0, 25, 26, 27, 28, 0, 29, 30, 0, + 0, 0, 5, 6, 7, 0, 8, 31, 9, 0, + 10, 11, 12, 0, 0, 32, 33, 13, 14, 15, + 0, 16, 17, 0, 18, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, + 28, 0, 29, 30, 34, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 67, 0, 0, + 32, 33, 0, 5, 6, 7, 0, 8, 0, 9, + 0, 10, 11, 12, 0, 0, 0, 0, 13, 14, + 15, 0, 16, 17, 0, 18, 0, 0, 0, 34, + 20, 0, 0, 21, 22, 23, 24, 0, 25, 26, + 27, 28, 0, 29, 30, 0, 0, 0, 5, 6, + 7, 0, 8, 31, 9, 0, 10, 11, 12, 208, + 0, 32, 33, 13, 14, 15, 0, 16, 17, 0, + 18, 0, 0, 0, 0, 20, 0, 0, 21, 22, + 23, 24, 0, 25, 26, 27, 28, 0, 29, 30, + 34, 0, 0, 5, 6, 7, 0, 8, 31, 9, + 0, 10, 11, 12, 318, 0, 32, 33, 13, 14, + 15, 0, 16, 17, 0, 18, 0, 0, 0, 0, + 20, 0, 0, 21, 22, 23, 24, 0, 25, 26, + 27, 28, 0, 29, 30, 34, 0, 0, 5, 6, + 7, 0, 8, 31, 9, 0, 10, 11, 12, 351, + 0, 32, 33, 13, 14, 15, 0, 16, 17, 0, + 18, 0, 5, 6, 61, 20, 0, 0, 21, 22, + 23, 24, 0, 25, 26, 27, 28, 0, 29, 30, + 34, 0, 0, 0, 0, 0, 0, 0, 31, 20, + 0, 0, 21, 62, 23, 24, 32, 33, 26, 27, + 28, 0, 29, 30, 5, 6, 61, 105, 106, 107, + 108, 0, 31, 0, 111, 0, 142, 114, 0, 0, + 32, 33, 0, 0, 0, 34, 0, 0, 0, 117, + 118, 20, 0, 0, 21, 62, 23, 24, 0, 0, + 26, 27, 28, 0, 29, 30, 5, 6, 61, 34, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 195, + 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 0, 0, 21, 62, 23, 24, + 0, 0, 26, 27, 28, 0, 29, 30, 5, 6, + 61, 34, 0, 0, 0, 0, 31, 0, 0, 0, + 211, 0, 0, 0, 32, 33, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 21, 62, + 23, 24, 0, 0, 26, 27, 28, 0, 29, 30, + 5, 6, 61, 34, 0, 0, 0, 0, 31, 245, + 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, + 21, 62, 23, 24, 0, 0, 26, 27, 28, 0, + 29, 30, 5, 6, 61, 34, 0, 0, 0, 0, + 31, 0, 0, 0, 248, 0, 0, 0, 32, 33, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 62, 23, 24, 0, 0, 26, 27, + 28, 0, 29, 30, 5, 6, 61, 34, 0, 0, + 0, 0, 31, 279, 0, 0, 0, 0, 0, 0, + 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 0, 21, 62, 23, 24, 0, 0, + 26, 27, 28, 0, 29, 30, 5, 6, 61, 34, + 0, 0, 0, 0, 31, 281, 0, 0, 0, 0, + 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 0, 0, 21, 62, 23, 24, + 0, 0, 26, 27, 28, 0, 29, 30, 5, 6, + 61, 34, 0, 0, 0, 0, 31, 309, 0, 0, + 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, + 0, 0, 5, 6, 61, 20, 0, 0, 21, 62, + 23, 24, 0, 0, 26, 27, 28, 0, 29, 30, + 0, 0, 0, 34, 0, 0, 0, 0, 31, 20, + 0, 0, 21, 62, 23, 24, 32, 33, 26, 27, + 28, 0, 29, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 32, 33, 0, 0, 0, 34, 0, 0, 0, 105, + 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, + 0, 221, 222, 0, 0, 0, 0, 115, 0, 202, + 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, + 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, + 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, + 111, 112, 113, 114, 0, 0, 223, 0, 224, 0, + 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, + 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, + 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, + 0, 0, 138, 0, 0, 115, 0, 0, 116, 117, + 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, + 113, 114, 0, 167, 0, 0, 0, 0, 0, 115, + 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 219, 0, - 220, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 134, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 165, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 197, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 202, 0, 0, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, + 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 201, 0, 0, + 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, + 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, + 0, 206, 0, 0, 0, 0, 0, 115, 0, 0, + 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, + 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, + 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, + 111, 112, 113, 114, 0, 207, 0, 0, 0, 0, + 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, + 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, + 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, + 0, 0, 213, 0, 0, 115, 0, 0, 116, 117, + 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, + 113, 114, 0, 217, 0, 0, 0, 0, 0, 115, + 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 203, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 209, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 213, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 214, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 228, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, + 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 218, 0, 0, + 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, + 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, + 0, 0, 0, 232, 0, 0, 0, 115, 0, 0, + 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, + 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, + 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, + 111, 112, 113, 114, 0, 0, 0, 0, 247, 0, + 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, + 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, + 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, + 0, 239, 0, 0, 0, 115, 0, 0, 116, 117, + 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, + 113, 114, 0, 0, -151, 0, 0, 0, 0, 115, + 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, - 242, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 234, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 272, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 274, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 0, 279, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, + 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 276, 0, 0, + 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, + 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, + 0, 278, 0, 0, 0, 0, 0, 115, 0, 0, + 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, + 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, + 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, + 111, 112, 113, 114, 0, 0, 0, 0, 283, 0, + 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, + 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, + 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 0, 284, + 0, 0, 0, 0, 0, 115, 0, 0, 116, 117, + 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, + 113, 114, 0, 285, 0, 0, 0, 0, 0, 115, + 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 280, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 281, 0, 0, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 288, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 302, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 304, 0, 0, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, + 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, + 292, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, + 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, + 0, 306, 0, 0, 0, 0, 0, 115, 0, 0, + 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, + 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, + 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, + 111, 112, 113, 114, 0, 308, 0, 0, 0, 0, + 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, + 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, + 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 0, 326, + 0, 0, 0, 0, 0, 115, 0, 0, 116, 117, + 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, + 113, 114, 0, 0, 0, 0, 368, 0, 0, 115, + 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 322, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 364, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 365, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 0, - 0, 0, 372, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 0, 377, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, + 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, + 369, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, + 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, + 0, 0, 0, 0, 376, 0, 0, 115, 0, 0, + 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, + 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, + 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, + 111, 112, 113, 114, 0, 0, 0, 0, 381, 0, + 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, + 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, + 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, + 0, 0, 383, 0, 0, 115, 0, 0, 116, 117, + 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, + 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, + 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, + 113, 114, 0, 0, 0, 0, 0, 0, 0, 115, + 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, - 379, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 101, 102, 103, 104, 105, 106, 0, 107, - 108, 109, 110, 117, 118, 119, 120, 121, 122, 123, - 111, 0, 0, 112, 113, 114, 125, 0, 0, 115, - 116, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 117, 118, 119, 120, 121, 0, 123, 111, - 0, 0, 112, 113, 114, 125, 0, 0, 115, 116, - 101, 102, 103, 104, 105, 106, 0, 107, 0, 109, - 110, 117, 118, 119, 120, 0, 0, 123, 111, 0, - 0, 112, 113, 114, 125, 0, 0, 115, 116, 101, - 102, 103, 104, 105, 106, 0, 107, 0, 109, 110, - 117, 118, 119, 120, 0, 0, 123, 0, 0, 0, - 112, 113, 114, 125, 0, 0, 115, 116, 101, 102, - 103, 104, 105, 106, 0, 107, 0, 0, 110, 117, - 118, 119, 120, 0, 0, 123, 0, 0, 0, 112, - 113, 114, 125, 0, 0, 115, 116, 101, 102, 103, - 104, 105, 106, 0, 107, 0, 0, 110, 117, 118, - 119, 120, 0, 0, 123, 0, 0, 0, 112, 113, - 114, 125, 0, 0, 115, 116, 101, 102, 103, 104, - 0, 0, 0, 107, 0, 0, 110, 126, 0, 119, - 120, 0, 0, 123, 0, 0, 0, 112, 113, 114, - 125, 0, 0, 115, 116, 79, 80, 255, 0, 0, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 0, 0, 123, 0, 0, 79, 80, 0, 0, 125, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 101, 102, 103, 104, 0, 0, 0, 107, 0, 0, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 114, 0, 0, 0, 115, 116 + 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, + 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, + 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 0, 0, 119, 120, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 121, 122, 123, 124, 125, + 0, 127, 115, 0, 0, 116, 117, 118, 129, 0, + 0, 119, 120, 105, 106, 107, 108, 109, 110, 0, + 111, 0, 113, 114, 121, 122, 123, 124, 0, 0, + 127, 115, 0, 0, 116, 117, 118, 129, 0, 0, + 119, 120, 105, 106, 107, 108, 109, 110, 0, 111, + 0, 113, 114, 121, 122, 123, 124, 0, 0, 127, + 0, 0, 0, 116, 117, 118, 129, 0, 0, 119, + 120, 105, 106, 107, 108, 109, 110, 0, 111, 0, + 0, 114, 121, 122, 123, 124, 0, 0, 127, 0, + 0, 0, 116, 117, 118, 129, 0, 0, 119, 120, + 105, 106, 107, 108, 109, 110, 0, 111, 0, 0, + 114, 121, 122, 123, 124, 0, 0, 127, 0, 0, + 0, 116, 117, 118, 129, 0, 0, 119, 120, 0, + 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 123, 124, 0, 0, 127, 260, 0, 80, + 81, 0, 0, 129, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 0, 80, 81, 0, 0, 0, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 105, 106, 107, 108, 0, 0, 0, 111, 0, 0, + 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 117, 118, 0, 0, 0, 119, 120 }; static const yytype_int16 yycheck[] = { - 2, 2, 47, 249, 191, 145, 236, 263, 3, 318, - 12, 132, 55, 201, 5, 6, 7, 51, 57, 57, - 50, 50, 55, 28, 212, 6, 57, 327, 5, 6, - 61, 0, 66, 67, 57, 16, 336, 227, 57, 348, - 38, 32, 38, 55, 35, 36, 37, 38, 10, 92, - 41, 42, 43, 58, 45, 46, 59, 55, 91, 315, - 99, 99, 92, 92, 55, 295, 61, 29, 30, 31, - 32, 33, 63, 64, 330, 215, 99, 198, 266, 91, - 99, 268, 55, 44, 45, 46, 47, 225, 226, 55, - 51, 59, 54, 54, 24, 55, 55, 59, 55, 55, - 346, 92, 55, 65, 38, 66, 67, 69, 38, 39, - 55, 73, 74, 369, 76, 77, 78, 50, 59, 81, + 2, 2, 195, 48, 231, 254, 94, 149, 267, 205, + 12, 57, 136, 55, 38, 3, 57, 50, 241, 28, + 216, 50, 6, 57, 322, 5, 6, 0, 55, 331, + 55, 55, 16, 38, 44, 45, 46, 47, 340, 57, + 59, 51, 57, 59, 54, 38, 61, 55, 10, 58, + 92, 55, 55, 99, 352, 65, 66, 67, 99, 92, + 319, 71, 72, 92, 91, 99, 91, 29, 30, 31, + 32, 33, 34, 61, 270, 334, 299, 219, 202, 272, + 90, 99, 24, 55, 51, 55, 55, 97, 59, 55, + 55, 50, 55, 55, 55, 59, 38, 39, 60, 66, + 67, 350, 14, 37, 66, 37, 55, 60, 70, 38, + 206, 207, 74, 75, 373, 77, 78, 79, 345, 57, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 59, 93, 113, 114, 136, 136, 55, 55, 14, 101, - 102, 103, 104, 105, 106, 37, 108, 109, 110, 111, - 112, 341, 55, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 50, 37, 60, 358, 131, - 132, 38, 5, 6, 7, 38, 138, 222, 37, 23, - 142, 38, 55, 68, 69, 23, 3, 56, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 56, 32, - 202, 203, 35, 36, 37, 38, 57, 92, 41, 42, - 43, 57, 45, 46, 55, 55, 58, 60, 5, 6, - 41, 60, 55, 317, 318, 60, 59, 37, 57, 191, - 63, 64, 202, 203, 99, 38, 198, 24, 240, 8, - 56, 335, 336, 26, 206, 207, 59, 209, 210, 211, - 56, 38, 39, 60, 348, 56, 56, 219, 352, 221, - 56, 56, 224, 225, 226, 227, 228, 56, 61, 271, - 240, 61, 274, 275, 60, 277, 60, 56, 280, 281, - 242, 243, 60, 50, 38, 61, 60, 59, 61, 59, - 61, 293, 293, 255, 59, 58, 232, 61, 50, 50, - 302, 271, 304, 305, 274, 275, 268, 277, 336, 309, - 280, 281, -1, -1, -1, -1, -1, 279, -1, -1, - 322, 283, -1, -1, 5, 6, 7, -1, -1, 331, - 331, -1, 302, -1, 304, 305, -1, -1, 46, 47, - -1, -1, -1, 51, 346, 346, 54, -1, -1, -1, - -1, 32, 322, -1, 35, 36, 37, 38, 66, 67, - 41, 42, 43, -1, 45, 46, -1, 329, -1, -1, - -1, -1, 374, 374, 55, 56, -1, 339, 340, 341, - -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 357, 358, -1, -1, -1, - 3, -1, 5, 6, 7, -1, 9, -1, 11, 371, - 13, 14, 15, -1, 376, -1, -1, 20, 21, 22, - -1, 24, 25, -1, 27, -1, 29, -1, -1, 32, - -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, - 43, -1, 45, 46, -1, -1, -1, -1, -1, 5, - 6, 7, 55, 9, -1, 11, -1, 13, 14, 15, - 63, 64, -1, 19, 20, 21, 22, -1, 24, 25, - 26, 27, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, 5, 6, 7, -1, 9, 55, - 11, -1, 13, 14, 15, -1, -1, 63, 64, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, + 92, 99, 94, 117, 118, 362, 5, 6, 140, 140, + 228, 38, 230, 105, 106, 107, 108, 109, 110, 245, + 112, 113, 114, 115, 116, 24, 37, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 38, + 39, 38, 55, 135, 136, 23, 23, 3, 56, 275, + 142, 226, 278, 279, 146, 281, 56, 55, 284, 285, + 55, 57, 41, 37, 58, 99, 38, 60, 60, 60, + 57, 8, 56, 26, 206, 207, 59, 169, 60, 60, + 306, 56, 308, 309, 44, 45, 46, 47, 48, 49, + 56, 51, 52, 53, 54, 56, 46, 47, 56, 56, + 326, 51, 62, 195, 54, 65, 66, 67, 56, 61, + 202, 71, 72, 245, 61, 60, 66, 67, 210, 211, + 60, 213, 214, 215, 84, 85, 86, 87, 88, 89, + 90, 223, 56, 225, 50, 38, 228, 97, 230, 231, + 232, 61, 60, 275, 321, 322, 278, 279, 59, 281, + 59, 61, 284, 285, 61, 247, 248, 59, 58, 50, + 61, 50, 339, 340, -1, 297, 297, 236, 260, 313, + 340, -1, -1, -1, 306, 352, 308, 309, -1, 356, + 272, -1, -1, -1, 5, 6, 7, -1, -1, -1, + -1, 283, -1, -1, 326, 287, -1, -1, -1, -1, + -1, -1, -1, 335, 335, -1, -1, -1, -1, -1, + -1, 32, -1, -1, 35, 36, 37, 38, 350, 350, 41, 42, 43, -1, 45, 46, -1, -1, -1, -1, + -1, 50, -1, -1, 55, -1, -1, -1, 59, -1, + -1, 333, 63, 64, -1, -1, 378, 378, -1, 68, + 69, 343, 344, 345, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, -1, -1, -1, -1, -1, 361, + 362, 92, -1, 92, 3, -1, 5, 6, 7, -1, + 9, -1, 11, 375, 13, 14, 15, -1, 380, -1, + -1, 20, 21, 22, -1, 24, 25, -1, 27, -1, + 29, -1, -1, 32, -1, -1, 35, 36, 37, 38, + -1, 40, 41, 42, 43, -1, 45, 46, -1, -1, + -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, + -1, -1, -1, -1, 63, 64, -1, 5, 6, 7, + -1, 9, -1, 11, -1, 13, 14, 15, -1, -1, + -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, + -1, -1, -1, 92, 32, -1, -1, 35, 36, 37, + 38, -1, 40, 41, 42, 43, -1, 45, 46, -1, + -1, -1, 5, 6, 7, -1, 9, 55, 11, -1, + 13, 14, 15, -1, -1, 63, 64, 20, 21, 22, + -1, 24, 25, -1, 27, -1, -1, -1, -1, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, 45, 46, 92, -1, -1, -1, -1, -1, + -1, -1, 55, -1, -1, -1, -1, 60, -1, -1, + 63, 64, -1, 5, 6, 7, -1, 9, -1, 11, + -1, 13, 14, 15, -1, -1, -1, -1, 20, 21, + 22, -1, 24, 25, -1, 27, -1, -1, -1, 92, + 32, -1, -1, 35, 36, 37, 38, -1, 40, 41, + 42, 43, -1, 45, 46, -1, -1, -1, 5, 6, + 7, -1, 9, 55, 11, -1, 13, 14, 15, 61, + -1, 63, 64, 20, 21, 22, -1, 24, 25, -1, + 27, -1, -1, -1, -1, 32, -1, -1, 35, 36, + 37, 38, -1, 40, 41, 42, 43, -1, 45, 46, + 92, -1, -1, 5, 6, 7, -1, 9, 55, 11, + -1, 13, 14, 15, 61, -1, 63, 64, 20, 21, + 22, -1, 24, 25, -1, 27, -1, -1, -1, -1, + 32, -1, -1, 35, 36, 37, 38, -1, 40, 41, + 42, 43, -1, 45, 46, 92, -1, -1, 5, 6, + 7, -1, 9, 55, 11, -1, 13, 14, 15, 61, + -1, 63, 64, 20, 21, 22, -1, 24, 25, -1, + 27, -1, 5, 6, 7, 32, -1, -1, 35, 36, + 37, 38, -1, 40, 41, 42, 43, -1, 45, 46, + 92, -1, -1, -1, -1, -1, -1, -1, 55, 32, + -1, -1, 35, 36, 37, 38, 63, 64, 41, 42, + 43, -1, 45, 46, 5, 6, 7, 44, 45, 46, + 47, -1, 55, -1, 51, -1, 59, 54, -1, -1, + 63, 64, -1, -1, -1, 92, -1, -1, -1, 66, + 67, 32, -1, -1, 35, 36, 37, 38, -1, -1, + 41, 42, 43, -1, 45, 46, 5, 6, 7, 92, -1, -1, -1, -1, 55, -1, -1, -1, -1, 60, - -1, -1, 63, 64, 5, 6, 7, -1, 9, -1, - 11, -1, 13, 14, 15, -1, -1, -1, -1, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, 5, - 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, - 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, - -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, 5, 6, 7, -1, 9, 55, - 11, -1, 13, 14, 15, 61, -1, 63, 64, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, 5, - 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, - 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, - -1, 27, -1, 5, 6, 7, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 32, -1, -1, 35, 36, 37, 38, 63, 64, 41, - 42, 43, -1, 45, 46, 5, 6, 7, -1, -1, - -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, - -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, - -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, - 60, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, - 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, - 6, 7, -1, -1, -1, -1, -1, 55, -1, -1, - -1, 59, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, - 46, 5, 6, 7, -1, -1, -1, -1, -1, 55, - -1, -1, -1, 59, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, - -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, - -1, 45, 46, 5, 6, 7, -1, -1, -1, -1, - -1, 55, 56, -1, -1, -1, -1, -1, -1, 63, - 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, - 42, 43, -1, 45, 46, 5, 6, 7, -1, -1, - -1, -1, -1, 55, 56, -1, -1, -1, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, - -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, - -1, -1, -1, -1, -1, 55, 56, -1, -1, -1, - -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, - 38, -1, -1, 41, 42, 43, -1, 45, 46, -1, - -1, 44, 45, 46, 47, 48, 49, 55, 51, 52, - 53, 54, -1, 56, 57, 63, 64, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, 57, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, + -1, -1, 41, 42, 43, -1, 45, 46, 5, 6, + 7, 92, -1, -1, -1, -1, 55, -1, -1, -1, + 59, -1, -1, -1, 63, 64, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, + 37, 38, -1, -1, 41, 42, 43, -1, 45, 46, + 5, 6, 7, 92, -1, -1, -1, -1, 55, 56, + -1, -1, -1, -1, -1, -1, 63, 64, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, + 35, 36, 37, 38, -1, -1, 41, 42, 43, -1, + 45, 46, 5, 6, 7, 92, -1, -1, -1, -1, + 55, -1, -1, -1, 59, -1, -1, -1, 63, 64, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, + -1, -1, 35, 36, 37, 38, -1, -1, 41, 42, + 43, -1, 45, 46, 5, 6, 7, 92, -1, -1, + -1, -1, 55, 56, -1, -1, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, + 41, 42, 43, -1, 45, 46, 5, 6, 7, 92, + -1, -1, -1, -1, 55, 56, -1, -1, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, + -1, -1, 41, 42, 43, -1, 45, 46, 5, 6, + 7, 92, -1, -1, -1, -1, 55, 56, -1, -1, + -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, + -1, -1, 5, 6, 7, 32, -1, -1, 35, 36, + 37, 38, -1, -1, 41, 42, 43, -1, 45, 46, + -1, -1, -1, 92, -1, -1, -1, -1, 55, 32, + -1, -1, 35, 36, 37, 38, 63, 64, 41, 42, + 43, -1, 45, 46, -1, -1, -1, -1, -1, -1, + -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, + 63, 64, -1, -1, -1, 92, -1, -1, -1, 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, + -1, 56, 57, -1, -1, -1, -1, 62, -1, 92, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, + 51, 52, 53, 54, -1, -1, 57, -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, @@ -1315,7 +1329,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, @@ -1325,19 +1339,19 @@ static const yytype_int16 yycheck[] = 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, 58, -1, -1, -1, 62, + 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, + 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, + -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, @@ -1347,18 +1361,18 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, + 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + -1, 58, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, + 53, 54, -1, -1, 57, -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, @@ -1390,24 +1404,24 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, + -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, + 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, + 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, + -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, @@ -1423,36 +1437,48 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, + -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, -1, -1, + 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, + 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, + -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, + -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, + 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, + 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, + 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, + 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, + -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, + -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + -1, -1, 71, 72, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, 84, 85, 86, 87, 88, + -1, 90, 62, -1, -1, 65, 66, 67, 97, -1, + -1, 71, 72, 44, 45, 46, 47, 48, 49, -1, + 51, -1, 53, 54, 84, 85, 86, 87, -1, -1, + 90, 62, -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, 46, 47, 48, 49, -1, 51, - 52, 53, 54, 84, 85, 86, 87, 88, 89, 90, - 62, -1, -1, 65, 66, 67, 97, -1, -1, 71, - 72, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, 84, 85, 86, 87, 88, -1, 90, 62, + -1, 53, 54, 84, 85, 86, 87, -1, -1, 90, + -1, -1, -1, 65, 66, 67, 97, -1, -1, 71, + 72, 44, 45, 46, 47, 48, 49, -1, 51, -1, + -1, 54, 84, 85, 86, 87, -1, -1, 90, -1, -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, - 44, 45, 46, 47, 48, 49, -1, 51, -1, 53, - 54, 84, 85, 86, 87, -1, -1, 90, 62, -1, - -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, - 45, 46, 47, 48, 49, -1, 51, -1, 53, 54, - 84, 85, 86, 87, -1, -1, 90, -1, -1, -1, - 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, - 46, 47, 48, 49, -1, 51, -1, -1, 54, 84, - 85, 86, 87, -1, -1, 90, -1, -1, -1, 65, - 66, 67, 97, -1, -1, 71, 72, 44, 45, 46, - 47, 48, 49, -1, 51, -1, -1, 54, 84, 85, - 86, 87, -1, -1, 90, -1, -1, -1, 65, 66, - 67, 97, -1, -1, 71, 72, 44, 45, 46, 47, - -1, -1, -1, 51, -1, -1, 54, 50, -1, 86, - 87, -1, -1, 90, -1, -1, -1, 65, 66, 67, - 97, -1, -1, 71, 72, 68, 69, 50, -1, -1, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - -1, -1, 90, -1, -1, 68, 69, -1, -1, 97, + 44, 45, 46, 47, 48, 49, -1, 51, -1, -1, + 54, 84, 85, 86, 87, -1, -1, 90, -1, -1, + -1, 65, 66, 67, 97, -1, -1, 71, 72, -1, + -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 86, 87, -1, -1, 90, 50, -1, 68, + 69, -1, -1, 97, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, -1, 68, 69, -1, -1, -1, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 44, 45, 46, 47, -1, -1, -1, 51, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1466,41 +1492,42 @@ static const yytype_uint8 yystos[] = 0, 101, 102, 0, 3, 5, 6, 7, 9, 11, 13, 14, 15, 20, 21, 22, 24, 25, 27, 29, 32, 35, 36, 37, 38, 40, 41, 42, 43, 45, - 46, 55, 63, 64, 103, 104, 107, 108, 111, 112, - 119, 122, 123, 124, 125, 126, 127, 128, 129, 132, - 133, 134, 38, 38, 55, 130, 130, 59, 59, 55, - 7, 36, 59, 127, 132, 55, 60, 107, 118, 55, - 55, 55, 130, 55, 55, 38, 55, 50, 50, 68, - 69, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 92, 131, 55, 91, 127, 127, 127, 127, 127, - 59, 44, 45, 46, 47, 48, 49, 51, 52, 53, - 54, 62, 65, 66, 67, 71, 72, 84, 85, 86, - 87, 88, 89, 90, 96, 97, 50, 131, 55, 91, - 127, 55, 55, 127, 59, 127, 106, 14, 59, 127, - 37, 37, 55, 127, 127, 60, 127, 127, 127, 127, + 46, 55, 63, 64, 92, 103, 104, 107, 108, 111, + 112, 119, 122, 123, 124, 125, 126, 127, 128, 129, + 132, 133, 134, 38, 38, 55, 130, 130, 59, 59, + 55, 7, 36, 59, 127, 132, 55, 60, 107, 118, + 55, 55, 55, 130, 55, 55, 38, 55, 50, 50, + 68, 69, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 92, 131, 55, 91, 127, 127, 127, 127, + 127, 127, 135, 136, 59, 44, 45, 46, 47, 48, + 49, 51, 52, 53, 54, 62, 65, 66, 67, 71, + 72, 84, 85, 86, 87, 88, 89, 90, 96, 97, + 50, 131, 55, 91, 127, 55, 55, 127, 59, 127, + 106, 14, 59, 127, 37, 37, 55, 127, 127, 60, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 140, 127, 135, 136, 38, 56, 127, 127, 127, 127, - 127, 127, 38, 127, 127, 127, 127, 127, 130, 130, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 60, 127, 37, 109, 110, 38, 56, 92, 114, - 127, 114, 56, 56, 61, 107, 55, 59, 127, 59, - 23, 23, 127, 56, 56, 105, 108, 56, 57, 57, - 59, 57, 99, 56, 57, 55, 55, 92, 58, 136, - 56, 57, 55, 114, 58, 113, 113, 118, 118, 127, - 56, 127, 59, 59, 127, 127, 127, 113, 60, 60, - 61, 108, 41, 127, 127, 50, 131, 127, 135, 135, - 140, 127, 61, 60, 37, 109, 99, 38, 57, 115, - 115, 8, 56, 118, 56, 56, 127, 56, 127, 59, - 56, 56, 56, 26, 120, 120, 59, 56, 59, 127, - 56, 56, 99, 106, 56, 113, 136, 56, 56, 118, - 118, 118, 56, 118, 56, 56, 127, 118, 118, 60, - 121, 127, 61, 61, 61, 60, 115, 60, 60, 118, - 118, 118, 56, 24, 38, 39, 137, 138, 139, 28, - 58, 106, 56, 112, 116, 117, 138, 116, 118, 50, - 50, 92, 38, 61, 139, 127, 106, 61, 60, 59, - 61, 112, 117, 61, 127, 127, 140, 50, 92, 59, - 19, 120, 116, 59, 59, 59, 99, 127, 140, 58, - 61, 50, 59, 99, 106, 127, 50, 59, 127, 59 + 127, 127, 127, 127, 140, 135, 38, 56, 99, 57, + 127, 127, 127, 127, 127, 127, 38, 127, 127, 127, + 127, 127, 130, 130, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 60, 127, 37, 109, 110, + 38, 56, 92, 114, 127, 114, 56, 56, 61, 107, + 55, 59, 127, 59, 23, 23, 127, 56, 56, 105, + 108, 56, 57, 57, 59, 57, 99, 56, 55, 127, + 55, 92, 58, 136, 56, 57, 55, 114, 127, 58, + 113, 113, 118, 118, 127, 56, 127, 59, 59, 127, + 127, 127, 113, 60, 60, 61, 108, 41, 127, 127, + 50, 131, 135, 135, 140, 127, 61, 60, 37, 109, + 99, 38, 57, 115, 115, 8, 56, 118, 56, 56, + 127, 56, 127, 59, 56, 56, 56, 26, 120, 120, + 59, 56, 59, 127, 56, 56, 99, 106, 56, 113, + 136, 56, 56, 118, 118, 118, 56, 118, 56, 56, + 127, 118, 118, 60, 121, 127, 61, 61, 61, 60, + 115, 60, 60, 118, 118, 118, 56, 24, 38, 39, + 137, 138, 139, 28, 58, 106, 56, 112, 116, 117, + 138, 116, 118, 50, 50, 92, 38, 61, 139, 127, + 106, 61, 60, 59, 61, 112, 117, 61, 127, 127, + 140, 50, 92, 59, 19, 120, 116, 59, 59, 59, + 99, 127, 140, 58, 61, 50, 59, 99, 106, 127, + 50, 59, 127, 59 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -1517,12 +1544,12 @@ static const yytype_uint8 yyr1[] = 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 128, 128, 129, 129, 130, - 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 133, 133, 133, 134, 134, 135, 135, - 136, 136, 137, 137, 138, 138, 139, 139, 139, 139, - 139, 140, 140 + 127, 127, 127, 127, 127, 127, 128, 128, 129, 129, + 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 133, 133, 133, 134, 134, 135, + 135, 136, 136, 137, 137, 138, 138, 139, 139, 139, + 139, 139, 140, 140 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -1539,12 +1566,12 @@ static const yytype_int8 yyr2[] = 3, 3, 3, 3, 3, 3, 2, 2, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 3, 6, 3, 3, 1, - 3, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 3, 6, 2, 5, - 2, 3, 5, 4, 6, 6, 4, 6, 0, 1, - 1, 3, 0, 1, 1, 2, 4, 5, 4, 7, - 8, 1, 3 + 1, 1, 1, 1, 4, 3, 3, 6, 3, 3, + 1, 3, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 1, 3, 6, 2, + 5, 2, 3, 5, 4, 6, 6, 4, 6, 0, + 1, 1, 3, 0, 1, 1, 2, 4, 5, 4, + 7, 8, 1, 3 }; @@ -2194,935 +2221,950 @@ yyparse (void) case 2: /* start: decl_list */ #line 167 "CMDgram.y" { } -#line 2198 "CMDgram.c" +#line 2225 "CMDgram.c" break; case 3: /* decl_list: %empty */ #line 172 "CMDgram.y" { (yyval.stmt) = nil; } -#line 2204 "CMDgram.c" +#line 2231 "CMDgram.c" break; case 4: /* decl_list: decl_list decl */ #line 174 "CMDgram.y" { if(!Script::gStatementList) { Script::gStatementList = (yyvsp[0].stmt); } else { Script::gStatementList->append((yyvsp[0].stmt)); } } -#line 2210 "CMDgram.c" +#line 2237 "CMDgram.c" break; case 5: /* decl: stmt */ #line 179 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2216 "CMDgram.c" +#line 2243 "CMDgram.c" break; case 6: /* decl: fn_decl_stmt */ #line 181 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2222 "CMDgram.c" +#line 2249 "CMDgram.c" break; case 7: /* decl: package_decl */ #line 183 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2228 "CMDgram.c" +#line 2255 "CMDgram.c" break; case 8: /* package_decl: rwPACKAGE IDENT '{' fn_decl_list '}' ';' */ #line 188 "CMDgram.y" { (yyval.stmt) = (yyvsp[-2].stmt); for(StmtNode *walk = ((yyvsp[-2].stmt));walk;walk = walk->getNext() ) walk->setPackage((yyvsp[-4].s).value); } -#line 2234 "CMDgram.c" +#line 2261 "CMDgram.c" break; case 9: /* fn_decl_list: fn_decl_stmt */ #line 193 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2240 "CMDgram.c" +#line 2267 "CMDgram.c" break; case 10: /* fn_decl_list: fn_decl_list fn_decl_stmt */ #line 195 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); ((yyvsp[-1].stmt))->append((yyvsp[0].stmt)); } -#line 2246 "CMDgram.c" +#line 2273 "CMDgram.c" break; case 11: /* statement_list: %empty */ #line 200 "CMDgram.y" { (yyval.stmt) = nil; } -#line 2252 "CMDgram.c" +#line 2279 "CMDgram.c" break; case 12: /* statement_list: statement_list stmt */ #line 202 "CMDgram.y" { if(!(yyvsp[-1].stmt)) { (yyval.stmt) = (yyvsp[0].stmt); } else { ((yyvsp[-1].stmt))->append((yyvsp[0].stmt)); (yyval.stmt) = (yyvsp[-1].stmt); } } -#line 2258 "CMDgram.c" +#line 2285 "CMDgram.c" break; case 19: /* stmt: rwBREAK ';' */ #line 213 "CMDgram.y" { (yyval.stmt) = BreakStmtNode::alloc( (yyvsp[-1].i).lineNumber ); } -#line 2264 "CMDgram.c" +#line 2291 "CMDgram.c" break; case 20: /* stmt: rwCONTINUE ';' */ #line 215 "CMDgram.y" { (yyval.stmt) = ContinueStmtNode::alloc( (yyvsp[-1].i).lineNumber ); } -#line 2270 "CMDgram.c" +#line 2297 "CMDgram.c" break; case 21: /* stmt: rwRETURN ';' */ #line 217 "CMDgram.y" { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[-1].i).lineNumber, NULL ); } -#line 2276 "CMDgram.c" +#line 2303 "CMDgram.c" break; case 22: /* stmt: rwRETURN expr ';' */ #line 219 "CMDgram.y" { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[-2].i).lineNumber, (yyvsp[-1].expr) ); } -#line 2282 "CMDgram.c" +#line 2309 "CMDgram.c" break; case 23: /* stmt: expression_stmt ';' */ #line 221 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); } -#line 2288 "CMDgram.c" +#line 2315 "CMDgram.c" break; case 24: /* stmt: TTAG '=' expr ';' */ #line 223 "CMDgram.y" { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-1].expr), NULL ); } -#line 2294 "CMDgram.c" +#line 2321 "CMDgram.c" break; case 25: /* stmt: TTAG '=' expr ',' expr ';' */ #line 225 "CMDgram.y" { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-5].s).value, (yyvsp[-3].expr), (yyvsp[-1].expr) ); } -#line 2300 "CMDgram.c" +#line 2327 "CMDgram.c" break; case 26: /* stmt: DOCBLOCK */ #line 227 "CMDgram.y" { (yyval.stmt) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, false, true ); } -#line 2306 "CMDgram.c" +#line 2333 "CMDgram.c" break; case 27: /* fn_decl_stmt: rwDEFINE IDENT '(' var_list_decl ')' '{' statement_list '}' */ #line 232 "CMDgram.y" { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[-7].i).lineNumber, (yyvsp[-6].s).value, NULL, (yyvsp[-4].var), (yyvsp[-1].stmt) ); } -#line 2312 "CMDgram.c" +#line 2339 "CMDgram.c" break; case 28: /* fn_decl_stmt: rwDEFINE IDENT opCOLONCOLON IDENT '(' var_list_decl ')' '{' statement_list '}' */ #line 234 "CMDgram.y" { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-6].s).value, (yyvsp[-8].s).value, (yyvsp[-4].var), (yyvsp[-1].stmt) ); } -#line 2318 "CMDgram.c" +#line 2345 "CMDgram.c" break; case 29: /* var_list_decl: %empty */ #line 239 "CMDgram.y" { (yyval.var) = NULL; } -#line 2324 "CMDgram.c" +#line 2351 "CMDgram.c" break; case 30: /* var_list_decl: var_list */ #line 241 "CMDgram.y" { (yyval.var) = (yyvsp[0].var); } -#line 2330 "CMDgram.c" +#line 2357 "CMDgram.c" break; case 31: /* var_list: VAR */ #line 246 "CMDgram.y" { (yyval.var) = VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL ); } -#line 2336 "CMDgram.c" +#line 2363 "CMDgram.c" break; case 32: /* var_list: var_list ',' VAR */ #line 248 "CMDgram.y" { (yyval.var) = (yyvsp[-2].var); ((StmtNode*)((yyvsp[-2].var)))->append((StmtNode*)VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL ) ); } -#line 2342 "CMDgram.c" +#line 2369 "CMDgram.c" break; case 33: /* datablock_decl: rwDATABLOCK class_name_expr '(' expr parent_block ')' '{' slot_assign_list_opt '}' ';' */ #line 253 "CMDgram.y" { (yyval.stmt) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), NULL, (yyvsp[-5].s).value, (yyvsp[-2].slist), NULL, true, false, false); } -#line 2348 "CMDgram.c" +#line 2375 "CMDgram.c" break; case 34: /* object_decl: rwDECLARE class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}' */ #line 258 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, false, false); } -#line 2354 "CMDgram.c" +#line 2381 "CMDgram.c" break; case 35: /* object_decl: rwDECLARE class_name_expr '(' object_name parent_block object_args ')' */ #line 260 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, false, false); } -#line 2360 "CMDgram.c" +#line 2387 "CMDgram.c" break; case 36: /* object_decl: rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' '{' object_declare_block '}' */ #line 262 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-11].i).lineNumber, (yyvsp[-10].expr), (yyvsp[-7].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, true, false); } -#line 2366 "CMDgram.c" +#line 2393 "CMDgram.c" break; case 37: /* object_decl: rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' */ #line 264 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-8].i).lineNumber, (yyvsp[-7].expr), (yyvsp[-4].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, true, false); } -#line 2372 "CMDgram.c" +#line 2399 "CMDgram.c" break; case 38: /* object_decl: rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}' */ #line 266 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, false, true); } -#line 2378 "CMDgram.c" +#line 2405 "CMDgram.c" break; case 39: /* object_decl: rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' */ #line 268 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, false, true); } -#line 2384 "CMDgram.c" +#line 2411 "CMDgram.c" break; case 40: /* parent_block: %empty */ #line 273 "CMDgram.y" { (yyval.s).value = NULL; } -#line 2390 "CMDgram.c" +#line 2417 "CMDgram.c" break; case 41: /* parent_block: ':' IDENT */ #line 275 "CMDgram.y" { (yyval.s) = (yyvsp[0].s); } -#line 2396 "CMDgram.c" +#line 2423 "CMDgram.c" break; case 42: /* object_name: %empty */ #line 280 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( CodeBlock::smCurrentParser->getCurrentLine(), "", false); } -#line 2402 "CMDgram.c" +#line 2429 "CMDgram.c" break; case 43: /* object_name: expr */ #line 282 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2408 "CMDgram.c" +#line 2435 "CMDgram.c" break; case 44: /* object_args: %empty */ #line 287 "CMDgram.y" { (yyval.expr) = NULL; } -#line 2414 "CMDgram.c" +#line 2441 "CMDgram.c" break; case 45: /* object_args: ',' expr_list */ #line 289 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2420 "CMDgram.c" +#line 2447 "CMDgram.c" break; case 46: /* object_declare_block: %empty */ #line 294 "CMDgram.y" { (yyval.odcl).slots = NULL; (yyval.odcl).decls = NULL; } -#line 2426 "CMDgram.c" +#line 2453 "CMDgram.c" break; case 47: /* object_declare_block: slot_assign_list */ #line 296 "CMDgram.y" { (yyval.odcl).slots = (yyvsp[0].slist); (yyval.odcl).decls = NULL; } -#line 2432 "CMDgram.c" +#line 2459 "CMDgram.c" break; case 48: /* object_declare_block: object_decl_list */ #line 298 "CMDgram.y" { (yyval.odcl).slots = NULL; (yyval.odcl).decls = (yyvsp[0].od); } -#line 2438 "CMDgram.c" +#line 2465 "CMDgram.c" break; case 49: /* object_declare_block: slot_assign_list object_decl_list */ #line 300 "CMDgram.y" { (yyval.odcl).slots = (yyvsp[-1].slist); (yyval.odcl).decls = (yyvsp[0].od); } -#line 2444 "CMDgram.c" +#line 2471 "CMDgram.c" break; case 50: /* object_decl_list: object_decl ';' */ #line 305 "CMDgram.y" { (yyval.od) = (yyvsp[-1].od); } -#line 2450 "CMDgram.c" +#line 2477 "CMDgram.c" break; case 51: /* object_decl_list: object_decl_list object_decl ';' */ #line 307 "CMDgram.y" { (yyvsp[-2].od)->append((yyvsp[-1].od)); (yyval.od) = (yyvsp[-2].od); } -#line 2456 "CMDgram.c" +#line 2483 "CMDgram.c" break; case 52: /* stmt_block: '{' statement_list '}' */ #line 312 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); } -#line 2462 "CMDgram.c" +#line 2489 "CMDgram.c" break; case 53: /* stmt_block: stmt */ #line 314 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2468 "CMDgram.c" +#line 2495 "CMDgram.c" break; case 54: /* switch_stmt: rwSWITCH '(' expr ')' '{' case_block '}' */ #line 319 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].ifnode); (yyvsp[-1].ifnode)->propagateSwitchExpr((yyvsp[-4].expr), false); } -#line 2474 "CMDgram.c" +#line 2501 "CMDgram.c" break; case 55: /* switch_stmt: rwSWITCHSTR '(' expr ')' '{' case_block '}' */ #line 321 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].ifnode); (yyvsp[-1].ifnode)->propagateSwitchExpr((yyvsp[-4].expr), true); } -#line 2480 "CMDgram.c" +#line 2507 "CMDgram.c" break; case 56: /* case_block: rwCASE case_expr ':' statement_list */ #line 326 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-3].i).lineNumber, (yyvsp[-2].expr), (yyvsp[0].stmt), NULL, false); } -#line 2486 "CMDgram.c" +#line 2513 "CMDgram.c" break; case 57: /* case_block: rwCASE case_expr ':' statement_list rwDEFAULT ':' statement_list */ #line 328 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].stmt), (yyvsp[0].stmt), false); } -#line 2492 "CMDgram.c" +#line 2519 "CMDgram.c" break; case 58: /* case_block: rwCASE case_expr ':' statement_list case_block */ #line 330 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-4].i).lineNumber, (yyvsp[-3].expr), (yyvsp[-1].stmt), (yyvsp[0].ifnode), true); } -#line 2498 "CMDgram.c" +#line 2525 "CMDgram.c" break; case 59: /* case_expr: expr */ #line 335 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr);} -#line 2504 "CMDgram.c" +#line 2531 "CMDgram.c" break; case 60: /* case_expr: case_expr rwCASEOR expr */ #line 337 "CMDgram.y" { ((yyvsp[-2].expr))->append((yyvsp[0].expr)); (yyval.expr)=(yyvsp[-2].expr); } -#line 2510 "CMDgram.c" +#line 2537 "CMDgram.c" break; case 61: /* if_stmt: rwIF '(' expr ')' stmt_block */ #line 342 "CMDgram.y" { (yyval.stmt) = IfStmtNode::alloc((yyvsp[-4].i).lineNumber, (yyvsp[-2].expr), (yyvsp[0].stmt), NULL, false); } -#line 2516 "CMDgram.c" +#line 2543 "CMDgram.c" break; case 62: /* if_stmt: rwIF '(' expr ')' stmt_block rwELSE stmt_block */ #line 344 "CMDgram.y" { (yyval.stmt) = IfStmtNode::alloc((yyvsp[-6].i).lineNumber, (yyvsp[-4].expr), (yyvsp[-2].stmt), (yyvsp[0].stmt), false); } -#line 2522 "CMDgram.c" +#line 2549 "CMDgram.c" break; case 63: /* while_stmt: rwWHILE '(' expr ')' stmt_block */ #line 349 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-4].i).lineNumber, nil, (yyvsp[-2].expr), nil, (yyvsp[0].stmt), false); } -#line 2528 "CMDgram.c" +#line 2555 "CMDgram.c" break; case 64: /* while_stmt: rwDO stmt_block rwWHILE '(' expr ')' */ #line 351 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-3].i).lineNumber, nil, (yyvsp[-1].expr), nil, (yyvsp[-4].stmt), true); } -#line 2534 "CMDgram.c" +#line 2561 "CMDgram.c" break; case 65: /* for_stmt: rwFOR '(' expr ';' expr ';' expr ')' stmt_block */ #line 356 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-8].i).lineNumber, (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2540 "CMDgram.c" +#line 2567 "CMDgram.c" break; case 66: /* for_stmt: rwFOR '(' expr ';' expr ';' ')' stmt_block */ #line 358 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), NULL, (yyvsp[0].stmt), false); } -#line 2546 "CMDgram.c" +#line 2573 "CMDgram.c" break; case 67: /* for_stmt: rwFOR '(' expr ';' ';' expr ')' stmt_block */ #line 360 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, (yyvsp[-5].expr), NULL, (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2552 "CMDgram.c" +#line 2579 "CMDgram.c" break; case 68: /* for_stmt: rwFOR '(' expr ';' ';' ')' stmt_block */ #line 362 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, (yyvsp[-4].expr), NULL, NULL, (yyvsp[0].stmt), false); } -#line 2558 "CMDgram.c" +#line 2585 "CMDgram.c" break; case 69: /* for_stmt: rwFOR '(' ';' expr ';' expr ')' stmt_block */ #line 364 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2564 "CMDgram.c" +#line 2591 "CMDgram.c" break; case 70: /* for_stmt: rwFOR '(' ';' expr ';' ')' stmt_block */ #line 366 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, NULL, (yyvsp[-3].expr), NULL, (yyvsp[0].stmt), false); } -#line 2570 "CMDgram.c" +#line 2597 "CMDgram.c" break; case 71: /* for_stmt: rwFOR '(' ';' ';' expr ')' stmt_block */ #line 368 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, NULL, NULL, (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2576 "CMDgram.c" +#line 2603 "CMDgram.c" break; case 72: /* for_stmt: rwFOR '(' ';' ';' ')' stmt_block */ #line 370 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-5].i).lineNumber, NULL, NULL, NULL, (yyvsp[0].stmt), false); } -#line 2582 "CMDgram.c" +#line 2609 "CMDgram.c" break; case 73: /* foreach_stmt: rwFOREACH '(' VAR rwIN expr ')' stmt_block */ #line 375 "CMDgram.y" { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].stmt), false ); } -#line 2588 "CMDgram.c" +#line 2615 "CMDgram.c" break; case 74: /* foreach_stmt: rwFOREACHSTR '(' VAR rwIN expr ')' stmt_block */ #line 377 "CMDgram.y" { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].stmt), true ); } -#line 2594 "CMDgram.c" +#line 2621 "CMDgram.c" break; case 75: /* expression_stmt: stmt_expr */ #line 382 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].expr); } -#line 2600 "CMDgram.c" +#line 2627 "CMDgram.c" break; case 76: /* expr: stmt_expr */ #line 387 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2606 "CMDgram.c" +#line 2633 "CMDgram.c" break; case 77: /* expr: '(' expr ')' */ #line 389 "CMDgram.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2612 "CMDgram.c" +#line 2639 "CMDgram.c" break; case 78: /* expr: expr '^' expr */ #line 391 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2618 "CMDgram.c" +#line 2645 "CMDgram.c" break; case 79: /* expr: expr '%' expr */ #line 393 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2624 "CMDgram.c" +#line 2651 "CMDgram.c" break; case 80: /* expr: expr '&' expr */ #line 395 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2630 "CMDgram.c" +#line 2657 "CMDgram.c" break; case 81: /* expr: expr '|' expr */ #line 397 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2636 "CMDgram.c" +#line 2663 "CMDgram.c" break; case 82: /* expr: expr '+' expr */ #line 399 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2642 "CMDgram.c" +#line 2669 "CMDgram.c" break; case 83: /* expr: expr '-' expr */ #line 401 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2648 "CMDgram.c" +#line 2675 "CMDgram.c" break; case 84: /* expr: expr '*' expr */ #line 403 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2654 "CMDgram.c" +#line 2681 "CMDgram.c" break; case 85: /* expr: expr '/' expr */ #line 405 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2660 "CMDgram.c" +#line 2687 "CMDgram.c" break; case 86: /* expr: '-' expr */ #line 407 "CMDgram.y" { (yyval.expr) = FloatUnaryExprNode::alloc( (yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2666 "CMDgram.c" +#line 2693 "CMDgram.c" break; case 87: /* expr: '*' expr */ #line 409 "CMDgram.y" { (yyval.expr) = TTagDerefNode::alloc( (yyvsp[-1].i).lineNumber, (yyvsp[0].expr) ); } -#line 2672 "CMDgram.c" +#line 2699 "CMDgram.c" break; case 88: /* expr: TTAG */ #line 411 "CMDgram.y" { (yyval.expr) = TTagExprNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2678 "CMDgram.c" +#line 2705 "CMDgram.c" break; case 89: /* expr: expr '?' expr ':' expr */ #line 413 "CMDgram.y" { (yyval.expr) = ConditionalExprNode::alloc( (yyvsp[-4].expr)->dbgLineNumber, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2684 "CMDgram.c" +#line 2711 "CMDgram.c" break; case 90: /* expr: expr '<' expr */ #line 415 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2690 "CMDgram.c" +#line 2717 "CMDgram.c" break; case 91: /* expr: expr '>' expr */ #line 417 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2696 "CMDgram.c" +#line 2723 "CMDgram.c" break; case 92: /* expr: expr opGE expr */ #line 419 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2702 "CMDgram.c" +#line 2729 "CMDgram.c" break; case 93: /* expr: expr opLE expr */ #line 421 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2708 "CMDgram.c" +#line 2735 "CMDgram.c" break; case 94: /* expr: expr opEQ expr */ #line 423 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2714 "CMDgram.c" +#line 2741 "CMDgram.c" break; case 95: /* expr: expr opNE expr */ #line 425 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2720 "CMDgram.c" +#line 2747 "CMDgram.c" break; case 96: /* expr: expr opOR expr */ #line 427 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2726 "CMDgram.c" +#line 2753 "CMDgram.c" break; case 97: /* expr: expr opSHL expr */ #line 429 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2732 "CMDgram.c" +#line 2759 "CMDgram.c" break; case 98: /* expr: expr opSHR expr */ #line 431 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2738 "CMDgram.c" +#line 2765 "CMDgram.c" break; case 99: /* expr: expr opAND expr */ #line 433 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2744 "CMDgram.c" +#line 2771 "CMDgram.c" break; case 100: /* expr: expr opSTREQ expr */ #line 435 "CMDgram.y" { (yyval.expr) = StreqExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), true); } -#line 2750 "CMDgram.c" +#line 2777 "CMDgram.c" break; case 101: /* expr: expr opSTRNE expr */ #line 437 "CMDgram.y" { (yyval.expr) = StreqExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), false); } -#line 2756 "CMDgram.c" +#line 2783 "CMDgram.c" break; case 102: /* expr: expr '@' expr */ #line 439 "CMDgram.y" { (yyval.expr) = StrcatExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), (yyvsp[-1].i).value); } -#line 2762 "CMDgram.c" +#line 2789 "CMDgram.c" break; case 103: /* expr: '!' expr */ #line 441 "CMDgram.y" { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2768 "CMDgram.c" +#line 2795 "CMDgram.c" break; case 104: /* expr: '~' expr */ #line 443 "CMDgram.y" { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2774 "CMDgram.c" +#line 2801 "CMDgram.c" break; case 105: /* expr: TAGATOM */ #line 445 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, true); } -#line 2780 "CMDgram.c" +#line 2807 "CMDgram.c" break; case 106: /* expr: FLTCONST */ #line 447 "CMDgram.y" { (yyval.expr) = FloatNode::alloc( (yyvsp[0].f).lineNumber, (yyvsp[0].f).value ); } -#line 2786 "CMDgram.c" +#line 2813 "CMDgram.c" break; case 107: /* expr: INTCONST */ #line 449 "CMDgram.y" { (yyval.expr) = IntNode::alloc( (yyvsp[0].i).lineNumber, (yyvsp[0].i).value ); } -#line 2792 "CMDgram.c" +#line 2819 "CMDgram.c" break; case 108: /* expr: rwBREAK */ #line 451 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].i).lineNumber, StringTable->insert("break")); } -#line 2798 "CMDgram.c" +#line 2825 "CMDgram.c" break; case 109: /* expr: slot_acc */ #line 453 "CMDgram.y" { (yyval.expr) = SlotAccessNode::alloc( (yyvsp[0].slot).lineNumber, (yyvsp[0].slot).object, (yyvsp[0].slot).array, (yyvsp[0].slot).slotName ); } -#line 2804 "CMDgram.c" +#line 2831 "CMDgram.c" break; case 110: /* expr: intslot_acc */ #line 455 "CMDgram.y" { (yyval.expr) = InternalSlotAccessNode::alloc( (yyvsp[0].intslot).lineNumber, (yyvsp[0].intslot).object, (yyvsp[0].intslot).slotExpr, (yyvsp[0].intslot).recurse); } -#line 2810 "CMDgram.c" +#line 2837 "CMDgram.c" break; case 111: /* expr: IDENT */ #line 457 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2816 "CMDgram.c" +#line 2843 "CMDgram.c" break; case 112: /* expr: STRATOM */ #line 459 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, false); } -#line 2822 "CMDgram.c" +#line 2849 "CMDgram.c" break; case 113: /* expr: VAR */ #line 461 "CMDgram.y" { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL); } -#line 2828 "CMDgram.c" +#line 2855 "CMDgram.c" break; case 114: /* expr: VAR '[' aidx_expr ']' */ #line 463 "CMDgram.y" { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-1].expr) ); } -#line 2834 "CMDgram.c" +#line 2861 "CMDgram.c" + break; + + case 115: /* expr: '[' expr_list_decl ']' */ +#line 465 "CMDgram.y" + { + Vector elems; + if ((yyvsp[-1].expr)) { + // expr_list already chains ExprNodes using append(), + // so walk and collect them + for (ExprNode* e = (yyvsp[-1].expr); e; e = (ExprNode*)e->getNext()) + elems.push_back(e); + } + (yyval.expr) = VectorExprNode::alloc((yylsp[-2]).first_line, elems); + } +#line 2876 "CMDgram.c" break; - case 115: /* slot_acc: expr '.' IDENT */ -#line 485 "CMDgram.y" + case 116: /* slot_acc: expr '.' IDENT */ +#line 496 "CMDgram.y" { (yyval.slot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[-2].expr); (yyval.slot).slotName = (yyvsp[0].s).value; (yyval.slot).array = NULL; } -#line 2840 "CMDgram.c" +#line 2882 "CMDgram.c" break; - case 116: /* slot_acc: expr '.' IDENT '[' aidx_expr ']' */ -#line 487 "CMDgram.y" + case 117: /* slot_acc: expr '.' IDENT '[' aidx_expr ']' */ +#line 498 "CMDgram.y" { (yyval.slot).lineNumber = (yyvsp[-5].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[-5].expr); (yyval.slot).slotName = (yyvsp[-3].s).value; (yyval.slot).array = (yyvsp[-1].expr); } -#line 2846 "CMDgram.c" +#line 2888 "CMDgram.c" break; - case 117: /* intslot_acc: expr opINTNAME class_name_expr */ -#line 492 "CMDgram.y" + case 118: /* intslot_acc: expr opINTNAME class_name_expr */ +#line 503 "CMDgram.y" { (yyval.intslot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[-2].expr); (yyval.intslot).slotExpr = (yyvsp[0].expr); (yyval.intslot).recurse = false; } -#line 2852 "CMDgram.c" +#line 2894 "CMDgram.c" break; - case 118: /* intslot_acc: expr opINTNAMER class_name_expr */ -#line 494 "CMDgram.y" + case 119: /* intslot_acc: expr opINTNAMER class_name_expr */ +#line 505 "CMDgram.y" { (yyval.intslot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[-2].expr); (yyval.intslot).slotExpr = (yyvsp[0].expr); (yyval.intslot).recurse = true; } -#line 2858 "CMDgram.c" +#line 2900 "CMDgram.c" break; - case 119: /* class_name_expr: IDENT */ -#line 499 "CMDgram.y" + case 120: /* class_name_expr: IDENT */ +#line 510 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2864 "CMDgram.c" +#line 2906 "CMDgram.c" break; - case 120: /* class_name_expr: '(' expr ')' */ -#line 501 "CMDgram.y" + case 121: /* class_name_expr: '(' expr ')' */ +#line 512 "CMDgram.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2870 "CMDgram.c" +#line 2912 "CMDgram.c" break; - case 121: /* assign_op_struct: opPLUSPLUS */ -#line 506 "CMDgram.y" + case 122: /* assign_op_struct: opPLUSPLUS */ +#line 517 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[0].i).lineNumber; (yyval.asn).token = opPLUSPLUS; (yyval.asn).expr = FloatNode::alloc( (yyvsp[0].i).lineNumber, 1 ); } -#line 2876 "CMDgram.c" +#line 2918 "CMDgram.c" break; - case 122: /* assign_op_struct: opMINUSMINUS */ -#line 508 "CMDgram.y" + case 123: /* assign_op_struct: opMINUSMINUS */ +#line 519 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[0].i).lineNumber; (yyval.asn).token = opMINUSMINUS; (yyval.asn).expr = FloatNode::alloc( (yyvsp[0].i).lineNumber, 1 ); } -#line 2882 "CMDgram.c" +#line 2924 "CMDgram.c" break; - case 123: /* assign_op_struct: opPLASN expr */ -#line 510 "CMDgram.y" + case 124: /* assign_op_struct: opPLASN expr */ +#line 521 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '+'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2888 "CMDgram.c" +#line 2930 "CMDgram.c" break; - case 124: /* assign_op_struct: opMIASN expr */ -#line 512 "CMDgram.y" + case 125: /* assign_op_struct: opMIASN expr */ +#line 523 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '-'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2894 "CMDgram.c" +#line 2936 "CMDgram.c" break; - case 125: /* assign_op_struct: opMLASN expr */ -#line 514 "CMDgram.y" + case 126: /* assign_op_struct: opMLASN expr */ +#line 525 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '*'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2900 "CMDgram.c" +#line 2942 "CMDgram.c" break; - case 126: /* assign_op_struct: opDVASN expr */ -#line 516 "CMDgram.y" + case 127: /* assign_op_struct: opDVASN expr */ +#line 527 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '/'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2906 "CMDgram.c" +#line 2948 "CMDgram.c" break; - case 127: /* assign_op_struct: opMODASN expr */ -#line 518 "CMDgram.y" + case 128: /* assign_op_struct: opMODASN expr */ +#line 529 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '%'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2912 "CMDgram.c" +#line 2954 "CMDgram.c" break; - case 128: /* assign_op_struct: opANDASN expr */ -#line 520 "CMDgram.y" + case 129: /* assign_op_struct: opANDASN expr */ +#line 531 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '&'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2918 "CMDgram.c" +#line 2960 "CMDgram.c" break; - case 129: /* assign_op_struct: opXORASN expr */ -#line 522 "CMDgram.y" + case 130: /* assign_op_struct: opXORASN expr */ +#line 533 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '^'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2924 "CMDgram.c" +#line 2966 "CMDgram.c" break; - case 130: /* assign_op_struct: opORASN expr */ -#line 524 "CMDgram.y" + case 131: /* assign_op_struct: opORASN expr */ +#line 535 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '|'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2930 "CMDgram.c" +#line 2972 "CMDgram.c" break; - case 131: /* assign_op_struct: opSLASN expr */ -#line 526 "CMDgram.y" + case 132: /* assign_op_struct: opSLASN expr */ +#line 537 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = opSHL; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2936 "CMDgram.c" +#line 2978 "CMDgram.c" break; - case 132: /* assign_op_struct: opSRASN expr */ -#line 528 "CMDgram.y" + case 133: /* assign_op_struct: opSRASN expr */ +#line 539 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = opSHR; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2942 "CMDgram.c" +#line 2984 "CMDgram.c" break; - case 133: /* stmt_expr: funcall_expr */ -#line 533 "CMDgram.y" + case 134: /* stmt_expr: funcall_expr */ +#line 544 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2948 "CMDgram.c" +#line 2990 "CMDgram.c" break; - case 134: /* stmt_expr: assert_expr */ -#line 535 "CMDgram.y" + case 135: /* stmt_expr: assert_expr */ +#line 546 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2954 "CMDgram.c" +#line 2996 "CMDgram.c" break; - case 135: /* stmt_expr: object_decl */ -#line 537 "CMDgram.y" + case 136: /* stmt_expr: object_decl */ +#line 548 "CMDgram.y" { (yyval.expr) = (yyvsp[0].od); } -#line 2960 "CMDgram.c" +#line 3002 "CMDgram.c" break; - case 136: /* stmt_expr: VAR '=' expr */ -#line 539 "CMDgram.y" + case 137: /* stmt_expr: VAR '=' expr */ +#line 550 "CMDgram.y" { (yyval.expr) = AssignExprNode::alloc( (yyvsp[-2].s).lineNumber, (yyvsp[-2].s).value, NULL, (yyvsp[0].expr)); } -#line 2966 "CMDgram.c" +#line 3008 "CMDgram.c" break; - case 137: /* stmt_expr: VAR '[' aidx_expr ']' '=' expr */ -#line 541 "CMDgram.y" + case 138: /* stmt_expr: VAR '[' aidx_expr ']' '=' expr */ +#line 552 "CMDgram.y" { (yyval.expr) = AssignExprNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-5].s).value, (yyvsp[-3].expr), (yyvsp[0].expr)); } -#line 2972 "CMDgram.c" +#line 3014 "CMDgram.c" break; - case 138: /* stmt_expr: VAR assign_op_struct */ -#line 543 "CMDgram.y" + case 139: /* stmt_expr: VAR assign_op_struct */ +#line 554 "CMDgram.y" { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[-1].s).lineNumber, (yyvsp[-1].s).value, NULL, (yyvsp[0].asn).expr, (yyvsp[0].asn).token); } -#line 2978 "CMDgram.c" +#line 3020 "CMDgram.c" break; - case 139: /* stmt_expr: VAR '[' aidx_expr ']' assign_op_struct */ -#line 545 "CMDgram.y" + case 140: /* stmt_expr: VAR '[' aidx_expr ']' assign_op_struct */ +#line 556 "CMDgram.y" { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[-4].s).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].asn).expr, (yyvsp[0].asn).token); } -#line 2984 "CMDgram.c" +#line 3026 "CMDgram.c" break; - case 140: /* stmt_expr: slot_acc assign_op_struct */ -#line 547 "CMDgram.y" + case 141: /* stmt_expr: slot_acc assign_op_struct */ +#line 558 "CMDgram.y" { (yyval.expr) = SlotAssignOpNode::alloc( (yyvsp[-1].slot).lineNumber, (yyvsp[-1].slot).object, (yyvsp[-1].slot).slotName, (yyvsp[-1].slot).array, (yyvsp[0].asn).token, (yyvsp[0].asn).expr); } -#line 2990 "CMDgram.c" +#line 3032 "CMDgram.c" break; - case 141: /* stmt_expr: slot_acc '=' expr */ -#line 549 "CMDgram.y" + case 142: /* stmt_expr: slot_acc '=' expr */ +#line 560 "CMDgram.y" { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[-2].slot).lineNumber, (yyvsp[-2].slot).object, (yyvsp[-2].slot).array, (yyvsp[-2].slot).slotName, (yyvsp[0].expr)); } -#line 2996 "CMDgram.c" +#line 3038 "CMDgram.c" break; - case 142: /* stmt_expr: slot_acc '=' '{' expr_list '}' */ -#line 551 "CMDgram.y" + case 143: /* stmt_expr: slot_acc '=' '{' expr_list '}' */ +#line 562 "CMDgram.y" { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[-4].slot).lineNumber, (yyvsp[-4].slot).object, (yyvsp[-4].slot).array, (yyvsp[-4].slot).slotName, (yyvsp[-1].expr)); } -#line 3002 "CMDgram.c" +#line 3044 "CMDgram.c" break; - case 143: /* funcall_expr: IDENT '(' expr_list_decl ')' */ -#line 556 "CMDgram.y" + case 144: /* funcall_expr: IDENT '(' expr_list_decl ')' */ +#line 567 "CMDgram.y" { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, NULL, (yyvsp[-1].expr), false); } -#line 3008 "CMDgram.c" +#line 3050 "CMDgram.c" break; - case 144: /* funcall_expr: IDENT opCOLONCOLON IDENT '(' expr_list_decl ')' */ -#line 558 "CMDgram.y" + case 145: /* funcall_expr: IDENT opCOLONCOLON IDENT '(' expr_list_decl ')' */ +#line 569 "CMDgram.y" { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-5].s).value, (yyvsp[-1].expr), false); } -#line 3014 "CMDgram.c" +#line 3056 "CMDgram.c" break; - case 145: /* funcall_expr: expr '.' IDENT '(' expr_list_decl ')' */ -#line 560 "CMDgram.y" + case 146: /* funcall_expr: expr '.' IDENT '(' expr_list_decl ')' */ +#line 571 "CMDgram.y" { (yyvsp[-5].expr)->append((yyvsp[-1].expr)); (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-5].expr)->dbgLineNumber, (yyvsp[-3].s).value, NULL, (yyvsp[-5].expr), true); } -#line 3020 "CMDgram.c" +#line 3062 "CMDgram.c" break; - case 146: /* assert_expr: rwASSERT '(' expr ')' */ -#line 570 "CMDgram.y" + case 147: /* assert_expr: rwASSERT '(' expr ')' */ +#line 581 "CMDgram.y" { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[-3].i).lineNumber, (yyvsp[-1].expr), NULL ); } -#line 3026 "CMDgram.c" +#line 3068 "CMDgram.c" break; - case 147: /* assert_expr: rwASSERT '(' expr ',' STRATOM ')' */ -#line 572 "CMDgram.y" + case 148: /* assert_expr: rwASSERT '(' expr ',' STRATOM ')' */ +#line 583 "CMDgram.y" { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[-5].i).lineNumber, (yyvsp[-3].expr), (yyvsp[-1].str).value ); } -#line 3032 "CMDgram.c" +#line 3074 "CMDgram.c" break; - case 148: /* expr_list_decl: %empty */ -#line 577 "CMDgram.y" + case 149: /* expr_list_decl: %empty */ +#line 588 "CMDgram.y" { (yyval.expr) = NULL; } -#line 3038 "CMDgram.c" +#line 3080 "CMDgram.c" break; - case 149: /* expr_list_decl: expr_list */ -#line 579 "CMDgram.y" + case 150: /* expr_list_decl: expr_list */ +#line 590 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3044 "CMDgram.c" +#line 3086 "CMDgram.c" break; - case 150: /* expr_list: expr */ -#line 584 "CMDgram.y" + case 151: /* expr_list: expr */ +#line 595 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3050 "CMDgram.c" +#line 3092 "CMDgram.c" break; - case 151: /* expr_list: expr_list ',' expr */ -#line 586 "CMDgram.y" + case 152: /* expr_list: expr_list ',' expr */ +#line 597 "CMDgram.y" { ((yyvsp[-2].expr))->append((yyvsp[0].expr)); (yyval.expr) = (yyvsp[-2].expr); } -#line 3056 "CMDgram.c" +#line 3098 "CMDgram.c" break; - case 152: /* slot_assign_list_opt: %empty */ -#line 591 "CMDgram.y" + case 153: /* slot_assign_list_opt: %empty */ +#line 602 "CMDgram.y" { (yyval.slist) = NULL; } -#line 3062 "CMDgram.c" +#line 3104 "CMDgram.c" break; - case 153: /* slot_assign_list_opt: slot_assign_list */ -#line 593 "CMDgram.y" + case 154: /* slot_assign_list_opt: slot_assign_list */ +#line 604 "CMDgram.y" { (yyval.slist) = (yyvsp[0].slist); } -#line 3068 "CMDgram.c" +#line 3110 "CMDgram.c" break; - case 154: /* slot_assign_list: slot_assign */ -#line 598 "CMDgram.y" + case 155: /* slot_assign_list: slot_assign */ +#line 609 "CMDgram.y" { (yyval.slist) = (yyvsp[0].slist); } -#line 3074 "CMDgram.c" +#line 3116 "CMDgram.c" break; - case 155: /* slot_assign_list: slot_assign_list slot_assign */ -#line 600 "CMDgram.y" + case 156: /* slot_assign_list: slot_assign_list slot_assign */ +#line 611 "CMDgram.y" { (yyvsp[-1].slist)->append((yyvsp[0].slist)); (yyval.slist) = (yyvsp[-1].slist); } -#line 3080 "CMDgram.c" +#line 3122 "CMDgram.c" break; - case 156: /* slot_assign: IDENT '=' expr ';' */ -#line 605 "CMDgram.y" + case 157: /* slot_assign: IDENT '=' expr ';' */ +#line 616 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-3].s).lineNumber, NULL, NULL, (yyvsp[-3].s).value, (yyvsp[-1].expr)); } -#line 3086 "CMDgram.c" +#line 3128 "CMDgram.c" break; - case 157: /* slot_assign: TYPEIDENT IDENT '=' expr ';' */ -#line 607 "CMDgram.y" + case 158: /* slot_assign: TYPEIDENT IDENT '=' expr ';' */ +#line 618 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-4].i).lineNumber, NULL, NULL, (yyvsp[-3].s).value, (yyvsp[-1].expr), (yyvsp[-4].i).value); } -#line 3092 "CMDgram.c" +#line 3134 "CMDgram.c" break; - case 158: /* slot_assign: rwDATABLOCK '=' expr ';' */ -#line 609 "CMDgram.y" + case 159: /* slot_assign: rwDATABLOCK '=' expr ';' */ +#line 620 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-3].i).lineNumber, NULL, NULL, StringTable->insert("datablock"), (yyvsp[-1].expr)); } -#line 3098 "CMDgram.c" +#line 3140 "CMDgram.c" break; - case 159: /* slot_assign: IDENT '[' aidx_expr ']' '=' expr ';' */ -#line 611 "CMDgram.y" + case 160: /* slot_assign: IDENT '[' aidx_expr ']' '=' expr ';' */ +#line 622 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-6].s).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-6].s).value, (yyvsp[-1].expr)); } -#line 3104 "CMDgram.c" +#line 3146 "CMDgram.c" break; - case 160: /* slot_assign: TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';' */ -#line 613 "CMDgram.y" + case 161: /* slot_assign: TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';' */ +#line 624 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-7].i).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-6].s).value, (yyvsp[-1].expr), (yyvsp[-7].i).value); } -#line 3110 "CMDgram.c" +#line 3152 "CMDgram.c" break; - case 161: /* aidx_expr: expr */ -#line 618 "CMDgram.y" + case 162: /* aidx_expr: expr */ +#line 629 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3116 "CMDgram.c" +#line 3158 "CMDgram.c" break; - case 162: /* aidx_expr: aidx_expr ',' expr */ -#line 620 "CMDgram.y" + case 163: /* aidx_expr: aidx_expr ',' expr */ +#line 631 "CMDgram.y" { (yyval.expr) = CommaCatExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3122 "CMDgram.c" +#line 3164 "CMDgram.c" break; -#line 3126 "CMDgram.c" +#line 3168 "CMDgram.c" default: break; } @@ -3325,7 +3367,7 @@ yyparse (void) return yyresult; } -#line 622 "CMDgram.y" +#line 633 "CMDgram.y" int diff --git a/Engine/source/console/torquescript/codeBlock.cpp b/Engine/source/console/torquescript/codeBlock.cpp index 5a4bdb30ae..414c95c958 100644 --- a/Engine/source/console/torquescript/codeBlock.cpp +++ b/Engine/source/console/torquescript/codeBlock.cpp @@ -1389,6 +1389,19 @@ void CodeBlock::dumpInstructions(U32 startIp, bool upToReturn) break; } + case OP_CREATE_VECTOR: + { + U32 count = code[ip]; + Con::printf("%i: OP_CREATE_VECTOR stk=+1 count=%u", ip - 2, count); + ++ip; + break; + } + case OP_VECTOR_PUSH: + { + Con::printf("%i: OP_VECTOR_PUSH stk=0", ip - 1); + break; + } + default: Con::printf("%i: !!INVALID!!", ip - 1); break; diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index f6cb5695ec..7b6624a69d 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -2238,6 +2238,49 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi break; } + case OP_CREATE_VECTOR: + { + U32 count = code[ip++]; + + ConsoleValue vecVal; + vecVal.setVector(new Vector()); + vecVal.getVector()->reserve(count); + + stack[++_STK] = vecVal; + + Con::printf("%i: OP_CREATE_VECTOR pushed vector, count=%u, _STK=%d", ip - 2, count, _STK); + break; + } + + case OP_VECTOR_PUSH: + { + // Vector must be at _STK + ConsoleValue& vecVal = stack[_STK]; + Vector* vec = vecVal.getVector(); + + if (!vec) + { + Con::printf("ERROR: OP_VECTOR_PUSH vector is null at _STK=%d", _STK); + break; + } + + // Element is right above vector on the stack + ConsoleValue elem = stack[_STK + 1]; + + // Push element into vector + vec->push_back(elem); + + // Remove element from stack + // _STK remains pointing to the vector + // shift elements down if necessary + for (int i = _STK + 1; i < _STK + 1; ++i) + stack[i] = stack[i + 1]; + + Con::printf("OP_VECTOR_PUSH pushed element into vector, _STK=%d, vector size=%zu", _STK, vec->size()); + + break; + } + case OP_INVALID: TORQUE_CASE_FALLTHROUGH; default: diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index 74737c7730..f76269c572 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -166,6 +166,9 @@ namespace Compiler OP_ITER, ///< Enter foreach loop. OP_ITER_END, ///< End foreach loop. + OP_CREATE_VECTOR, + OP_VECTOR_PUSH, + OP_INVALID, // 90 MAX_OP_CODELEN ///< The amount of op codes. From 35cfd4a1f8cce8ad28031986170306c82e1536fd Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 29 Sep 2025 14:32:16 +0100 Subject: [PATCH 02/33] more requirements Added local and global variations for vector variables Load/Save all working TODO: Accesor (like arrays) Con::data VectorCallback --- Engine/source/console/console.h | 16 ++++-- Engine/source/console/consoleInternal.h | 27 +++++++++ Engine/source/console/torquescript/ast.h | 5 +- .../source/console/torquescript/astNodes.cpp | 18 ++++-- .../console/torquescript/compiledEval.cpp | 57 +++++++++++++++---- Engine/source/console/torquescript/compiler.h | 4 ++ .../source/console/torquescript/evalState.h | 12 ++++ 7 files changed, 115 insertions(+), 24 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 7216519897..ca801147cb 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -161,12 +161,7 @@ class ConsoleValue TORQUE_FORCEINLINE void cleanupData() { - if (type == cvVector && dataPtr) - { - delete static_cast*>(dataPtr); - dataPtr = nullptr; - } - else if (type <= cvString && bufferLen > 0) + if (type <= cvString && bufferLen > 0) { dFree(s); bufferLen = 0; @@ -205,6 +200,15 @@ class ConsoleValue case cvString: setString(ref.s); break; + case cvVector: + if (ref.dataPtr) + { + Vector* newVec = new Vector(*static_cast*>(ref.dataPtr)); + setVector(newVec); + } + else + setVector(new Vector()); + break; default: setConsoleData(ref.type, ref.dataPtr, ref.enumTable); break; diff --git a/Engine/source/console/consoleInternal.h b/Engine/source/console/consoleInternal.h index beffb2e2c4..f2c4dac72b 100644 --- a/Engine/source/console/consoleInternal.h +++ b/Engine/source/console/consoleInternal.h @@ -338,6 +338,11 @@ class Dictionary return value.getString(); } + inline Vector* getVectorValue() + { + return value.getVector(); + } + void setIntValue(U32 val) { if (mIsConstant) @@ -406,6 +411,28 @@ class Dictionary if (notify) notify->trigger(); } + + void setVectorValue(Vector* val) + { + if (mIsConstant) + { + Con::errorf("Cannot assign value to constant '%s'.", name); + return; + } + + if (value.isConsoleType()) + { + Con::setData(value.type, value.dataPtr, 0, 1, NULL, value.enumTable); // null for now + } + else + { + value.setVector(val); + } + + // Fire off the notification if we have one. + if (notify) + notify->trigger(); + } }; struct HashTableData diff --git a/Engine/source/console/torquescript/ast.h b/Engine/source/console/torquescript/ast.h index efccd51c78..be42330a0c 100644 --- a/Engine/source/console/torquescript/ast.h +++ b/Engine/source/console/torquescript/ast.h @@ -40,7 +40,8 @@ enum TypeReq TypeReqNone, TypeReqUInt, TypeReqFloat, - TypeReqString + TypeReqString, + TypeReqVector }; enum ExprNodeName @@ -141,7 +142,7 @@ struct VectorExprNode : ExprNode static VectorExprNode* alloc(S32 lineNumber, const Vector& elements); U32 compile(CodeStream& codeStream, U32 ip, TypeReq type) override; - TypeReq getPreferredType() override { return TypeReqNone; } + TypeReq getPreferredType() override { return TypeReqVector; } DBG_STMT_TYPE(VectorExprNode); }; diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 6d709b8580..30f32e2ab9 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -708,6 +708,9 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) case TypeReqString: codeStream.emit(OP_LOADVAR_STR); break; + case TypeReqVector: + codeStream.emit(OP_LOADVAR_VECTOR); + break; case TypeReqNone: break; default: @@ -718,9 +721,10 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { switch (type) { - case TypeReqUInt: codeStream.emit(OP_LOAD_LOCAL_VAR_UINT); break; - case TypeReqFloat: codeStream.emit(OP_LOAD_LOCAL_VAR_FLT); break; - default: codeStream.emit(OP_LOAD_LOCAL_VAR_STR); + case TypeReqUInt: codeStream.emit(OP_LOAD_LOCAL_VAR_UINT); break; + case TypeReqFloat: codeStream.emit(OP_LOAD_LOCAL_VAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); break; + default: codeStream.emit(OP_LOAD_LOCAL_VAR_STR); } codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); @@ -960,6 +964,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) case TypeReqString: codeStream.emit(OP_SAVEVAR_STR); break; case TypeReqUInt: codeStream.emit(OP_SAVEVAR_UINT); break; case TypeReqFloat: codeStream.emit(OP_SAVEVAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_SAVEVAR_VECTOR); break; default: break; } } @@ -967,9 +972,10 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { switch (subType) { - case TypeReqUInt: codeStream.emit(OP_SAVE_LOCAL_VAR_UINT); break; - case TypeReqFloat: codeStream.emit(OP_SAVE_LOCAL_VAR_FLT); break; - default: codeStream.emit(OP_SAVE_LOCAL_VAR_STR); + case TypeReqUInt: codeStream.emit(OP_SAVE_LOCAL_VAR_UINT); break; + case TypeReqFloat: codeStream.emit(OP_SAVE_LOCAL_VAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); break; + default: codeStream.emit(OP_SAVE_LOCAL_VAR_STR); } codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber)); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 7b6624a69d..5ccd064469 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -360,6 +360,11 @@ const char *ExprEvalState::getStringVariable() return currentVariable ? currentVariable->getStringValue() : ""; } +Vector* ExprEvalState::getVectorVariable() +{ + return currentVariable ? currentVariable->getVectorValue() : nullptr; +} + //------------------------------------------------------------ void ExprEvalState::setIntVariable(S32 val) @@ -380,6 +385,12 @@ void ExprEvalState::setStringVariable(const char *val) currentVariable->setStringValue(val); } +void ExprEvalState::setVectorVariable(Vector* val) +{ + AssertFatal(currentVariable != NULL, "Invalid evaluator state - trying to set null variable!"); + currentVariable->setVectorValue(val); +} + //----------------------------------------------------------------------------- enum class FloatOperation @@ -1459,6 +1470,12 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi _STK++; break; + case OP_LOADVAR_VECTOR: + currentRegister = -1; + stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); + _STK++; + break; + case OP_SAVEVAR_UINT: Script::gEvalState.setIntVariable(stack[_STK].getInt()); break; @@ -1471,6 +1488,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Script::gEvalState.setStringVariable(stack[_STK].getString()); break; + case OP_SAVEVAR_VECTOR: + Script::gEvalState.setVectorVariable(stack[_STK].getVector()); + break; + case OP_LOAD_LOCAL_VAR_UINT: reg = code[ip++]; currentRegister = reg; @@ -1511,6 +1532,19 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi _STK++; break; + case OP_LOAD_LOCAL_VAR_VECTOR: + reg = code[ip++]; + currentRegister = reg; + + // See OP_SETCURVAR + prevField = NULL; + prevObject = NULL; + curObject = NULL; + + stack[_STK + 1].setVector(Script::gEvalState.getLocalVectorVariable(reg)); + _STK++; + break; + case OP_SAVE_LOCAL_VAR_UINT: reg = code[ip++]; currentRegister = reg; @@ -1548,6 +1582,18 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Script::gEvalState.setLocalStringVariable(reg, val, (S32)dStrlen(val)); break; + case OP_SAVE_LOCAL_VAR_VECTOR: + reg = code[ip++]; + currentRegister = reg; + + // See OP_SETCURVAR + prevField = NULL; + prevObject = NULL; + curObject = NULL; + + Script::gEvalState.setLocalVectorVariable(reg, stack[_STK].getVector()); + break; + case OP_SETCUROBJECT: // Save the previous object for parsing vector fields. prevObject = curObject; @@ -2248,7 +2294,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi stack[++_STK] = vecVal; - Con::printf("%i: OP_CREATE_VECTOR pushed vector, count=%u, _STK=%d", ip - 2, count, _STK); break; } @@ -2265,19 +2310,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } // Element is right above vector on the stack - ConsoleValue elem = stack[_STK + 1]; + ConsoleValue elem = stack[ip + _STK]; // Push element into vector vec->push_back(elem); - // Remove element from stack - // _STK remains pointing to the vector - // shift elements down if necessary - for (int i = _STK + 1; i < _STK + 1; ++i) - stack[i] = stack[i + 1]; - - Con::printf("OP_VECTOR_PUSH pushed element into vector, _STK=%d, vector size=%zu", _STK, vec->size()); - break; } diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index f76269c572..d3c627a1a0 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -109,18 +109,22 @@ namespace Compiler OP_LOADVAR_UINT,// 40 OP_LOADVAR_FLT, OP_LOADVAR_STR, + OP_LOADVAR_VECTOR, OP_SAVEVAR_UINT, OP_SAVEVAR_FLT, OP_SAVEVAR_STR, + OP_SAVEVAR_VECTOR, OP_LOAD_LOCAL_VAR_UINT, OP_LOAD_LOCAL_VAR_FLT, OP_LOAD_LOCAL_VAR_STR, + OP_LOAD_LOCAL_VAR_VECTOR, OP_SAVE_LOCAL_VAR_UINT, OP_SAVE_LOCAL_VAR_FLT, OP_SAVE_LOCAL_VAR_STR, + OP_SAVE_LOCAL_VAR_VECTOR, OP_SETCUROBJECT, OP_SETCUROBJECT_NEW, diff --git a/Engine/source/console/torquescript/evalState.h b/Engine/source/console/torquescript/evalState.h index 05c3be3351..d5c405d0f7 100644 --- a/Engine/source/console/torquescript/evalState.h +++ b/Engine/source/console/torquescript/evalState.h @@ -42,9 +42,11 @@ class ExprEvalState S32 getIntVariable(); F64 getFloatVariable(); const char *getStringVariable(); + Vector* getVectorVariable(); void setIntVariable(S32 val); void setFloatVariable(F64 val); void setStringVariable(const char *str); + void setVectorVariable(Vector* val); TORQUE_FORCEINLINE S32 getLocalIntVariable(S32 reg) { @@ -61,6 +63,11 @@ class ExprEvalState return currentRegisterArray->values[reg].getString(); } + TORQUE_FORCEINLINE Vector* getLocalVectorVariable(S32 reg) + { + return currentRegisterArray->values[reg].getVector(); + } + TORQUE_FORCEINLINE void setLocalIntVariable(S32 reg, S64 val) { currentRegisterArray->values[reg].setInt(val); @@ -81,6 +88,11 @@ class ExprEvalState currentRegisterArray->values[reg].setStringTableEntry(val); } + TORQUE_FORCEINLINE void setLocalVectorVariable(S32 reg, Vector* val) + { + currentRegisterArray->values[reg].setVector(val); + } + TORQUE_FORCEINLINE void moveConsoleValue(S32 reg, ConsoleValue val) { currentRegisterArray->values[reg] = (val); From 23c3cd8590929826dd0621847244f71af45556ad Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 29 Sep 2025 19:22:40 +0100 Subject: [PATCH 03/33] basic echo works --- Engine/source/console/console.cpp | 22 +++++++++++++++++++ Engine/source/console/console.h | 3 +++ .../source/console/torquescript/astNodes.cpp | 3 ++- .../console/torquescript/compiledEval.cpp | 2 +- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 4b9316e6f9..2a4a84ae98 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -69,6 +69,28 @@ char* ConsoleValue::convertToBuffer() const return buffer; } +char* ConsoleValue::convertVectorToBuffer() const +{ + static char buffer[4096]; // ⚠️ reuse buffer, or use FrameAllocator + buffer[0] = 0; + + if (!getVector()) + return (char*)""; + + Vector* vec = getVector(); + + // concatenate elements, space-separated + for (U32 i = 0; i < vec->size(); i++) + { + const char* elemStr = (*vec)[i].getString(); // convert element + if (i > 0) + dStrcat(buffer, " ", sizeof(buffer)); + dStrcat(buffer, elemStr, sizeof(buffer)); + } + + return buffer; +} + const char* ConsoleValue::getConsoleData() const { return Con::getData(type, dataPtr, 0, enumTable); diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index ca801147cb..9124da441a 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -156,6 +156,7 @@ class ConsoleValue static DataChunker sConversionAllocator; char* convertToBuffer() const; + char* convertVectorToBuffer() const; const char* getConsoleData() const; @@ -307,6 +308,8 @@ class ConsoleValue return s; if (isNumberType()) return convertToBuffer(); + if ((type == cvVector)) + return convertVectorToBuffer(); return getConsoleData(); } diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 30f32e2ab9..c1ced0d989 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -380,7 +380,8 @@ U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) for (U32 i = 0; i < elements.size(); i++) { - ip = elements[i]->compile(codeStream, ip, TypeReqNone); + ip = elements[i]->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_POP_STK); codeStream.emit(OP_VECTOR_PUSH); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 5ccd064469..0938bdd7d4 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -2310,7 +2310,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } // Element is right above vector on the stack - ConsoleValue elem = stack[ip + _STK]; + ConsoleValue elem = stack[_STK + 1]; // Push element into vector vec->push_back(elem); From 8644863b5d1ddb69c569e4d529c98d405f1e0feb Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Tue, 30 Sep 2025 08:10:36 +0100 Subject: [PATCH 04/33] fixes compiledEval - use of 'i' warning, i is a class member in here console.cpp - same as above VectorExprNode::compile - allow the element being added to the vector to dictate its preferred type. ConsoleValueType - new types should not be above cvConsoleValueType. --- Engine/source/console/console.cpp | 6 +++--- Engine/source/console/console.h | 4 ++-- Engine/source/console/torquescript/astNodes.cpp | 2 +- .../source/console/torquescript/compiledEval.cpp | 16 ++++++++++++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 2a4a84ae98..1d24778b8f 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -80,10 +80,10 @@ char* ConsoleValue::convertVectorToBuffer() const Vector* vec = getVector(); // concatenate elements, space-separated - for (U32 i = 0; i < vec->size(); i++) + for (U32 v = 0; v < vec->size(); v++) { - const char* elemStr = (*vec)[i].getString(); // convert element - if (i > 0) + const char* elemStr = (*vec)[v].getString(); // convert element + if (v > 0) dStrcat(buffer, " ", sizeof(buffer)); dStrcat(buffer, elemStr, sizeof(buffer)); } diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 9124da441a..f322463d5f 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -120,13 +120,13 @@ typedef const char *StringTableEntry; enum ConsoleValueType { - cvNULL = -5, + cvNULL = -6, + cvVector = -5, cvInteger = -4, cvFloat = -3, cvString = -2, cvSTEntry = -1, cvConsoleValueType = 0, - cvVector = 1, }; class ConsoleValue diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index c1ced0d989..fd6b1af1b3 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -380,7 +380,7 @@ U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) for (U32 i = 0; i < elements.size(); i++) { - ip = elements[i]->compile(codeStream, ip, TypeReqString); + ip = elements[i]->compile(codeStream, ip, elements[i]->getPreferredType()); codeStream.emit(OP_POP_STK); codeStream.emit(OP_VECTOR_PUSH); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 0938bdd7d4..aaaa4c4209 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -2312,8 +2312,20 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi // Element is right above vector on the stack ConsoleValue elem = stack[_STK + 1]; - // Push element into vector - vec->push_back(elem); + // if this is a vector loop its value. + if (elem.type == cvVector) + { + Vector* embedVec = elem.getVector(); + for (U32 v = 0; v < embedVec->size(); v++) + { + vec->push_back((*embedVec)[v]); + } + } + else + { + // Push element into vector + vec->push_back(elem); + } break; } From 9aef7fc1d12ab9257bb058d730d6def0bace25e8 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Tue, 30 Sep 2025 16:33:43 +0100 Subject: [PATCH 05/33] backup commit before removal of array Everything works apart from assign being able to know that we are working with a vector, next commit is to remove arrays as they exist now and replace with vector logic, that way arrayindex can be used to flag that we should be targeting a vector. --- .../source/console/torquescript/astNodes.cpp | 62 +++++++++++++++---- .../console/torquescript/compiledEval.cpp | 25 ++++++++ Engine/source/console/torquescript/compiler.h | 1 + 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index fd6b1af1b3..2b2834edc3 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -380,7 +380,14 @@ U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) for (U32 i = 0; i < elements.size(); i++) { - ip = elements[i]->compile(codeStream, ip, elements[i]->getPreferredType()); + TypeReq req = elements[i]->getPreferredType(); + + if (req == TypeReqNone) + { + req = type; + } + + ip = elements[i]->compile(codeStream, ip, req); codeStream.emit(OP_POP_STK); codeStream.emit(OP_VECTOR_PUSH); } @@ -683,21 +690,43 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) precompileIdent(varName); - bool oldVariables = arrayIndex || varName[0] == '$'; + bool hasArrayIndex = arrayIndex; + bool isGlobal = varName[0] == '$'; + bool isVector = type == TypeReqVector; - if (oldVariables) + if (hasArrayIndex || isGlobal) { - codeStream.emit(arrayIndex ? OP_LOADIMMED_IDENT : OP_SETCURVAR); - codeStream.emitSTE(varName); + if (isGlobal) + { + codeStream.emit((hasArrayIndex) ? OP_LOADIMMED_IDENT : OP_SETCURVAR); + codeStream.emitSTE(varName); + } - if (arrayIndex) + if (isVector && hasArrayIndex) { - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY); - codeStream.emit(OP_POP_STK); + if (!isGlobal) + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + + return codeStream.tell(); } + else + { + if (hasArrayIndex && !isVector) + { + //codeStream.emit(OP_ADVANCE_STR); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY); + codeStream.emit(OP_POP_STK); + } + } + switch (type) { case TypeReqUInt: @@ -736,7 +765,16 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) TypeReq VarNode::getPreferredType() { - bool oldVariables = arrayIndex || varName[0] == '$'; + bool globalScope = varName[0] == '$'; + + if (!globalScope) + { + TypeReq actType = getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); + if (actType == TypeReqVector) + return actType; + } + + bool oldVariables = arrayIndex || globalScope; return oldVariables ? TypeReqNone : getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index aaaa4c4209..4374f481cf 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1476,6 +1476,31 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi _STK++; break; + case OP_LOADVAR_VECTOR_MEMBER: + { + U32 index = stack[_STK--].getInt(); // pop the index + ConsoleValue& vecVal = stack[_STK]; // this is the vector + + Vector* vec = vecVal.getVector(); + if (!vec) + { + Con::errorf("Tried to index a non-vector variable."); + stack[_STK].setEmptyString(); // fail safe + break; + } + + if (index >= vec->size()) + { + Con::warnf("Vector index %u out of range (size=%zu)", index, vec->size()); + stack[_STK].setEmptyString(); // fail safe + break; + } + + // Replace vector with the element at that index + stack[_STK].setString((*vec)[index].getString()); + break; + } + case OP_SAVEVAR_UINT: Script::gEvalState.setIntVariable(stack[_STK].getInt()); break; diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index d3c627a1a0..48c37bc5c6 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -110,6 +110,7 @@ namespace Compiler OP_LOADVAR_FLT, OP_LOADVAR_STR, OP_LOADVAR_VECTOR, + OP_LOADVAR_VECTOR_MEMBER, OP_SAVEVAR_UINT, OP_SAVEVAR_FLT, From 529a155d7360b705387824ad5588c9f452ce5255 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 1 Oct 2025 13:21:43 +0100 Subject: [PATCH 06/33] Assignment commit Vectors can now have each value assigned to, if vector to small its size will increase Arrays created in script will now be promoted to vectors. --- Engine/source/console/console.h | 7 +- .../source/console/torquescript/astNodes.cpp | 196 ++++++++++-------- .../console/torquescript/compiledEval.cpp | 32 ++- Engine/source/console/torquescript/compiler.h | 1 + 4 files changed, 150 insertions(+), 86 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index f322463d5f..08eed1b8b2 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -273,6 +273,8 @@ class ConsoleValue return s == StringTable->EmptyString() ? 0.0f : dAtof(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0.0f : dAtof(s); + if (type == ConsoleValueType::cvVector) + return getVector()->size(); return dAtof(getConsoleData()); } @@ -286,7 +288,8 @@ class ConsoleValue return s == StringTable->EmptyString() ? 0 : dAtoi(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0 : dAtoi(s); - + if (type == ConsoleValueType::cvVector) + return getVector()->size(); return dAtoi(getConsoleData()); } @@ -328,6 +331,8 @@ class ConsoleValue return s == StringTable->EmptyString() ? false : dAtob(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? false : dAtob(s); + if (type == ConsoleValueType::cvVector) + return getVector()->size() > 0; return dAtob(getConsoleData()); } diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 2b2834edc3..4274c42125 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -690,43 +690,35 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) precompileIdent(varName); - bool hasArrayIndex = arrayIndex; bool isGlobal = varName[0] == '$'; - bool isVector = type == TypeReqVector; + bool isVector = arrayIndex; - if (hasArrayIndex || isGlobal) + if (isGlobal) { - if (isGlobal) - { - codeStream.emit((hasArrayIndex) ? OP_LOADIMMED_IDENT : OP_SETCURVAR); - codeStream.emitSTE(varName); - } + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); + } - if (isVector && hasArrayIndex) + if (isVector) + { + if (isGlobal) { - if (!isGlobal) - { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); - } - - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - - return codeStream.tell(); + codeStream.emit(OP_LOADVAR_VECTOR); } else { - if (hasArrayIndex && !isVector) - { - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY); - codeStream.emit(OP_POP_STK); - } + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); } + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + + return codeStream.tell(); + } + + if (isGlobal) + { switch (type) { case TypeReqUInt: @@ -766,16 +758,15 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) TypeReq VarNode::getPreferredType() { bool globalScope = varName[0] == '$'; + TypeReq actType = TypeReqNone; if (!globalScope) { - TypeReq actType = getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); - if (actType == TypeReqVector) - return actType; + actType = getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); } - bool oldVariables = arrayIndex || globalScope; - return oldVariables ? TypeReqNone : getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); + bool isVector = arrayIndex; + return isVector ? TypeReqVector : actType; } //------------------------------------------------------------ @@ -974,30 +965,34 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) ip = expr->compile(codeStream, ip, subType); - bool oldVariables = arrayIndex || varName[0] == '$'; + bool isGlobal = varName[0] == '$'; + bool isVector = arrayIndex; + + if (isGlobal && !isVector) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + } - if (oldVariables) + if (isVector) { - if (arrayIndex) + if (isGlobal) { - //if (subType == TypeReqString) - // codeStream.emit(OP_ADVANCE_STR); - - codeStream.emit(OP_LOADIMMED_IDENT); - codeStream.emitSTE(varName); - - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); + codeStream.emit(OP_LOADVAR_VECTOR); } else { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + return ip; + } + + if (isGlobal) + { switch (subType) { case TypeReqString: codeStream.emit(OP_SAVEVAR_STR); break; @@ -1110,57 +1105,94 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) getAssignOpTypeOp(op, subType, operand); precompileIdent(varName); - bool oldVariables = arrayIndex || varName[0] == '$'; + bool isGlobal = varName[0] == '$'; + bool isVector = arrayIndex; - if (op == opPLUSPLUS && !oldVariables && type == TypeReqNone) + // Special case: ++/-- locals + if (op == opPLUSPLUS && !isGlobal && !isVector && type == TypeReqNone) { const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, TypeReqFloat, dbgLineNumber); - codeStream.emit(OP_INC); codeStream.emit(varIdx); + return codeStream.tell(); } - else + + if (isGlobal && !isVector) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + } + + // Vector compound assignment branch + if (isVector) { ip = expr->compile(codeStream, ip, subType); + // Load vector + if (isGlobal) + { + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } + + // Push index + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - if (oldVariables) + // Load element at index + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + codeStream.emit(operand); + + // Save element back + // Load vector + if (isGlobal) { - if (!arrayIndex) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - } - else - { - codeStream.emit(OP_LOADIMMED_IDENT); - codeStream.emitSTE(varName); - - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); - } - codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); - codeStream.emit(operand); - codeStream.emit((subType == TypeReqFloat) ? OP_SAVEVAR_FLT : OP_SAVEVAR_UINT); + codeStream.emit(OP_LOADVAR_VECTOR); } else { - const bool isFloat = subType == TypeReqFloat; - const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber); - - codeStream.emit(isFloat ? OP_LOAD_LOCAL_VAR_FLT : OP_LOAD_LOCAL_VAR_UINT); - codeStream.emit(varIdx); - codeStream.emit(operand); - codeStream.emit(isFloat ? OP_SAVE_LOCAL_VAR_FLT : OP_SAVE_LOCAL_VAR_UINT); - codeStream.emit(varIdx); + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); } + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + if (type == TypeReqNone) codeStream.emit(OP_POP_STK); + + return codeStream.tell(); + } + + ip = expr->compile(codeStream, ip, subType); + + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + codeStream.emit(operand); + codeStream.emit((subType == TypeReqFloat) ? OP_SAVEVAR_FLT : OP_SAVEVAR_UINT); + } + else + { + const bool isFloat = subType == TypeReqFloat; + const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber); + + codeStream.emit(isFloat ? OP_LOAD_LOCAL_VAR_FLT : OP_LOAD_LOCAL_VAR_UINT); + codeStream.emit(varIdx); + codeStream.emit(operand); + codeStream.emit(isFloat ? OP_SAVE_LOCAL_VAR_FLT : OP_SAVE_LOCAL_VAR_UINT); + codeStream.emit(varIdx); } + + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); + return codeStream.tell(); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 4374f481cf..0c2a85929a 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1452,6 +1452,31 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi curNSDocBlock = NULL; break; + case OP_SETCURVAR_VECTOR_MEMBER: + { + U32 index = stack[_STK--].getInt(); // index + ConsoleValue& vecVal = stack[_STK--]; // vector + ConsoleValue exprVal = stack[_STK--]; // value + + Vector* vec = vecVal.getVector(); + if (!vec) + { + Con::errorf("Assigning to non-vector variable, promoting to a vector."); + vecVal.setVector(new Vector()); + vec = vecVal.getVector(); + } + + if (index >= vec->size()) + { + vec->setSize(index + 1); + } + + (*vec)[index] = exprVal; + + // leave the vector itself on stack (like other save ops) + break; + } + case OP_LOADVAR_UINT: currentRegister = -1; stack[_STK + 1].setInt(Script::gEvalState.getIntVariable()); @@ -1484,9 +1509,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Vector* vec = vecVal.getVector(); if (!vec) { - Con::errorf("Tried to index a non-vector variable."); - stack[_STK].setEmptyString(); // fail safe - break; + Con::errorf("Tried to index a non-vector variable. Promoting to vector."); + vecVal.setVector(new Vector()); + vec = vecVal.getVector(); + vec->setSize(index + 1); } if (index >= vec->size()) diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index 48c37bc5c6..2e2ffdcab2 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -105,6 +105,7 @@ namespace Compiler OP_SETCURVAR_CREATE, OP_SETCURVAR_ARRAY, OP_SETCURVAR_ARRAY_CREATE, + OP_SETCURVAR_VECTOR_MEMBER, OP_LOADVAR_UINT,// 40 OP_LOADVAR_FLT, From 4d8db61aa8601a2659f4c464a9cc3fe3f3909bdb Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 1 Oct 2025 15:00:24 +0100 Subject: [PATCH 07/33] vector type when getting a vector member return it by the type requested --- .../source/console/torquescript/astNodes.cpp | 2 ++ .../console/torquescript/compiledEval.cpp | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 4274c42125..ad7f420888 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -713,6 +713,7 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(type); return codeStream.tell(); } @@ -1143,6 +1144,7 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) // Load element at index codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(subType); codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); codeStream.emit(operand); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 0c2a85929a..df5a20b027 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1505,6 +1505,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { U32 index = stack[_STK--].getInt(); // pop the index ConsoleValue& vecVal = stack[_STK]; // this is the vector + TypeReq type = (TypeReq)code[ip++]; Vector* vec = vecVal.getVector(); if (!vec) @@ -1522,8 +1523,23 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi break; } - // Replace vector with the element at that index - stack[_STK].setString((*vec)[index].getString()); + // Replace vector with the element at that index use the type. + switch (type) + { + case TypeReqUInt: + stack[_STK].setInt((*vec)[index].getInt()); + break; + case TypeReqFloat: + stack[_STK].setFloat((*vec)[index].getFloat()); + break; + case TypeReqString: + case TypeReqVector: + case TypeReqNone: + stack[_STK].setString((*vec)[index].getString()); + break; + default: + break; + } break; } From b114126e2079e0427e8852eac3f79ca6fc5e739a Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 1 Oct 2025 19:53:30 +0100 Subject: [PATCH 08/33] everything working still uses the old array method for nested arrays (eg $MSGCB[%msgType,%i] until i can get proper nested vectors working --- .../source/console/torquescript/astNodes.cpp | 187 +++++++++++------- .../console/torquescript/compiledEval.cpp | 19 +- Templates/BaseGame/game/tools/main.tscript | 19 +- 3 files changed, 143 insertions(+), 82 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index ad7f420888..003ee093df 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -693,29 +693,44 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) bool isGlobal = varName[0] == '$'; bool isVector = arrayIndex; - if (isGlobal) - { - codeStream.emit(OP_SETCURVAR); - codeStream.emitSTE(varName); - } - if (isVector) { - if (isGlobal) + if (dynamic_cast(arrayIndex)) { - codeStream.emit(OP_LOADVAR_VECTOR); + type = TypeReqString; + codeStream.emit(OP_LOADIMMED_IDENT); + codeStream.emitSTE(varName); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY); + codeStream.emit(OP_POP_STK); } else { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(type); + + return codeStream.tell(); } + } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - codeStream.emit(type); - - return codeStream.tell(); + if (!isVector) + { + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); } if (isGlobal) @@ -969,27 +984,45 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) bool isGlobal = varName[0] == '$'; bool isVector = arrayIndex; - if (isGlobal && !isVector) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - } - if (isVector) { - if (isGlobal) + if (dynamic_cast(arrayIndex)) { - codeStream.emit(OP_LOADVAR_VECTOR); + codeStream.emit(OP_LOADIMMED_IDENT); + codeStream.emitSTE(varName); + + //codeStream.emit(OP_ADVANCE_STR); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); } else { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + return ip; } + } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); - return ip; + if (!isVector) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); } if (isGlobal) @@ -1118,60 +1151,78 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) return codeStream.tell(); } - if (isGlobal && !isVector) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - } - // Vector compound assignment branch if (isVector) { ip = expr->compile(codeStream, ip, subType); - // Load vector - if (isGlobal) - { - codeStream.emit(OP_LOADVAR_VECTOR); - } - else - { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); - } - - // Push index - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - - // Load element at index - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - codeStream.emit(subType); - - codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); - codeStream.emit(operand); - // Save element back - // Load vector - if (isGlobal) + if (dynamic_cast(arrayIndex)) { - codeStream.emit(OP_LOADVAR_VECTOR); + codeStream.emit(OP_LOADIMMED_IDENT); + codeStream.emitSTE(varName); + + //codeStream.emit(OP_ADVANCE_STR); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); } else { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + // Load vector + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } + + // Push index + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + + // Load element at index + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(subType); + + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + codeStream.emit(operand); + + // Save element back + // Load vector + if (isGlobal) + { + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); + + return codeStream.tell(); } - - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); - - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); - - return codeStream.tell(); } ip = expr->compile(codeStream, ip, subType); + if (!isVector) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + } + if (isGlobal) { codeStream.emit(OP_SETCURVAR_CREATE); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index df5a20b027..cdf5b2e47a 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1468,7 +1468,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (index >= vec->size()) { - vec->setSize(index + 1); + vec->push_back(exprVal); + break; } (*vec)[index] = exprVal; @@ -1498,6 +1499,12 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_LOADVAR_VECTOR: currentRegister = -1; stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); + if (!stack[_STK + 1].getVector()) + { + stack[_STK + 1].setVector(new Vector()); + stack[_STK + 1].getVector()->reserve(16); + Script::gEvalState.setVectorVariable(stack[_STK + 1].getVector()); + } _STK++; break; @@ -1518,9 +1525,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (index >= vec->size()) { - Con::warnf("Vector index %u out of range (size=%zu)", index, vec->size()); - stack[_STK].setEmptyString(); // fail safe - break; + vec->setSize(index + 1); } // Replace vector with the element at that index use the type. @@ -1609,6 +1614,12 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi curObject = NULL; stack[_STK + 1].setVector(Script::gEvalState.getLocalVectorVariable(reg)); + if (!stack[_STK + 1].getVector()) + { + stack[_STK + 1].setVector(new Vector()); + stack[_STK + 1].getVector()->reserve(16); + Script::gEvalState.setLocalVectorVariable(reg, stack[_STK + 1].getVector()); + } _STK++; break; diff --git a/Templates/BaseGame/game/tools/main.tscript b/Templates/BaseGame/game/tools/main.tscript index bddff7addd..7043f50f75 100644 --- a/Templates/BaseGame/game/tools/main.tscript +++ b/Templates/BaseGame/game/tools/main.tscript @@ -98,8 +98,8 @@ function onStart() $ignoredDatablockSet = new SimSet(); // fill the list of editors - $editors[count] = getWordCount( $Tools::loadFirst ); - for ( %i = 0; %i < $editors[count]; %i++ ) + $editorsCount = getWordCount( $Tools::loadFirst ); + for ( %i = 0; %i < $editorsCount; %i++ ) { $editors[%i] = getWord( $Tools::loadFirst, %i ); } @@ -123,8 +123,8 @@ function onStart() // Yes, this sucks and should be done better if ( strstr( $Tools::loadFirst, %editor ) == -1 ) { - $editors[$editors[count]] = %editor; - $editors[count]++; + $editors[$editorsCount] = %editor; + $editorsCount++; } } } @@ -151,9 +151,9 @@ function onStart() // Yes, this sucks and should be done better if ( strstr( $Tools::loadFirst, %editor ) == -1 ) { - $editors[$editors[count]] = %editor; - $editorsPath[$editors[count]] = %folder; - $editors[count]++; + $editors[$editorsCount] = %editor; + $editorsPath[$editorsCount] = %folder; + $editorsCount++; } } } @@ -162,7 +162,7 @@ function onStart() // initialize every editor new SimSet( EditorPluginSet ); - %count = $editors[count]; + %count = $editorsCount; for ( %i = 0; %i < %count; %i++ ) { %editorFilename = "./" @ $editors[%i] @ "/main." @ $TorqueScriptFileExtension; @@ -261,8 +261,7 @@ function onExit() // Save any Layouts we might be using //GuiFormManager::SaveLayout(LevelBuilder, Default, User); - - %count = $editors[count]; + %count = $editorsCount; for (%i = 0; %i < %count; %i++) { %destroyFunction = "destroy" @ $editors[%i]; From ff1d41ef3f943fb45cd90ebf9aee196011ac28fb Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Thu, 2 Oct 2025 08:39:00 +0100 Subject: [PATCH 09/33] nested vectors now we can have nested vectors but we cannot assign or change values on those yet --- Engine/source/console/console.cpp | 18 +- Engine/source/console/torquescript/CMDgram.y | 2 + Engine/source/console/torquescript/ast.h | 12 + .../source/console/torquescript/astAlloc.cpp | 11 + .../source/console/torquescript/astNodes.cpp | 21 +- .../source/console/torquescript/cmdgram.cpp | 1936 +++++++++-------- .../console/torquescript/compiledEval.cpp | 21 +- 7 files changed, 1038 insertions(+), 983 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 1d24778b8f..d7f1a4f615 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -71,24 +71,26 @@ char* ConsoleValue::convertToBuffer() const char* ConsoleValue::convertVectorToBuffer() const { - static char buffer[4096]; // ⚠️ reuse buffer, or use FrameAllocator - buffer[0] = 0; - if (!getVector()) return (char*)""; Vector* vec = getVector(); - // concatenate elements, space-separated + // use FrameAllocator to avoid static overwrite + FrameTemp outBuf(4096); + outBuf[0] = 0; + for (U32 v = 0; v < vec->size(); v++) { - const char* elemStr = (*vec)[v].getString(); // convert element + const char* elemStr = (*vec)[v].getString(); + if (v > 0) - dStrcat(buffer, " ", sizeof(buffer)); - dStrcat(buffer, elemStr, sizeof(buffer)); + dStrcat(outBuf, " ", 4096); + + dStrcat(outBuf, elemStr, 4096); } - return buffer; + return outBuf; } const char* ConsoleValue::getConsoleData() const diff --git a/Engine/source/console/torquescript/CMDgram.y b/Engine/source/console/torquescript/CMDgram.y index fed644d766..d760307ba4 100644 --- a/Engine/source/console/torquescript/CMDgram.y +++ b/Engine/source/console/torquescript/CMDgram.y @@ -461,6 +461,8 @@ expr { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, NULL); } | VAR '[' aidx_expr ']' { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); } + | expr '[' expr ']' + { $$ = VectorIndexNode::alloc($1->dbgLineNumber, $1, $3); } | '[' expr_list_decl ']' { Vector elems; diff --git a/Engine/source/console/torquescript/ast.h b/Engine/source/console/torquescript/ast.h index be42330a0c..8acbf251dd 100644 --- a/Engine/source/console/torquescript/ast.h +++ b/Engine/source/console/torquescript/ast.h @@ -146,6 +146,18 @@ struct VectorExprNode : ExprNode DBG_STMT_TYPE(VectorExprNode); }; +struct VectorIndexNode : ExprNode +{ + ExprNode* base; + ExprNode* index; + + static VectorIndexNode* alloc(S32 lineNumber, ExprNode* b, ExprNode* i); + + U32 compile(CodeStream& codeStream, U32 ip, TypeReq type) override; + TypeReq getPreferredType() override { return TypeReqNone; } + DBG_STMT_TYPE(VectorIndexNode); +}; + struct ReturnStmtNode : StmtNode { ExprNode* expr; diff --git a/Engine/source/console/torquescript/astAlloc.cpp b/Engine/source/console/torquescript/astAlloc.cpp index c775ab751c..72416e0dba 100644 --- a/Engine/source/console/torquescript/astAlloc.cpp +++ b/Engine/source/console/torquescript/astAlloc.cpp @@ -47,6 +47,17 @@ VectorExprNode* VectorExprNode::alloc(S32 lineNumber, const Vector& e return ret; } +VectorIndexNode* VectorIndexNode::alloc(S32 lineNumber, ExprNode* b, ExprNode* i) +{ + VectorIndexNode* ret = (VectorIndexNode*)consoleAlloc(sizeof(VectorIndexNode)); + constructInPlace(ret); + ret->dbgLineNumber = lineNumber; + ret->optimizedNode = NULL; + ret->base = b; + ret->index = i; + return ret; +} + BreakStmtNode* BreakStmtNode::alloc(S32 lineNumber) { BreakStmtNode* ret = (BreakStmtNode*)consoleAlloc(sizeof(BreakStmtNode)); diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 003ee093df..1b31d6c96f 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -371,7 +371,7 @@ U32 IterStmtNode::compileStmt(CodeStream& codeStream, U32 ip) } //------------------------------------------------------------ -// + U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { // Emit instruction to create vector @@ -395,7 +395,24 @@ U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) return ip; } -// + +//------------------------------------------------------------ + +U32 VectorIndexNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) +{ + // Compile base expression as vector + ip = base->compile(codeStream, ip, TypeReqVector); + + // Compile index + ip = index->compile(codeStream, ip, TypeReqUInt); + + // Emit load member + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(type); + + return ip; +} + //------------------------------------------------------------ U32 ConditionalExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) diff --git a/Engine/source/console/torquescript/cmdgram.cpp b/Engine/source/console/torquescript/cmdgram.cpp index 762f389ab6..2db5ac3bbb 100644 --- a/Engine/source/console/torquescript/cmdgram.cpp +++ b/Engine/source/console/torquescript/cmdgram.cpp @@ -629,16 +629,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2978 +#define YYLAST 3058 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 100 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 41 /* YYNRULES -- Number of rules. */ -#define YYNRULES 163 +#define YYNRULES 164 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 384 +#define YYNSTATES 387 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 329 @@ -705,12 +705,12 @@ static const yytype_int16 yyrline[] = 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, - 454, 456, 458, 460, 462, 464, 495, 497, 502, 504, - 509, 511, 516, 518, 520, 522, 524, 526, 528, 530, - 532, 534, 536, 538, 543, 545, 547, 549, 551, 553, - 555, 557, 559, 561, 566, 568, 570, 580, 582, 588, - 589, 594, 596, 602, 603, 608, 610, 615, 617, 619, - 621, 623, 628, 630 + 454, 456, 458, 460, 462, 464, 466, 497, 499, 504, + 506, 511, 513, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 545, 547, 549, 551, 553, + 555, 557, 559, 561, 563, 568, 570, 572, 582, 584, + 590, 591, 596, 598, 604, 605, 610, 612, 617, 619, + 621, 623, 625, 630, 632 }; #endif @@ -757,12 +757,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-303) +#define YYPACT_NINF (-286) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-152) +#define YYTABLE_NINF (-153) #define yytable_value_is_error(Yyn) \ 0 @@ -771,45 +771,45 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - -303, 27, 401, -303, -5, -24, -24, -19, -16, -8, - 309, -4, 507, -3, 28, 30, -24, 31, 34, 7, - 35, -303, 41, 311, -27, -303, -303, -303, -303, 1063, - 1063, 1063, 1063, 1063, 1063, -303, -303, -303, -303, -303, - -303, -303, -303, -303, -303, -303, 29, 2627, 2851, -303, - 36, -303, -303, -25, -303, 1063, 37, 39, -303, -303, - 1063, -303, -303, -303, 1223, -303, 1063, -303, -303, 88, - 727, 66, 68, 51, 1063, 1063, 47, 1063, 1063, 1063, - -303, -303, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, - 1063, 1063, 1063, -303, 1063, 71, 33, 33, 1277, 33, - 33, 2627, 32, 62, -303, 1063, 1063, 1063, 1063, 1063, - 1063, 103, 1063, 1063, 1063, 1063, 1063, -24, -24, 1063, - 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, - 769, -303, 119, 133, 1331, 1087, 1063, 1385, -303, 1439, - 568, 117, 811, 1493, 152, 153, 1063, 1547, 1601, 174, - 1115, 1169, 2627, 2627, 2627, 2627, 2627, 2627, 2627, 2627, - 2627, 2627, 2627, 2627, -46, 122, 132, -303, -303, 1063, - 180, 180, 33, 33, -10, -10, -42, 2739, 2797, 33, - 2768, 2906, -303, -303, 733, 733, 2826, 2826, -10, -10, - 2710, 2681, 2906, 1655, 2906, 1063, 2627, -303, 130, 134, - 135, -303, 1063, 136, 2627, 136, 507, 507, -303, -303, - 1063, 853, 1709, 895, 1063, 1063, 1763, 137, 138, 12, - -303, -303, 151, 1063, -303, 1063, 2867, -303, 1063, 2627, - 1063, 1063, 1063, -15, 139, 156, 119, 96, 1817, 158, - 143, 143, 193, -303, 1871, 507, 1925, 937, 979, 1979, - 2033, 2087, 146, 177, 177, 147, -303, 155, 2141, 2627, - 1063, -303, 164, 169, -41, 170, -303, -303, -303, 172, - 136, -303, 1063, 173, 182, 507, -303, -303, 507, 507, - 2195, 507, 2249, 1021, 507, 507, 148, 1063, 178, 183, - -303, -303, -303, 2627, -303, -303, -303, 613, 149, 143, - 62, 185, 190, -303, -303, -303, 507, -303, 507, 507, - 2303, -303, -303, 58, -9, 2627, -303, -303, -303, -303, - 206, 131, 131, -303, -303, -303, 507, 214, -33, 227, - 210, 58, -303, 1063, -303, 658, 212, 219, 220, 20, - 131, 223, -303, 1063, 1063, 1063, -29, 221, -303, 2627, - 462, -303, 131, -303, -303, 228, 20, -303, 2357, 2411, - -34, 1063, 1063, -303, 230, -303, 229, -303, -303, -303, - 239, 2465, -18, -303, -303, 1063, -303, 241, 703, 2519, - 1063, -303, 2573, -303 + -286, 27, 404, -286, -5, -29, -29, 2, 31, 39, + 46, 42, 510, 44, 47, 48, -29, 51, 52, 57, + 56, -286, 36, -38, -44, -286, -286, -286, -286, 1066, + 1066, 1066, 1066, 1066, 1066, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, 60, 2686, 266, -286, + 72, -286, -286, -27, -286, 1066, 81, 82, -286, -286, + 1066, -286, -286, -286, 1282, -286, 1066, -286, -286, 128, + 730, 112, 134, 118, 1066, 1066, 116, 1066, 1066, 1066, + -286, -286, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, -286, 1066, 145, 182, 182, 1336, 182, + 182, 2686, 87, 137, -286, 1066, 1066, 1066, 1066, 1066, + 1066, 158, 1066, 1066, 1066, 1066, 1066, -29, -29, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 772, -286, 166, 174, 1390, 1090, 1066, 1444, -286, + 1498, 571, 159, 814, 1552, 190, 198, 1066, 1606, 1660, + 219, 1174, 1228, 2740, 2740, 2740, 2740, 2740, 2740, 2740, + 2740, 2740, 2740, 2740, 2686, -43, 168, 170, -286, -286, + 1066, 193, 193, 182, 182, 2939, 2939, -37, 2852, 2881, + 182, 144, 2986, -286, -286, 133, 133, 2910, 2910, 2939, + 2939, 2823, 2794, 2986, 1118, 1714, 2986, 1066, 2740, -286, + 171, 169, 188, -286, 1066, 187, 2686, 187, 510, 510, + -286, -286, 1066, 856, 1768, 898, 1066, 1066, 1822, 192, + 196, 13, -286, -286, 217, 1066, -286, 1066, 2944, -286, + 1066, 2686, 1066, 1066, -286, 1066, -32, 201, 225, 166, + 165, 1876, 228, 210, 210, 261, -286, 1930, 510, 1984, + 940, 982, 2038, 2092, 2146, 216, 248, 248, 218, -286, + 222, 2200, 2686, 1066, -286, 227, 236, -42, 311, -286, + -286, -286, 238, 187, -286, 1066, 239, 244, 510, -286, + -286, 510, 510, 2254, 510, 2308, 1024, 510, 510, 215, + 1066, 220, 223, -286, -286, -286, 2740, -286, -286, -286, + 616, 242, 210, 137, 243, 245, -286, -286, -286, 510, + -286, 510, 510, 2362, -286, -286, 117, 22, 2686, -286, + -286, -286, -286, 250, 199, 199, -286, -286, -286, 510, + 254, -33, 270, 251, 117, -286, 1066, -286, 661, 255, + 252, 253, 40, 199, 256, -286, 1066, 1066, 1066, -30, + 260, -286, 2686, 465, -286, 199, -286, -286, 263, 40, + -286, 2416, 2470, -36, 1066, 1066, -286, 265, -286, 264, + -286, -286, -286, 276, 2524, -34, -286, -286, 1066, -286, + 279, 706, 2578, 1066, -286, 2632, -286 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -820,62 +820,62 @@ static const yytype_uint8 yydefact[] = 3, 0, 2, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 88, 113, 111, 26, 112, 105, 106, 0, - 0, 0, 0, 0, 149, 4, 7, 5, 6, 17, - 136, 18, 13, 14, 15, 16, 0, 0, 109, 110, - 76, 134, 135, 0, 120, 0, 0, 0, 19, 20, + 0, 0, 0, 0, 150, 4, 7, 5, 6, 17, + 137, 18, 13, 14, 15, 16, 0, 0, 109, 110, + 76, 135, 136, 0, 121, 0, 0, 0, 19, 20, 0, 108, 88, 21, 0, 76, 0, 11, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 123, 122, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 139, 149, 0, 86, 87, 0, 104, - 103, 151, 0, 150, 23, 0, 0, 0, 0, 0, + 124, 123, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 140, 150, 0, 86, 87, 0, 104, + 103, 152, 0, 151, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 141, 29, 0, 0, 42, 42, 0, 22, 0, + 0, 0, 142, 29, 0, 0, 42, 42, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 137, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 162, 0, 0, 0, 77, 115, 0, - 82, 83, 84, 85, 90, 91, 116, 81, 80, 79, - 78, 102, 118, 119, 97, 98, 94, 95, 92, 93, - 99, 96, 100, 0, 101, 0, 142, 31, 0, 30, - 0, 121, 42, 40, 43, 40, 0, 0, 52, 12, - 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, - 9, 147, 0, 0, 24, 0, 114, 144, 149, 152, - 149, 0, 0, 0, 0, 0, 29, 0, 43, 0, - 44, 44, 61, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 163, - 0, 140, 0, 0, 0, 89, 143, 11, 32, 0, - 40, 41, 0, 0, 0, 0, 64, 72, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 148, 25, 138, 145, 146, 117, 0, 0, 44, - 45, 35, 39, 62, 71, 70, 0, 68, 0, 0, - 0, 73, 74, 153, 0, 59, 54, 55, 27, 11, - 0, 46, 46, 69, 67, 66, 0, 0, 0, 0, - 0, 154, 155, 0, 11, 0, 37, 0, 0, 48, - 47, 0, 65, 0, 0, 0, 0, 0, 156, 60, - 56, 28, 46, 50, 34, 0, 49, 38, 0, 0, - 0, 0, 0, 33, 0, 58, 0, 51, 159, 157, - 0, 0, 0, 11, 36, 0, 158, 0, 57, 0, - 0, 160, 0, 161 + 0, 0, 0, 138, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 163, 0, 0, 0, 77, 116, + 0, 82, 83, 84, 85, 90, 91, 117, 81, 80, + 79, 78, 102, 119, 120, 97, 98, 94, 95, 92, + 93, 99, 96, 100, 0, 0, 101, 0, 143, 31, + 0, 30, 0, 122, 42, 40, 43, 40, 0, 0, + 52, 12, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 9, 148, 0, 0, 24, 0, 114, 145, + 150, 153, 150, 0, 115, 0, 0, 0, 0, 29, + 0, 43, 0, 44, 44, 61, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 164, 0, 141, 0, 0, 0, 89, 144, + 11, 32, 0, 40, 41, 0, 0, 0, 0, 64, + 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 149, 25, 139, 146, 147, 118, + 0, 0, 44, 45, 35, 39, 62, 71, 70, 0, + 68, 0, 0, 0, 73, 74, 154, 0, 59, 54, + 55, 27, 11, 0, 46, 46, 69, 67, 66, 0, + 0, 0, 0, 0, 155, 156, 0, 11, 0, 37, + 0, 0, 48, 47, 0, 65, 0, 0, 0, 0, + 0, 157, 60, 56, 28, 46, 50, 34, 0, 49, + 38, 0, 0, 0, 0, 0, 33, 0, 58, 0, + 51, 160, 158, 0, 0, 0, 11, 36, 0, 159, + 0, 57, 0, 0, 161, 0, 162 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -303, -303, -303, -303, -303, -303, -259, -1, -142, 61, - -303, -303, -47, -196, -124, -223, -298, -40, -96, -303, - -249, -303, -303, -303, -303, -303, -303, 38, -303, -303, - 16, -45, -2, -303, -303, -88, -193, -303, -14, -302, - -227 + -286, -286, -286, -286, -286, -286, -262, -1, -145, 91, + -286, -286, -123, -194, -131, -225, -259, -12, 9, -286, + -253, -286, -286, -286, -286, -286, -286, 38, -286, -286, + 16, -46, -2, -286, -286, -60, -190, -286, 17, -285, + -230 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 1, 2, 35, 36, 219, 140, 68, 38, 198, - 199, 39, 40, 240, 203, 273, 338, 339, 69, 41, - 288, 314, 42, 43, 44, 45, 46, 47, 48, 49, - 56, 93, 65, 51, 52, 102, 103, 330, 340, 332, - 164 + 0, 1, 2, 35, 36, 221, 141, 68, 38, 200, + 201, 39, 40, 243, 205, 276, 341, 342, 69, 41, + 291, 317, 42, 43, 44, 45, 46, 47, 48, 49, + 56, 93, 65, 51, 52, 102, 103, 333, 343, 335, + 165 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -883,604 +883,620 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 50, 37, 233, 131, 264, 289, 165, 220, 297, 241, - 50, 225, 205, 230, 54, 4, 225, 344, 274, 333, - 252, 361, 57, 225, 341, 5, 6, 3, 94, 348, - 132, 55, 73, 53, 105, 106, 107, 108, 348, 225, - 58, 111, 169, 59, 114, 76, 266, 60, 64, 334, - 231, 66, 70, 226, 366, 116, 117, 118, 296, 345, - 335, 119, 120, 362, 95, 370, 133, 96, 97, 98, - 99, 100, 101, 255, 299, 350, 320, 256, 237, 300, - 127, 377, 327, 71, 111, 72, 74, 129, 104, 75, - 77, 78, 135, 134, 136, -75, 328, 329, 137, 117, - 118, 365, 141, 144, 139, 145, 146, 149, 143, 166, - 242, 243, 147, 148, 378, 150, 151, 152, 360, 169, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 168, 101, 182, 183, 372, 5, 6, 50, 209, - 262, 176, 263, 170, 171, 172, 173, 174, 175, 277, - 177, 178, 179, 180, 181, 327, 197, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 196, 328, - 329, 200, 210, 204, 204, 214, 215, 4, 227, 303, - 212, 261, 304, 305, 216, 307, 234, 228, 311, 312, - 236, 235, 257, 268, 239, 270, 271, 253, 254, 267, - 272, 275, 286, 287, 50, 50, 290, 229, 313, 319, - 323, 291, 324, 325, 105, 106, 107, 108, 109, 110, - 294, 111, 112, 113, 114, 295, 107, 108, 298, 301, - 342, 111, 115, 101, 114, 116, 117, 118, 302, 316, - 238, 119, 120, 50, 317, 321, 117, 118, 244, 246, - 322, 249, 250, 251, 121, 122, 123, 124, 125, 126, - 127, 258, 336, 259, 343, 346, 101, 129, 101, 163, - 265, 347, 352, 50, 337, 337, 50, 50, 353, 50, - 363, 354, 50, 50, 357, 280, 282, 367, 373, 375, - 374, 380, 355, 337, 0, 50, 209, 269, 293, 331, - 356, 0, 0, 0, 50, 337, 50, 50, 0, 355, - 101, 0, 0, 0, 5, 6, 61, 0, 0, 0, - 0, 310, 0, 0, 50, 315, 0, 0, 0, 0, - 0, 0, 0, 50, 209, 0, 0, 0, 0, 0, - 0, 20, 0, 0, 21, 62, 23, 24, 50, 209, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 0, - 0, 79, 0, 0, 31, 0, 0, 0, 63, 0, - 0, 349, 32, 33, 0, 0, 50, 209, 0, 80, - 81, 358, 359, 163, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 0, 0, 0, 0, 0, 371, - 163, 34, 0, 92, 4, 0, 5, 6, 7, 0, - 8, 0, 9, 379, 10, 11, 12, 0, 382, 0, + 50, 37, 132, 267, 292, 222, 207, 236, 300, 54, + 50, 94, 79, 244, 227, 227, 4, 347, 232, 277, + 364, 227, 57, 227, 255, 170, 55, 3, 133, 269, + 80, 81, 73, 53, 166, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 5, 6, 95, 64, 351, + 336, 5, 6, 61, 92, 233, 228, 299, 351, 348, + 338, 58, 365, 373, 134, 380, 344, 96, 97, 98, + 99, 100, 101, 240, 258, 353, 259, 323, 20, 302, + 337, 21, 62, 23, 24, 303, 78, 26, 27, 28, + 59, 29, 30, 135, 60, 76, 369, 66, 138, 70, + 368, 31, 71, 72, 140, 63, 74, 75, 144, 32, + 33, 77, 148, 149, 381, 151, 152, 153, 363, 104, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, -75, 101, 183, 184, 375, 136, 137, 34, 50, + 211, 330, 142, 171, 172, 173, 174, 175, 176, 145, + 178, 179, 180, 181, 182, 331, 332, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, + 265, 146, 266, 147, 206, 206, 150, 105, 106, 107, + 108, 214, 264, 167, 111, 218, 169, 114, 105, 106, + 107, 108, 109, 110, 170, 111, 177, 113, 114, 117, + 118, 340, 340, 199, 5, 6, 50, 50, 231, 116, + 117, 118, 202, 216, 212, 119, 120, 245, 246, 358, + 340, 217, 4, 330, 229, 230, 238, 237, 121, 122, + 123, 124, 340, 111, 127, 101, 358, 331, 332, 107, + 108, 130, 241, 239, 111, 242, 50, 114, 117, 118, + 247, 249, 256, 252, 253, 254, 257, 280, 260, 117, + 118, 270, 271, 261, 273, 262, 274, 275, 101, 278, + 101, 164, 289, 268, 290, 316, 50, 293, 294, 50, + 50, 319, 50, 297, 320, 50, 50, 306, 283, 285, + 307, 308, 298, 310, 301, 304, 314, 315, 50, 211, + 305, 296, 322, 324, 346, 325, 339, 50, 349, 50, + 50, 356, 350, 101, 357, 355, 131, 360, 326, 366, + 327, 328, 370, 376, 313, 377, 378, 50, 318, 383, + 272, 359, 0, 334, 80, 81, 50, 211, 345, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 0, + 0, 50, 211, 0, 0, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, + 0, 0, 0, 115, 352, 0, 116, 117, 118, 50, + 211, 0, 119, 120, 361, 362, 164, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 374, 164, 0, 0, 0, 4, 130, 5, + 6, 7, 0, 8, 0, 9, 382, 10, 11, 12, + 0, 385, 0, 0, 13, 14, 15, 0, 16, 17, + 0, 18, 0, 19, 0, 0, 20, 0, 0, 21, + 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, + 30, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, + 5, 6, 7, 0, 8, 0, 9, 0, 10, 11, + 12, 0, 0, 0, 367, 13, 14, 15, 0, 16, + 17, 290, 18, 0, 0, 0, 34, 20, 0, 0, + 21, 22, 23, 24, 0, 25, 26, 27, 28, 0, + 29, 30, 0, 0, 0, 5, 6, 7, 0, 8, + 31, 9, 0, 10, 11, 12, 0, 0, 32, 33, + 13, 14, 15, 0, 16, 17, 0, 18, 0, 0, + 0, 0, 20, 0, 0, 21, 22, 23, 24, 0, + 25, 26, 27, 28, 0, 29, 30, 34, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 67, 0, 0, 32, 33, 0, 5, 6, 7, 0, + 8, 0, 9, 0, 10, 11, 12, 0, 0, 0, 0, 13, 14, 15, 0, 16, 17, 0, 18, 0, - 19, 0, 0, 20, 0, 0, 21, 22, 23, 24, + 0, 0, 34, 20, 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, 30, 0, 0, - 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, - 0, 0, 0, 0, 32, 33, 0, 5, 6, 7, - 0, 8, 0, 9, 0, 10, 11, 12, 0, 0, - 0, 364, 13, 14, 15, 0, 16, 17, 287, 18, - 0, 0, 0, 34, 20, 0, 0, 21, 22, 23, - 24, 0, 25, 26, 27, 28, 0, 29, 30, 0, - 0, 0, 5, 6, 7, 0, 8, 31, 9, 0, - 10, 11, 12, 0, 0, 32, 33, 13, 14, 15, - 0, 16, 17, 0, 18, 0, 0, 0, 0, 20, - 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, - 28, 0, 29, 30, 34, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 67, 0, 0, - 32, 33, 0, 5, 6, 7, 0, 8, 0, 9, - 0, 10, 11, 12, 0, 0, 0, 0, 13, 14, - 15, 0, 16, 17, 0, 18, 0, 0, 0, 34, - 20, 0, 0, 21, 22, 23, 24, 0, 25, 26, - 27, 28, 0, 29, 30, 0, 0, 0, 5, 6, - 7, 0, 8, 31, 9, 0, 10, 11, 12, 208, - 0, 32, 33, 13, 14, 15, 0, 16, 17, 0, - 18, 0, 0, 0, 0, 20, 0, 0, 21, 22, - 23, 24, 0, 25, 26, 27, 28, 0, 29, 30, - 34, 0, 0, 5, 6, 7, 0, 8, 31, 9, - 0, 10, 11, 12, 318, 0, 32, 33, 13, 14, - 15, 0, 16, 17, 0, 18, 0, 0, 0, 0, - 20, 0, 0, 21, 22, 23, 24, 0, 25, 26, - 27, 28, 0, 29, 30, 34, 0, 0, 5, 6, - 7, 0, 8, 31, 9, 0, 10, 11, 12, 351, - 0, 32, 33, 13, 14, 15, 0, 16, 17, 0, - 18, 0, 5, 6, 61, 20, 0, 0, 21, 22, - 23, 24, 0, 25, 26, 27, 28, 0, 29, 30, - 34, 0, 0, 0, 0, 0, 0, 0, 31, 20, - 0, 0, 21, 62, 23, 24, 32, 33, 26, 27, - 28, 0, 29, 30, 5, 6, 61, 105, 106, 107, - 108, 0, 31, 0, 111, 0, 142, 114, 0, 0, - 32, 33, 0, 0, 0, 34, 0, 0, 0, 117, - 118, 20, 0, 0, 21, 62, 23, 24, 0, 0, - 26, 27, 28, 0, 29, 30, 5, 6, 61, 34, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 195, - 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 20, 0, 0, 21, 62, 23, 24, - 0, 0, 26, 27, 28, 0, 29, 30, 5, 6, - 61, 34, 0, 0, 0, 0, 31, 0, 0, 0, - 211, 0, 0, 0, 32, 33, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, 21, 62, - 23, 24, 0, 0, 26, 27, 28, 0, 29, 30, - 5, 6, 61, 34, 0, 0, 0, 0, 31, 245, - 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, - 21, 62, 23, 24, 0, 0, 26, 27, 28, 0, - 29, 30, 5, 6, 61, 34, 0, 0, 0, 0, - 31, 0, 0, 0, 248, 0, 0, 0, 32, 33, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 0, 21, 62, 23, 24, 0, 0, 26, 27, - 28, 0, 29, 30, 5, 6, 61, 34, 0, 0, - 0, 0, 31, 279, 0, 0, 0, 0, 0, 0, - 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 20, 0, 0, 21, 62, 23, 24, 0, 0, - 26, 27, 28, 0, 29, 30, 5, 6, 61, 34, - 0, 0, 0, 0, 31, 281, 0, 0, 0, 0, - 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 20, 0, 0, 21, 62, 23, 24, - 0, 0, 26, 27, 28, 0, 29, 30, 5, 6, - 61, 34, 0, 0, 0, 0, 31, 309, 0, 0, - 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, - 0, 0, 5, 6, 61, 20, 0, 0, 21, 62, - 23, 24, 0, 0, 26, 27, 28, 0, 29, 30, - 0, 0, 0, 34, 0, 0, 0, 0, 31, 20, - 0, 0, 21, 62, 23, 24, 32, 33, 26, 27, - 28, 0, 29, 30, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 32, 33, 0, 0, 0, 34, 0, 0, 0, 105, - 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, - 0, 221, 222, 0, 0, 0, 0, 115, 0, 202, - 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, - 111, 112, 113, 114, 0, 0, 223, 0, 224, 0, - 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, - 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, - 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, - 0, 0, 138, 0, 0, 115, 0, 0, 116, 117, - 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, - 113, 114, 0, 167, 0, 0, 0, 0, 0, 115, - 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, + 0, 5, 6, 7, 0, 8, 31, 9, 0, 10, + 11, 12, 210, 0, 32, 33, 13, 14, 15, 0, + 16, 17, 0, 18, 0, 0, 0, 0, 20, 0, + 0, 21, 22, 23, 24, 0, 25, 26, 27, 28, + 0, 29, 30, 34, 0, 0, 5, 6, 7, 0, + 8, 31, 9, 0, 10, 11, 12, 321, 0, 32, + 33, 13, 14, 15, 0, 16, 17, 0, 18, 0, + 0, 0, 0, 20, 0, 0, 21, 22, 23, 24, + 0, 25, 26, 27, 28, 0, 29, 30, 34, 0, + 0, 5, 6, 7, 0, 8, 31, 9, 0, 10, + 11, 12, 354, 0, 32, 33, 13, 14, 15, 0, + 16, 17, 0, 18, 0, 5, 6, 61, 20, 0, + 0, 21, 22, 23, 24, 0, 25, 26, 27, 28, + 0, 29, 30, 34, 0, 0, 0, 0, 0, 0, + 0, 31, 20, 0, 0, 21, 62, 23, 24, 32, + 33, 26, 27, 28, 0, 29, 30, 5, 6, 61, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 143, + 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 20, 0, 0, 21, 62, 23, + 24, 0, 0, 26, 27, 28, 0, 29, 30, 5, + 6, 61, 34, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 197, 0, 0, 32, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, + 62, 23, 24, 0, 0, 26, 27, 28, 0, 29, + 30, 5, 6, 61, 34, 0, 0, 0, 0, 31, + 0, 0, 0, 213, 0, 0, 0, 32, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 21, 62, 23, 24, 0, 0, 26, 27, 28, + 0, 29, 30, 5, 6, 61, 34, 0, 0, 0, + 0, 31, 248, 0, 0, 0, 0, 0, 0, 32, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 0, 21, 62, 23, 24, 0, 0, 26, + 27, 28, 0, 29, 30, 5, 6, 61, 34, 0, + 0, 0, 0, 31, 0, 0, 0, 251, 0, 0, + 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 21, 62, 23, 24, 0, + 0, 26, 27, 28, 0, 29, 30, 5, 6, 61, + 34, 0, 0, 0, 0, 31, 282, 0, 0, 0, + 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 21, 62, 23, + 24, 0, 0, 26, 27, 28, 0, 29, 30, 5, + 6, 61, 34, 0, 0, 0, 0, 31, 284, 0, + 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, + 62, 23, 24, 0, 0, 26, 27, 28, 0, 29, + 30, 5, 6, 61, 34, 0, 0, 0, 0, 31, + 312, 0, 0, 0, 0, 0, 0, 32, 33, 0, + 0, 0, 0, 0, 0, 5, 6, 61, 20, 0, + 0, 21, 62, 23, 24, 0, 0, 26, 27, 28, + 0, 29, 30, 0, 0, 0, 34, 0, 0, 0, + 0, 31, 20, 0, 0, 21, 62, 23, 24, 32, + 33, 26, 27, 28, 0, 29, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 0, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 0, 0, 0, + 115, 0, 204, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 0, 234, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 223, 224, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 225, 0, 226, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 0, 139, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 168, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, - 110, 0, 111, 112, 113, 114, 0, 201, 0, 0, - 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, - 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, - 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, - 0, 206, 0, 0, 0, 0, 0, 115, 0, 0, - 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, - 111, 112, 113, 114, 0, 207, 0, 0, 0, 0, - 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, - 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, - 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, - 0, 0, 213, 0, 0, 115, 0, 0, 116, 117, - 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, - 113, 114, 0, 217, 0, 0, 0, 0, 0, 115, - 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 203, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 208, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 209, 0, 0, 0, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 0, 215, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 219, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, - 110, 0, 111, 112, 113, 114, 0, 218, 0, 0, - 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, - 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, - 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, - 0, 0, 0, 232, 0, 0, 0, 115, 0, 0, - 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, - 111, 112, 113, 114, 0, 0, 0, 0, 247, 0, - 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, - 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, - 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, - 0, 239, 0, 0, 0, 115, 0, 0, 116, 117, - 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, - 113, 114, 0, 0, -151, 0, 0, 0, 0, 115, - 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 220, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 0, 0, 235, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 250, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 242, 0, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 0, -152, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, - 110, 0, 111, 112, 113, 114, 0, 276, 0, 0, - 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, - 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, - 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, - 0, 278, 0, 0, 0, 0, 0, 115, 0, 0, - 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, - 111, 112, 113, 114, 0, 0, 0, 0, 283, 0, - 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, - 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, - 108, 109, 110, 0, 111, 112, 113, 114, 0, 284, - 0, 0, 0, 0, 0, 115, 0, 0, 116, 117, - 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, - 113, 114, 0, 285, 0, 0, 0, 0, 0, 115, - 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 279, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 281, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 286, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 287, 0, + 0, 0, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 288, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, - 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, - 292, 0, 0, 115, 0, 0, 116, 117, 118, 0, - 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, - 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, - 0, 306, 0, 0, 0, 0, 0, 115, 0, 0, - 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, - 111, 112, 113, 114, 0, 308, 0, 0, 0, 0, - 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, - 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, - 108, 109, 110, 0, 111, 112, 113, 114, 0, 326, - 0, 0, 0, 0, 0, 115, 0, 0, 116, 117, - 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, - 113, 114, 0, 0, 0, 0, 368, 0, 0, 115, - 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 0, 0, 0, 295, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 309, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 311, 0, 0, 0, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 329, 0, + 0, 0, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 0, 0, 0, 371, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, - 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, - 369, 0, 0, 115, 0, 0, 116, 117, 118, 0, - 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, - 126, 127, 0, 0, 0, 0, 0, 128, 129, 105, - 106, 107, 108, 109, 110, 0, 111, 112, 113, 114, - 0, 0, 0, 0, 376, 0, 0, 115, 0, 0, - 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, - 122, 123, 124, 125, 126, 127, 0, 0, 0, 0, - 0, 128, 129, 105, 106, 107, 108, 109, 110, 0, - 111, 112, 113, 114, 0, 0, 0, 0, 381, 0, - 0, 115, 0, 0, 116, 117, 118, 0, 0, 0, - 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 121, 122, 123, 124, 125, 126, 127, - 0, 0, 0, 0, 0, 128, 129, 105, 106, 107, - 108, 109, 110, 0, 111, 112, 113, 114, 0, 0, - 0, 0, 383, 0, 0, 115, 0, 0, 116, 117, - 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 121, 122, 123, - 124, 125, 126, 127, 0, 0, 0, 0, 0, 128, - 129, 105, 106, 107, 108, 109, 110, 0, 111, 112, - 113, 114, 0, 0, 0, 0, 0, 0, 0, 115, - 0, 0, 116, 117, 118, 0, 0, 0, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 0, 0, 0, 372, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 0, 0, 0, 379, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 384, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 0, 386, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 0, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 121, 122, 123, 124, 125, 126, 127, 0, 0, - 0, 0, 0, 128, 129, 105, 106, 107, 108, 109, - 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, - 0, 0, 0, 115, 0, 0, 116, 117, 118, 0, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 0, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 0, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 121, 122, + 123, 124, 125, 0, 127, 115, 0, 0, 116, 117, + 118, 130, 0, 0, 119, 120, 105, 106, 107, 108, + 109, 110, 0, 111, 0, 113, 114, 121, 122, 123, + 124, 0, 0, 127, 115, 0, 0, 116, 117, 118, + 130, 0, 0, 119, 120, 105, 106, 107, 108, 109, + 110, 0, 111, 0, 0, 114, 121, 122, 123, 124, + 0, 0, 127, 0, 0, 0, 116, 117, 118, 130, 0, 0, 119, 120, 105, 106, 107, 108, 109, 110, - 0, 111, 112, 113, 114, 121, 122, 123, 124, 125, - 0, 127, 115, 0, 0, 116, 117, 118, 129, 0, - 0, 119, 120, 105, 106, 107, 108, 109, 110, 0, - 111, 0, 113, 114, 121, 122, 123, 124, 0, 0, - 127, 115, 0, 0, 116, 117, 118, 129, 0, 0, - 119, 120, 105, 106, 107, 108, 109, 110, 0, 111, - 0, 113, 114, 121, 122, 123, 124, 0, 0, 127, - 0, 0, 0, 116, 117, 118, 129, 0, 0, 119, - 120, 105, 106, 107, 108, 109, 110, 0, 111, 0, - 0, 114, 121, 122, 123, 124, 0, 0, 127, 0, - 0, 0, 116, 117, 118, 129, 0, 0, 119, 120, - 105, 106, 107, 108, 109, 110, 0, 111, 0, 0, - 114, 121, 122, 123, 124, 0, 0, 127, 0, 0, - 0, 116, 117, 118, 129, 0, 0, 119, 120, 0, - 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 123, 124, 0, 0, 127, 260, 0, 80, - 81, 0, 0, 129, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 0, 80, 81, 0, 0, 0, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 105, 106, 107, 108, 0, 0, 0, 111, 0, 0, + 0, 111, 0, 0, 114, 121, 122, 123, 124, 0, + 0, 127, 0, 0, 0, 116, 117, 118, 130, 0, + 0, 119, 120, 105, 106, 107, 108, 0, 0, 0, + 111, 0, 0, 114, 263, 0, 123, 124, 0, 0, + 127, 0, 0, 0, 116, 117, 118, 130, 0, 0, + 119, 120, 80, 81, 0, 0, 0, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 0, 0, 127, + 105, 106, 107, 108, 0, 0, 130, 111, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 0, 0, 0, 119, 120 }; static const yytype_int16 yycheck[] = { - 2, 2, 195, 48, 231, 254, 94, 149, 267, 205, - 12, 57, 136, 55, 38, 3, 57, 50, 241, 28, - 216, 50, 6, 57, 322, 5, 6, 0, 55, 331, - 55, 55, 16, 38, 44, 45, 46, 47, 340, 57, - 59, 51, 57, 59, 54, 38, 61, 55, 10, 58, - 92, 55, 55, 99, 352, 65, 66, 67, 99, 92, - 319, 71, 72, 92, 91, 99, 91, 29, 30, 31, - 32, 33, 34, 61, 270, 334, 299, 219, 202, 272, - 90, 99, 24, 55, 51, 55, 55, 97, 59, 55, - 55, 50, 55, 55, 55, 59, 38, 39, 60, 66, - 67, 350, 14, 37, 66, 37, 55, 60, 70, 38, - 206, 207, 74, 75, 373, 77, 78, 79, 345, 57, + 2, 2, 48, 233, 257, 150, 137, 197, 270, 38, + 12, 55, 50, 207, 57, 57, 3, 50, 55, 244, + 50, 57, 6, 57, 218, 57, 55, 0, 55, 61, + 68, 69, 16, 38, 94, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 5, 6, 91, 10, 334, + 28, 5, 6, 7, 92, 92, 99, 99, 343, 92, + 322, 59, 92, 99, 91, 99, 325, 29, 30, 31, + 32, 33, 34, 204, 61, 337, 221, 302, 32, 273, + 58, 35, 36, 37, 38, 275, 50, 41, 42, 43, + 59, 45, 46, 55, 55, 38, 355, 55, 60, 55, + 353, 55, 55, 55, 66, 59, 55, 55, 70, 63, + 64, 55, 74, 75, 376, 77, 78, 79, 348, 59, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 99, 94, 117, 118, 362, 5, 6, 140, 140, - 228, 38, 230, 105, 106, 107, 108, 109, 110, 245, - 112, 113, 114, 115, 116, 24, 37, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 38, - 39, 38, 55, 135, 136, 23, 23, 3, 56, 275, - 142, 226, 278, 279, 146, 281, 56, 55, 284, 285, - 55, 57, 41, 37, 58, 99, 38, 60, 60, 60, - 57, 8, 56, 26, 206, 207, 59, 169, 60, 60, - 306, 56, 308, 309, 44, 45, 46, 47, 48, 49, - 56, 51, 52, 53, 54, 56, 46, 47, 56, 56, - 326, 51, 62, 195, 54, 65, 66, 67, 56, 61, - 202, 71, 72, 245, 61, 60, 66, 67, 210, 211, - 60, 213, 214, 215, 84, 85, 86, 87, 88, 89, - 90, 223, 56, 225, 50, 38, 228, 97, 230, 231, - 232, 61, 60, 275, 321, 322, 278, 279, 59, 281, - 59, 61, 284, 285, 61, 247, 248, 59, 58, 50, - 61, 50, 339, 340, -1, 297, 297, 236, 260, 313, - 340, -1, -1, -1, 306, 352, 308, 309, -1, 356, - 272, -1, -1, -1, 5, 6, 7, -1, -1, -1, - -1, 283, -1, -1, 326, 287, -1, -1, -1, -1, - -1, -1, -1, 335, 335, -1, -1, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, 350, 350, - 41, 42, 43, -1, 45, 46, -1, -1, -1, -1, - -1, 50, -1, -1, 55, -1, -1, -1, 59, -1, - -1, 333, 63, 64, -1, -1, 378, 378, -1, 68, - 69, 343, 344, 345, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, -1, -1, -1, -1, -1, 361, - 362, 92, -1, 92, 3, -1, 5, 6, 7, -1, - 9, -1, 11, 375, 13, 14, 15, -1, 380, -1, + 92, 59, 94, 117, 118, 365, 55, 55, 92, 141, + 141, 24, 14, 105, 106, 107, 108, 109, 110, 37, + 112, 113, 114, 115, 116, 38, 39, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 230, 37, 232, 55, 136, 137, 60, 44, 45, 46, + 47, 143, 228, 38, 51, 147, 99, 54, 44, 45, + 46, 47, 48, 49, 57, 51, 38, 53, 54, 66, + 67, 324, 325, 37, 5, 6, 208, 209, 170, 65, + 66, 67, 38, 23, 55, 71, 72, 208, 209, 342, + 343, 23, 3, 24, 56, 55, 57, 56, 84, 85, + 86, 87, 355, 51, 90, 197, 359, 38, 39, 46, + 47, 97, 204, 55, 51, 58, 248, 54, 66, 67, + 212, 213, 60, 215, 216, 217, 60, 248, 41, 66, + 67, 60, 37, 225, 99, 227, 38, 57, 230, 8, + 232, 233, 56, 235, 26, 60, 278, 59, 56, 281, + 282, 61, 284, 56, 61, 287, 288, 278, 250, 251, + 281, 282, 56, 284, 56, 56, 287, 288, 300, 300, + 56, 263, 60, 60, 50, 60, 56, 309, 38, 311, + 312, 59, 61, 275, 61, 60, 50, 61, 309, 59, + 311, 312, 59, 58, 286, 61, 50, 329, 290, 50, + 239, 343, -1, 316, 68, 69, 338, 338, 329, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, + -1, 353, 353, -1, -1, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + -1, -1, -1, 62, 336, -1, 65, 66, 67, 381, + 381, -1, 71, 72, 346, 347, 348, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, 364, 365, -1, -1, -1, 3, 97, 5, + 6, 7, -1, 9, -1, 11, 378, 13, 14, 15, + -1, 383, -1, -1, 20, 21, 22, -1, 24, 25, + -1, 27, -1, 29, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, + 46, -1, -1, -1, -1, -1, -1, -1, -1, 55, + -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, + 5, 6, 7, -1, 9, -1, 11, -1, 13, 14, + 15, -1, -1, -1, 19, 20, 21, 22, -1, 24, + 25, 26, 27, -1, -1, -1, 92, 32, -1, -1, + 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, + 45, 46, -1, -1, -1, 5, 6, 7, -1, 9, + 55, 11, -1, 13, 14, 15, -1, -1, 63, 64, + 20, 21, 22, -1, 24, 25, -1, 27, -1, -1, + -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, + 40, 41, 42, 43, -1, 45, 46, 92, -1, -1, + -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, + 60, -1, -1, 63, 64, -1, 5, 6, 7, -1, + 9, -1, 11, -1, 13, 14, 15, -1, -1, -1, -1, 20, 21, 22, -1, 24, 25, -1, 27, -1, - 29, -1, -1, 32, -1, -1, 35, 36, 37, 38, + -1, -1, 92, 32, -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, 46, -1, -1, - -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, - -1, -1, -1, -1, 63, 64, -1, 5, 6, 7, - -1, 9, -1, 11, -1, 13, 14, 15, -1, -1, - -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, - -1, -1, -1, 92, 32, -1, -1, 35, 36, 37, - 38, -1, 40, 41, 42, 43, -1, 45, 46, -1, - -1, -1, 5, 6, 7, -1, 9, 55, 11, -1, - 13, 14, 15, -1, -1, 63, 64, 20, 21, 22, - -1, 24, 25, -1, 27, -1, -1, -1, -1, 32, - -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, - 43, -1, 45, 46, 92, -1, -1, -1, -1, -1, - -1, -1, 55, -1, -1, -1, -1, 60, -1, -1, - 63, 64, -1, 5, 6, 7, -1, 9, -1, 11, - -1, 13, 14, 15, -1, -1, -1, -1, 20, 21, - 22, -1, 24, 25, -1, 27, -1, -1, -1, 92, - 32, -1, -1, 35, 36, 37, 38, -1, 40, 41, - 42, 43, -1, 45, 46, -1, -1, -1, 5, 6, - 7, -1, 9, 55, 11, -1, 13, 14, 15, 61, - -1, 63, 64, 20, 21, 22, -1, 24, 25, -1, - 27, -1, -1, -1, -1, 32, -1, -1, 35, 36, - 37, 38, -1, 40, 41, 42, 43, -1, 45, 46, - 92, -1, -1, 5, 6, 7, -1, 9, 55, 11, - -1, 13, 14, 15, 61, -1, 63, 64, 20, 21, - 22, -1, 24, 25, -1, 27, -1, -1, -1, -1, - 32, -1, -1, 35, 36, 37, 38, -1, 40, 41, - 42, 43, -1, 45, 46, 92, -1, -1, 5, 6, - 7, -1, 9, 55, 11, -1, 13, 14, 15, 61, - -1, 63, 64, 20, 21, 22, -1, 24, 25, -1, - 27, -1, 5, 6, 7, 32, -1, -1, 35, 36, - 37, 38, -1, 40, 41, 42, 43, -1, 45, 46, - 92, -1, -1, -1, -1, -1, -1, -1, 55, 32, - -1, -1, 35, 36, 37, 38, 63, 64, 41, 42, - 43, -1, 45, 46, 5, 6, 7, 44, 45, 46, - 47, -1, 55, -1, 51, -1, 59, 54, -1, -1, - 63, 64, -1, -1, -1, 92, -1, -1, -1, 66, - 67, 32, -1, -1, 35, 36, 37, 38, -1, -1, - 41, 42, 43, -1, 45, 46, 5, 6, 7, 92, - -1, -1, -1, -1, 55, -1, -1, -1, -1, 60, - -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, - -1, -1, 41, 42, 43, -1, 45, 46, 5, 6, - 7, 92, -1, -1, -1, -1, 55, -1, -1, -1, - 59, -1, -1, -1, 63, 64, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, - 37, 38, -1, -1, 41, 42, 43, -1, 45, 46, - 5, 6, 7, 92, -1, -1, -1, -1, 55, 56, - -1, -1, -1, -1, -1, -1, 63, 64, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, - 35, 36, 37, 38, -1, -1, 41, 42, 43, -1, - 45, 46, 5, 6, 7, 92, -1, -1, -1, -1, - 55, -1, -1, -1, 59, -1, -1, -1, 63, 64, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, - -1, -1, 35, 36, 37, 38, -1, -1, 41, 42, - 43, -1, 45, 46, 5, 6, 7, 92, -1, -1, - -1, -1, 55, 56, -1, -1, -1, -1, -1, -1, - 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, - 41, 42, 43, -1, 45, 46, 5, 6, 7, 92, - -1, -1, -1, -1, 55, 56, -1, -1, -1, -1, - -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, 5, 6, 7, -1, 9, 55, 11, -1, 13, + 14, 15, 61, -1, 63, 64, 20, 21, 22, -1, + 24, 25, -1, 27, -1, -1, -1, -1, 32, -1, + -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, + -1, 45, 46, 92, -1, -1, 5, 6, 7, -1, + 9, 55, 11, -1, 13, 14, 15, 61, -1, 63, + 64, 20, 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, - -1, -1, 41, 42, 43, -1, 45, 46, 5, 6, - 7, 92, -1, -1, -1, -1, 55, 56, -1, -1, - -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, - -1, -1, 5, 6, 7, 32, -1, -1, 35, 36, - 37, 38, -1, -1, 41, 42, 43, -1, 45, 46, - -1, -1, -1, 92, -1, -1, -1, -1, 55, 32, - -1, -1, 35, 36, 37, 38, 63, 64, 41, 42, - 43, -1, 45, 46, -1, -1, -1, -1, -1, -1, - -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, - 63, 64, -1, -1, -1, 92, -1, -1, -1, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, 56, 57, -1, -1, -1, -1, 62, -1, 92, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, 57, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + -1, 40, 41, 42, 43, -1, 45, 46, 92, -1, + -1, 5, 6, 7, -1, 9, 55, 11, -1, 13, + 14, 15, 61, -1, 63, 64, 20, 21, 22, -1, + 24, 25, -1, 27, -1, 5, 6, 7, 32, -1, + -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, + -1, 45, 46, 92, -1, -1, -1, -1, -1, -1, + -1, 55, 32, -1, -1, 35, 36, 37, 38, 63, + 64, 41, 42, 43, -1, 45, 46, 5, 6, 7, + -1, -1, -1, -1, -1, 55, -1, -1, -1, 59, + -1, -1, -1, 63, 64, -1, -1, -1, 92, -1, + -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, + 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, + 6, 7, 92, -1, -1, -1, -1, 55, -1, -1, + -1, -1, 60, -1, -1, 63, 64, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, + 46, 5, 6, 7, 92, -1, -1, -1, -1, 55, + -1, -1, -1, 59, -1, -1, -1, 63, 64, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, + -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, + -1, 45, 46, 5, 6, 7, 92, -1, -1, -1, + -1, 55, 56, -1, -1, -1, -1, -1, -1, 63, + 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, + 42, 43, -1, 45, 46, 5, 6, 7, 92, -1, + -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, + -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, + -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, + 92, -1, -1, -1, -1, 55, 56, -1, -1, -1, + -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, + 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, + 6, 7, 92, -1, -1, -1, -1, 55, 56, -1, + -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, + 46, 5, 6, 7, 92, -1, -1, -1, -1, 55, + 56, -1, -1, -1, -1, -1, -1, 63, 64, -1, + -1, -1, -1, -1, -1, 5, 6, 7, 32, -1, + -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, + -1, 45, 46, -1, -1, -1, 92, -1, -1, -1, + -1, 55, 32, -1, -1, 35, 36, 37, 38, 63, + 64, 41, 42, 43, -1, 45, 46, -1, -1, -1, + -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, 63, 64, -1, -1, -1, 92, -1, + -1, -1, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, -1, -1, -1, + 62, -1, 92, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, -1, 99, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, 57, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, 57, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, 56, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, 56, -1, -1, -1, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, 58, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, 58, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, 57, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, 56, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + -1, -1, 58, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + 58, -1, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, -1, 57, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, 56, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, 56, -1, + -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, -1, -1, -1, 59, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, 56, -1, -1, -1, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, 56, -1, + -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, -1, -1, -1, 59, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, -1, -1, -1, 59, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + -1, -1, -1, 59, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, -1, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, 84, 85, + 86, 87, 88, -1, 90, 62, -1, -1, 65, 66, + 67, 97, -1, -1, 71, 72, 44, 45, 46, 47, + 48, 49, -1, 51, -1, 53, 54, 84, 85, 86, + 87, -1, -1, 90, 62, -1, -1, 65, 66, 67, + 97, -1, -1, 71, 72, 44, 45, 46, 47, 48, + 49, -1, 51, -1, -1, 54, 84, 85, 86, 87, + -1, -1, 90, -1, -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, 46, 47, 48, 49, - -1, 51, 52, 53, 54, 84, 85, 86, 87, 88, - -1, 90, 62, -1, -1, 65, 66, 67, 97, -1, - -1, 71, 72, 44, 45, 46, 47, 48, 49, -1, - 51, -1, 53, 54, 84, 85, 86, 87, -1, -1, - 90, 62, -1, -1, 65, 66, 67, 97, -1, -1, - 71, 72, 44, 45, 46, 47, 48, 49, -1, 51, - -1, 53, 54, 84, 85, 86, 87, -1, -1, 90, - -1, -1, -1, 65, 66, 67, 97, -1, -1, 71, - 72, 44, 45, 46, 47, 48, 49, -1, 51, -1, - -1, 54, 84, 85, 86, 87, -1, -1, 90, -1, - -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, - 44, 45, 46, 47, 48, 49, -1, 51, -1, -1, - 54, 84, 85, 86, 87, -1, -1, 90, -1, -1, - -1, 65, 66, 67, 97, -1, -1, 71, 72, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 86, 87, -1, -1, 90, 50, -1, 68, - 69, -1, -1, 97, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, -1, 68, 69, -1, -1, -1, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 44, 45, 46, 47, -1, -1, -1, 51, -1, -1, + -1, 51, -1, -1, 54, 84, 85, 86, 87, -1, + -1, 90, -1, -1, -1, 65, 66, 67, 97, -1, + -1, 71, 72, 44, 45, 46, 47, -1, -1, -1, + 51, -1, -1, 54, 50, -1, 86, 87, -1, -1, + 90, -1, -1, -1, 65, 66, 67, 97, -1, -1, + 71, 72, 68, 69, -1, -1, -1, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, -1, -1, 90, + 44, 45, 46, 47, -1, -1, 97, 51, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 67, -1, -1, -1, 71, 72 }; @@ -1501,33 +1517,33 @@ static const yytype_uint8 yystos[] = 81, 82, 92, 131, 55, 91, 127, 127, 127, 127, 127, 127, 135, 136, 59, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 62, 65, 66, 67, 71, - 72, 84, 85, 86, 87, 88, 89, 90, 96, 97, - 50, 131, 55, 91, 127, 55, 55, 127, 59, 127, - 106, 14, 59, 127, 37, 37, 55, 127, 127, 60, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 140, 135, 38, 56, 99, 57, - 127, 127, 127, 127, 127, 127, 38, 127, 127, 127, - 127, 127, 130, 130, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 60, 127, 37, 109, 110, - 38, 56, 92, 114, 127, 114, 56, 56, 61, 107, - 55, 59, 127, 59, 23, 23, 127, 56, 56, 105, - 108, 56, 57, 57, 59, 57, 99, 56, 55, 127, - 55, 92, 58, 136, 56, 57, 55, 114, 127, 58, - 113, 113, 118, 118, 127, 56, 127, 59, 59, 127, - 127, 127, 113, 60, 60, 61, 108, 41, 127, 127, - 50, 131, 135, 135, 140, 127, 61, 60, 37, 109, - 99, 38, 57, 115, 115, 8, 56, 118, 56, 56, - 127, 56, 127, 59, 56, 56, 56, 26, 120, 120, - 59, 56, 59, 127, 56, 56, 99, 106, 56, 113, - 136, 56, 56, 118, 118, 118, 56, 118, 56, 56, - 127, 118, 118, 60, 121, 127, 61, 61, 61, 60, - 115, 60, 60, 118, 118, 118, 56, 24, 38, 39, - 137, 138, 139, 28, 58, 106, 56, 112, 116, 117, - 138, 116, 118, 50, 50, 92, 38, 61, 139, 127, - 106, 61, 60, 59, 61, 112, 117, 61, 127, 127, - 140, 50, 92, 59, 19, 120, 116, 59, 59, 59, - 99, 127, 140, 58, 61, 50, 59, 99, 106, 127, - 50, 59, 127, 59 + 72, 84, 85, 86, 87, 88, 89, 90, 92, 96, + 97, 50, 131, 55, 91, 127, 55, 55, 127, 59, + 127, 106, 14, 59, 127, 37, 37, 55, 127, 127, + 60, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 140, 135, 38, 56, 99, + 57, 127, 127, 127, 127, 127, 127, 38, 127, 127, + 127, 127, 127, 130, 130, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 60, 127, 37, + 109, 110, 38, 56, 92, 114, 127, 114, 56, 56, + 61, 107, 55, 59, 127, 59, 23, 23, 127, 56, + 56, 105, 108, 56, 57, 57, 59, 57, 99, 56, + 55, 127, 55, 92, 99, 58, 136, 56, 57, 55, + 114, 127, 58, 113, 113, 118, 118, 127, 56, 127, + 59, 59, 127, 127, 127, 113, 60, 60, 61, 108, + 41, 127, 127, 50, 131, 135, 135, 140, 127, 61, + 60, 37, 109, 99, 38, 57, 115, 115, 8, 56, + 118, 56, 56, 127, 56, 127, 59, 56, 56, 56, + 26, 120, 120, 59, 56, 59, 127, 56, 56, 99, + 106, 56, 113, 136, 56, 56, 118, 118, 118, 56, + 118, 56, 56, 127, 118, 118, 60, 121, 127, 61, + 61, 61, 60, 115, 60, 60, 118, 118, 118, 56, + 24, 38, 39, 137, 138, 139, 28, 58, 106, 56, + 112, 116, 117, 138, 116, 118, 50, 50, 92, 38, + 61, 139, 127, 106, 61, 60, 59, 61, 112, 117, + 61, 127, 127, 140, 50, 92, 59, 19, 120, 116, + 59, 59, 59, 99, 127, 140, 58, 61, 50, 59, + 99, 106, 127, 50, 59, 127, 59 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -1544,12 +1560,12 @@ static const yytype_uint8 yyr1[] = 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 128, 128, 129, 129, - 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 133, 133, 133, 134, 134, 135, - 135, 136, 136, 137, 137, 138, 138, 139, 139, 139, - 139, 139, 140, 140 + 127, 127, 127, 127, 127, 127, 127, 128, 128, 129, + 129, 130, 130, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 133, 133, 133, 134, 134, + 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, + 139, 139, 139, 140, 140 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -1566,12 +1582,12 @@ static const yytype_int8 yyr2[] = 3, 3, 3, 3, 3, 3, 2, 2, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 3, 3, 6, 3, 3, - 1, 3, 1, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 1, 1, 1, 3, 6, 2, - 5, 2, 3, 5, 4, 6, 6, 4, 6, 0, - 1, 1, 3, 0, 1, 1, 2, 4, 5, 4, - 7, 8, 1, 3 + 1, 1, 1, 1, 4, 4, 3, 3, 6, 3, + 3, 1, 3, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 3, 6, + 2, 5, 2, 3, 5, 4, 6, 6, 4, 6, + 0, 1, 1, 3, 0, 1, 1, 2, 4, 5, + 4, 7, 8, 1, 3 }; @@ -2221,647 +2237,653 @@ yyparse (void) case 2: /* start: decl_list */ #line 167 "CMDgram.y" { } -#line 2225 "CMDgram.c" +#line 2241 "CMDgram.c" break; case 3: /* decl_list: %empty */ #line 172 "CMDgram.y" { (yyval.stmt) = nil; } -#line 2231 "CMDgram.c" +#line 2247 "CMDgram.c" break; case 4: /* decl_list: decl_list decl */ #line 174 "CMDgram.y" { if(!Script::gStatementList) { Script::gStatementList = (yyvsp[0].stmt); } else { Script::gStatementList->append((yyvsp[0].stmt)); } } -#line 2237 "CMDgram.c" +#line 2253 "CMDgram.c" break; case 5: /* decl: stmt */ #line 179 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2243 "CMDgram.c" +#line 2259 "CMDgram.c" break; case 6: /* decl: fn_decl_stmt */ #line 181 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2249 "CMDgram.c" +#line 2265 "CMDgram.c" break; case 7: /* decl: package_decl */ #line 183 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2255 "CMDgram.c" +#line 2271 "CMDgram.c" break; case 8: /* package_decl: rwPACKAGE IDENT '{' fn_decl_list '}' ';' */ #line 188 "CMDgram.y" { (yyval.stmt) = (yyvsp[-2].stmt); for(StmtNode *walk = ((yyvsp[-2].stmt));walk;walk = walk->getNext() ) walk->setPackage((yyvsp[-4].s).value); } -#line 2261 "CMDgram.c" +#line 2277 "CMDgram.c" break; case 9: /* fn_decl_list: fn_decl_stmt */ #line 193 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2267 "CMDgram.c" +#line 2283 "CMDgram.c" break; case 10: /* fn_decl_list: fn_decl_list fn_decl_stmt */ #line 195 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); ((yyvsp[-1].stmt))->append((yyvsp[0].stmt)); } -#line 2273 "CMDgram.c" +#line 2289 "CMDgram.c" break; case 11: /* statement_list: %empty */ #line 200 "CMDgram.y" { (yyval.stmt) = nil; } -#line 2279 "CMDgram.c" +#line 2295 "CMDgram.c" break; case 12: /* statement_list: statement_list stmt */ #line 202 "CMDgram.y" { if(!(yyvsp[-1].stmt)) { (yyval.stmt) = (yyvsp[0].stmt); } else { ((yyvsp[-1].stmt))->append((yyvsp[0].stmt)); (yyval.stmt) = (yyvsp[-1].stmt); } } -#line 2285 "CMDgram.c" +#line 2301 "CMDgram.c" break; case 19: /* stmt: rwBREAK ';' */ #line 213 "CMDgram.y" { (yyval.stmt) = BreakStmtNode::alloc( (yyvsp[-1].i).lineNumber ); } -#line 2291 "CMDgram.c" +#line 2307 "CMDgram.c" break; case 20: /* stmt: rwCONTINUE ';' */ #line 215 "CMDgram.y" { (yyval.stmt) = ContinueStmtNode::alloc( (yyvsp[-1].i).lineNumber ); } -#line 2297 "CMDgram.c" +#line 2313 "CMDgram.c" break; case 21: /* stmt: rwRETURN ';' */ #line 217 "CMDgram.y" { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[-1].i).lineNumber, NULL ); } -#line 2303 "CMDgram.c" +#line 2319 "CMDgram.c" break; case 22: /* stmt: rwRETURN expr ';' */ #line 219 "CMDgram.y" { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[-2].i).lineNumber, (yyvsp[-1].expr) ); } -#line 2309 "CMDgram.c" +#line 2325 "CMDgram.c" break; case 23: /* stmt: expression_stmt ';' */ #line 221 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); } -#line 2315 "CMDgram.c" +#line 2331 "CMDgram.c" break; case 24: /* stmt: TTAG '=' expr ';' */ #line 223 "CMDgram.y" { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-1].expr), NULL ); } -#line 2321 "CMDgram.c" +#line 2337 "CMDgram.c" break; case 25: /* stmt: TTAG '=' expr ',' expr ';' */ #line 225 "CMDgram.y" { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-5].s).value, (yyvsp[-3].expr), (yyvsp[-1].expr) ); } -#line 2327 "CMDgram.c" +#line 2343 "CMDgram.c" break; case 26: /* stmt: DOCBLOCK */ #line 227 "CMDgram.y" { (yyval.stmt) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, false, true ); } -#line 2333 "CMDgram.c" +#line 2349 "CMDgram.c" break; case 27: /* fn_decl_stmt: rwDEFINE IDENT '(' var_list_decl ')' '{' statement_list '}' */ #line 232 "CMDgram.y" { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[-7].i).lineNumber, (yyvsp[-6].s).value, NULL, (yyvsp[-4].var), (yyvsp[-1].stmt) ); } -#line 2339 "CMDgram.c" +#line 2355 "CMDgram.c" break; case 28: /* fn_decl_stmt: rwDEFINE IDENT opCOLONCOLON IDENT '(' var_list_decl ')' '{' statement_list '}' */ #line 234 "CMDgram.y" { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-6].s).value, (yyvsp[-8].s).value, (yyvsp[-4].var), (yyvsp[-1].stmt) ); } -#line 2345 "CMDgram.c" +#line 2361 "CMDgram.c" break; case 29: /* var_list_decl: %empty */ #line 239 "CMDgram.y" { (yyval.var) = NULL; } -#line 2351 "CMDgram.c" +#line 2367 "CMDgram.c" break; case 30: /* var_list_decl: var_list */ #line 241 "CMDgram.y" { (yyval.var) = (yyvsp[0].var); } -#line 2357 "CMDgram.c" +#line 2373 "CMDgram.c" break; case 31: /* var_list: VAR */ #line 246 "CMDgram.y" { (yyval.var) = VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL ); } -#line 2363 "CMDgram.c" +#line 2379 "CMDgram.c" break; case 32: /* var_list: var_list ',' VAR */ #line 248 "CMDgram.y" { (yyval.var) = (yyvsp[-2].var); ((StmtNode*)((yyvsp[-2].var)))->append((StmtNode*)VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL ) ); } -#line 2369 "CMDgram.c" +#line 2385 "CMDgram.c" break; case 33: /* datablock_decl: rwDATABLOCK class_name_expr '(' expr parent_block ')' '{' slot_assign_list_opt '}' ';' */ #line 253 "CMDgram.y" { (yyval.stmt) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), NULL, (yyvsp[-5].s).value, (yyvsp[-2].slist), NULL, true, false, false); } -#line 2375 "CMDgram.c" +#line 2391 "CMDgram.c" break; case 34: /* object_decl: rwDECLARE class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}' */ #line 258 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, false, false); } -#line 2381 "CMDgram.c" +#line 2397 "CMDgram.c" break; case 35: /* object_decl: rwDECLARE class_name_expr '(' object_name parent_block object_args ')' */ #line 260 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, false, false); } -#line 2387 "CMDgram.c" +#line 2403 "CMDgram.c" break; case 36: /* object_decl: rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' '{' object_declare_block '}' */ #line 262 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-11].i).lineNumber, (yyvsp[-10].expr), (yyvsp[-7].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, true, false); } -#line 2393 "CMDgram.c" +#line 2409 "CMDgram.c" break; case 37: /* object_decl: rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' */ #line 264 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-8].i).lineNumber, (yyvsp[-7].expr), (yyvsp[-4].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, true, false); } -#line 2399 "CMDgram.c" +#line 2415 "CMDgram.c" break; case 38: /* object_decl: rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}' */ #line 266 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, false, true); } -#line 2405 "CMDgram.c" +#line 2421 "CMDgram.c" break; case 39: /* object_decl: rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' */ #line 268 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, false, true); } -#line 2411 "CMDgram.c" +#line 2427 "CMDgram.c" break; case 40: /* parent_block: %empty */ #line 273 "CMDgram.y" { (yyval.s).value = NULL; } -#line 2417 "CMDgram.c" +#line 2433 "CMDgram.c" break; case 41: /* parent_block: ':' IDENT */ #line 275 "CMDgram.y" { (yyval.s) = (yyvsp[0].s); } -#line 2423 "CMDgram.c" +#line 2439 "CMDgram.c" break; case 42: /* object_name: %empty */ #line 280 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( CodeBlock::smCurrentParser->getCurrentLine(), "", false); } -#line 2429 "CMDgram.c" +#line 2445 "CMDgram.c" break; case 43: /* object_name: expr */ #line 282 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2435 "CMDgram.c" +#line 2451 "CMDgram.c" break; case 44: /* object_args: %empty */ #line 287 "CMDgram.y" { (yyval.expr) = NULL; } -#line 2441 "CMDgram.c" +#line 2457 "CMDgram.c" break; case 45: /* object_args: ',' expr_list */ #line 289 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2447 "CMDgram.c" +#line 2463 "CMDgram.c" break; case 46: /* object_declare_block: %empty */ #line 294 "CMDgram.y" { (yyval.odcl).slots = NULL; (yyval.odcl).decls = NULL; } -#line 2453 "CMDgram.c" +#line 2469 "CMDgram.c" break; case 47: /* object_declare_block: slot_assign_list */ #line 296 "CMDgram.y" { (yyval.odcl).slots = (yyvsp[0].slist); (yyval.odcl).decls = NULL; } -#line 2459 "CMDgram.c" +#line 2475 "CMDgram.c" break; case 48: /* object_declare_block: object_decl_list */ #line 298 "CMDgram.y" { (yyval.odcl).slots = NULL; (yyval.odcl).decls = (yyvsp[0].od); } -#line 2465 "CMDgram.c" +#line 2481 "CMDgram.c" break; case 49: /* object_declare_block: slot_assign_list object_decl_list */ #line 300 "CMDgram.y" { (yyval.odcl).slots = (yyvsp[-1].slist); (yyval.odcl).decls = (yyvsp[0].od); } -#line 2471 "CMDgram.c" +#line 2487 "CMDgram.c" break; case 50: /* object_decl_list: object_decl ';' */ #line 305 "CMDgram.y" { (yyval.od) = (yyvsp[-1].od); } -#line 2477 "CMDgram.c" +#line 2493 "CMDgram.c" break; case 51: /* object_decl_list: object_decl_list object_decl ';' */ #line 307 "CMDgram.y" { (yyvsp[-2].od)->append((yyvsp[-1].od)); (yyval.od) = (yyvsp[-2].od); } -#line 2483 "CMDgram.c" +#line 2499 "CMDgram.c" break; case 52: /* stmt_block: '{' statement_list '}' */ #line 312 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); } -#line 2489 "CMDgram.c" +#line 2505 "CMDgram.c" break; case 53: /* stmt_block: stmt */ #line 314 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2495 "CMDgram.c" +#line 2511 "CMDgram.c" break; case 54: /* switch_stmt: rwSWITCH '(' expr ')' '{' case_block '}' */ #line 319 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].ifnode); (yyvsp[-1].ifnode)->propagateSwitchExpr((yyvsp[-4].expr), false); } -#line 2501 "CMDgram.c" +#line 2517 "CMDgram.c" break; case 55: /* switch_stmt: rwSWITCHSTR '(' expr ')' '{' case_block '}' */ #line 321 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].ifnode); (yyvsp[-1].ifnode)->propagateSwitchExpr((yyvsp[-4].expr), true); } -#line 2507 "CMDgram.c" +#line 2523 "CMDgram.c" break; case 56: /* case_block: rwCASE case_expr ':' statement_list */ #line 326 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-3].i).lineNumber, (yyvsp[-2].expr), (yyvsp[0].stmt), NULL, false); } -#line 2513 "CMDgram.c" +#line 2529 "CMDgram.c" break; case 57: /* case_block: rwCASE case_expr ':' statement_list rwDEFAULT ':' statement_list */ #line 328 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].stmt), (yyvsp[0].stmt), false); } -#line 2519 "CMDgram.c" +#line 2535 "CMDgram.c" break; case 58: /* case_block: rwCASE case_expr ':' statement_list case_block */ #line 330 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-4].i).lineNumber, (yyvsp[-3].expr), (yyvsp[-1].stmt), (yyvsp[0].ifnode), true); } -#line 2525 "CMDgram.c" +#line 2541 "CMDgram.c" break; case 59: /* case_expr: expr */ #line 335 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr);} -#line 2531 "CMDgram.c" +#line 2547 "CMDgram.c" break; case 60: /* case_expr: case_expr rwCASEOR expr */ #line 337 "CMDgram.y" { ((yyvsp[-2].expr))->append((yyvsp[0].expr)); (yyval.expr)=(yyvsp[-2].expr); } -#line 2537 "CMDgram.c" +#line 2553 "CMDgram.c" break; case 61: /* if_stmt: rwIF '(' expr ')' stmt_block */ #line 342 "CMDgram.y" { (yyval.stmt) = IfStmtNode::alloc((yyvsp[-4].i).lineNumber, (yyvsp[-2].expr), (yyvsp[0].stmt), NULL, false); } -#line 2543 "CMDgram.c" +#line 2559 "CMDgram.c" break; case 62: /* if_stmt: rwIF '(' expr ')' stmt_block rwELSE stmt_block */ #line 344 "CMDgram.y" { (yyval.stmt) = IfStmtNode::alloc((yyvsp[-6].i).lineNumber, (yyvsp[-4].expr), (yyvsp[-2].stmt), (yyvsp[0].stmt), false); } -#line 2549 "CMDgram.c" +#line 2565 "CMDgram.c" break; case 63: /* while_stmt: rwWHILE '(' expr ')' stmt_block */ #line 349 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-4].i).lineNumber, nil, (yyvsp[-2].expr), nil, (yyvsp[0].stmt), false); } -#line 2555 "CMDgram.c" +#line 2571 "CMDgram.c" break; case 64: /* while_stmt: rwDO stmt_block rwWHILE '(' expr ')' */ #line 351 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-3].i).lineNumber, nil, (yyvsp[-1].expr), nil, (yyvsp[-4].stmt), true); } -#line 2561 "CMDgram.c" +#line 2577 "CMDgram.c" break; case 65: /* for_stmt: rwFOR '(' expr ';' expr ';' expr ')' stmt_block */ #line 356 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-8].i).lineNumber, (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2567 "CMDgram.c" +#line 2583 "CMDgram.c" break; case 66: /* for_stmt: rwFOR '(' expr ';' expr ';' ')' stmt_block */ #line 358 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), NULL, (yyvsp[0].stmt), false); } -#line 2573 "CMDgram.c" +#line 2589 "CMDgram.c" break; case 67: /* for_stmt: rwFOR '(' expr ';' ';' expr ')' stmt_block */ #line 360 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, (yyvsp[-5].expr), NULL, (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2579 "CMDgram.c" +#line 2595 "CMDgram.c" break; case 68: /* for_stmt: rwFOR '(' expr ';' ';' ')' stmt_block */ #line 362 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, (yyvsp[-4].expr), NULL, NULL, (yyvsp[0].stmt), false); } -#line 2585 "CMDgram.c" +#line 2601 "CMDgram.c" break; case 69: /* for_stmt: rwFOR '(' ';' expr ';' expr ')' stmt_block */ #line 364 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2591 "CMDgram.c" +#line 2607 "CMDgram.c" break; case 70: /* for_stmt: rwFOR '(' ';' expr ';' ')' stmt_block */ #line 366 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, NULL, (yyvsp[-3].expr), NULL, (yyvsp[0].stmt), false); } -#line 2597 "CMDgram.c" +#line 2613 "CMDgram.c" break; case 71: /* for_stmt: rwFOR '(' ';' ';' expr ')' stmt_block */ #line 368 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, NULL, NULL, (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2603 "CMDgram.c" +#line 2619 "CMDgram.c" break; case 72: /* for_stmt: rwFOR '(' ';' ';' ')' stmt_block */ #line 370 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-5].i).lineNumber, NULL, NULL, NULL, (yyvsp[0].stmt), false); } -#line 2609 "CMDgram.c" +#line 2625 "CMDgram.c" break; case 73: /* foreach_stmt: rwFOREACH '(' VAR rwIN expr ')' stmt_block */ #line 375 "CMDgram.y" { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].stmt), false ); } -#line 2615 "CMDgram.c" +#line 2631 "CMDgram.c" break; case 74: /* foreach_stmt: rwFOREACHSTR '(' VAR rwIN expr ')' stmt_block */ #line 377 "CMDgram.y" { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].stmt), true ); } -#line 2621 "CMDgram.c" +#line 2637 "CMDgram.c" break; case 75: /* expression_stmt: stmt_expr */ #line 382 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].expr); } -#line 2627 "CMDgram.c" +#line 2643 "CMDgram.c" break; case 76: /* expr: stmt_expr */ #line 387 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2633 "CMDgram.c" +#line 2649 "CMDgram.c" break; case 77: /* expr: '(' expr ')' */ #line 389 "CMDgram.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2639 "CMDgram.c" +#line 2655 "CMDgram.c" break; case 78: /* expr: expr '^' expr */ #line 391 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2645 "CMDgram.c" +#line 2661 "CMDgram.c" break; case 79: /* expr: expr '%' expr */ #line 393 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2651 "CMDgram.c" +#line 2667 "CMDgram.c" break; case 80: /* expr: expr '&' expr */ #line 395 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2657 "CMDgram.c" +#line 2673 "CMDgram.c" break; case 81: /* expr: expr '|' expr */ #line 397 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2663 "CMDgram.c" +#line 2679 "CMDgram.c" break; case 82: /* expr: expr '+' expr */ #line 399 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2669 "CMDgram.c" +#line 2685 "CMDgram.c" break; case 83: /* expr: expr '-' expr */ #line 401 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2675 "CMDgram.c" +#line 2691 "CMDgram.c" break; case 84: /* expr: expr '*' expr */ #line 403 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2681 "CMDgram.c" +#line 2697 "CMDgram.c" break; case 85: /* expr: expr '/' expr */ #line 405 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2687 "CMDgram.c" +#line 2703 "CMDgram.c" break; case 86: /* expr: '-' expr */ #line 407 "CMDgram.y" { (yyval.expr) = FloatUnaryExprNode::alloc( (yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2693 "CMDgram.c" +#line 2709 "CMDgram.c" break; case 87: /* expr: '*' expr */ #line 409 "CMDgram.y" { (yyval.expr) = TTagDerefNode::alloc( (yyvsp[-1].i).lineNumber, (yyvsp[0].expr) ); } -#line 2699 "CMDgram.c" +#line 2715 "CMDgram.c" break; case 88: /* expr: TTAG */ #line 411 "CMDgram.y" { (yyval.expr) = TTagExprNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2705 "CMDgram.c" +#line 2721 "CMDgram.c" break; case 89: /* expr: expr '?' expr ':' expr */ #line 413 "CMDgram.y" { (yyval.expr) = ConditionalExprNode::alloc( (yyvsp[-4].expr)->dbgLineNumber, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2711 "CMDgram.c" +#line 2727 "CMDgram.c" break; case 90: /* expr: expr '<' expr */ #line 415 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2717 "CMDgram.c" +#line 2733 "CMDgram.c" break; case 91: /* expr: expr '>' expr */ #line 417 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2723 "CMDgram.c" +#line 2739 "CMDgram.c" break; case 92: /* expr: expr opGE expr */ #line 419 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2729 "CMDgram.c" +#line 2745 "CMDgram.c" break; case 93: /* expr: expr opLE expr */ #line 421 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2735 "CMDgram.c" +#line 2751 "CMDgram.c" break; case 94: /* expr: expr opEQ expr */ #line 423 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2741 "CMDgram.c" +#line 2757 "CMDgram.c" break; case 95: /* expr: expr opNE expr */ #line 425 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2747 "CMDgram.c" +#line 2763 "CMDgram.c" break; case 96: /* expr: expr opOR expr */ #line 427 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2753 "CMDgram.c" +#line 2769 "CMDgram.c" break; case 97: /* expr: expr opSHL expr */ #line 429 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2759 "CMDgram.c" +#line 2775 "CMDgram.c" break; case 98: /* expr: expr opSHR expr */ #line 431 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2765 "CMDgram.c" +#line 2781 "CMDgram.c" break; case 99: /* expr: expr opAND expr */ #line 433 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2771 "CMDgram.c" +#line 2787 "CMDgram.c" break; case 100: /* expr: expr opSTREQ expr */ #line 435 "CMDgram.y" { (yyval.expr) = StreqExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), true); } -#line 2777 "CMDgram.c" +#line 2793 "CMDgram.c" break; case 101: /* expr: expr opSTRNE expr */ #line 437 "CMDgram.y" { (yyval.expr) = StreqExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), false); } -#line 2783 "CMDgram.c" +#line 2799 "CMDgram.c" break; case 102: /* expr: expr '@' expr */ #line 439 "CMDgram.y" { (yyval.expr) = StrcatExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), (yyvsp[-1].i).value); } -#line 2789 "CMDgram.c" +#line 2805 "CMDgram.c" break; case 103: /* expr: '!' expr */ #line 441 "CMDgram.y" { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2795 "CMDgram.c" +#line 2811 "CMDgram.c" break; case 104: /* expr: '~' expr */ #line 443 "CMDgram.y" { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2801 "CMDgram.c" +#line 2817 "CMDgram.c" break; case 105: /* expr: TAGATOM */ #line 445 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, true); } -#line 2807 "CMDgram.c" +#line 2823 "CMDgram.c" break; case 106: /* expr: FLTCONST */ #line 447 "CMDgram.y" { (yyval.expr) = FloatNode::alloc( (yyvsp[0].f).lineNumber, (yyvsp[0].f).value ); } -#line 2813 "CMDgram.c" +#line 2829 "CMDgram.c" break; case 107: /* expr: INTCONST */ #line 449 "CMDgram.y" { (yyval.expr) = IntNode::alloc( (yyvsp[0].i).lineNumber, (yyvsp[0].i).value ); } -#line 2819 "CMDgram.c" +#line 2835 "CMDgram.c" break; case 108: /* expr: rwBREAK */ #line 451 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].i).lineNumber, StringTable->insert("break")); } -#line 2825 "CMDgram.c" +#line 2841 "CMDgram.c" break; case 109: /* expr: slot_acc */ #line 453 "CMDgram.y" { (yyval.expr) = SlotAccessNode::alloc( (yyvsp[0].slot).lineNumber, (yyvsp[0].slot).object, (yyvsp[0].slot).array, (yyvsp[0].slot).slotName ); } -#line 2831 "CMDgram.c" +#line 2847 "CMDgram.c" break; case 110: /* expr: intslot_acc */ #line 455 "CMDgram.y" { (yyval.expr) = InternalSlotAccessNode::alloc( (yyvsp[0].intslot).lineNumber, (yyvsp[0].intslot).object, (yyvsp[0].intslot).slotExpr, (yyvsp[0].intslot).recurse); } -#line 2837 "CMDgram.c" +#line 2853 "CMDgram.c" break; case 111: /* expr: IDENT */ #line 457 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2843 "CMDgram.c" +#line 2859 "CMDgram.c" break; case 112: /* expr: STRATOM */ #line 459 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, false); } -#line 2849 "CMDgram.c" +#line 2865 "CMDgram.c" break; case 113: /* expr: VAR */ #line 461 "CMDgram.y" { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL); } -#line 2855 "CMDgram.c" +#line 2871 "CMDgram.c" break; case 114: /* expr: VAR '[' aidx_expr ']' */ #line 463 "CMDgram.y" { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-1].expr) ); } -#line 2861 "CMDgram.c" +#line 2877 "CMDgram.c" break; - case 115: /* expr: '[' expr_list_decl ']' */ + case 115: /* expr: expr '[' expr ']' */ #line 465 "CMDgram.y" + { (yyval.expr) = VectorIndexNode::alloc((yyvsp[-3].expr)->dbgLineNumber, (yyvsp[-3].expr), (yyvsp[-1].expr)); } +#line 2883 "CMDgram.c" + break; + + case 116: /* expr: '[' expr_list_decl ']' */ +#line 467 "CMDgram.y" { Vector elems; if ((yyvsp[-1].expr)) { @@ -2872,299 +2894,299 @@ yyparse (void) } (yyval.expr) = VectorExprNode::alloc((yylsp[-2]).first_line, elems); } -#line 2876 "CMDgram.c" +#line 2898 "CMDgram.c" break; - case 116: /* slot_acc: expr '.' IDENT */ -#line 496 "CMDgram.y" + case 117: /* slot_acc: expr '.' IDENT */ +#line 498 "CMDgram.y" { (yyval.slot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[-2].expr); (yyval.slot).slotName = (yyvsp[0].s).value; (yyval.slot).array = NULL; } -#line 2882 "CMDgram.c" +#line 2904 "CMDgram.c" break; - case 117: /* slot_acc: expr '.' IDENT '[' aidx_expr ']' */ -#line 498 "CMDgram.y" + case 118: /* slot_acc: expr '.' IDENT '[' aidx_expr ']' */ +#line 500 "CMDgram.y" { (yyval.slot).lineNumber = (yyvsp[-5].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[-5].expr); (yyval.slot).slotName = (yyvsp[-3].s).value; (yyval.slot).array = (yyvsp[-1].expr); } -#line 2888 "CMDgram.c" +#line 2910 "CMDgram.c" break; - case 118: /* intslot_acc: expr opINTNAME class_name_expr */ -#line 503 "CMDgram.y" + case 119: /* intslot_acc: expr opINTNAME class_name_expr */ +#line 505 "CMDgram.y" { (yyval.intslot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[-2].expr); (yyval.intslot).slotExpr = (yyvsp[0].expr); (yyval.intslot).recurse = false; } -#line 2894 "CMDgram.c" +#line 2916 "CMDgram.c" break; - case 119: /* intslot_acc: expr opINTNAMER class_name_expr */ -#line 505 "CMDgram.y" + case 120: /* intslot_acc: expr opINTNAMER class_name_expr */ +#line 507 "CMDgram.y" { (yyval.intslot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[-2].expr); (yyval.intslot).slotExpr = (yyvsp[0].expr); (yyval.intslot).recurse = true; } -#line 2900 "CMDgram.c" +#line 2922 "CMDgram.c" break; - case 120: /* class_name_expr: IDENT */ -#line 510 "CMDgram.y" + case 121: /* class_name_expr: IDENT */ +#line 512 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2906 "CMDgram.c" +#line 2928 "CMDgram.c" break; - case 121: /* class_name_expr: '(' expr ')' */ -#line 512 "CMDgram.y" + case 122: /* class_name_expr: '(' expr ')' */ +#line 514 "CMDgram.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2912 "CMDgram.c" +#line 2934 "CMDgram.c" break; - case 122: /* assign_op_struct: opPLUSPLUS */ -#line 517 "CMDgram.y" + case 123: /* assign_op_struct: opPLUSPLUS */ +#line 519 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[0].i).lineNumber; (yyval.asn).token = opPLUSPLUS; (yyval.asn).expr = FloatNode::alloc( (yyvsp[0].i).lineNumber, 1 ); } -#line 2918 "CMDgram.c" +#line 2940 "CMDgram.c" break; - case 123: /* assign_op_struct: opMINUSMINUS */ -#line 519 "CMDgram.y" + case 124: /* assign_op_struct: opMINUSMINUS */ +#line 521 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[0].i).lineNumber; (yyval.asn).token = opMINUSMINUS; (yyval.asn).expr = FloatNode::alloc( (yyvsp[0].i).lineNumber, 1 ); } -#line 2924 "CMDgram.c" +#line 2946 "CMDgram.c" break; - case 124: /* assign_op_struct: opPLASN expr */ -#line 521 "CMDgram.y" + case 125: /* assign_op_struct: opPLASN expr */ +#line 523 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '+'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2930 "CMDgram.c" +#line 2952 "CMDgram.c" break; - case 125: /* assign_op_struct: opMIASN expr */ -#line 523 "CMDgram.y" + case 126: /* assign_op_struct: opMIASN expr */ +#line 525 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '-'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2936 "CMDgram.c" +#line 2958 "CMDgram.c" break; - case 126: /* assign_op_struct: opMLASN expr */ -#line 525 "CMDgram.y" + case 127: /* assign_op_struct: opMLASN expr */ +#line 527 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '*'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2942 "CMDgram.c" +#line 2964 "CMDgram.c" break; - case 127: /* assign_op_struct: opDVASN expr */ -#line 527 "CMDgram.y" + case 128: /* assign_op_struct: opDVASN expr */ +#line 529 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '/'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2948 "CMDgram.c" +#line 2970 "CMDgram.c" break; - case 128: /* assign_op_struct: opMODASN expr */ -#line 529 "CMDgram.y" + case 129: /* assign_op_struct: opMODASN expr */ +#line 531 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '%'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2954 "CMDgram.c" +#line 2976 "CMDgram.c" break; - case 129: /* assign_op_struct: opANDASN expr */ -#line 531 "CMDgram.y" + case 130: /* assign_op_struct: opANDASN expr */ +#line 533 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '&'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2960 "CMDgram.c" +#line 2982 "CMDgram.c" break; - case 130: /* assign_op_struct: opXORASN expr */ -#line 533 "CMDgram.y" + case 131: /* assign_op_struct: opXORASN expr */ +#line 535 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '^'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2966 "CMDgram.c" +#line 2988 "CMDgram.c" break; - case 131: /* assign_op_struct: opORASN expr */ -#line 535 "CMDgram.y" + case 132: /* assign_op_struct: opORASN expr */ +#line 537 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '|'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2972 "CMDgram.c" +#line 2994 "CMDgram.c" break; - case 132: /* assign_op_struct: opSLASN expr */ -#line 537 "CMDgram.y" + case 133: /* assign_op_struct: opSLASN expr */ +#line 539 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = opSHL; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2978 "CMDgram.c" +#line 3000 "CMDgram.c" break; - case 133: /* assign_op_struct: opSRASN expr */ -#line 539 "CMDgram.y" + case 134: /* assign_op_struct: opSRASN expr */ +#line 541 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = opSHR; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2984 "CMDgram.c" +#line 3006 "CMDgram.c" break; - case 134: /* stmt_expr: funcall_expr */ -#line 544 "CMDgram.y" + case 135: /* stmt_expr: funcall_expr */ +#line 546 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2990 "CMDgram.c" +#line 3012 "CMDgram.c" break; - case 135: /* stmt_expr: assert_expr */ -#line 546 "CMDgram.y" + case 136: /* stmt_expr: assert_expr */ +#line 548 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2996 "CMDgram.c" +#line 3018 "CMDgram.c" break; - case 136: /* stmt_expr: object_decl */ -#line 548 "CMDgram.y" + case 137: /* stmt_expr: object_decl */ +#line 550 "CMDgram.y" { (yyval.expr) = (yyvsp[0].od); } -#line 3002 "CMDgram.c" +#line 3024 "CMDgram.c" break; - case 137: /* stmt_expr: VAR '=' expr */ -#line 550 "CMDgram.y" + case 138: /* stmt_expr: VAR '=' expr */ +#line 552 "CMDgram.y" { (yyval.expr) = AssignExprNode::alloc( (yyvsp[-2].s).lineNumber, (yyvsp[-2].s).value, NULL, (yyvsp[0].expr)); } -#line 3008 "CMDgram.c" +#line 3030 "CMDgram.c" break; - case 138: /* stmt_expr: VAR '[' aidx_expr ']' '=' expr */ -#line 552 "CMDgram.y" + case 139: /* stmt_expr: VAR '[' aidx_expr ']' '=' expr */ +#line 554 "CMDgram.y" { (yyval.expr) = AssignExprNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-5].s).value, (yyvsp[-3].expr), (yyvsp[0].expr)); } -#line 3014 "CMDgram.c" +#line 3036 "CMDgram.c" break; - case 139: /* stmt_expr: VAR assign_op_struct */ -#line 554 "CMDgram.y" + case 140: /* stmt_expr: VAR assign_op_struct */ +#line 556 "CMDgram.y" { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[-1].s).lineNumber, (yyvsp[-1].s).value, NULL, (yyvsp[0].asn).expr, (yyvsp[0].asn).token); } -#line 3020 "CMDgram.c" +#line 3042 "CMDgram.c" break; - case 140: /* stmt_expr: VAR '[' aidx_expr ']' assign_op_struct */ -#line 556 "CMDgram.y" + case 141: /* stmt_expr: VAR '[' aidx_expr ']' assign_op_struct */ +#line 558 "CMDgram.y" { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[-4].s).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].asn).expr, (yyvsp[0].asn).token); } -#line 3026 "CMDgram.c" +#line 3048 "CMDgram.c" break; - case 141: /* stmt_expr: slot_acc assign_op_struct */ -#line 558 "CMDgram.y" + case 142: /* stmt_expr: slot_acc assign_op_struct */ +#line 560 "CMDgram.y" { (yyval.expr) = SlotAssignOpNode::alloc( (yyvsp[-1].slot).lineNumber, (yyvsp[-1].slot).object, (yyvsp[-1].slot).slotName, (yyvsp[-1].slot).array, (yyvsp[0].asn).token, (yyvsp[0].asn).expr); } -#line 3032 "CMDgram.c" +#line 3054 "CMDgram.c" break; - case 142: /* stmt_expr: slot_acc '=' expr */ -#line 560 "CMDgram.y" + case 143: /* stmt_expr: slot_acc '=' expr */ +#line 562 "CMDgram.y" { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[-2].slot).lineNumber, (yyvsp[-2].slot).object, (yyvsp[-2].slot).array, (yyvsp[-2].slot).slotName, (yyvsp[0].expr)); } -#line 3038 "CMDgram.c" +#line 3060 "CMDgram.c" break; - case 143: /* stmt_expr: slot_acc '=' '{' expr_list '}' */ -#line 562 "CMDgram.y" + case 144: /* stmt_expr: slot_acc '=' '{' expr_list '}' */ +#line 564 "CMDgram.y" { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[-4].slot).lineNumber, (yyvsp[-4].slot).object, (yyvsp[-4].slot).array, (yyvsp[-4].slot).slotName, (yyvsp[-1].expr)); } -#line 3044 "CMDgram.c" +#line 3066 "CMDgram.c" break; - case 144: /* funcall_expr: IDENT '(' expr_list_decl ')' */ -#line 567 "CMDgram.y" + case 145: /* funcall_expr: IDENT '(' expr_list_decl ')' */ +#line 569 "CMDgram.y" { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, NULL, (yyvsp[-1].expr), false); } -#line 3050 "CMDgram.c" +#line 3072 "CMDgram.c" break; - case 145: /* funcall_expr: IDENT opCOLONCOLON IDENT '(' expr_list_decl ')' */ -#line 569 "CMDgram.y" + case 146: /* funcall_expr: IDENT opCOLONCOLON IDENT '(' expr_list_decl ')' */ +#line 571 "CMDgram.y" { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-5].s).value, (yyvsp[-1].expr), false); } -#line 3056 "CMDgram.c" +#line 3078 "CMDgram.c" break; - case 146: /* funcall_expr: expr '.' IDENT '(' expr_list_decl ')' */ -#line 571 "CMDgram.y" + case 147: /* funcall_expr: expr '.' IDENT '(' expr_list_decl ')' */ +#line 573 "CMDgram.y" { (yyvsp[-5].expr)->append((yyvsp[-1].expr)); (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-5].expr)->dbgLineNumber, (yyvsp[-3].s).value, NULL, (yyvsp[-5].expr), true); } -#line 3062 "CMDgram.c" +#line 3084 "CMDgram.c" break; - case 147: /* assert_expr: rwASSERT '(' expr ')' */ -#line 581 "CMDgram.y" + case 148: /* assert_expr: rwASSERT '(' expr ')' */ +#line 583 "CMDgram.y" { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[-3].i).lineNumber, (yyvsp[-1].expr), NULL ); } -#line 3068 "CMDgram.c" +#line 3090 "CMDgram.c" break; - case 148: /* assert_expr: rwASSERT '(' expr ',' STRATOM ')' */ -#line 583 "CMDgram.y" + case 149: /* assert_expr: rwASSERT '(' expr ',' STRATOM ')' */ +#line 585 "CMDgram.y" { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[-5].i).lineNumber, (yyvsp[-3].expr), (yyvsp[-1].str).value ); } -#line 3074 "CMDgram.c" +#line 3096 "CMDgram.c" break; - case 149: /* expr_list_decl: %empty */ -#line 588 "CMDgram.y" + case 150: /* expr_list_decl: %empty */ +#line 590 "CMDgram.y" { (yyval.expr) = NULL; } -#line 3080 "CMDgram.c" +#line 3102 "CMDgram.c" break; - case 150: /* expr_list_decl: expr_list */ -#line 590 "CMDgram.y" + case 151: /* expr_list_decl: expr_list */ +#line 592 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3086 "CMDgram.c" +#line 3108 "CMDgram.c" break; - case 151: /* expr_list: expr */ -#line 595 "CMDgram.y" + case 152: /* expr_list: expr */ +#line 597 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3092 "CMDgram.c" +#line 3114 "CMDgram.c" break; - case 152: /* expr_list: expr_list ',' expr */ -#line 597 "CMDgram.y" + case 153: /* expr_list: expr_list ',' expr */ +#line 599 "CMDgram.y" { ((yyvsp[-2].expr))->append((yyvsp[0].expr)); (yyval.expr) = (yyvsp[-2].expr); } -#line 3098 "CMDgram.c" +#line 3120 "CMDgram.c" break; - case 153: /* slot_assign_list_opt: %empty */ -#line 602 "CMDgram.y" + case 154: /* slot_assign_list_opt: %empty */ +#line 604 "CMDgram.y" { (yyval.slist) = NULL; } -#line 3104 "CMDgram.c" +#line 3126 "CMDgram.c" break; - case 154: /* slot_assign_list_opt: slot_assign_list */ -#line 604 "CMDgram.y" + case 155: /* slot_assign_list_opt: slot_assign_list */ +#line 606 "CMDgram.y" { (yyval.slist) = (yyvsp[0].slist); } -#line 3110 "CMDgram.c" +#line 3132 "CMDgram.c" break; - case 155: /* slot_assign_list: slot_assign */ -#line 609 "CMDgram.y" + case 156: /* slot_assign_list: slot_assign */ +#line 611 "CMDgram.y" { (yyval.slist) = (yyvsp[0].slist); } -#line 3116 "CMDgram.c" +#line 3138 "CMDgram.c" break; - case 156: /* slot_assign_list: slot_assign_list slot_assign */ -#line 611 "CMDgram.y" + case 157: /* slot_assign_list: slot_assign_list slot_assign */ +#line 613 "CMDgram.y" { (yyvsp[-1].slist)->append((yyvsp[0].slist)); (yyval.slist) = (yyvsp[-1].slist); } -#line 3122 "CMDgram.c" +#line 3144 "CMDgram.c" break; - case 157: /* slot_assign: IDENT '=' expr ';' */ -#line 616 "CMDgram.y" + case 158: /* slot_assign: IDENT '=' expr ';' */ +#line 618 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-3].s).lineNumber, NULL, NULL, (yyvsp[-3].s).value, (yyvsp[-1].expr)); } -#line 3128 "CMDgram.c" +#line 3150 "CMDgram.c" break; - case 158: /* slot_assign: TYPEIDENT IDENT '=' expr ';' */ -#line 618 "CMDgram.y" + case 159: /* slot_assign: TYPEIDENT IDENT '=' expr ';' */ +#line 620 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-4].i).lineNumber, NULL, NULL, (yyvsp[-3].s).value, (yyvsp[-1].expr), (yyvsp[-4].i).value); } -#line 3134 "CMDgram.c" +#line 3156 "CMDgram.c" break; - case 159: /* slot_assign: rwDATABLOCK '=' expr ';' */ -#line 620 "CMDgram.y" + case 160: /* slot_assign: rwDATABLOCK '=' expr ';' */ +#line 622 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-3].i).lineNumber, NULL, NULL, StringTable->insert("datablock"), (yyvsp[-1].expr)); } -#line 3140 "CMDgram.c" +#line 3162 "CMDgram.c" break; - case 160: /* slot_assign: IDENT '[' aidx_expr ']' '=' expr ';' */ -#line 622 "CMDgram.y" + case 161: /* slot_assign: IDENT '[' aidx_expr ']' '=' expr ';' */ +#line 624 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-6].s).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-6].s).value, (yyvsp[-1].expr)); } -#line 3146 "CMDgram.c" +#line 3168 "CMDgram.c" break; - case 161: /* slot_assign: TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';' */ -#line 624 "CMDgram.y" + case 162: /* slot_assign: TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';' */ +#line 626 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-7].i).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-6].s).value, (yyvsp[-1].expr), (yyvsp[-7].i).value); } -#line 3152 "CMDgram.c" +#line 3174 "CMDgram.c" break; - case 162: /* aidx_expr: expr */ -#line 629 "CMDgram.y" + case 163: /* aidx_expr: expr */ +#line 631 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3158 "CMDgram.c" +#line 3180 "CMDgram.c" break; - case 163: /* aidx_expr: aidx_expr ',' expr */ -#line 631 "CMDgram.y" + case 164: /* aidx_expr: aidx_expr ',' expr */ +#line 633 "CMDgram.y" { (yyval.expr) = CommaCatExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3164 "CMDgram.c" +#line 3186 "CMDgram.c" break; -#line 3168 "CMDgram.c" +#line 3190 "CMDgram.c" default: break; } @@ -3367,7 +3389,7 @@ yyparse (void) return yyresult; } -#line 633 "CMDgram.y" +#line 635 "CMDgram.y" int diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index cdf5b2e47a..0a4a0609d1 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1537,8 +1537,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case TypeReqFloat: stack[_STK].setFloat((*vec)[index].getFloat()); break; - case TypeReqString: case TypeReqVector: + stack[_STK].setVector((*vec)[index].getVector()); + break; + case TypeReqString: case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; @@ -2389,21 +2391,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi // Element is right above vector on the stack ConsoleValue elem = stack[_STK + 1]; - - // if this is a vector loop its value. - if (elem.type == cvVector) - { - Vector* embedVec = elem.getVector(); - for (U32 v = 0; v < embedVec->size(); v++) - { - vec->push_back((*embedVec)[v]); - } - } - else - { - // Push element into vector - vec->push_back(elem); - } + // Push element into vector + vec->push_back(elem); break; } From 97fc1d7f6808ff896b548f04c2f91147e7dd0383 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Thu, 2 Oct 2025 16:52:09 +0100 Subject: [PATCH 10/33] cleanup and fixes cleanup and some fixes before nested vectors --- Engine/source/console/console.h | 63 +++++- Engine/source/console/torquescript/ast.h | 3 + .../source/console/torquescript/astNodes.cpp | 181 +++++++----------- .../console/torquescript/compiledEval.cpp | 21 +- 4 files changed, 142 insertions(+), 126 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 08eed1b8b2..b040fdb81e 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -302,7 +302,68 @@ class ConsoleValue TORQUE_FORCEINLINE Vector* getVector() const { - return (type == cvVector) ? static_cast*>(dataPtr) : NULL; + if (type == cvVector) + return static_cast*>(dataPtr); + + Vector* newVec = new Vector(); + switch (type) + { + case cvInteger: + { + ConsoleValue cv; + cv.setInt(i); + newVec->push_back(cv); + break; + } + case cvFloat: + { + ConsoleValue cv; + cv.setFloat(f); + newVec->push_back(cv); + break; + } + case cvSTEntry: + case cvString: + { + if (s && *s) + { + // Split by whitespace + const char* walk = s; + while (*walk) + { + while (*walk && dIsspace(*walk)) + walk++; + + if (!*walk) break; + + const char* start = walk; + while (*walk && !dIsspace(*walk)) + walk++; + + U32 len = walk - start; + char* word = new char[len + 1]; + dStrncpy(word, start, len); + word[len] = 0; + + ConsoleValue cv; + cv.setString(word); + newVec->push_back(cv); + + delete[] word; + } + } + break; + } + case cvNULL: + // Leave empty vector + break; + + default: + // Fallback: treat as empty + break; + } + + return newVec; } TORQUE_FORCEINLINE const char* getString() const diff --git a/Engine/source/console/torquescript/ast.h b/Engine/source/console/torquescript/ast.h index 8acbf251dd..08ffcdb746 100644 --- a/Engine/source/console/torquescript/ast.h +++ b/Engine/source/console/torquescript/ast.h @@ -156,6 +156,9 @@ struct VectorIndexNode : ExprNode U32 compile(CodeStream& codeStream, U32 ip, TypeReq type) override; TypeReq getPreferredType() override { return TypeReqNone; } DBG_STMT_TYPE(VectorIndexNode); + + ExprNode* getBase() const { return base; } + ExprNode* getIndex() const { return index; } }; struct ReturnStmtNode : StmtNode diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 1b31d6c96f..95ee6bc667 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -401,7 +401,10 @@ U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) U32 VectorIndexNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { // Compile base expression as vector - ip = base->compile(codeStream, ip, TypeReqVector); + if (VectorIndexNode* innerVec = dynamic_cast(base)) + ip = innerVec->compile(codeStream, ip, TypeReqVector); + else + ip = base->compile(codeStream, ip, TypeReqVector); // Compile index ip = index->compile(codeStream, ip, TypeReqUInt); @@ -710,48 +713,40 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) bool isGlobal = varName[0] == '$'; bool isVector = arrayIndex; - if (isVector) + if (isVector || isGlobal) { - if (dynamic_cast(arrayIndex)) + if (isVector) { - type = TypeReqString; - codeStream.emit(OP_LOADIMMED_IDENT); - codeStream.emitSTE(varName); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY); - codeStream.emit(OP_POP_STK); - } - else - { - if (isGlobal) + if (dynamic_cast(arrayIndex)) { - codeStream.emit(OP_SETCURVAR); + type = TypeReqString; + codeStream.emit(OP_LOADIMMED_IDENT); codeStream.emitSTE(varName); - codeStream.emit(OP_LOADVAR_VECTOR); + + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY); + codeStream.emit(OP_POP_STK); } else { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); - } + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); + codeStream.emit(OP_LOADVAR_VECTOR); - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - codeStream.emit(type); + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(type); - return codeStream.tell(); + return codeStream.tell(); + } + } + else + { + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); } - } - - if (!isVector) - { - codeStream.emit(OP_SETCURVAR); - codeStream.emitSTE(varName); - } - if (isGlobal) - { switch (type) { case TypeReqUInt: @@ -763,9 +758,6 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) case TypeReqString: codeStream.emit(OP_LOADVAR_STR); break; - case TypeReqVector: - codeStream.emit(OP_LOADVAR_VECTOR); - break; case TypeReqNone: break; default: @@ -778,7 +770,6 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { case TypeReqUInt: codeStream.emit(OP_LOAD_LOCAL_VAR_UINT); break; case TypeReqFloat: codeStream.emit(OP_LOAD_LOCAL_VAR_FLT); break; - case TypeReqVector: codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); break; default: codeStream.emit(OP_LOAD_LOCAL_VAR_STR); } @@ -792,14 +783,15 @@ TypeReq VarNode::getPreferredType() { bool globalScope = varName[0] == '$'; TypeReq actType = TypeReqNone; + bool isVector = arrayIndex; - if (!globalScope) + if (!globalScope && !isVector) { actType = getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); } - bool isVector = arrayIndex; - return isVector ? TypeReqVector : actType; + + return isVector || globalScope ? TypeReqNone : actType; } //------------------------------------------------------------ @@ -1001,56 +993,56 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) bool isGlobal = varName[0] == '$'; bool isVector = arrayIndex; - if (isVector) + if (isVector || isGlobal) { - if (dynamic_cast(arrayIndex)) - { - codeStream.emit(OP_LOADIMMED_IDENT); - codeStream.emitSTE(varName); - - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); - } - else + if (isVector) { - - if (isGlobal) + if (dynamic_cast(arrayIndex)) { - codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emit(OP_LOADIMMED_IDENT); codeStream.emitSTE(varName); - codeStream.emit(OP_LOADVAR_VECTOR); + + //codeStream.emit(OP_ADVANCE_STR); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); } else { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); - } + if (VectorIndexNode* vecIndex = dynamic_cast(arrayIndex)) + { + ip = vecIndex->compile(codeStream, ip, TypeReqVector); - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); - return ip; - } - } + ip = vecIndex->getIndex()->compile(codeStream, ip, TypeReqUInt); - if (!isVector) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - } + // emit the opcode to store the value in the nested vector + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + return ip; + } + + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_SAVEVAR_VECTOR); + codeStream.emit(OP_LOADVAR_VECTOR); + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + return ip; + } + } + else + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + } - if (isGlobal) - { switch (subType) { - case TypeReqString: codeStream.emit(OP_SAVEVAR_STR); break; - case TypeReqUInt: codeStream.emit(OP_SAVEVAR_UINT); break; - case TypeReqFloat: codeStream.emit(OP_SAVEVAR_FLT); break; - case TypeReqVector: codeStream.emit(OP_SAVEVAR_VECTOR); break; - default: break; + case TypeReqUInt: codeStream.emit(OP_SAVEVAR_UINT); break; + case TypeReqFloat: codeStream.emit(OP_SAVEVAR_FLT); break; + default: codeStream.emit(OP_SAVEVAR_STR); break; } } else @@ -1059,7 +1051,6 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { case TypeReqUInt: codeStream.emit(OP_SAVE_LOCAL_VAR_UINT); break; case TypeReqFloat: codeStream.emit(OP_SAVE_LOCAL_VAR_FLT); break; - case TypeReqVector: codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); break; default: codeStream.emit(OP_SAVE_LOCAL_VAR_STR); } codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber)); @@ -1188,18 +1179,10 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) else { // Load vector - if (isGlobal) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - codeStream.emit(OP_LOADVAR_VECTOR); - } - else - { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); - } - + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_SAVEVAR_VECTOR); + codeStream.emit(OP_LOADVAR_VECTOR); // Push index ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); @@ -1210,18 +1193,7 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); codeStream.emit(operand); - // Save element back - // Load vector - if (isGlobal) - { - codeStream.emit(OP_LOADVAR_VECTOR); - } - else - { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); - } - + codeStream.emit(OP_LOADVAR_VECTOR); ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); @@ -1234,11 +1206,6 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) ip = expr->compile(codeStream, ip, subType); - if (!isVector) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - } if (isGlobal) { diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 0a4a0609d1..bf453e4921 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1468,8 +1468,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (index >= vec->size()) { - vec->push_back(exprVal); - break; + vec->setSize(index + 1); } (*vec)[index] = exprVal; @@ -1499,12 +1498,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_LOADVAR_VECTOR: currentRegister = -1; stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); - if (!stack[_STK + 1].getVector()) - { - stack[_STK + 1].setVector(new Vector()); - stack[_STK + 1].getVector()->reserve(16); - Script::gEvalState.setVectorVariable(stack[_STK + 1].getVector()); - } _STK++; break; @@ -1515,19 +1508,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi TypeReq type = (TypeReq)code[ip++]; Vector* vec = vecVal.getVector(); - if (!vec) - { - Con::errorf("Tried to index a non-vector variable. Promoting to vector."); - vecVal.setVector(new Vector()); - vec = vecVal.getVector(); - vec->setSize(index + 1); - } - if (index >= vec->size()) { - vec->setSize(index + 1); + Con::errorf(ConsoleLogEntry::Script, "%s: Attempt to access an index larger than the size of the vector.", getFileLine(ip - 2)); + break; } - // Replace vector with the element at that index use the type. switch (type) { From f76c5917fc689ded2ad5739d41792f931a750183 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 3 Oct 2025 09:11:09 +0100 Subject: [PATCH 11/33] vector unit tests added some vector unit tests added a quick dirty fix to save the assigned var as a vector before it is used. this needs to be fixed properly.. --- .../source/console/torquescript/astNodes.cpp | 48 ++++++++++++++----- Engine/source/testing/ScriptTest.cpp | 33 +++++++++++++ 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 95ee6bc667..6a92ada215 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -154,7 +154,7 @@ U32 ReturnStmtNode::compileStmt(CodeStream& codeStream, U32 ip) else { TypeReq walkType = expr->getPreferredType(); - if (walkType == TypeReqNone) walkType = TypeReqString; + if (walkType == TypeReqNone || walkType == TypeReqVector) walkType = TypeReqString; ip = expr->compile(codeStream, ip, walkType); // Return the correct type @@ -730,9 +730,17 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } else { - codeStream.emit(OP_SETCURVAR); - codeStream.emitSTE(varName); - codeStream.emit(OP_LOADVAR_VECTOR); + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); @@ -758,6 +766,9 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) case TypeReqString: codeStream.emit(OP_LOADVAR_STR); break; + case TypeReqVector: + codeStream.emit(OP_LOADVAR_VECTOR); + break; case TypeReqNone: break; default: @@ -770,6 +781,7 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { case TypeReqUInt: codeStream.emit(OP_LOAD_LOCAL_VAR_UINT); break; case TypeReqFloat: codeStream.emit(OP_LOAD_LOCAL_VAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); break; default: codeStream.emit(OP_LOAD_LOCAL_VAR_STR); } @@ -783,15 +795,15 @@ TypeReq VarNode::getPreferredType() { bool globalScope = varName[0] == '$'; TypeReq actType = TypeReqNone; - bool isVector = arrayIndex; + bool isOldArray = dynamic_cast(arrayIndex); - if (!globalScope && !isVector) + if (!globalScope && !isOldArray) { actType = getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); } - return isVector || globalScope ? TypeReqNone : actType; + return globalScope || isOldArray ? TypeReqNone : actType; } //------------------------------------------------------------ @@ -997,6 +1009,8 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { if (isVector) { + subType = TypeReqVector; + if (dynamic_cast(arrayIndex)) { codeStream.emit(OP_LOADIMMED_IDENT); @@ -1022,10 +1036,20 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) return ip; } - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - codeStream.emit(OP_SAVEVAR_VECTOR); - codeStream.emit(OP_LOADVAR_VECTOR); + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_SAVEVAR_VECTOR); + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber)); + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + } ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); @@ -1042,6 +1066,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { case TypeReqUInt: codeStream.emit(OP_SAVEVAR_UINT); break; case TypeReqFloat: codeStream.emit(OP_SAVEVAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_SAVEVAR_VECTOR); break; default: codeStream.emit(OP_SAVEVAR_STR); break; } } @@ -1051,6 +1076,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { case TypeReqUInt: codeStream.emit(OP_SAVE_LOCAL_VAR_UINT); break; case TypeReqFloat: codeStream.emit(OP_SAVE_LOCAL_VAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); break; default: codeStream.emit(OP_SAVE_LOCAL_VAR_STR); } codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber)); diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 08212938e0..fb3d305cc4 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -269,6 +269,39 @@ TEST_F(ScriptTest, Basic_Function_Call_And_Local_Variable_Testing) ASSERT_EQ(staticCall.getInt(), 3); } +TEST_F(ScriptTest, VectorTests) +{ + ConsoleValue vecTest = RunScript(R"( + function doTest(){ + %arr = [1,2,3,4]; + return %arr[1]; + } + return doTest(); + )"); + ASSERT_EQ(vecTest.getInt(), 2); + + vecTest = RunScript(R"( + $arr = [[1,2,3],[4,5,6]]; + return $arr[1][1]; + )"); + ASSERT_EQ(vecTest.getInt(), 5); + + vecTest = RunScript(R"( + function doTest(){ + %vec1 = [1,2,3]; + %vec2 = [4,5,6]; + %vec3 = [7,8,9]; + %vecCombine = [%vec1,%vec2,%vec3]; + + return %vecCombine[2][1]; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 8); + +} + TEST_F(ScriptTest, Basic_Conditional_Statements) { ConsoleValue value = RunScript(R"( From d43ebe835f93e49672300da65671f56c3836e147 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 3 Oct 2025 09:13:18 +0100 Subject: [PATCH 12/33] Update astNodes.cpp do not change subtype....... --- Engine/source/console/torquescript/astNodes.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 6a92ada215..68e2e8d878 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1009,8 +1009,6 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { if (isVector) { - subType = TypeReqVector; - if (dynamic_cast(arrayIndex)) { codeStream.emit(OP_LOADIMMED_IDENT); @@ -1046,7 +1044,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) else { codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber)); + codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); } From 63c410db639d034a69b2e71a6eb94b24191ee73e Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 3 Oct 2025 09:41:00 +0100 Subject: [PATCH 13/33] Update astNodes.cpp if arrayIndex is a string, use the old way until we get vectors to use this. --- Engine/source/console/torquescript/astNodes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 68e2e8d878..74b49a2f16 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -717,7 +717,7 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { if (isVector) { - if (dynamic_cast(arrayIndex)) + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) { type = TypeReqString; codeStream.emit(OP_LOADIMMED_IDENT); @@ -1009,7 +1009,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { if (isVector) { - if (dynamic_cast(arrayIndex)) + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) { codeStream.emit(OP_LOADIMMED_IDENT); codeStream.emitSTE(varName); From a38cd452770132dc69f5bca7f6cd799eeb0482e3 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 4 Oct 2025 13:54:02 +0100 Subject: [PATCH 14/33] return conversion to opcode opcode does the conversion in all loads. Trying to convert in consoleValue was creating poor results --- Engine/source/console/console.h | 63 +------------------ .../source/console/torquescript/astNodes.cpp | 3 - .../console/torquescript/compiledEval.cpp | 15 ++++- Engine/source/testing/ScriptTest.cpp | 17 ++++- 4 files changed, 31 insertions(+), 67 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index b040fdb81e..08eed1b8b2 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -302,68 +302,7 @@ class ConsoleValue TORQUE_FORCEINLINE Vector* getVector() const { - if (type == cvVector) - return static_cast*>(dataPtr); - - Vector* newVec = new Vector(); - switch (type) - { - case cvInteger: - { - ConsoleValue cv; - cv.setInt(i); - newVec->push_back(cv); - break; - } - case cvFloat: - { - ConsoleValue cv; - cv.setFloat(f); - newVec->push_back(cv); - break; - } - case cvSTEntry: - case cvString: - { - if (s && *s) - { - // Split by whitespace - const char* walk = s; - while (*walk) - { - while (*walk && dIsspace(*walk)) - walk++; - - if (!*walk) break; - - const char* start = walk; - while (*walk && !dIsspace(*walk)) - walk++; - - U32 len = walk - start; - char* word = new char[len + 1]; - dStrncpy(word, start, len); - word[len] = 0; - - ConsoleValue cv; - cv.setString(word); - newVec->push_back(cv); - - delete[] word; - } - } - break; - } - case cvNULL: - // Leave empty vector - break; - - default: - // Fallback: treat as empty - break; - } - - return newVec; + return (type == cvVector) ? static_cast*>(dataPtr) : NULL; } TORQUE_FORCEINLINE const char* getString() const diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 74b49a2f16..f8f73180c4 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1038,13 +1038,10 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { codeStream.emit(OP_SETCURVAR_CREATE); codeStream.emitSTE(varName); - codeStream.emit(OP_SAVEVAR_VECTOR); codeStream.emit(OP_LOADVAR_VECTOR); } else { - codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index bf453e4921..54bcddfa92 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1498,6 +1498,12 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_LOADVAR_VECTOR: currentRegister = -1; stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); + if (!stack[_STK + 1].getVector()) + { + stack[_STK + 1].setVector(new Vector()); + stack[_STK + 1].getVector()->reserve(16); + Script::gEvalState.setVectorVariable(stack[_STK + 1].getVector()); + } _STK++; break; @@ -1508,6 +1514,14 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi TypeReq type = (TypeReq)code[ip++]; Vector* vec = vecVal.getVector(); + if (!vec) + { + Con::errorf("Tried to index a non-vector variable. Promoting to vector."); + vecVal.setVector(new Vector()); + vec = vecVal.getVector(); + vec->setSize(index + 1); + } + if (index >= vec->size()) { Con::errorf(ConsoleLogEntry::Script, "%s: Attempt to access an index larger than the size of the vector.", getFileLine(ip - 2)); @@ -1604,7 +1618,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (!stack[_STK + 1].getVector()) { stack[_STK + 1].setVector(new Vector()); - stack[_STK + 1].getVector()->reserve(16); Script::gEvalState.setLocalVectorVariable(reg, stack[_STK + 1].getVector()); } _STK++; diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index fb3d305cc4..5dab011672 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -297,9 +297,24 @@ TEST_F(ScriptTest, VectorTests) } return doTest(); )"); - + ASSERT_EQ(vecTest.getInt(), 8); + vecTest = RunScript(R"( + $count = 0; + function addToVector(%inWord){ + $wordList[$count] = %inWord; + $count++; + } + addToVector("test1"); + addToVector("test2"); + addToVector("test3"); + + return $wordList; + )"); + + ASSERT_STRCASEEQ(vecTest.getString(), "test1 test2 test3"); + } TEST_F(ScriptTest, Basic_Conditional_Statements) From 74805fde83816d4628c7c43b92343c9a73e538bc Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 4 Oct 2025 22:45:52 +0100 Subject: [PATCH 15/33] working up to world editor we are accessing vectors and assigning values before they are made, so need to route a way to make them in the assign expr node.. warning not pretty. --- .../source/console/torquescript/astNodes.cpp | 29 +++++++++++++++++-- .../console/torquescript/compiledEval.cpp | 7 ++--- .../source/console/torquescript/compiler.cpp | 4 +-- Engine/source/console/torquescript/compiler.h | 3 +- Engine/source/testing/ScriptTest.cpp | 18 ++++++++++-- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index f8f73180c4..555a43fc9b 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -739,7 +739,7 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) else { codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); } ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); @@ -795,6 +795,7 @@ TypeReq VarNode::getPreferredType() { bool globalScope = varName[0] == '$'; TypeReq actType = TypeReqNone; + bool isVector = arrayIndex; bool isOldArray = dynamic_cast(arrayIndex); if (!globalScope && !isOldArray) @@ -803,7 +804,12 @@ TypeReq VarNode::getPreferredType() } - return globalScope || isOldArray ? TypeReqNone : actType; + if (globalScope && isVector) + return TypeReqVector; + else if (isOldArray) + return TypeReqNone; + else + return actType; } //------------------------------------------------------------ @@ -1038,12 +1044,29 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { codeStream.emit(OP_SETCURVAR_CREATE); codeStream.emitSTE(varName); + Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); + if (!ent) + { + Con::gGlobalVars.add(varName); + } + codeStream.emit(OP_LOADVAR_VECTOR); } else { + if (Con::getFrameStack().size() > 0) + { + Dictionary::Entry* ent = Con::getCurrentStackFrame()->lookup(varName); + if (!ent) + { + codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); + Con::getCurrentStackFrame()->add(varName); + } + } + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); } ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 54bcddfa92..cc2391d80e 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1455,8 +1455,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_SETCURVAR_VECTOR_MEMBER: { U32 index = stack[_STK--].getInt(); // index - ConsoleValue& vecVal = stack[_STK--]; // vector - ConsoleValue exprVal = stack[_STK--]; // value + ConsoleValue& vecVal = stack[_STK--]; // vector + ConsoleValue exprVal = stack[_STK--]; // value Vector* vec = vecVal.getVector(); if (!vec) @@ -1473,10 +1473,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi (*vec)[index] = exprVal; - // leave the vector itself on stack (like other save ops) break; } - case OP_LOADVAR_UINT: currentRegister = -1; stack[_STK + 1].setInt(Script::gEvalState.getIntVariable()); @@ -1501,7 +1499,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (!stack[_STK + 1].getVector()) { stack[_STK + 1].setVector(new Vector()); - stack[_STK + 1].getVector()->reserve(16); Script::gEvalState.setVectorVariable(stack[_STK + 1].getVector()); } _STK++; diff --git a/Engine/source/console/torquescript/compiler.cpp b/Engine/source/console/torquescript/compiler.cpp index 890f47e98c..6b2d75c921 100644 --- a/Engine/source/console/torquescript/compiler.cpp +++ b/Engine/source/console/torquescript/compiler.cpp @@ -173,7 +173,7 @@ S32 FuncVars::assign(StringTableEntry var, TypeReq currentType, S32 lineNumber, return id; } -S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber) +S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber, TypeReq defaultType) { std::unordered_map::iterator found = vars.find(var); @@ -182,7 +182,7 @@ S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber) const char* str = avar("Script Warning: Variable %s referenced before used when compiling script. File: %s Line: %d", var, CodeBlock::smCurrentParser->getCurrentFile(), lineNumber); scriptErrorHandler(str); - return assign(var, TypeReqString, lineNumber, false); + return assign(var, defaultType, lineNumber, false); } return found->second.reg; diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index 2e2ffdcab2..58be495f36 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -106,6 +106,7 @@ namespace Compiler OP_SETCURVAR_ARRAY, OP_SETCURVAR_ARRAY_CREATE, OP_SETCURVAR_VECTOR_MEMBER, + OP_SETCURVAR_VECTOR_MEMBER_LOCAL, OP_LOADVAR_UINT,// 40 OP_LOADVAR_FLT, @@ -306,7 +307,7 @@ class FuncVars public: S32 assign(StringTableEntry var, TypeReq currentType, S32 lineNumber, bool isConstant = false); - S32 lookup(StringTableEntry var, S32 lineNumber); + S32 lookup(StringTableEntry var, S32 lineNumber, TypeReq defaultType = TypeReqString); TypeReq lookupType(StringTableEntry var, S32 lineNumber); diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 5dab011672..1eb56819d1 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -315,6 +315,20 @@ TEST_F(ScriptTest, VectorTests) ASSERT_STRCASEEQ(vecTest.getString(), "test1 test2 test3"); + vecTest = RunScript(R"( + $count = 0; + function buildVector(){ + %wordList[$count] = "test1"; + %wordList[$count++] = "test2"; + %wordList[$count++] = "test3"; + return %wordList; + } + + return buildVector(); + )"); + + ASSERT_STRCASEEQ(vecTest.getString(), "test1 test2 test3"); + } TEST_F(ScriptTest, Basic_Conditional_Statements) @@ -932,7 +946,7 @@ TEST_F(ScriptTest, Sugar_Syntax) ASSERT_EQ(valueArray.getInt(), 2); - ConsoleValue valueSetArray = RunScript(R"( + /*ConsoleValue valueSetArray = RunScript(R"( function a() { %vector[0] = "1 2 3"; @@ -942,7 +956,7 @@ TEST_F(ScriptTest, Sugar_Syntax) return a(); )"); - ASSERT_EQ(valueSetArray.getInt(), 5); + ASSERT_EQ(valueSetArray.getInt(), 5);*/ ConsoleValue valueStoreCalculated = RunScript(R"( function a() From 2ac9eb06a15ea99301977caf8f3fbdf2cca40c8a Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 5 Oct 2025 10:25:30 +0100 Subject: [PATCH 16/33] fix this is not a pretty fix for the problem but we needed a way to find local vars, because vectors can be assigned to and be updated before they have been created such as %vec[0] = "1"; we need a way to save these only once before they are accessed. --- Engine/source/console/torquescript/astNodes.cpp | 14 ++++++++++++-- Engine/source/console/torquescript/compiler.cpp | 11 +++++++++++ Engine/source/console/torquescript/compiler.h | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 555a43fc9b..50ba76bafb 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1052,9 +1052,9 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) codeStream.emit(OP_LOADVAR_VECTOR); } - else + else // the issue with locals is that the framestack only exists after the op_ codes are run. { - if (Con::getFrameStack().size() > 0) + if (Con::getFrameStack().size() > 0) // check the frame stack { Dictionary::Entry* ent = Con::getCurrentStackFrame()->lookup(varName); if (!ent) @@ -1064,6 +1064,16 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) Con::getCurrentStackFrame()->add(varName); } } + else if(getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. + { + codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); + } + else if(!getFuncVars(dbgLineNumber)->find(varName)) + { + codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); + } codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); diff --git a/Engine/source/console/torquescript/compiler.cpp b/Engine/source/console/torquescript/compiler.cpp index 6b2d75c921..2ba78ba204 100644 --- a/Engine/source/console/torquescript/compiler.cpp +++ b/Engine/source/console/torquescript/compiler.cpp @@ -188,6 +188,17 @@ S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber, TypeReq defaultType) return found->second.reg; } +bool FuncVars::find(StringTableEntry var) +{ + std::unordered_map::iterator found = vars.find(var); + if (found == vars.end()) + { + return false; + } + + return true; +} + TypeReq FuncVars::lookupType(StringTableEntry var, S32 lineNumber) { std::unordered_map::iterator found = vars.find(var); diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index 58be495f36..9c97fe625e 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -309,6 +309,8 @@ class FuncVars S32 lookup(StringTableEntry var, S32 lineNumber, TypeReq defaultType = TypeReqString); + bool find(StringTableEntry var); + TypeReq lookupType(StringTableEntry var, S32 lineNumber); inline S32 count() { return counter; } From c6ecb066918237606716e682442c795602394289 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 5 Oct 2025 11:30:31 +0100 Subject: [PATCH 17/33] dont need to save dont need to save local vars for vectors, they get converted to vectors and inside for loops these vars will save over and over again, this means the vector only keeps the last value --- .../source/console/torquescript/astNodes.cpp | 8 ++----- .../console/torquescript/compiledEval.cpp | 1 - Engine/source/testing/ScriptTest.cpp | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 50ba76bafb..2b3b6dc7ad 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1059,20 +1059,16 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) Dictionary::Entry* ent = Con::getCurrentStackFrame()->lookup(varName); if (!ent) { - codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); Con::getCurrentStackFrame()->add(varName); } } else if(getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. { - codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); } else if(!getFuncVars(dbgLineNumber)->find(varName)) { - codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber)); + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); } codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index cc2391d80e..8b2fa8810b 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1665,7 +1665,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi prevField = NULL; prevObject = NULL; curObject = NULL; - Script::gEvalState.setLocalVectorVariable(reg, stack[_STK].getVector()); break; diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 1eb56819d1..8fee254d8e 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -280,6 +280,29 @@ TEST_F(ScriptTest, VectorTests) )"); ASSERT_EQ(vecTest.getInt(), 2); + vecTest = RunScript(R"( + function doTest(){ + for ( %i = 0; %i < 7; %i++ ) + %val[%i] = %i; + + return %val[1]; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 1); + + vecTest = RunScript(R"( + function doTest(){ + for ( %i = 0; %i < 7; %i++ ) + $val[%i] = %i; + } + doTest(); + return $val[1]; + )"); + + ASSERT_EQ(vecTest.getInt(), 1); + vecTest = RunScript(R"( $arr = [[1,2,3],[4,5,6]]; return $arr[1][1]; From 2864417c5c5d78cd89de9d9ef0222d21f349c2ac Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 5 Oct 2025 11:44:18 +0100 Subject: [PATCH 18/33] Update astNodes.cpp ah.... local should only be using getFuncVars --- Engine/source/console/torquescript/astNodes.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 2b3b6dc7ad..ba913b3e94 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1054,15 +1054,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } else // the issue with locals is that the framestack only exists after the op_ codes are run. { - if (Con::getFrameStack().size() > 0) // check the frame stack - { - Dictionary::Entry* ent = Con::getCurrentStackFrame()->lookup(varName); - if (!ent) - { - Con::getCurrentStackFrame()->add(varName); - } - } - else if(getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. + if(getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. { getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); } From 65d84003b83b749a17520a6ceab588b9334df4a4 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 5 Oct 2025 14:14:36 +0100 Subject: [PATCH 19/33] return conversion, when index outside vector return default values Now if get vector is called on a string, it will return a vector containing each word of the string. Memory may leak here..... %str = "this message is long enough"; echo(%str[0]); --> "this"; Also when accessing a vector with an index larger than the vector will return a default value based on the type that is requested --- Engine/source/console/console.h | 26 ++++++++++++++++++- .../source/console/torquescript/astNodes.cpp | 5 ++-- .../console/torquescript/compiledEval.cpp | 20 +++++++++++++- Engine/source/testing/ScriptTest.cpp | 25 ++++++++++++++++++ 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 08eed1b8b2..4265e6b1da 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -302,7 +302,31 @@ class ConsoleValue TORQUE_FORCEINLINE Vector* getVector() const { - return (type == cvVector) ? static_cast*>(dataPtr) : NULL; + if (type == cvVector) + return static_cast*>(dataPtr); + + // Handle string or string table entry as a space-delimited vector + if (type == cvString || type == cvSTEntry) + { + Vector* vec = new Vector; + const char* str = s ? s : ""; + + char* buffer = dStrdup(str); + char* tok = dStrtok(buffer, " \t\r\n"); + + while (tok) + { + ConsoleValue elem; + elem.setString(tok); + vec->push_back(elem); + tok = dStrtok(NULL, " \t\r\n"); + } + + dFree(buffer); + return vec; + } + + return NULL; } TORQUE_FORCEINLINE const char* getString() const diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index ba913b3e94..b3ccdf14c4 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -805,7 +805,7 @@ TypeReq VarNode::getPreferredType() if (globalScope && isVector) - return TypeReqVector; + return TypeReqNone; else if (isOldArray) return TypeReqNone; else @@ -1047,7 +1047,8 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); if (!ent) { - Con::gGlobalVars.add(varName); + ent = Con::gGlobalVars.add(varName); + ent->setVectorValue(new Vector()); } codeStream.emit(OP_LOADVAR_VECTOR); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 8b2fa8810b..2e477fa160 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1521,7 +1521,25 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (index >= vec->size()) { - Con::errorf(ConsoleLogEntry::Script, "%s: Attempt to access an index larger than the size of the vector.", getFileLine(ip - 2)); + Con::warnf(ConsoleLogEntry::Script, "%s: Attempt to access an index larger than the size of the vector", getFileLine(ip - 2)); + switch (type) + { + case TypeReqUInt: + stack[_STK].setInt(-1); + break; + case TypeReqFloat: + stack[_STK].setFloat(0.0f); + break; + case TypeReqVector: + stack[_STK].setVector(new Vector()); + break; + case TypeReqString: + case TypeReqNone: + stack[_STK].setString(""); + break; + default: + break; + } break; } // Replace vector with the element at that index use the type. diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 8fee254d8e..d109153778 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -272,6 +272,31 @@ TEST_F(ScriptTest, Basic_Function_Call_And_Local_Variable_Testing) TEST_F(ScriptTest, VectorTests) { ConsoleValue vecTest = RunScript(R"( + $pref::SFX::channelVolume[1] = 1; + $pref::SFX::channelVolume[2] = 1; + $pref::SFX::channelVolume[3] = 1; + $pref::SFX::channelVolume[4] = 1; + $pref::SFX::channelVolume[5] = 1; + $pref::SFX::channelVolume[6] = 1; + $pref::SFX::channelVolume[7] = 1; + $pref::SFX::channelVolume[8] = 1; + + function setChannel(%channel, %volume){ + $channelVol[%channel] = %volume; + } + + function doTest(){ + for( %channel = 0; %channel <= 8; %channel ++ ) + setChannel(%channel, $pref::SFX::channelVolume[ %channel ] ); + } + + doTest(); + + return $channelVol[1]; + )"); + ASSERT_EQ(vecTest.getInt(), 1); + + vecTest = RunScript(R"( function doTest(){ %arr = [1,2,3,4]; return %arr[1]; From c87b83ae84013890e9e26ec060cb37e12fc24327 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 5 Oct 2025 22:34:43 +0100 Subject: [PATCH 20/33] test union vec added the vector to the union clearing the vector is not great so that cleanup is commented out. need to figure out a way to cleanup vectors properly --- Engine/source/console/console.cpp | 4 +- Engine/source/console/console.h | 30 +++++----- .../console/torquescript/compiledEval.cpp | 59 ++++++++----------- 3 files changed, 41 insertions(+), 52 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index d7f1a4f615..58148d7f71 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -71,11 +71,9 @@ char* ConsoleValue::convertToBuffer() const char* ConsoleValue::convertVectorToBuffer() const { - if (!getVector()) + if (vec->size() == 0) return (char*)""; - Vector* vec = getVector(); - // use FrameAllocator to avoid static overwrite FrameTemp outBuf(4096); outBuf[0] = 0; diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 4265e6b1da..8aadbf7754 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -140,6 +140,7 @@ class ConsoleValue { F64 f; S64 i; + Vector* vec; char* s; }; @@ -162,13 +163,17 @@ class ConsoleValue TORQUE_FORCEINLINE void cleanupData() { - if (type <= cvString && bufferLen > 0) + if (type <= ConsoleValueType::cvString && bufferLen > 0) { dFree(s); bufferLen = 0; } s = const_cast(StringTable->EmptyString()); + + /*if (type == ConsoleValueType::cvVector && vec->size() > 0) + vec->clear();*/ + type = ConsoleValueType::cvNULL; } ConsoleValue() @@ -202,10 +207,9 @@ class ConsoleValue setString(ref.s); break; case cvVector: - if (ref.dataPtr) + if (ref.vec) { - Vector* newVec = new Vector(*static_cast*>(ref.dataPtr)); - setVector(newVec); + setVector(ref.vec); } else setVector(new Vector()); @@ -224,10 +228,9 @@ class ConsoleValue std::cout << "Ref already cleared!"; break; case cvVector: - if (ref.dataPtr) + if (ref.vec) { - Vector* newVec = new Vector(*static_cast*>(ref.dataPtr)); - setVector(newVec); + setVector(ref.vec); } else { @@ -274,7 +277,7 @@ class ConsoleValue if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0.0f : dAtof(s); if (type == ConsoleValueType::cvVector) - return getVector()->size(); + return vec->size(); return dAtof(getConsoleData()); } @@ -289,26 +292,25 @@ class ConsoleValue if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0 : dAtoi(s); if (type == ConsoleValueType::cvVector) - return getVector()->size(); + return vec->size(); return dAtoi(getConsoleData()); } TORQUE_FORCEINLINE void setVector(Vector* v) { - cleanupData(); + //cleanupData(); type = cvVector; - dataPtr = v; + vec = v; } TORQUE_FORCEINLINE Vector* getVector() const { if (type == cvVector) - return static_cast*>(dataPtr); + return vec; // Handle string or string table entry as a space-delimited vector if (type == cvString || type == cvSTEntry) { - Vector* vec = new Vector; const char* str = s ? s : ""; char* buffer = dStrdup(str); @@ -356,7 +358,7 @@ class ConsoleValue if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? false : dAtob(s); if (type == ConsoleValueType::cvVector) - return getVector()->size() > 0; + return vec->size() > 0; return dAtob(getConsoleData()); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 2e477fa160..f330c7c2d4 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1455,7 +1455,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_SETCURVAR_VECTOR_MEMBER: { U32 index = stack[_STK--].getInt(); // index - ConsoleValue& vecVal = stack[_STK--]; // vector + ConsoleValue vecVal = stack[_STK--]; // vector ConsoleValue exprVal = stack[_STK--]; // value Vector* vec = vecVal.getVector(); @@ -1506,8 +1506,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_LOADVAR_VECTOR_MEMBER: { + currentRegister = -1; + U32 index = stack[_STK--].getInt(); // pop the index - ConsoleValue& vecVal = stack[_STK]; // this is the vector + ConsoleValue vecVal = stack[_STK]; // this is the vector + TypeReq type = (TypeReq)code[ip++]; Vector* vec = vecVal.getVector(); @@ -1519,48 +1522,34 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec->setSize(index + 1); } + // out-of-bounds handling + ConsoleValue elem; if (index >= vec->size()) { - Con::warnf(ConsoleLogEntry::Script, "%s: Attempt to access an index larger than the size of the vector", getFileLine(ip - 2)); + Con::warnf(ConsoleLogEntry::Script, "%s: Index out of bounds", getFileLine(ip - 2)); switch (type) { - case TypeReqUInt: - stack[_STK].setInt(-1); - break; - case TypeReqFloat: - stack[_STK].setFloat(0.0f); - break; - case TypeReqVector: - stack[_STK].setVector(new Vector()); - break; + case TypeReqUInt: elem.setInt(-1); break; + case TypeReqFloat: elem.setFloat(0.0f); break; + case TypeReqVector: elem.setVector(new Vector()); break; case TypeReqString: - case TypeReqNone: - stack[_STK].setString(""); - break; - default: - break; + case TypeReqNone: elem.setString(""); break; } - break; } - // Replace vector with the element at that index use the type. - switch (type) + else { - case TypeReqUInt: - stack[_STK].setInt((*vec)[index].getInt()); - break; - case TypeReqFloat: - stack[_STK].setFloat((*vec)[index].getFloat()); - break; - case TypeReqVector: - stack[_STK].setVector((*vec)[index].getVector()); - break; - case TypeReqString: - case TypeReqNone: - stack[_STK].setString((*vec)[index].getString()); - break; - default: - break; + const ConsoleValue& src = (*vec)[index]; // read-only + switch (type) + { + case TypeReqUInt: elem.setInt(src.getInt()); break; + case TypeReqFloat: elem.setFloat(src.getFloat()); break; + case TypeReqVector: elem.setVector(src.getVector()); break; + case TypeReqString: + case TypeReqNone: elem.setString(src.getString()); break; + } } + + stack[_STK] = elem; break; } From de58586d56e25638e91352701fb6374af68195d1 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 6 Oct 2025 14:01:38 +0100 Subject: [PATCH 21/33] unit tests passing still no clear for the vector --- Engine/source/console/console.h | 16 +++++++++--- .../console/torquescript/compiledEval.cpp | 26 ++++++++----------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 8aadbf7754..ec8c345cd6 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -140,7 +140,6 @@ class ConsoleValue { F64 f; S64 i; - Vector* vec; char* s; }; @@ -153,6 +152,7 @@ class ConsoleValue S32 type; U32 bufferLen; + Vector* vec; static DataChunker sConversionAllocator; @@ -171,8 +171,14 @@ class ConsoleValue s = const_cast(StringTable->EmptyString()); - /*if (type == ConsoleValueType::cvVector && vec->size() > 0) - vec->clear();*/ + if (type == ConsoleValueType::cvVector) + { + /*if (vec && vec->size() > 0) + { + vec->clear(); + vec = NULL; + }*/ + } type = ConsoleValueType::cvNULL; } @@ -181,6 +187,7 @@ class ConsoleValue type = ConsoleValueType::cvSTEntry; s = const_cast(StringTable->EmptyString()); bufferLen = 0; + vec = NULL; } ConsoleValue(const ConsoleValue& ref) @@ -188,6 +195,7 @@ class ConsoleValue type = ConsoleValueType::cvSTEntry; s = const_cast(StringTable->EmptyString()); bufferLen = 0; + vec = NULL; switch (ref.type) { @@ -298,7 +306,7 @@ class ConsoleValue TORQUE_FORCEINLINE void setVector(Vector* v) { - //cleanupData(); + cleanupData(); type = cvVector; vec = v; } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index f330c7c2d4..39a682f402 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1455,7 +1455,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_SETCURVAR_VECTOR_MEMBER: { U32 index = stack[_STK--].getInt(); // index - ConsoleValue vecVal = stack[_STK--]; // vector + ConsoleValue& vecVal = stack[_STK--]; // vector ConsoleValue exprVal = stack[_STK--]; // value Vector* vec = vecVal.getVector(); @@ -1506,10 +1506,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_LOADVAR_VECTOR_MEMBER: { - currentRegister = -1; - U32 index = stack[_STK--].getInt(); // pop the index - ConsoleValue vecVal = stack[_STK]; // this is the vector + ConsoleValue& vecVal = stack[_STK]; // this is the vector TypeReq type = (TypeReq)code[ip++]; @@ -1523,33 +1521,31 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } // out-of-bounds handling - ConsoleValue elem; if (index >= vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index out of bounds", getFileLine(ip - 2)); switch (type) { - case TypeReqUInt: elem.setInt(-1); break; - case TypeReqFloat: elem.setFloat(0.0f); break; - case TypeReqVector: elem.setVector(new Vector()); break; + case TypeReqUInt: stack[_STK].setInt(-1); break; + case TypeReqFloat: stack[_STK].setFloat(0.0f); break; + case TypeReqVector: stack[_STK].setVector(new Vector()); break; case TypeReqString: - case TypeReqNone: elem.setString(""); break; + case TypeReqNone: stack[_STK].setString(""); break; } } else { - const ConsoleValue& src = (*vec)[index]; // read-only + //ConsoleValueType indexType = (ConsoleValueType)(*vec)[index].getType(); switch (type) { - case TypeReqUInt: elem.setInt(src.getInt()); break; - case TypeReqFloat: elem.setFloat(src.getFloat()); break; - case TypeReqVector: elem.setVector(src.getVector()); break; + case TypeReqUInt: stack[_STK].setInt((*vec)[index].getInt()); break; + case TypeReqFloat: stack[_STK].setFloat((*vec)[index].getFloat()); break; + case TypeReqVector: stack[_STK].setVector((*vec)[index].getVector()); break; case TypeReqString: - case TypeReqNone: elem.setString(src.getString()); break; + case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; } } - stack[_STK] = elem; break; } From b6cea447bf71cc5086ae35449036b92998e999f7 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 6 Oct 2025 16:27:58 +0100 Subject: [PATCH 22/33] assign op and comments assign op node compiles and works for vectors now update comment blocks to describe what is happening. --- .../source/console/torquescript/astNodes.cpp | 262 +++++++++++++----- .../console/torquescript/compiledEval.cpp | 2 - Engine/source/testing/ScriptTest.cpp | 22 ++ 3 files changed, 213 insertions(+), 73 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index b3ccdf14c4..1f3df82e72 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -691,19 +691,41 @@ TypeReq FloatUnaryExprNode::getPreferredType() U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { - // if this has an arrayIndex... - // OP_LOADIMMED_IDENT - // varName - // OP_ADVANCE_STR - // evaluate arrayIndex TypeReqString - // OP_REWIND_STR - // OP_SETCURVAR_ARRAY - // OP_LOADVAR (type) - - // else - // OP_SETCURVAR - // varName - // OP_LOADVAR (type) +// If this variable has an array or vector index, the logic is: +// +// eval arrayIndex +// +// if arrayIndex is a string expression (CommaCatExprNode or TypeReqString): +// OP_LOADIMMED_IDENT +// varName +// eval arrayIndex as TypeReqString +// OP_REWIND_STR +// OP_SETCURVAR_ARRAY +// OP_POP_STK +// +// else if it's a numeric or vector index: +// if global ($var): +// OP_SETCURVAR +// varName +// OP_LOADVAR_VECTOR +// else (local): +// OP_LOAD_LOCAL_VAR_VECTOR +// (emit local var lookup index) +// +// eval arrayIndex as TypeReqUInt +// OP_LOADVAR_VECTOR_MEMBER +// emit requested type (TypeReqUInt / TypeReqFloat / TypeReqString / TypeReqVector) +// +// else if it's a global variable (starts with '$'): +// OP_SETCURVAR +// varName +// OP_LOADVAR_ +// +// else (local variable): +// OP_LOAD_LOCAL_VAR_ +// (emit local variable lookup index) +// +// return current instruction pointer if (type == TypeReqNone) return codeStream.tell(); @@ -980,30 +1002,57 @@ TypeReq ConstantNode::getPreferredType() U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { +// If it's an array or vector expression, the general logic is: +// +// eval expr +// +// if arrayIndex exists: +// if arrayIndex is a string expression (CommaCatExprNode or TypeReqString): +// OP_LOADIMMED_IDENT +// varName +// eval arrayIndex as string +// OP_REWIND_STR +// OP_SETCURVAR_ARRAY_CREATE +// (if type == TypeReqNone) OP_POP_STK +// +// else if arrayIndex is a VectorIndexNode: +// eval vector expression (TypeReqVector) +// eval index expression (TypeReqUInt) +// OP_SETCURVAR_VECTOR_MEMBER +// +// else: +// if global ($var): +// OP_SETCURVAR_CREATE +// varName +// ensure global var exists as vector +// OP_LOADVAR_VECTOR +// else (local): +// ensure local vector variable is registered in function scope +// OP_LOAD_LOCAL_VAR_VECTOR +// (emit var lookup index) +// eval arrayIndex as UInt +// OP_SETCURVAR_VECTOR_MEMBER +// +// (then return ip after setting vector member) +// +// else if it's a global variable (starts with '$'): +// OP_SETCURVAR_CREATE +// varName +// OP_SAVEVAR_ +// +// else (local variable): +// OP_SAVE_LOCAL_VAR_ +// (register or assign varName in local function scope) +// +// if type == TypeReqNone: +// OP_POP_STK + subType = expr->getPreferredType(); if (subType == TypeReqNone) subType = type; if (subType == TypeReqNone) subType = TypeReqString; - // if it's an array expr, the formula is: - // eval expr - // (push and pop if it's TypeReqString) OP_ADVANCE_STR - // OP_LOADIMMED_IDENT - // varName - // OP_ADVANCE_STR - // eval array - // OP_REWIND_STR - // OP_SETCURVAR_ARRAY_CREATE - // OP_TERMINATE_REWIND_STR - // OP_SAVEVAR - - //else - // eval expr - // OP_SETCURVAR_CREATE - // varname - // OP_SAVEVAR - precompileIdent(varName); ip = expr->compile(codeStream, ip, subType); @@ -1166,25 +1215,66 @@ static void getAssignOpTypeOp(S32 op, TypeReq& type, U32& operand) U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { - - // goes like this... - // eval expr as float or int - // if there's an arrayIndex - - // OP_LOADIMMED_IDENT - // varName - // OP_ADVANCE_STR - // eval arrayIndex stringwise - // OP_REWIND_STR - // OP_SETCURVAR_ARRAY_CREATE - - // else - // OP_SETCURVAR_CREATE - // varName - - // OP_LOADVAR_FLT or UINT - // operand - // OP_SAVEVAR_FLT or UINT +// If it's a vector, array, or global assignment, the general logic is: +// +// 1. Determine assignment type and operand: +// getAssignOpTypeOp(op, subType, operand) +// +// 2. Special case: local ++/-- with no vector or global +// - assign local var as float if not already +// - emit OP_INC and var index +// - return +// +// 3. If vector or global variable (arrayIndex exists or varName starts with '$'): +// +// a. String-based arrayIndex (CommaCatExprNode or TypeReqString): +// - Compile expr +// - OP_LOADIMMED_IDENT +// - varName +// - Compile arrayIndex as string +// - OP_REWIND_STR +// - OP_SETCURVAR_ARRAY_CREATE +// - (if type == TypeReqNone) OP_POP_STK +// +// b. Numeric vector/array index: +// - If global: +// - OP_SETCURVAR_CREATE +// - varName +// - Ensure global vector exists +// - OP_LOADVAR_VECTOR +// - Else (local): +// - Ensure local vector variable is registered +// - OP_LOAD_LOCAL_VAR_VECTOR +// - emit local var lookup index +// - Compile arrayIndex as UInt +// - OP_LOADVAR_VECTOR_MEMBER +// - emit subType +// - Compile expr +// - emit operand +// - emit OP_LOADVAR_FLT or OP_LOADVAR_UINT as needed +// - Reload vector +// - Recompile arrayIndex as UInt +// - OP_SETCURVAR_VECTOR_MEMBER +// - (if type == TypeReqNone) OP_POP_STK +// - return ip +// +// c. If no vector (but still global): +// - Compile expr +// - OP_SETCURVAR_CREATE +// - varName +// - OP_LOADVAR_FLT or OP_LOADVAR_UINT +// - emit operand +// - OP_SAVEVAR_FLT or OP_SAVEVAR_UINT +// +// 4. Else (local variable, not vector/array): +// - Compile expr +// - Assign/register local variable +// - OP_LOAD_LOCAL_VAR_FLT or OP_LOAD_LOCAL_VAR_UINT +// - emit operand +// - OP_SAVE_LOCAL_VAR_FLT or OP_SAVE_LOCAL_VAR_UINT +// +// 5. If type == TypeReqNone: +// - OP_POP_STK // conversion OP if necessary. getAssignOpTypeOp(op, subType, operand); @@ -1203,12 +1293,11 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } // Vector compound assignment branch - if (isVector) + if (isVector || isGlobal) { - ip = expr->compile(codeStream, ip, subType); - - if (dynamic_cast(arrayIndex)) + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) { + ip = expr->compile(codeStream, ip, subType); codeStream.emit(OP_LOADIMMED_IDENT); codeStream.emitSTE(varName); @@ -1221,23 +1310,54 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } else { - // Load vector - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - codeStream.emit(OP_SAVEVAR_VECTOR); - codeStream.emit(OP_LOADVAR_VECTOR); - // Push index - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); + if (!ent) + { + ent = Con::gGlobalVars.add(varName); + ent->setVectorValue(new Vector()); + } + codeStream.emit(OP_LOADVAR_VECTOR); + } + else // the issue with locals is that the framestack only exists after the op_ codes are run. + { + if (getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } + else if (!getFuncVars(dbgLineNumber)->find(varName)) + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } + + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); // Load element at index codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); codeStream.emit(subType); - - codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + ip = expr->compile(codeStream, ip, subType); codeStream.emit(operand); + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + + if (isGlobal) + { + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } - codeStream.emit(OP_LOADVAR_VECTOR); ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); if (type == TypeReqNone) @@ -1245,21 +1365,21 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) return codeStream.tell(); } - } - - ip = expr->compile(codeStream, ip, subType); + if (!isVector) + { + ip = expr->compile(codeStream, ip, subType); + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + } - if (isGlobal) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); codeStream.emit(operand); codeStream.emit((subType == TypeReqFloat) ? OP_SAVEVAR_FLT : OP_SAVEVAR_UINT); } else { + ip = expr->compile(codeStream, ip, subType); const bool isFloat = subType == TypeReqFloat; const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 39a682f402..1157160eea 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1472,7 +1472,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } (*vec)[index] = exprVal; - break; } case OP_LOADVAR_UINT: @@ -1545,7 +1544,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; } } - break; } diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index d109153778..710e8ebe67 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -377,6 +377,28 @@ TEST_F(ScriptTest, VectorTests) ASSERT_STRCASEEQ(vecTest.getString(), "test1 test2 test3"); + vecTest = RunScript(R"( + function doTest(){ + %vec1 = [1,2,3]; + + return %vec1[0]++; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 2); + + vecTest = RunScript(R"( + function doTest(){ + $vec1 = [1,2,3]; + + return $vec1[0]++; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 2); + } TEST_F(ScriptTest, Basic_Conditional_Statements) From de630b4a9516aefc8e7e8d674a339fb5b424be83 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 6 Oct 2025 16:36:32 +0100 Subject: [PATCH 23/33] Update astNodes.cpp woops arrayindex might be null in this case --- .../source/console/torquescript/astNodes.cpp | 112 +++++++++--------- 1 file changed, 57 insertions(+), 55 deletions(-) diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 1f3df82e72..184c9fdd0a 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1295,78 +1295,80 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) // Vector compound assignment branch if (isVector || isGlobal) { - if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) - { - ip = expr->compile(codeStream, ip, subType); - codeStream.emit(OP_LOADIMMED_IDENT); - codeStream.emitSTE(varName); - - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); - } - else + if (isVector) { - if (isGlobal) + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) { - codeStream.emit(OP_SETCURVAR_CREATE); + ip = expr->compile(codeStream, ip, subType); + codeStream.emit(OP_LOADIMMED_IDENT); codeStream.emitSTE(varName); - Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); - if (!ent) - { - ent = Con::gGlobalVars.add(varName); - ent->setVectorValue(new Vector()); - } - codeStream.emit(OP_LOADVAR_VECTOR); + //codeStream.emit(OP_ADVANCE_STR); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); } - else // the issue with locals is that the framestack only exists after the op_ codes are run. + else { - if (getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. + if (isGlobal) { - getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); + if (!ent) + { + ent = Con::gGlobalVars.add(varName); + ent->setVectorValue(new Vector()); + } + + codeStream.emit(OP_LOADVAR_VECTOR); } - else if (!getFuncVars(dbgLineNumber)->find(varName)) + else // the issue with locals is that the framestack only exists after the op_ codes are run. { - getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); - } + if (getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } + else if (!getFuncVars(dbgLineNumber)->find(varName)) + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); - } + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - // Load element at index - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - codeStream.emit(subType); - ip = expr->compile(codeStream, ip, subType); - codeStream.emit(operand); - codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + // Load element at index + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(subType); + ip = expr->compile(codeStream, ip, subType); + codeStream.emit(operand); + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); - if (isGlobal) - { - codeStream.emit(OP_LOADVAR_VECTOR); - } - else - { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); - codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); - } + if (isGlobal) + { + codeStream.emit(OP_LOADVAR_VECTOR); + } + else + { + codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); - return codeStream.tell(); + return codeStream.tell(); + } } - - if (!isVector) + else if (!isVector) { ip = expr->compile(codeStream, ip, subType); codeStream.emit(OP_SETCURVAR_CREATE); From cce7b67ccd175f711d0ae2e9cd7d6d9b2715e053 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 6 Oct 2025 17:03:59 +0100 Subject: [PATCH 24/33] Update ScriptTest.cpp these are working with no changes..........thats troubling --- Engine/source/testing/ScriptTest.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 710e8ebe67..5dbc0d2626 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -1016,7 +1016,7 @@ TEST_F(ScriptTest, Sugar_Syntax) ASSERT_EQ(valueArray.getInt(), 2); - /*ConsoleValue valueSetArray = RunScript(R"( + ConsoleValue valueSetArray = RunScript(R"( function a() { %vector[0] = "1 2 3"; @@ -1026,7 +1026,19 @@ TEST_F(ScriptTest, Sugar_Syntax) return a(); )"); - ASSERT_EQ(valueSetArray.getInt(), 5);*/ + ASSERT_EQ(valueSetArray.getInt(), 5); + + ConsoleValue valueSetArrayGlobal = RunScript(R"( + function a() + { + $vector[0] = "1 2 3"; + $vector[0].z = 5; + return $vector[0].z; + } + return a(); + )"); + + ASSERT_EQ(valueSetArrayGlobal.getInt(), 5); ConsoleValue valueStoreCalculated = RunScript(R"( function a() From 576e9faac2fecab652cd8a45a97ecc36f3045e87 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Tue, 7 Oct 2025 13:12:14 +0100 Subject: [PATCH 25/33] vector now clears Added ability to clear vectors from the console, frees memory no more leaks (yay) Replicated az's acid test in unit tests. --- Engine/source/console/console.h | 42 +++++++------- .../source/console/torquescript/astNodes.cpp | 6 +- .../console/torquescript/compiledEval.cpp | 39 +++++++------ Engine/source/testing/ScriptTest.cpp | 56 +++++++++++++++++++ 4 files changed, 102 insertions(+), 41 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index ec8c345cd6..e1abcebef7 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -153,7 +153,7 @@ class ConsoleValue S32 type; U32 bufferLen; Vector* vec; - + bool ownsVector; static DataChunker sConversionAllocator; char* convertToBuffer() const; @@ -173,11 +173,11 @@ class ConsoleValue if (type == ConsoleValueType::cvVector) { - /*if (vec && vec->size() > 0) + if (ownsVector && vec && vec->size() > 0) { vec->clear(); vec = NULL; - }*/ + } } type = ConsoleValueType::cvNULL; @@ -188,6 +188,7 @@ class ConsoleValue s = const_cast(StringTable->EmptyString()); bufferLen = 0; vec = NULL; + ownsVector = false; } ConsoleValue(const ConsoleValue& ref) @@ -196,7 +197,7 @@ class ConsoleValue s = const_cast(StringTable->EmptyString()); bufferLen = 0; vec = NULL; - + ownsVector = false; switch (ref.type) { case cvNULL: @@ -215,12 +216,7 @@ class ConsoleValue setString(ref.s); break; case cvVector: - if (ref.vec) - { - setVector(ref.vec); - } - else - setVector(new Vector()); + setVector(ref.vec); break; default: setConsoleData(ref.type, ref.dataPtr, ref.enumTable); @@ -236,14 +232,7 @@ class ConsoleValue std::cout << "Ref already cleared!"; break; case cvVector: - if (ref.vec) - { - setVector(ref.vec); - } - else - { - setVector(new Vector()); - } + setVector(ref.vec); break; case cvInteger: setInt(ref.i); @@ -304,11 +293,20 @@ class ConsoleValue return dAtoi(getConsoleData()); } + TORQUE_FORCEINLINE void setVectorRef(Vector* v) + { + ownsVector = false; + cleanupData(); + type = cvVector; + vec = v; + } + TORQUE_FORCEINLINE void setVector(Vector* v) { cleanupData(); type = cvVector; vec = v; + ownsVector = true; } TORQUE_FORCEINLINE Vector* getVector() const @@ -317,8 +315,12 @@ class ConsoleValue return vec; // Handle string or string table entry as a space-delimited vector + Vector* temp = new Vector(); if (type == cvString || type == cvSTEntry) { + if (s == StringTable->EmptyString()) + return NULL; + const char* str = s ? s : ""; char* buffer = dStrdup(str); @@ -328,12 +330,12 @@ class ConsoleValue { ConsoleValue elem; elem.setString(tok); - vec->push_back(elem); + temp->push_back(elem); tok = dStrtok(NULL, " \t\r\n"); } dFree(buffer); - return vec; + return temp; } return NULL; diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index 184c9fdd0a..f48eb5c6a5 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1104,11 +1104,7 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } else // the issue with locals is that the framestack only exists after the op_ codes are run. { - if(getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. - { - getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); - } - else if(!getFuncVars(dbgLineNumber)->find(varName)) + if(getFuncVars(dbgLineNumber)->count() == 0 || !getFuncVars(dbgLineNumber)->find(varName))// no frame stack, if func vars count is 0, save the var. { getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); } diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 1157160eea..d53570264d 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1494,12 +1494,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case OP_LOADVAR_VECTOR: currentRegister = -1; - stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); - if (!stack[_STK + 1].getVector()) + if (!Script::gEvalState.getVectorVariable()) { - stack[_STK + 1].setVector(new Vector()); - Script::gEvalState.setVectorVariable(stack[_STK + 1].getVector()); + Script::gEvalState.setVectorVariable(new Vector()); } + stack[_STK + 1].setVectorRef(Script::gEvalState.getVectorVariable()); _STK++; break; @@ -1527,7 +1526,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK].setInt(-1); break; case TypeReqFloat: stack[_STK].setFloat(0.0f); break; - case TypeReqVector: stack[_STK].setVector(new Vector()); break; + case TypeReqVector: stack[_STK].setVectorRef(new Vector()); break; case TypeReqString: case TypeReqNone: stack[_STK].setString(""); break; } @@ -1539,7 +1538,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK].setInt((*vec)[index].getInt()); break; case TypeReqFloat: stack[_STK].setFloat((*vec)[index].getFloat()); break; - case TypeReqVector: stack[_STK].setVector((*vec)[index].getVector()); break; + case TypeReqVector: stack[_STK].setVectorRef((*vec)[index].getVector()); break; case TypeReqString: case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; } @@ -1560,7 +1559,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi break; case OP_SAVEVAR_VECTOR: - Script::gEvalState.setVectorVariable(stack[_STK].getVector()); + Script::gEvalState.setVectorVariable(new Vector(*stack[_STK].getVector())); break; case OP_LOAD_LOCAL_VAR_UINT: @@ -1612,12 +1611,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi prevObject = NULL; curObject = NULL; - stack[_STK + 1].setVector(Script::gEvalState.getLocalVectorVariable(reg)); - if (!stack[_STK + 1].getVector()) + if (!Script::gEvalState.getLocalVectorVariable(reg)) { - stack[_STK + 1].setVector(new Vector()); - Script::gEvalState.setLocalVectorVariable(reg, stack[_STK + 1].getVector()); + Script::gEvalState.setLocalVectorVariable(reg, new Vector()); } + stack[_STK + 1].setVectorRef(Script::gEvalState.getLocalVectorVariable(reg)); _STK++; break; @@ -1666,7 +1664,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi prevField = NULL; prevObject = NULL; curObject = NULL; - Script::gEvalState.setLocalVectorVariable(reg, stack[_STK].getVector()); + Script::gEvalState.setLocalVectorVariable(reg, new Vector(*stack[_STK].getVector())); break; case OP_SETCUROBJECT: @@ -2368,7 +2366,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vecVal.getVector()->reserve(count); stack[++_STK] = vecVal; - break; } @@ -2376,6 +2373,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { // Vector must be at _STK ConsoleValue& vecVal = stack[_STK]; + ConsoleValue elem = stack[_STK+1]; Vector* vec = vecVal.getVector(); if (!vec) @@ -2385,10 +2383,19 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } // Element is right above vector on the stack - ConsoleValue elem = stack[_STK + 1]; // Push element into vector - vec->push_back(elem); - + if (elem.getType() == ConsoleValueType::cvVector) + { + // Store a reference to the same vector, not a deep copy + ConsoleValue ref; + ref.setVectorRef(new Vector(*elem.getVector())); + vec->push_back(ref); + } + else + { + // Regular copy for numbers, strings, etc. + vec->push_back(elem); + } break; } diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 5dbc0d2626..5e46b2adee 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -399,6 +399,62 @@ TEST_F(ScriptTest, VectorTests) ASSERT_EQ(vecTest.getInt(), 2); + vecTest = RunScript(R"( + function doTestAdd(%size){ + for ( %i = 0; %i < %size; %i++ ) + %val[%i] = %i; + + return %val; + } + + function doTest(){ + %bar = [[doTestAdd(3)], [doTestAdd(3)], [doTestAdd(3)]]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 0 1 2"); + + vecTest = RunScript(R"( + $vecSize = 0; + $val = ""; + function doTestAdd(%size){ + $vecSize = $val + %size; + for ( %i = 0; %i < $vecSize; %i++ ) + $val[%i] = %i; + + return $val; + } + + function doTest(){ + %bar = [[doTestAdd(3)], [doTestAdd(3)], [doTestAdd(3)]]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8"); + + vecTest = RunScript(R"( + $vecSize = 0; + $val = ""; + function doTestAdd(%size){ + $vecSize = $val + %size; + for ( %i = 0; %i < $vecSize; %i++ ) + $val[%i] = %i; + + return $val; + } + + function doTest(){ + %bar = [doTestAdd(3), doTestAdd(3), doTestAdd(3)]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8"); } TEST_F(ScriptTest, Basic_Conditional_Statements) From 4b2f3aa4218ba695b3cd9491ec6e132809c56299 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Tue, 7 Oct 2025 15:27:26 +0100 Subject: [PATCH 26/33] test with eval --- Engine/source/console/console.cpp | 10 +++--- Engine/source/console/console.h | 49 ++++++++++++++++++++-------- Engine/source/testing/ScriptTest.cpp | 22 +++++++++++++ 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 58148d7f71..02fd705d97 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -75,20 +75,20 @@ char* ConsoleValue::convertVectorToBuffer() const return (char*)""; // use FrameAllocator to avoid static overwrite - FrameTemp outBuf(4096); - outBuf[0] = 0; + char* buffer = static_cast(sConversionAllocator.alloc(4096)); + buffer[0] = 0; for (U32 v = 0; v < vec->size(); v++) { const char* elemStr = (*vec)[v].getString(); if (v > 0) - dStrcat(outBuf, " ", 4096); + dStrcat(buffer, " ", 4096); - dStrcat(outBuf, elemStr, 4096); + dStrcat(buffer, elemStr, 4096); } - return outBuf; + return buffer; } const char* ConsoleValue::getConsoleData() const diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index e1abcebef7..f4d77ccd03 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -315,27 +315,48 @@ class ConsoleValue return vec; // Handle string or string table entry as a space-delimited vector - Vector* temp = new Vector(); - if (type == cvString || type == cvSTEntry) + if (isNumberType() || isStringType()) { - if (s == StringTable->EmptyString()) - return NULL; - - const char* str = s ? s : ""; - - char* buffer = dStrdup(str); - char* tok = dStrtok(buffer, " \t\r\n"); + if (type == cvString || type == cvSTEntry) + { + if (s == StringTable->EmptyString()) + return NULL; + } - while (tok) + Vector* temp = new Vector(); + if (isNumberType()) { ConsoleValue elem; - elem.setString(tok); + if (type == cvFloat) + elem.setFloat(f); + else if (type == cvInteger) + elem.setInt(i); + temp->push_back(elem); - tok = dStrtok(NULL, " \t\r\n"); + return temp; } - dFree(buffer); - return temp; + if (type == cvString || type == cvSTEntry) + { + if (s == StringTable->EmptyString()) + return NULL; + + const char* str = s ? s : ""; + + char* buffer = dStrdup(str); + char* tok = dStrtok(buffer, " \t\r\n"); + + while (tok) + { + ConsoleValue elem; + elem.setString(tok); + temp->push_back(elem); + tok = dStrtok(NULL, " \t\r\n"); + } + + dFree(buffer); + return temp; + } } return NULL; diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 5e46b2adee..649d777059 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -455,6 +455,28 @@ TEST_F(ScriptTest, VectorTests) return doTest(); )"); ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8"); + + vecTest = RunScript(R"( + $val = ""; + function doTestAdd(%size){ + %stryng = "$val = [0"; + for (%i=0; %i<%size; %i++) + { + %stryng = %stryng @","@ %i; + } + %stryng = %stryng @"];"; + eval(%stryng); + return $val; + } + + function doTest(){ + %bar = [doTestAdd(3), doTestAdd(3), doTestAdd(3)]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 0 1 2 0 0 1 2 0 0 1 2"); } TEST_F(ScriptTest, Basic_Conditional_Statements) From ea74dae0bcfbc9d1f3dfc0d406653585bb476608 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 15:54:21 +0100 Subject: [PATCH 27/33] moar updated Split out setters and loads to be per scope this way vars do not delete vector value erroneously now able to clear the vector and delete it. --- Engine/source/console/console.cpp | 2 +- Engine/source/console/console.h | 33 +++- .../source/console/torquescript/astNodes.cpp | 58 +++--- .../console/torquescript/compiledEval.cpp | 174 +++++++++++++++--- Engine/source/console/torquescript/compiler.h | 3 + Engine/source/testing/ScriptTest.cpp | 37 +--- 6 files changed, 218 insertions(+), 89 deletions(-) diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 02fd705d97..6dc846b9fa 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -71,7 +71,7 @@ char* ConsoleValue::convertToBuffer() const char* ConsoleValue::convertVectorToBuffer() const { - if (vec->size() == 0) + if (!vec || vec->size() == 0) return (char*)""; // use FrameAllocator to avoid static overwrite diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index f4d77ccd03..dc5c2fcc38 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -33,7 +33,6 @@ #include "core/util/refBase.h" #endif #include - #include "core/util/str.h" #include "core/util/journal/journaledSignal.h" #include "core/stringTable.h" @@ -173,11 +172,14 @@ class ConsoleValue if (type == ConsoleValueType::cvVector) { - if (ownsVector && vec && vec->size() > 0) + if (ownsVector && vec) { vec->clear(); - vec = NULL; + delete vec; } + + vec = nullptr; + ownsVector = false; } type = ConsoleValueType::cvNULL; @@ -187,7 +189,7 @@ class ConsoleValue type = ConsoleValueType::cvSTEntry; s = const_cast(StringTable->EmptyString()); bufferLen = 0; - vec = NULL; + vec = nullptr; ownsVector = false; } @@ -196,7 +198,7 @@ class ConsoleValue type = ConsoleValueType::cvSTEntry; s = const_cast(StringTable->EmptyString()); bufferLen = 0; - vec = NULL; + vec = nullptr; ownsVector = false; switch (ref.type) { @@ -216,7 +218,8 @@ class ConsoleValue setString(ref.s); break; case cvVector: - setVector(ref.vec); + if (ref.vec) + setVectorRef(ref.vec); // copy-by-reference, no ownership break; default: setConsoleData(ref.type, ref.dataPtr, ref.enumTable); @@ -232,7 +235,8 @@ class ConsoleValue std::cout << "Ref already cleared!"; break; case cvVector: - setVector(ref.vec); + if (ref.vec) + setVectorRef(ref.vec); break; case cvInteger: setInt(ref.i); @@ -295,17 +299,26 @@ class ConsoleValue TORQUE_FORCEINLINE void setVectorRef(Vector* v) { - ownsVector = false; cleanupData(); type = cvVector; vec = v; + ownsVector = false; } TORQUE_FORCEINLINE void setVector(Vector* v) { cleanupData(); - type = cvVector; - vec = v; + type = ConsoleValueType::cvVector; + + if (v) + { + vec = new Vector(*v); + } + else + { + vec = new Vector(); + } + ownsVector = true; } diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index f48eb5c6a5..ef0377895e 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -405,7 +405,6 @@ U32 VectorIndexNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) ip = innerVec->compile(codeStream, ip, TypeReqVector); else ip = base->compile(codeStream, ip, TypeReqVector); - // Compile index ip = index->compile(codeStream, ip, TypeReqUInt); @@ -752,22 +751,29 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } else { + // Compile the index expression + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + + // Load the base vector if (isGlobal) { codeStream.emit(OP_SETCURVAR); codeStream.emitSTE(varName); - codeStream.emit(OP_LOADVAR_VECTOR); + } + + // Emit the correct vector member load opcode + if (isGlobal) + { + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_GLOBAL); + codeStream.emit(type); } else { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_LOCAL); + codeStream.emit(type); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - codeStream.emit(type); - return codeStream.tell(); } } @@ -1089,6 +1095,8 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) return ip; } + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + if (isGlobal) { codeStream.emit(OP_SETCURVAR_CREATE); @@ -1097,10 +1105,10 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) if (!ent) { ent = Con::gGlobalVars.add(varName); - ent->setVectorValue(new Vector()); + ent->setVectorValue(NULL); } - codeStream.emit(OP_LOADVAR_VECTOR); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_GLOBAL); } else // the issue with locals is that the framestack only exists after the op_ codes are run. { @@ -1109,12 +1117,10 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); } - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_LOCAL); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); return ip; } } @@ -1308,6 +1314,8 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) } else { + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + if (isGlobal) { codeStream.emit(OP_SETCURVAR_CREATE); @@ -1316,10 +1324,11 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) if (!ent) { ent = Con::gGlobalVars.add(varName); - ent->setVectorValue(new Vector()); + ent->setVectorValue(NULL); } - codeStream.emit(OP_LOADVAR_VECTOR); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_GLOBAL); + codeStream.emit(subType); } else // the issue with locals is that the framestack only exists after the op_ codes are run. { @@ -1332,32 +1341,29 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); } - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_LOCAL); + codeStream.emit(subType); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - // Load element at index - codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); - codeStream.emit(subType); ip = expr->compile(codeStream, ip, subType); codeStream.emit(operand); codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + if (isGlobal) { - codeStream.emit(OP_LOADVAR_VECTOR); + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_GLOBAL); } - else + else // the issue with locals is that the framestack only exists after the op_ codes are run. { - codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_LOCAL); codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); } - ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); - - codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); - if (type == TypeReqNone) codeStream.emit(OP_POP_STK); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index d53570264d..72aa544b59 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -362,7 +362,7 @@ const char *ExprEvalState::getStringVariable() Vector* ExprEvalState::getVectorVariable() { - return currentVariable ? currentVariable->getVectorValue() : nullptr; + return currentVariable ? currentVariable->getVectorValue() : NULL; } //------------------------------------------------------------ @@ -1462,7 +1462,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (!vec) { Con::errorf("Assigning to non-vector variable, promoting to a vector."); - vecVal.setVector(new Vector()); + vecVal.setVector(NULL); vec = vecVal.getVector(); } @@ -1474,6 +1474,50 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi (*vec)[index] = exprVal; break; } + case OP_SETCURVAR_VECTOR_MEMBER_GLOBAL: + { + currentRegister = -1; + U32 index = stack[_STK--].getInt(); // pop index + ConsoleValue exprVal = stack[_STK--]; // pop assigned value + + Vector* vec = Script::gEvalState.getVectorVariable(); + + if (!vec) + { + Script::gEvalState.setVectorVariable(NULL); + vec = Script::gEvalState.getVectorVariable(); + } + + // Grow vector if necessary + if (index >= vec->size()) + vec->setSize(index + 1); + + // Assign (deep copy) + (*vec)[index] = exprVal; + + break; + } + case OP_SETCURVAR_VECTOR_MEMBER_LOCAL: + { + U32 index = stack[_STK--].getInt(); // pop index + ConsoleValue exprVal = stack[_STK--]; // pop assigned value + reg = code[ip++]; // read the local variable register + currentRegister = reg; + + Vector* vec = Script::gEvalState.getLocalVectorVariable(reg); + if (!vec) + { + Script::gEvalState.setLocalVectorVariable(reg, NULL); + vec = Script::gEvalState.getLocalVectorVariable(reg); + } + + if (index >= vec->size()) + vec->setSize(index + 1); + + (*vec)[index] = exprVal; + + break; + } case OP_LOADVAR_UINT: currentRegister = -1; stack[_STK + 1].setInt(Script::gEvalState.getIntVariable()); @@ -1496,24 +1540,24 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi currentRegister = -1; if (!Script::gEvalState.getVectorVariable()) { - Script::gEvalState.setVectorVariable(new Vector()); + Script::gEvalState.setVectorVariable(NULL); } - stack[_STK + 1].setVectorRef(Script::gEvalState.getVectorVariable()); + stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); _STK++; break; case OP_LOADVAR_VECTOR_MEMBER: { - U32 index = stack[_STK--].getInt(); // pop the index - ConsoleValue& vecVal = stack[_STK]; // this is the vector - + U32 index = stack[_STK--].getInt(); // pop the index + ConsoleValue vecVal = stack[_STK]; // this is the vector + TypeReq type = (TypeReq)code[ip++]; Vector* vec = vecVal.getVector(); if (!vec) { Con::errorf("Tried to index a non-vector variable. Promoting to vector."); - vecVal.setVector(new Vector()); + vecVal.setVector(NULL); vec = vecVal.getVector(); vec->setSize(index + 1); } @@ -1526,7 +1570,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK].setInt(-1); break; case TypeReqFloat: stack[_STK].setFloat(0.0f); break; - case TypeReqVector: stack[_STK].setVectorRef(new Vector()); break; + case TypeReqVector: stack[_STK].setVector(NULL); break; case TypeReqString: case TypeReqNone: stack[_STK].setString(""); break; } @@ -1538,14 +1582,100 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK].setInt((*vec)[index].getInt()); break; case TypeReqFloat: stack[_STK].setFloat((*vec)[index].getFloat()); break; - case TypeReqVector: stack[_STK].setVectorRef((*vec)[index].getVector()); break; + case TypeReqVector: stack[_STK].setVector((*vec)[index].getVector()); break; case TypeReqString: case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; } } break; } + case OP_LOADVAR_VECTOR_MEMBER_GLOBAL: + { + U32 index = stack[_STK--].getInt(); // pop index + TypeReq type = (TypeReq)code[ip++]; + + // Grab global vector variable + Vector* vec = Script::gEvalState.getVectorVariable(); + if (!vec) + { + Script::gEvalState.setVectorVariable(NULL); + vec = Script::gEvalState.getVectorVariable(); + } + + if (index >= vec->size()) + { + Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt(-1); break; + case TypeReqFloat: stack[_STK + 1].setFloat(0.0f); break; + case TypeReqVector: stack[_STK + 1].setVector(NULL); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString(""); break; + } + } + else + { + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt((*vec)[index].getInt()); break; + case TypeReqFloat: stack[_STK + 1].setFloat((*vec)[index].getFloat()); break; + case TypeReqVector: stack[_STK + 1].setVector((*vec)[index].getVector()); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString((*vec)[index].getString()); break; + } + } + + _STK++; + break; + } + case OP_LOADVAR_VECTOR_MEMBER_LOCAL: + { + U32 index = stack[_STK--].getInt(); // pop index + TypeReq type = (TypeReq)code[ip++]; + + reg = code[ip++]; // local variable register index + currentRegister = reg; + + // See OP_SETCURVAR + prevField = NULL; + prevObject = NULL; + curObject = NULL; + + Vector* vec = Script::gEvalState.getLocalVectorVariable(reg); + if (!vec) + { + Script::gEvalState.setLocalVectorVariable(reg, NULL); + vec = Script::gEvalState.getLocalVectorVariable(reg); + } + if (index >= vec->size()) + { + Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt(-1); break; + case TypeReqFloat: stack[_STK + 1].setFloat(0.0f); break; + case TypeReqVector: stack[_STK + 1].setVector(NULL); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString(""); break; + } + } + else + { + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt((*vec)[index].getInt()); break; + case TypeReqFloat: stack[_STK + 1].setFloat((*vec)[index].getFloat()); break; + case TypeReqVector: stack[_STK + 1].setVector((*vec)[index].getVector()); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString((*vec)[index].getString()); break; + } + } + + _STK++; + break; + } case OP_SAVEVAR_UINT: Script::gEvalState.setIntVariable(stack[_STK].getInt()); break; @@ -1559,7 +1689,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi break; case OP_SAVEVAR_VECTOR: - Script::gEvalState.setVectorVariable(new Vector(*stack[_STK].getVector())); + Script::gEvalState.setVectorVariable(stack[_STK].getVector()); break; case OP_LOAD_LOCAL_VAR_UINT: @@ -1613,9 +1743,9 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (!Script::gEvalState.getLocalVectorVariable(reg)) { - Script::gEvalState.setLocalVectorVariable(reg, new Vector()); + Script::gEvalState.setLocalVectorVariable(reg, NULL); } - stack[_STK + 1].setVectorRef(Script::gEvalState.getLocalVectorVariable(reg)); + stack[_STK + 1].setVector(Script::gEvalState.getLocalVectorVariable(reg)); _STK++; break; @@ -1664,7 +1794,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi prevField = NULL; prevObject = NULL; curObject = NULL; - Script::gEvalState.setLocalVectorVariable(reg, new Vector(*stack[_STK].getVector())); + Script::gEvalState.setLocalVectorVariable(reg, stack[_STK].getVector()); break; case OP_SETCUROBJECT: @@ -2361,22 +2491,18 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { U32 count = code[ip++]; - ConsoleValue vecVal; - vecVal.setVector(new Vector()); - vecVal.getVector()->reserve(count); - - stack[++_STK] = vecVal; + stack[_STK + 1].setVector(NULL); + stack[_STK + 1].getVector()->reserve(count); + _STK++; break; } case OP_VECTOR_PUSH: { // Vector must be at _STK - ConsoleValue& vecVal = stack[_STK]; ConsoleValue elem = stack[_STK+1]; - Vector* vec = vecVal.getVector(); - if (!vec) + if (!stack[_STK].getVector()) { Con::printf("ERROR: OP_VECTOR_PUSH vector is null at _STK=%d", _STK); break; @@ -2389,12 +2515,12 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi // Store a reference to the same vector, not a deep copy ConsoleValue ref; ref.setVectorRef(new Vector(*elem.getVector())); - vec->push_back(ref); + stack[_STK].getVector()->push_back(ref); } else { // Regular copy for numbers, strings, etc. - vec->push_back(elem); + stack[_STK].getVector()->push_back(elem); } break; } diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index 9c97fe625e..ea3a4615b9 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -106,6 +106,7 @@ namespace Compiler OP_SETCURVAR_ARRAY, OP_SETCURVAR_ARRAY_CREATE, OP_SETCURVAR_VECTOR_MEMBER, + OP_SETCURVAR_VECTOR_MEMBER_GLOBAL, OP_SETCURVAR_VECTOR_MEMBER_LOCAL, OP_LOADVAR_UINT,// 40 @@ -113,6 +114,8 @@ namespace Compiler OP_LOADVAR_STR, OP_LOADVAR_VECTOR, OP_LOADVAR_VECTOR_MEMBER, + OP_LOADVAR_VECTOR_MEMBER_GLOBAL, + OP_LOADVAR_VECTOR_MEMBER_LOCAL, OP_SAVEVAR_UINT, OP_SAVEVAR_FLT, diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 649d777059..8de4efa7ed 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -306,24 +306,25 @@ TEST_F(ScriptTest, VectorTests) ASSERT_EQ(vecTest.getInt(), 2); vecTest = RunScript(R"( - function doTest(){ + function test2(){ for ( %i = 0; %i < 7; %i++ ) %val[%i] = %i; return %val[1]; } - return doTest(); + return test2(); )"); - ASSERT_EQ(vecTest.getInt(), 1); vecTest = RunScript(R"( function doTest(){ for ( %i = 0; %i < 7; %i++ ) $val[%i] = %i; + + return $val[1]; } - doTest(); - return $val[1]; + + return doTest(); )"); ASSERT_EQ(vecTest.getInt(), 1); @@ -420,7 +421,7 @@ TEST_F(ScriptTest, VectorTests) $vecSize = 0; $val = ""; function doTestAdd(%size){ - $vecSize = $val + %size; + $vecSize = $vecSize + %size; for ( %i = 0; %i < $vecSize; %i++ ) $val[%i] = %i; @@ -436,31 +437,11 @@ TEST_F(ScriptTest, VectorTests) )"); ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8"); - vecTest = RunScript(R"( - $vecSize = 0; - $val = ""; - function doTestAdd(%size){ - $vecSize = $val + %size; - for ( %i = 0; %i < $vecSize; %i++ ) - $val[%i] = %i; - - return $val; - } - - function doTest(){ - %bar = [doTestAdd(3), doTestAdd(3), doTestAdd(3)]; - return %bar; - } - - return doTest(); - )"); - ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8"); - vecTest = RunScript(R"( $val = ""; function doTestAdd(%size){ %stryng = "$val = [0"; - for (%i=0; %i<%size; %i++) + for (%i=1; %i<%size; %i++) { %stryng = %stryng @","@ %i; } @@ -476,7 +457,7 @@ TEST_F(ScriptTest, VectorTests) return doTest(); )"); - ASSERT_STRCASEEQ(vecTest.getString(), "0 0 1 2 0 0 1 2 0 0 1 2"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 0 1 2"); } TEST_F(ScriptTest, Basic_Conditional_Statements) From 034cbe7ad89036fe64f4390ac028da3039bff853 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 16:31:19 +0100 Subject: [PATCH 28/33] use shared_ptr so much easier......... --- Engine/source/console/console.h | 49 +++--------- Engine/source/console/consoleInternal.h | 4 +- .../source/console/torquescript/astNodes.cpp | 2 - .../console/torquescript/compiledEval.cpp | 74 +++++++++---------- .../source/console/torquescript/evalState.h | 8 +- 5 files changed, 48 insertions(+), 89 deletions(-) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index dc5c2fcc38..93578d8c07 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -151,8 +151,7 @@ class ConsoleValue S32 type; U32 bufferLen; - Vector* vec; - bool ownsVector; + std::shared_ptr> vec; static DataChunker sConversionAllocator; char* convertToBuffer() const; @@ -172,14 +171,7 @@ class ConsoleValue if (type == ConsoleValueType::cvVector) { - if (ownsVector && vec) - { - vec->clear(); - delete vec; - } - - vec = nullptr; - ownsVector = false; + vec.reset(); } type = ConsoleValueType::cvNULL; @@ -189,8 +181,6 @@ class ConsoleValue type = ConsoleValueType::cvSTEntry; s = const_cast(StringTable->EmptyString()); bufferLen = 0; - vec = nullptr; - ownsVector = false; } ConsoleValue(const ConsoleValue& ref) @@ -198,8 +188,7 @@ class ConsoleValue type = ConsoleValueType::cvSTEntry; s = const_cast(StringTable->EmptyString()); bufferLen = 0; - vec = nullptr; - ownsVector = false; + switch (ref.type) { case cvNULL: @@ -218,8 +207,7 @@ class ConsoleValue setString(ref.s); break; case cvVector: - if (ref.vec) - setVectorRef(ref.vec); // copy-by-reference, no ownership + setVector(ref.vec); // copy-by-reference, no ownership break; default: setConsoleData(ref.type, ref.dataPtr, ref.enumTable); @@ -235,8 +223,7 @@ class ConsoleValue std::cout << "Ref already cleared!"; break; case cvVector: - if (ref.vec) - setVectorRef(ref.vec); + setVector(ref.vec); break; case cvInteger: setInt(ref.i); @@ -297,32 +284,14 @@ class ConsoleValue return dAtoi(getConsoleData()); } - TORQUE_FORCEINLINE void setVectorRef(Vector* v) - { - cleanupData(); - type = cvVector; - vec = v; - ownsVector = false; - } - - TORQUE_FORCEINLINE void setVector(Vector* v) + TORQUE_FORCEINLINE void setVector(std::shared_ptr> v) { cleanupData(); type = ConsoleValueType::cvVector; - - if (v) - { - vec = new Vector(*v); - } - else - { - vec = new Vector(); - } - - ownsVector = true; + vec = v; } - TORQUE_FORCEINLINE Vector* getVector() const + TORQUE_FORCEINLINE std::shared_ptr> getVector() const { if (type == cvVector) return vec; @@ -336,7 +305,7 @@ class ConsoleValue return NULL; } - Vector* temp = new Vector(); + std::shared_ptr> temp = std::make_shared>(); if (isNumberType()) { ConsoleValue elem; diff --git a/Engine/source/console/consoleInternal.h b/Engine/source/console/consoleInternal.h index f2c4dac72b..e1d7830248 100644 --- a/Engine/source/console/consoleInternal.h +++ b/Engine/source/console/consoleInternal.h @@ -338,7 +338,7 @@ class Dictionary return value.getString(); } - inline Vector* getVectorValue() + inline std::shared_ptr> getVectorValue() { return value.getVector(); } @@ -412,7 +412,7 @@ class Dictionary notify->trigger(); } - void setVectorValue(Vector* val) + void setVectorValue(std::shared_ptr> val) { if (mIsConstant) { diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index ef0377895e..c78ff2cad2 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -1105,7 +1105,6 @@ U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) if (!ent) { ent = Con::gGlobalVars.add(varName); - ent->setVectorValue(NULL); } codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_GLOBAL); @@ -1324,7 +1323,6 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) if (!ent) { ent = Con::gGlobalVars.add(varName); - ent->setVectorValue(NULL); } codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_GLOBAL); diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 72aa544b59..cb246d7330 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -360,7 +360,7 @@ const char *ExprEvalState::getStringVariable() return currentVariable ? currentVariable->getStringValue() : ""; } -Vector* ExprEvalState::getVectorVariable() +std::shared_ptr> ExprEvalState::getVectorVariable() { return currentVariable ? currentVariable->getVectorValue() : NULL; } @@ -385,7 +385,7 @@ void ExprEvalState::setStringVariable(const char *val) currentVariable->setStringValue(val); } -void ExprEvalState::setVectorVariable(Vector* val) +void ExprEvalState::setVectorVariable(std::shared_ptr> val) { AssertFatal(currentVariable != NULL, "Invalid evaluator state - trying to set null variable!"); currentVariable->setVectorValue(val); @@ -1458,7 +1458,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi ConsoleValue& vecVal = stack[_STK--]; // vector ConsoleValue exprVal = stack[_STK--]; // value - Vector* vec = vecVal.getVector(); + std::shared_ptr> vec = vecVal.getVector(); if (!vec) { Con::errorf("Assigning to non-vector variable, promoting to a vector."); @@ -1471,7 +1471,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec->setSize(index + 1); } - (*vec)[index] = exprVal; + vec->insert(index, exprVal); + vec.reset(); break; } case OP_SETCURVAR_VECTOR_MEMBER_GLOBAL: @@ -1480,11 +1481,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi U32 index = stack[_STK--].getInt(); // pop index ConsoleValue exprVal = stack[_STK--]; // pop assigned value - Vector* vec = Script::gEvalState.getVectorVariable(); + std::shared_ptr> vec = Script::gEvalState.getVectorVariable(); if (!vec) { - Script::gEvalState.setVectorVariable(NULL); + Script::gEvalState.setVectorVariable(std::make_shared>()); vec = Script::gEvalState.getVectorVariable(); } @@ -1492,9 +1493,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (index >= vec->size()) vec->setSize(index + 1); - // Assign (deep copy) - (*vec)[index] = exprVal; - + vec->insert(index, exprVal); + vec.reset(); break; } case OP_SETCURVAR_VECTOR_MEMBER_LOCAL: @@ -1504,18 +1504,18 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi reg = code[ip++]; // read the local variable register currentRegister = reg; - Vector* vec = Script::gEvalState.getLocalVectorVariable(reg); + std::shared_ptr> vec = Script::gEvalState.getLocalVectorVariable(reg); if (!vec) { - Script::gEvalState.setLocalVectorVariable(reg, NULL); + Script::gEvalState.setLocalVectorVariable(reg, std::make_shared>()); vec = Script::gEvalState.getLocalVectorVariable(reg); } if (index >= vec->size()) vec->setSize(index + 1); - (*vec)[index] = exprVal; - + vec->insert(index, exprVal); + vec.reset(); break; } case OP_LOADVAR_UINT: @@ -1540,7 +1540,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi currentRegister = -1; if (!Script::gEvalState.getVectorVariable()) { - Script::gEvalState.setVectorVariable(NULL); + Script::gEvalState.setVectorVariable(std::make_shared>()); } stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); _STK++; @@ -1553,11 +1553,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi TypeReq type = (TypeReq)code[ip++]; - Vector* vec = vecVal.getVector(); + std::shared_ptr> vec = vecVal.getVector(); if (!vec) { Con::errorf("Tried to index a non-vector variable. Promoting to vector."); - vecVal.setVector(NULL); + vecVal.setVector(std::make_shared>()); vec = vecVal.getVector(); vec->setSize(index + 1); } @@ -1570,7 +1570,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK].setInt(-1); break; case TypeReqFloat: stack[_STK].setFloat(0.0f); break; - case TypeReqVector: stack[_STK].setVector(NULL); break; + case TypeReqVector: stack[_STK].setVector(std::make_shared>()); break; case TypeReqString: case TypeReqNone: stack[_STK].setString(""); break; } @@ -1587,6 +1587,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; } } + + vec.reset(); break; } case OP_LOADVAR_VECTOR_MEMBER_GLOBAL: @@ -1595,10 +1597,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi TypeReq type = (TypeReq)code[ip++]; // Grab global vector variable - Vector* vec = Script::gEvalState.getVectorVariable(); + std::shared_ptr> vec = Script::gEvalState.getVectorVariable(); if (!vec) { - Script::gEvalState.setVectorVariable(NULL); + Script::gEvalState.setVectorVariable(std::make_shared>()); vec = Script::gEvalState.getVectorVariable(); } @@ -1609,7 +1611,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK + 1].setInt(-1); break; case TypeReqFloat: stack[_STK + 1].setFloat(0.0f); break; - case TypeReqVector: stack[_STK + 1].setVector(NULL); break; + case TypeReqVector: stack[_STK + 1].setVector(std::make_shared>()); break; case TypeReqString: case TypeReqNone: stack[_STK + 1].setString(""); break; } @@ -1625,7 +1627,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case TypeReqNone: stack[_STK + 1].setString((*vec)[index].getString()); break; } } - + vec.reset(); _STK++; break; } @@ -1642,10 +1644,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi prevObject = NULL; curObject = NULL; - Vector* vec = Script::gEvalState.getLocalVectorVariable(reg); + std::shared_ptr> vec = Script::gEvalState.getLocalVectorVariable(reg); if (!vec) { - Script::gEvalState.setLocalVectorVariable(reg, NULL); + Script::gEvalState.setLocalVectorVariable(reg, std::make_shared>()); vec = Script::gEvalState.getLocalVectorVariable(reg); } @@ -1656,7 +1658,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { case TypeReqUInt: stack[_STK + 1].setInt(-1); break; case TypeReqFloat: stack[_STK + 1].setFloat(0.0f); break; - case TypeReqVector: stack[_STK + 1].setVector(NULL); break; + case TypeReqVector: stack[_STK + 1].setVector(std::make_shared>()); break; case TypeReqString: case TypeReqNone: stack[_STK + 1].setString(""); break; } @@ -1672,7 +1674,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi case TypeReqNone: stack[_STK + 1].setString((*vec)[index].getString()); break; } } - + vec.reset(); _STK++; break; } @@ -1743,7 +1745,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (!Script::gEvalState.getLocalVectorVariable(reg)) { - Script::gEvalState.setLocalVectorVariable(reg, NULL); + Script::gEvalState.setLocalVectorVariable(reg, std::make_shared>()); } stack[_STK + 1].setVector(Script::gEvalState.getLocalVectorVariable(reg)); _STK++; @@ -2491,7 +2493,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { U32 count = code[ip++]; - stack[_STK + 1].setVector(NULL); + stack[_STK + 1].setVector(std::make_shared>()); stack[_STK + 1].getVector()->reserve(count); _STK++; break; @@ -2508,20 +2510,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi break; } - // Element is right above vector on the stack - // Push element into vector - if (elem.getType() == ConsoleValueType::cvVector) - { - // Store a reference to the same vector, not a deep copy - ConsoleValue ref; - ref.setVectorRef(new Vector(*elem.getVector())); - stack[_STK].getVector()->push_back(ref); - } - else - { - // Regular copy for numbers, strings, etc. - stack[_STK].getVector()->push_back(elem); - } + stack[_STK].getVector()->push_back(elem); + if (elem.getType() == cvVector) + elem.getVector().reset(); + break; } diff --git a/Engine/source/console/torquescript/evalState.h b/Engine/source/console/torquescript/evalState.h index d5c405d0f7..54a1fcd6a4 100644 --- a/Engine/source/console/torquescript/evalState.h +++ b/Engine/source/console/torquescript/evalState.h @@ -42,11 +42,11 @@ class ExprEvalState S32 getIntVariable(); F64 getFloatVariable(); const char *getStringVariable(); - Vector* getVectorVariable(); + std::shared_ptr> getVectorVariable(); void setIntVariable(S32 val); void setFloatVariable(F64 val); void setStringVariable(const char *str); - void setVectorVariable(Vector* val); + void setVectorVariable(std::shared_ptr> val); TORQUE_FORCEINLINE S32 getLocalIntVariable(S32 reg) { @@ -63,7 +63,7 @@ class ExprEvalState return currentRegisterArray->values[reg].getString(); } - TORQUE_FORCEINLINE Vector* getLocalVectorVariable(S32 reg) + TORQUE_FORCEINLINE std::shared_ptr> getLocalVectorVariable(S32 reg) { return currentRegisterArray->values[reg].getVector(); } @@ -88,7 +88,7 @@ class ExprEvalState currentRegisterArray->values[reg].setStringTableEntry(val); } - TORQUE_FORCEINLINE void setLocalVectorVariable(S32 reg, Vector* val) + TORQUE_FORCEINLINE void setLocalVectorVariable(S32 reg, std::shared_ptr> val) { currentRegisterArray->values[reg].setVector(val); } From d6b03c77ff1228da1cdd833527e2e7e8a9e41bef Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 17:00:18 +0100 Subject: [PATCH 29/33] Update console.h fix linux --- Engine/source/console/console.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 93578d8c07..3a75edf07c 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -32,6 +32,9 @@ #ifndef _REFBASE_H_ #include "core/util/refBase.h" #endif +#ifndef __RESOURCE_H__ +#include "core/resource.h" +#endif #include #include "core/util/str.h" #include "core/util/journal/journaledSignal.h" From ad9af5dfadd8158c11005c2c4ea6ce8716c19ade Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 18:01:41 +0100 Subject: [PATCH 30/33] Update compiledEval.cpp few more cleanups, remove the deep copy protocols just use address --- .../console/torquescript/compiledEval.cpp | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index cb246d7330..173a04c6e8 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1462,7 +1462,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi if (!vec) { Con::errorf("Assigning to non-vector variable, promoting to a vector."); - vecVal.setVector(NULL); + vecVal.setVector(std::make_shared>()); vec = vecVal.getVector(); } @@ -1577,14 +1577,13 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } else { - //ConsoleValueType indexType = (ConsoleValueType)(*vec)[index].getType(); switch (type) { - case TypeReqUInt: stack[_STK].setInt((*vec)[index].getInt()); break; - case TypeReqFloat: stack[_STK].setFloat((*vec)[index].getFloat()); break; - case TypeReqVector: stack[_STK].setVector((*vec)[index].getVector()); break; + case TypeReqUInt: stack[_STK].setInt(vec->address()[index].getInt()); break; + case TypeReqFloat: stack[_STK].setFloat(vec->address()[index].getFloat()); break; + case TypeReqVector: stack[_STK].setVector(vec->address()[index].getVector()); break; case TypeReqString: - case TypeReqNone: stack[_STK].setString((*vec)[index].getString()); break; + case TypeReqNone: stack[_STK].setString(vec->address()[index].getString()); break; } } @@ -1620,11 +1619,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { switch (type) { - case TypeReqUInt: stack[_STK + 1].setInt((*vec)[index].getInt()); break; - case TypeReqFloat: stack[_STK + 1].setFloat((*vec)[index].getFloat()); break; - case TypeReqVector: stack[_STK + 1].setVector((*vec)[index].getVector()); break; + case TypeReqUInt: stack[_STK + 1].setInt(vec->address()[index].getInt()); break; + case TypeReqFloat: stack[_STK + 1].setFloat(vec->address()[index].getFloat()); break; + case TypeReqVector: stack[_STK + 1].setVector(vec->address()[index].getVector()); break; case TypeReqString: - case TypeReqNone: stack[_STK + 1].setString((*vec)[index].getString()); break; + case TypeReqNone: stack[_STK + 1].setString(vec->address()[index].getString()); break; } } vec.reset(); @@ -1667,11 +1666,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi { switch (type) { - case TypeReqUInt: stack[_STK + 1].setInt((*vec)[index].getInt()); break; - case TypeReqFloat: stack[_STK + 1].setFloat((*vec)[index].getFloat()); break; - case TypeReqVector: stack[_STK + 1].setVector((*vec)[index].getVector()); break; + case TypeReqUInt: stack[_STK + 1].setInt(vec->address()[index].getInt()); break; + case TypeReqFloat: stack[_STK + 1].setFloat(vec->address()[index].getFloat()); break; + case TypeReqVector: stack[_STK + 1].setVector(vec->address()[index].getVector()); break; case TypeReqString: - case TypeReqNone: stack[_STK + 1].setString((*vec)[index].getString()); break; + case TypeReqNone: stack[_STK + 1].setString(vec->address()[index].getString()); break; } } vec.reset(); From de18464c441b2c26b5a5372798e1e16b857df480 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 20:28:02 +0100 Subject: [PATCH 31/33] idiot moment..... --- .../console/torquescript/compiledEval.cpp | 20 +++++++++---------- Engine/source/testing/ScriptTest.cpp | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 173a04c6e8..7f7aecc8e3 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1466,9 +1466,9 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = vecVal.getVector(); } - if (index >= vec->size()) + if (index > vec->size()) { - vec->setSize(index + 1); + vec->setSize(index); } vec->insert(index, exprVal); @@ -1490,8 +1490,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } // Grow vector if necessary - if (index >= vec->size()) - vec->setSize(index + 1); + if (index > vec->size()) + vec->setSize(index); vec->insert(index, exprVal); vec.reset(); @@ -1511,8 +1511,8 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getLocalVectorVariable(reg); } - if (index >= vec->size()) - vec->setSize(index + 1); + if (index > vec->size()) + vec->setSize(index); vec->insert(index, exprVal); vec.reset(); @@ -1559,11 +1559,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Con::errorf("Tried to index a non-vector variable. Promoting to vector."); vecVal.setVector(std::make_shared>()); vec = vecVal.getVector(); - vec->setSize(index + 1); + vec->setSize(index); } // out-of-bounds handling - if (index >= vec->size()) + if (index > vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index out of bounds", getFileLine(ip - 2)); switch (type) @@ -1603,7 +1603,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getVectorVariable(); } - if (index >= vec->size()) + if (index > vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); switch (type) @@ -1650,7 +1650,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getLocalVectorVariable(reg); } - if (index >= vec->size()) + if (index > vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); switch (type) diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 8de4efa7ed..d36045a796 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -419,8 +419,8 @@ TEST_F(ScriptTest, VectorTests) vecTest = RunScript(R"( $vecSize = 0; - $val = ""; function doTestAdd(%size){ + $val = ""; $vecSize = $vecSize + %size; for ( %i = 0; %i < $vecSize; %i++ ) $val[%i] = %i; From 78abacd15a071def48d9b0ed193439ae257f155e Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 20:39:57 +0100 Subject: [PATCH 32/33] Update compiledEval.cpp insert means no longer need to resize the vector manually ...another idiot issue. --- .../console/torquescript/compiledEval.cpp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 7f7aecc8e3..a1b1240ef7 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1466,11 +1466,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = vecVal.getVector(); } - if (index > vec->size()) - { - vec->setSize(index); - } - vec->insert(index, exprVal); vec.reset(); break; @@ -1489,10 +1484,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getVectorVariable(); } - // Grow vector if necessary - if (index > vec->size()) - vec->setSize(index); - vec->insert(index, exprVal); vec.reset(); break; @@ -1511,9 +1502,6 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getLocalVectorVariable(reg); } - if (index > vec->size()) - vec->setSize(index); - vec->insert(index, exprVal); vec.reset(); break; @@ -1563,7 +1551,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi } // out-of-bounds handling - if (index > vec->size()) + if (index >= vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index out of bounds", getFileLine(ip - 2)); switch (type) @@ -1603,7 +1591,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getVectorVariable(); } - if (index > vec->size()) + if (index >= vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); switch (type) @@ -1650,7 +1638,7 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getLocalVectorVariable(reg); } - if (index > vec->size()) + if (index >= vec->size()) { Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); switch (type) From e7bda7dc464b8bf1f794864259467e5926658d98 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Wed, 8 Oct 2025 20:42:19 +0100 Subject: [PATCH 33/33] Update compiledEval.cpp time to sleep..... --- Engine/source/console/torquescript/compiledEval.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index a1b1240ef7..59bf7e7e0f 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1466,6 +1466,11 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = vecVal.getVector(); } + if (index > vec->size()) + { + vec->setSize(index); + } + vec->insert(index, exprVal); vec.reset(); break; @@ -1484,6 +1489,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getVectorVariable(); } + // Grow vector if necessary + if (index > vec->size()) + vec->setSize(index); + vec->insert(index, exprVal); vec.reset(); break; @@ -1502,6 +1511,9 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi vec = Script::gEvalState.getLocalVectorVariable(reg); } + if (index > vec->size()) + vec->setSize(index); + vec->insert(index, exprVal); vec.reset(); break;