@@ -25,6 +25,7 @@ void ListBlocks::registerBlocks(IEngine *engine)
25
25
engine->addCompileFunction (this , " data_addtolist" , &compileAddToList);
26
26
engine->addCompileFunction (this , " data_deleteoflist" , &compileDeleteOfList);
27
27
engine->addCompileFunction (this , " data_deletealloflist" , &compileDeleteAllOfList);
28
+ engine->addCompileFunction (this , " data_insertatlist" , &compileInsertAtList);
28
29
}
29
30
30
31
CompilerValue *ListBlocks::compileAddToList (Compiler *compiler)
@@ -38,24 +39,23 @@ CompilerValue *ListBlocks::compileAddToList(Compiler *compiler)
38
39
return nullptr ;
39
40
}
40
41
41
- CompilerValue *ListBlocks::getListIndex (Compiler *compiler, CompilerValue *input, List *list)
42
+ CompilerValue *ListBlocks::getListIndex (Compiler *compiler, CompilerValue *input, List *list, CompilerValue *listSize )
42
43
{
43
44
CompilerLocalVariable *ret = compiler->createLocalVariable (Compiler::StaticType::Number);
44
- CompilerValue *size = compiler->addListSize (list);
45
45
46
46
CompilerValue *isRandom1 = compiler->createCmpEQ (input, compiler->addConstValue (" random" ));
47
47
CompilerValue *isRandom2 = compiler->createCmpEQ (input, compiler->addConstValue (" any" ));
48
48
CompilerValue *isRandom = compiler->createOr (isRandom1, isRandom2);
49
49
50
50
compiler->beginIfStatement (isRandom);
51
51
{
52
- CompilerValue *random = compiler->createRandomInt (compiler->addConstValue (1 ), size );
52
+ CompilerValue *random = compiler->createRandomInt (compiler->addConstValue (1 ), listSize );
53
53
compiler->createLocalVariableWrite (ret, random);
54
54
}
55
55
compiler->beginElseBranch ();
56
56
{
57
57
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));
59
59
}
60
60
compiler->endIf ();
61
61
@@ -76,10 +76,10 @@ CompilerValue *ListBlocks::compileDeleteOfList(Compiler *compiler)
76
76
}
77
77
compiler->beginElseBranch ();
78
78
{
79
- index = getListIndex (compiler, index, list);
80
- index = compiler->createSub (index, compiler->addConstValue (1 ));
81
79
CompilerValue *min = compiler->addConstValue (-1 );
82
80
CompilerValue *max = compiler->addListSize (list);
81
+ index = getListIndex (compiler, index, list, max);
82
+ index = compiler->createSub (index, compiler->addConstValue (1 ));
83
83
cond = compiler->createAnd (compiler->createCmpGT (index, min), compiler->createCmpLT (index, max));
84
84
compiler->beginIfStatement (cond);
85
85
{
@@ -103,3 +103,26 @@ CompilerValue *ListBlocks::compileDeleteAllOfList(Compiler *compiler)
103
103
104
104
return nullptr ;
105
105
}
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