public static bool NeedsConstructorInvocationProlog(HlTypeDefinition tdef)
        {
            bool processed = false;

            foreach (HlFunctionDefinition tdefAbstractFunction in tdef.OverridableFunctions)
            {
                HlFunctionDefinition test =
                    (HlFunctionDefinition)tdef.GetPrivateOrPublicMember(tdefAbstractFunction.Name);

                if (test.IsVirtual || test.IsOverride)
                {
                    processed = true;
                }
            }

            return(processed);
        }
        public static bool WriteConstructorInvocationProlog(
            HlCompilation compilation,
            HlTypeDefinition tdef,
            string ret)
        {
            bool processed = false;

            foreach (HlFunctionDefinition tdefAbstractFunction in tdef.OverridableFunctions)
            {
                HlFunctionDefinition test =
                    ( HlFunctionDefinition )tdef.GetPrivateOrPublicMember(tdefAbstractFunction.Name);

                if (test.IsVirtual || test.IsOverride)
                {
                    processed = true;
                    uint off = tdef.GetOffset(tdefAbstractFunction.Name);

                    compilation.EmitterResult.Store(
                        $"; Applying Function Pointer: {test.Name} Offset from Begin: {off}"
                        );

                    string tmp =
                        compilation.GetTempVarLoad(off.ToString());

                    string implementingFunction = tdef.GetFinalMemberName(test);
                    compilation.EmitterResult.Emit("ADD", tmp, ret);

                    string instanceFuncPtr = tmp; //compilation.GetTempVarLoad( tmp );

                    //string check = compilation.GetTempVarDref( tmp );
                    //string endLbl = HlCompilation.GetUniqueName( $"{tdef.Name}_prolog" );
                    //compilation.EmitterResult.Emit( $"BNZ", check, endLbl );

                    string func =
                        compilation.GetTempVarLoad(implementingFunction);

                    string tmpPtr = compilation.GetTempVarLoad(func);
                    compilation.EmitterResult.Emit("CREF", tmpPtr, instanceFuncPtr);
                    compilation.ReleaseTempVar(instanceFuncPtr);
                    compilation.ReleaseTempVar(func);
                    compilation.ReleaseTempVar(tmpPtr);

                    //compilation.EmitterResult.Store( $".{endLbl}" );
                }
                else if (!tdef.IsAbstract)
                {
                    EventManager <ErrorEvent> .SendEvent(
                        new MemberNotImplementedErrorEvent(
                            tdef,
                            tdefAbstractFunction
                            )
                        );
                }
                else
                {
                    EventManager <WarningEvent> .SendEvent(
                        new MemberNotImplementedWarningEvent(
                            tdef,
                            tdefAbstractFunction
                            )
                        );
                }
            }

            return(processed);
        }