int main()

in interpreters/quickjs/qjsmini.c [469:677]


int main(int argc, char *argv[])
{
  JSRuntime *rt = NULL;
  JSContext *ctx = NULL;
  struct trace_malloc_data trace_data =
  {
    NULL
  };

  static const JSMallocFunctions trace_mf =
  {
      js_trace_malloc,
      js_trace_free,
      js_trace_realloc,
      malloc_usable_size,
  };

  int argi;
  char *expr = NULL;
  int dump_memory = 0;
  int trace_memory = 0;
  int empty_run = 0;
  size_t memory_limit = 0;
  size_t stack_size = 0;

  argi = 1;
  while (argi < argc && *argv[argi] == '-')
    {
      char *arg = argv[argi] + 1;
      const char *longopt = "";

      if (!*arg)
        break;
      argi++;
      if (*arg == '-')
        {
          longopt = arg + 1;
          arg += strlen(arg);
          if (!*longopt)
            break;
        }

      for (; *arg || *longopt; longopt = "")
        {
          char opt = *arg;
          if (opt)
            {
              arg++;
            }

          if (opt == 'h' || opt == '?' || !strcmp(longopt, "help"))
            {
              qjs_help();
              continue;
            }

          if (opt == 'e' || !strcmp(longopt, "eval"))
            {
              if (*arg)
                {
                  expr = arg;
                  break;
                }

              if (argi < argc)
                {
                  expr = argv[argi++];
                  break;
                }

              fprintf(stderr, "qjs: missing expression for -e\n");
              exit(2);
            }

          if (opt == 'd' || !strcmp(longopt, "dump"))
            {
              dump_memory++;
              continue;
            }

          if (opt == 'T' || !strcmp(longopt, "trace"))
            {
              trace_memory++;
              continue;
            }

          if (opt == 'q' || !strcmp(longopt, "quit"))
            {
              empty_run++;
              continue;
            }

          if (!strcmp(longopt, "memory-limit"))
            {
              if (argi >= argc)
                {
                  fprintf(stderr, "expecting memory limit");
                  exit(1);
                }

              memory_limit = (size_t)strtod(argv[argi++], NULL);
              continue;
            }

          if (!strcmp(longopt, "stack-size"))
            {
              if (argi >= argc)
                {
                  fprintf(stderr, "expecting stack size");
                  exit(1);
                }

              stack_size = (size_t)strtod(argv[argi++], NULL);
              continue;
            }

          if (opt)
            {
              fprintf(stderr, "qjs: unknown option '-%c'\n", opt);
            }
          else
            {
              fprintf(stderr, "qjs: unknown option '--%s'\n", longopt);
            }

          qjs_help();
        }
    }

  if (trace_memory)
    {
      js_trace_malloc_init(&trace_data);
      rt = JS_NewRuntime2(&trace_mf, &trace_data);
    }
  else
    {
      rt = JS_NewRuntime();
    }

  if (!rt)
    {
      fprintf(stderr, "qjs: cannot allocate JS runtime\n");
      goto fail;
    }

  if (memory_limit != 0)
    JS_SetMemoryLimit(rt, memory_limit);
  if (stack_size != 0)
    JS_SetMaxStackSize(rt, stack_size);

  ctx = JS_NewContext(rt);

  if (!ctx)
    {
      fprintf(stderr, "qjs: cannot allocate JS context\n");
      goto fail;
    }

  js_std_add_helpers(ctx);

#ifdef CONFIG_INTERPRETERS_QUICKJS_EXT_HOOK
  if (OK != js_ext_init(ctx))
    {
      fprintf(stderr, "qjs: external context init failed\n");
      goto fail;
    }
#endif

  if (!empty_run)
    {
      if (expr)
        {
          if (js_eval_buf(ctx, expr, strlen(expr), "<cmdline>", 0))
            {
              goto fail;
            }
        }
      else if (argi < argc)
        {
          const char *filename;
          filename = argv[argi];
          if (js_eval_file(ctx, filename, 1))
            {
              goto fail;
            }
        }
    }

  if (dump_memory)
    {
      JSMemoryUsage stats;
      JS_ComputeMemoryUsage(rt, &stats);
      JS_DumpMemoryUsage(stdout, &stats, rt);
    }

fail:
  if (ctx)
    {
#ifdef CONFIG_INTERPRETERS_QUICKJS_EXT_HOOK
      js_ext_destroy(ctx);
#endif
      JS_FreeContext(ctx);
    }

  if (rt)
    JS_FreeRuntime(rt);

  return 0;
}