History

Merge branch 'master' into feature/require-redownload

Kalila L committed 6 years ago

Commit 36f5fd92 parents 9f3978d 89c006d306 files · +152544 −6540Browse files

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

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+76−4
@@ -40,6 +40,7 @@ · 39 unmodified lines
4040
4141 #include <shared/LocalFileAccessGate.h>
4242 #include <shared/QtHelpers.h>
43+#include <shared/AbstractLoggerInterface.h>
4344 #include <AudioConstants.h>
4445 #include <AudioEffectOptions.h>
4546 #include <AvatarData.h>
@@ -78,7 +79,6 @@ · 32 unmodified lines
7879 #include "StackTestScriptingInterface.h"
7980 #include "ModelScriptingInterface.h"
8081
81−
8282 #include <Profile.h>
8383
8484 #include "../../midi/src/Midi.h" // FIXME why won't a simpler include work?
@@ -108,7 +108,10 @@ int functionSignatureMetaID = qRegisterMetaType<QScriptEngine::FunctionSignature · 23 unmodified lines
108108
109109 int scriptEnginePointerMetaID = qRegisterMetaType<ScriptEnginePointer>();
110110
111+Q_DECLARE_METATYPE(ExternalResource::Bucket);
112+
111113 static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) {
114+ // assemble the message by concatenating our arguments
112115 QString message = "";
113116 for (int i = 0; i < context->argumentCount(); i++) {
114117 if (i > 0) {
@@ -117,12 +120,53 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) { · 2 unmodified lines
117120 message += context->argument(i).toString();
118121 }
119122
120− if (ScriptEngine *scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
123+ // was this generated by a script engine? If we don't recognize it then send the message and exit
124+ ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine);
125+ if (!scriptEngine) {
126+ qCDebug(scriptengine_script, "%s", qUtf8Printable(message));
127+ return QScriptValue();
128+ }
129+
130+ // This message was sent by one of our script engines, let's try to see if we can find the source.
131+ // Note that the first entry in the backtrace should be "print" and is somewhat useless to us
132+ AbstractLoggerInterface* loggerInterface = AbstractLoggerInterface::get();
133+ if (loggerInterface->showSourceDebugging()) {
134+ QScriptContext* userContext = context;
135+ while (userContext && QScriptContextInfo(userContext).functionType() == QScriptContextInfo::NativeFunction) {
136+ userContext = userContext->parentContext();
137+ }
138+ QString location;
139+ if (userContext) {
140+ QScriptContextInfo contextInfo(userContext);
141+ QString fileName = contextInfo.fileName();
142+ int lineNumber = contextInfo.lineNumber();
143+ QString functionName = contextInfo.functionName();
144+
145+ location = functionName;
146+ if (!fileName.isEmpty()) {
147+ if (location.isEmpty()) {
148+ location = fileName;
149+ } else {
150+ location = QString("%1 at %2").arg(location).arg(fileName);
151+ }
152+ }
153+ if (lineNumber != -1) {
154+ location = QString("%1:%2").arg(location).arg(lineNumber);
155+ }
156+ }
157+ if (location.isEmpty()) {
158+ location = scriptEngine->getFilename();
159+ }
160+
161+ // give the script engine a chance to notify the system about this message
162+ scriptEngine->print(message);
163+
164+ // send the message to debug log
165+ qCDebug(scriptengine_script, "[%s] %s", qUtf8Printable(location), qUtf8Printable(message));
166+ } else {
121167 scriptEngine->print(message);
122168 // prefix the script engine name to help disambiguate messages in the main debug log
123169 qCDebug(scriptengine_script, "[%s] %s", qUtf8Printable(scriptEngine->getFilename()), qUtf8Printable(message));
124− } else {
125− qCDebug(scriptengine_script, "%s", qUtf8Printable(message));
126170 }
127171
128172 return QScriptValue();
@@ -663,6 +707,14 @@ void avatarDataFromScriptValue(const QScriptValue& object, ScriptAvatarData*& ou · 534 unmodified lines
663707 out = nullptr;
664708 }
665709
710+QScriptValue externalResourceBucketToScriptValue(QScriptEngine* engine, ExternalResource::Bucket const& in) {
711+ return QScriptValue((int)in);
712+}
713+
714+void externalResourceBucketFromScriptValue(const QScriptValue& object, ExternalResource::Bucket& out) {
715+ out = static_cast<ExternalResource::Bucket>(object.toInt32());
716+}
717+
666718 void ScriptEngine::resetModuleCache(bool deleteScriptCache) {
667719 if (QThread::currentThread() != thread()) {
668720 executeOnScriptThread([=]() { resetModuleCache(deleteScriptCache); });
@@ -770,6 +822,9 @@ void ScriptEngine::init() { · 101 unmodified lines
770822 resetModuleCache();
771823 }
772824
825+ qScriptRegisterMetaType(this, externalResourceBucketToScriptValue, externalResourceBucketFromScriptValue);
826+ registerEnum("Script.ExternalPaths", QMetaEnum::fromType<ExternalResource::Bucket>());
827+
773828 registerGlobalObject("Audio", DependencyManager::get<AudioScriptingInterface>().data());
774829
775830 registerGlobalObject("Midi", DependencyManager::get<Midi>().data());
@@ -827,6 +882,19 @@ void ScriptEngine::init() { · 51 unmodified lines
827882 }));
828883 }
829884
885+void ScriptEngine::registerEnum(const QString& enumName, QMetaEnum newEnum) {
886+ if (!newEnum.isValid()) {
887+ qCCritical(scriptengine) << "registerEnum called on invalid enum with name " << enumName;
888+ return;
889+ }
890+
891+ for (int i = 0; i < newEnum.keyCount(); i++) {
892+ const char* keyName = newEnum.key(i);
893+ QString fullName = enumName + "." + keyName;
894+ registerValue(fullName, newEnum.keyToValue(keyName));
895+ }
896+}
897+
830898 void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {
831899 if (QThread::currentThread() != thread()) {
832900 #ifdef THREAD_DEBUGGING
@@ -2859,3 +2927,7 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 2026 unmodified lines
28592927 }
28602928 }
28612929 }
2930+
2931+QString ScriptEngine::getExternalPath(ExternalResource::Bucket bucket, const QString& path) {
2932+ return ExternalResource::getInstance()->getUrl(bucket, path);
2933+}