private static Object CallCOMObject(IReflect ir, String name, Object ob, Binder binder, Object[] arguments,
ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters,
bool construct, bool brackets, VsaEngine engine){
try{
try{
LateBinding.Change64bitIntegersToDouble(arguments);
BindingFlags flags =
BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static|BindingFlags.OptionalParamBinding;
if (construct)
return ir.InvokeMember(name, flags|BindingFlags.CreateInstance, binder, ob, arguments, modifiers, culture, namedParameters);
else if (brackets){
// Expression like ob.name[args]. First try to invoke as an indexed property. If that
// results in a ArgumentException, try to evaluate (ob.name) and then invoke
// the default indexed property on the result.
try {
return ir.InvokeMember(name, flags|BindingFlags.GetProperty|BindingFlags.GetField, binder, ob, arguments, modifiers, culture, namedParameters);
}catch(TargetInvocationException){
Object ob1 = ir.InvokeMember(name, flags|BindingFlags.GetProperty|BindingFlags.GetField, binder, ob, new Object[0], modifiers, culture, new String[0]);
return LateBinding.CallValue(ob1, arguments, construct, brackets, engine, ob1, binder, culture, namedParameters);
}
}else{
int length = arguments == null ? 0 : arguments.Length;
if (namedParameters != null && namedParameters.Length > 0 && (namedParameters[0].Equals("[DISPID=-613]") || namedParameters[0].Equals("this")))
length--;
flags |= length > 0
? BindingFlags.InvokeMethod | BindingFlags.GetProperty
: BindingFlags.InvokeMethod;
return ir.InvokeMember(name, flags, binder, ob, arguments, modifiers, culture, namedParameters);
}
}catch(MissingMemberException){
if (brackets) //ob["x"]. Tried ob.Item()["x"] but failed. So return undefined.
return null;
else //ob("x"). Tried ob.Item()("x") but failed. Complain that ob is not a callable thing.
throw new JScriptException(JSError.FunctionExpected);
}catch(COMException e){
int code = e.ErrorCode;
if (((uint)code) == 0x80020006 || ((uint)code) == 0x80020003) //Unknown name or Member not found
if (brackets)
return null;
else
throw new JScriptException(JSError.FunctionExpected);
if ((code & 0xFFFF0000) == 0x800A0000){
String source = e.Source;
if (source != null && source.IndexOf("JScript") != -1)
throw new JScriptException(e, null);
}
throw e;
}
}catch(JScriptException e){
if ((e.Number & 0xFFFF) == (int)JSError.FunctionExpected){
//try to find a method on System.Object
MemberInfo[] members = typeof(Object).GetMember(name, BindingFlags.Public|BindingFlags.Instance);
if (members != null && members.Length > 0)
return LateBinding.CallOneOfTheMembers(members, arguments, construct, ob, binder, culture, namedParameters, engine);
}
throw e;
}
}