mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 13:09:52 +02:00
Fixed Script.resolvePath issue in modules
This commit is contained in:
parent
27b5d838f5
commit
ba0e705b5a
5 changed files with 25 additions and 6 deletions
|
@ -350,7 +350,7 @@ public:
|
||||||
virtual void registerFunction(const QString& name, FunctionSignature fun, int numArguments = -1) = 0;
|
virtual void registerFunction(const QString& name, FunctionSignature fun, int numArguments = -1) = 0;
|
||||||
virtual void registerFunction(const QString& parent, const QString& name, FunctionSignature fun, int numArguments = -1) = 0;
|
virtual void registerFunction(const QString& parent, const QString& name, FunctionSignature fun, int numArguments = -1) = 0;
|
||||||
virtual void registerGetterSetter(const QString& name, FunctionSignature getter, FunctionSignature setter, const QString& parent = QString("")) = 0;
|
virtual void registerGetterSetter(const QString& name, FunctionSignature getter, FunctionSignature setter, const QString& parent = QString("")) = 0;
|
||||||
virtual void registerGlobalObject(const QString& name, QObject* object) = 0;
|
virtual void registerGlobalObject(const QString& name, QObject* object, ScriptEngine::ValueOwnership = ScriptEngine::QtOwnership) = 0;
|
||||||
virtual void setDefaultPrototype(int metaTypeId, const ScriptValue& prototype) = 0;
|
virtual void setDefaultPrototype(int metaTypeId, const ScriptValue& prototype) = 0;
|
||||||
virtual void setObjectName(const QString& name) = 0;
|
virtual void setObjectName(const QString& name) = 0;
|
||||||
virtual bool setProperty(const char* name, const QVariant& value) = 0;
|
virtual bool setProperty(const char* name, const QVariant& value) = 0;
|
||||||
|
|
|
@ -222,6 +222,11 @@ QString ScriptFunctionContextV8Wrapper::fileName() const {
|
||||||
v8::Context::Scope contextScope(_context.Get(isolate));
|
v8::Context::Scope contextScope(_context.Get(isolate));
|
||||||
// V8TODO: does this work for context selected with contextScope?
|
// V8TODO: does this work for context selected with contextScope?
|
||||||
v8::Local<v8::String> name = v8::StackTrace::CurrentScriptNameOrSourceURL(_engine->getIsolate());
|
v8::Local<v8::String> name = v8::StackTrace::CurrentScriptNameOrSourceURL(_engine->getIsolate());
|
||||||
|
/*auto stackTrace = v8::StackTrace::CurrentStackTrace(isolate, 1);
|
||||||
|
if (stackTrace.IsEmpty() || stackTrace->GetFrameCount() == 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
auto name = stackTrace->GetFrame(isolate, 0)->GetScriptNameOrSourceURL();*/
|
||||||
v8::String::Utf8Value nameUTF(_engine->getIsolate(), name);
|
v8::String::Utf8Value nameUTF(_engine->getIsolate(), name);
|
||||||
return QString(*nameUTF);
|
return QString(*nameUTF);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include "../ScriptProgram.h"
|
#include "../ScriptProgram.h"
|
||||||
#include "../ScriptEngineCast.h"
|
#include "../ScriptEngineCast.h"
|
||||||
#include "../ScriptValue.h"
|
#include "../ScriptValue.h"
|
||||||
|
#include "../ScriptManagerScriptingInterface.h"
|
||||||
|
|
||||||
#include "ScriptContextV8Wrapper.h"
|
#include "ScriptContextV8Wrapper.h"
|
||||||
#include "ScriptObjectV8Proxy.h"
|
#include "ScriptObjectV8Proxy.h"
|
||||||
|
@ -335,7 +336,7 @@ void ScriptEngineV8::registerValue(const QString& valueName, V8ScriptValue value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptEngineV8::registerGlobalObject(const QString& name, QObject* object) {
|
void ScriptEngineV8::registerGlobalObject(const QString& name, QObject* object, ScriptEngine::ValueOwnership) {
|
||||||
if (QThread::currentThread() != thread()) {
|
if (QThread::currentThread() != thread()) {
|
||||||
#ifdef THREAD_DEBUGGING
|
#ifdef THREAD_DEBUGGING
|
||||||
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerGlobalObject() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
|
qCDebug(scriptengine_v8) << "*** WARNING *** ScriptEngineV8::registerGlobalObject() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "] name:" << name;
|
||||||
|
@ -627,6 +628,9 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure,
|
||||||
Q_ASSERT(false);
|
Q_ASSERT(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// "Script" API is context-dependent, so it needs to be recreated for each new context
|
||||||
|
registerGlobalObject("Script", new ScriptManagerScriptingInterface(_manager), ScriptEngine::ScriptOwnership);
|
||||||
|
|
||||||
auto maybeResult = program.constGet()->GetUnboundScript()->BindToCurrentContext()->Run(closureContext);
|
auto maybeResult = program.constGet()->GetUnboundScript()->BindToCurrentContext()->Run(closureContext);
|
||||||
v8::Local<v8::Value> v8Result;
|
v8::Local<v8::Value> v8Result;
|
||||||
if (!maybeResult.ToLocal(&v8Result)) {
|
if (!maybeResult.ToLocal(&v8Result)) {
|
||||||
|
@ -859,13 +863,13 @@ ScriptContextV8Pointer ScriptEngineV8::pushContext(v8::Local<v8::Context> contex
|
||||||
v8::HandleScope handleScope(_v8Isolate);
|
v8::HandleScope handleScope(_v8Isolate);
|
||||||
Q_ASSERT(!_contexts.isEmpty());
|
Q_ASSERT(!_contexts.isEmpty());
|
||||||
ScriptContextPointer parent = _contexts.last();
|
ScriptContextPointer parent = _contexts.last();
|
||||||
_contexts.append(std::make_shared<ScriptContextV8Wrapper>(this, context, ScriptContextPointer()));
|
_contexts.append(std::make_shared<ScriptContextV8Wrapper>(this, context, parent));
|
||||||
v8::Context::Scope contextScope(context);
|
v8::Context::Scope contextScope(context);
|
||||||
static volatile int debug_context_id = 1;
|
/*static volatile int debug_context_id = 1;
|
||||||
if (!context->Global()->Set(context, v8::String::NewFromUtf8(_v8Isolate, "debug_context_id").ToLocalChecked(), v8::Integer::New(_v8Isolate, debug_context_id)).FromMaybe(false)) {
|
if (!context->Global()->Set(context, v8::String::NewFromUtf8(_v8Isolate, "debug_context_id").ToLocalChecked(), v8::Integer::New(_v8Isolate, debug_context_id)).FromMaybe(false)) {
|
||||||
Q_ASSERT(false);
|
Q_ASSERT(false);
|
||||||
}
|
}
|
||||||
debug_context_id++;
|
debug_context_id++;*/
|
||||||
return _contexts.last();
|
return _contexts.last();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ public: // ScriptEngine implementation
|
||||||
ScriptEngine::FunctionSignature getter,
|
ScriptEngine::FunctionSignature getter,
|
||||||
ScriptEngine::FunctionSignature setter,
|
ScriptEngine::FunctionSignature setter,
|
||||||
const QString& parent = QString("")) override;
|
const QString& parent = QString("")) override;
|
||||||
Q_INVOKABLE virtual void registerGlobalObject(const QString& name, QObject* object) override;
|
Q_INVOKABLE virtual void registerGlobalObject(const QString& name, QObject* object, ScriptEngine::ValueOwnership = ScriptEngine::QtOwnership) override;
|
||||||
virtual void setDefaultPrototype(int metaTypeId, const ScriptValue& prototype) override;
|
virtual void setDefaultPrototype(int metaTypeId, const ScriptValue& prototype) override;
|
||||||
virtual void setObjectName(const QString& name) override;
|
virtual void setObjectName(const QString& name) override;
|
||||||
virtual bool setProperty(const char* name, const QVariant& value) override;
|
virtual bool setProperty(const char* name, const QVariant& value) override;
|
||||||
|
|
|
@ -939,7 +939,17 @@ void ScriptMethodV8Proxy::callback(const v8::FunctionCallbackInfo<v8::Value>& ar
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ScriptMethodV8Proxy *proxy = reinterpret_cast<ScriptMethodV8Proxy*>(data->GetAlignedPointerFromInternalField(1));
|
ScriptMethodV8Proxy *proxy = reinterpret_cast<ScriptMethodV8Proxy*>(data->GetAlignedPointerFromInternalField(1));
|
||||||
|
|
||||||
|
// V8TODO: all other V8 callbacks need this too
|
||||||
|
bool isContextChangeNeeded = (proxy->_engine->getContext() != arguments.GetIsolate()->GetCurrentContext());
|
||||||
|
if (isContextChangeNeeded) {
|
||||||
|
qDebug() << "ScriptMethodV8Proxy::callback : changing context";
|
||||||
|
proxy->_engine->pushContext(arguments.GetIsolate()->GetCurrentContext());
|
||||||
|
}
|
||||||
proxy->call(arguments);
|
proxy->call(arguments);
|
||||||
|
if (isContextChangeNeeded) {
|
||||||
|
proxy->_engine->popContext();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo<v8::Value>& arguments) {
|
void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo<v8::Value>& arguments) {
|
||||||
|
|
Loading…
Reference in a new issue