Skip to content

Commit

Permalink
修正unity使用.net4.0时的GC问题
Browse files Browse the repository at this point in the history
将所有静态方法预先创建委托对象
  • Loading branch information
wuxiaoyu committed Mar 1, 2019
1 parent c6dc151 commit f79272a
Show file tree
Hide file tree
Showing 23 changed files with 201 additions and 166 deletions.
Binary file modified ASCTest/bin/Release/as3protobuf.swc
Binary file not shown.
7 changes: 7 additions & 0 deletions ASCTest/testScript/AS3Testproj/amd/bcd.as
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,11 @@ package

}

function a(b:int)
{
this.a = 1;
}

var o = new a(3);
trace(o+this);
trace([1, 2, 3, true].join([3,4]));
8 changes: 5 additions & 3 deletions ASRuntime/Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2287,8 +2287,10 @@ public ResultPool() : base(256)
public bool isSuccess;
public bool isEnd;
}
private static BlockCallBackBase.dgeCallbacker D_runfuntionEnd = new BlockCallBackBase.dgeCallbacker(runfuntionEnd);
private static BlockCallBackBase.dgeCallbacker D_runfuntionFailed = new BlockCallBackBase.dgeCallbacker(runfuntionFailed);

internal bool runFuncCaller(operators.FunctionCaller funcCaller, SourceToken token, out error.InternalError error)
internal bool runFuncCaller(operators.FunctionCaller funcCaller, SourceToken token, out error.InternalError error)
{
if (funcCaller.callbacker != null)
{
Expand All @@ -2299,8 +2301,8 @@ internal bool runFuncCaller(operators.FunctionCaller funcCaller, SourceToken tok
r.isSuccess = false; r.isEnd = false;

BlockCallBackBase cb = blockCallBackPool.create();
cb.setCallBacker(runfuntionEnd);
cb.setWhenFailed(runfuntionFailed);
cb.setCallBacker(D_runfuntionEnd);
cb.setWhenFailed(D_runfuntionFailed);
cb.cacheObjects[0] = r;

funcCaller.callbacker = cb;
Expand Down
14 changes: 8 additions & 6 deletions ASRuntime/nativefuncs/Array_buildin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -671,15 +671,17 @@ public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argeme
sendargs[8] = new rtInt(0);

sepcb.args = sendargs;
sepcb.setCallBacker(_SeptoString_CB);
sepcb.setCallBacker(D_SeptoString_CB);

operators.OpCast.CastValue(argements[0].getValue(), RunTimeDataType.rt_string,
frame, token, scope, frame._tempSlot1, sepcb, false);


}
private static BlockCallBackBase.dgeCallbacker D_SeptoString_CB = new BlockCallBackBase.dgeCallbacker(_SeptoString_CB);
private static BlockCallBackBase.dgeCallbacker D_ValueToString_CB = new BlockCallBackBase.dgeCallbacker(_ValueToString_CB);

private void _SeptoString_CB(BlockCallBackBase sender, object args)
private static void _SeptoString_CB(BlockCallBackBase sender, object args)
{
object[] receiveArgs = (object[])sender.args;
StackFrame frame = (StackFrame)receiveArgs[2];
Expand All @@ -699,7 +701,7 @@ private void _SeptoString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg + 1;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

operators.OpCast.CastValue(array.innerArray[sender._intArg], RunTimeDataType.rt_string,
frame,
Expand All @@ -711,7 +713,7 @@ private void _SeptoString_CB(BlockCallBackBase sender, object args)

}

private void _ValueToString_CB(BlockCallBackBase sender, object args)
private static void _ValueToString_CB(BlockCallBackBase sender, object args)
{
object[] receiveArgs = (object[])sender.args;
StackFrame frame = (StackFrame)receiveArgs[2];
Expand All @@ -725,7 +727,7 @@ private void _ValueToString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

frame.player.CallBlankBlock(valueCB);
return;
Expand Down Expand Up @@ -760,7 +762,7 @@ private void _ValueToString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg + 1;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

operators.OpCast.CastValue(array.innerArray[sender._intArg], RunTimeDataType.rt_string,
frame,
Expand Down
16 changes: 8 additions & 8 deletions ASRuntime/nativefuncs/Vector_buildin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -902,15 +902,15 @@ public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argeme
sendargs[8] = new rtInt(0);

sepcb.args = sendargs;
sepcb.setCallBacker(_SeptoString_CB);
sepcb.setCallBacker(D_SeptoString_CB);

operators.OpCast.CastValue(argements[0].getValue(), RunTimeDataType.rt_string,
frame, token, scope, frame._tempSlot1, sepcb, false);


}

private void _SeptoString_CB(BlockCallBackBase sender, object args)
private static BlockCallBackBase.dgeCallbacker D_SeptoString_CB = new BlockCallBackBase.dgeCallbacker(_SeptoString_CB);
private static void _SeptoString_CB(BlockCallBackBase sender, object args)
{
object[] receiveArgs = (object[])sender.args;
StackFrame frame = (StackFrame)receiveArgs[2];
Expand All @@ -930,7 +930,7 @@ private void _SeptoString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg + 1;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

operators.OpCast.CastValue(array[sender._intArg], RunTimeDataType.rt_string,
frame,
Expand All @@ -942,8 +942,8 @@ private void _SeptoString_CB(BlockCallBackBase sender, object args)

}


private void _ValueToString_CB(BlockCallBackBase sender, object args)
private static BlockCallBackBase.dgeCallbacker D_ValueToString_CB = new BlockCallBackBase.dgeCallbacker(_ValueToString_CB);
private static void _ValueToString_CB(BlockCallBackBase sender, object args)
{

object[] receiveArgs = (object[])sender.args;
Expand All @@ -958,7 +958,7 @@ private void _ValueToString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

frame.player.CallBlankBlock(valueCB);
return;
Expand Down Expand Up @@ -993,7 +993,7 @@ private void _ValueToString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg + 1;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

operators.OpCast.CastValue(array[sender._intArg], RunTimeDataType.rt_string,
frame,
Expand Down
6 changes: 3 additions & 3 deletions ASRuntime/nativefuncs/Yield_buildin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argeme

BlockCallBackBase cb = frame.player.blockCallBackPool.create();
cb.args = yieldObj;
cb.setCallBacker(_movenext_callbacker);
cb.setCallBacker(D_movenext_callbacker);


frame.player.callBlock(
Expand All @@ -94,8 +94,8 @@ public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argeme


}

private void _movenext_callbacker(BlockCallBackBase sender, object args)
private static BlockCallBackBase.dgeCallbacker D_movenext_callbacker = new BlockCallBackBase.dgeCallbacker(_movenext_callbacker);
private static void _movenext_callbacker(BlockCallBackBase sender, object args)
{
ASBinCode.rtti.YieldObject yieldObj = (ASBinCode.rtti.YieldObject)sender.args;

Expand Down
10 changes: 5 additions & 5 deletions ASRuntime/nativefuncs/__buildin__.cs
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ private void _SeptoString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg + 1;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);
valueCB._intArg2 = sender._intArg2;
var v = array.innerArray[sender._intArg];
if (v.rtType == RunTimeDataType.rt_void)
Expand All @@ -238,8 +238,8 @@ private void _SeptoString_CB(BlockCallBackBase sender, object args)
);

}

private void _ValueToString_CB(BlockCallBackBase sender, object args)
private static BlockCallBackBase.dgeCallbacker D_ValueToString_CB = new BlockCallBackBase.dgeCallbacker(_ValueToString_CB);
private static void _ValueToString_CB(BlockCallBackBase sender, object args)
{
object[] receiveArgs = (object[])sender.args;
StackFrame frame = (StackFrame)receiveArgs[2];
Expand All @@ -254,7 +254,7 @@ private void _ValueToString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg;valueCB._intArg2 = 0;
valueCB.args = valueCB.copyFromReceiveArgs( receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

frame.player.CallBlankBlock(valueCB);
return;
Expand All @@ -279,7 +279,7 @@ private void _ValueToString_CB(BlockCallBackBase sender, object args)
BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
valueCB._intArg = sender._intArg + 1;valueCB._intArg2 = sender._intArg2;
valueCB.args = valueCB.copyFromReceiveArgs(receiveArgs);
valueCB.setCallBacker(_ValueToString_CB);
valueCB.setCallBacker(D_ValueToString_CB);

var v = array.innerArray[sender._intArg];
if (v.rtType == RunTimeDataType.rt_void)
Expand Down
38 changes: 23 additions & 15 deletions ASRuntime/operators/FunctionCaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -622,8 +622,10 @@ private void setCheckedParameter(int para_id, RunTimeValueBase value)
_getArgementSlot(para_id).directSet(value);
}

private static BlockCallBackBase.dgeCallbacker D_check_para_callbacker = new BlockCallBackBase.dgeCallbacker(check_para_callbacker);
private static BlockCallBackBase.dgeCallbacker D_check_para_failed = new BlockCallBackBase.dgeCallbacker(check_para_failed);

private void check_para(BlockCallBackBase checkparacb)
private void check_para(BlockCallBackBase checkparacb)
{
while (check_para_id < pushedArgs)
{
Expand Down Expand Up @@ -654,9 +656,10 @@ private void check_para(BlockCallBackBase checkparacb)
BlockCallBackBase cb = player.blockCallBackPool.create();
cb.args = argement;
cb._intArg = check_para_id;
cb.setCallBacker(check_para_callbacker);
cb.setWhenFailed(check_para_failed);

cb.cacheObjects[0] = this;
cb.setCallBacker(D_check_para_callbacker);
cb.setWhenFailed(D_check_para_failed);

check_para_id++;

OpCast.CastValue(argement, parameter[
Expand Down Expand Up @@ -718,24 +721,26 @@ private void check_para(BlockCallBackBase checkparacb)
doCall_allcheckpass();
}

private void check_para_failed(BlockCallBackBase sender, object args)
private static void check_para_failed(BlockCallBackBase sender, object args)
{
FunctionCaller caller = (FunctionCaller)sender.cacheObjects[0];
//清理栈
clear_para_slot(invokerFrame, onstackparametercount); onstackparametercount = 0;
if (callbacker != null)
clear_para_slot(caller.invokerFrame, caller.onstackparametercount); caller.onstackparametercount = 0;
if (caller.callbacker != null)
{
callbacker.noticeRunFailed();
caller.callbacker.noticeRunFailed();
}
release();
caller.release();
}

private void check_para_callbacker(BlockCallBackBase sender, object args)
private static void check_para_callbacker(BlockCallBackBase sender, object args)
{
if (sender.isSuccess)
{
FunctionCaller caller = (FunctionCaller)sender.cacheObjects[0];
//CallFuncHeap[sender._intArg].directSet(_tempSlot.getValue());
setCheckedParameter(sender._intArg, _tempSlot.getValue());
check_para(sender);
caller.setCheckedParameter(sender._intArg, caller._tempSlot.getValue());
caller.check_para(sender);
}
else
{
Expand All @@ -745,7 +750,10 @@ private void check_para_callbacker(BlockCallBackBase sender, object args)
}
}

internal void doCall_allcheckpass()
private static BlockCallBackBase.dgeCallbacker D_callfun_cb = new BlockCallBackBase.dgeCallbacker(callfun_cb);
private static BlockCallBackBase.dgeCallbacker D_callfun_failed = new BlockCallBackBase.dgeCallbacker(callfun_failed);

internal void doCall_allcheckpass()
{

if (toCallFunc.isYield)
Expand Down Expand Up @@ -822,8 +830,8 @@ internal void doCall_allcheckpass()
cb.cacheObjects[0] = callbacker;
cb.cacheObjects[1] = invokerFrame;

cb.setCallBacker(callfun_cb);
cb.setWhenFailed(callfun_failed);
cb.setCallBacker(D_callfun_cb);
cb.setWhenFailed(D_callfun_failed);
cb._intArg = onstackparametercount;
onstackparametercount = 0;

Expand Down

0 comments on commit f79272a

Please sign in to comment.