From efa75c5376935cd1c76173a868cd4212770a8517 Mon Sep 17 00:00:00 2001 From: Aron Tsang Date: Thu, 24 Jul 2025 00:32:25 +0800 Subject: [PATCH] Switch to using a struct instead of an ArrayPool --- .../Peachpie.CodeAnalysis.csproj | 2 +- src/Peachpie.Runtime/PhpCallable.ArrayPool.tt | 36 +- .../PhpCallable.ArrayPool.tt.cs | 696 +++++++++++------- 3 files changed, 463 insertions(+), 271 deletions(-) diff --git a/src/Peachpie.CodeAnalysis/Peachpie.CodeAnalysis.csproj b/src/Peachpie.CodeAnalysis/Peachpie.CodeAnalysis.csproj index cfd67cbab5..d55ee52a05 100644 --- a/src/Peachpie.CodeAnalysis/Peachpie.CodeAnalysis.csproj +++ b/src/Peachpie.CodeAnalysis/Peachpie.CodeAnalysis.csproj @@ -3,7 +3,7 @@ net6.0 exe - $(NoWarn);1591 + $(NoWarn);1591;RS1009 Peachpie.CodeAnalysis Peachpie.CodeAnalysis php;peachpie;dotnet;compiler diff --git a/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt b/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt index 23e64d4ffd..52ea8e804c 100644 --- a/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt +++ b/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt @@ -1,9 +1,10 @@ <#@ output extension=".tt.cs" #> +<#@ import namespace="System.Linq" #> using System; -using System.Buffers; -namespace Pchp.Core; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +namespace Pchp.Core; + + partial interface IPhpCallable { @@ -22,6 +23,8 @@ partial interface IPhpCallable for(int arity = 2; arity <= 16; arity++) { #> + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -33,21 +36,30 @@ partial interface IPhpCallable <# } #> PhpValue p<#= arity - 1 #>) { - var phpArgs = ArrayPool.Shared.Rent(<#= arity #>); - try + + var tuple = new PhpArgTuple<#= arity #> { <# for(int p = 0; p < arity; p++) { #> - phpArgs[<#= p #>] = p<#= p #>; + Argument<#= p #> = p<#= p #>, <# } #> - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, <#= arity #>)); - } - finally - { - ArrayPool.Shared.Return(phpArgs, true); - } + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, <#= arity #>); + return Invoke(ctx, phpArgs); } <# } + +for (int arity = 2; arity <= 16; arity++) +{#> + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple<#= arity #> + { +<# for(int p = 0; p < arity; p++) { #> + public PhpValue Argument<#= p #>; +<# } #> + } +<# +} #> } \ No newline at end of file diff --git a/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt.cs b/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt.cs index b68f5b4f95..c3df67031f 100644 --- a/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt.cs +++ b/src/Peachpie.Runtime/PhpCallable.ArrayPool.tt.cs @@ -1,8 +1,8 @@ using System; -using System.Buffers; -namespace Pchp.Core; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +namespace Pchp.Core; + + partial interface IPhpCallable { @@ -16,6 +16,8 @@ partial interface IPhpCallable /// sealed PhpValue Invoke(Context ctx, PhpValue p0) => Invoke(ctx, MemoryMarshal.CreateReadOnlySpan(ref p0, 1)); + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -25,19 +27,18 @@ sealed PhpValue Invoke( PhpValue p0, PhpValue p1) { - var phpArgs = ArrayPool.Shared.Rent(2); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 2)); - } - finally + + var tuple = new PhpArgTuple2 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 2); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -48,20 +49,19 @@ sealed PhpValue Invoke( PhpValue p1, PhpValue p2) { - var phpArgs = ArrayPool.Shared.Rent(3); - try + + var tuple = new PhpArgTuple3 { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 3)); - } - finally - { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 3); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -73,21 +73,20 @@ sealed PhpValue Invoke( PhpValue p2, PhpValue p3) { - var phpArgs = ArrayPool.Shared.Rent(4); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 4)); - } - finally + + var tuple = new PhpArgTuple4 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 4); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -100,22 +99,21 @@ sealed PhpValue Invoke( PhpValue p3, PhpValue p4) { - var phpArgs = ArrayPool.Shared.Rent(5); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 5)); - } - finally + + var tuple = new PhpArgTuple5 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 5); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -129,23 +127,22 @@ sealed PhpValue Invoke( PhpValue p4, PhpValue p5) { - var phpArgs = ArrayPool.Shared.Rent(6); - try + + var tuple = new PhpArgTuple6 { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 6)); - } - finally - { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 6); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -160,24 +157,23 @@ sealed PhpValue Invoke( PhpValue p5, PhpValue p6) { - var phpArgs = ArrayPool.Shared.Rent(7); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 7)); - } - finally + + var tuple = new PhpArgTuple7 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 7); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -193,25 +189,24 @@ sealed PhpValue Invoke( PhpValue p6, PhpValue p7) { - var phpArgs = ArrayPool.Shared.Rent(8); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 8)); - } - finally + + var tuple = new PhpArgTuple8 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 8); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -228,26 +223,25 @@ sealed PhpValue Invoke( PhpValue p7, PhpValue p8) { - var phpArgs = ArrayPool.Shared.Rent(9); - try + + var tuple = new PhpArgTuple9 { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 9)); - } - finally - { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 9); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -265,27 +259,26 @@ sealed PhpValue Invoke( PhpValue p8, PhpValue p9) { - var phpArgs = ArrayPool.Shared.Rent(10); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 10)); - } - finally + + var tuple = new PhpArgTuple10 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 10); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -304,28 +297,27 @@ sealed PhpValue Invoke( PhpValue p9, PhpValue p10) { - var phpArgs = ArrayPool.Shared.Rent(11); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - phpArgs[10] = p10; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 11)); - } - finally + + var tuple = new PhpArgTuple11 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + Argument10 = p10, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 11); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -345,29 +337,28 @@ sealed PhpValue Invoke( PhpValue p10, PhpValue p11) { - var phpArgs = ArrayPool.Shared.Rent(12); - try + + var tuple = new PhpArgTuple12 { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - phpArgs[10] = p10; - phpArgs[11] = p11; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 12)); - } - finally - { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + Argument10 = p10, + Argument11 = p11, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 12); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -388,30 +379,29 @@ sealed PhpValue Invoke( PhpValue p11, PhpValue p12) { - var phpArgs = ArrayPool.Shared.Rent(13); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - phpArgs[10] = p10; - phpArgs[11] = p11; - phpArgs[12] = p12; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 13)); - } - finally + + var tuple = new PhpArgTuple13 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + Argument10 = p10, + Argument11 = p11, + Argument12 = p12, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 13); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -433,31 +423,30 @@ sealed PhpValue Invoke( PhpValue p12, PhpValue p13) { - var phpArgs = ArrayPool.Shared.Rent(14); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - phpArgs[10] = p10; - phpArgs[11] = p11; - phpArgs[12] = p12; - phpArgs[13] = p13; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 14)); - } - finally + + var tuple = new PhpArgTuple14 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + Argument10 = p10, + Argument11 = p11, + Argument12 = p12, + Argument13 = p13, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 14); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -480,32 +469,31 @@ sealed PhpValue Invoke( PhpValue p13, PhpValue p14) { - var phpArgs = ArrayPool.Shared.Rent(15); - try + + var tuple = new PhpArgTuple15 { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - phpArgs[10] = p10; - phpArgs[11] = p11; - phpArgs[12] = p12; - phpArgs[13] = p13; - phpArgs[14] = p14; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 15)); - } - finally - { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + Argument10 = p10, + Argument11 = p11, + Argument12 = p12, + Argument13 = p13, + Argument14 = p14, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 15); + return Invoke(ctx, phpArgs); } + + /// /// Invokes the callback with given arguments. /// Uses ArrayPool to avoid allocation. @@ -529,31 +517,223 @@ sealed PhpValue Invoke( PhpValue p14, PhpValue p15) { - var phpArgs = ArrayPool.Shared.Rent(16); - try - { - phpArgs[0] = p0; - phpArgs[1] = p1; - phpArgs[2] = p2; - phpArgs[3] = p3; - phpArgs[4] = p4; - phpArgs[5] = p5; - phpArgs[6] = p6; - phpArgs[7] = p7; - phpArgs[8] = p8; - phpArgs[9] = p9; - phpArgs[10] = p10; - phpArgs[11] = p11; - phpArgs[12] = p12; - phpArgs[13] = p13; - phpArgs[14] = p14; - phpArgs[15] = p15; - return Invoke(ctx, new ReadOnlySpan(phpArgs, 0, 16)); - } - finally + + var tuple = new PhpArgTuple16 { - ArrayPool.Shared.Return(phpArgs, true); - } + Argument0 = p0, + Argument1 = p1, + Argument2 = p2, + Argument3 = p3, + Argument4 = p4, + Argument5 = p5, + Argument6 = p6, + Argument7 = p7, + Argument8 = p8, + Argument9 = p9, + Argument10 = p10, + Argument11 = p11, + Argument12 = p12, + Argument13 = p13, + Argument14 = p14, + Argument15 = p15, + }; + var phpArgs = MemoryMarshal.CreateReadOnlySpan(ref tuple.Argument0, 16); + return Invoke(ctx, phpArgs); } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple2 + { + public PhpValue Argument0; + public PhpValue Argument1; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple3 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple4 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple5 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple6 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple7 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple8 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple9 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple10 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple11 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + public PhpValue Argument10; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple12 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + public PhpValue Argument10; + public PhpValue Argument11; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple13 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + public PhpValue Argument10; + public PhpValue Argument11; + public PhpValue Argument12; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple14 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + public PhpValue Argument10; + public PhpValue Argument11; + public PhpValue Argument12; + public PhpValue Argument13; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple15 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + public PhpValue Argument10; + public PhpValue Argument11; + public PhpValue Argument12; + public PhpValue Argument13; + public PhpValue Argument14; + } + [StructLayout(LayoutKind.Sequential)] + private struct PhpArgTuple16 + { + public PhpValue Argument0; + public PhpValue Argument1; + public PhpValue Argument2; + public PhpValue Argument3; + public PhpValue Argument4; + public PhpValue Argument5; + public PhpValue Argument6; + public PhpValue Argument7; + public PhpValue Argument8; + public PhpValue Argument9; + public PhpValue Argument10; + public PhpValue Argument11; + public PhpValue Argument12; + public PhpValue Argument13; + public PhpValue Argument14; + public PhpValue Argument15; + } } \ No newline at end of file