W3cubDocs

/Crystal 0.31

module Crystal

Defined in:

crystal/main.cr

Constant Summary

BUILD_COMMIT = "0e2e1d067"
BUILD_DATE = "2019-09-30"
CACHE_DIR = "/root/.cache/crystal"
DEFAULT_PATH = ""
DESCRIPTION = "Crystal 0.31.1 [0e2e1d067] (2019-09-30)\n\nLLVM: 8.0.0\nDefault target: x86_64-unknown-linux-gnu"
LIBRARY_PATH = "/usr/bin/../lib/crystal/lib"
LLVM_VERSION = "8.0.0"
PATH = "/crystal/src:lib"
VERSION = "0.31.1"

Class Method Summary

Class Method Detail

def self.main(&block)Source

Defines the main routine run by normal Crystal programs:

  • Initializes the GC
  • Invokes the given block
  • Handles unhandled exceptions
  • Invokes at_exit handlers
  • Flushes STDOUT and STDERR

This method can be invoked if you need to define a custom main (as in C main) function, doing all the above steps.

For example:

fun main(argc : Int32, argv : UInt8**) : Int32
  Crystal.main do
    elapsed = Time.measure do
      Crystal.main_user_code(argc, argv)
    end
    puts "Time to execute program: #{elapsed}"
  end
end

Note that the above is really just an example, almost the same can be accomplished with at_exit. But in some cases redefinition of C's main is needed.

def self.main(argc : Int32, argv : Pointer(Pointer(UInt8)))Source

Main method run by all Crystal programs at startup.

This setups up the GC, invokes your program, rescuing any handled exception, and then runs at_exit handlers.

This method is automatically invoked for you, so you don't need to invoke it.

However, if you need to define a special main C function, you can redefine main and invoke Crystal.main from it:

fun main(argc : Int32, argv : UInt8**) : Int32
  # some setup before Crystal main
  Crystal.main(argc, argv)
  # some cleanup logic after Crystal main
end

The Crystal.main can also be passed as a callback:

fun main(argc : Int32, argv : UInt8**) : Int32
  LibFoo.init_foo_and_invoke_main(argc, argv, ->Crystal.main)
end

Note that before Crystal.main is invoked the GC is not setup yet, so nothing that allocates memory in Crystal (like new for classes) can be used.

def self.main_user_code(argc : Int32, argv : Pointer(Pointer(UInt8)))Source

Executes the main user code. This normally is executed after initializing the GC and before executing at_exit handlers.

You should never invoke this method unless you need to redefine C's main function. See Crystal.main for more details.

© 2012–2019 Manas Technology Solutions.
Licensed under the Apache License, Version 2.0.
https://crystal-lang.org/api/0.31.1/Crystal.html