protected void PopRecursiveValues(Value[] values, EmitContext context)
        {
            if (values.Length == 0)
            {
                return;
            }

            Value stack     = context.RecursiveStackValue;
            Value stackAddr = context.RecursiveStackAddressValue;
            BoundAccessExpression stackAddrAccess = BoundAccessExpression.BindAccess(stackAddr);
            TypeSymbol            intType         = context.GetTypeSymbol(SpecialType.System_Int32);
            TypeSymbol            objectType      = context.GetTypeSymbol(SpecialType.System_Object);
            TypeSymbol            objectArrayType = objectType.MakeArrayType(context);

            context.Module.AddCommentTag("Recursive stack pop");

            BoundInvocationExpression decrementExpression = new BoundPrefixOperatorExpression(context, SyntaxNode,
                                                                                              stackAddrAccess, new ExternSynthesizedOperatorSymbol(BuiltinOperatorType.Subtraction, intType, context));

            foreach (var valueToPop in values.Reverse())
            {
                context.Emit(decrementExpression);

                ExternSynthesizedMethodSymbol arrayGetMethod = new ExternSynthesizedMethodSymbol(context, "Get",
                                                                                                 objectArrayType, new [] { intType }, objectType, false);

                context.Module.AddPush(stack);
                context.Module.AddPush(stackAddr);
                context.Module.AddPush(valueToPop);
                context.Module.AddExtern(arrayGetMethod);
            }

            context.Module.AddCommentTag("Recursive stack pop end");
        }
            private static PropertySymbol BuildProperty(AbstractPhaseContext context, BoundExpression sourceExpression, PropertySymbol propertySymbol)
            {
                TypeSymbol propertyType = sourceExpression.ValueType;

                if (propertyType.UdonType.ExternSignature == "VRCUdonUdonBehaviour")
                {
                    propertyType = context.GetTypeSymbol(typeof(IUdonEventReceiver));
                }

                MethodSymbol setMethod = new ExternSynthesizedMethodSymbol(context, $"set_{propertySymbol.Name}", propertyType,
                                                                           new[] { propertySymbol.Type }, null, false);
                MethodSymbol getMethod = new ExternSynthesizedMethodSymbol(context, $"get_{propertySymbol.Name}", propertyType,
                                                                           new TypeSymbol[] {}, propertySymbol.Type, false);

                return(new SynthesizedPropertySymbol(context, getMethod, setMethod));
            }
            private static PropertySymbol BuildProperty(AbstractPhaseContext context, BoundExpression sourceExpression)
            {
                TypeSymbol propertyType = sourceExpression.ValueType;

                if (propertyType.UdonType.ExternSignature == "VRCUdonUdonBehaviour")
                {
                    propertyType = context.GetTypeSymbol(typeof(IUdonEventReceiver));
                }

                TypeSymbol   boolType  = context.GetTypeSymbol(SpecialType.System_Boolean);
                MethodSymbol setMethod = new ExternSynthesizedMethodSymbol(context, "set_enabled", propertyType,
                                                                           new[] { boolType }, null, false);
                MethodSymbol getMethod = new ExternSynthesizedMethodSymbol(context, "get_enabled", propertyType,
                                                                           new TypeSymbol[] {}, boolType, false);

                return(new SynthesizedPropertySymbol(context, getMethod, setMethod));
            }
Exemplo n.º 4
0
        private static PropertySymbol BuildProperty(AbstractPhaseContext context, BoundExpression sourceExpression)
        {
            TypeSymbol arrayType   = sourceExpression.ValueType;
            TypeSymbol elementType = arrayType.ElementType;

            Type systemType = arrayType.ElementType.UdonType.SystemType;

            if (systemType == typeof(UnityEngine.Object) ||
                systemType.IsSubclassOf(typeof(UnityEngine.Object)))
            {
                arrayType = context.GetTypeSymbol(SpecialType.System_Object).MakeArrayType(context);
            }

            string arrayTypeName        = CompilerUdonInterface.GetMethodTypeName(arrayType.UdonType);
            string arrayElementTypeName = CompilerUdonInterface.GetUdonTypeName(arrayType.UdonType.ElementType);

            TypeSymbol   intType   = context.GetTypeSymbol(SpecialType.System_Int32);
            MethodSymbol setMethod = new ExternSynthesizedMethodSymbol(context, $"{arrayTypeName}.__Set__SystemInt32_{arrayElementTypeName}__SystemVoid",
                                                                       new[] { intType, elementType }, null, false);
            MethodSymbol getMethod = new ExternSynthesizedMethodSymbol(context, $"{arrayTypeName}.__Get__SystemInt32__{arrayElementTypeName}",
                                                                       new[] { intType }, elementType, false);

            return(new SynthesizedPropertySymbol(context, getMethod, setMethod));
        }
Exemplo n.º 5
0
        private ExternMethodSymbol FindAlternateInvocation(AbstractPhaseContext context, MethodSymbol originalSymbol, BoundExpression instanceExpression, BoundExpression[] parameterExpressions)
        {
            if (originalSymbol.IsStatic || originalSymbol.IsConstructor)
            {
                return(null);
            }

            List <TypeSymbol> candidates = new List <TypeSymbol>();

            FindCandidateInvocationTypes(context, candidates, instanceExpression.ValueType);

            TypeSymbol[] paramTypes = parameterExpressions.Select(ex => ex.ValueType).ToArray();

            foreach (TypeSymbol candidate in candidates)
            {
                ExternMethodSymbol externMethodSymbol = new ExternSynthesizedMethodSymbol(context, originalSymbol.Name, candidate, paramTypes, originalSymbol.ReturnType, false, false);
                if (CompilerUdonInterface.IsExposedToUdon(externMethodSymbol.ExternSignature))
                {
                    return(externMethodSymbol);
                }
            }

            return(null);
        }