protected virtual object BuildFunctionCall(object callingFunction) { // For now, every function call is a runtime reference so we do not have to worry about the rest List <object> argList = new List <object>(); if (Peek().type != Token.Type.ClosingParethesis) { do { object expr = CompileExpression(); Func <object> func = null; //Type returnType = CompilerUtility.GetReturnType(expr); //TypeDef typeDef = _assembly.GetTypeDef(returnType); func = CompilerUtility.ForceGetFunction(expr, _cdata); if (func == null) { func = () => { return(expr); }; } argList.Add(func); } while (MatchToken(Token.Type.Comma)); } if (Step().type != Token.Type.ClosingParethesis) { throw new Exception(") expected after function call arguments"); } RunTimeReference callingReference = callingFunction as RunTimeReference; if (callingReference != null) { Func <object> targetFunc = CompilerUtility.ForceGetFunction(callingReference.targetObject, _cdata); if (targetFunc == null) { return(new MethodCall(callingReference.type, callingReference.identifer, callingReference.targetObject, argList.ToArray(), _cdata, callingReference.targetType)); } else { return(new MethodCall(callingReference.type, callingReference.identifer, targetFunc, argList.ToArray(), _cdata, callingReference.targetType)); } } CompileTimeReference compileTimeReference = callingFunction as CompileTimeReference; if (compileTimeReference != null) { return(new FunctionCall(compileTimeReference.type, compileTimeReference.identifer, compileTimeReference.environmentIndex, argList.ToArray(), _cdata)); } return(callingFunction); }
protected virtual object CreateListAccessorReference(object output, object accessor) { if (output as RunTimeReference != null) { RunTimeReference reference = output as RunTimeReference; object target = reference.CreateGetFunction(_cdata); if (reference.type == null || reference.type == typeof(object)) { output = new RunTimeArrayAccessReferenceListAccess(typeof(object), reference.identifer, target, accessor, typeof(object)); } else { output = new RunTimeArrayAccessReferenceListAccess(reference.type, reference.identifer, target, accessor, reference.targetType); } } else if (output as FunctionCall != null || output as MethodCall != null || output as CompileTimeArrayAccessReference != null) { Reference reference = output as Reference; object target = reference.CreateGetFunction(_cdata); if (reference.type == null || reference.type == typeof(object)) { output = new RunTimeArrayAccessReferenceListAccess(typeof(object), reference.identifer, target, accessor, typeof(object)); } else { output = new RunTimeArrayAccessReferenceListAccess(reference.type, reference.identifer, target, accessor, reference.type); } } else if (output as CompileTimeReference != null) { CompileTimeReference reference = output as CompileTimeReference; if (reference.type == null || reference.type == typeof(object)) { output = new CompileTimeArrayAccessReferenceListAccess(typeof(object), reference.identifer, reference.environmentIndex, accessor); } else { output = new CompileTimeArrayAccessReferenceListAccess(reference.type, reference.identifer, reference.environmentIndex, accessor); } } return(output); }