37 INPUT_DATA_ABSENT = 1 << 0,
38 INPUT_DATA_PRESENT = 1 << 1,
39 OUTPUT_DATA_ABSENT = 1 << 2,
40 OUTPUT_DATA_PRESENT = 1 << 3,
41 INPUT_EVENT_ABSENT = 1 << 4,
42 INPUT_EVENT_PRESENT = 1 << 5,
43 OUTPUT_EVENT_ABSENT = 1 << 6,
44 OUTPUT_EVENT_PRESENT = 1 << 7,
45 OUTPUT_TRIGGER_ABSENT = 1 << 8,
46 OUTPUT_TRIGGER_PRESENT = 1 << 9,
47 INSTANCE_DATA_ABSENT = 1 << 10,
48 INSTANCE_DATA_PRESENT = 1 << 11
59 instanceDataClass = NULL;
62 callbackStartFunction = NULL;
63 callbackUpdateFunction = NULL;
64 callbackStopFunction = NULL;
65 _isSubcomposition =
false;
78 compilerNodeClass->getBase()->getClassName(),
79 compilerNodeClass->getBase()->getRefreshPortClass(),
80 compilerNodeClass->getBase()->getInputPortClasses(),
81 compilerNodeClass->getBase()->getOutputPortClasses())),
91 setDependsOnPro(compilerNodeClass->dependsOnPro());
99 this->eventFunction = compilerNodeClass->eventFunction;
100 this->initFunction = compilerNodeClass->initFunction;
101 this->finiFunction = compilerNodeClass->finiFunction;
102 this->callbackStartFunction = compilerNodeClass->callbackStartFunction;
103 this->callbackUpdateFunction = compilerNodeClass->callbackUpdateFunction;
104 this->callbackStopFunction = compilerNodeClass->callbackStopFunction;
105 this->instanceDataClass = compilerNodeClass->instanceDataClass;
106 this->triggerDescriptions = compilerNodeClass->triggerDescriptions;
107 this->compatibleSpecializedForGenericTypeName = compilerNodeClass->compatibleSpecializedForGenericTypeName;
108 this->portsWithExplicitEventBlockingNone = compilerNodeClass->portsWithExplicitEventBlockingNone;
109 this->sourcePath = compilerNodeClass->sourcePath;
110 this->sourceCode = compilerNodeClass->sourceCode;
111 this->containedNodes = compilerNodeClass->containedNodes;
116 compilerNodeClass->instanceDataClass = NULL;
118 _isSubcomposition =
false;
119 updateSubcompositionStatus();
131 instanceDataClass = NULL;
132 eventFunction = NULL;
135 callbackStartFunction = NULL;
136 callbackUpdateFunction = NULL;
137 callbackStopFunction = NULL;
138 _isSubcomposition =
false;
146 delete instanceDataClass;
149 for (vector<VuoPortClass *>::iterator i = inputPortClasses.begin(); i != inputPortClasses.end(); ++i)
150 delete (*i)->getCompiler();
153 for (vector<VuoPortClass *>::iterator i = outputPortClasses.begin(); i != outputPortClasses.end(); ++i)
154 delete (*i)->getCompiler();
166 instantiateCompilerNode(n);
176 instantiateCompilerNode(n);
185 void VuoCompilerNodeClass::instantiateCompilerNode(
VuoNode *node)
190 vector<VuoPort *> ports;
191 ports.insert(ports.end(), inputPorts.begin(), inputPorts.end());
192 ports.insert(ports.end(), outputPorts.begin(), outputPorts.end());
194 for (vector<VuoPort *>::iterator i = ports.begin(); i != ports.end(); ++i)
219 if (! isNodeClass(
module, nodeClassName))
234 bool VuoCompilerNodeClass::isNodeClass(Module *module,
string moduleKey)
243 void VuoCompilerNodeClass::parse(
void)
247 parseEventFunction();
248 if (instanceDataClass)
252 parseCallbackStartFunction();
253 parseCallbackUpdateFunction();
254 parseCallbackStopFunction();
258 vector<VuoPortClass *> portClasses;
261 portClasses.insert(portClasses.end(), inputPortClasses.begin(), inputPortClasses.end());
262 portClasses.insert(portClasses.end(), outputPortClasses.begin(), outputPortClasses.end());
263 for (vector<VuoPortClass *>::iterator i = portClasses.begin(); i != portClasses.end(); ++i)
275 updateSubcompositionStatus();
281 set<string> VuoCompilerNodeClass::globalsToRename(
void)
284 globals.insert(
"nodeEvent");
285 globals.insert(
"nodeInstanceEvent");
286 globals.insert(
"nodeInstanceInit");
287 globals.insert(
"nodeInstanceFini");
288 globals.insert(
"nodeInstanceTriggerStart");
289 globals.insert(
"nodeInstanceTriggerUpdate");
290 globals.insert(
"nodeInstanceTriggerStop");
297 void VuoCompilerNodeClass::parseMetadata(
void)
302 if (json_object_object_get_ex(
moduleDetails,
"node", &nodeDetails))
312 if (json_object_object_get_ex(nodeDetails,
"triggers", &triggersArray))
316 if (json_object_object_get_ex(nodeDetails,
"nodes", &nodesObj))
318 json_object_object_foreach(nodesObj, nodeIdentifier, nodeClassNameObj)
320 string nodeClassName = json_object_get_string(nodeClassNameObj);
321 containedNodes.insert(make_pair(nodeIdentifier, nodeClassName));
335 map<string, string> &defaultSpecializedForGenericTypeName,
336 map<
string, vector<string> > &compatibleSpecializedForGenericTypeName)
339 if (json_object_object_get_ex(
moduleDetails,
"genericTypes", &genericTypeDetails))
341 json_object_object_foreach(genericTypeDetails, genericTypeName, genericTypeDetailsForOneType)
344 if (! defaultType.empty())
348 if (! compatibleTypes.empty())
349 compatibleSpecializedForGenericTypeName[genericTypeName] = compatibleTypes;
360 void VuoCompilerNodeClass::parseEventFunction(
void)
368 acceptsInstanceData = INSTANCE_DATA_PRESENT;
372 VUserLog(
"Error: Node class '%s' is missing function nodeEvent or nodeInstanceEvent.",
getBase()->getClassName().c_str());
377 parseParameters(eventFunction,
378 INPUT_DATA_ABSENT | INPUT_DATA_PRESENT |
379 OUTPUT_DATA_ABSENT | OUTPUT_DATA_PRESENT |
380 INPUT_EVENT_ABSENT | INPUT_EVENT_PRESENT |
381 OUTPUT_EVENT_ABSENT | OUTPUT_EVENT_PRESENT |
382 OUTPUT_TRIGGER_ABSENT | OUTPUT_TRIGGER_PRESENT |
383 acceptsInstanceData);
392 void VuoCompilerNodeClass::parseInitFunction(
void)
398 parseParameters(initFunction,
399 INPUT_DATA_ABSENT | INPUT_DATA_PRESENT |
402 OUTPUT_EVENT_ABSENT |
403 OUTPUT_TRIGGER_ABSENT |
404 INSTANCE_DATA_ABSENT);
410 void VuoCompilerNodeClass::parseFiniFunction(
void)
424 void VuoCompilerNodeClass::parseCallbackStartFunction(
void)
427 if (! callbackStartFunction)
430 parseParameters(callbackStartFunction,
431 INPUT_DATA_ABSENT | INPUT_DATA_PRESENT |
434 OUTPUT_EVENT_ABSENT |
435 OUTPUT_TRIGGER_ABSENT | OUTPUT_TRIGGER_PRESENT |
436 INSTANCE_DATA_PRESENT);
448 void VuoCompilerNodeClass::parseCallbackUpdateFunction(
void)
451 if (! callbackUpdateFunction)
454 parseParameters(callbackUpdateFunction,
455 INPUT_DATA_ABSENT | INPUT_DATA_PRESENT |
458 OUTPUT_EVENT_ABSENT |
459 OUTPUT_TRIGGER_ABSENT | OUTPUT_TRIGGER_PRESENT |
460 INSTANCE_DATA_PRESENT);
466 void VuoCompilerNodeClass::parseCallbackStopFunction(
void)
469 if (! callbackStopFunction)
472 parseParameters(callbackStopFunction,
476 OUTPUT_EVENT_ABSENT |
477 OUTPUT_TRIGGER_ABSENT | OUTPUT_TRIGGER_PRESENT |
478 INSTANCE_DATA_PRESENT);
488 void VuoCompilerNodeClass::parseParameters(Function *
function,
unsigned long acceptanceFlags)
492 vector<VuoCompilerNodeArgumentClass *> inputArgumentClasses;
493 vector<VuoCompilerNodeArgumentClass *> outputArgumentClasses;
494 map<string, VuoType *> vuoTypeForArgumentName;
495 map<string, json_object *> detailsForArgumentName;
496 map<string, VuoCompilerPortClass *> portClassForArgumentName;
497 map<string, VuoCompilerDataClass *> dataClassForArgumentName;
499 bool sawInputData =
false;
500 bool sawOutputData =
false;
501 bool sawInputEvent =
false;
502 bool sawOutputEvent =
false;
503 bool sawOutputTrigger =
false;
504 bool sawInstanceData =
false;
507 for (vector<pair<Argument *, string> >::iterator i = annotatedArguments.begin(); i != annotatedArguments.end(); ++i)
509 Argument *argument = i->first;
510 string annotation = i->second;
518 if ((argumentClass = parseInputDataParameter(annotation, argument)) != NULL)
520 existingPortClass = getExistingPortClass(argumentClass,
true);
521 if (! existingPortClass)
523 inputArgumentClasses.push_back(argumentClass);
529 else if ((argumentClass = parseOutputDataParameter(annotation, argument)) != NULL)
531 existingPortClass = getExistingPortClass(argumentClass,
false);
532 if (! existingPortClass)
534 outputArgumentClasses.push_back(argumentClass);
538 sawOutputData =
true;
540 else if ((argumentClass = parseInputEventParameter(annotation, argument)) != NULL)
542 existingPortClass = getExistingPortClass(argumentClass,
true);
543 if (! existingPortClass)
545 inputArgumentClasses.push_back(argumentClass);
549 sawInputEvent =
true;
551 else if ((argumentClass = parseOutputEventParameter(annotation, argument)) != NULL)
553 existingPortClass = getExistingPortClass(argumentClass,
false);
554 if (! existingPortClass)
556 outputArgumentClasses.push_back(argumentClass);
560 sawOutputEvent =
true;
562 else if ((argumentClass = parseTriggerParameter(annotation, argument)) != NULL)
564 existingPortClass = getExistingPortClass(argumentClass,
false);
565 if (! existingPortClass)
567 outputArgumentClasses.push_back(argumentClass);
571 sawOutputTrigger =
true;
573 else if ((argumentClass = parseInstanceDataParameter(annotation, argument)) != NULL)
575 if (instanceDataClass)
576 existingPortClass = instanceDataClass->
getBase();
580 sawInstanceData =
true;
582 else if ((type = parseTypeParameter(annotation)) != NULL)
584 vuoTypeForArgumentName[argumentName] = type;
586 else if ((details = parseDetailsParameter(annotation)) != NULL)
588 detailsForArgumentName[argumentName] = details;
592 if (argumentClassInNodeClass)
594 size_t argumentIndex = argument->getArgNo();
595 if (
function == eventFunction)
597 else if (
function == initFunction)
599 else if (
function == callbackStartFunction)
601 else if (
function == callbackUpdateFunction)
603 else if (
function == callbackStopFunction)
607 if (existingPortClass)
608 delete argumentClass;
613 string functionName =
function->getName().str();
614 string wronglyAbsentMessage =
" is required in " + functionName;
615 string wronglyPresentMessage =
" is not allowed in " + functionName;
617 if (sawInputData && ! (acceptanceFlags & INPUT_DATA_PRESENT))
618 VUserLog(
"Error: %s", (
"VuoInputData" + wronglyPresentMessage).c_str());
619 if (sawOutputData && ! (acceptanceFlags & OUTPUT_DATA_PRESENT))
620 VUserLog(
"Error: %s", (
"VuoOutputData" + wronglyPresentMessage).c_str());
621 if (sawInputEvent && ! (acceptanceFlags & INPUT_EVENT_PRESENT))
622 VUserLog(
"Error: %s", (
"VuoInputEvent" + wronglyPresentMessage).c_str());
623 if (sawOutputEvent && ! (acceptanceFlags & OUTPUT_EVENT_PRESENT))
624 VUserLog(
"Error: %s", (
"VuoOutputEvent" + wronglyPresentMessage).c_str());
625 if (sawOutputTrigger && ! (acceptanceFlags & OUTPUT_TRIGGER_PRESENT))
626 VUserLog(
"Error: %s", (
"VuoOutputTrigger" + wronglyPresentMessage).c_str());
627 if (sawInstanceData && ! (acceptanceFlags & INSTANCE_DATA_PRESENT))
628 VUserLog(
"Error: %s", (
"VuoInstanceData" + wronglyPresentMessage).c_str());
630 if (! sawInputData && ! (acceptanceFlags & INPUT_DATA_ABSENT))
631 VUserLog(
"Error: %s", (
"VuoInputData" + wronglyAbsentMessage).c_str());
632 if (! sawOutputData && ! (acceptanceFlags & OUTPUT_DATA_ABSENT))
633 VUserLog(
"Error: %s", (
"VuoOutputData" + wronglyAbsentMessage).c_str());
634 if (! sawInputEvent && ! (acceptanceFlags & INPUT_EVENT_ABSENT))
635 VUserLog(
"Error: %s", (
"VuoInputEvent" + wronglyAbsentMessage).c_str());
636 if (! sawOutputEvent && ! (acceptanceFlags & OUTPUT_EVENT_ABSENT))
637 VUserLog(
"Error: %s", (
"VuoOutputEvent" + wronglyAbsentMessage).c_str());
638 if (! sawOutputTrigger && ! (acceptanceFlags & OUTPUT_TRIGGER_ABSENT))
639 VUserLog(
"Error: %s", (
"VuoOutputTrigger" + wronglyAbsentMessage).c_str());
640 if (! sawInstanceData && ! (acceptanceFlags & INSTANCE_DATA_ABSENT))
641 VUserLog(
"Error: %s", (
"VuoInstanceData" + wronglyAbsentMessage).c_str());
645 map<string, VuoCompilerInputEventPortClass *> inputEventPortClassForDataClassName;
646 for (map<string, VuoCompilerPortClass *>::iterator i = portClassForArgumentName.begin(); i != portClassForArgumentName.end(); ++i)
648 string argumentName = i->first;
653 bool isDataInDetails =
false;
658 inputEventPortClassForDataClassName[dataPortName] = eventPortClass;
662 map<string, VuoCompilerOutputEventPortClass *> outputEventPortClassForDataClassName;
663 for (map<string, VuoCompilerPortClass *>::iterator i = portClassForArgumentName.begin(); i != portClassForArgumentName.end(); ++i)
665 string argumentName = i->first;
670 bool isDataInDetails =
false;
675 outputEventPortClassForDataClassName[dataPortName] = eventPortClass;
681 vector<VuoPortClass *> addedInputPortClasses;
682 for (vector<VuoCompilerNodeArgumentClass *>::iterator i = inputArgumentClasses.begin(); i != inputArgumentClasses.end(); ++i)
689 if (! eventPortClass)
693 addedInputPortClasses.push_back(eventPortClass->
getBase());
698 vector<VuoPortClass *>::iterator oldBase = find(addedInputPortClasses.begin(), addedInputPortClasses.end(), eventPortClass->
getBase());
700 if (oldBase != addedInputPortClasses.end())
702 addedInputPortClasses.insert(oldBase,eventPortClass->
getBase());
703 addedInputPortClasses.erase(oldBase);
710 vector<VuoPortClass *> addedOutputPortClasses;
711 for (vector<VuoCompilerNodeArgumentClass *>::iterator i = outputArgumentClasses.begin(); i != outputArgumentClasses.end(); ++i)
717 if (! eventPortClass)
721 addedOutputPortClasses.push_back(eventPortClass->
getBase());
726 vector<VuoPortClass *>::iterator oldBase = find(addedOutputPortClasses.begin(), addedOutputPortClasses.end(), eventPortClass->
getBase());
728 if (oldBase != addedOutputPortClasses.end())
730 addedOutputPortClasses.insert(oldBase,eventPortClass->
getBase());
731 addedOutputPortClasses.erase(oldBase);
740 if (!
getBase()->getRefreshPortClass()->hasCompiler())
746 inputPortClasses.erase(inputPortClasses.begin());
751 addedInputPortClasses.insert(addedInputPortClasses.begin(), refreshPortClass);
756 inputPortClasses.insert(inputPortClasses.end(), addedInputPortClasses.begin(), addedInputPortClasses.end());
759 outputPortClasses.insert(outputPortClasses.end(), addedOutputPortClasses.begin(), addedOutputPortClasses.end());
763 vector<VuoPortClass *> portClasses;
764 portClasses.insert(portClasses.end(), addedInputPortClasses.begin(), addedInputPortClasses.end());
765 portClasses.insert(portClasses.end(), addedOutputPortClasses.begin(), addedOutputPortClasses.end());
766 for (vector<VuoPortClass *>::iterator i = portClasses.begin(); i != portClasses.end(); ++i)
775 map<string, VuoType *>::iterator vuoTypeIter = vuoTypeForArgumentName.find(dataClassName);
776 if (vuoTypeIter != vuoTypeForArgumentName.end())
779 vuoTypeForArgumentName.erase(vuoTypeIter);
785 if (triggerPortClass)
788 map<string, VuoType *>::iterator vuoTypeIter = vuoTypeForArgumentName.find(triggerName);
789 if (vuoTypeIter != vuoTypeForArgumentName.end())
792 vuoTypeForArgumentName.erase(vuoTypeIter);
796 for (map<string, VuoType *>::iterator i = vuoTypeForArgumentName.begin(); i != vuoTypeForArgumentName.end(); ++i)
800 for (map<string, json_object *>::iterator i = detailsForArgumentName.begin(); i != detailsForArgumentName.end(); ++i)
802 string argumentName = i->first;
817 for (vector<VuoPortClass *>::iterator i = addedInputPortClasses.begin(); i != addedInputPortClasses.end(); ++i)
820 bool isEventBlockingInDetails =
false;
822 if (isEventBlockingInDetails)
825 if (eventBlockingStr ==
"none")
827 else if (eventBlockingStr ==
"door")
829 else if (eventBlockingStr ==
"wall")
833 VUserLog(
"Error: Unknown option for \"eventBlocking\": %s", eventBlockingStr.c_str());
839 portsWithExplicitEventBlockingNone.insert(eventPortClass);
844 for (vector<VuoPortClass *>::iterator i = addedOutputPortClasses.begin(); i != addedOutputPortClasses.end(); ++i)
847 if (triggerPortClass)
849 bool isEventThrottlingInDetails =
false;
851 if (isEventThrottlingInDetails)
854 if (eventThrottlingStr ==
"enqueue")
856 else if (eventThrottlingStr ==
"drop")
860 VUserLog(
"Error: Unknown option for \"throttling\": %s", eventThrottlingStr.c_str());
869 for (vector<VuoPortClass *>::iterator i = inputPortClasses.begin(); i != inputPortClasses.end(); ++i)
875 bool isPortActionInDetails =
false;
878 if (isPortActionInDetails)
881 portsWithExplicitEventBlockingNone.find(eventPortClass) != portsWithExplicitEventBlockingNone.end())
894 if (
function == eventFunction)
899 else if (
function == initFunction)
901 Type *firstParameterType =
function->getFunctionType()->getParamType( dataClass->
getIndexInInitFunction() );
904 else if (
function == callbackStartFunction)
909 else if (
function == callbackUpdateFunction)
914 else if (
function == callbackStopFunction)
928 if (annotation !=
"vuoInputData")
940 if (annotation !=
"vuoOutputData")
944 if (! a->getType()->isPointerTy())
946 VUserLog(
"Error: Output port data %s must be a pointer.", argumentName.c_str());
975 if (! a->getType()->isPointerTy())
977 VUserLog(
"Error: Output port %s must be a pointer.", argumentName.c_str());
993 if (! a->getType()->isPointerTy())
995 VUserLog(
"Error: Output trigger %s must be a pointer.", argumentName.c_str());
1007 if (annotation !=
"vuoInstanceData")
1011 if (! a->getType()->isPointerTy())
1013 VUserLog(
"Error: Node instance data %s must be a pointer.", argumentName.c_str());
1017 Type *instanceDataType =
static_cast<PointerType *
>(a->getType())->getElementType();
1024 VuoType * VuoCompilerNodeClass::parseTypeParameter(
string annotation)
1032 if (typeName ==
"void")
1039 vector<string> compatibleTypes;
1040 map<string, vector<string> >::iterator compatibleTypesIter = compatibleSpecializedForGenericTypeName.find(innermostTypeName);
1041 if (compatibleTypesIter != compatibleSpecializedForGenericTypeName.end())
1044 vector<string> innermostCompatibleTypes = compatibleTypesIter->second;
1045 for (vector<string>::iterator i = innermostCompatibleTypes.begin(); i != innermostCompatibleTypes.end(); ++i)
1046 compatibleTypes.push_back(prefix + *i);
1061 json_object * VuoCompilerNodeClass::parseDetailsParameter(
string annotation)
1068 if (details.find_first_not_of(
' ') != string::npos)
1070 detailsObj = json_tokener_parse(details.c_str());
1072 VUserLog(
"Error: Couldn't parse vuoDetails for `%s`: %s",
getBase()->getClassName().c_str(), details.c_str());
1086 if (existingInputPortClass || existingOutputPortClass)
1090 if (! existingOutputPortClass)
1093 else if ((isInput && existingOutputPortClass) || (! isInput && existingInputPortClass))
1095 VUserLog(
"Error: Port %s is declared as an input port in one function and an output port in another function.", argumentName.c_str());
1099 VuoPortClass *existingPortClass = (existingInputPortClass ? existingInputPortClass : existingOutputPortClass);
1103 return existingPortClass;
1128 return eventFunction;
1136 return initFunction;
1144 return finiFunction;
1152 return callbackStartFunction;
1160 return callbackUpdateFunction;
1168 return callbackStopFunction;
1208 return triggerDescriptions;
1217 for (vector<VuoPortClass *>::iterator i = inputPortClasses.begin(); i != inputPortClasses.end(); ++i)
1218 if ((*i)->getName() == portName)
1230 for (vector<VuoPortClass *>::iterator i = outputPortClasses.begin(); i != outputPortClasses.end(); ++i)
1231 if ((*i)->getName() == portName)
1242 return instanceDataClass;
1250 ostringstream documentation;
1252 documentation <<
"/**" << endl;
1257 if (!description.empty())
1259 documentation <<
" * " << description << endl;
1260 documentation <<
" * " << endl;
1266 vector< pair<string, VuoPortClass *> > portClasses;
1267 for (vector<VuoPortClass *>::iterator i = inputPortClasses.begin(); i != inputPortClasses.end(); ++i)
1269 portClasses.push_back( make_pair(
"in", *i) );
1271 for (vector<VuoPortClass *>::iterator i = outputPortClasses.begin(); i != outputPortClasses.end(); ++i)
1274 portClasses.push_back( make_pair(isTrigger ?
"gen" :
"out", *i) );
1277 for (vector< pair<string, VuoPortClass *> >::iterator i = portClasses.begin(); i != portClasses.end(); ++i)
1279 string portKind = i->first;
1283 string portTypeName = (portType ? portType->
getModuleKey() :
"event");
1284 string portClassName = portClass->
getName();
1285 documentation <<
" * @param[" << portKind <<
"] " << portTypeName <<
" " << portClassName << endl;
1288 documentation <<
" */";
1290 return documentation.str();
1301 return typeNameIter->second;
1314 vector<string> keywords;
1317 bool nodeHasTriggerPort =
false;
1319 for (vector<VuoPortClass *>::iterator i = outputPortClasses.begin(); i != outputPortClasses.end(); ++i)
1323 nodeHasTriggerPort =
true;
1328 if (nodeHasTriggerPort)
1330 keywords.push_back(
"bang");
1331 keywords.push_back(
"events");
1332 keywords.push_back(
"trigger");
1333 keywords.push_back(
"fire");
1339 if (nodeTitleBeginsWithSend || nodeTitleBeginsWithReceive)
1341 keywords.push_back(
"i/o");
1342 keywords.push_back(
"interface");
1344 if (nodeTitleBeginsWithSend)
1346 keywords.push_back(
"output");
1347 keywords.push_back(
"consumer");
1350 if (nodeTitleBeginsWithReceive)
1352 keywords.push_back(
"input");
1353 keywords.push_back(
"provider");
1358 keywords.push_back(
"conversion");
1361 keywords.push_back(
"subcomposition");
1364 keywords.push_back(
"filter");
1367 keywords.push_back(
"generator");
1370 keywords.push_back(
"transition");
1375 keywords.push_back(
"premium");
1376 keywords.push_back(
"pro");
1419 int imagePortCount = 0;
1424 string name = p->getName();
1425 std::transform(name.begin(), name.end(), name.begin(), ::tolower);
1426 if (isInput && (name ==
"mask"))
1439 return imagePortCount;
1447 return (instanceDataClass != NULL);
1455 return _isSubcomposition;
1458 void VuoCompilerNodeClass::updateSubcompositionStatus()
1468 string dir, file, ext;
1478 this->sourcePath = sourcePath;
1494 this->sourceCode = sourceCode;
1510 return containedNodes;