svoid dm_javaEvalModule_doIt(S s) {
  dm_javaEvalModule_doIt(s, true);
}

svoid dm_javaEvalModule_doIt(S s, bool realEval) {
  vm_cleanPrints();
  DynModule dm = dm_current_mandatory();
  //set transpileRaw_verySilent;
  //printWithIndent("[CODE] ", s);
  print("==== EVALUATING...");
  logQuotedWithDate("expressions.txt", s);
  dm.setField(expression := s);
  try {
    S toEvaluate = s; // "time(func { " + s + "})";
    //O value = javaEval_dependent(toEvaluate);
    long time = sysNow();
    evalJava_myProgramID_main_time.set(null);
    vmBus_send('javaEval_starting, toEvaluate, realEval);
    
    temp tempSetTL(veryQuickJava_onJavaSource, src
      -> saveProgramTextFile("main.java", src));

    O value = realEval ? dm_javaEval(toEvaluate) : dm_javaEvalOrInterpret(toEvaluate);
    
    vmBus_send('javaEval_OK, toEvaluate, value);
    //dm.setField(value := null); // to prevent eq() call on data in next line
    dm.setFields(+value, error := null);
    print();
    new LS info;
    info.add(or(evalJava_myProgramID_main_time!, elapsedMS(time)) + " ms");
    addAll(info, quickValueInformation_list(value));
    print("[" + joinWithComma(info) + "]");
    S string = str(value);
    pcall { logStructureWithDate("with-results.txt", ll(s, string)); }
    S shortened = shorten(1000, string);
    print(shortened);
    
    dm_handleEvalResult(value, shortened);
  } catch e {
    dm.setFields(value := null, error := e);
    printStackTrace2(e);
    vmBus_send('javaEval_error, s, e);
  }
}