Skip to content

Commit e80eb1b

Browse files
committed
Added script context to GScriptWrapper. Now the override-from-script C++ functions can do a lot more than before, such as transfering the ownership.
1 parent 3d322fc commit e80eb1b

File tree

7 files changed

+35
-17
lines changed

7 files changed

+35
-17
lines changed

include/cpgf/metatraits/gmetascriptwrapper.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
#ifndef CPGF_GMETASCRIPTWRAPPER_H
22
#define CPGF_GMETASCRIPTWRAPPER_H
33

4-
54
#include "cpgf/gapiutil.h"
65

7-
86
namespace cpgf {
97

10-
118
struct IScriptDataStorage;
9+
struct IScriptContext;
1210
struct GMetaTraitsParam;
1311

1412
struct IMetaScriptWrapper : public IObject
1513
{
16-
virtual void G_API_CC setScriptDataStorage(void * instance, IScriptDataStorage * scriptDataStorage) = 0;
14+
virtual void G_API_CC initializeScriptWrapper(void * instance, IScriptDataStorage * scriptDataStorage, IScriptContext * scriptContext) = 0;
1715
};
1816

19-
2017
template <typename T>
2118
struct GMetaTraitsCreateScriptWrapper
2219
{
@@ -32,9 +29,7 @@ inline IMetaScriptWrapper * metaTraitsCreateScriptWrapper(const GMetaTraitsParam
3229
}
3330

3431

35-
3632
} // namespace cpgf
3733

3834

39-
4035
#endif

include/cpgf/scriptbind/gscriptwrapper.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,18 @@ class GScriptWrapper
2121
{
2222
public:
2323
GScriptWrapper();
24+
~GScriptWrapper();
2425

2526
IScriptFunction * getScriptFunction(const char * name) const;
2627

27-
void setScriptDataStorage(IScriptDataStorage * scriptDataStorage);
28+
void initializeScriptWrapper(IScriptDataStorage * scriptDataStorage, IScriptContext * scriptContext);
29+
30+
// The caller must call releaseReference on the result
31+
IScriptContext * getScriptContext() const;
2832

2933
private:
3034
GSharedInterface<IScriptDataStorage> scriptDataStorage;
35+
GSharedInterface<IScriptContext> scriptContext;
3136
};
3237

3338
class GScriptWrapperReentryGuard

src/scriptbind/gbindgluedata.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ void GObjectGlueData::initialize()
216216
if(! this->objectInstance->dataStorage) {
217217
this->objectInstance->dataStorage.reset(new GScriptDataStorage(GObjectGlueDataPointer(this->shareFromThis())));
218218
}
219-
scriptWrapper->setScriptDataStorage(this->getInstanceAddress(), this->objectInstance->dataStorage.get());
219+
scriptWrapper->initializeScriptWrapper(this->getInstanceAddress(), this->objectInstance->dataStorage.get(), this->getBindingContext()->borrowScriptContext());
220220
}
221221
}
222222

src/scriptbind/gscriptwrapper.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "cpgf/scriptbind/gscriptwrapper.h"
22
#include "cpgf/scriptbind/gscriptbindapi.h"
3+
#include "cpgf/scriptbind/gscriptbind.h"
34
#include "cpgf/gclassutil.h"
45
#include "cpgf/gapiutil.h"
56

@@ -8,7 +9,13 @@ namespace cpgf {
89

910

1011
GScriptWrapper::GScriptWrapper()
11-
: scriptDataStorage(nullptr)
12+
:
13+
scriptDataStorage(),
14+
scriptContext()
15+
{
16+
}
17+
18+
GScriptWrapper::~GScriptWrapper()
1219
{
1320
}
1421

@@ -22,11 +29,18 @@ IScriptFunction * GScriptWrapper::getScriptFunction(const char * name) const
2229
}
2330
}
2431

