private static void addBuiltin(Map<String, List<FunctionPrototype>> builtinsForVersion, String name, Type resultType, Type... args) { if (!builtinsForVersion.containsKey(name)) { builtinsForVersion.put(name, new ArrayList<>()); } builtinsForVersion.get(name).add(new FunctionPrototype(name, resultType, args)); }
@Override public FunctionPrototype clone() { return new FunctionPrototype(name, returnType.clone(), parameters.stream().map(x -> x.clone()).collect(Collectors.toList())); }
@Override public FunctionPrototype visitFunction_prototype(Function_prototypeContext ctx) { Function_headerContext header = ctx.function_declarator().function_header(); if (header != null) { Type returnType = visitFully_specified_type(header.fully_specified_type()); String name = header.variable_identifier().getText(); return new FunctionPrototype(name, returnType, new ArrayList<>()); } Function_header_with_parametersContext fhp = ctx.function_declarator() .function_header_with_parameters(); List<ParameterDecl> parameters = new LinkedList<>(); while (fhp.function_header_with_parameters() != null) { parameters.add(0, visitParameter_declaration(fhp.parameter_declaration())); fhp = fhp.function_header_with_parameters(); } parameters.add(0, visitParameter_declaration(fhp.parameter_declaration())); header = fhp.function_header(); Type returnType = visitFully_specified_type(header.fully_specified_type()); String name = header.variable_identifier().getText(); return new FunctionPrototype(name, returnType, parameters); }
FunctionPrototype mainPrototype = new FunctionPrototype("main", VoidType.VOID, new ArrayList<>());
private FunctionDefinition fuzzFunction() { fuzzingContext.enterScope(); List<ParameterDecl> params = new ArrayList<>(); for (int i = 0; i < generator.nextInt(MAX_FUNCTION_PARAMS); i++) { final String name = "p" + i; final Type type = fuzzType(); // TODO: consider adding array parameters final ParameterDecl parameterDecl = new ParameterDecl(name, type, null); fuzzingContext.addParameter(parameterDecl); params.add(parameterDecl); } FunctionPrototype prototype = new FunctionPrototype(createName("f"), fuzzType(), params); fuzzingContext.enterFunction(prototype); final BlockStmt body = fuzzBlockStmt(false); if (!containsReturnStmt(body)) { body.addStmt(fuzzReturnStmt()); } FunctionDefinition functionDefinition = new FunctionDefinition( prototype, body); fuzzingContext.leaveFunction(); fuzzingContext.leaveScope(); return functionDefinition; }
tu.addDeclarationBefore(new FunctionDefinition(new FunctionPrototype( newFunctionName, returnType,