public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
     if (internalObject.HasAttribute(binder.Name))
     {
         IodineObject obj = internalObject.GetAttribute(binder.Name);
         result = typeRegistry.ConvertToNativeObject(obj);
         return(true);
     }
     result = null;
     return(true);
 }
Ejemplo n.º 2
0
        public T Call <T> (string name, params object[] args)
        {
            IodineObject[] arguments = new IodineObject[args.Length];
            for (int i = 0; i < args.Length; i++)
            {
                arguments [i] = typeRegistry.ConvertToIodineObject(args [i]);
            }
            IodineObject ret = Context.Invoke(module.GetAttribute(name), arguments);

            return((T)typeRegistry.ConvertToNativeObject(ret, typeof(T)));
        }
Ejemplo n.º 3
0
        public static BuiltinMethodCallback Create(TypeRegistry registry,
                                                   IEnumerable <MethodInfo> info,
                                                   object self = null)
        {
            return(new BuiltinMethodCallback(((VirtualMachine vm,
                                               IodineObject @this, IodineObject[] arguments) => {
                var suitableOverloads = info.Where(p => p.GetParameters().Length == arguments.Length);

                foreach (MethodInfo overload in suitableOverloads)
                {
                    var types = overload.GetParameters().Select(p => p.ParameterType).ToArray();
                    object[] objects = new object[arguments.Length];
                    bool mappingExists = true;
                    for (int i = 0; i < arguments.Length; i++)
                    {
                        if (!registry.TypeMappingExists(arguments [i].TypeDef, types [i]))
                        {
                            mappingExists = false;
                            break;
                        }
                        objects [i] = registry.ConvertToNativeObject(arguments [i], types [i]);
                    }

                    if (mappingExists)
                    {
                        return registry.ConvertToIodineObject(overload.Invoke(self, objects));
                    }
                }
                // No suitable overload found
                Console.WriteLine("No suitable overload found!");
                return null;
            }), null));
        }
Ejemplo n.º 4
0
		public static InternalMethodCallback Create (TypeRegistry registry,
			IEnumerable<MethodInfo> info,
			object self = null)
		{
			return new InternalMethodCallback (((VirtualMachine vm,
				IodineObject @this, IodineObject[] arguments) => {
				var suitableOverloads = info.Where (p => p.GetParameters ().Length == arguments.Length);

				foreach (MethodInfo overload in suitableOverloads) {
					var types = overload.GetParameters ().Select (p => p.ParameterType).ToArray ();
					object[] objects = new object[arguments.Length];
					bool mappingExists = true;
					for (int i = 0; i < arguments.Length; i++) {
						if (!registry.TypeMappingExists (arguments [i].TypeDef, types [i])) {
							mappingExists = false;
							break;
						}
						objects [i] = registry.ConvertToNativeObject (arguments [i], types [i]);
					}

					if (mappingExists) {
						return registry.ConvertToIodineObject (overload.Invoke (self, objects));
					}
				}
				// No suitable overload found
				Console.WriteLine ("No suitable overload found!");
				return null;
			}), null);
		}
Ejemplo n.º 5
0
        public override object ConvertFrom(TypeRegistry registry, IodineObject obj)
        {
            var list = (IodineList)obj;
            var arr  = new object [list.Objects.Count];

            for (var i = 0; i < list.Objects.Count; i++)
            {
                arr [i] = registry.ConvertToNativeObject(list.Objects [i]);
            }
            return(arr);
        }
Ejemplo n.º 6
0
 public static BuiltinMethodCallback Create(TypeRegistry registry,
                                            MethodInfo info,
                                            object self = null)
 {
     return(new BuiltinMethodCallback(((VirtualMachine vm,
                                        IodineObject @this, IodineObject[] arguments) => {
         Type[] types = info.GetParameters().Select(p => p.ParameterType).ToArray();
         int i = 0;
         object[] objects = arguments.Select(p => registry.ConvertToNativeObject(p,
                                                                                 types [i++])).ToArray();
         return registry.ConvertToIodineObject(info.Invoke(self, objects));
     }), null));
 }
Ejemplo n.º 7
0
		public static InternalMethodCallback Create (TypeRegistry registry, 
			MethodInfo info,
			object self = null)
		{
			return new InternalMethodCallback (((VirtualMachine vm,
				IodineObject @this, IodineObject[] arguments) => {
				Type[] types = info.GetParameters ().Select (p => p.ParameterType).ToArray ();
				int i = 0;
				object[] objects = arguments.Select (p => registry.ConvertToNativeObject (p,
					types [i++])).ToArray ();
				return registry.ConvertToIodineObject (info.Invoke (self, objects));
			}), null);
		}
Ejemplo n.º 8
0
        public override IodineObject Invoke(VirtualMachine vm, IodineObject[] arguments)
        {
            int i = 0;

            var suitableOverload = type.GetConstructors().Where(p => p.GetParameters().Length ==
                                                                arguments.Length).
                                   FirstOrDefault();

            Type[] types = suitableOverload.GetParameters().Select(p => p.ParameterType).ToArray();

            object[] objects = arguments.Select(p => typeRegistry.ConvertToNativeObject(p,
                                                                                        types [i++])).ToArray();

            return(ObjectWrapper.CreateFromObject(typeRegistry, this, suitableOverload.Invoke(objects)));
        }
Ejemplo n.º 9
0
 public IodineObject Set(VirtualMachine vm, IodineObject value)
 {
     fieldInfo.SetValue(self, typeRegistry.ConvertToNativeObject(value, fieldInfo.FieldType));
     return(null);
 }
Ejemplo n.º 10
0
 public IodineObject Set(VirtualMachine vm, IodineObject value)
 {
     propertyInfo.SetValue(self, typeRegistry.ConvertToNativeObject(value,
                                                                    propertyInfo.PropertyType));
     return(null);
 }