public string[] GetCompletions(string input, out string prefix) { prefix = ""; if (input == null || input.Length == 0) { return(null); } lock (evaluator_lock) { if (!inited) { Init(); } bool partial_input; CSharpParser parser = ParseString(ParseMode.GetCompletions, input, out partial_input); if (parser == null) { if (CSharpParser.yacc_verbose_flag != 0) { Console.WriteLine("DEBUG: No completions available"); } return(null); } Class parser_result = parser.InteractiveResult; #if NET_4_0 var access = AssemblyBuilderAccess.RunAndCollect; #else var access = AssemblyBuilderAccess.Run; #endif var a = new AssemblyDefinitionDynamic(module, "completions"); a.Create(AppDomain.CurrentDomain, access); module.SetDeclaringAssembly(a); // Need to setup MemberCache parser_result.CreateType(); var method = parser_result.Methods[0] as Method; BlockContext bc = new BlockContext(method, method.Block, ctx.BuiltinTypes.Void); try { method.Block.Resolve(null, bc, method); } catch (CompletionResult cr) { prefix = cr.BaseText; return(cr.Result); } } return(null); }
static CompiledMethod CompileBlock (Class host, Undo undo, Report Report) { AssemblyDefinitionDynamic assembly; AssemblyBuilderAccess access; if (Environment.GetEnvironmentVariable ("SAVE") != null) { access = AssemblyBuilderAccess.RunAndSave; assembly = new AssemblyDefinitionDynamic (RootContext.ToplevelTypes, current_debug_name, current_debug_name); assembly.Importer = loader.Importer; } else { #if NET_4_0 access = AssemblyBuilderAccess.RunAndCollect; #else access = AssemblyBuilderAccess.Run; #endif assembly = new AssemblyDefinitionDynamic (RootContext.ToplevelTypes, current_debug_name); } assembly.Create (AppDomain.CurrentDomain, access); if (host != null) { host.CreateType (); host.Define (); } RootContext.ToplevelTypes.CreateType (); RootContext.ToplevelTypes.Define (); if (Report.Errors != 0){ undo.ExecuteUndo (); return null; } TypeBuilder tb = null; MethodBuilder mb = null; if (host != null){ tb = host.TypeBuilder; mb = null; foreach (MemberCore member in host.Methods){ if (member.Name != "Host") continue; MethodOrOperator method = (MethodOrOperator) member; mb = method.MethodBuilder; break; } if (mb == null) throw new Exception ("Internal error: did not find the method builder for the generated method"); host.EmitType (); } RootContext.ToplevelTypes.Emit (); if (Report.Errors != 0){ undo.ExecuteUndo (); return null; } RootContext.ToplevelTypes.CloseType (); if (host != null) host.CloseType (); if (access == AssemblyBuilderAccess.RunAndSave) assembly.Save (); if (host == null) return null; // // Unlike Mono, .NET requires that the MethodInfo is fetched, it cant // work from MethodBuilders. Retarded, I know. // var tt = assembly.Builder.GetType (tb.Name); MethodInfo mi = tt.GetMethod (mb.Name); // Pull the FieldInfos from the type, and keep track of them foreach (Field field in queued_fields){ FieldInfo fi = tt.GetField (field.Name); Tuple<FieldSpec, FieldInfo> old; // If a previous value was set, nullify it, so that we do // not leak memory if (fields.TryGetValue (field.Name, out old)) { if (old.Item1.MemberType.IsStruct) { // // TODO: Clear fields for structs // } else { try { old.Item2.SetValue (null, null); } catch { } } fields [field.Name] = Tuple.Create (field.Spec, fi); } else { fields.Add (field.Name, Tuple.Create (field.Spec, fi)); } } queued_fields.Clear (); return (CompiledMethod) System.Delegate.CreateDelegate (typeof (CompiledMethod), mi); }
CompiledMethod CompileBlock(Class host, Undo undo, Report Report) { string current_debug_name = "eval-" + count + ".dll"; ++count; #if STATIC throw new NotSupportedException(); #else AssemblyDefinitionDynamic assembly; AssemblyBuilderAccess access; if (Environment.GetEnvironmentVariable("SAVE") != null) { access = AssemblyBuilderAccess.RunAndSave; assembly = new AssemblyDefinitionDynamic(module, current_debug_name, current_debug_name); assembly.Importer = importer; } else { #if NET_4_0 access = AssemblyBuilderAccess.RunAndCollect; #else access = AssemblyBuilderAccess.Run; #endif assembly = new AssemblyDefinitionDynamic(module, current_debug_name); } assembly.Create(AppDomain.CurrentDomain, access); Method expression_method; if (host != null) { var base_class_imported = importer.ImportType(base_class); var baseclass_list = new List <FullNamedExpression> (1) { new TypeExpression(base_class_imported, host.Location) }; host.AddBasesForPart(host, baseclass_list); host.CreateType(); host.DefineType(); host.Define(); expression_method = (Method)host.Methods[0]; } else { expression_method = null; } module.CreateType(); module.Define(); if (Report.Errors != 0) { if (undo != null) { undo.ExecuteUndo(); } return(null); } if (host != null) { host.EmitType(); } module.Emit(); if (Report.Errors != 0) { if (undo != null) { undo.ExecuteUndo(); } return(null); } module.CloseType(); if (host != null) { host.CloseType(); } if (access == AssemblyBuilderAccess.RunAndSave) { assembly.Save(); } if (host == null) { return(null); } // // Unlike Mono, .NET requires that the MethodInfo is fetched, it cant // work from MethodBuilders. Retarded, I know. // var tt = assembly.Builder.GetType(host.TypeBuilder.Name); var mi = tt.GetMethod(expression_method.Name); if (host.Fields != null) { // // We need to then go from FieldBuilder to FieldInfo // or reflection gets confused (it basically gets confused, and variables override each // other). // foreach (Field field in host.Fields) { var fi = tt.GetField(field.Name); Tuple <FieldSpec, FieldInfo> old; // If a previous value was set, nullify it, so that we do // not leak memory if (fields.TryGetValue(field.Name, out old)) { if (old.Item1.MemberType.IsStruct) { // // TODO: Clear fields for structs // } else { try { old.Item2.SetValue(null, null); } catch { } } } fields[field.Name] = Tuple.Create(field.Spec, fi); } } return((CompiledMethod)System.Delegate.CreateDelegate(typeof(CompiledMethod), mi)); #endif }
CompiledMethod CompileBlock (Class host, Undo undo, Report Report) { #if STATIC throw new NotSupportedException (); #else string current_debug_name = "eval-" + count + ".dll"; ++count; AssemblyDefinitionDynamic assembly; AssemblyBuilderAccess access; if (Environment.GetEnvironmentVariable ("SAVE") != null) { access = AssemblyBuilderAccess.RunAndSave; assembly = new AssemblyDefinitionDynamic (module, current_debug_name, current_debug_name); assembly.Importer = importer; } else { #if NET_4_0 access = AssemblyBuilderAccess.RunAndCollect; #else access = AssemblyBuilderAccess.Run; #endif assembly = new AssemblyDefinitionDynamic (module, current_debug_name); } assembly.Create (AppDomain.CurrentDomain, access); Method expression_method; if (host != null) { var base_class_imported = importer.ImportType (base_class); var baseclass_list = new List<FullNamedExpression> (1) { new TypeExpression (base_class_imported, host.Location) }; host.AddBasesForPart (host, baseclass_list); host.CreateType (); host.DefineType (); host.Define (); expression_method = (Method) host.Methods[0]; } else { expression_method = null; } module.CreateType (); module.Define (); if (Report.Errors != 0){ if (undo != null) undo.ExecuteUndo (); return null; } if (host != null){ host.EmitType (); } module.Emit (); if (Report.Errors != 0){ if (undo != null) undo.ExecuteUndo (); return null; } module.CloseType (); if (host != null) host.CloseType (); if (access == AssemblyBuilderAccess.RunAndSave) assembly.Save (); if (host == null) return null; // // Unlike Mono, .NET requires that the MethodInfo is fetched, it cant // work from MethodBuilders. Retarded, I know. // var tt = assembly.Builder.GetType (host.TypeBuilder.Name); var mi = tt.GetMethod (expression_method.Name); if (host.Fields != null) { // // We need to then go from FieldBuilder to FieldInfo // or reflection gets confused (it basically gets confused, and variables override each // other). // foreach (Field field in host.Fields) { var fi = tt.GetField (field.Name); Tuple<FieldSpec, FieldInfo> old; // If a previous value was set, nullify it, so that we do // not leak memory if (fields.TryGetValue (field.Name, out old)) { if (old.Item1.MemberType.IsStruct) { // // TODO: Clear fields for structs // } else { try { old.Item2.SetValue (null, null); } catch { } } } fields[field.Name] = Tuple.Create (field.Spec, fi); } } return (CompiledMethod) System.Delegate.CreateDelegate (typeof (CompiledMethod), mi); #endif }
public string [] GetCompletions(string input, out string prefix) { prefix = ""; if (input == null || input.Length == 0) { return(null); } try { invoke_thread = System.Threading.Thread.CurrentThread; invoking = true; lock (evaluator_lock) { if (!inited) { Init(); } bool partial_input; CSharpParser parser = ParseString(ParseMode.GetCompletions, input, out partial_input); if (parser == null) { if (CSharpParser.yacc_verbose_flag != 0) { Console.WriteLine("DEBUG: No completions available"); } return(null); } Class parser_result = parser.InteractiveResult; #if NET_4_0 var access = AssemblyBuilderAccess.Run; #else var access = AssemblyBuilderAccess.Run; #endif var a = new AssemblyDefinitionDynamic(module, "completions"); a.Create(AppDomain.CurrentDomain, access); module.SetDeclaringAssembly(a); // Need to setup MemberCache parser_result.CreateType(); var method = parser_result.Methods[0] as Method; BlockContext bc = new BlockContext(method, method.Block, TypeManager.void_type); try { method.Block.Resolve(null, bc, method); } catch (CompletionResult cr) { prefix = cr.BaseText; return(cr.Result); } } } catch (ThreadAbortException e) { Console.WriteLine("Interrupted!\n{0}", e); } finally { invoking = false; } return(null); }