@@ -25,6 +25,7 @@ void ListBlocks::registerBlocks(IEngine *engine)
2525 engine->addCompileFunction (this , " data_addtolist" , &compileAddToList);
2626 engine->addCompileFunction (this , " data_deleteoflist" , &compileDeleteOfList);
2727 engine->addCompileFunction (this , " data_deletealloflist" , &compileDeleteAllOfList);
28+ engine->addCompileFunction (this , " data_insertatlist" , &compileInsertAtList);
2829}
2930
3031CompilerValue *ListBlocks::compileAddToList (Compiler *compiler)
@@ -38,24 +39,23 @@ CompilerValue *ListBlocks::compileAddToList(Compiler *compiler)
3839 return nullptr ;
3940}
4041
41- CompilerValue *ListBlocks::getListIndex (Compiler *compiler, CompilerValue *input, List *list)
42+ CompilerValue *ListBlocks::getListIndex (Compiler *compiler, CompilerValue *input, List *list, CompilerValue *listSize )
4243{
4344 CompilerLocalVariable *ret = compiler->createLocalVariable (Compiler::StaticType::Number);
44- CompilerValue *size = compiler->addListSize (list);
4545
4646 CompilerValue *isRandom1 = compiler->createCmpEQ (input, compiler->addConstValue (" random" ));
4747 CompilerValue *isRandom2 = compiler->createCmpEQ (input, compiler->addConstValue (" any" ));
4848 CompilerValue *isRandom = compiler->createOr (isRandom1, isRandom2);
4949
5050 compiler->beginIfStatement (isRandom);
5151 {
52- CompilerValue *random = compiler->createRandomInt (compiler->addConstValue (1 ), size );
52+ CompilerValue *random = compiler->createRandomInt (compiler->addConstValue (1 ), listSize );
5353 compiler->createLocalVariableWrite (ret, random);
5454 }
5555 compiler->beginElseBranch ();
5656 {
5757 CompilerValue *isLast = compiler->createCmpEQ (input, compiler->addConstValue (" last" ));
58- compiler->createLocalVariableWrite (ret, compiler->createSelect (isLast, size , input, Compiler::StaticType::Number));
58+ compiler->createLocalVariableWrite (ret, compiler->createSelect (isLast, listSize , input, Compiler::StaticType::Number));
5959 }
6060 compiler->endIf ();
6161
@@ -76,10 +76,10 @@ CompilerValue *ListBlocks::compileDeleteOfList(Compiler *compiler)
7676 }
7777 compiler->beginElseBranch ();
7878 {
79- index = getListIndex (compiler, index, list);
80- index = compiler->createSub (index, compiler->addConstValue (1 ));
8179 CompilerValue *min = compiler->addConstValue (-1 );
8280 CompilerValue *max = compiler->addListSize (list);
81+ index = getListIndex (compiler, index, list, max);
82+ index = compiler->createSub (index, compiler->addConstValue (1 ));
8383 cond = compiler->createAnd (compiler->createCmpGT (index, min), compiler->createCmpLT (index, max));
8484 compiler->beginIfStatement (cond);
8585 {
@@ -103,3 +103,26 @@ CompilerValue *ListBlocks::compileDeleteAllOfList(Compiler *compiler)
103103
104104 return nullptr ;
105105}
106+
107+ CompilerValue *ListBlocks::compileInsertAtList (Compiler *compiler)
108+ {
109+ List *list = static_cast <List *>(compiler->field (" LIST" )->valuePtr ().get ());
110+ assert (list);
111+
112+ if (list) {
113+ CompilerValue *index = compiler->addInput (" INDEX" );
114+ CompilerValue *min = compiler->addConstValue (-1 );
115+ CompilerValue *max = compiler->createAdd (compiler->addListSize (list), compiler->addConstValue (1 ));
116+ index = getListIndex (compiler, index, list, max);
117+ index = compiler->createSub (index, compiler->addConstValue (1 ));
118+ CompilerValue *cond = compiler->createAnd (compiler->createCmpGT (index, min), compiler->createCmpLT (index, max));
119+ compiler->beginIfStatement (cond);
120+ {
121+ CompilerValue *item = compiler->addInput (" ITEM" );
122+ compiler->createListInsert (list, index, item);
123+ }
124+ compiler->endIf ();
125+ }
126+
127+ return nullptr ;
128+ }
0 commit comments