FErrValEmit the special Err$Val inner class for an Err subclass.
Inheritance: FClassEmit
示例#1
0
        public static Assembly emitPod(FPod pod, bool load, string path)
        {
            string   podName  = pod.m_podName;
            Assembly assembly = (Assembly)assemblies[podName];

            if (assembly == null)
            {
                Emitter emitter = new Emitter(podName, path);

                // unzip the native.dll if one exists
                unzipToTemp(pod, podName + "Native_.dll");
                unzipToTemp(pod, podName + "Native_.pdb");

                // emit the pod class itself (which declares all constants)
                //FPodEmit.EmitAndLoad(emitter, pod);
                FPodEmit.emit(emitter, pod);

                // the Emitter needs base types to be defined before
                // descendant types, so make sure everything gets stubbed
                // out in the correct order ahead of time
                for (int i = 0; i < pod.m_types.Length; i++)
                {
                    emitter.findType(pod.nname(pod.m_types[i].m_self));
                }

                // emit all the rest of the types in this pod
                for (int i = 0; i < pod.m_types.Length; i++)
                {
                    FType    ftype  = pod.m_types[i];
                    FTypeRef tref   = ftype.m_pod.typeRef(ftype.m_self);
                    Type     parent = Type.find(tref.podName + "::" + tref.typeName, true);

                    // make sure we have reflected to setup slots
                    parent.reflect();

                    // route based on type
                    if ((ftype.m_flags & FConst.Mixin) != 0)
                    {
                        // interface
                        FMixinInterfaceEmit iemit = new FMixinInterfaceEmit(emitter, parent, ftype);
                        iemit.emit();

                        // body class
                        FMixinBodyEmit bemit = new FMixinBodyEmit(emitter, parent, ftype);
                        bemit.emit();

                        ftypes[ftype] = new FTypeEmit[] { iemit, bemit };
                    }
                    else if (parent.@is(Sys.ErrType))
                    {
                        // error
                        FErrEmit emitErr = new FErrEmit(emitter, parent, ftype);
                        emitErr.emit();

                        FErrValEmit emitErrVal = new FErrValEmit(emitter, parent, ftype);
                        emitErrVal.emit();

                        ftypes[ftype] = new FTypeEmit[] { emitErr, emitErrVal };
                    }
                    else
                    {
                        // class
                        FClassEmit emit = new FClassEmit(emitter, parent, ftype);
                        emit.emit();
                        ftypes[ftype] = new FTypeEmit[] { emit };
                    }
                }

                // commit assembly
                byte[] buf = emitter.commit();
                if (load)
                {
                    //long start = System.Environment.TickCount;

                    // load assembly
                    assembly = (buf == null)
            ? Assembly.LoadFile(emitter.fileName)
            : Assembly.Load(buf);
                    assemblies[podName] = assembly;

                    //long end = System.Environment.TickCount;
                    //System.Console.WriteLine("load " + podName + " in " + (end-start) + " ms");

                    // load $Pod type
                    FPodEmit.load(assembly, pod);
                }
            }
            return(assembly);
        }
示例#2
0
文件: FTypeEmit.cs 项目: nomit007/f4
        public static Assembly emitPod(FPod pod, bool load, string path)
        {
            string podName = pod.m_podName;
              Assembly assembly = (Assembly)assemblies[podName];
              if (assembly == null)
              {
            Emitter emitter = new Emitter(podName, path);

            // unzip the native.dll if one exists
            unzipToTemp(pod, podName + "Native_.dll");
            unzipToTemp(pod, podName + "Native_.pdb");

            // emit the pod class itself (which declares all constants)
            //FPodEmit.EmitAndLoad(emitter, pod);
            FPodEmit.emit(emitter, pod);

            // the Emitter needs base types to be defined before
            // descendant types, so make sure everything gets stubbed
            // out in the correct order ahead of time
            for (int i=0; i<pod.m_types.Length; i++)
              emitter.findType(pod.nname(pod.m_types[i].m_self));

            // emit all the rest of the types in this pod
            for (int i=0; i<pod.m_types.Length; i++)
            {
              FType ftype = pod.m_types[i];
              FTypeRef tref = ftype.m_pod.typeRef(ftype.m_self);
              Type parent = Type.find(tref.podName+"::"+tref.typeName, true);

              // make sure we have reflected to setup slots
              parent.reflect();

              // route based on type
              if ((ftype.m_flags & FConst.Mixin) != 0)
              {
            // interface
            FMixinInterfaceEmit iemit = new FMixinInterfaceEmit(emitter, parent, ftype);
            iemit.emit();

            // body class
            FMixinBodyEmit bemit = new FMixinBodyEmit(emitter, parent, ftype);
            bemit.emit();

            ftypes[ftype] = new FTypeEmit[] { iemit, bemit };
              }
              else if (parent.@is(Sys.ErrType))
              {
            // error
            FErrEmit emitErr = new FErrEmit(emitter, parent, ftype);
            emitErr.emit();

            FErrValEmit emitErrVal = new FErrValEmit(emitter, parent, ftype);
            emitErrVal.emit();

            ftypes[ftype] = new FTypeEmit[] { emitErr, emitErrVal };
              }
              else
              {
            // class
            FClassEmit emit = new FClassEmit(emitter, parent, ftype);
            emit.emit();
            ftypes[ftype] = new FTypeEmit[] { emit };
              }
            }

            // commit assembly
            byte[] buf = emitter.commit();
            if (load)
            {
              //long start = System.Environment.TickCount;

              // load assembly
              assembly = (buf == null)
            ? Assembly.LoadFile(emitter.fileName)
            : Assembly.Load(buf);
              assemblies[podName] = assembly;

              //long end = System.Environment.TickCount;
              //System.Console.WriteLine("load " + podName + " in " + (end-start) + " ms");

              // load $Pod type
              FPodEmit.load(assembly, pod);
            }
              }
              return assembly;
        }