private IodineObject Invoke(VirtualMachine vm, IodineObject self, IodineObject[] args) { if (args.Length <= 1) { vm.RaiseException(new IodineArgumentException(2)); return(IodineNull.Instance); } IodineDictionary hash = args [1] as IodineDictionary; IodineContext context = new IodineContext(); context.Globals.Clear(); foreach (IodineObject key in hash.Keys) { context.Globals [key.ToString()] = hash.Get(key); args [0].SetAttribute(key.ToString(), hash.Get(key)); } VirtualMachine newVm = new VirtualMachine(context); try { return(args [0].Invoke(newVm, new IodineObject[] { })); } catch (SyntaxException syntaxException) { vm.RaiseException(new IodineSyntaxException(syntaxException.ErrorLog)); return(IodineNull.Instance); } catch (UnhandledIodineExceptionException ex) { vm.RaiseException(ex.OriginalException); return(IodineNull.Instance); } }
private IodineObject Eval(VirtualMachine host, string source, IodineDictionary dict) { VirtualMachine vm = host; IodineContext context = host.Context; if (dict != null) { context = new IodineContext(); context.Globals.Clear(); vm = new VirtualMachine(host.Context); foreach (IodineObject key in dict.Keys) { context.Globals [key.ToString()] = dict.Get(key); } } SourceUnit code = SourceUnit.CreateFromSource(source); IodineModule module = null; try { module = code.Compile(context); } catch (SyntaxException ex) { vm.RaiseException(new IodineSyntaxException(ex.ErrorLog)); return(IodineNull.Instance); } return(module.Invoke(vm, new IodineObject[] { })); }
public IodineObject Set(VirtualMachine vm, IodineObject obj) { IodineDictionary dict = obj as IodineDictionary; if (dict != null) { vm.Context.Globals.Clear(); Console.WriteLine("Set."); foreach (IodineObject key in dict.Keys) { vm.Context.Globals [key.ToString()] = dict.Get(key); } } return(null); }
public override IodineObject Invoke(VirtualMachine vm, IodineObject[] args) { if (args.Length == 0) { vm.RaiseException(new IodineArgumentException(1)); return(null); } IodineString name = args [0] as IodineString; if (name == null) { vm.RaiseException(new IodineTypeException("Str")); return(null); } IodineTypeDefinition baseType = IodineObject.ObjectTypeDef; if (args.Length > 1) { baseType = args [1] as IodineTypeDefinition; if (baseType == null) { vm.RaiseException(new IodineTypeException("TypeDef")); return(null); } } IodineTypeDefinition clazz = new IodineTypeDefinition(name.Value); clazz.Base = baseType; if (args.Length > 2) { IodineDictionary map = args [2] as IodineDictionary; foreach (IodineObject key in map.Keys) { clazz.SetAttribute(key.ToString(), map.Get(key)); } } return(clazz); }