Skip to content

Commit 4d579a8

Browse files
committed
1、修复由于异常捕获方法调用后未出栈问题导致的内部错误
2、修复Unity下多个context相互影响问题。 Former-commit-id: 27a6cb27fc741505367a84dadcc2af80dd4086bd
1 parent 87532ce commit 4d579a8

19 files changed

Lines changed: 214 additions & 238 deletions

Sample/Android/app/app.iml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,6 @@
6969
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
7070
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
7171
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
72-
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
73-
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
74-
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
75-
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
76-
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
77-
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
78-
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
79-
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
8072
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
8173
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
8274
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@@ -85,6 +77,14 @@
8577
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
8678
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
8779
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
80+
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
81+
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
82+
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
83+
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
84+
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
85+
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
86+
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
87+
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
8888
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
8989
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
9090
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />

Source/Unity3D/UnityCommon/LuaUnityDefined.h

Lines changed: 8 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@ extern "C" {
3333
*/
3434
typedef void* (*LuaMethodHandlerPtr)(int, const char *, const void *, int);
3535

36-
/**
37-
Lua模块方法处理器
38-
*/
39-
typedef void* (*LuaModuleMethodHandlerPtr) (int moduleId, const char *methodName, const void *argumentsBuffer, int bufferSize);
40-
4136
/**
4237
Lua实例创建处理器
4338
*/
@@ -53,104 +48,31 @@ extern "C" {
5348
*/
5449
typedef char* (*LuaInstanceDescriptionHandlerPtr) (long long instance);
5550

51+
/**
52+
Lua类方法处理器
53+
*/
54+
typedef void* (*LuaModuleMethodHandlerPtr) (int contextId, int moduleId, const char *methodName, const void *argumentsBuffer, int bufferSize);
55+
5656
/**
5757
Lua实例方法处理器
5858
*/
59-
typedef void* (*LuaInstanceMethodHandlerPtr) (int classId, long long instance, const char *methodName, const void *argumentsBuffer, int bufferSize);
59+
typedef void* (*LuaInstanceMethodHandlerPtr) (int contextId, int classId, long long instance, const char *methodName, const void *argumentsBuffer, int bufferSize);
6060

6161
/**
6262
Lua实例字段获取器
6363
*/
64-
typedef void* (*LuaInstanceFieldGetterHandlerPtr) (int classId, long long instance, const char *fieldName);
64+
typedef void* (*LuaInstanceFieldGetterHandlerPtr) (int contextId, int classId, long long instance, const char *fieldName);
6565

6666
/**
6767
Lua实例字段设置处理器
6868
*/
69-
typedef void* (*LuaInstanceFieldSetterHandlerPtr) (int classId, long long instance, const char *fieldName, const void *valueBuffer, int bufferSize);
69+
typedef void* (*LuaInstanceFieldSetterHandlerPtr) (int contextId, int classId, long long instance, const char *fieldName, const void *valueBuffer, int bufferSize);
7070

7171
/**
7272
Lua异常处理器
7373
*/
7474
typedef void (*LuaExceptionHandlerPtr) (int contextId, const void *);
7575

76-
/**
77-
检测是否为LuaObjectClass子类
78-
*/
79-
typedef const char* (*LuaCheckObjectSubclassHandlerPtr) (int contextId, const char *className);
80-
81-
/**
82-
允许类型导出处理器
83-
*/
84-
typedef bool (*LuaAllowExportsClassHandlerPtr) (int contextId, const char *className);
85-
86-
/**
87-
获取所有导出类方法
88-
*/
89-
typedef void* (*LuaAllExportClassMethodHandlerPtr) (int contextId, const char *className);
90-
91-
/**
92-
获取所有导出实例方法
93-
*/
94-
typedef void* (*LuaAllExportInstanceMethodHandlerPtr) (int contextId, const char *className);
95-
96-
/**
97-
获取所有导出字段Getter方法
98-
*/
99-
typedef void* (*LuaAllExportFieldGetterHandlerPtr) (int contextId, const char *className);
100-
101-
/**
102-
获取所有导出字段Setter方法
103-
*/
104-
typedef void* (*LuaAllExportFieldSetterHandlerPtr) (int contextId, const char *className);
105-
106-
/**
107-
创建原生对象实例
108-
*/
109-
typedef long long (*LuaCreateNativeObjectHandlerPtr) (int contextId, const char *className);
110-
111-
/**
112-
* 类方法调用处理器
113-
*/
114-
typedef void* (*LuaNativeClassMethodInvokeHandlerPtr) (
115-
int contextId,
116-
const char *className,
117-
const char *methodName,
118-
const void *argumentsBuffer,
119-
int bufferSize);
120-
121-
/**
122-
* 实例方法调用处理器
123-
*/
124-
typedef void* (*LuaNativeInstanceMethodInvokeHandlerPtr) (
125-
int contextId,
126-
const char *className,
127-
long long instance,
128-
const char *methodName,
129-
const void *argumentsBuffer,
130-
int bufferSize);
131-
132-
/**
133-
Lua实例字段获取器
134-
*/
135-
typedef void* (*LuaNativeFieldGetterHandlerPtr) (
136-
int contextId,
137-
const char *className,
138-
long long instance,
139-
const char *fieldName);
140-
141-
/**
142-
Lua实例字段设置处理器
143-
*/
144-
typedef void (*LuaNativeFieldSetterHandlerPtr) (
145-
int contextId,
146-
const char *className,
147-
long long instance,
148-
const char *fieldName,
149-
const void *valueBuffer,
150-
int bufferSize);
151-
152-
153-
15476
typedef std::map<std::string, LuaMethodHandlerPtr> LuaMethodPtrMap;
15577
typedef std::map<int, LuaExceptionHandlerPtr> LuaContextExceptionPtrMap;
15678
typedef std::map<int, LuaMethodPtrMap> LuaContextMethodPtrMap;

Source/Unity3D/UnityCommon/LuaUnityExportMethodDescriptor.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ LuaValue* LuaUnityExportMethodDescriptor::invokeClassMethod(LuaSession *session,
5656
//paramsBuffer的内容由C#端进行释放
5757
std::string methodName = StringUtils::format("%s_%s", name().c_str(), methodSignature().c_str());
5858
const void *paramsBuffer = encoder -> cloneBuffer();
59-
void *returnBuffer = _classMethodHandler(typeDescriptor -> objectId(), methodName.c_str(), paramsBuffer, encoder -> getBufferLength());
59+
void *returnBuffer = _classMethodHandler(session -> getContext() -> objectId(),
60+
typeDescriptor -> objectId(),
61+
methodName.c_str(),
62+
paramsBuffer,
63+
encoder -> getBufferLength());
6064

6165
encoder -> release();
6266

@@ -102,11 +106,12 @@ LuaValue* LuaUnityExportMethodDescriptor::invokeInstanceMethod(LuaSession *sessi
102106
//paramsBuffer的内容由C#端进行释放
103107
std::string methodName = StringUtils::format("%s_%s", name().c_str(), methodSignature().c_str());
104108
const void *paramsBuffer = encoder -> cloneBuffer();
105-
void *returnBuffer = _instanceMethodHandler(typeDescriptor -> objectId(),
106-
(long long) instance -> getObject(),
107-
methodName.c_str(),
108-
paramsBuffer,
109-
encoder -> getBufferLength());
109+
void *returnBuffer = _instanceMethodHandler(session -> getContext() -> objectId(),
110+
typeDescriptor -> objectId(),
111+
(long long) instance -> getObject(),
112+
methodName.c_str(),
113+
paramsBuffer,
114+
encoder -> getBufferLength());
110115

111116
encoder -> release();
112117

Source/Unity3D/UnityCommon/LuaUnityExportPropertyDescriptor.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ LuaValue* LuaUnityExportPropertyDescriptor::invokeGetter(LuaSession *session, Lu
3232
{
3333
if (_getterHandler != NULL)
3434
{
35-
void *returnBuffer = _getterHandler (typeDescriptor -> objectId(), (long long) instance -> getObject(), name().c_str());
35+
void *returnBuffer = _getterHandler (session -> getContext() -> objectId(),
36+
typeDescriptor -> objectId(),
37+
(long long) instance -> getObject(),
38+
name().c_str());
3639
if (returnBuffer != NULL)
3740
{
3841
LuaObjectDecoder *decoder = new LuaObjectDecoder(session -> getContext(), returnBuffer);
@@ -77,7 +80,8 @@ void LuaUnityExportPropertyDescriptor::invokeSetter(LuaSession *session, LuaObje
7780
//valueBuf的内容由C#端进行释放
7881
const void *valueBuf = encoder -> cloneBuffer();
7982

80-
_setterHandler (typeDescriptor -> objectId(),
83+
_setterHandler (session -> getContext() -> objectId(),
84+
typeDescriptor -> objectId(),
8185
(long long) instance -> getObject(),
8286
name().c_str(),
8387
valueBuf,

Source/Unity3D/UnityProject/Assets/Plugins/LuaScriptCore/LuaContext.cs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public class LuaContext : LuaBaseObject
5656
/// </summary>
5757
private Dictionary<string, LuaMethodHandler> _methodHandlers;
5858

59+
/// <summary>
60+
/// 导出类型管理器
61+
/// </summary>
62+
private LuaExportsTypeManager _exportsTypeManager;
63+
5964
/// <summary>
6065
/// 方法处理委托
6166
/// </summary>
@@ -157,12 +162,25 @@ internal static LuaContext getContext(int nativeId)
157162
return null;
158163
}
159164

165+
/// <summary>
166+
/// 获取导出类型管理器
167+
/// </summary>
168+
/// <value>导出类型管理器.</value>
169+
internal LuaExportsTypeManager exportsTypemanager
170+
{
171+
get
172+
{
173+
return _exportsTypeManager;
174+
}
175+
}
176+
160177
/// <summary>
161178
/// 初始化上下文
162179
/// </summary>
163180
public LuaContext()
164181
{
165182
_methodHandlers = new Dictionary<string, LuaMethodHandler> ();
183+
_exportsTypeManager = new LuaExportsTypeManager (this);
166184
_nativeObjectId = NativeUtils.createLuaContext ();
167185
_contexts.Add (_nativeObjectId, new WeakReference(this));
168186

@@ -190,7 +208,7 @@ public LuaContext()
190208
//注册类型
191209
foreach (Type t in _regTypes)
192210
{
193-
LuaExportsTypeManager.defaultManager.exportType (t, this);
211+
_exportsTypeManager.exportType (t, this);
194212
}
195213
}
196214

@@ -233,7 +251,7 @@ public void setGlobal(string name, LuaValue value)
233251
IntPtr valuePtr = IntPtr.Zero;
234252
if (value != null)
235253
{
236-
LuaObjectEncoder encoder = new LuaObjectEncoder ();
254+
LuaObjectEncoder encoder = new LuaObjectEncoder (this);
237255
encoder.writeObject (value);
238256

239257
byte[] bytes = encoder.bytes;
@@ -261,7 +279,7 @@ public LuaValue getGlobal(string name)
261279

262280
if (valuePtr != IntPtr.Zero && size > 0)
263281
{
264-
LuaObjectDecoder decoder = new LuaObjectDecoder (valuePtr, size);
282+
LuaObjectDecoder decoder = new LuaObjectDecoder (valuePtr, size, this);
265283
return decoder.readObject () as LuaValue;
266284
}
267285

@@ -279,7 +297,7 @@ public void retainValue(LuaValue value)
279297
if (value != null)
280298
{
281299
IntPtr valuePtr = IntPtr.Zero;
282-
LuaObjectEncoder encoder = new LuaObjectEncoder ();
300+
LuaObjectEncoder encoder = new LuaObjectEncoder (this);
283301
encoder.writeObject (value);
284302

285303
byte[] bytes = encoder.bytes;
@@ -306,7 +324,7 @@ public void releaseValue(LuaValue value)
306324
if (value != null)
307325
{
308326
IntPtr valuePtr = IntPtr.Zero;
309-
LuaObjectEncoder encoder = new LuaObjectEncoder ();
327+
LuaObjectEncoder encoder = new LuaObjectEncoder (this);
310328
encoder.writeObject (value);
311329

312330
byte[] bytes = encoder.bytes;
@@ -331,7 +349,7 @@ public LuaValue evalScript(string script)
331349
{
332350
IntPtr resultPtr = IntPtr.Zero;
333351
int size = NativeUtils.evalScript (_nativeObjectId, script, out resultPtr);
334-
return LuaObjectDecoder.DecodeObject (resultPtr, size) as LuaValue;
352+
return LuaObjectDecoder.DecodeObject (resultPtr, size, this) as LuaValue;
335353
}
336354

337355
/// <summary>
@@ -373,7 +391,7 @@ public LuaValue evalScriptFromFile(string filePath)
373391
#endif
374392
IntPtr resultPtr;
375393
int size = NativeUtils.evalScriptFromFile (_nativeObjectId, filePath, out resultPtr);
376-
LuaValue retValue = LuaObjectDecoder.DecodeObject (resultPtr, size) as LuaValue;
394+
LuaValue retValue = LuaObjectDecoder.DecodeObject (resultPtr, size, this) as LuaValue;
377395

378396
return retValue;
379397

@@ -392,7 +410,7 @@ public LuaValue callMethod(string methodName, List<LuaValue> arguments)
392410

393411
if (arguments != null)
394412
{
395-
LuaObjectEncoder encoder = new LuaObjectEncoder ();
413+
LuaObjectEncoder encoder = new LuaObjectEncoder (this);
396414
encoder.writeInt32 (arguments.Count);
397415
foreach (LuaValue value in arguments)
398416
{
@@ -413,7 +431,7 @@ public LuaValue callMethod(string methodName, List<LuaValue> arguments)
413431

414432
if (size > 0)
415433
{
416-
return LuaObjectDecoder.DecodeObject (resultPtr, size) as LuaValue;
434+
return LuaObjectDecoder.DecodeObject (resultPtr, size, this) as LuaValue;
417435
}
418436

419437
return new LuaValue();
@@ -468,7 +486,7 @@ private IntPtr luaMethodHandler(string methodName, IntPtr args, int size)
468486
if (_methodHandlers.ContainsKey (methodName))
469487
{
470488
//反序列化参数列表
471-
LuaObjectDecoder decoder = new LuaObjectDecoder(args, size);
489+
LuaObjectDecoder decoder = new LuaObjectDecoder(args, size, this);
472490
int argSize = decoder.readInt32 ();
473491

474492
List<LuaValue> argumentsList = new List<LuaValue> ();
@@ -486,7 +504,7 @@ private IntPtr luaMethodHandler(string methodName, IntPtr args, int size)
486504
retValue = new LuaValue ();
487505
}
488506

489-
LuaObjectEncoder encoder = new LuaObjectEncoder ();
507+
LuaObjectEncoder encoder = new LuaObjectEncoder (this);
490508
encoder.writeObject (retValue);
491509

492510
byte[] bytes = encoder.bytes;

0 commit comments

Comments
 (0)