History

* use explicit int's for moduleId constants * maxTestConstructorValueSize was already limiting debug output size -- adopt its strategy, use shared MAX_DEBUG_VALUE_LENGTH const

humbletim committed 9 years ago

Commit efc61c21 parent 9d860a81 file · +19 −16Browse files

Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 1 file). Show all

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+19−16
@@ -74,13 +74,14 @@ const QString ScriptEngine::_SETTINGS_ENABLE_EXTENDED_MODULE_COMPAT { · 73 unmodified lines
74 "com.highfidelity.experimental.enableExtendedModuleCompatbility"74 "com.highfidelity.experimental.enableExtendedModuleCompatbility"
75};75};
76 76
77static const int MAX_MODULE_ID_LENTGH { 4096 };
78static const int MAX_DEBUG_VALUE_LENGTH { 80 };
79
77static const QScriptEngine::QObjectWrapOptions DEFAULT_QOBJECT_WRAP_OPTIONS =80static const QScriptEngine::QObjectWrapOptions DEFAULT_QOBJECT_WRAP_OPTIONS =
78 QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects;81 QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects;
79static const QScriptValue::PropertyFlags READONLY_PROP_FLAGS { QScriptValue::ReadOnly | QScriptValue::Undeletable };82static const QScriptValue::PropertyFlags READONLY_PROP_FLAGS { QScriptValue::ReadOnly | QScriptValue::Undeletable };
80static const QScriptValue::PropertyFlags READONLY_HIDDEN_PROP_FLAGS { READONLY_PROP_FLAGS | QScriptValue::SkipInEnumeration };83static const QScriptValue::PropertyFlags READONLY_HIDDEN_PROP_FLAGS { READONLY_PROP_FLAGS | QScriptValue::SkipInEnumeration };
81 84
82
83
84static const bool HIFI_AUTOREFRESH_FILE_SCRIPTS { true };85static const bool HIFI_AUTOREFRESH_FILE_SCRIPTS { true };
85 86
86Q_DECLARE_METATYPE(QScriptEngine::FunctionSignature)87Q_DECLARE_METATYPE(QScriptEngine::FunctionSignature)
@@ -551,8 +552,9 @@ void ScriptEngine::resetModuleCache(bool deleteScriptCache) { · 464 unmodified lines
551 QScriptValueIterator it(cache);552 QScriptValueIterator it(cache);
552 while (it.hasNext()) {553 while (it.hasNext()) {
553 it.next();554 it.next();
554 if (it.flags() & QScriptValue::SkipInEnumeration)555 if (it.flags() & QScriptValue::SkipInEnumeration) {
555 continue;556 continue;
557 }
556 //scriptCache->deleteScript(it.name());558 //scriptCache->deleteScript(it.name());
557 qCDebug(scriptengine) << "resetModuleCache(true) -- staging " << it.name() << " for cache reset at next require";559 qCDebug(scriptengine) << "resetModuleCache(true) -- staging " << it.name() << " for cache reset at next require";
558 cacheMeta.setProperty(it.name(), true);560 cacheMeta.setProperty(it.name(), true);
@@ -1355,29 +1357,31 @@ void ScriptEngine::print(const QString& message) { · 796 unmodified lines
1355 emit printedMessage(message);1357 emit printedMessage(message);
1356}1358}
1357 1359
1358static const auto MAX_MODULE_IDENTIFIER_LEN { 4096 };
1359static const auto MAX_MODULE_IDENTIFIER_LOG_LEN { 60 };
1360
1361// Script.require.resolve -- like resolvePath, but performs more validation and throws exceptions on invalid module identifiers (for consistency with Node.js)1360// Script.require.resolve -- like resolvePath, but performs more validation and throws exceptions on invalid module identifiers (for consistency with Node.js)
1362QString ScriptEngine::_requireResolve(const QString& moduleId, const QString& relativeTo) {1361QString ScriptEngine::_requireResolve(const QString& moduleId, const QString& relativeTo) {
1363 QUrl defaultScriptsLoc = defaultScriptsLocation();1362 QUrl defaultScriptsLoc = defaultScriptsLocation();
1364 QUrl url(moduleId);1363 QUrl url(moduleId);
1365 1364
1366 // helper to generate an exception and return a null string1365 // helper to generate an exception and return a null string
1367 auto resolverException = [=](const QString& detail) -> QString {1366 auto resolverException = [=](const QString& detail, const QString& type = "Error") -> QString {
1368 currentContext()->throwError(1367 auto displayId = moduleId;
1368 if (displayId.length() > MAX_DEBUG_VALUE_LENGTH) {
1369 displayId = displayId.mid(0, MAX_DEBUG_VALUE_LENGTH) + "...";
1370 }
1371 currentContext()->throwValue(makeError(
1369 QString("Cannot find module '%1' (%2)")1372 QString("Cannot find module '%1' (%2)")
1370 .arg(moduleId.left(MAX_MODULE_IDENTIFIER_LOG_LEN))1373 .arg(displayId)
1371 .arg(detail));1374 .arg(detail), type));
1372 return QString();1375 return QString();
1373 };1376 };
1374 1377
1375 // de-fuzz the input a little by restricting to rational sizes1378 // de-fuzz the input a little by restricting to rational sizes
1376 auto idLength = url.toString().length();1379 auto idLength = url.toString().length();
1377 if (idLength < 1 || idLength > MAX_MODULE_IDENTIFIER_LEN) {1380 if (idLength < 1 || idLength > MAX_MODULE_ID_LENTGH) {
1378 return resolverException(1381 return resolverException(
1379 QString("rejecting invalid module id size (%1 chars [1,%2])")1382 QString("rejecting invalid module id size (%1 chars [1,%2])")
1380 .arg(idLength).arg(MAX_MODULE_IDENTIFIER_LEN)1383 .arg(idLength).arg(MAX_MODULE_ID_LENTGH),
1384 "RangeError"
1381 );1385 );
1382 }1386 }
1383 1387
@@ -1598,7 +1602,7 @@ QScriptValue ScriptEngine::instantiateModule(const QScriptValue& module, const Q · 214 unmodified lines
1598 1602
1599// CommonJS/Node.js like require/module support1603// CommonJS/Node.js like require/module support
1600QScriptValue ScriptEngine::require(const QString& moduleId) {1604QScriptValue ScriptEngine::require(const QString& moduleId) {
1601 qCDebug(scriptengine_module) << "ScriptEngine::require(" << moduleId.left(MAX_MODULE_IDENTIFIER_LOG_LEN) << ")";1605 qCDebug(scriptengine_module) << "ScriptEngine::require(" << moduleId.left(MAX_DEBUG_VALUE_LENGTH) << ")";
1602 if (QThread::currentThread() != thread()) {1606 if (QThread::currentThread() != thread()) {
1603 qCDebug(scriptengine_module) << moduleId << " threads mismatch";1607 qCDebug(scriptengine_module) << moduleId << " threads mismatch";
1604 return nullValue();1608 return nullValue();
@@ -2245,9 +2249,8 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 640 unmodified lines
2245 testConstructorType = "empty";2249 testConstructorType = "empty";
2246 }2250 }
2247 QString testConstructorValue = testConstructor.toString();2251 QString testConstructorValue = testConstructor.toString();
2248 const int maxTestConstructorValueSize = 80;2252 if (testConstructorValue.size() > MAX_DEBUG_VALUE_LENGTH) {
2249 if (testConstructorValue.size() > maxTestConstructorValueSize) {2253 testConstructorValue = testConstructorValue.mid(0, MAX_DEBUG_VALUE_LENGTH) + "...";
2250 testConstructorValue = testConstructorValue.mid(0, maxTestConstructorValueSize) + "...";
2251 }2254 }
2252 auto message = QString("failed to load entity script -- expected a function, got %1, %2")2255 auto message = QString("failed to load entity script -- expected a function, got %1, %2")
2253 .arg(testConstructorType).arg(testConstructorValue);2256 .arg(testConstructorType).arg(testConstructorValue);