Changeset View
Changeset View
Standalone View
Standalone View
src/interpreter/executer.cpp
Show First 20 Lines • Show All 446 Lines • ▼ Show 20 Line(s) | |||||
447 | } | 447 | } | ||
448 | void Executer::executeExit(TreeNode* node) { | 448 | void Executer::executeExit(TreeNode* node) { | ||
449 | // //qDebug() << "called"; | 449 | // //qDebug() << "called"; | ||
450 | node = node; // stop the warnings | 450 | node = node; // stop the warnings | ||
451 | finished = true; | 451 | finished = true; | ||
452 | } | 452 | } | ||
453 | void Executer::executeIf(TreeNode* node) { | 453 | void Executer::executeIf(TreeNode* node) { | ||
454 | // //qDebug() << "called"; | 454 | // //qDebug() << "called"; | ||
455 | QString id = QString("__%1_%2").arg(node->token()->look()).arg((quintptr)node); | 455 | QString id = QString("__%1_%2").arg(node->token()->look()).arg(reinterpret_cast<quintptr>(node)); | ||
456 | if (currentVariableTable()->contains(id)) { | 456 | if (currentVariableTable()->contains(id)) { | ||
457 | currentVariableTable()->remove(id); | 457 | currentVariableTable()->remove(id); | ||
458 | return; | 458 | return; | ||
459 | } | 459 | } | ||
460 | 460 | | |||
461 | if (node->child(0)->value()->boolean()) { | 461 | if (node->child(0)->value()->boolean()) { | ||
462 | // store a empty Value just to know we executed once | 462 | // store a empty Value just to know we executed once | ||
463 | currentVariableTable()->insert(id, Value()); | 463 | currentVariableTable()->insert(id, Value()); | ||
464 | newScope = node->child(1); | 464 | newScope = node->child(1); | ||
465 | } else { | 465 | } else { | ||
466 | if (node->childCount() >= 3) { | 466 | if (node->childCount() >= 3) { | ||
467 | currentVariableTable()->insert(id, Value()); | 467 | currentVariableTable()->insert(id, Value()); | ||
468 | newScope = node->child(2); // execute the else part | 468 | newScope = node->child(2); // execute the else part | ||
469 | } | 469 | } | ||
470 | } | 470 | } | ||
471 | } | 471 | } | ||
472 | void Executer::executeElse(TreeNode* node) { | 472 | void Executer::executeElse(TreeNode* node) { | ||
473 | // //qDebug() << "called"; | 473 | // //qDebug() << "called"; | ||
474 | execute(node->child(0)); // execute the scope, that's all... | 474 | execute(node->child(0)); // execute the scope, that's all... | ||
475 | } | 475 | } | ||
476 | void Executer::executeRepeat(TreeNode* node) { | 476 | void Executer::executeRepeat(TreeNode* node) { | ||
477 | // //qDebug() << "called"; | 477 | // //qDebug() << "called"; | ||
478 | QString id = QString("__%1_%2").arg(node->token()->look()).arg((quintptr)node); | 478 | QString id = QString("__%1_%2").arg(node->token()->look()).arg(reinterpret_cast<quintptr>(node)); | ||
479 | 479 | | |||
480 | if(breaking) { | 480 | if(breaking) { | ||
481 | breaking = false; | 481 | breaking = false; | ||
482 | currentVariableTable()->remove(id); | 482 | currentVariableTable()->remove(id); | ||
483 | return; | 483 | return; | ||
484 | } | 484 | } | ||
485 | 485 | | |||
486 | // the iteration state is stored on the variable table | 486 | // the iteration state is stored on the variable table | ||
Show All 15 Lines | |||||
502 | } | 502 | } | ||
503 | void Executer::executeWhile(TreeNode* node) { | 503 | void Executer::executeWhile(TreeNode* node) { | ||
504 | // //qDebug() << "called"; | 504 | // //qDebug() << "called"; | ||
505 | // first time this gets called the expression is already executed | 505 | // first time this gets called the expression is already executed | ||
506 | // after one iteration the expression is not automatically re-executed. | 506 | // after one iteration the expression is not automatically re-executed. | ||
507 | // so we do the following on every call to executeWhile: | 507 | // so we do the following on every call to executeWhile: | ||
508 | // exec scope, exec expression, exec scope, exec expression, ... | 508 | // exec scope, exec expression, exec scope, exec expression, ... | ||
509 | 509 | | |||
510 | QString id = QString("__%1_%2").arg(node->token()->look()).arg((quintptr)node); | 510 | QString id = QString("__%1_%2").arg(node->token()->look()).arg(reinterpret_cast<quintptr>(node)); | ||
511 | 511 | | |||
512 | if (breaking) { | 512 | if (breaking) { | ||
513 | // We hit a break command while executing the scope | 513 | // We hit a break command while executing the scope | ||
514 | breaking = false; // Not breaking anymore | 514 | breaking = false; // Not breaking anymore | ||
515 | currentVariableTable()->remove(id); // remove the value (cleanup) | 515 | currentVariableTable()->remove(id); // remove the value (cleanup) | ||
516 | return; // Move to the next sibbling | 516 | return; // Move to the next sibbling | ||
517 | } | 517 | } | ||
518 | 518 | | |||
Show All 32 Lines | 546 | if (functionStack.isEmpty() || functionStack.top().function != node) { | |||
551 | //c.variableTable = new VariableTable(); | 551 | //c.variableTable = new VariableTable(); | ||
552 | c.variableTable = currentVariableTable(); | 552 | c.variableTable = currentVariableTable(); | ||
553 | functionStack.push(c); | 553 | functionStack.push(c); | ||
554 | 554 | | |||
555 | currentVariableTable()->insert(node->child(0)->token()->look(), Value(node->child(1)->value()->number())); | 555 | currentVariableTable()->insert(node->child(0)->token()->look(), Value(node->child(1)->value()->number())); | ||
556 | firstIteration = true; | 556 | firstIteration = true; | ||
557 | } | 557 | } | ||
558 | 558 | | |||
559 | QString id = QString("__%1_%2").arg(node->token()->look()).arg((quintptr)node); | 559 | QString id = QString("__%1_%2").arg(node->token()->look()).arg(reinterpret_cast<quintptr>(node)); | ||
560 | 560 | | |||
561 | if(breaking) { | 561 | if(breaking) { | ||
562 | breaking = false; | 562 | breaking = false; | ||
563 | //delete functionStack.top().variableTable; | 563 | //delete functionStack.top().variableTable; | ||
564 | functionStack.pop(); | 564 | functionStack.pop(); | ||
565 | // if we don't delete the functionStack's varibleTable any more | 565 | // if we don't delete the functionStack's varibleTable any more | ||
566 | // do remove the for loops id.. | 566 | // do remove the for loops id.. | ||
567 | currentVariableTable()->remove(id); | 567 | currentVariableTable()->remove(id); | ||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Line(s) | 625 | else | |||
626 | returnValue = 0; | 626 | returnValue = 0; | ||
627 | returning = true; | 627 | returning = true; | ||
628 | } | 628 | } | ||
629 | void Executer::executeWait(TreeNode* node) { | 629 | void Executer::executeWait(TreeNode* node) { | ||
630 | // //qDebug() << "called"; | 630 | // //qDebug() << "called"; | ||
631 | if (!checkParameterQuantity(node, 1, 20000+Token::Wait*100+90)) return; | 631 | if (!checkParameterQuantity(node, 1, 20000+Token::Wait*100+90)) return; | ||
632 | if (!checkParameterType(node, Value::Number, 20000+Token::Wait*100+91) ) return; | 632 | if (!checkParameterType(node, Value::Number, 20000+Token::Wait*100+91) ) return; | ||
633 | waiting = true; | 633 | waiting = true; | ||
634 | QTimer::singleShot((int)(1000*node->child(0)->value()->number()), this, SLOT(stopWaiting())); | 634 | QTimer::singleShot(static_cast<int>(1000*node->child(0)->value()->number()), this, SLOT(stopWaiting())); | ||
635 | } | 635 | } | ||
636 | void Executer::executeAssert(TreeNode* node) { | 636 | void Executer::executeAssert(TreeNode* node) { | ||
637 | // //qDebug() << "called"; | 637 | // //qDebug() << "called"; | ||
638 | if (!checkParameterQuantity(node, 1, 20000+Token::Wait*100+90)) return; | 638 | if (!checkParameterQuantity(node, 1, 20000+Token::Wait*100+90)) return; | ||
639 | if (!checkParameterType(node, Value::Bool, 20000+Token::Wait*100+91) ) return; | 639 | if (!checkParameterType(node, Value::Bool, 20000+Token::Wait*100+91) ) return; | ||
640 | if (!node->child(0)->value()->boolean()) addError(i18n("ASSERT failed"), *node->token(), 0); | 640 | if (!node->child(0)->value()->boolean()) addError(i18n("ASSERT failed"), *node->token(), 0); | ||
641 | } | 641 | } | ||
642 | void Executer::executeAnd(TreeNode* node) { | 642 | void Executer::executeAnd(TreeNode* node) { | ||
▲ Show 20 Lines • Show All 316 Lines • ▼ Show 20 Line(s) | |||||
959 | // //qDebug() << "called"; | 959 | // //qDebug() << "called"; | ||
960 | if (!checkParameterQuantity(node, 2, 20000+Token::Random*100+90)) return; | 960 | if (!checkParameterQuantity(node, 2, 20000+Token::Random*100+90)) return; | ||
961 | TreeNode* nodeX = node->child(0); // getting | 961 | TreeNode* nodeX = node->child(0); // getting | ||
962 | TreeNode* nodeY = node->child(1); | 962 | TreeNode* nodeY = node->child(1); | ||
963 | 963 | | |||
964 | if (!checkParameterType(node, Value::Number, 20000+Token::Random*100+91)) return; | 964 | if (!checkParameterType(node, Value::Number, 20000+Token::Random*100+91)) return; | ||
965 | double x = nodeX->value()->number(); | 965 | double x = nodeX->value()->number(); | ||
966 | double y = nodeY->value()->number(); | 966 | double y = nodeY->value()->number(); | ||
967 | double r = (double)(KRandom::random()) / RAND_MAX; | 967 | double r = static_cast<double>(KRandom::random()) / RAND_MAX; | ||
968 | node->value()->setNumber(r * (y - x) + x); | 968 | node->value()->setNumber(r * (y - x) + x); | ||
969 | } | 969 | } | ||
970 | void Executer::executeGetX(TreeNode* node) { | 970 | void Executer::executeGetX(TreeNode* node) { | ||
971 | // //qDebug() << "called"; | 971 | // //qDebug() << "called"; | ||
972 | if (!checkParameterQuantity(node, 0, 20000+Token::GetX*100+90)) return; | 972 | if (!checkParameterQuantity(node, 0, 20000+Token::GetX*100+90)) return; | ||
973 | double value = 0; | 973 | double value = 0; | ||
974 | emit getX(value); | 974 | emit getX(value); | ||
975 | node->value()->setNumber(value); | 975 | node->value()->setNumber(value); | ||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Line(s) | |||||
1075 | // //qDebug() << "called"; | 1075 | // //qDebug() << "called"; | ||
1076 | if (!checkParameterQuantity(node, 2, 20000+Token::Mod*100+90)) return; | 1076 | if (!checkParameterQuantity(node, 2, 20000+Token::Mod*100+90)) return; | ||
1077 | TreeNode* nodeX = node->child(0); // getting | 1077 | TreeNode* nodeX = node->child(0); // getting | ||
1078 | TreeNode* nodeY = node->child(1); | 1078 | TreeNode* nodeY = node->child(1); | ||
1079 | 1079 | | |||
1080 | if (!checkParameterType(node, Value::Number, 20000+Token::Mod*100+91)) return; | 1080 | if (!checkParameterType(node, Value::Number, 20000+Token::Mod*100+91)) return; | ||
1081 | double x = nodeX->value()->number(); | 1081 | double x = nodeX->value()->number(); | ||
1082 | double y = nodeY->value()->number(); | 1082 | double y = nodeY->value()->number(); | ||
1083 | double m = (double)(static_cast<int>(round(x)) % static_cast<int>(round(y))); | 1083 | double m = (static_cast<int>(round(x)) % static_cast<int>(round(y))); | ||
1084 | node->value()->setNumber(m); | 1084 | node->value()->setNumber(m); | ||
1085 | } | 1085 | } | ||
1086 | 1086 | | |||
1087 | //END GENERATED executer_cpp CODE | 1087 | //END GENERATED executer_cpp CODE | ||
1088 | 1088 | | |||
1089 | TreeNode* Executer::getParentOfTokenTypes(TreeNode* child, QList<int>* types) { | 1089 | TreeNode* Executer::getParentOfTokenTypes(TreeNode* child, QList<int>* types) { | ||
1090 | foreach(int type, *types) { | 1090 | foreach(int type, *types) { | ||
1091 | if(child->parent()->token()->type()==type) | 1091 | if(child->parent()->token()->type()==type) | ||
Show All 11 Lines |