private HybInstance RunObjectCreation(ObjectCreationExpressionSyntax node) { HybType type = null; var args = new HybInstance[node.ArgumentList.Arguments.Count]; var count = 0; foreach (var arg in node.ArgumentList.Arguments) { args[count++] = RunExpression(arg.Expression); } if (node.Type is GenericNameSyntax gn) { type = Resolver.GetGenericType( $"{gn.Identifier}", gn.TypeArgumentList.Arguments.Count); var genericArgs = new HybType[gn.TypeArgumentList.Arguments.Count]; count = 0; foreach (var arg in gn.TypeArgumentList.Arguments) { genericArgs[count++] = Resolver.GetType($"{arg}"); } type = type.MakeGenericType(genericArgs); } else { type = Resolver.GetType($"{node.Type}"); } if (type.IsCompiledType) { if (type.CompiledType == typeof(Action)) { return(args[0]); } if (type.CompiledType == typeof(Func <int>)) { return(args[0]); } } var inst = type.CreateInstance(this, args); if (node.Initializer != null) { ProcessInitializer(inst, node.Initializer); } return(inst); }
public virtual bool TryGetType(string id, out HybType type, Assembly hintAssembly = null) { var sig = GetPureName(id); var rank = GetArrayRank(id); var isGeneric = IsGeneric(id); string[] genericArgs = null; if (isGeneric) { sig = GetSignatureName(id, out genericArgs); } type = TypeCache.GetType(sig, hintAssembly); if (type == null) { return(false); } var ac = Ctx.Config.AccessControl; if (ac.IsSafeType(type) == false) { throw new SandboxException($"{id} is not allowed to use."); } if (isGeneric) { var genericArgTypes = new HybType[genericArgs.Length]; for (int i = 0; i < genericArgTypes.Length; i++) { genericArgTypes[i] = GetType(genericArgs[i]); } type = type.MakeGenericType(genericArgTypes); } if (rank > 0) { type = type.MakeArrayType(rank); } return(true); }