class BaseEvalCodeGenerator implements EvalCodeGenerator {

  protected final AviatorEvaluatorInstance instance;
  protected Map<String, VariableMeta> variables = Collections.emptyMap();
  protected final String sourceFile;
  protected LambdaGenerator lambdaGenerator;
  protected final AviatorClassLoader classLoader;
  protected Parser parser;
  protected SymbolTable symbolTable;
  /**
   * parent code generator when compiling lambda.
   */
  protected CodeGenerator parentCodeGenerator;
  /**
   * Compiled lambda functions.
   */
  protected Map<String, LambdaFunctionBootstrap> lambdaBootstraps;
  protected final ArrayDeque<MethodMetaData> methodMetaDataStack = new ArrayDeque<>();
  /**
   * function params info.
   */
  protected Map<Integer/* internal function id */, List<FunctionArgument>> funcsArgs;
  private int funcInvocationId = 0;
  /**
   * Compile environment only has the *instance*.
   */
  protected final Env compileEnv;

  protected Map<Integer/* internal function id */, List<FunctionArgument>> getFuncsArgs() {<FILL_FUNCTION_BODY>}

  protected int getNextFuncInvocationId() {
    return this.funcInvocationId++;
  }

  @Override
  public void setParser(final Parser parser) {
    this.parser = parser;
    this.symbolTable = this.parser.getSymbolTable();
  }

  @Override
  public void setLambdaBootstraps(final Map<String, LambdaFunctionBootstrap> lambdaBootstraps) {
    this.lambdaBootstraps = lambdaBootstraps;
  }

  @Override
  public AviatorClassLoader getClassLoader() {
    return this.classLoader;
  }

  public BaseEvalCodeGenerator(final AviatorEvaluatorInstance instance, final String sourceFile,
      final AviatorClassLoader classLoader) {
    super();
    this.instance = instance;
    this.compileEnv = new Env();
    this.compileEnv.setInstance(this.instance);
    this.sourceFile = sourceFile;
    this.classLoader = classLoader;
  }

}

    if (this.funcsArgs == null) {
      this.funcsArgs = new HashMap<>();
    }
    return this.funcsArgs;
  
<no_super_class>