Beispiel #1
0
        static void GenProperty(CodePrinter codeGen, WrapperGenProperty prop, WrapperGenClass cls)
        {
            codeGen.PrintLine("[NativeEntry(NativeEntryType.Property)]");
            codeGen.PrintLine("public static void ", prop.Name, "(object phoIns, ref object value, bool isGet )");
            codeGen.PrintLine("{");
            codeGen.In();

            codeGen.PrintLine("var phoClassIns = phoIns as ", cls.Name, ";");
            codeGen.PrintLine();

            if (prop.CanRead)
            {
                codeGen.PrintLine("if (isGet)");
                codeGen.PrintLine("{");
                codeGen.In();
                codeGen.PrintLine("value = Convertor.", prop.TypeString, "ToValue(phoClassIns.", prop.Name, ");");
                codeGen.Out();
                codeGen.PrintLine("}");
            }


            if (prop.CanWrite)
            {
                if (prop.CanRead)
                {
                    codeGen.PrintLine("else");
                }

                codeGen.PrintLine("{");
                codeGen.In();
                codeGen.PrintLine("phoClassIns.", prop.Name, " = Convertor.ValueTo", prop.TypeString, "(value);");
                codeGen.Out();
                codeGen.PrintLine("}");
            }


            codeGen.Out();
            codeGen.PrintLine("}");
        }
Beispiel #2
0
        static void GenStaticOrMethod(CodePrinter codeGen, WrapperGenFunc func, WrapperGenClass cls)
        {
            if (func.Mode == WrapperFuncMode.ClassMethod)
            {
                codeGen.PrintLine("[NativeEntry(NativeEntryType.ClassMethod)]");
            }
            else
            {
                codeGen.PrintLine("[NativeEntry(NativeEntryType.StaticFunc)]");
            }



            codeGen.PrintLine("public static int ", func.Name, "( VMachine phoVM )");
            codeGen.PrintLine("{");
            codeGen.In();

            if (func.Mode == WrapperFuncMode.ClassMethod)
            {
                codeGen.PrintLine("var phoClassIns = phoVM.DataStack.GetNativeInstance<", cls.FullName, ">(0);");
                codeGen.PrintLine();
            }


            // 获取输入参数
            int argIndex = 1;

            foreach (var pm in func.InputParameters)
            {
                codeGen.PrintLine("var ", pm.Name, " = phoVM.DataStack.Get", pm.TypeString, "(", argIndex, ");");

                argIndex++;
            }

            if (argIndex > 1)
            {
                codeGen.PrintLine();
            }

            // 声明输出参数
            argIndex = 1;
            foreach (var pm in func.OutputParameters)
            {
                codeGen.PrintLine(pm.NativeTypeString, " ", pm.Name, " = default(", pm.NativeTypeString, ");");

                argIndex++;
            }

            // 调用本体函数
            codeGen.BeginLine();

            if (func.RetParameter.NativeTypeString != "Nil" &&
                func.RetParameter.NativeTypeString != "Void")
            {
                codeGen.Print("var phoRetArg = ");
            }


            if (func.Mode == WrapperFuncMode.ClassMethod)
            {
                codeGen.Print("phoClassIns.", func.Name, "( ");
            }
            else
            {
                codeGen.Print(cls.FullName, ".", func.Name, "( ");
            }


            // 传入输入参数
            argIndex = 1;
            foreach (var pm in func.InputParameters)
            {
                if (argIndex > 1)
                {
                    codeGen.Print(", ");
                }

                codeGen.Print(pm.Name);

                argIndex++;
            }

            // 传入输出参数
            foreach (var pm in func.OutputParameters)
            {
                if (argIndex > 1)
                {
                    codeGen.Print(", ");
                }

                codeGen.Print("out ", pm.Name);

                argIndex++;
            }

            codeGen.Print(" );\n");

            codeGen.EndLine();

            // 栈推入输出参数
            foreach (var pm in func.OutputParameters)
            {
                codeGen.PrintLine("phoVM.DataStack.Push", pm.TypeString, "( ", pm.Name, " );");

                argIndex++;
            }

            int totalRet = func.OutputParameters.Count;

            // 栈推入返回参数
            if (func.RetParameter.TypeString != "Nil")
            {
                codeGen.PrintLine("phoVM.DataStack.Push", func.RetParameter.TypeString, "( phoRetArg );");
                totalRet++;
            }



            // 返回返回值数量
            codeGen.PrintLine();

            codeGen.PrintLine("return ", totalRet, ";");


            codeGen.Out();
            codeGen.PrintLine("}");
        }