25-
void GScriptWrapper::setScriptDataStorage(IScriptDataStorage * scriptDataStorage)
32+
void GScriptWrapper::initializeScriptWrapper(IScriptDataStorage * scriptDataStorage, IScriptContext * scriptContext)
2633
{
2734
this->scriptDataStorage.reset(scriptDataStorage);
35+
this->scriptContext.reset(scriptContext);
2836
}
2937

38+
IScriptContext * GScriptWrapper::getScriptContext() const
39+
{
40+
IScriptContext * context = this->scriptContext.get();
41+
context->addReference();
42+
return context;
43+
}
3044

3145
namespace scriptbind_internal {
3246

@@ -41,8 +55,8 @@ class GMetaScriptWrapper : public IMetaScriptWrapper
4155
virtual ~GMetaScriptWrapper() {
4256
}
4357

44-
virtual void G_API_CC setScriptDataStorage(void * instance, IScriptDataStorage * scriptDataStorage) {
45-
static_cast<GScriptWrapper *>(this->caster(instance))->setScriptDataStorage(scriptDataStorage);
58+
virtual void G_API_CC initializeScriptWrapper(void * instance, IScriptDataStorage * scriptDataStorage, IScriptContext * scriptContext) {
59+
static_cast<GScriptWrapper *>(this->caster(instance))->initializeScriptWrapper(scriptDataStorage, scriptContext);
4660
}
4761

4862
private:

test/metagen/metadata/include/meta_test_simpleoverridefromscript.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class SimpleOverrideWrapper : public SimpleOverride, public cpgf::GScriptWrapper
4646
if(func)
4747
{
4848
cpgf::GScriptValue ret = cpgf::invokeScriptFunctionOnObject(func.get(), this);
49-
ret.discardOwnership();
49+
cpgf::GScopedInterface<cpgf::IScriptContext> scriptContext(this->getScriptContext());
50+
scriptContext->setAllowGC(&ret.getValue().refData(), false);
5051
return cpgf::fromVariant<SimpleOverrideHelperData * >(ret.getValue());
5152
}
5253
return SimpleOverride::createHelperData();

test/metagen/tests/test_metagen_simpleoverridefromscript.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,10 @@ void doTestSimpleOverrideFromScript_discardOwnership(T * /* binding */, TestScri
154154
QDO(DerivedClass.createHelperData = createHelperData)
155155

156156
QVARNEWOBJ(a, DerivedClass(0))
157-
// This causes test failure, just comment it out for now, will check later.
158-
// QDO(a.consumeHelperData())
157+
158+
// This line tests the overrided createHelperData in SimpleOverrideWrapper
159+
// the line will crash if the result value from doesn't discard ownership.
160+
QDO(a.consumeHelperData())
159161

160162
// there is no explicit assertion as it has to be done at a layer above this test, e.g. valgrind
161163
// checking the double-free

tools/metagen/tool/src/org/cpgf/metagen/metawriter/ClassWrapperWriter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ private void doWriteOverrideVirtualMethod(CppWriter codeWriter, CppMethod cppMet
9797
if(cppMethod.hasResult()) {
9898
if (cppMethod.getDiscardResultOwnership()) {
9999
codeWriter.writeLine("cpgf::GScriptValue ret = " + invoke + ";");
100-
codeWriter.writeLine("ret.discardOwnership();");
100+
codeWriter.writeLine("cpgf::GScopedInterface<cpgf::IScriptContext> scriptContext(this->getScriptContext());");
101+
codeWriter.writeLine("scriptContext->setAllowGC(&ret.getValue().refData(), false);");
101102
invoke = "return cpgf::fromVariant<" + cppMethod.getResultType().getLiteralType() + " >(ret.getValue())";
102103
} else {
103104
invoke = "return cpgf::fromVariant<" + cppMethod.getResultType().getLiteralType() + " >(" + invoke + ".getValue())";

0 commit comments

Comments
 (0)