protected void Compile(MethodBaseData data) { if (data.Compiler == null) { data.Compiler = this.CreateMethodCompiler(data); Program.XmlLog.WriteStartElement("method"); Program.XmlLog.WriteAttributeString("signature", data.Method.GetSignature()); if (Settings.DebugCompilation) { Program.XmlLog.WriteAttributeString("name", data.Method.DeclaringType.FullName + "." + data.Method.Name); Program.XmlLog.WriteAttributeString("metadataToken", "0x" + data.Member.MetadataToken.ToString("X")); Program.XmlLog.WriteAttributeString("index", data.Index.ToString()); } data.Compiler.Compile(); #if !OBFUSCATE Program.XmlLog.WriteStartElement("il"); Program.XmlLog.WriteAttributeString("value", data.Compiler.Body); Program.XmlLog.WriteEndElement(); #endif data.Compiler.DumpLogs(); Program.XmlLog.WriteEndElement(); } }
public int Register(MemberInfoData callee, MethodBase member) { if (NativesManager.Instance.IsNative(member)) { return this.RegisterNative(callee, member); } else { if ((member.IsVirtual || member.IsAbstract) && member.DeclaringType.IsSubclassOf(typeof(MK.JavaScript.Window))) { ThrowHelper.Throw("{0} cannot be called as it is virtual or abstract method of subclass of Window.", member.GetSignature()); } MethodBaseData data; if (this.Methods.TryGetValue(member, out data)) { ++data.HitCount; } else { //zaczynam numeracje metod od 1 a nie od zera... ciekawe kiedy to spowoduje problemy //dlaczego tak numeruje? bo if(0) zwraca false w .js data = new MethodBaseData(member, this.Methods.Count + 1); this.Methods[member] = data; if ((member.IsVirtual || member.IsAbstract)) {// && ((MethodInfo)member).GetBaseDefinition() == member) { var typeData = this.Resolve(member.DeclaringType); VirtualMethodCallData vmcd; if (!typeData.VirtualMethods.TryGetValue(data, out vmcd)) { typeData.VirtualMethods[data] = new VirtualMethodCallData(); } } if (!member.IsAbstract) this.methodsToCompile.Enqueue(data); } if (this.PageCompiler.WindowAttribute.MethodsOnTop && member.DeclaringType.GetDeclaringTypesWithType().Any(t => t == this.PageCompiler.WindowType)) { this.addDependency(this.PageCompiler.TypeData, data); } if (this.PageCompiler.WindowAttribute.RunAtThis.Any(t => member.DeclaringType.GetDeclaringTypesWithType().Contains(t))) { this.addDependency(this.PageCompiler.TypeData, data); } else { var moduleCompiler = this.GetModuleCompiler(member.DeclaringType); if (moduleCompiler != null) { this.addDependency(moduleCompiler.TypeData, data); } else { this.addDependency(callee, data); } } return data.Index; } }
protected override MethodCompiler CreateMethodCompiler(MethodBaseData method) { return new MethodCompiler(this, method, method.Method); }
protected abstract MethodCompiler CreateMethodCompiler(MethodBaseData method);
public MethodCompiler(AssemblyCompiler assemblyCompiler, MethodBaseData callee, MethodBase method) { this.AssemblyCompiler = assemblyCompiler; this.CalleeData = callee; this.Method = method; }