//! The content of the editor was changed by VPL, recompile void ThymioVPLStandalone::editorContentChanged() { const TargetDescription* targetDescription(target->getDescription(id)); if (targetDescription) { CommonDefinitions commonDefinitions; commonDefinitions.events.push_back(NamedValue(L"DebugLog", 14)); Compiler compiler; compiler.setTargetDescription(target->getDescription(id)); compiler.setTranslateCallback(CompilerTranslator::translate); compiler.setCommonDefinitions(&commonDefinitions); std::wistringstream is(editor->toPlainText().toStdWString()); Aseba::Error error; const bool success = compiler.compile(is, bytecode, allocatedVariablesCount, error); if (success) { variablesModel->updateVariablesStructure(compiler.getVariablesMap()); } else { wcerr << "AESL Compilation error: " << error.toWString() << endl; } } }
void NamedValueSet::setFromXmlAttributes (const XmlElement& xml) { values.clearQuick(); for (const XmlElement::XmlAttributeNode* att = xml.attributes; att != nullptr; att = att->nextListItem) { if (att->name.toString().startsWith ("base64:")) { MemoryBlock mb; if (mb.fromBase64Encoding (att->value)) { values.add (NamedValue (att->name.toString().substring (7), var (mb))); continue; } } values.add (NamedValue (att->name, var (att->value))); } }
bool NamedValueSet::set (Identifier name, const var& newValue) { if (var* const v = getVarPointer (name)) { if (v->equalsWithSameType (newValue)) return false; *v = newValue; return true; } values.add (NamedValue (name, newValue)); return true; }
bool NamedValueSet::set (Identifier name, var&& newValue) { if (var* const v = getVarPointer (name)) { if (v->equalsWithSameType (newValue)) return false; *v = static_cast<var&&> (newValue); return true; } values.add (NamedValue (name, static_cast<var&&> (newValue))); return true; }
void AsebaNetworkInterface::LoadScripts(const QString& fileName, const QDBusMessage &message) { QFile file(fileName); if (!file.open(QFile::ReadOnly)) { DBusConnectionBus().send(message.createErrorReply(QDBusError::InvalidArgs, QString("file %0 does not exists").arg(fileName))); return; } QDomDocument document("aesl-source"); QString errorMsg; int errorLine; int errorColumn; if (!document.setContent(&file, false, &errorMsg, &errorLine, &errorColumn)) { DBusConnectionBus().send(message.createErrorReply(QDBusError::Other, QString("Error in XML source file: %0 at line %1, column %2").arg(errorMsg).arg(errorLine).arg(errorColumn))); return; } commonDefinitions.events.clear(); commonDefinitions.constants.clear(); userDefinedVariablesMap.clear(); int noNodeCount = 0; QDomNode domNode = document.documentElement().firstChild(); // FIXME: this code depends on event and contants being before any code bool wasError = false; while (!domNode.isNull()) { if (domNode.isElement()) { QDomElement element = domNode.toElement(); if (element.tagName() == "node") { bool ok; const unsigned nodeId(getNodeId(element.attribute("name").toStdWString(), element.attribute("nodeId", 0).toUInt(), &ok)); if (ok) { std::wistringstream is(element.firstChild().toText().data().toStdWString()); Error error; BytecodeVector bytecode; unsigned allocatedVariablesCount; Compiler compiler; compiler.setTargetDescription(getDescription(nodeId)); compiler.setCommonDefinitions(&commonDefinitions); bool result = compiler.compile(is, bytecode, allocatedVariablesCount, error); if (result) { typedef std::vector<Message*> MessageVector; MessageVector messages; sendBytecode(messages, nodeId, std::vector<uint16>(bytecode.begin(), bytecode.end())); for (MessageVector::const_iterator it = messages.begin(); it != messages.end(); ++it) { hub->sendMessage(*it); delete *it; } Run msg(nodeId); hub->sendMessage(msg); } else { DBusConnectionBus().send(message.createErrorReply(QDBusError::Failed, QString::fromStdWString(error.toWString()))); wasError = true; break; } // retrieve user-defined variables for use in get/set userDefinedVariablesMap[element.attribute("name")] = *compiler.getVariablesMap(); } else noNodeCount++; } else if (element.tagName() == "event") { const QString eventName(element.attribute("name")); const unsigned eventSize(element.attribute("size").toUInt()); if (eventSize > ASEBA_MAX_EVENT_ARG_SIZE) { DBusConnectionBus().send(message.createErrorReply(QDBusError::Failed, QString("Event %1 has a length %2 larger than maximum %3").arg(eventName).arg(eventSize).arg(ASEBA_MAX_EVENT_ARG_SIZE))); wasError = true; break; } else { commonDefinitions.events.push_back(NamedValue(eventName.toStdWString(), eventSize)); } } else if (element.tagName() == "constant") { commonDefinitions.constants.push_back(NamedValue(element.attribute("name").toStdWString(), element.attribute("value").toInt())); } } domNode = domNode.nextSibling(); } // check if there was an error if (wasError) { std::wcerr << QString("There was an error while loading script %1").arg(fileName).toStdWString() << std::endl; commonDefinitions.events.clear(); commonDefinitions.constants.clear(); userDefinedVariablesMap.clear(); } // check if there was some matching problem if (noNodeCount) { std::wcerr << QString("%0 scripts have no corresponding nodes in the current network and have not been loaded.").arg(noNodeCount).toStdWString() << std::endl; } }