The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
0.9653 2022-09-27
  [New Features]
    * Add the strerror_string native API.
    
      void* (*strerror_string)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t errno_value, int32_t length);

  [Document Improvement]
    * Add the link from SPVM::Document::LanguageSpecification to SPVM::Document::Language
    * Add the following CPAN modules to SPVM::Document::Modules
    
      =item * L<SPVM::Sys> - System Calls

      =item * L<SPVM::Sys::IO> - System Calls for File IO

      =item * L<SPVM::Sys::FileTest> - File Test

      =item * L<SPVM::Sys::Socket> - System Calls for Sockect

      =item * L<SPVM::Sys::User> - System Calls for User Manipulation

      =item * L<SPVM::Sys::Process> - System Calls for Process
    

0.9652 2022-09-09
  [Incompatible Changes]
    * The numeric class(Byte, Short, Int, Long, Float, Double) become mutable.
    * The Byte class becomes mutable.
    [Before]
    has value : ro byte;
    
    [After]
    has value : rw byte;

    * The Short class becomes mutable.
    [Before]
    has value : ro short;
    
    [After]
    has value : rw short;

    * The Int class becomes mutable.
    [Before]
    has value : ro int;
    
    [After]
    has value : rw int;

    * The Long class becomes mutable.
    [Before]
    has value : ro long;
    
    [After]
    has value : rw long;

    * The Float class becomes mutable.
    [Before]
    has value : ro float;
    
    [After]
    has value : rw float;

    * The Double class becomes mutable.
    [Before]
    has value : ro double;
    
    [After]
    has value : rw double;
    
0.9651 2022-09-08
  [New Features]
    * Add the FILE_NAME variable to the native module file that is generated by spvmdist.
    
      static const char* FILE_NAME = "Foo.c";
    * Add the shorten_null_char method to the Fn class.
    
        static method shorten_null_char : void ($string : mutable string)

      Shorten the string just before the first null character C<\0>.

      If null characters is not found, do nothing.

      The string must be defined. Otherwise an exception will occur.

      B<Example:>
        
        my $message = (mutable string)copy "foo\0bar";
        
        # "foo"
        my $message_shoten = Fn->shorten_null_char($message);
    
    * Add the init method to the Point class
    
      =head2 init

        protected method init : Point ($x = 0 : int, $y = 0 : int)

      Initialize L</"x"> and L</"y">.


    * Add the init method to the Point3D class
    
      =head2 init

        protected method init : Point3D ($x = 0 : int, $y = 0 : int, $z = 0 : int)

      Initialize L</"x">, L</"y">, and L</"z">.

      
  [Test Changes]
    * Move shorten test from string.t to module/Fn.t
  [Incompatible Changes]
    * Rename the pointable method in the Point class to the has_interfaces method.
    * Rename the pointable method in the Pointable class to the has_interfaces method.
    * Rename Pointable class to the Point::Interface class.
    
0.9650 2022-09-02
  [Incompatible Changes]
    * Rename the following methods in Time::Info
      [Before]
      native method sec : int ();
      native method min : int ();
      native method hour : int ();
      native method mday : int ();
      native method mon : int ();
      native method year : int ();
      native method wday : int ();
      native method yday : int ();
      native method hour : int ();
      native method mday : int ();
      native method mon : int ();
      native method year : int ();
      native method wday : int ();
      native method yday : int ();
      native method isdst : int ();
      native method set_sec : int ($sec : int);
      native method set_min : int ($min : int);
      native method set_hour : int ($hour : int);
      native method set_mday : int ($mday : int);
      native method set_mon : int ($mon : int);
      native method set_year : int ($year : int);
      native method set_wday : int ($wday : int);
      native method set_yday : int ($yday : int);
      native method set_isdst : int ($isdst : int);

      [After]
      native method tm_sec : int ();
      native method tm_min : int ();
      native method tm_hour : int ();
      native method tm_mday : int ();
      native method tm_mon : int ();
      native method tm_year : int ();
      native method tm_wday : int ();
      native method tm_yday : int ();
      native method tm_isdst : int ();
      native method set_tm_sec : int ($sec : int);
      native method set_tm_min : int ($min : int);
      native method set_tm_hour : int ($hour : int);
      native method set_tm_mday : int ($mday : int);
      native method set_tm_mon : int ($mon : int);
      native method set_tm_year : int ($year : int);
      native method set_tm_wday : int ($wday : int);
      native method set_tm_yday : int ($yday : int);
      native method set_tm_isdst : int ($isdst : int);
    * Remove the following deprecated methods.
      Point->new_xy
      Point3D->new_xyz
      Array->copy_range_byte
      Array->copy_range_double
      Array->copy_range_float
      Array->copy_range_int
      Array->copy_range_long
      Array->copy_range_object
      Array->copy_range_object_address
      Array->copy_range_short
      Array->copy_range_string
      Array->copy_range_string_address
      Array->copy_range_object
      Array->copy_range_object_address
      Array->copy_range_short
      Array->copy_range_string
      Array->copy_range_string_address
      Array->memcpy_object
      Array->memcpy_string
      Array->memmove_object
      Array->memmove_string
      Fn->get_next_code_point
      Fn->look_next_code_point
      Fn->index_len
      Fn->rindex_len
      Fn->split_limit
      Fn->trim_ascii_space
      Fn->index_len
      Fn->rindex_len
      Fn->split_limit
      Fn->trim_ascii_space

  [Compilation Error Message Improvement]
    * The following compilation error message is changed.
      [Before]The narrowing type conversion can't be performed in %s at %s line %d
      [After]The implicite narrowing conversion from \"%s\" to \"%s\" in %s is not allowed at %s line %d

  [Incompatible Document Changes]
    * Rename the heading.
      [Before]String Type
      [After]string Type

      [Before]Integer Promotional Type Conversion
      [After]Integer Promotional Conversion

      [Before]Numeric Widening Type Conversion
      [After]Numeric Widening Conversion

      [Before]Numeric Narrowing Type Conversion
      [After]Numeric Narrowing Conversion

      [Before]Binary Numeric Type Conversion
      [After]Binary Numeric Conversion

      [Before]Numeric-to-String Type Conversion
      [After]Numeric-to-String Conversion

      [Before]String-to-byte[] Type Conversion
      [After]String-to-byte[] Conversion

      [Before]byte[]-to-String Type Conversion
      [After]byte[]-to-string Conversion

      [Before]Boxing Type Conversion
      [After]Boxing Conversion

      [Before]Unboxing Type Conversion
      [After]Unboxing Conversion

      [Before]Conditional Type Conversion
      [After]Bool Conversion

0.9649 2022-08-31
  [Bug Fix]
    * Fix the bug that the destcutor changes the original return vlaue.
  [Document Improvement]
    * Improve the doc of the unary plus operator.
    * Improve the doc of the unary minus operator.
    * Improve many parts. The numeric widening type conversion is replaced with the integer promotional type conversion.
    * Improve the doc of the switch statement.
    * Improve the doc of "Loop Syntax".
    * Improve the doc of "return Statemenet".
    * Improve the doc of "Empty Statemenet".
    * Improve the doc of "Operator Statemenet".
  [Document Fix]
    * Fix the type of the heading "Character Literal".

0.9648 2022-08-30
  [New Features]
    * Add Pointable module.
    * Add Pointable interface to Point class.
    * Add the following method to Point class.
      
      required method pointable : int ();
    
  [Incompatible Changes]
    * All method call that is called from the class is resolved in compilation time.
      [Before]
      # (0, 0, 0)
      my $point3d = Point3D->new(1, 2, 3);
      my $point = (Point)$point3d;
      $point->clear;
      [After]
      # (0, 0, 3) because $point is Point class.
      my $point3d = Point3D->new(1, 2, 3);
      my $point = (Point)$point3d;
      $point->clear;
      
      Please rewrite to
      
      # (0, 0, 0).
      my $point3d = Point3D->new(1, 2, 3);
      my $point = (Point)$point3d;
      $point->(Pointable)->clear;
    
0.9647 2022-08-29
  [New Features]
    * Add "protected" attribute.
    * Implement the compilation error check of "protected" class.
    * Implement the compilation error check of "protected" method.
    * Implement the compilation error check of "protected" class variable.
    * Implement the compilation error check of "protected" field.
  [Bug Fix]
    * Fix the bug that private field is searched.
  [Imcompative Changes]
    * SUPER:: qualifier calls the method of the super class of the current class, instead of the instance.
    * The field searching of the field access is used for the class and the super classes.
    * Remove the following API.
      int32_t (*get_instance_method_id_super)(SPVM_ENV* env, void* object, const char* method_name);
  [Changes]
    * The definition of the fields are changes in Point class.
      [Before]
      has x : rw int;
      has y : rw int;
      [After]
      has x : rw protected int;
      has y : rw protected int;
    * The definition of the fields are changes in Point3D class.
      [Before]
      has z : rw int;
      [After]
      has z : rw protected int;
    * Allow the field definition the name is the same as the super class.
  [Compilation Error Messages Improvement]
    * Improve the following compilation error message.
      [Before]
      The object can't be created from the private class
      [After]
      The object of the private class "Int" can't be created from the current class "MyClass"
    * Improve the following compilation error message.
      [Before]
      The private method "foo" in the class "MyClass2" can't be called
      [After]
      The private method "foo" of the class "MyClass2" can't be called from the current class "MyClass"
    * Improve the following compilation error message.
      [Before]
      The private class variable "$MyClass2::FOO" can't be accessed
      [After]
      The private class variable "$FOO" of the class "MyClass2" can't be accessed from the current class "MyClass"
    * Improve the following compilation error message.
      [Before]
      The private field "x" in the class "MyClass2" can't be accessed
      [After]
      The private field "x" in the class "MyClass2" can't be accessed from the current class "MyClass"
  [Test Improvement]
    * Add "protected" tests.
    * Fix inheritance tests.
  [Internal Changes Without Effect]
    * Change the definition of the following function.
      [Before]
      int32_t SPVM_OP_is_allowed(SPVM_COMPILER* compiler, SPVM_OP* op_class_current, SPVM_OP* op_class_dist);
      [After]
      int32_t SPVM_OP_is_allowed(SPVM_COMPILER* compiler, SPVM_CLASS* class_current, SPVM_CLASS* class_dist);
    * Add SPVM_OP_CHECKER_can_access.
    * Add SPVM_ATTRIBUTE_C_ID_UNKNOWN.
    * Rename SPVM_OP_build_has to SPVM_OP_build_field.
    * Add compile_ok, compile_ok_file to MyTest.pm.
    * Add merged_fields_original_offset to spvm_class.c and set it.
    * Rename tmp_merged_fields to merged_fields of spvm_class.h.
0.9646 2022-08-29
  [New Features]
    * Add the following native APIs.
      void* (*new_pointer_with_fields)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, void* pointer, int32_t fields_length);
      void* (*new_pointer_with_fields_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, void* pointer, int32_t fields_length);
      void* (*new_pointer_with_fields_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, void* pointer, int32_t fields_length, int32_t* error, const char* file, int32_t line);
      int32_t (*is_class)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      int32_t (*is_pointer_class)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      int32_t (*get_pointer_fields_length)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      int8_t (*get_pointer_field_byte)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      int16_t (*get_pointer_field_short)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      int32_t (*get_pointer_field_int)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      int64_t (*get_pointer_field_long)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      float (*get_pointer_field_float)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      double (*get_pointer_field_double)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      void* (*get_pointer_field_pointer)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index);
      void (*set_pointer_field_byte)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, int8_t value);
      void (*set_pointer_field_short)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, int16_t value);
      void (*set_pointer_field_int)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, int32_t value);
      void (*set_pointer_field_long)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, int64_t value);
      void (*set_pointer_field_float)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, float value);
      void (*set_pointer_field_double)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, double value);
      void (*set_pointer_field_pointer)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_index, void* value);
    * The pointer class can inherit a pointer class.
    * DESTROY method can be called as a instance method.
    * The child class inherits the destructor of the parent class if the destructor of the current class doesn't eixst.
  [Test Improvement]
    * Add tests of pointer fields native APIs.
  [Bug Fix]
    * Fix the bug that native API new_pointer_with_fields_raw can't set the length of the fields.
  [Needed Resource Changes]
    * The pointer class need the following memory because of the feature that any information can be saved.
      [Before]
      (intptr_t)env->object_header_byte_size + sizeof(void*) * 2;
      [After]
      (intptr_t)env->object_header_byte_size + sizeof(SPVM_VALUE) * 2;
  [Internal Changes Without Effect]
    * Add the following functions to spvm_api.c
      SPVM_OBJECT* SPVM_API_new_pointer_with_fields(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, void* pointer, int32_t fields_length);
      SPVM_OBJECT* SPVM_API_new_pointer_with_fields_by_name(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, void* pointer, int32_t fields_length, int32_t* error, const char* file, int32_t line);
      SPVM_OBJECT* SPVM_API_new_pointer_with_fields_raw(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, void* pointer, int32_t fields_length);
    * Add the following functions to spvm_api.c
      int32_t SPVM_API_get_pointer_fields_length(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object);
      int8_t SPVM_API_get_pointer_field_byte(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      int16_t SPVM_API_get_pointer_field_short(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      int32_t SPVM_API_get_pointer_field_int(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      int64_t SPVM_API_get_pointer_field_long(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      float SPVM_API_get_pointer_field_float(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      double SPVM_API_get_pointer_field_double(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      void* SPVM_API_get_pointer_field_pointer(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index);
      void SPVM_API_set_pointer_field_byte(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, int8_t value);
      void SPVM_API_set_pointer_field_short(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, int16_t value);
      void SPVM_API_set_pointer_field_int(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, int32_t value);
      void SPVM_API_set_pointer_field_long(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, int64_t value);
      void SPVM_API_set_pointer_field_float(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, float value);
      void SPVM_API_set_pointer_field_double(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, double value);
      void SPVM_API_set_pointer_field_pointer(SPVM_ENV* env, SPVM_VALUE* stack, SPVM_OBJECT* object, int32_t field_index, void* value);

0.9645 2022-08-26
  [Incompatible Changes]
    * Remove the following native APIs. These are added 0.9640(2022-08-16)
      int32_t (*check_flag_pointer_dont_free)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*enable_flag_pointer_dont_free)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*disable_flag_pointer_dont_free)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      int32_t (*get_pointer_length)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*set_pointer_length)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t length);
      void* (*get_pointer_any_info)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*set_pointer_any_info)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, void* any_info);

0.9644 2022-08-26
  [Document Changes]
    * Add heading "Conditional Branch".
    * Add heading "Loop Syntax".
    * Reorder a heading. "void Reterning Operator" is moved after "Operator".
    * Reorder headding. The following headding is moved after "Loop Syntax".
      "Empty Statement"
      "Operator Statement"
      "void Returning Operator Statement"
    * Improve multi-dimentional array representation from [][]... to []...[]
    * Improve the doc of if Statement
    * Improve the doc of elsif Statement
    * Improve the doc of else Statement
    * Improve the doc of unless Statement
    * Add the "Integral Type Within int" heading
      Integral Type Within int
      The integral type within int is the integral type within the int type.
      In other words, the integral types within int are the byte type, the short type, and the int type.
    * Add the heading "Integer Promotional Type Conversion" 
    * Rename the heading "String Creating Operator" to "new_string_len Operator".
    * Rename the heading "Enumeration Call" to "Getting Enumeration Value".
    * Rename the following heading and the content.
      [Before]
      "Enumeration Descriptors"
      "Method Descriptors"
      "Field Descriptor"
      "Class Variable Descriptor"
      "Class Descriptor"
      [After]
      "Enumeration Attributes"
      "Method Attributes"
      "Field Attribute"
      "Class Variable Attribute"
      "Class Attribute"

  [Document Fix]
    * The heading "Integral Type" is renamed to "Integer Type". This was my English mistake.
      And the contens.
  [Test Improvement]
    * Cleanup tests for statements.
      if.t unless.t -> conditional_branch.t
    * Add the test of the compilation error of the new_string_len operator
  [Exception Message Improvement[
    * The following exception message is improved.
      [Before]
      The private method \"%s\" can't be called at %s line %d
      [After]
      The private method \"%s\" in the class \"%s\" can't be called
    * The following exception message is improved.
      [Before]
      The array length specified by the new operator must be the int type
      [After]
      The array length specified by the new operator must be an integer type within int
    * The following exception message is improved.
      [Before]
      The condition of the switch statement must be the int type
      [After]
      The condition of the switch statement must be an integer type within int

  [Internal Changes Without Effect]
    * Add the following functions to "spvm_basic_type.c"
      int32_t SPVM_BASIC_TYPE_is_integral_type_within_int(SPVM_COMPILER* compiler, int32_t basic_type_id);
    * Add the following functions to "spvm_type.c"
      int32_t SPVM_TYPE_is_integral_type_within_int(SPVM_COMPILER* compiler, int32_t basic_type_id, int32_t dimension, int32_t flag);
    * "integral_type" is replaced to "integer_type".
    * "integer_type_except_for_long" is replaced to "integer_type_within_int".
    * Rename SPVM_OP_CHECKER_apply_unary_numeric_widening_conversion in spvm_op_checker.c to SPVM_OP_CHECKER_apply_integer_promotional_conversion
    * Rename the following functions in spvm_op_checker.c
      [Before]
      void SPVM_OP_CHECKER_apply_numeric_to_string_conversion(SPVM_COMPILER* compiler, SPVM_OP* op_term);
      void SPVM_OP_CHECKER_apply_integer_promotional_conversion(SPVM_COMPILER* compiler, SPVM_OP* op_unary);
      void SPVM_OP_CHECKER_apply_binary_numeric_conversion(SPVM_COMPILER* compiler, SPVM_OP* op_first, SPVM_OP* op_last);
      [After]
      void SPVM_OP_CHECKER_perform_numeric_to_string_conversion(SPVM_COMPILER* compiler, SPVM_OP* op_term);
      void SPVM_OP_CHECKER_perform_integer_promotional_conversion(SPVM_COMPILER* compiler, SPVM_OP* op_unary);
      void SPVM_OP_CHECKER_perform_binary_numeric_conversion(SPVM_COMPILER* compiler, SPVM_OP* op_first, SPVM_OP* op_last);
    * Rename the following functions in spvm_type.c
      SPVM_TYPE_check_assignability to SPVM_TYPE_can_assign
      SPVM_TYPE_check_castability to SPVM_TYPE_can_cast
    * Replace "descriptor" to "attribute".
      Rename "spvm_descriptor.c" to "spvm_attribute.c"
      Rename "spvm_descriptor.h" to "spvm_attribute.h"
      
0.9643 2022-08-18
  [Revert]
    * Revert the following changes.
      0.9642 2022-08-17
        [Chagnes]
          * SPVM::Builder::Util::API::create_make_rule_native and SPVM::Builder::Util::API::create_make_rule_precompile output SPVM core files dependency.
  [New Features]
    * The method defined in the interface method can have the block.
    * The above method is called by using static instance method call.
      
      class MyStringable : interface_t {
        method to_string : string ();
        
        method call_to_string : string () {
          return "call_to_string " . $self->to_string;
        }
      }
      
      class MyClass {
        interface MyStringable;
        
        static method main : int () {
          my $object = new MyClass;
          $object->MyStringable::call_to_string;
        }
      }
    
  [Compilation Error Messages Improvement]
    * Improve the following compilation error message.
      
      class MyClass { use Stringable; use Point3D; static method main : void () { my $stringable = (Stringable)Point3D->new; $stringable->SUPER::clear; } }
      
      [Before]
      Understandable Message.
      
      [After]
      The method of the super class can't be called from the interface type

0.9642 2022-08-17
  [Improvement Exception Messages]
    * Improve many exception messages.
  [Exception Messages Fix]
    * Fix many exception messages.
  [Chagnes]
    * SPVM::Builder::Util::API::create_make_rule_native and SPVM::Builder::Util::API::create_make_rule_precompile output SPVM core files dependency.
  [Internal Ineffective Changes]
    * In SPVM::Builder::Util::need_generate, SPVM core source files are searched from SPVM::Builder::Util path instead fo SPVM::Builder path.
    * Add SPVM::Builder::Util::get_spvm_core_files and use it from SPVM::Builder::Util::need_generate.
    * Remove the tail slash of builder dir in SPVM::Builder::Util::get_spvm_core_files.
    * Add shared error messages to spvm_precompile.c
    * The names of the opcodes become upper case again.

0.9641 2022-08-17
  [New Features]
    * Add the following methods to Fn class.
      static method is_class : int ($object : object)
      static method is_pointer_class : int ($object : object)
    
    * Add the following runtime native APIs.
    
      int32_t (*get_class_is_pointer)(void* runtime, int32_t class_id);
      
    * Add the following native APIs.
    
      int32_t (*is_class)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      int32_t (*is_pointer_class)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
  [Document Fix]
    * Remove the headding "Pointer Type" and add "Pointer Class".
    * SPVM::Document::LanguageSpecification is renamed to SPVM::Document::Language.
      SPVM::Document::LanguageSpecification remains and the content is the link to SPVM::Document::Language.
0.9640 2022-08-16
  [New Features]
    * Add the following native APIs.
      int32_t (*check_flag_pointer_dont_free)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*enable_flag_pointer_dont_free)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*disable_flag_pointer_dont_free)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      int32_t (*get_pointer_length)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*set_pointer_length)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t length);
      void* (*get_pointer_any_info)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
      void (*set_pointer_any_info)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, void* any_info);

  [Document Fix]
    * Fix the parsing difinition. I have forgot to add the void returning operator in before release.
    * Rename the headding "empty Statement" to "Empty Statement".
    * Rename Operation Statement to Operator Statement.
    * Add void Returning Operator Statement.
  [Document Improvement]
    * Method Call becomes headding 1.
  [Improvement Exception Messages]
    * Improve many exception messages.
  [Needed Resource Changes]
    * The pointer class need the following memory because of the feature that any information can be saved.
      [Before]
      (intptr_t)env->object_header_byte_size + sizeof(void*);
      [After]
      (intptr_t)env->object_header_byte_size + sizeof(void*) * 2;
  [Internal Ineffective Changes]
    * Revmoe unneeded SPVM_OP_C_ID_ELEMENT, SPVM_OP_C_ID_OARRAY, SPVM_OP_C_ID_SET, SPVM_OP_C_ID_GET ops.
    * Rename SPVM_OP_C_ID_NULL to SPVM_OP_C_ID_DO_NOTHING.
    * Remove SPVM_OP_C_ID_STAB.
    * Remove SPVM_OP_C_ID_PRECOMPILE, SPVM_OP_C_ID_RW, SPVM_OP_C_ID_RO, SPVM_OP_C_ID_WO, SPVM_OP_C_ID_REQUIRED.
    * Remove SPVM_OP_C_ID_SELF.
    * Remove SPVM_OP_C_ID_BLOCK_END.
    * Reorder ops.
    * The part of spvm_api.c and spvm_api.h is separated to spvm_vm.c and spvm_api_vm.h.
    * SPVM_API_call_spvm_method_vm in spvm_api.c is renamed to SPVM_API_VM_call_spvm_method_vm in spvm_api_vm.c.
    * Reorder opcodes in spvm_api_vm.c.
    * Reorder opcodes in spvm_precompile.c.
    * Change the definition of the following function
      [Before]
      const char* SPVM_OPCODE_get_opcode_name(SPVM_COMPILER* compiler, int32_t opcode_id);
      [After]
      const char* SPVM_OPCODE_get_opcode_name(int32_t opcode_id);
    * The exception messages are shared.
    * Add SPVM_OBJECT_C_FLAG_POINTER_DONT_FREE to spvm_object.h
      
0.9639 2022-08-15
  [New Features]
    * Add the is_type operator.
    * Add Error::NotSupported class. This class is default loaded.
  [Bug Fix]
    * Fix the bug that non-class types become child classes.
    * Fix the bug that pointer class types become child classes.
    * Fix the bug that the interface name specified by the interface statement becomes the same name of the current interface.
  [Document Fix]
    * Fix the document bug of Class IDs of SPVM::Document::NativeAPI
      [Before]
        =head2 Class IDs

          1  SPVM_NATIVE_C_CLASS_ID_ERROR
          2  SPVM_NATIVE_C_CLASS_ID_ERROR
      
      [After]
        =head2 Class IDs

          1  SPVM_NATIVE_C_CLASS_ID_ERROR
          2  SPVM_NATIVE_C_CLASS_ID_ERROR_SYSTEM
          3  SPVM_NATIVE_C_CLASS_ID_ERROR_NOT_SUPPORTED
    * Add all standard modules to SPVM::Document::Modules.
      Until now, default loaded modules were removed.
      The following is the current list of standard modules.
      
      Array
      Bool
      Byte
      ByteList
      Cloneable
      Cloner
      CommandInfo
      Comparator
      Comparator::Byte
      Comparator::Double
      Comparator::Float
      Comparator::Int
      Comparator::Long
      Comparator::Short
      Comparator::String
      Complex_2d
      Complex_2f
      Double
      DoubleList
      EqualityChecker
      EqualityChecker::Address
      Error
      Error::NotSupported
      Error::System
      Float
      FloatList
      Fn
      Format
      Hash
      Hash::Entry
      Int
      IntList
      List
      Long
      LongList
      Point
      Point3D
      Short
      ShortList
      Sort
      Stringable
      StringBuffer
      Stringer
      StringList
      Time
      Time::Info
    * die, warn, print, weaken, unweaken, make_read_only statement become void returning operators instead of statements.
  [Compilation Error Message Improvement]
    * Improve compilation error messages.
  [Document Improvement]
    * Add the docs of the void returning operator.
    * Improve the doc of the new operator
  [Test Improvement]
    * Add many compilation error tests.
  [Ineffective Changes]
    * die, warn, print, weaken, unweaken, make_read_only statement become void returning operators instead of statements.
  [Internal Ineffective Changes]
    * Rename SPVM_OP_build_value_op_statement to SPVM_OP_build_operator_statement

0.9638 2022-08-10
  [Fix Bug]
    * Fix the bug that spvmdist command can't show help
  [Test Improvement]
    * Add spvmcc -h, --help option tests
  [Compilation Error Message Improvement]
    * Improve compilation error messages.
    * Fix wrong compilation error messages.
  [Ineffective Changes]
    * The refcnt operator receive an operater instead of a variable.
    * op names become lower case.
    * opcode names become lower case.
  [Incompatible Changes]
    * spvmdist and spvmcc help message is output to stdout, instead of stderr.
0.9637 2022-08-08
  [New Features]
    * for-each Statement

      The for-each statement is a statement to write the for statement for iterating easily.

        for my VAR (@OPERATOR) {
        
        }
        
        for my VAR (@{OPERATOR}) {
          
        }

      The following C<for> statement is the same as the following for-each statement.

        # for
        my $array = [1, 2, 3];
        for (my $i = 0; $i < @$array; $i++) {
          my $element = $array->[$i];
        }
        
        # for-each
        my $array = [1, 2, 3];
        for my $element (@$array) {
          
        }
      
0.9636 2022-08-08
  [New Features]
    * Add the following native API.
    
      const char* (*dumpc)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
  
  [Improve Compilation Error Messages]
    * Improve compillation error messages in many places.
  [Bug Fix]
    * Fix the bug that the array initialization compilation error is not detected.
    * Fix the bug that non-interface type can be specified the operand of the interface statement.
  [Test]
    * Add many tests of compilation errors.
  [Incompatible Changes]
    * Fix the bug that the array initialization compilation error is not detected.
      For the reason of this, A compilation error occurs in the following code.
      {"foo" => 1, "bar"}
0.9635 2022-08-05
  [New Features]
    * If the depth of the method call is over 10000, an exception is thrown.
    * Use union type in type comment.
      
      has union_type : object of string|Point;
    * Add DEFAULT_CAPACITY enumeration value to ByteList class.
      enum {
        DEFAULT_CAPACITY = 4,
      }
    * Add capacity field is added to ByteList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of ByteList class.
      [Before]
      static method new : ByteList ($array = undef : byte[])
      static method new_len : ByteList ($length : int)
      [After]
      static method new : ByteList ($array = undef : byte[], $capacity = -1 : int)
      static method new_len : ByteList ($length : int, $capacity = -1 : int)
    * Add reserve method to ByteList class .
    * Add capacity field is added to ShortList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of ShortList class.
      [Before]
      static method new : ShortList ($array = undef : short[])
      static method new_len : ShortList ($length : int)
      [After]
      static method new : ShortList ($array = undef : short[], $capacity = -1 : int)
      static method new_len : ShortList ($length : int, $capacity = -1 : int)
    * Add reserve method to ShortList class .
    * Add capacity field is added to IntList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of IntList class.
      [Before]
      static method new : IntList ($array = undef : int[])
      static method new_len : IntList ($length : int)
      [After]
      static method new : IntList ($array = undef : int[], $capacity = -1 : int)
      static method new_len : IntList ($length : int, $capacity = -1 : int)
    * Add reserve method to IntList class .
    * Add capacity field is added to LongList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of LongList class.
      [Before]
      static method new : LongList ($array = undef : long[])
      static method new_len : LongList ($length : int)
      [After]
      static method new : LongList ($array = undef : long[], $capacity = -1 : int)
      static method new_len : LongList ($length : int, $capacity = -1 : int)
    * Add reserve method to LongList class .

    * Add capacity field is added to FloatList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of FloatList class.
      [Before]
      static method new : FloatList ($array = undef : float[])
      static method new_len : FloatList ($length : int)
      [After]
      static method new : FloatList ($array = undef : float[], $capacity = -1 : int)
      static method new_len : FloatList ($length : int, $capacity = -1 : int)
    * Add reserve method to FloatList class .

    * Add capacity field is added to DoubleList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of DoubleList class.
      [Before]
      static method new : DoubleList ($array = undef : double[])
      static method new_len : DoubleList ($length : int)
      [After]
      static method new : DoubleList ($array = undef : double[], $capacity = -1 : int)
      static method new_len : DoubleList ($length : int, $capacity = -1 : int)
    * Add reserve method to DoubleList class .

    * Add capacity field is added to StringList class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of StringList class.
      [Before]
      static method new : StringList ($array = undef : string[])
      static method new_len : StringList ($length : int)
      [After]
      static method new : StringList ($array = undef : string[], $capacity = -1 : int)
      static method new_len : StringList ($length : int, $capacity = -1 : int)
    * Add reserve method to StringList class .

    * Add capacity field is added to List class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of List class.
      [Before]
      static method new : List ($array = undef : object[])
      static method new_len : List ($length : int)
      [After]
      static method new : List ($array = undef : object[], $capacity = -1 : int)
      static method new_len : List ($length : int, $capacity = -1 : int)
    * Add reserve method to List class .

    * Add capacity field is added to StringBuffer class.
    
      has capacity : ro int;
    
    * Add optional capacity argument is added to new and new_len of StringBuffer class.
      [Before]
      static method new : StringBuffer ($string = undef : string)
      [After]
      static method new : StringBuffer ($string = undef : string, $capacity = -1 : int)
    * Add reserve method to StringBuffer class.
    * Add new_len method to StringBuffer class.
    
      static method new_len : StringBuffer ($length : int, $capacity = -1 : int)

  [Specification Bug Fix]
    * The escape character of the string literal "\0" becomes 0x24 ($). This was wrongly 0x44 (D).
  [Incompatible Changes]
    * The escape character of the string literal "\0" becomes 0x24 ($). This was wrongly 0x44 (D).
    * If the depth of the method call is over 10000, an exception is thrown.
  [Internal Changes]
    * Remove inline expansion of precompile function in the same class. This maybe reduce the performance of the method call.
    * Call depth is managed.
0.9634 2022-08-03
  [Changes]
    * Add an optional argument to the following methods of StringBuffer class.
      [qBefore]
      static method new : StringBuffer ()
      [After]
      static method new : StringBuffer ($string = undef : string)
    * Add optional arguments to the following methods of Point class.
      [Before]
      static method new : Point ()
      [After]
      static method new : Point ($x = 0 : int, $y = 0 : int)
    * Add optional arguments to the following methods of Point3D class.
      [Before]
      static method new : Point3D ()
      [After]
      static method new : Point3D ($x = 0 : int, $y = 0 : int, $z = 0 : int)
      
  [Incompatible Changes]
    * The defintions of the following methods of ByteList class are changed.
      [Before]
      static method new : ByteList ($array : byte[]...)
      [After]
      static method new : ByteList ($array = undef : byte[])
    * The defintions of the following methods of ShortList class are changed.
      [Before]
      static method new : ShortList ($array : short[]...)
      [After]
      static method new : ShortList ($array = undef : short[])
    * The defintions of the following methods of IntList class are changed.
      [Before]
      static method new : IntList ($array : int[]...)
      [After]
      static method new : IntList ($array = undef : int[])
    * The defintions of the following methods of LongList class are changed.
      [Before]
      static method new : LongList ($array : long[]...)
      [After]
      static method new : LongList ($array = undef : long[])
    * The defintions of the following methods of FloatList class are changed.
      [Before]
      static method new : FloatList ($array : float[]...)
      [After]
      static method new : FloatList ($array = undef : float[])
    * The defintions of the following methods of DoubleList class are changed.
      [Before]
      static method new : DoubleList ($array : double[]...)
      [After]
      static method new : DoubleList ($array = undef : double[])
    * The defintions of the following methods of List class are changed.
      [Before]
      static method new : List ($array : object[]...)
      [After]
      static method new : List ($array = undef : object[])
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_byte : byte[] ($array : byte[])

      Copy a C<byte> array.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_byte : byte[] ($array : byte[], $offset = 0 : int, $length = -1 : int)

      Create a new C<byte> array with the length sepcified by the argument, and copy the elements of the C<byte> array from the offset to the offset + the length - C<1> to the created array.

      If the length is less than C<0>, the length is calcurated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_byte calls Array->copy_byte.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_short : short[] ($array : short[])

      Copy a C<short> array.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_short : short[] ($array : short[], $offset = 0 : int, $length = -1 : int)

      Create a new C<short> array with the length sepcified by the argument, and copy the elements of the C<short> array from the offset to the offset + the length - C<1> to the created array.

      If the length is less than C<0>, the length is calcurated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_short calls Array->copy_short.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_int : int[] ($array : int[])

      Copy a C<int> array.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_int : int[] ($array : int[], $offset = 0 : int, $length = -1 : int)

      Create a new C<int> array with the length sepcified by the argument, and copy the elements of the C<int> array from the offset to the offset + the length - C<1> to the created array.

      If the length is less than C<0>, the length is calcurated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_int calls Array->copy_int.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_long : long[] ($array : long[])

      Copy a C<long> array.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_long : long[] ($array : long[], $offset = 0 : int, $length = -1 : int)

      Create a new C<long> array with the length sepcified by the argument, and copy the elements of the C<long> array from the offset to the offset + the length - C<1> to the created array.

      If the length is less than C<0>, the length is calcurated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_long calls Array->copy_long.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_float : float[] ($array : float[])

      Copy a C<float> array.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_float : float[] ($array : float[], $offset = 0 : int, $length = -1 : int)

      Create a new C<float> array with the length sepcified by the argument, and copy the elements of the C<float> array from the offset to the offset + the length - C<1> to the created array.

      If the length is less than C<0>, the length is calcurated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_float calls Array->copy_float.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_double : double[] ($array : double[])

      Copy a C<double> array.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_double : double[] ($array : double[], $offset = 0 : int, $length = -1 : int)

      Create a new C<double> array with the length sepcified by the argument, and copy the elements of the C<double> array from the offset to the offset + the length - C<1> to the created array.

      If the length is less than C<0>, the length is calcurated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_double calls Array->copy_double.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_object : object[] ($array : object[], $cloner : Cloner)
      
      Copy an object array. Each element is cloned by the L<Cloner|SPVM::Cloner>.
      [After]
      
        static method copy_object : object[] ($array : object[], $cloner = undef : Cloner, $offset = 0 : int, $legnth = -1 : int)

      Create a new object array with the length sepcified by the argument, and clone the elements of the object array by the length from the offset to the created array.

      Each element is cloned by the L<Cloner|SPVM::Cloner>.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The length must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.

    * Array->copy_range_object calls Array->copy_object.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]

        static method copy_string : string[] ($array : string[])

      Copy a C<string> array using the C<copy> operator.

      If the array is not defined, return C<undef>.

      [After]
      
        static method copy_string : string[] ($array : string[], $offset = 0 : int, $length = -1 : int)

      Create a new C<string> array with the length sepcified by the argument, and copy the elements of the C<string> array using C<copy> operator by the length from the offset to the created array.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.

    * Array->copy_range_string calls Array->copy_string.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
        static method copy_string_address : string[] ($array : string[])

      Copy the addresses of the elements of a C<string> array.

      If the array is not defined, return C<undef>.

      [After]
        static method copy_string_address : string[] ($array : string[], $offset = 0 : int, $length = -1 : int)

      Create a new C<string> array with the length sepcified by the argument, and copy the addresses of the elements of the C<string> array by the length from the offset to the created array.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.

      The array must be defined. Otherwise an exception will be thrown.

      The offset must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      The offset + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will be thrown.
    * Array->copy_range_string_address calls Array->copy_string_address.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_byte : void ($dest : byte[], $dest_offset : int, $element : byte, $length : int)

      Set the range of the elements of the destination C<byte> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_byte : void ($array : byte[], $element : byte, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<byte> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_short : void ($dest : short[], $dest_offset : int, $element : short, $length : int)

      Set the range of the elements of the destination C<short> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_short : void ($array : short[], $element : short, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<short> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_int : void ($dest : int[], $dest_offset : int, $element : int, $length : int)

      Set the range of the elements of the destination C<int> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_int : void ($array : int[], $element : int, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<int> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_long : void ($dest : long[], $dest_offset : int, $element : long, $length : int)

      Set the range of the elements of the destination C<long> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_long : void ($array : long[], $element : long, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<long> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_float : void ($dest : float[], $dest_offset : int, $element : float, $length : int)

      Set the range of the elements of the destination C<float> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_float : void ($array : float[], $element : float, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<float> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_double : void ($dest : double[], $dest_offset : int, $element : double, $length : int)

      Set the range of the elements of the destination C<double> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_double : void ($array : double[], $element : double, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<double> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_string : void ($dest : string[], $dest_offset : int, $element : string, $length : int)

      Set the range of the elements of the destination C<string> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_string : void ($array : string[], $element : string, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<string> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintion and implementation of the following method of Array class is changed.
      [Before]
    
        static method memset_object : void ($dest : object[], $dest_offset : int, $element : object, $length : int)

      Set the range of the elements of the destination C<object> array to the element specified by the argument.

      The range of the elements of the destination array is by the length from the offset of the destination to the offset of the destination.

      The destination must be defined. Otherwise an exception will occur.

      The offset of the destination must be greater than or equal to C<0>. Otherwise an exception will occur.

      The length must be greater than or equal to 0. Otherwise an exception will occur.

      The offset of the destination + the length specified by the argument must be less than or equal to the length of the destination. Otherwise an exception will occur.
      [After]
      
        static method memset_object : void ($array : object[], $element : object, $offset = 0 : int, $length = -1 : int)
      
      Set the range of the elements of the C<object> array to the element specified by the argument.
      The range of the elements of the array is by the length from the offset.
      If the length is less than C<0>, the length is calculated from the length of the array and the offset.
      The array must be defined. Otherwise an exception will occur.
      The offset of the array must be greater than or equal to C<0>. Otherwise an exception will occur.
      The offset of the array + the length specified by the argument must be less than or equal to the length of the array. Otherwise an exception will occur.
    * The defintions of the following method of Hash class is changed.
      [Before]
      static method new : Hash ($key_values : object[]...)
      [After]
      static method new : Hash ($key_values = undef : object[])
    * The defintion and implementation of the following methods of Sort class is changed.
      [Before]
      static method sort_byte : void ($array : byte[], $offset : int, $length : int, $comparator : Comparator::Byte)
      static method sort_byte_asc : void ($array : byte[], $offset : int, $length : int)
      static method sort_byte_desc : void ($array : byte[], $offset : int, $length : int)
      static method sort_short : void ($array : short[], $offset : int, $length : int, $comparator : Comparator::Short)
      static method sort_short_asc : void ($array : short[], $offset : int, $length : int)
      static method sort_short_desc : void ($array : short[], $offset : int, $length : int)
      static method sort_int : void ($array : int[], $offset : int, $length : int, $comparator : Comparator::Int)
      static method sort_int_asc : void ($array : int[], $offset : int, $length : int)
      static method sort_int_desc : void ($array : int[], $offset : int, $length : int)
      static method sort_long : void ($array : int[], $offset : int, $length : long, $comparator : Comparator::Long)
      static method sort_long_asc : void ($array : long[], $offset : int, $length : int)
      static method sort_long_desc : void ($array : long[], $offset : int, $length : int)
      static method sort_float : void ($array : int[], $offset : int, $length : int, $comparator : Comparator::Float)
      static method sort_float_asc : void ($array : float[], $offset : int, $length : int)
      static method sort_float_desc : void ($array : float[], $offset : int, $length : int)
      static method sort_double : void ($array : int[], $offset : int, $length : int, $comparator : Comparator::Double)
      static method sort_double_asc : void ($array : double[], $offset : int, $length : int)
      static method sort_double_desc : void ($array : double[], $offset : int, $length : int)
      static method sort_string : void ($array : int[], $offset : int, $length : int, $comparator : Comparator::String)
      static method sort_string_asc : void ($array : string[], $offset : int, $length : int)
      static method sort_string_desc : void ($array : string[], $offset : int, $length : int)
      static method sort_object : void ($array : int[], $offset : int, $length : int, $comparator : Comparator)

      The length must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      [After]
      static method sort_byte : void ($array : byte[], $comparator : Comparator::Byte, $offset = 0 : int, $length = -1 : int)
      static method sort_byte_asc : void ($array : byte[], $offset = 0 : int, $length = -1 : int)
      static method sort_byte_desc : void ($array : byte[], $offset = 0 : int, $length = -1 : int)
      static method sort_short : void ($array : short[], $comparator : Comparator::Short, $offset = 0 : int, $length = -1 : int)
      static method sort_short_asc : void ($array : short[], $offset = 0 : int, $length = -1 : int)
      static method sort_short_desc : void ($array : short[], $offset = 0 : int, $length = -1 : int)
      static method sort_int : void ($array : int[], $comparator : Comparator::Int, $offset = 0 : int, $length = -1 : int)
      static method sort_int_asc : void ($array : int[], $offset = 0 : int, $length = -1 : int)
      static method sort_int_desc : void ($array : int[], $offset = 0 : int, $length = -1 : int)
      static method sort_long : void ($array : int[], $comparator : Comparator::Long, $offset : int, $length : long)
      static method sort_long_asc : void ($array : long[], $offset = 0 : int, $length = -1 : int)
      static method sort_long_desc : void ($array : long[], $offset = 0 : int, $length = -1 : int)
      static method sort_float : void ($array : int[], $comparator : Comparator::Float, $offset = 0 : int, $length = -1 : int)
      static method sort_float_asc : void ($array : float[], $offset = 0 : int, $length = -1 : int)
      static method sort_float_desc : void ($array : float[], $offset = 0 : int, $length = -1 : int)
      static method sort_double : void ($array : int[], $comparator : Comparator::Double, $offset = 0 : int, $length = -1 : int)
      static method sort_double_asc : void ($array : double[], $offset = 0 : int, $length = -1 : int)
      static method sort_double_desc : void ($array : double[], $offset = 0 : int, $length = -1 : int)
      static method sort_string : void ($array : int[], $comparator : Comparator::String, $offset = 0 : int, $length = -1 : int)
      static method sort_string_asc : void ($array : string[], $offset = 0 : int, $length = -1 : int)
      static method sort_string_desc : void ($array : string[], $offset = 0 : int, $length = -1 : int)
      static method sort_object : void ($array : int[], $comparator : Comparator, $offset = 0 : int, $length = -1 : int)

      If the length is less than C<0>, the length is calculated from the length of the array and the offset.

    * The defintion and implementation of the following methods of Fn class is changed.

      [Before]
        static method contains : int ($string : string, $substring : string)
        static method index : int ($string : string, $substring : string, $offset : int)
        static method rindex : int ($string : string, $substring : string, $offset : int)
        static method substr : string ($string : string, $offset : int, $length : int)
        
        The length must be greater than or equal to C<0>. Otherwise an exception will be thrown.

      [After]
        static method contains : int ($string : string, $substring : string, $offset = 0 : int, $length = -1 : int)
        static method index : int ($string : string, $substring : string, $offset = 0 : int, $length = -1 : int)
        static method rindex : int ($string : string, $substring : string, $offset = 0 : int, $length = -1 : int)
        static method substr : string ($string : string, $offset : int, $length = -1 : int)

        If the length is less than C<0>, the length to the end of the string is calculated from the length of the string and the offset.
      
  [Deprecation]
    * The following methods of Point class are deprecated.
      # Point->new_xy($x, $y) is deprecated. Use Point->new($x, $y) instead. This method will be removed after 2022-09-03
      static method new_xy : Point ($x : int, $y : int)
    * The following methods of Point3D class are deprecated.
      # Point3D->new_xyz($x, $y, $z) is deprecated. Use Point3D->new($x, $y, $z) instead. This method will be removed after 2022-09-03
      static method new_xyz : Point3D ($x : int, $y : int, $z : int)
    * The following methods of Array class are deprecated.
      static method copy_range_byte : byte[] ($array : byte[], $offset : int, $length : int) {
        warn "Array->copy_range_byte(\$array, \$offset, \$length) is deprecated. Use Array->copy(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_byte($array, $offset, $length);
      }
      static method copy_range_short : short[] ($array : short[], $offset : int, $length : int) {
        warn "Array->copy_range_short(\$array, \$offset, \$length) is deprecated. Use Array->copy(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_short($array, $offset, $length);
      }
      static method copy_range_int : int[] ($array : int[], $offset : int, $length : int) {
        warn "Array->copy_range_int(\$array, \$offset, \$length) is deprecated. Use Array->copy(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_int($array, $offset, $length);
      }
      static method copy_range_long : long[] ($array : long[], $offset : int, $length : int) {
        warn "Array->copy_range_long(\$array, \$offset, \$length) is deprecated. Use Array->copy(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_long($array, $offset, $length);
      }
      static method copy_range_float : float[] ($array : float[], $offset : int, $length : int) {
        warn "Array->copy_range_float(\$array, \$offset, \$length) is deprecated. Use Array->copy(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_float($array, $offset, $length);
      }
      static method copy_range_double : double[] ($array : double[], $offset : int, $length : int) {
        warn "Array->copy_range_double(\$array, \$offset, \$length) is deprecated. Use Array->copy(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_double($array, $offset, $length);
      }
      static method copy_range_object_address : object[] ($array : object[], $offset : int, $length : int) {
        warn "Array->copy_range_object_address(\$array, \$offset, \$length) is deprecated. Use Array->copy_object_address(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_range_object($array, $offset, $length, undef);
      }
      static method copy_range_object : object[] ($array : object[], $offset : int, $length : int, $cloner : Cloner) {
        warn "Array->copy_range_object(\$array, \$offset, \$length, \$cloner) is deprecated. Use Array->copy_object(\$array, \$cloner, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_object($array, $cloner, $offset, $length);
      }
      static method copy_range_string : string[] ($array : string[], $offset : int, $length : int) {
        warn "Array->copy_range_string(\$array, \$offset, \$length) is deprecated. Use Array->copy_string(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_string($array, $offset, $length);
      }

      static method copy_range_string_address : string[] ($array : string[], $offset : int, $length : int) {
        warn "Array->copy_range_string_address(\$array, \$offset, \$length) is deprecated. Use Array->copy_string_address(\$array, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &copy_string_address($array, $offset, $length);
      }

    * The following methods of Fn class are deprecated.
      static method index_len : int ($string : string, $substring : string, $offset : int, $length : int) {
        warn "Fn->index_len(\$string, \$substring, \$offset, \$length) is deprecated. Use Fn->index(\$string, \$substring, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &index($string, $substring, $offset, $length);
      }
      static method rindex_len : int ($string : string, $substring : string, $offset : int, $length : int) {
        warn "Fn->rindex_len(\$string, \$substring, \$offset, \$length) is deprecated. Use Fn->rindex(\$string, \$substring, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &rindex($string, $substring, $offset, $length);
      }
      static method split_limit : string[] ($sep : string, $string : string, $limit : int) {
        warn "Fn->split_limit(\$string, \$substring, \$offset, \$length) is deprecated. Use Fn->split(\$string, \$substring, \$offset, \$length) instead. This method will be removed after 2022-09-03";
        return &split($sep, $string, $limit);
      }
      
  [Test Fix]
    * Add Point3D tests. These tests are removed wrongly.
0.9633 2022-08-03
  [New Features]
    * Add optional argument feature.
    * Add the following native APIs. The length of the arguments can be got in the native module.
      int32_t (*get_args_stack_length)(SPVM_ENV* env, SPVM_VALUE* stack);
      void (*set_args_stack_length)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t args_length);
    * Add the following runtime native APIs.
      int32_t (*get_method_required_args_length)(void* runtime, int32_t method_id);
  [Improve Exception Messages]
    * Improve exception messages in native APIs.
  [Incompatible Changes]
    * All the implementations, the fields, the arguments, native APIs, documents about the concept of "signature" are removed.
    * The definitions of the following native APIs are changed.
      [Before]
      int32_t (*get_field_id)(SPVM_ENV* env, const char* class_name, const char* field_name, const char* signature);
      int32_t (*get_class_var_id)(SPVM_ENV* env, const char* class_name, const char* class_var_name, const char* signature);
      int32_t (*get_class_method_id)(SPVM_ENV* env, const char* class_name, const char* method_name, const char* signature);
      int32_t (*get_instance_method_id)(SPVM_ENV* env, void* object, const char* method_name, const char* signature);
      void (*set_field_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, const char* signature, void* value, int32_t* error, const char* file, int32_t line);
      void* (*get_field_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, const char* signature, int32_t* error, const char* file, int32_t line);
      void (*set_class_var_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, const char* signature, void* value, int32_t* error, const char* file, int32_t line);
      void* (*get_class_var_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, const char* signature, int32_t* error, const char* file, int32_t line);
      int32_t (*call_class_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* method_name, const char* signature, const char* file, int32_t line);
      int32_t (*call_instance_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* method_name, const char* signature, const char* file, int32_t line);
      int32_t (*get_instance_method_id_static)(SPVM_ENV* env, const char* class_name, const char* method_name, const char* signature);
      int32_t (*get_instance_method_id_super)(SPVM_ENV* env, void* object, const char* method_name, const char* signature);
      
    [After]
      int32_t (*get_field_id)(SPVM_ENV* env, const char* class_name, const char* field_name);
      int32_t (*get_class_var_id)(SPVM_ENV* env, const char* class_name, const char* class_var_name);
      int32_t (*get_class_method_id)(SPVM_ENV* env, const char* class_name, const char* method_name);
      int32_t (*get_instance_method_id)(SPVM_ENV* env, void* object, const char* method_name);
      void (*set_field_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, void* value, int32_t* error, const char* file, int32_t line);
      void* (*get_field_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* error, const char* file, int32_t line);
      void (*set_class_var_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, void* value, int32_t* error, const char* file, int32_t line);
      void* (*get_class_var_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* error, const char* file, int32_t line);
      int32_t (*call_class_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* method_name, const char* file, int32_t line);
      int32_t (*call_instance_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* method_name, const char* file, int32_t line);
      int32_t (*get_instance_method_id_static)(SPVM_ENV* env, const char* class_name, const char* method_name);
      int32_t (*get_instance_method_id_super)(SPVM_ENV* env, void* object, const char* method_name);
      
    * The definitions of the following runtime native APIs are removed.
      int32_t (*get_class_var_signature_id)(void* runtime, int32_t class_var_id);
      int32_t (*get_field_signature_id)(void* runtime, int32_t field_id);
      int32_t (*get_method_signature_id)(void* runtime, int32_t method_id);
      
    * The precompiled methods don't use get_field_id_cache, get_class_var_id_cache, get_method_id_cache.
    * The definitions of the following runtime native APIs are changed.
      [Before]
      int32_t (*get_type_width)(void* runtime, int32_t type_id);
      [After]
      int32_t (*get_type_stack_length)(void* runtime, int32_t type_id);
    * The definitions of the following native APIs are changed.
      [Before]
      int32_t (*call_spvm_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id, int32_t args_stack_length);
      int32_t (*call_class_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* method_name, const char* file, int32_t line);
      int32_t (*call_instance_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* method_name, const char* file, int32_t line);
      int32_t (*call_class_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id);
      int32_t (*call_instance_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id);
      [After]
      int32_t (*call_spvm_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id, int32_t args_stack_length);
      int32_t (*call_class_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* method_name, int32_t args_stack_length, const char* file, int32_t line);
      int32_t (*call_instance_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* method_name, int32_t args_stack_length, const char* file, int32_t line);
      int32_t (*call_class_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id, int32_t args_stack_length);
      int32_t (*call_instance_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id, int32_t args_stack_length);
    * The definitions of the following native APIs are removed.
      int32_t (*get_method_id_cache)(SPVM_ENV* env, const char* method_cache_name, int32_t method_cache_name_length);
      int32_t (*get_field_id_cache)(SPVM_ENV* env, const char* field_cache_name, int32_t field_cache_name_length);
      int32_t (*get_class_var_id_cache)(SPVM_ENV* env, const char* class_var_cache_name, int32_t class_var_cache_name_length);
  [Internal Ineffective Changes]
    * Rename the opcode SPVM_OPCODE_C_ID_CALL_INSTANCE_METHOD_BY_SIGNATURE to SPVM_OPCODE_C_ID_CALL_INSTANCE_METHOD_BY_NAME.
    * Remove signature_id fields in spvm_runtime_class_var, spvm_runtime_field, spvm_runtime_method.
    * Add args_length field to spvm_call_method.h.
    * Rename width of spvm_runtime_type to stack_length.
    * Rename width of spvm_type to stack_length.
    * Rename SPVM_TYPE_get_width to SPVM_TYPE_get_stack_length.
    
0.9632 2022-08-01
  [Internal Ineffective Changes]
    * Add set_field_object_by_name_v2 native API.
0.9631 2022-08-01
  [Internal Ineffective Changes]
    * Add get_field_object_by_name_v2 native API.
0.9630 2022-07-30
  [Bug Fix]
    * Fix the bug that SPVM::new_object_array can't receive non-class object.
    * Fix the bug that Fn->sprintf %.3s work well.
  [New Features]
    * Add GET_CODE_POINT_ERROR_OVER_STRING_RANGE, GET_CODE_POINT_ERROR_INVALID_UTF8 to Fn class.
    * Add Fn->split_limit.
    * Error::System class becomes a default loaded module.
    * The class id of Error::System become always 2.
    * Add the constant values of the native API
      SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_SYSTEM_CLASS
      SPVM_NATIVE_C_CLASS_ID_ERROR_SYSTEM
    * Add SPVM::new_any_object_array function.
      
  [Performance fix]
    * Fn->join use StringBuffer internally.
    * Improve substr performance.
  [Changes]
    * Fn->index, Fn->index_len, Fn->rindex, Fn->rindex_len throw an exception when the arguments are invalid.
    * If the element of the strings of the argument of Fn->join is undef, "" is joined.
    * Fn->ord throws exceptions when the input is undefined or the length is less than 0.
    * Fn->pow, Fn->powi throws exceptions when the arguments are invalid.
    * Fn->join throws exceptions when the arguments are invalid.
    * Improve Fn->substr exception messages.
    * Fn->repeat allows 0 count.
    * Fn->index_len, Fn->contains, Fn->index can check empty string.
    * Improve Fn->to_int_with_base exception message.
    * Improve Fn->to_long_with_base exception message.
    * Fn->contains become the alias for the following code
      my $ret = Fn->index($string, $substring, 0) >= 0;
    * Excnahge API shows the stack trace when exceptions are thrown
  [Deprecation]
    * Fn->trim_ascii_space is renamed to Fn->trim. Fn->trim_ascii_space is deprecated.
    * Fn->get_next_code_point is renamed to Fn->get_code_point. Fn->get_next_code_point is deprecated.
    * Fn->look_next_code_point is renamed to Fn->look_code_point. Fn->look_next_code_point is deprecated.
    * Add Fn->RAND_MAX doc.
  [Document]
    * Improve Array class doc.
  [Document Fix]
    * Fix Fn->chr doc.
    * Fix Fn->contains doc.
    * Add Fn->is_array doc.
    * Fix the doc that the range of Array->memcpy_(byte|short|int|long|flaot|double|object_address|string_address) is wrong.
    * Fix the doc that the range of Array->copy_range_(byte|short|int|long|flaot|double) is wrong.
    * Fix the doc that the range of Array->memset_(byte|short|int|long|flaot|double|object|string) is wrong.
    * Remove Fn->srpintf doc. This remained wrongly.
    * Remove %U specifier doc. This ramained wrongly.
  [Incompatible Changes]
    * Fn->index_len throw exception.
      The offset + the length specified by the argument must be less than or equal to the length of the string
    * Fn->ord become the following alias
      
      my $offset = 0;
      my $code_point = Fn->get_code_point($string, \$offset);
    * Fn->shorten throw exceptions
      The string must be defined
      The length must be greater than or equal to 0
    * Fn->trim throw exceptions
      The string must be defined
    * Fn->chomp throws exceptions
    * Fn->chompr throws exceptions
    * Sort->sort_(byte|short|int|long|float|double|string|object) throw exceptions
      The comparator must be defined
  [Bug Fix]
    * Fix the bug that Fn->rindex_len, Fn->rindex don't work well.
    * Fix the bug Arrya->memmove_string_address calls Arrya->memmove_object. The correct code call Arrya->memmove_object_address.
0.9629 2022-07-26
  [New Features]
    * Add copy_object_address to Array class.
    * Add copy_range_object_address to Array class.
    * Add copy_range_string_address to Array class.
    * Add copy_string_address to Array class.
    * Add equals_object_address to Array class.
    * Add equals_string_address to Array class.
    * Add %p specifier to Format->sprintf method.
  [Document Fix]
    * Add the doc of clear method of Point class.
    * Add the doc of clear method of Point3D class.
    * Remove the doc of the methods of Fn class. These remains wrongly.
    * Remove the doc of memmove_byte, memmove_double, memmove_float, memmove_int, memmove_long, memmove_short, new_array_proto
      memset_byte, memset_double, memset_float, memset_int, memset_long, memset_short, memset_object, memcpy_short, memcpy_long
      memcpy_int, memcpy_float, memcpy_double, memcpy_byte, equals_array_string, equals_array_short, equals_array_object
      equals_array_long, equals_array_int, equals_array_float, equals_array_double, equals_array_byte, 
      dump_array_unsigned_short, dump_array_unsigned_int, dump_array_unsigned_byte, dump_array_string,
      dump_array_short,  dump_array_object, dump_array_unsigned_short, dump_array_long, dump_array_int,
      dump_array_float, dump_array_double, dump_array_byte, copy_array_string,
      copy_array_short, copy_array_range_string, copy_array_range_short, copy_array_range_object,
      copy_array_range_long, copy_array_range_int, copy_array_range_float, copy_array_range_double,
      copy_array_range_byte, copy_array_object, copy_array_long, copy_array_int, copy_array_float,
      copy_array_double, copy_array_byte in Fn class. This remained wrongly.
    * Remove the doc of memmove, in Array class.
    * Add the doc of Array->memmove_string, Array->memcpy_string.
    * Fix the document that equals_byte, equals_short, equals_int, equals_long, equals_float, equals_double, equals_object, equals_string
      throw exception.
    
  [New Document]
    * Add Fields section to Point class
    * Add Super Class section to Point3D class
    * Add Fields section to Point3D class
  [Changes]
    * Remove "SPVM/" from native file name.
    * Array->equals_object can recieve undef equality checker, and check address equality.
    * Add exception logic to memset_byte, memset_double, memset_float, memset_int, memset_long,
      memset_object, memset_short, memset_string of Array class.
    * Add exception logic to memcpy_object_address of Array class.
  [Incompatible Changes]
    * Change the following method definition of Array class. Sorry. This is my simple definition mistake.
      [Before]
      static method copy_range_object : object[] ($array : object[], $offset : int, $length : int) {
      [After]
      static method copy_range_object : object[] ($array : object[], $offset : int, $length : int, $cloner : Cloner);
      
      The original behaivior can be used by copy_range_object_address.
    * copy_range_string copies the value of the string, not address. This is my simple implement mistake.
      The original behaivior can be used by copy_range_string_address.
    * Remove Fn->memcpy_object, Fn->memmove_object. This remained wrongly.
    * Rename Remove Fn->memcpy_object, Fn->memmove_object. This remained wrongly.
    * Remove Array->dump_byte, Array->dump_short, Array->dump_int, Array->dump_long, Array->dump_float, Array->dump_double,
      Array->dump_string Array->dump_object. Use the dump operator instead.
    * The output of Array->dump_unsigned_byte, Array->dump_unsigned_short, Array->dump_unsigned_int, Array->dump_unsigned_long
      is same as the dump operator except for the unsigned elements.
  [Deprecation]
    * Array->memcpy_object is deprecated. Use memcpy_object_address instead. This method will be removed at 0.9630.
    * Array->memcpy_string is deprecated. Use memcpy_string_address instead. This method will be removed at 0.9630.
    * Array->memmove_object is deprecated. Use memmove_object_address instead. This method will be removed at 0.9630.
    * Array->memmove_string is deprecated. Use memmove_string_address instead. This method will be removed at 0.9630.
    * Rename EqualityChecker::SameObject class to EqualityChecker::Address
0.9628 2022-07-25
  [New Features]
    * Add replace method to ByteList, ShortList, IntList, LongList, FloatList, DoubleList, StringList, List.
    * Add memcpy_string, memmove_string to Array class.
    * Add memset_string to Array class.
    * Add equals_object_address method to Array class.
  [Changes]
    * The headding of module file that is generated by spvmdist command is changed.
      [Before]
      =head1 Field Methods
      [After]
      =head1 Fields
    * Change the following ByteList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Change the following ShortList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Change the following IntList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Change the following LongList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Change the following FloatList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Change the following DoubleList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Change the following List field definitions.
      [Before]
      has values : object[];
      [After]
      has values : ro string[];
    * Change the following StringList field definitions.
      [Before]
      has values : byte[];
      [After]
      has values : ro byte[];
    * Improve Array->memmove performance
    * Improve ByteList exception messages.
    * Improve ShortList exception messages.
    * Improve IntList exception messages.
    * Improve LongList exception messages.
    * Improve FloatList exception messages.
    * Improve DoubleList exception messages.
    * Improve StringList exception messages.
    * Improve List exception messages.
    * Improve StringBuffer exception messages.
    * Improve List exception messages.
    * Improve the exception messages of Array class.
    * memmove_object gets to throw an exception when the arguments is invalid.
    * memcpy_object gets to throw an exception when the arguments is invalid.
    
  [Bug Fix]
    * Fix the StringList->remove bug.
  [Document]
    * Add Fields doc to Byte, Short, Int, Long, Float, Double, ByteList, ShortList, IntList, LongList, FloatList, DoubleList, List, StringBuffer class.
    * Improve ByteList, ShortList, IntList, LongList, FloatList, DoubleList, StringList, List, StringBuffer, Array class doc.
  [NON BACKWORD COMPATIBLE CHANGES]
    * Remove undocumented and untested grep method from StringList
    
0.962701 2022-07-25
  [Test Fix]
    * Fix the test that strerror test failed when EAGAIN is not defined.
0.9627 2022-07-22
  [New Feature]
    * Add new_string_array native API.
0.9626 2022-07-22
  [New Features]
    * Add the following native API
      int32_t (*get_class_id_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, int32_t* error, const char* file, int32_t line);
      const char* (*strerror)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t errno_value, int32_t length);
  [Changes]
    * Improve destructor compile error message.
0.9625 2022-07-20
  [New Features]
    * Add Error::System class.
0.9624 2022-07-19
  [New Features]
    * Add the following replace method to StringBuffer class.
      method replace : void ($offset : int, $length : int, $replace : string)
0.9623 2022-07-15
  [New Features]
    * Add CommandInfo class.
    * Add Native API "SPVM_NATIVE_C_BASIC_TYPE_ID_COMMAND_INFO_CLASS" constant value.
    * Add the following native APIs.
      int32_t (*set_command_info_program_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* obj_program_name);
      int32_t (*set_command_info_argv)(SPVM_ENV* env, SPVM_VALUE* stack, void* obj_argv);
  [Changes]
    * Change the test option of WriteMakefile of ExtUtils::MakeMaker that is generated by spvmdist command.
      [Before]
        test => {TESTS => 't/*.t'},
      [After]
        test => {TESTS => 't/*.t t/*/*.t t/*/*/*.t'},
    * Add "NORECURS => 1" to the option of WriteMakefile of ExtUtils::MakeMaker that is generated by spvmdist command.
    * Add "TEST_REQUIRES => {}" to the option of WriteMakefile of ExtUtils::MakeMaker that is generated by spvmdist command.
    * Add "META_MERGE => {no_index => {directory => [],}}," to the option of WriteMakefile of ExtUtils::MakeMaker that is generated by spvmdist command.
  [Bug Fix]
    * Fix the bug that tyep type of the program name of the command line argument is "byte". This is fixed to "string".
    * Fix the bug that tyep type of the argv of the command line argument is "byte[]". This is fixed to "string[]".
    * Fix the bug that when any SPVM moudle are not yet loaded (only use SPVM(); or use SPVM;) and call SPVM exchange API, segfault occurs.
0.9622 2022-07-14
  [New Features]
    * Add the following native APIs.
      void* (*new_memory_env)(SPVM_ENV* env, size_t byte_size);
      void (*free_memory_env)(SPVM_ENV* env, void* block);
      int32_t (*get_memory_blocks_count_env)(SPVM_ENV* env);
      void* (*new_memory_stack)(SPVM_ENV* env, SPVM_VALUE* stack, size_t byte_size);
      void (*free_memory_stack)(SPVM_ENV* env, SPVM_VALUE* stack, void* block);
      int32_t (*get_memory_blocks_count_stack)(SPVM_ENV* env, SPVM_VALUE* stack);
  [Changes]
    * The file name "t/basic.t" that is generated by spvmdist command is renamed to "t/use_spvm_class.t".
    * The .gitignore file that is generated by spvmdist command is changed to the following.
      [Before]
      blib/*
      Makefile
      Makefile.old
      MYMETA.yml
      MYMETA.json
      pm_to_blib
      .spvm_build
      t/.spvm_build
      core.*
      core
      SPVM-*
      *.bak
      *.BAK
      *.tmp
      
      [After]
      blib/*
      Makefile
      Makefile.old
      MYMETA.yml
      MYMETA.json
      pm_to_blib
      .spvm_build
      t/.spvm_build
      core.*
      core
      SPVM-*
      *.bak
      *.BAK
      *.tmp
      *.o
      *.bs
    * spvmdist checks the class name is specified and doesn't contains "-".
    * The count of created objects are managed by the stack of the environment.
  [Document Bug Fix]
    * Remove the description that "Module can contain multiple Classes". This was wrong.
    * The type of second argument of native API alloc_memory_block_zero is size_t. int64_t was wrong.
0.9621 2022-07-13
  [New Features]
    * Add SPVM::Builder::LinkInfo create_link_command instance method.
    * Add SPVM::Builder::LinkInfo output_type field method.
    * Add SPVM::Builder::LinkInfo ld_optimize field method.
    * Add SPVM::Builder::LinkInfo dynamic_lib_ldflags field method.
    * Add SPVM::Builder::LinkInfo create_merged_ldflags method.
    * Add SPVM::Builder::CompileInfo class.
    * Add compile_info to SPVM::Builder::ObjectFileInfo.
    * Add before_compile to SPVM::Builder::Config.
    * Add global_before_compile to SPVM::Builder::Config::Exe.
  [Changes]
    * Improve MANIFES.SKIP that is generated by spvmdit.
      [Before]
      ^blib/
      ^Makefile\$
      ^Makefile\.old\$
      ^MYMETA.yml\$
      ^MYMETA.json\$
      ^pm_to_blib\$
      ^\.spvm_build/
      ^t/\.spvm_build/
      ^SPVM-
      ^core\.
      ^core\$
      \.bak\$
      \.tmp\$
      \.BAK\$
      ^\.git/
      
      [After]
      (^|\/)blib/
      (^|\/)Makefile$
      (^|\/)Makefile.old$
      (^|\/)MYMETA.yml$
      (^|\/)MYMETA.json$
      (^|\/)pm_to_blib$
      (^|\/).spvm_build/
      (^|\/)t/.spvm_build/
      (^|\/)SPVM-
      (^|\/)core\.
      (^|\/)core$
      (^|\/)\.git/
      \.bak$
      \.tmp$
      \.BAK$
      \.o$
      \.bs$
  [Imcompative Changes]
    * (This is undocumented feature)The return value of SPVM::LinkInfo to_string
      is changed from the output file to the link command.
    * (This feature is not work well from now)Remove non-worked global_cc_each,
      global_ccflags_each, global_optimize_each from SPVM::Builder::CC.
    * Remove cc_each, ccflags_each, optimize_each.
    * Remove all field methods from SPVM::Builder::ObjectFileInfo.
  [Document]
    * Add the document of SPVM::Builder::LinkInfo to_string method.
    * Add the doucment of Error class.
    * Remove non-worked global_cc_each, global_ccflags_each, global_optimize_each doc.
0.9620 2022-07-09
  [New Featres]
    * Add Error class that class id is 1.
    * Add a constant value SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_CLASS in native API.
    * Add a constant value SPVM_NATIVE_C_CLASS_ID_ERROR in native API.
  [Changes]
    * Add [Changes] hedding to the Changes file that is generated by spvmdist.
    * Non-native method must have its block.
  [Imcompative Changes]
    * Rename the following constant values of native API.
      [Before]
      SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE_OBJECT
      SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT_OBJECT
      SPVM_NATIVE_C_BASIC_TYPE_ID_INT_OBJECT
      SPVM_NATIVE_C_BASIC_TYPE_ID_LONG_OBJECT
      SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT_OBJECT
      SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE_OBJECT
      SPVM_NATIVE_C_BASIC_TYPE_ID_BOOL_OBJECT
      [After]
      SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE_CLASS
      SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT_CLASS
      SPVM_NATIVE_C_BASIC_TYPE_ID_INT_CLASS
      SPVM_NATIVE_C_BASIC_TYPE_ID_LONG_CLASS
      SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT_CLASS
      SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE_CLASS
      SPVM_NATIVE_C_BASIC_TYPE_ID_BOOL_CLASS
    * The numeric argument of the method call using exchange API must be a defined numeric or floating-point compatible value.
      Otherwise an exception is thrown.
  [Bug Fix]
    * Fix the bug that the linker output twice to stdout and stderr. Suppress stdout.
  [Incompatible Bug Fix]
    * Fix a regression bug that SPVM_NATIVE_C_BASIC_TYPE_ID_BOO_OBJECT is chagned
      to SPVM_NATIVE_C_BASIC_TYPE_ID_TYPE_CONVERSION_CONDITINAL_OBJECT wrongly.
0.9619 2022-07-07
  [New Featres]
    * Add --user-name option to spvmdist command.
    * Add --user-email option to spvmdist command.
    * Add new_c11 method to SPVM::Builder::Config
    * Add new_gnu11 method to SPVM::Builder::Config
    * Add new_cpp14 method to SPVM::Builder::Config
    * Add new_cpp17 method to SPVM::Builder::Config
  [Changes]
    * spvm_dist command add date information to the generated documents.
    * Need Time::Piece 1.12
    * Removed --output_dir option of spvmdist command from document. This was removed in past.
  [Document Fix]
    * Add new_gnu99 method to SPVM::Builder::Config
    
0.9618 2022-07-05
  [CHANGES]
    * All output of compiler and linker print to stderr.
0.9617 2022-07-05
  [New Featres]
    * Add spvm_warn to native API
  [CHANGES]
    * "use ModuleName" is added to the test case class that is generated by spvmdist command 
  [BUG FIX]
    * Fix the bug that quiet decting order bug.
  [NON BACKWORD COMPATIBLE CHANGES]
    * The default value of quiet and force of SPVM::Builder::Config become undef.
      undef means don't determin quiet and force in SPVM::Builder::Config.
0.9616 2022-07-01
  [New Featres]
    * Add to_bin method to SPVM::BlessedObject::String.
  [CHANGES]
    * Removed "Bug Report" and "Support" section from the output of spvmdist command.
  [NON BACKWORD COMPATIBLE CHANGES]
    * If a Perl scalar value is passed to SPVM string type, sv_utf8_encode don't be performed
      because this is needed to pass 8bit character(128-255) such as "\xff" to SPVM as it is.
0.9615 2022-06-30
  [CHANGES]
    * Improve the pod that spvmdist generates.
  [BUG FIX]
    * Fix the bug that SPVM::Builder::Config doesn't use SPVM::Builder::Resource.
  [NON BACKWORD COMPATIBLE CHANGES]
    * Remove unused and undocumented protected descriptor.
0.9614 2022-06-29
  [CHANGES]
  * The parent class must be a class type and non-pointer type.
  * The name of the parant class must be different from the name of the class.
  * The all super classes must be different from its own class. Recursive inheritance isn't allowed
  * Remove MANIFEST from .gitignore that is generated by spvmdist.
  * lib_dirs of SPVM::Builder::Config is always added to link command.
  * Add SPVM::Builder::LibInfo module.
  * libs, add_libs, add_static_libs of SPVM::Builder::Config can receive SPVM::Builder::LibInfo object.
  * Add lib_infos to SPVM::Builder::LinkInfo.
  [NON BACKWORD COMPATIBLE CHANGES]
  * Remove non-documented lib_link_abs from SPVM::Builder::Config.
  * native library is linked as relative path, not absolute pass by default.
  * Remove add_dynamic_libs from SPVM::Builder::Config.
  * Remove type option of the hash reference of add_libs method of SPVM::Builder::Config.
  * libs, add_libs, add_static_libs of SPVM::Builder::Config can't receive a hash reference.
  * object_infos of SPVM::Builder::LinkInfo don't contains library files.
0.9613 2022-06-27
  [CHANGE]
  * Fix descriptor error message.
  * Fields alignment size become the bigger byte size of sizeof(void*) and sizeof(int64_t).
  * Fields alignment rule become the same as C language.
  * Improve compilation error messages.
  * Add clear method to Point class.
  * Add Point3D class.
  * Add the inheritance feature.
    Add extends keyword.
    Add SUPER:: method call.
  [BUG FIX]
  * Fix the bug that the name of method call doesn't distinguish class methods and instance methods.
  [NON BACKWORD COMPATIBLE CHANGES]
  * Change the definitions of the following native API.
    [Beofre]
    int32_t (*check_runtime_assignability)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t cast_basic_type_id, int32_t cast_type_dimension, void* object);
    [After]
    int32_t (*isa)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t cast_basic_type_id, int32_t cast_type_dimension);
 
  * Change the definitions of the following native API.
    [Beofre]
    int32_t (*check_runtime_assignability_array_element)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, void* element);
    [After]
    int32_t (*elem_isa)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, void* element);

0.9612 2022-06-23
  [CHANGE]
  * set_error_code throw an exception when the value is not more than or equal to 1.
  * Add error operator to check the code of the excetpion
0.961101 2022-06-22
  [NON BACKWORD COMPATIBLE CHANGES]
  * Fixed rest bugs that Remove Time->timegm and Time->timelocal because of Windows/MinGW compatibility.
0.9611 2022-06-22
  [NON BACKWORD COMPATIBLE CHANGES]
  * Remove Time->timegm and Time->timelocal because of Windows/MinGW compatibility.
    Use CPAN's SPVM::Time::Local module instead.
0.9610 2022-06-22
  [CHANGE]
  * Add error_code operator
  * Add set_error_code operator
  * exception become stack variable from env variable.
  * native mortal stack become stack variable from env variable.
  [NON BACKWORD COMPATIBLE CHANGES]
  * Change the definitions of the following native APIs
    [Before]
    int32_t (*call_class_method)(SPVM_ENV* env, int32_t method_id, SPVM_VALUE* args);
    int32_t (*call_class_method_by_name)(SPVM_ENV* env, const char* class_name, const char* method_name, const char* signature, SPVM_VALUE* stack_unused, const char* file, int32_t line);
    int32_t (*call_instance_method)(SPVM_ENV* env, int32_t method_id, SPVM_VALUE* args);
    int32_t (*call_instance_method_by_name)(SPVM_ENV* env, void* object, const char* method_name, const char* signature, SPVM_VALUE* stack_unused, const char* file, int32_t line);
    int32_t (*call_spvm_method)(SPVM_ENV* env, int32_t method_id, SPVM_VALUE* args);
    
    [After]
    int32_t (*call_class_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id);
    int32_t (*call_class_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* method_name, const char* signature, const char* file, int32_t line);
    int32_t (*call_instance_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id);
    int32_t (*call_instance_method_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* method_name, const char* signature, const char* file, int32_t line);
    int32_t (*call_spvm_method)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t method_id);
  * Change the definitions of the following native API
    [Before]
    void (*call_init_blocks)(SPVM_ENV* env);
    
    [After]
    void (*call_init_blocks)(SPVM_ENV* env, SPVM_VALUE* stack);
  * Native API new_env don't call call_init_blocks.
  * Native API free_env and free_env_prepared don't call cleanup_global_vars.
  * The following depracated methods are removed.
    Fn->copy_array_byte is removed. Use Array->copy_byte instead
    Fn->copy_array_double is removed. Use Array->copy_double instead
    Fn->copy_array_float is removed. Use Array->copy_float instead
    Fn->copy_array_int is removed. Use Array->copy_int instead
    Fn->copy_array_long is removed. Use Array->copy_long instead
    Fn->copy_array_object is removed. Use Array->copy_object instead
    Fn->copy_array_range_byte is removed. Use Array->copy_range_byte instead
    Fn->copy_array_range_double is removed. Use Array->copy_range_double instead
    Fn->copy_array_range_float is removed. Use Array->copy_range_float instead
    Fn->copy_array_range_int is removed. Use Array->copy_range_int instead
    Fn->copy_array_range_long is removed. Use Array->copy_range_long instead
    Fn->copy_array_range_object is removed. Use Array->copy_range_object instead
    Fn->copy_array_range_short is removed. Use Array->copy_range_short instead
    Fn->copy_array_range_string is removed. Use Array->copy_range_string instead
    Fn->copy_array_string is removed. Use Array->copy_tring instead
    Fn->dump_array_byte is removed. Use Array->dump_byte instead
    Fn->dump_array_double is removed. Use Array->dump_double instead
    Fn->dump_array_float is removed. Use Array->dump_float instead
    Fn->dump_array_int is removed. Use Array->dump_int instead
    Fn->dump_array_long is removed. Use Array->dump_long instead
    Fn->dump_array_object is removed. Use Array->dump_object instead
    Fn->dump_array_short is removed. Use Array->dump_short instead
    Fn->dump_array_string is removed. Use Array->dump_string instead
    Fn->dump_array_unsigned_byte is removed. Use Array->dump_unsigned_byte instead
    Fn->dump_array_unsigned_int is removed. Use Array->dump_unsigned_int instead
    Fn->dump_array_unsigned_long is removed. Use Array->dump_unsigned_long instead
    Fn->dump_array_unsigned_short is removed. Use Array->dump_unsigned_short instead
    Fn->equals_array_byte is removed. Use Array->equals_byte instead
    Fn->equals_array_double is removed. Use Array->equals_double instead
    Fn->equals_array_float is removed. Use Array->equals_float instead
    Fn->equals_array_int is removed. Use Array->equals_int instead
    Fn->equals_array_long is removed. Use Array->equals_long instead
    Fn->equals_array_object is removed. Use Array->equals_object instead
    Fn->equals_array_short is removed. Use Array->equals_short instead
    Fn->equals_array_string is removed. Use Array->equals_string instead
    Fn->memcpy_byte is removed. Use Array->memcpy_byte instead
    Fn->memcpy_double is removed. Use Array->memcpy_double instead
    Fn->memcpy_float is removed. Use Array->memcpy_float instead
    Fn->memcpy_int is removed. Use Array->memcpy_int instead
    Fn->memcpy_long is removed. Use Array->memcpy_long instead
    Fn->memcpy_short is removed. Use Array->memcpy_short instead
    Fn->memmove_byte is removed. Use Array->memmove_byte instead
    Fn->memmove_double is removed. Use Array->memmove_double instead
    Fn->memmove_float is removed. Use Array->memmove_float instead
    Fn->memmove_int is removed. Use Array->memmove_int instead
    Fn->memmove_long is removed. Use Array->memmove_long instead
    Fn->memmove_short is removed. Use Array->memmove_short instead
    Fn->memset_byte is removed. Use Array->memset_byte instead
    Fn->memset_double is removed. Use Array->memset_double instead
    Fn->memset_float is removed. Use Array->memset_float instead
    Fn->memset_int is removed. Use Array->memset_int instead
    Fn->memset_long is removed. Use Array->memset_long instead
    Fn->memset_object is removed. Use Array->memset_object instead
    Fn->memset_short is removed. Use Array->memset_short instead
    Fn->new_array_proto is removed. Use Array->new_proto instead
    Fn->sprintf is removed. Use Format->sprintf instead
  * Change the definitions of the following native APIs

    [Before]
    int32_t (*check_runtime_assignability)(SPVM_ENV* env, int32_t cast_basic_type_id, int32_t cast_type_dimension, void* object);
    int32_t (*check_runtime_assignability_array_element)(SPVM_ENV* env, void* array, void* element);
    void* (*new_object_raw)(SPVM_ENV* env, int32_t basic_type_id);
    void* (*new_object)(SPVM_ENV* env, int32_t basic_type_id);
    void* (*new_byte_array_raw)(SPVM_ENV* env, int32_t length);
    void* (*new_byte_array)(SPVM_ENV* env, int32_t length);
    void* (*new_short_array_raw)(SPVM_ENV* env, int32_t length);
    void* (*new_short_array)(SPVM_ENV* env, int32_t length);
    void* (*new_int_array_raw)(SPVM_ENV* env, int32_t length);
    void* (*new_int_array)(SPVM_ENV* env, int32_t length);
    void* (*new_long_array_raw)(SPVM_ENV* env, int32_t length);
    void* (*new_long_array)(SPVM_ENV* env, int32_t length);
    void* (*new_float_array_raw)(SPVM_ENV* env, int32_t length);
    void* (*new_float_array)(SPVM_ENV* env, int32_t length);
    void* (*new_double_array_raw)(SPVM_ENV* env, int32_t length);
    void* (*new_double_array)(SPVM_ENV* env, int32_t length);
    void* (*new_object_array_raw)(SPVM_ENV* env, int32_t basic_type_id, int32_t length);
    void* (*new_object_array)(SPVM_ENV* env, int32_t basic_type_id, int32_t length);
    void* (*new_muldim_array_raw)(SPVM_ENV* env, int32_t basic_type_id, int32_t element_dimension, int32_t length);
    void* (*new_muldim_array)(SPVM_ENV* env, int32_t basic_type_id, int32_t element_dimension, int32_t length);
    void* (*new_mulnum_array_raw)(SPVM_ENV* env, int32_t basic_type_id, int32_t length);
    void* (*new_mulnum_array)(SPVM_ENV* env, int32_t basic_type_id, int32_t length);
    void* (*new_string_nolen_raw)(SPVM_ENV* env, const char* bytes);
    void* (*new_string_nolen)(SPVM_ENV* env, const char* bytes);
    void* (*new_string_raw)(SPVM_ENV* env, const char* bytes, int32_t length);
    void* (*new_string)(SPVM_ENV* env, const char* bytes, int32_t length);
    void* (*new_pointer_raw)(SPVM_ENV* env, int32_t basic_type_id, void* pointer);
    void* (*new_pointer)(SPVM_ENV* env, int32_t basic_type_id, void* pointer);
    void* (*concat_raw)(SPVM_ENV* env, void* string1, void* string2);
    void* (*concat)(SPVM_ENV* env, void* string1, void* string2);
    void* (*new_stack_trace_raw)(SPVM_ENV* env, void* exception, int32_t method_id, int32_t line);
    void* (*new_stack_trace)(SPVM_ENV* env, void* exception, int32_t method_id, int32_t line);
    int32_t (*length)(SPVM_ENV* env, void* array);
    int8_t* (*get_elems_byte)(SPVM_ENV* env, void* array);
    int16_t* (*get_elems_short)(SPVM_ENV* env, void* array);
    int32_t* (*get_elems_int)(SPVM_ENV* env, void* array);
    int64_t* (*get_elems_long)(SPVM_ENV* env, void* array);
    float* (*get_elems_float)(SPVM_ENV* env, void* array);
    double* (*get_elems_double)(SPVM_ENV* env, void* array);
    void* (*get_elem_object)(SPVM_ENV* env, void* array, int32_t index);
    void (*set_elem_object)(SPVM_ENV* env, void* array, int32_t index, void* value);
    int8_t (*get_field_byte)(SPVM_ENV* env, void* object, int32_t field_id);
    int16_t (*get_field_short)(SPVM_ENV* env, void* object, int32_t field_id);
    int32_t (*get_field_int)(SPVM_ENV* env, void* object, int32_t field_id);
    int64_t (*get_field_long)(SPVM_ENV* env, void* object, int32_t field_id);
    float (*get_field_float)(SPVM_ENV* env, void* object, int32_t field_id);
    double (*get_field_double)(SPVM_ENV* env, void* object, int32_t field_id);
    void* (*get_field_object)(SPVM_ENV* env, void* object, int32_t field_id);
    void (*set_field_byte)(SPVM_ENV* env, void* object, int32_t field_id, int8_t value);
    void (*set_field_short)(SPVM_ENV* env, void* object, int32_t field_id, int16_t value);
    void (*set_field_int)(SPVM_ENV* env, void* object, int32_t field_id, int32_t value);
    void (*set_field_long)(SPVM_ENV* env, void* object, int32_t field_id, int64_t value);
    void (*set_field_float)(SPVM_ENV* env, void* object, int32_t field_id, float value);
    void (*set_field_double)(SPVM_ENV* env, void* object, int32_t field_id, double value);
    void (*set_field_object)(SPVM_ENV* env, void* object, int32_t field_id, void* value);
    int8_t (*get_class_var_byte)(SPVM_ENV* env, int32_t pkgvar_id);
    int16_t (*get_class_var_short)(SPVM_ENV* env, int32_t pkgvar_id);
    int32_t (*get_class_var_int)(SPVM_ENV* env, int32_t pkgvar_id);
    int64_t (*get_class_var_long)(SPVM_ENV* env, int32_t pkgvar_id);
    float (*get_class_var_float)(SPVM_ENV* env, int32_t pkgvar_id);
    double (*get_class_var_double)(SPVM_ENV* env, int32_t pkgvar_id);
    void* (*get_class_var_object)(SPVM_ENV* env, int32_t pkgvar_id);
    void (*set_class_var_byte)(SPVM_ENV* env, int32_t pkgvar_id, int8_t value);
    void (*set_class_var_short)(SPVM_ENV* env, int32_t pkgvar_id, int16_t value);
    void (*set_class_var_int)(SPVM_ENV* env, int32_t pkgvar_id, int32_t value);
    void (*set_class_var_long)(SPVM_ENV* env, int32_t pkgvar_id, int64_t value);
    void (*set_class_var_float)(SPVM_ENV* env, int32_t pkgvar_id, float value);
    void (*set_class_var_double)(SPVM_ENV* env, int32_t pkgvar_id, double value);
    void (*set_class_var_object)(SPVM_ENV* env, int32_t pkgvar_id, void* value);
    void* (*get_pointer)(SPVM_ENV* env, void* pointer_object);
    void (*set_pointer)(SPVM_ENV* env, void* pointer_object, void* pointer);
    void* (*get_exception)(SPVM_ENV* env);
    int32_t (*set_exception)(SPVM_ENV* env, void* exception);
    int32_t (*get_ref_count)(SPVM_ENV* env, void* object);
    void (*inc_ref_count)(SPVM_ENV* env, void* object);
    void (*dec_ref_count)(SPVM_ENV* env, void* object);
    int32_t (*enter_scope)(SPVM_ENV* env);
    int32_t (*push_mortal)(SPVM_ENV* env, void* object);
    void (*leave_scope)(SPVM_ENV* env, int32_t scope_id);
    int32_t (*remove_mortal)(SPVM_ENV* env, int32_t scope_id, void* remove_object);
    int32_t (*is_type)(SPVM_ENV* env, void* object, int32_t basic_type_id, int32_t type_dimension);
    int32_t (*is_object_array)(SPVM_ENV* env, void* object);
    int32_t (*get_object_basic_type_id)(SPVM_ENV* env, void* object);
    int32_t (*get_object_type_dimension)(SPVM_ENV* env, void* object);
    int32_t (*weaken)(SPVM_ENV* env, void** object_address);
    int32_t (*isweak)(SPVM_ENV* env, void** object);
    void (*unweaken)(SPVM_ENV* env, void** object_address);
    void* (*get_type_name_raw)(SPVM_ENV* env, void* object);
    void* (*get_type_name)(SPVM_ENV* env, void* object);
    const char* (*get_chars)(SPVM_ENV* env, void* string_object);
    int32_t (*die)(SPVM_ENV* env, const char* message, ...);
    void* (*new_object_by_name)(SPVM_ENV* env, const char* class_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*new_pointer_by_name)(SPVM_ENV* env, const char* class_name, void* pointer, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_byte_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int8_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_short_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int16_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_int_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_long_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int64_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_float_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, float value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_double_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, double value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_object_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, const char* signature, void* value, int32_t* exception_flag, const char* file, int32_t line);
    int8_t (*get_field_byte_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    int16_t (*get_field_short_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    int32_t (*get_field_int_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    int64_t (*get_field_long_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    float (*get_field_float_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    double (*get_field_double_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*get_field_object_by_name)(SPVM_ENV* env, void* object, const char* class_name, const char* field_name, const char* signature, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_byte_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int8_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_short_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int16_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_int_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_long_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int64_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_float_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, float value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_double_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, double value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_object_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, const char* signature, void* value, int32_t* exception_flag, const char* file, int32_t line);
    int8_t (*get_class_var_byte_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    int16_t (*get_class_var_short_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    int32_t (*get_class_var_int_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    int64_t (*get_class_var_long_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    float (*get_class_var_float_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    double (*get_class_var_double_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*get_class_var_object_by_name)(SPVM_ENV* env, const char* class_name, const char* class_var_name, const char* signature, int32_t* exception_flag, const char* file, int32_t line);
    const char* (*get_field_string_chars_by_name)(SPVM_ENV* env, void* obj, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*dump_raw)(SPVM_ENV* env, void* object);
    void* (*dump)(SPVM_ENV* env, void* object);
    int32_t (*get_bool_object_value)(SPVM_ENV* env, void* bool_object);
    void (*cleanup_global_vars)(SPVM_ENV* env);
    void (*make_read_only)(SPVM_ENV* env, void* string);
    int32_t (*is_read_only)(SPVM_ENV* env, void* string);
    int32_t (*is_array)(SPVM_ENV* env, void* object);
    int32_t (*is_string)(SPVM_ENV* env, void* object);
    int32_t (*is_numeric_array)(SPVM_ENV* env, void* object);
    int32_t (*is_mulnum_array)(SPVM_ENV* env, void* object);
    int32_t (*get_elem_byte_size)(SPVM_ENV* env, void* array);
    void* (*new_array_proto_raw)(SPVM_ENV* env, void* array, int32_t length);
    void* (*new_array_proto)(SPVM_ENV* env, void* array, int32_t length);
    void* (*copy_raw)(SPVM_ENV* env, void* object);
    void* (*copy)(SPVM_ENV* env, void* object);
    void (*shorten)(SPVM_ENV* env, void* string, int32_t new_length);
    int32_t (*has_interface)(SPVM_ENV* env, void* object, int32_t interface_basic_type_id);
    void (*print)(SPVM_ENV* env, void* string);
    void (*print_stderr)(SPVM_ENV* env, void* string);

    [After]
    void* (*get_type_name_raw)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void* (*get_type_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*check_runtime_assignability)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t cast_basic_type_id, int32_t cast_type_dimension, void* object);
    int32_t (*check_runtime_assignability_array_element)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, void* element);
    void* (*new_object_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id);
    void* (*new_object)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id);
    void* (*new_byte_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_byte_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_short_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_short_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_int_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_int_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_long_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_long_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_float_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_float_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_double_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_double_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t length);
    void* (*new_object_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, int32_t length);
    void* (*new_object_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, int32_t length);
    void* (*new_muldim_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, int32_t element_dimension, int32_t length);
    void* (*new_muldim_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, int32_t element_dimension, int32_t length);
    void* (*new_mulnum_array_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, int32_t length);
    void* (*new_mulnum_array)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, int32_t length);
    void* (*new_string_nolen_raw)(SPVM_ENV* env, SPVM_VALUE* stack, const char* bytes);
    void* (*new_string_nolen)(SPVM_ENV* env, SPVM_VALUE* stack, const char* bytes);
    void* (*new_string_raw)(SPVM_ENV* env, SPVM_VALUE* stack, const char* bytes, int32_t length);
    void* (*new_string)(SPVM_ENV* env, SPVM_VALUE* stack, const char* bytes, int32_t length);
    void* (*new_pointer_raw)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, void* pointer);
    void* (*new_pointer)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t basic_type_id, void* pointer);
    void* (*concat_raw)(SPVM_ENV* env, SPVM_VALUE* stack, void* string1, void* string2);
    void* (*concat)(SPVM_ENV* env, SPVM_VALUE* stack, void* string1, void* string2);
    void* (*new_stack_trace_raw)(SPVM_ENV* env, SPVM_VALUE* stack, void* exception, int32_t method_id, int32_t line);
    void* (*new_stack_trace)(SPVM_ENV* env, SPVM_VALUE* stack, void* exception, int32_t method_id, int32_t line);
    int32_t (*length)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    int8_t* (*get_elems_byte)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    int16_t* (*get_elems_short)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    int32_t* (*get_elems_int)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    int64_t* (*get_elems_long)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    float* (*get_elems_float)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    double* (*get_elems_double)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    void* (*get_elem_object)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index);
    void (*set_elem_object)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t index, void* value);
    int8_t (*get_field_byte)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    int16_t (*get_field_short)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    int32_t (*get_field_int)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    int64_t (*get_field_long)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    float (*get_field_float)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    double (*get_field_double)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    void* (*get_field_object)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id);
    void (*set_field_byte)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, int8_t value);
    void (*set_field_short)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, int16_t value);
    void (*set_field_int)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, int32_t value);
    void (*set_field_long)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, int64_t value);
    void (*set_field_float)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, float value);
    void (*set_field_double)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, double value);
    void (*set_field_object)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t field_id, void* value);
    int8_t (*get_class_var_byte)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    int16_t (*get_class_var_short)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    int32_t (*get_class_var_int)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    int64_t (*get_class_var_long)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    float (*get_class_var_float)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    double (*get_class_var_double)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    void* (*get_class_var_object)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id);
    void (*set_class_var_byte)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, int8_t value);
    void (*set_class_var_short)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, int16_t value);
    void (*set_class_var_int)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, int32_t value);
    void (*set_class_var_long)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, int64_t value);
    void (*set_class_var_float)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, float value);
    void (*set_class_var_double)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, double value);
    void (*set_class_var_object)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t pkgvar_id, void* value);
    void* (*get_pointer)(SPVM_ENV* env, SPVM_VALUE* stack, void* pointer_object);
    void (*set_pointer)(SPVM_ENV* env, SPVM_VALUE* stack, void* pointer_object, void* pointer);
    void* (*get_exception)(SPVM_ENV* env, SPVM_VALUE* stack);
    int32_t (*set_exception)(SPVM_ENV* env, SPVM_VALUE* stack, void* exception);
    int32_t (*get_ref_count)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void (*inc_ref_count)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void (*dec_ref_count)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*enter_scope)(SPVM_ENV* env, SPVM_VALUE* stack);
    int32_t (*push_mortal)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void (*leave_scope)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t scope_id);
    int32_t (*remove_mortal)(SPVM_ENV* env, SPVM_VALUE* stack, int32_t scope_id, void* remove_object);
    int32_t (*is_type)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t basic_type_id, int32_t type_dimension);
    int32_t (*is_object_array)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*get_object_basic_type_id)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*get_object_type_dimension)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*weaken)(SPVM_ENV* env, SPVM_VALUE* stack, void** object_address);
    int32_t (*isweak)(SPVM_ENV* env, SPVM_VALUE* stack, void** object);
    void (*unweaken)(SPVM_ENV* env, SPVM_VALUE* stack, void** object_address);
    const char* (*get_chars)(SPVM_ENV* env, SPVM_VALUE* stack, void* string_object);
    int32_t (*die)(SPVM_ENV* env, SPVM_VALUE* stack, const char* message, ...);
    void* (*new_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*new_pointer_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, void* pointer, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_byte_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int8_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_short_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int16_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_int_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_long_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int64_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_float_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, float value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_double_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, double value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_field_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, const char* signature, void* value, int32_t* exception_flag, const char* file, int32_t line);
    int8_t (*get_field_byte_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    int16_t (*get_field_short_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    int32_t (*get_field_int_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    int64_t (*get_field_long_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    float (*get_field_float_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    double (*get_field_double_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*get_field_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, const char* class_name, const char* field_name, const char* signature, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_byte_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int8_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_short_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int16_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_int_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_long_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int64_t value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_float_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, float value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_double_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, double value, int32_t* exception_flag, const char* file, int32_t line);
    void (*set_class_var_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, const char* signature, void* value, int32_t* exception_flag, const char* file, int32_t line);
    int8_t (*get_class_var_byte_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    int16_t (*get_class_var_short_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    int32_t (*get_class_var_int_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    int64_t (*get_class_var_long_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    float (*get_class_var_float_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    double (*get_class_var_double_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*get_class_var_object_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, const char* class_name, const char* class_var_name, const char* signature, int32_t* exception_flag, const char* file, int32_t line);
    const char* (*get_field_string_chars_by_name)(SPVM_ENV* env, SPVM_VALUE* stack, void* obj, const char* class_name, const char* field_name, int32_t* exception_flag, const char* file, int32_t line);
    void* (*dump_raw)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void* (*dump)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*get_bool_object_value)(SPVM_ENV* env, SPVM_VALUE* stack, void* bool_object);
    void (*cleanup_global_vars)(SPVM_ENV* env, SPVM_VALUE* stack);
    void (*make_read_only)(SPVM_ENV* env, SPVM_VALUE* stack, void* string);
    int32_t (*is_read_only)(SPVM_ENV* env, SPVM_VALUE* stack, void* string);
    int32_t (*is_array)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*is_string)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*is_numeric_array)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*is_mulnum_array)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    int32_t (*get_elem_byte_size)(SPVM_ENV* env, SPVM_VALUE* stack, void* array);
    void* (*new_array_proto_raw)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t length);
    void* (*new_array_proto)(SPVM_ENV* env, SPVM_VALUE* stack, void* array, int32_t length);
    void* (*copy_raw)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void* (*copy)(SPVM_ENV* env, SPVM_VALUE* stack, void* object);
    void (*shorten)(SPVM_ENV* env, SPVM_VALUE* stack, void* string, int32_t new_length);
    int32_t (*has_interface)(SPVM_ENV* env, SPVM_VALUE* stack, void* object, int32_t interface_basic_type_id);
    void (*print)(SPVM_ENV* env, SPVM_VALUE* stack, void* string);
    void (*print_stderr)(SPVM_ENV* env, SPVM_VALUE* stack, void* string);
  * Native API exception_object is renamed to reserved16
  * Native API native_mortal_stack is renamed to reserved17
  * Native API native_mortal_stack_top is renamed to reserved18
  * Native API native_mortal_stack_capacity is renamed to reserved19
0.9609 2022-06-19
  [CHANGE]
  * Improve error messages of compilation.
  * Improve Time::Info document.
  * Improve Changes of spvmdist command.
  * Improve Time doucment.
  * Add Sort class.
  * Improve exception messages of Sort class.
  * Add the following method to Sort class
    sort_byte_asc
    sort_byte_desc
    sort_double_asc
    sort_double_desc
    sort_float
    sort_float_asc
    sort_int_asc
    sort_int_desc
    sort_long_asc
    sort_long_desc
    sort_short_asc
    sort_short_desc
    sort_string_asc
    sort_string_desc
  * Time->timegm is implemented using timegm on UNIX/Linux or _mkgmtime on Windows.
  * Add Array class.
  * Add Format class.
  [DEPRECATION]
  * The following methods are depracated.
    Fn->copy_array_byte is deprecated. Use Array->copy_byte instead
    Fn->copy_array_double is deprecated. Use Array->copy_double instead
    Fn->copy_array_float is deprecated. Use Array->copy_float instead
    Fn->copy_array_int is deprecated. Use Array->copy_int instead
    Fn->copy_array_long is deprecated. Use Array->copy_long instead
    Fn->copy_array_object is deprecated. Use Array->copy_object instead
    Fn->copy_array_range_byte is deprecated. Use Array->copy_range_byte instead
    Fn->copy_array_range_double is deprecated. Use Array->copy_range_double instead
    Fn->copy_array_range_float is deprecated. Use Array->copy_range_float instead
    Fn->copy_array_range_int is deprecated. Use Array->copy_range_int instead
    Fn->copy_array_range_long is deprecated. Use Array->copy_range_long instead
    Fn->copy_array_range_object is deprecated. Use Array->copy_range_object instead
    Fn->copy_array_range_short is deprecated. Use Array->copy_range_short instead
    Fn->copy_array_range_string is deprecated. Use Array->copy_range_string instead
    Fn->copy_array_string is deprecated. Use Array->copy_tring instead
    Fn->dump_array_byte is deprecated. Use Array->dump_byte instead
    Fn->dump_array_double is deprecated. Use Array->dump_double instead
    Fn->dump_array_float is deprecated. Use Array->dump_float instead
    Fn->dump_array_int is deprecated. Use Array->dump_int instead
    Fn->dump_array_long is deprecated. Use Array->dump_long instead
    Fn->dump_array_object is deprecated. Use Array->dump_object instead
    Fn->dump_array_short is deprecated. Use Array->dump_short instead
    Fn->dump_array_string is deprecated. Use Array->dump_string instead
    Fn->dump_array_unsigned_byte is deprecated. Use Array->dump_unsigned_byte instead
    Fn->dump_array_unsigned_int is deprecated. Use Array->dump_unsigned_int instead
    Fn->dump_array_unsigned_long is deprecated. Use Array->dump_unsigned_long instead
    Fn->dump_array_unsigned_short is deprecated. Use Array->dump_unsigned_short instead
    Fn->equals_array_byte is deprecated. Use Array->equals_byte instead
    Fn->equals_array_double is deprecated. Use Array->equals_double instead
    Fn->equals_array_float is deprecated. Use Array->equals_float instead
    Fn->equals_array_int is deprecated. Use Array->equals_int instead
    Fn->equals_array_long is deprecated. Use Array->equals_long instead
    Fn->equals_array_object is deprecated. Use Array->equals_object instead
    Fn->equals_array_short is deprecated. Use Array->equals_short instead
    Fn->equals_array_string is deprecated. Use Array->equals_string instead
    Fn->memcpy_byte is deprecated. Use Array->memcpy_byte instead
    Fn->memcpy_double is deprecated. Use Array->memcpy_double instead
    Fn->memcpy_float is deprecated. Use Array->memcpy_float instead
    Fn->memcpy_int is deprecated. Use Array->memcpy_int instead
    Fn->memcpy_long is deprecated. Use Array->memcpy_long instead
    Fn->memcpy_short is deprecated. Use Array->memcpy_short instead
    Fn->memmove_byte is deprecated. Use Array->memmove_byte instead
    Fn->memmove_double is deprecated. Use Array->memmove_double instead
    Fn->memmove_float is deprecated. Use Array->memmove_float instead
    Fn->memmove_int is deprecated. Use Array->memmove_int instead
    Fn->memmove_long is deprecated. Use Array->memmove_long instead
    Fn->memmove_short is deprecated. Use Array->memmove_short instead
    Fn->memset_byte is deprecated. Use Array->memset_byte instead
    Fn->memset_double is deprecated. Use Array->memset_double instead
    Fn->memset_float is deprecated. Use Array->memset_float instead
    Fn->memset_int is deprecated. Use Array->memset_int instead
    Fn->memset_long is deprecated. Use Array->memset_long instead
    Fn->memset_object is deprecated. Use Array->memset_object instead
    Fn->memset_short is deprecated. Use Array->memset_short instead
    Fn->new_array_proto is deprecated. Use Array->new_proto instead
    Fn->sprintf is deprecated. Use Format->sprintf instead
  [BUG FIX]
  * Fix the bug that logical and operater and logical or operator don't return the evaluated value.
  [SPECIFICATION BUG FIX]
  * Fix the specification bug that logical and operater and logical or operator don't return the evaluated value.
  
  [NON BACKWORD COMPATIBLE CHANGES]
  * The following methods are moved from Fn class to Sort class.
    sort_byte
    sort_double
    sort_float
    sort_int
    sort_long
    sort_object
    sort_short
    sort_string

0.9608 2022-06-16
  [CHANGE]
  * Add "--genlib" option to "spvmdist" command.
  * Add "--print-dependent-resources" and "-p" options to "spvmcc" command.
  [BUG FIX]
  * Fix the bug that spvmcc don't set @INC to the value of -I.
  * Fix many bugs of the resource sysmtem of "spvmcc" command.
  [NON BACKWORD COMPATIBLE CHANGES]
  * remove "dynamic-lib" option form "spvmcc" command.
  * remove "static-lib" option form "spvmcc" command.
  
0.9607 2022-06-15
  [CHANGE]
  * Add the following methods to Fn class
    static method memset_byte : void ($dest : byte[], $dest_offset : int, $value : byte, $length : int)
    static method memset_double : void ($dest : double[], $dest_offset : int, $value : double, $length : int)
    static method memset_float : void ($dest : float[], $dest_offset : int, $value : float, $length : int)
    static method memset_int : void ($dest : int[], $dest_offset : int, $value : int, $length : int)
    static method memset_long : void ($dest : long[], $dest_offset : int, $value : long, $length : int)
    static method memset_short : void ($dest : short[], $dest_offset : int, $value : short, $length : int)
    static method memset_object : void ($dest : object[], $dest_offset : int, $value : object, $length : int)
    static method memcpy_object : void ($dest : object[], $dest_offset : int, $source : object[], $source_offset : int, $length : int)
    static method memmove_object : void ($dest : object[], $dest_offset : int, $source : object[], $source_offset : int, $length : int)
  * Add class_id operator.
  * Add "get_resource" method to "SPVM::Builder::Config" module.
  * Add "get_resource_names" method to "SPVM::Builder::Config" module.
  * Add "builder_include_dir" field to "SPVM::Builder::Config" module.
  * Add "file_optional" field to "SPVM::Builder::Config" module.
  * Add "own_include_dir" field to "SPVM::Builder::Config" module.
  * Add "own_src_dir" field to "SPVM::Builder::Config" module.
  * Add "lib_link_abs" field to "SPVM::Builder::Config" module.
  [NON BACKWORD COMPATIBLE CHANGES]
  * Remove "add_resources" and use from "SPVM::Builder::Config" module. Instead, use "use_resource" method.
  * Remove "resources" method from "SPVM::Builder::Config" module. Intead, use "get_resource" method and "get_resource_names" methods.
  * The default value of "include_dirs" of "SPVM::Builder::Config" module becomes an empty array reference.
  * "new" method of "SPVM::Builder::Config" module must need "file" option.
  * Remove "search_lib_dirs_from_config_libpth" from "SPVM::Builder::Config" module.
  * Remove "get_include_dir", "get_lib_dir", "get_src_dir", "search_lib_dirs_from_cc_info"
    "search_include_dirs_from_config_incpth", "to_hash" from "SPVM::Builder::Config" module.
0.9606  2022-06-13
        [CHANGE]
        * Add build_dynamic_lib_dist_precompile method to SPVM::Builder::API.
          This is same as build_shared_lib_dist_precompile method.
          build_shared_lib_dist_precompile method is remained for backwards compatibility.
        * Add build_dynamic_lib_dist_native method to SPVM::Builder::API.
          This is same as build_shared_lib_dist_native method.
          build_shared_lib_dist_native method is remained for backwards compatibility.
        * Add config field to SPVM::Builder::ObjectFileInfo.
        * Add config field to SPVM::Builder::LinkInfo.
        * Add output_type field to SPVM::Builder::Config.
        * Add lib_type field to SPVM::Builder::ObjectFileInfo.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove is_exe method from SPVM::Builder::Config.
        * Remove is_resource field from SPVM::Builder::ObjectFileInfo.
        * Remove is_exe field from SPVM::Builder::ObjectFileInfo.
        * Remove is_exe field from SPVM::Builder::LinkInfo.
        * Remove is_lib_file field from SPVM::Builder::ObjectFileInfo.
        * Rename SPVM::Builder::ObjectFileInfo's "object_file" field to "file".
        
0.9605  2022-06-10
        [CHANGE]
        * switch statement can have only default statement.
        * switch statement don't need to have case statements.
        * The values of the case statements can't be duplicated.
        * Perform unary numeric widening conversion to the condition of switch statement.
        * "break" statement can be ommited.
        * Improve the messages of the compilation errors.
        * Add the following functions to Fn class
          static method BYTE_MAX : byte ()
          static method BYTE_MIN : byte ()
          static method SHORT_MAX : short ()
          static method SHORT_MIN : short ()
          static method INT_MAX : int ()
          static method INT_MIN : int ()
          static method LONG_MAX : long ()
          static method LONG_MIN : long ()
          static method UBYTE_MAX : byte ()
          static method USHORT_MAX : short ()
          static method UINT_MAX : int ()
          static method ULONG_MAX : long ()
          static method FLOAT_MAX : float ()
          static method FLOAT_MIN : float()
          static method DOUBLE_MAX : double ()
          static method DOUBLE_MIN : double ()
        * Add SPVM::Builder::Resource module
        * Add use_resource method to SPVM::Builder::Config
        * Resource system is separated from SPVM moudle system
        * Resource doesn't need native module file.
        * Add --resource option to spvmdist.

0.9604  2022-06-08
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove Unicode module. Unicode module becomes CPAN module.
        * Remove Regex module. Regex module becomes CPAN module.
0.9603  2022-06-07
        [CHANGE]
        * Add --no-pm-file option to spvmdist command
        * Add Fn->is_hex_digit.
        * Add Fn->contains.
        * Add Fn->get_next_code_point.
        * Add Fn->look_next_code_point.
        * Generate Foo.native/src/.gitkeep and Foo.native/include/.gitkeep in "--native" option of "spvmdist".
        * Fn class doesn't depend on Regex and Unicode class.
        * Add MANIFEST to .gitignore file that is generated by "spvmdist".
        * Add basic test SPVM module file to the files that are generated by "spvmdist".
        [BUG FIX]
        * Fix the name argument of Makefile.PL that is generated by "spvmdist" command.
        * Fix the bug that t/basic.t that is generated by "spvmdist" command fails.
        * Fix the bug that MANIFEST.SKIP that "spvmdist" command generates is wrong.
        * Fix the bug that Makefile.PL that "spvmdist" command generates is wrong.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Rename SPVM::Builder::Generator::Dist to SPVM::Dist.
        * Remove Fn->replace.
        * Remove Fn->match.
        * "SPVM-" prefix is added to the default output directory of "spvmdist" command.
0.9602  2022-06-07
        [CHANGE]
        * Improve compilation error messages.
        * add "spvmdist" command.
          
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove "spvmgenlib" command. The important fetures are merged into "spvmdist"
          [Before]
          spvmgenlib --module-dir t/default/lib/SPVM TestCase::CompileError::Foo
          [After]
          spvmdist -f --only-lib-files TestCase::CompileError::Foo t/default/lib

0.9601  2022-06-01
        [CHANGE]
        * Regex class support "i" (ignore case) option.
        * Logical operator can be used as operands.
          
          my $ret = !1;
          my $ret = 1 && 1;
          my $ret = 1 || 1;
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Change ByteList->new method definition
          [Before]
          static method new : ByteList ($array : byte[])
          [After]
          static method new : ByteList ($array : byte[]...)
        * Change DoubleList->new method definition
          [Before]
          static method new : DoubleList ($array : double[])
          [After]
          static method new : DoubleList ($array : double[]...)
        * Change FloatList->new method definition
          [Before]
          static method new : FloatList ($array : float[])
          [After]
          static method new : FloatList ($array : float[]...)
        * Change Hash->new method definition
          [Before]
          static method new : Hash ($key_values : object[])
          [After]
          static method new : Hash ($key_values : object[]...)
        * Change IntList->new method definition
          [Before]
          static method new : IntList ($array : int[])
          [After]
          static method new : IntList ($array : int[]...)
        * Change List->new method definition
          [Before]
          static method new : List ($array : object[])
          [After]
          static method new : List ($array : object[]...)
        * Change LongList->new method definition
          [Before]
          static method new : LongList ($array : long[])
          [After]
          static method new : LongList ($array : long[]...)
        * Change ShortList->new method definition
          [Before]
          static method new : ShortList ($array : short[])
          [After]
          static method new : ShortList ($array : short[]...)
        * Change StringList->new method definition
          [Before]
          static method new : StringList ($array : string[])
          [After]
          static method new : StringList ($array : string[]...)
        * Change Regex->new method definition
          [Before]
          static method new : Regex ($re_str : string)
          [After]
          static method new : Regex ($re_str_and_options : string[]...)
        [BUG FIX]
        * Fix the bug that the tests of FreeBSD 9.1 fail.

0.96  2022-05-25
        [CHANGE]
        * This is major version up from 0.95xx. SPVM language becomes a little more stable in my opinion.
        * Support die statement without the operand again. This was remove at 0.9504(2021-02-10).
          die;
        * Add Fn->match method
        * Simplify the compilation error messages of the character literal
        * Support brace in the hexadecimal escape character
          
          '\x{A}'
          '\x{6A}'
          "Foo \x{A} Bar"
          
        * Support single character in the hexadecimal escape character
        
          '\xA'
          "Foo \xA Bar"
        * Improve the compilation error message of the Unicode escape character.
        * Add the "cap1", "cap2", "cap3", "cap4", "cap5", "cap6", "cap7", "cap8", "cap9", "cap10" methods
          to Regex class. These are corresponding to Perl's $1, $2, $3 ... $10.
        * Improve the compilation error messages of variable expansion.
        [BUG FIX]
        * Fix bug that Regex don't work well in the following case.
          my $result = Fn->replace("xyzAAAxyzAAA", "A+", "BBB", "g");
        * Fix the bug that variable expansion doesn' support the arrow between braces or brackets such as "$minimals->[1]->{x}".
          
        [SPECIFICATION FIX]
        * Add string literal escape character \$
        * Hexadecimal escape charcter represents any value of byte type

        [NON BACKWORD COMPATIBLE CHANGES]
        * The unicode copde point of Unicode escape character must be a Unicode scalar value.
        
0.9517  2022-05-19
        [CHANGE]
        * Numeric literal error messages.
        * Add "is_unicode_scalar_value" method to Unicode module.
        * Add "chr" method to Fn module.
        * Add "ord" method to Fn module.
        * Add "%lx" specifier to Fn->sprintf method.
        * Add "%lX" specifier to Fn->sprintf method.
        * Support any precision of %f of Fn->sprintf.
        * Add "repeat" method to Fn module.
        * Float object can be passed to Fn->srpintf "%f" and "%g" specifier.
        * Int object can be passed to Fn->srpintf "%c" specifier.
        
        [BUG FIX]
        * Fix the bug Github #212. Tests fail when perl is built with -DDEBUGGING set in ccflags [rt.cpan.org #142336].
        * Fix the bug that integer literal octal natation 0_123 is interpretted as 123, not 0123.
        * Fix the bug that switch statement jump the wrong position when default statement doesn't exist.
        [SPECIFICATION FIX]
        * "+" just before integer literal is tokenized as an unary operator.
        * C<-> can be at the beginning of integer literal of hex, octet, binary notations.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Fn->sprintf("%+5u", 123) become "  123" from " +123". This becomes same as the result of Perl sprintf.
        * Fn->sprintf("%+5lu", 123) become "  123" from " +123". This becomes same as the result of Perl sprintf "%u".
        * Remove Fn->sprintf %U specifier because I relalize %U has different meaning in Perl sprintf. 
          Use %c instead of %U.
0.9516  2022-05-11
        [CHANGE]
        * Improve symbol name checking.
        * The string literal of the left operand of the fat camma can't contains \"::\"
        * Add no_precompile field to SPVM::Builder::Config::Exe.
        * Add no_compiler_api field to SPVM::Builder::Config::Exe.
        * Add dynamic_lib field to SPVM::Builder::Config::Exe.
        * Add static_lib field to SPVM::Builder::Config::Exe.
        * Add SPVM::Document::NativeMethod document. Native methods of SPVM::Document::NativeAPI is moved to this document.
        * Improve the messages of class name compilation errors.
        * Improve the messages of method name compilation errors.
        * Improve the messages of field name compilation errors.
        [BUG FIX]
        * Fix the bug that local variable can contain "::".
        * Fix the bug that the method name of the method definition can contain "::".
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove "any_object_basic_type_id" native API. ID 155 is reused by "free_env_prepared" native API.
        * Remove "string_basic_type_id" native API. ID 162 is reused by "cleanup_global_vars" native API.

0.9515  2022-05-09
        [CHANGE]
        * Add cloneable_clone to Point class.
        * Point class has Cloneable interface.
        * Interface can have interface statment.
        * Interface type and callback type can be assign to interface type that has the interface.
        * Interface type and callback type can be assign to callback type that has the callback.
        * Allow type cast from interface type to callback type
        * Allow type cast from callback type to interface type
        * Improve calling method error messages.
        * The "has_impl" operator can check anon method
          if (has_impl $interface) {
          
          }
        [BUG FIX]
        * Fix the bug that has_impl can specify not found method.
        * Interface can have interface guarantees
        * Fix the bug that switch statement is wrong behaivior when the count of case statements is greater than 255.
        * Fix the bug that "has_impl" operator can't do precompile.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Revert 0.9514 Methods of interfaces must have the names.
        * implement statement is renamed to interface statement.
        * A interface type must have one required method.
        * A callback type must have one required method.
        * A class must have the required methods defined in the interface classes.
        * Remove callback_t. The feature of callback_t is merged into interface_t.
        * Add the following native APIs
          "free_env_prepared", "get_class_var_id_cache", "get_field_id_cache",  "get_method_id_cache"
          "check_runtime_assignability_array_element", "check_runtime_assignability",
          "free_env_raw", "new_env_raw", "allocator", "api",
        * Remove SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_CALLBACK
        * Change ID of SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_ANY_OBJECT from 10 to 9
        * Remove "byte_object_basic_type_id" native API. ID 9 is reused by "api" native API.
        * Remove "short_object_basic_type_id" native API. ID 10 is reused by "allocator" native API.
        * Remove "int_object_basic_type_id" native API. ID 11 is reused by "new_env_raw" native API.
        * Remove "long_object_basic_type_id" native API. ID 12 is reused by "free_env_raw" native API.
        * Remove "float_object_basic_type_id" native API. ID 13 is reused by "check_runtime_assignability" native API.
        * Remove "double_object_basic_type_id" native API. ID 14 is reused by "check_runtime_assignability_array_element" native API.
        * Remove "has_callback" native API. ID 106 is reused Y_CALLBACK
        * Change ID of SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_ANY_OBJECT from 10 to 9
        * Remove "byte_object_basic_type_id" native API. ID 9 is reused by "api" native API.
        * Remove "short_object_basic_type_id" native API. ID 10 is reused by "allocator" native API.
        * Remove "int_object_basic_type_id" native API. ID 11 is reused by "new_env_raw" native API.
        * Remove "long_object_basic_type_id" native API. ID 12 is reused by "free_env_raw" native API.
        * Remove "float_object_basic_type_id" native API. ID 13 is reused by "check_runtime_assignability" native API.
        * Remove "double_object_basic_type_id" native API. ID 14 is reused by "check_runtime_assignability_array_element" native API.
        * Remove "has_callback" native API. ID 106 is reused by "is_object_array" native API.
        * Remove "no_symbol_cache_flag" native API. ID 176 is reused by "get_method_id_cache" native API.
        * Remove "set_no_symbol_cache_flag" native API. ID 177 is reused by "get_field_id_cache" native API.
        * Remove "get_class_var_id_cache" native API. ID 178 is reused by "get_class_var_id_cache" native API.
        * "has_implemenet" operator is renamed to "has_impl".
0.9514  2022-05-02
        [CHANGE]
        * Add no_compiler_api to SPVM::Builder::Config::Exe
        * Add no_precompile to SPVM::Builder::Config::Exe
        * Add dynamic_lib to SPVM::Builder::Config::Exe
        * Add static_lib to SPVM::Builder::Config::Exe
        * Improve resource system. Don't use ar command.
        * Add to_string method to Point class.
        * Point class has Stringable interface.
        * Add the following Native API constant values of basic type ids.
          0  SPVM_NATIVE_C_BASIC_TYPE_ID_UNKNOWN
          1  SPVM_NATIVE_C_BASIC_TYPE_ID_UNDEF
          2  SPVM_NATIVE_C_BASIC_TYPE_ID_VOID
          3  SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE
          4  SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT
          5  SPVM_NATIVE_C_BASIC_TYPE_ID_INT
          6  SPVM_NATIVE_C_BASIC_TYPE_ID_LONG
          7  SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT
          8  SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE
          9  SPVM_NATIVE_C_BASIC_TYPE_ID_STRING
          10 SPVM_NATIVE_C_BASIC_TYPE_ID_ANY_OBJECT
          11 SPVM_NATIVE_C_BASIC_TYPE_ID_BYTE_OBJECT
          12 SPVM_NATIVE_C_BASIC_TYPE_ID_SHORT_OBJECT
          13 SPVM_NATIVE_C_BASIC_TYPE_ID_INT_OBJECT
          14 SPVM_NATIVE_C_BASIC_TYPE_ID_LONG_OBJECT
          15 SPVM_NATIVE_C_BASIC_TYPE_ID_FLOAT_OBJECT
          16 SPVM_NATIVE_C_BASIC_TYPE_ID_DOUBLE_OBJECT
          17 SPVM_NATIVE_C_BASIC_TYPE_ID_BOOL_OBJECT
        * Add the following Native API constant values of basic type categories.
          0  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_UNKNOWN
          1  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NOT_FOUND_CLASS
          2  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_UNDEF
          3  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_VOID
          4  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_NUMERIC
          5  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_MULNUM
          6  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_STRING
          7  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_CLASS
          8  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_INTERFACE
          9  SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_CALLBACK
          10 SPVM_NATIVE_C_BASIC_TYPE_CATEGORY_ANY_OBJECT
        * Add SPVM Precompile Native APIs. The document is SPVM::Document::NativeAPI::Precompile.
        * Add SPVM String Buffer Native APIs. The document is SPVM::Document::NativeAPI::StringBuffer.
        * Add SPVM Allocator Native APIs. The document is SPVM::Document::NativeAPI::Allocator.
        * Improve SPVM::Document::NativeAPI::Compiler.
        * Improve SPVM::Document::NativeAPI::Runtime.
        * Improve type cast error messages.
        * Improve dump test
          [Before]
          object_value => {
            byte_value => 0,
            short_value => 0,
            int_value => 0,
            long_value => 0,
            float_value => 0,
            double_value => 0,
            string_value => undef,
            int_array => undef,
            object_value => undef
          } : TestCase::DumpTest1 (0x55f472a79f30)
          [After]
          object_value => TestCase::DumpTest1 (0x55f472a79f30) {
            byte_value => 0,
            short_value => 0,
            int_value => 0,
            long_value => 0,
            float_value => 0,
            double_value => 0,
            string_value => undef,
            int_array => undef,
            object_value => undef
          }
        * Allow same mulnum type cast
          my $z_src : Complex_2d;
          my $z_dist = (Complex_2d)$z_src;
        * Allow same reference type cast
            my $num = 3;
            my $num_ref : int* = \$num;
            my $num_ref2 = (int*)$num_ref;
          
        [BUG FIX]
        * Fix the bug that multi-dimensional array can't assing to any object array "object[]".
        * Fix the bug that SPVM::Builder::Util::API::create_make_rule_native can't detect native file extension.
        * Fix the bug that unboxing type conversion doesn't throw the exception.
        * Fix the bug that type cast to numeric array compilation error is wrong.
        * Improve the message of type cast compilation error.
        * Fix type cast many bugs.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove -O|--optimize option from spvmcc.
        * Remove --dynamic-lib option from spvmcc.
        * Remove --static-lib option from spvmcc.
        * Methods of interfaces must have the names.
0.9513  2021-04-23
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove Fn->srand because this method is not thread safe.
        * Change Fn->crand arguments because this method become thread safe.
          [Before]
          static method crand : int ();
          
          [After]
          static method crand : int ($seed : int*);

        * Change Fn->rand arguments because this method become thread safe.
          [Before]
          static method rand : double ()
          
          [After]
          static method rand : double ($seed : int*)
          
0.9512  2021-04-21
        [CHANGE]
        * Add Point module.
        * Improve method call error message.
        * Add --dynamic-lib option to spvmcc. spvmcc can create a dynamic library.
        * Add --static-lib option to spvmcc. spvmcc can create a static library.
        * Cache method id, field id, class variable id in precompile.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * new_stack_trace_raw and new_stack_trace don't need file argument. File name got from class information.
          new_stack_trace_raw and new_stack_trace receive method id.
        
          [Before]
          void* (*new_stack_trace_raw)(SPVM_ENV* env, void* exception, const char* class_name, const char* method_name, const char* file, int32_t line);
          void* (*new_stack_trace)(SPVM_ENV* env, void* exception, const char* class_name, const char* method_name, const char* file, int32_t line);
          
          [After]
          void* (*new_stack_trace_raw)(SPVM_ENV* env, void* exception, int32_t method_id, int32_t line);
          void* (*new_stack_trace)(SPVM_ENV* env, void* exception, int32_t method_id, int32_t line);
        * Rename SPVM::Comparator::Object module to SPVM::Comparator module.
        * Native API "alloc_memory_block_zer" allocs memory for the envrironment, instead of the runtime
        * Native API "free_memory_block" frees memory for the envrironment, instead of the runtime
        * Native API "get_memory_blocks_count" gets the count of memory blocks for the envrironment, instead of the runtime
        
0.9511  2021-04-18
        [CHANGE]
        * Support cast from class muldim array to interface muldim array
        * Support cast from class muldim array to callback muldim array
        * Add postfix type cast syntax
          
          $num->(string)
          
          This is same as
          
          (string)$num;
        * Improve field access error message.
        * Move compiler native APIs from env->compier_xxx to env->api->compiler->xxx.
          // Compiler API
          void* compiler_api = env->api->compiler;
          
          // New compiler
          void* compiler = compiler_api->new_compiler();
          
          // Compile SPVM
          int32_t status = compiler_api->compile_spvm(compiler, "MyClass");
          
          // Free compiler
          compiler_api->free_compiler(compiler);
        * Move the following native APIs to env->api->runtime->xxx.
          
          get_precompile_method_address
          set_native_method_address
          set_precompile_method_address
          get_method_id_without_signature
          get_method_id_without_signature
          get_constant_string_value

          // Runtime API
          void* runtime_api = env->api->runtime;
          
          // New runtime
          void* runtime = runtime_api->new_runtime();
          
          // Free runtime
          runtime_api->free_runtime(runtime);

        * Add SPVM::Document::NativeAPI::Compiler document.
        * Add SPVM::Document::NativeAPI::Runtime document.
        * Improve English syntax of error messages.
        [BUG FIX]
        * Fix the bug that dump weaken objects.
        * Fix the bug of isweak operator compile checking.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Internally used Native APIs object_type_category_offset become always NULL.
        * Remove native APIs from env->compier_xxx. This APIs is moved to compiler native APIs.
        * Remove the following native APIs
          get_precompile_method_address
          set_native_method_address
          set_precompile_method_address
          get_method_id_without_signature
          get_method_id_without_signature
          get_constant_string_value
        * Native API "is_object_array" ID becomes 186
        * Remove the following compiler APIs.
          int32_t (*get_methods_length)(void* compiler, int32_t class_id);
          int32_t (*get_method_id)(void* compiler, int32_t class_id, int32_t method_index_of_class);
          int32_t (*get_method_id_by_name)(void* compiler, const char* class_name, const char* method_name);
          const char* (*get_method_name)(void* compiler, int32_t method_id);
          const char* (*get_method_signature)(void* compiler, int32_t method_id);
          int32_t (*is_anon_method)(void* compiler, int32_t method_id);
          int32_t (*is_init_block_method)(void* compiler, int32_t method_id);
          int32_t (*is_native_method)(void* compiler, int32_t method_id);
          int32_t (*is_precompile_method)(void* compiler, int32_t method_id);
          const char* (*get_class_module_file)(void* compiler, int32_t class_id);
          int32_t (*get_class_id)(void* compiler, const char* class_name);
          int32_t (*get_classes_length)(void* compiler);
          const char* (*get_class_name)(void* compiler, int32_t class_id);
          int32_t (*is_anon_class)(void* compiler, int32_t class_id);
          int32_t (*get_method_class_id)(void* compiler, int32_t method_id);
        * Reorder compiler native APIs.
        
0.9510  2021-04-05
        [CHANGE]
        * Add alias syntax
        * Improve the error messages of object-to-numeric type conversion
        * Add type comment syntax
        * Support cast from class array to interface array
        * Support cast from class array to callback array
          
        [BUG FIX]
        * Fix the bug that the runtime is not freed.
        * Fix the bug that SPVM::new_object_array can't recieve object[] type correctly.
        * Fix the bug that Exchange API call_spvm_method can recieve from object[] to element[].
        * Fix the bug that spvmcc "-B|--build-dir" option is ignored.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove implicte type convertion Perl array reference to SPVM object and element[]
          This is a bug fix because the right convesion is impossible,
          but the following code raise an exception, and the code must be rewirtten.
          [Before]
          my $list = SPVM::List->new([]);
          [After]
          my $list = SPVM::List->new(SPVM::new_object_array("Int[]", []));
        * The type of argument of Hash->new is changed. Sorry, this is merely my bad mistake. The type of value of hash is any object type.
          [Before]
          static method new : Hash ($key_values : element[]);
          
          [After]
          static method new : Hash ($key_values : object[]);
        * Remove oarray type that is deprecated at 0.9509.
        * The feature of element[] type is merged to object[] type and remove element[] type.

0.9509  2021-03-23
        [DEPRECATIONS]
        * oarray type is deprecated. oarray type will be removed at 0.9510.
        [WARNINGS]
        * Interfaces and IDs of Native APIs that is added after 0.9506+(181+) will be changed many times.
          because I realize Native APIs that compile SPVM are not yet implemented correctly in tests.
        [BUG FIX]
        * Fix the bug that spvmcc can't detect the change of config file.
        [CHANGE]
        * Add element[] type. This is same as oarray type, but element[] type has correct type dimension.
        * Add Fn->is_numeric_array, Fn->is_mulnum_array doc.
        * Add Fn->is_object_array
        * Add is_object_array native API.
        * Native API get_elem_byte_size uses only runtime information
        * Native API has_callback uses only runtime information
        * Native API has_interface uses only runtime information
        * Separate compiler allocator and runtime allocator.
          The memory allocated at compile time is freed just before runtime.
        * Add get_method_id_without_signature native API.
        * Add get_constant_string_value native API.
        * Add compiler_build_runtime_info native API.
        * Rename compiler_build_runtime_info to compiler_build_runtime native API.
        * Change Native API "compiler_build_runtime" argument and return values.
        [NON BACKWORD COMPATIBLE CHANGES]
        * oarray type signature change from oarray to element[].
          For this reason, 0.9510 don't have binary compatibility of precompiled source from 0.9509
        * Rename Internal native API "compiler" field to "runtime_info"
          because in this release SPVM compiler and runtime is completly separated.
          I think the effect is litte because this is internal field.
        * Rename native API new_compiler to compiler_new
          becuae this is my mistake and compiler API shoud start compiler_.
          This has a litte effect over 0.9506+.
        * The native API compiler methods is changed to runtime methods
          because I realize setting and getting native/precompile address
          should be done at only runtime. This has a litte effect over 0.9506+.
          
          Change Native API compiler_get_native_method_address to get_native_method_address
          Change Native API compiler_set_native_method_address to set_native_method_address
          Change Native API compiler_get_precompile_method_address to get_precompile_method_address
          Change Native API compiler_set_precompile_method_address to set_precompile_method_address
       * Internally used "memory_blocks_count" native API is no more used. The count of memory blocks is managed in "runtime_info".
         Because this is internal used, the effect is little.
        * Change the following Native APIs. First argument don't receive env.
        [Before]
        SPVM_ENV* (*new_env_raw)(SPVM_ENV* env);
        void* (*compiler_new)(SPVM_ENV* env);
        void (*compiler_free)(SPVM_ENV* env, void* compiler);
        void (*compiler_set_start_line)(SPVM_ENV* env, void* compiler, int32_t start_line);
        int32_t (*compiler_get_start_line)(SPVM_ENV* env, void* compiler);
        void (*compiler_set_start_file)(SPVM_ENV* env, void* compiler, const char* start_file);
        const char* (*compiler_get_start_file)(SPVM_ENV* env, void* compiler);
        void (*compiler_add_module_dir)(SPVM_ENV* env, void* compiler, const char* module_dir);
        int32_t (*compiler_get_module_dirs_length )(SPVM_ENV* env, void* compiler);
        const char* (*compiler_get_module_dir )(SPVM_ENV* env, void* compiler, int32_t module_dir_id);
        int32_t (*compiler_compile_spvm)(SPVM_ENV* env, void* compiler, const char* class_name);
        int32_t (*compiler_get_error_messages_length)(SPVM_ENV* env, void* compiler);
        const char* (*compiler_get_error_message)(SPVM_ENV* env, void* compiler, int32_t index);
        int32_t (*compiler_get_class_id)(SPVM_ENV* env, void* compiler, const char* class_name);
        int32_t (*compiler_get_classes_length)(SPVM_ENV* env, void* compiler);
        const char* (*compiler_get_class_name)(SPVM_ENV* env, void* compiler, int32_t class_id);
        int32_t (*compiler_is_anon_class)(SPVM_ENV* env, void* compiler, int32_t class_id);
        int32_t (*compiler_get_methods_length)(SPVM_ENV* env, void* compiler, int32_t class_id);
        int32_t (*compiler_get_method_id)(SPVM_ENV* env, void* compiler, int32_t class_id, int32_t method_index_of_class);
        int32_t (*compiler_get_method_id_by_name)(SPVM_ENV* env, void* compiler, const char* class_name, const char* method_name);
        const char* (*compiler_get_method_name)(SPVM_ENV* env, void* compiler, int32_t method_id);
        const char* (*compiler_get_method_signature)(SPVM_ENV* env, void* compiler, int32_t method_id);
        int32_t (*compiler_is_anon_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
        int32_t (*compiler_is_init_block_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
        int32_t (*compiler_is_native_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
        int32_t (*compiler_is_precompile_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
        
        [After]
        SPVM_ENV* (*new_env_raw)();
        void* (*compiler_new)();
        void (*compiler_free)(void* compiler);
        void (*compiler_set_start_line)(void* compiler, int32_t start_line);
        int32_t (*compiler_get_start_line)(void* compiler);
        void (*compiler_set_start_file)(void* compiler, const char* start_file);
        const char* (*compiler_get_start_file)(void* compiler);
        void (*compiler_add_module_dir)(void* compiler, const char* module_dir);
        int32_t (*compiler_get_module_dirs_length )(void* compiler);
        const char* (*compiler_get_module_dir )(void* compiler, int32_t module_dir_id);
        int32_t (*compiler_compile_spvm)(void* compiler, const char* class_name);
        int32_t (*compiler_get_error_messages_length)(void* compiler);
        const char* (*compiler_get_error_message)(void* compiler, int32_t index);
        int32_t (*compiler_get_class_id)(void* compiler, const char* class_name);
        int32_t (*compiler_get_classes_length)(void* compiler);
        const char* (*compiler_get_class_name)(void* compiler, int32_t class_id);
        int32_t (*compiler_is_anon_class)(void* compiler, int32_t class_id);
        int32_t (*compiler_get_methods_length)(void* compiler, int32_t class_id);
        int32_t (*compiler_get_method_id)(void* compiler, int32_t class_id, int32_t method_index_of_class);
        int32_t (*compiler_get_method_id_by_name)(void* compiler, const char* class_name, const char* method_name);
        const char* (*compiler_get_method_name)(void* compiler, int32_t method_id);
        const char* (*compiler_get_method_signature)(void* compiler, int32_t method_id);
        int32_t (*compiler_is_anon_method)(void* compiler, int32_t method_id);
        int32_t (*compiler_is_init_block_method)(void* compiler, int32_t method_id);
        int32_t (*compiler_is_native_method)(void* compiler, int32_t method_id);
        int32_t (*compiler_is_precompile_method)(void* compiler, int32_t method_id);
        
0.9508  2021-03-04
        [CHANGE]
        * Add "get_constant_string" native API.
        * SPVM::Builder can detect the changed of SPVM::Builder modules and SPVM core header files and source files in all places.
        * Native API's no_symbol_cache_flag, set_no_symbol_cache_flag, get_no_symbol_cache_flag are currently unused.
          By this, the peformance of calling methods is down, however, I plan to fix the performance in the future release.
        * Reduce memory usage  from about 24MB to 9.5MB on 64 bit environment by free memories that is created at compile time.
0.9507  2021-02-24
        [CHANGE]
        * SPVM don't support nmake. Already nmake test always fails until now.
        * Add "index_len" method to the "Fn" module.
        * Add "rindex_len" method to the "Fn" module.
        [BUG FIX]
        * Fix the bug that spvmcc can't detect the changes of the SPVM core header files.
        
0.9506  2021-02-22
        [CHANGE]
        * Add no_symbol_cache_flag, set_no_symbol_cache_flag, get_no_symbol_cache_flag native APIs
        * Precompile and native method of SPVM core become reentrant if no_symbol_cache_flag is set.
        * Fix precompile exception bugs when symbols is not found.
        * Add print, print_stderr native APIs.
        * env is not managed by SPVM memory allocator because env must exist before the compiler is created.
        * Add the following native APIs for the compilation of SPVM
          SPVM_ENV* (*new_env_raw)(SPVM_ENV* env);
          void (*free_env_raw)(SPVM_ENV* env);
          int32_t (*init_env)(SPVM_ENV* env);
          void (*call_init_blocks)(SPVM_ENV* env);
          void (*cleanup_global_vars)(SPVM_ENV* env);
          void* (*new_compiler)(SPVM_ENV* env);
          void (*compiler_free)(SPVM_ENV* env, void* compiler);
          void (*compiler_set_start_line)(SPVM_ENV* env, void* compiler, int32_t start_line);
          int32_t (*compiler_get_start_line)(SPVM_ENV* env, void* compiler);
          void (*compiler_set_start_file)(SPVM_ENV* env, void* compiler, const char* start_file);
          const char* (*compiler_get_start_file)(SPVM_ENV* env, void* compiler);
          void (*compiler_add_module_dir)(SPVM_ENV* env, void* compiler, const char* module_dir);
          int32_t (*compiler_get_module_dirs_length )(SPVM_ENV* env, void* compiler);
          const char* (*compiler_get_module_dir )(SPVM_ENV* env, void* compiler, int32_t module_dir_id);
          int32_t (*compiler_compile_spvm)(SPVM_ENV* env, void* compiler, const char* class_name);
          int32_t (*compiler_get_error_messages_length)(SPVM_ENV* env, void* compiler);
          const char* (*compiler_get_error_message)(SPVM_ENV* env, void* compiler, int32_t index);
          int32_t (*compiler_get_class_id)(SPVM_ENV* env, void* compiler, const char* class_name);
          int32_t (*compiler_get_classes_length)(SPVM_ENV* env, void* compiler);
          const char* (*compiler_get_class_name)(SPVM_ENV* env, void* compiler, int32_t class_id);
          int32_t (*compiler_is_anon_class)(SPVM_ENV* env, void* compiler, int32_t class_id);
          int32_t (*compiler_get_methods_length)(SPVM_ENV* env, void* compiler, int32_t class_id);
          int32_t (*compiler_get_method_id)(SPVM_ENV* env, void* compiler, int32_t class_id, int32_t method_index_of_class);
          int32_t (*compiler_get_method_id_by_name)(SPVM_ENV* env, void* compiler, const char* class_name, const char* method_name);
          const char* (*compiler_get_method_name)(SPVM_ENV* env, void* compiler, int32_t method_id);
          const char* (*compiler_get_method_signature)(SPVM_ENV* env, void* compiler, int32_t method_id);
          int32_t (*compiler_is_anon_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
          int32_t (*compiler_is_init_block_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
          int32_t (*compiler_is_native_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
          int32_t (*compiler_is_precompile_method)(SPVM_ENV* env, void* compiler, int32_t method_id);
          void* (*compiler_get_native_method_address)(SPVM_ENV* env, void* compiler, int32_t method_id);
          void* (*compiler_get_precompile_method_address)(SPVM_ENV* env, void* compiler, int32_t method_id);
          void (*compiler_set_native_method_address)(SPVM_ENV* env, void* compiler, int32_t method_id, void* address);
          void (*compiler_set_precompile_method_address)(SPVM_ENV* env, void* compiler, int32_t method_id, void* address);

        [BUG FIX]
        * Fix the line and the position of character in case that a compilation error occurs and some space character exists.
        * Fix caching bug that the change of SPVM::Builder::Exe can't be detected.
        
0.9505  2021-02-16
        [CHANGE]
        * Improve the error message of getting and setting fields.
        * Detect the change of the SPVM core precompile source code in precompile.
        * Precompile methods is fallbacked to non-precompile methods
        * Add interface feature
        * spvmgenlib command generate main method instead of sum and print "Hello World!"
        * Add Cloneable module.
        [BUG FIX]
        * Fix bug that is_read_only doesn't set condition flag.
        * Fix bug that $self->set_x($self->x) become compile error.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * spvmgenlib command doesn't generate native module by default
          --native-language option is needed.
          [Before]
          spvmgenlib MyLib
          [After]
          spvmgenlib MyLib --native-language c
        
0.9504  2021-02-10
        [CHANGE]
        * Add the make_read_only native API.
        * Add the is_read_only native API.
        * Add make_read_only statement.
        * Add is_read_only operator.
        * The string created by string literal become read-only.
        * Read-only string can't be converted to mutable string.
        * The key of Hash module become read-only string.
        * Add native APIs
          is_array
          is_string
          is_numeric_array
          is_mulnum_array
        * Add the "get_elem_byte_size" native API.
        * Add the "new_array_proto" native API.
        * Fn->new_array_proto throw an exception when the length is lower than 0.
        * Add the "copy" native API.
        * Add Fn->is_array, Fn->is_numeric_array, Fn->is_mulnum_array
        * Add "new_array_proto_raw", "copy_raw" native APIs
        * Add copy operator
        * Add the "shorten" native API.
        * Add Fn->shorten.
        * Add Fn->chomp.
        * Add Fn->memcpy.
        * Add Fn->memmove.
        [BUG FIX]
        * Fix the bug that Fn->new_array_proto doesn't create multi numeric array and number array correctly.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove the syntax of no operand of warn and die statement.
          This is not documented, but was defined in parsing syntax.
        
0.9503  2021-02-08
        [CHANGE]
        * Add divui, divul, remui, remul operators.
        * Add new_string_len operator.
        
0.9502  2021-02-07
        [CHANGE]
        * SPVM::Document::LanguageSpecification becomes POD instead of HTML
        * SPVM::Document::Tutorial becomes POD instead of HTML
        * Add native api "string_basic_type_id"
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * The keys of Hash module is copied defensively.
          If you check the equality of the keys using == operator,
          Please change eq operator instead.

0.9501  2021-02-04
        [CHANGE]
        * Improve compilation error messages. All method expressions is Foo->bar.
        * Improve compilation error messages. All field expressions is Foo->{bar}.
        * Improve compilation error messages. All class variable expressions is $Foo::Bar.
        * Improve a assignment compilation error messege. "argument 2" -> "2th argument".
        * Use native api "get_chars" more instead of "get_elems_byte" in the right places.
        * Add mutable type qualifier.
        * Improve a compilation error messege when the class is not finished at the end of the file.
        * Add "value" method to StringBuffer class.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * string type become mutable using mutable type qualifir.
          This means string is no more immutable.
          Sorry. This is big change. If necessary, a defensive copy is needed.
          The reason of this change is that I wanted to avoid slowing the performance of string processing.
          I found this performance problem when I do tests of socket read/write using StringBuffer module.
        * Remove srand initialization because Fn module depend on Time module.
          Fn module should be caintan only number, string, and array utilities.
          Plese call srand manually
            Fn->srand(Time->time());

0.9500  2021-02-01
        [CHANGE]
        * Add SPVM::Builder::LinkInfo.
        * Add is_lib_file field to SPVM::Builder::ObjectFileInfo.
        * Add is_native_source to SPVM::Builder::ObjectFileInfo.
        * ccflags field of SPVM::Builder::ObjectFileInfo has the default value [].
        * Add utf32_to_utf16 method to Unicode module again.
        * Add utf16_to_utf32 method to Unicode module again.
        * Add utf16_to_utf8 method to Unicode module again.
        * Add ERROR_INVALID_UTF8 method to Unicode module again.
        [NON BACKWORD COMPATIBLE CHANGES]
        * The second argument of before_link callback of SPVM::Builder::Config is changed.
          [Before]
          An array reference of SPVM::Builder::ObjectFileInfo objects
          [After]
          A SPVM::Builder::LinkInfo object

0.9133  2021-01-31
        [CHANGE]
        * byte[] object is available in eq, ne, gt, ge, lt, le, cmp . operators.
        * Add the link to spvmgenlib command to the doc of SPVM.pm and the doc of SPVM::Document::NativeAPI
        
        [FIX BUG]
        * Fix the messages of the compilation errors of eq, ne, gt, ge, lt, le, cmp operator.
        * Fix the bug that instance method signatures don't add "self" to the top of the arguments
        
        [FIX DOCUMENT BUG]
        * Add the document of get_bool_object_value of Native APIs.

0.9132  2021-01-28
        [CHANGE]
        * SPVM::Builder::Config::Exe default ldflags become empty list.
        [FIX BUG]
        * Fix the bug that spvmcc doesn't use libs, ldflags, lib_dirs fields.
        * Fix the bug that spvmcc doesn't cache the executable file.
        [FIX DOCUMENT BUG]
        * Fix SPVM::Document::NativeAPI.
          Fix from call_spvm_method_by_name to call_class_method_by_name
          Fix from call_callback_method_by_name to call_instance_method_by_name

0.9131  2021-01-27
        [CHANGE]
        * Add build_shared_lib_dist_precompile to SPVM::Builder::API
        * Add build_shared_lib_dist_native to SPVM::Builder::API
        * Add build_dir option to new method of SPVM::Builder::API.

        [BUG FIX]
        * Fix the bug that build_shared_lib_dist of SPVM::Builder don't output the compilation error messages.
        * Fix the bug that SPVM compilation error raise unexpected exception.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * create_make_rule_native of SPVM::Builder::Util::API doesn't use private API.
        * create_make_rule_precompile of SPVM::Builder::Util::API doesn't use private API.

0.9130  2021-01-27
        [CHANGE]
        * Compilation error messages is saved as strings.
        * Add SPVM::Builder::Util::API module for the public APIs of SPVM::Builder::Util.
          SPVM::Builder::Util become a private module of SPVM. Please rewrite the codes.
          [Before]
          SPVM::Builder::Util::create_make_rule_native('Foo');
          SPVM::Builder::Util::create_make_rule_precompile('Foo');
          
          [After]
          SPVM::Builder::Util::API::create_make_rule_native('Foo');
          SPVM::Builder::Util::API::create_make_rule_precompile('Foo');
        * Add SPVM::Builder::API module for the public APIs of SPVM::Builder.
        * Add optimize_each field to SPVM::Builder::Config
        * Add global_cc_each field to SPVM::Builder::Config::Exe
        * Add global_ccflags_each field to SPVM::Builder::Config::Exe
        * Add global_optimize_each field to SPVM::Builder::Config::Exe
        * Add global_cc_each field to SPVM::Builder::CC
        * Add global_ccflags_each field to SPVM::Builder::CC
        * Add global_optimize_each field to SPVM::Builder::CC
        * SPVM::Builder::CC uses global_cc_each, global_ccflags_each, global_optimize_each field.
        * Add is_exe method to SPVM::Builder::Config and SPVM::Builder::Config::Exe.
        * Add before_link field to SPVM::Builder::Config
        * Execute a before_link field callback before the link in SPVM::Bulder::CC link method.
        * Execute a before_link field callback before the link in SPVM::Bulder::Exe link method.
        * Add SPVM::Builder::ObjectFileInfo module
        [BAG FIX]
        * Fix the bug that SPVM::Builder::Config::Exe return SPVM::Builder::Config object and SPVM::Builder::Config doesn't support inheritance.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Change cc_each second argument of SPVM::Builder::Config from each source file to optional argument as hash reference
          - source_file
          - class_name
        * Change ccflags_each second argument of SPVM::Builder::Config from each source file to optional argument as hash reference
          - source_file
          - class_name
          - cc
        * Remove global_ccflags fields of SPVM::Builder::Config::Exe. Please use global_ccflags_each instead.
        * Remove add_global_ccflas method of SPVM::Builder::Config::Exe. Please use global_ccflags_each instead.
        
0.9129  2021-01-25
        [CHANGE]
        * Improve the error messages of character literals.
        [FIX BUGS]
        * Fix the bug that \b is escaped to ASCII Code 8 BS in the charater literal.
          \b is a raw escape charater in the string literal. In document, \b is both escaped to ASCII Code 8 BS and \b is raw escape charater.
          It is right that \b is a raw escape charater.
        * Fix the bug that the uname of the platform can't be detected in Makefile.PL.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Sorry. \b is not supported in the character literal. Please replace \b with \x08.

0.9128  2021-01-24
        [CHANGE]
        * Add spvmlibgen command and SPVM::Builder::Generator::Lib.
        * Currently SPVM doesn't support Alpine Linux because segmentation fault occurs
          due to incompatibility with glibc.
          If you want to use SPVM on Alpine Linux,
          please join SVPM project to fix the problems
        [FIX BUGS]
        * Fix the bug that "spvmcc -v" doesn't display the version.
0.9127  2021-01-22
        [CHANGE]
        * Improve "invalid method descriptor" error message.
        * Improve exception stack trace error message.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Change main method arguments that spvmcc boots
          [Before]
          static method main : int ($args : string[]) {
          [After]
          static method main : int ($start_file : string, $args : string[]) {
        * Remove spvm command because perl command is enough. I realized spvm command is not needed now.
          #!/usr/bin/perl
          
          use strict;
          use warnings;

          use SPVM 'MyExe';

          SPVM::MyExe->main($0, \@ARGV);
          
0.9126  2021-01-21
        [FIX BUGS]
        * Fix bugs that when native config file is not found, an exeption doesn't occur.
        * Fix the bug that spvmcc don't see the config file when compile sources for own.
        * Fix the bug that spvmcc don't see "force" option in the config file when source files are created.
        [CHANGE]
        * Add global_ccflags to SPVM::Builder::CC.
        * module_dirs, build_dir of SPVM::Builder::Exe is saved to SPVM::Builder object.
        * Add spvm command.
        * Improve module not found error message.
        * spvmcc bootstrap sources can detect the dependencies.
        * the executable file created by spvmcc is cached.
        * Add -c|--config option to spvmcc command.
          The value is a config file that return SPVM::Builder::Config::Exe object.

        [NON BACKWORD COMPATIBLE CHANGES]
        * spvmcc -I option doesn't add "/SPVM" after the directory names.
        
0.9125  2021-01-19
        [FIX BUGS]
        * Fix the bug that clang is not detected.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove --ccflags, --lddlflags option of spvmcc
          because these config is done in SPVM::Builder::Config::Exe.
        * Remove extra_compiler_flags, extra_linker_flags from SPVM::Builder::Exe.
        * Rename module_name of SPVM::Builde::Exe to class_name.

0.9124  2021-01-19
        [CHANGES]
        * The path of native config file are decided from the native module name.
        * Simplify the cache logic to create precompile c source file.
        * Unicode module use own utf8proc library(spvm_utf8proc) instead of original utf8proc library.
        [FIX BUGS]
        * Fix the bug that spvmcc --force option is ignored in creating precompile c source.
        * Suppress Unicode module compile time warnings.
0.9123  2021-01-18
        [CHANGES]
        * SPMV standard modules and precompile source is compiled as gnu99 instead of c99
          because gnu99 is more widely assumed in the exsiting C libraries than c99.
        * new_cpp, new_cpp11 methods of SPVM::Builder::Config use the clang++ linker if the Perl itself was compiled by clang.
        
        [NON BACKWORD COMPATIBLE CHANGES]
        * Remove native/lib directory from the directories that libraries are searched for at runtime
          because generally libraries exists in the system, not the module sources.
        * Resoruce modules must be loaded as SPVM modules.

        [FIX BUGS]
        * Fix the bug that C++ native module can't find the symbol.
          The reason of this is 0.9122 "new_cpp, new_cpp11 methods of SPVM::Builder::Config 
          use the clang++ compiler if the Perl itself was compiled by clang."

0.9122  2021-01-17
        [CHANGES]
        * new_cpp, new_cpp11 methods of SPVM::Builder::Config use the linker that linked Perl itself.
        * new_cpp, new_cpp11 methods of SPVM::Builder::Config use the clang++ compiler if the Perl itself was compiled by clang.
        
        [FIX BUGS]
        * Fix the bug that C++ native API tests fail on FreeBSD.

0.9121  2021-01-15
        [CHANGES]
        * Improve the error messages that instance methods are called as class methods,
          and class methods are called as instance methods
        * Simplify the Makefile created by SPVM::Builder::Util::create_make_rule_native
          and SPVM::Builder::Util::create_make_rule_precompile
        [FIX BUGS]
        * Fix the bug that the current class syntax "&_foo" becomes a compilation error.
        * Fix the cache bug that when SPVM module file is updated, the shared library is not created.
        * Fix the test bug that copmile cache test fails.
0.9120  2021-01-14
        [CHANGES]
        * Native and precompile shared object files are cached.

0.9119  2021-01-14
        [CHANGES]
        * Suppress clang 12+ -Wcompound-token-split-by-macro warnings in perl.h when compiling SPVM.xs

        [NON BACKWORD COMPATIBLE CHANGES]
        * This is interface bug fix required. The effect is little.
          [Before]
          void* (*alloc_memory_block_zero)(SPVM_ENV* env, int64_t byte_size);
          
          [After]
          void* (*alloc_memory_block_zero)(SPVM_ENV* env, size_t byte_size);

        [FIX BUGS]
        * Fix pointer class test bugs.

0.9118  2021-01-13
        [CHANGES]
        * Add cc_each, ccflags_each methods to SPVM::Builder::Config.
        * Add new_gnu99 method to SPVM::Builder::Config.
        * Remove perllib $Config{bin} dependency of creating Windows DLL.
        * Improve resource not found messages.
        * Output build commands in build_shared_lib_dist method.
        * Don't create ar file in precompile.
        [FIX BUGS]
        * Fix the document that ccflags and ldflags of SPVM::Builder::Config default value is empty string.
          The right description is an array reference that has default values.
        * Fix the bug that SPVM::Builder::CC can't load resource include directories.
        * Fix the bug that mac output ar warnings.

0.9117  2021-01-12
        [CHANGES]
        * ar file don't contains static link files.
        * ar file don't contains SPVM module object file.
        * Add checking resource symbol duplication. SPVM depends on nm command.
        * Improve resource system. It resolve the depenedent resources,
          and become more safety adding symbol duplication checking and the depenent file created time checking.

0.9116  2021-01-11
        [FIX BUGS]
        * Fix the bugs that C++ code can't be compiled
        [CHANGES]
        * Add "ext" field of SPVM::Builder::Config again for the SPVM native source extension.

0.9115  2021-01-11
        [NON BACKWORD COMPATIBLE CHANGES]
        * Revert most of 0.9114 Changes
          
          Revert: Add file, file_optional, native_include_dir,
          native_src_dir native_lib_dir, native_bin_dir
          fields to SPVM::Builder::Config.
          
          Revert: Need file field new, new_c, new_c99, new_cpp, new_cpp11 of SPVM::Builder::Config
          
0.9114  2021-01-10
        [FIX BUGS]
        * new_c, new_c99, new_cpp, new_cpp11 of SPVM::Builder::Config pass
          arguments to new of SPVM::Builder::Config.
        [CHANGES]
        * Add file, file_optional, native_include_dir,
          native_src_dir native_lib_dir, native_bin_dir
          fields to SPVM::Builder::Config.
        [NON BACKWORD COMPATIBLE CHANGES]
        * Need file field new, new_c, new_c99, new_cpp, new_cpp11 of SPVM::Builder::Config
          [Now Runtime Exception]
          my $config = SPVM::Config->new;
          
          [New Code]
          my $config = SPVM::Config->new(file => __FILE__);

0.9113  2021-01-09
        [CHANGES]
        * Add "use" method to SPVM::Builder::Config. This method is the alias for "add_resources".
        * Remove "ext" field of SPVM::Builder::Config because source files was needed to be specifed.
        * Need Test::More 0.92+ to do tests.
        * Rename sources field of SPVM::Builder::Config to source_files.
        * Rename add_sources method of SPVM::Builder::Config to add_source_files.
        
0.9112  2021-01-07
        [BUGS]
        * Fix a unweaken memory leak bug.
        
0.9111  2021-01-07
        [CHANGES]
        * Improve compile error message "Can't locate ...". 
          [Before]
          Can't locate Foo/Bar.spvm in @INC ...
          
          [After]
          Can't locate Foo/Bar.spvm to load Foo::Bar class in @INC ...
        * Improve compile error message "... is different from". And this message is output only once.
          [Before]
          Class name "ClassNameDifferntFromModuleNameXXXXXXX" is different from
          the class name corresponding to the module file "TestCase::CompileError::Class::ClassNameDifferntFromModuleName"
          [After]
          Wrong class name "ClassNameDifferntFromModuleNameXXXXXXX".
          The class name must be "TestCase::CompileError::Class::ClassNameDifferntFromModuleName"

        [BUGS]
        * Fix the bugs that variable names can contain ":::".
        * Fix the bugs that the type conversion from multi numrci type to object type is allowed.
        * Fix the bugs that when class is not found in static method call, a segmentation fault occurs.

0.9110  2021-01-07
        [CHANGES]
        * Current class "cur->" is changed to "&"
          [Before]
          cur->sum(1, 2)
          
          [After]
          &sum(1, 2)

0.9109  2021-01-06
        [CHANGES]
        * SPVM is compiled as GNU99 instead of C99
          SPVM source codes is pure C99, but  is not pure C99.
          Some platforms can't compile SPVM.xs that contains perl.h as C99.

0.9108  2021-01-06
        [CHANGES]
        * SPVM::get_exception return SPVM::BlessedObject::String
        * SPVM::set_exception can receive a SPVM::BlessedObject::String object
        * SPVM::new_byte_array_from_string encode the string using utf8::encode instead of Encode::encode('UTF-8', ...)
        * Don't use hex floating point literal and %a specifier of sprintf
          because it seems that some compilers don't support this C99 syntax.
0.9107  2021-01-05
        [CHANGES]
        * Native API new_env call INIT blocks.
        * Add SPVM::Builder::Exe again. This is revert of 0.9019.

        [BUGS]
        * Fix string buffer memory allocate edge case bug.

0.9106  2021-01-04
        [BUGS]
        * Fix the memory blocks count in runtime environment.

0.9105  2021-01-03
        [CHANGES]
        * SPVM::get_memory_blocks_count and native api's get_memory_blocks_count return
          the count of memory blocks created by the runtime environment. This is revert of 0.9103

0.9104  2021-01-02
        [CHANGES]
        * SPVM gcc option is simplified. 

0.9103  2021-01-01
        [CHANGES]
        * Fix the bug that old string buffers of the compiler isn't freed when new memory is allocated.
        * SPVM::get_memory_blocks_count and native api's get_memory_blocks_count return
          all count of memory blocks created by the SPVM compiler and runtime.
        [BUG FIX]
        * Fix memory leaks of the compiler
        * Fix memory leaks of class variables
0.9102  2021-12-24
        [CHANGES]
        * Upgrads ppport.h to fix Perl 5.8.7 compilation errors.

0.9101  2021-12-24
        [CHANGES]
        * The argument of exchange API calling method support the conversion from Perl array reference to SPVM multi numeric array.

0.9021  2021-12-24
        [CHANGES]
        * Reference symbol is changed from & to *.

0.9020  2021-12-23
        [CHANGES]
        * Remove Windows library searching path from ldflags of SPVM::Builder::Config
        * Add exported_funcs field and add_exported_funcs method to SPVM::Builder::Config, and add the logic of adding exported functions.
        * Add get_src_dir, get_include_dir, get_lib_dir to SPVM::Builder::Config.
        * Create static library for SPVM natvie module
        * Static resource is linked instead of dynamic resource.
        * Remove function call syntax and function import syntax. You don't call static method without full qualified name.
          This is because SPVM after version 1.0 want to keep backword compatible when new keywords is added.
        * Add current package syntax "cur"
          You can call the class method using "cur" keyword
          class Foo {
            
            static method test : void () {
              # This means Foo->sum(1, 2)
              my $ret = cur->sum(1, 2);
            }

            static method sum : int ($num1 : int, $num2 : int) {
              return $num1 + $num2;
            }
          }
        * Add class alias syntax
          use Foo::Bar::Baz as FBB;
          
          FBB->new;
          
0.9019  2021-12-21
        [CHANGES]
        * Rename SPVM::Builder::Config's get_libs, set_libs, unshift_libs, push_libs method to get_runtime_libs, set_runtime_libs, unshift_runtime_libs, push_runtime_libs
          and don't add libraries to linker flags of linker.
        * remove SPVM::Builder::Exe and spvmcc command again because one executable that is portable and work correctly without function conflicts is impossible after long thinking.
          The implementation before removing is saved at the following branch.
          
          https://github.com/yuki-kimoto/SPVM/releases/tag/before_remove_exe_20211216
        
        * SPVM::Builder::Config "ccflags" default becomes empty string except for Windows. Windows is "-fPIC"
        * Remove delete_std and get_std of SPVM::Builder::Config
        * SPVM::Builder::CC->compile don't depend on Perl compiled environment.
        * add SPVM_CC_DEBUG enviroment variable to print SVPM::Builder::CC compile and link outputs to stderr.
        * Remove get_cccdlflags, set_cccdlflags, append_cccdlflags, prepend_cccdlflags of SPVM::Builder::Config
        * Remove get_archlibexp, set_archlibexp of SPVM::Builder::Config
        * remove get_shrpenv, and set_shrpenv. shrpenv config is not used when linking
        * SPVM::Builder::CC->link don't depend on Perl compiled environment as possible.
        * remove set_config and get_config of SPVM::Builder::Config
        * remove replace_all_config of SPVM::Builder::Config
        * to_hash of SPVM::Builder::Config return the content of SPVM::Builder::Config instead of ExtUtils::CBuilder config.
        * add search_lib_dirs_from_cc_info of SPVM::Builder::Config
        * add ext, cc, ccflags, include_dirs, ld, lddlflags, lib_dirs, runtime_lib_dirs, optimize,
          quiet, search_lib_dirs_cb, force_compile fields to SPVM::Config
        * remove set_ext, set_cc, set_ccflags, set_include_dirs, set_ld, set_lddlflags, set_lib_dirs, set_runtime_lib_dirs, set_optimize,
          set_quiet, set_search_lib_dirs_cb, set_force_compile of SPVM::Config
        * remove get_ext, get_cc, get_ccflags, get_include_dirs, get_ld, get_lddlflags, get_lib_dirs, get_runtime_lib_dirs, get_optimize,
          get_quiet, get_search_lib_dirs_cb, get_force_compile of SPVM::Config
        * remove unshift_lib_dirs, unshift_include_dirs, prepend_ccflags, prepend_lddlflags
        * remove prepend_ccflags, prepend_lddlflags
        * ccflags, lddlflags of SPVM::Builder::Config become an array reference
        * runtime dynamic libraries are loaded from lib_dirs of SPVM::Builder::Config of each class.
        * rename apeend_ccflags to add_ccflags, append_lddlflags to add_lddlflags
        * rename push_include_dirs to add_include_dirs, push_lib_dirs to add_lib_dirs, push_libs to add_libs, push_runtime_libs to add_libs
        * add_ccflags and add_lddlflags can receive list of SPVM::Builder::Config
        * remove unshift_lib_dirs, unshift_include_dirs of SPVM::Builder::Config
        * add add_libs to SPVM::Builder::Config
        * SPVM::Builder::Config->new supports default values
        * Add SPVM_CC_FORCE enviroment variables.
        * Rename force_compile field of SPVM::Builder::Config to force.
        * Add ld_optimize field of SPVM::Builder::Config.
        * Add libs field to SPVM::Builder::Config
        * Add add_static_libs and add_dynamic_libs methods to SPVM::Builder::Config
        * Rename lddlflags field to ldflags, add_lddlflags method to add_ldflags
        * remove runtime_libs filed field, add_runtime_libs method of SPVM::Builder::Config.
          The runtime linking is resolved at compile time using absolute path.

        * Add search_include_dirs_from_config_incpth, search_lib_dirs_from_config_libpth methods to SPVM::Builder::Config.
        * Add resources field and add add_resources method to SPVM::Builder::Config, and implement resouce system of SPVM::Builder::CC
        * A compile error raises an exception. A link error raises an exception.
        * Add sources field and add_sources method to SPVM::Builder::Config. Only specified source files are compiled.
        
        [BUG FIX]
        * add push_lib_dirs of SPVM::Builder::Config. This is documented but doesn't exist.

0.9018  2021-12-11
        [CHANGES]
        * Depends on ExtUtils::CBuilder for Perl 5.8
        
        [BUG FIXES]
        * Fix bugs that tests of SPVM fails in some old Perl version. 
0.9017  2021-12-11
        [CHANGES]
        * The parts of Makefile created by SPVM::Builder::Util::create_class_make_rule() become
          more compatible the Makefile created by ExtUtils::MakeMaker.
          This will maybe fix the fail of solaris make.
        
        [BUG FIXES]
        * Fix bugs that Fn->substr method is changed to Fn->methodstr by a mistake
        * Fix a bug that the return type of Fn->abs method was double. This become int type
        * Fix a bug that the return type of Fn->labs method was double. This become long type
        
0.9016  2021-12-08
        [CHANGES]
        * In Exchange API call method argument Perl refenrece to SPVM numeric reference convision,
          the Perl reference must be scalar reference which referenced value is non-ref scalar.
        * exchange api $string->to_string become croak if sv_utf8_docede fails.
        * exchange api $array->to_elemes in string[] set SPVM::Blessed::String object as the element.
        * add abs method to Fn module
        * add labs method to Fn module
        * add powi method to Fn module
        * add powl method to Fn module
        * remove SPVM::Math module from core. SPVM::Math is planed to be used as a CPAN module.
        * Support many OSs again. SPVM want to support OSs that Perl supports as possible.
        
        [BUGFIXES]
        * None
0.9015  2021-09-24
        [CHANGES]
        * Bool module become embdded in SPVM core source
        * rename Bool->true to Bool->TRUE
        * rename Bool->false to Bool->FALSE
        * add true keyword which means Bool->TRUE
        * add false keyword which menas Bool->FALSE
        * add bool context for Bool type.
          if (Bool->TRUE) { # run }
          if (Bool->FALSE) { # not run }

        [BUGFIXES]
        * None
0.9014  2021-09-21
        [CHANGES]
        * native api get_instance_method_id return -1 if the method is class method
        * native api get_class_method_id return -1 if the method is not class method
        * add native api get_instance_method_id_static
        
        [BUGFIXES]
        * None

0.9013  2021-09-14
        [CHANGES]
        * remove sub and self keyword and add method and static keyword. Sorry.
          [Before]
          sub foo : void  ($self : self) {}
          sub bar: void  () {}
          
          [After]
          method foo : void  () {}
          static method bar : void  () {}
        
        * rename native api get_method_id_by_object to get_instance_method_id
        * rename native api get_method_id to get_class_method_id
        * Native api method signature don't need self.
          [Before]
          "int(self,long)"
          [After]
          "int(long)
        * rename native api call_callback_method_by_name to call_instance_method_by_name
        * rename native api call_spvm_method_by_name to call_class_method_by_name
        * add native api call_class_method. This is alias for call_spvm_method
        * add native api call_instance_method. This is alias for call_spvm_method
        
        [BUGFIXES]
        * None

0.9012  2021-09-10
        [CHANGES]
        * Exchange API call method string arugment copy count is reduced
        * Remove SPVM::Unicode UTF-16 related methods because I concentrate UTF-8 and Unicode
        * The name of SPVM module must start SPVM::, otherwise a compile error occurs.
          For this, Many documents of tutorial, examples, etc are changed. Sorry.
        * If the name is package name which start with upper case and the name is not start "SPVM::",
          add "SPVM::" to the package name
        * If a packag variable access contains :: and start with $ + upper case, and the name is not start "$SPVM::",
          insert "SPVM::" to the package name after $
        * Improve error message when package name is different from the package name corresponding to the module file
        * use SPVM MODULE_NAME add "SPVM::" to the top of the module name if the module name does not t start with "SPVM::".
        * Perl package name "SPVM::Foo" become correspoinding to SPVM class name "Foo".
          This is big change because all SPVM::Foo in SPVM program must be rewriten to Foo. Sorry.
          However, short name is good. SPVM::Sort->foo becomes Sort->foo
        * create Fn module, remove NumberUtil, StringUtil, ArrayUtil modules. the funtions is moved to Fn module. Sorry.
          However, short name is good. Fn->join(',', ["abc", "de"])
        * package keyword is renamed to class. And all of the part of the methods and things which contains "package" is replaced to "class". Sorry
        * Static method concept is changed to Class method
        * Lexical Variable concept is changed to Local Variable for other language users.
        * Lexical Analysis concept is changed to Tokenizing
        * Native function prefix is changed to SPVM__ from SPNATIVE__. Sorry.
        * Precompile function prefix is changed to SPVMPRECOMPILE__ from SPPRECOMPILE.
        * SPVM::Builder::Exe target_class_name field is renamed to module_name
        
        [BUGFIXES]
        * None

0.9011  2021-08-31
        [CHANGES]
        * None
        
        [BUGFIXES]
        * Fix excnahge API any object return value bug

0.9010  2021-08-25
        [CHANGES]
        * improve SPVM::Document::ExchangeAPI
        * add SPVM::Bool module
        * add SPVM::BlessedObject::Array overloding array dereference
        
        [BUGFIXES]
        * None
        
0.9009 2021-06-29
  - Native API get_basic_type_id performance become O(1)
  - Native API get_field_id performance become O(1)
  - Native API get_package_var_id performance become O(1)
  - Native API get_method_id performance become O(1)
  
0.9008 2021-06-28
  - SPVM drop support OpenBSD because I can't fix OpenBSD bugs by myself
    http://matrix.cpantesters.org/?dist=SPVM%200.9006
  - SPVM drop support solaris because I can't fix make error by myself
    http://www.cpantesters.org/cpan/report/6b54513a-c10b-11eb-bc66-57723b537541
  - SPVM support only 64bit System
  - SPVM support only Windows 10+
  - Change The all internal subroutine word is changed to method
  - Change The all word of Subroutine is changed to Method
  - rename Native API call_sub to call_spvm_method
  - rename Native PAI call_sub_by_name to call_spvm_method_by_name
  - rename Native API get_sub_id to get_method_id
  - rename Native API get_sub_id_by_object to get_method_id_by_object
  - rename Native API call_poly_sub_by_name to call_callback_method_by_name
0.9007 2021-06-17
  - fix Mac OS warnings "ld: warning: directory not found for option" in precompile
0.9006 2021-06-11
  - fix array init {} bugs that {foo => SPVM::Int->new(5)} was segfault
0.9005 2021-05-27
  - add SPVM::Regex "." regular expression character.
  - add SPVM::Regex single line mode option "s"
  - add SPVM::Regex ascii mode and don't support \d, \D, \w, \W, \s, \S without ascii mode option
  - Fix SPVM::Math->pi and SPVM::Math->e tests. Values is compared as numbers instead of strings
0.9004 2021-05-26
  - remove escape charcter \b of string literal
  - add raw escape character of string literal
    \p
    \P
    \X
    \g
    \k
    \K
    \v
    \V
    \h
    \H
    \R
    \b
    \B
    \A
    \Z
    \z
    \G
    \N
    \1, \2, \3, \4, \5, \6, \7, \8, \9

0.9003 2021-05-21
  - add SPVM::StringUtil->hex method
  - rename SPVM::Regex->caps method to SPVM::Regex->captures
0.9002 2021-05-20
  - add SPVM::StringUtil->trim_ascii_space method
  - fix memory blocks count internal bugs
  - fix Windows unexpected native api memory bug about get_field_object. I don't know the reason, but it was maybe type problem.
0.9001 2021-05-11
  - remove SPVM::Time->strptime because this method is too complex as version 1.0 core module.
  - remove SPVM::Time->strftime because this method is too complex as version 1.0 core module.
  - add SPVM::Document::Benchmark. This document was on github pages and is moved to CPAN.
  - add SPVM::Document::Tutorial. This document was on github pages and is moved to CPAN.
  - add SPVM::Document::NativeAPI. This document was on github pages and is moved to CPAN.
  - add SPVM::Document::LanguageSpecification. This document was on github pages and is moved to CPAN.
0.0952 2021-05-10
  - fix PI and E tests again. This is fix the mistake of
    [0.0951] and
    [0.0950] - fix PI and E tests because in long double environment is different from SPVM and Perl.

0.0951 2021-05-07
  - add dump native api
  - add dump_raw native api
  - add dump operator
  - fix PI and E tests again. This is fix the mistake of
    [0.0950] - fix PI and E tests because in long double environment is different from SPVM and Perl.
0.0950 2021-05-06
  - fix SPVM::Math->expm1f bug that internally call expm1 instead of expm1f
  - fix SPVM::Math->floorf bug that internally call floor instead of floorf
  - fix SPVM::Math->log10f bug that internally call log10 instead of log10f
  - fix PI and E tests because in long double environment is different from SPVM and Perl 
0.0949 2021-04-30
  - remove SPVM::Sort. This is 0.0947 change, but I forgot to remove SPVM::Sort.
  - rename SPVM::Hash->newa to SPVM::Hash->new. Original SPVM::Hash->new is removed.
  - SPVM::ByteList->new can receive undef.
  - SPVM::ShortList->new can receive undef.
  - SPVM::IntList->new can receive undef.
  - SPVM::LongList->new can receive undef.
  - SPVM::FloatList->new can receive undef.
  - SPVM::DoubleList->new can receive undef.
  - SPVM::StringList->new can receive undef.
  - SPVM::List->new can receive undef.
  - SPVM::Hash->new can receive undef.
  - remove SPVM::StringBuffer->index
  - remove SPVM::StringBuffer->substr
  - remove SPVM::IO::Stdout
  - remove SPVM::IO::Stderr
  - SPVM::StringUtil->copy_string can receive undef
  - remove SPVM::StringBuffer->push_range
  - remove SPVM::StringBuffer->capacity
  - remove SPVM::StringBuffer->new_opt
  - SPVM::ByteList->resize added elements are set to 0 always
  - SPVM::ShortList->resize added elements are set to 0 always
  - SPVM::IntList->resize added elements are set to 0 always
  - SPVM::LongList->resize added elements are set to 0 always
  - SPVM::FloatList->resize added elements are set to 0 always
  - SPVM::DoubleList->resize added elements are set to 0 always
  - add SPVM::StringList->resize
  - add SPVM::StringBuffer->resize
  - remove SPVM::StringBuffer->clear
  - remove SPVM::StringBuffer->capacity
  - remove SPVM::StringBuffer->new_opt
0.0948 2021-04-28
  - remove SPVM::StringUtil->replace
  - remove SPVM::StringUtil->replace_all
  - remove SPVM::StringUtil->chomp_crlf
  - rename SPVM::StringUtil->chomp_lf to SPVM::StringUtil->chompr
  - rename the following SPVM::StringUtil methods
    isalnum to is_alnum
    isalpha to is_alpha
    isalpha to is_alpha
    iscntrl to is_cntrl
    isdigit to is_digit
    isgraph to is_graph
    islower to is_lower
    isprint to is_print
    isprint to is_print
    ispunct to is_punct
    isspace to is_space
    isupper to is_upper
    isxdigit to is_xdigit
    tolower to to_lower
    toupper to to_upper
    strtoi to to_int_with_base
    strtol to to_long_with_base
    strtof to to_float
    strtod to to_double
  - add SPVM::StringUtil->to_int
  - add SPVM::StringUtil->to_long
  - remove SPVM::ByteList->new_capacity
  - remove SPVM::ShortList->new_capacity
  - remove SPVM::IntList->new_capacity
  - remove SPVM::LongList->new_capacity
  - remove SPVM::FloatList->new_capacity
  - remove SPVM::DoubleList->new_capacity
  - remove SPVM::StringList->new_capacity
  - remove SPVM::List->new_capacity
  - remove SPVM::List->splice
  - remove SPVM::ByteList->capacity
  - remove SPVM::ShortList->capacity
  - remove SPVM::IntList->capacity
  - remove SPVM::LongList->capacity
  - remove SPVM::FloatList->capacity
  - remove SPVM::DoubleList->capacity
  - remove SPVM::StringList->capacity
  - remove SPVM::List->capacity
  - remove SPVM::ByteList->values
  - remove SPVM::ShortList->values
  - remove SPVM::IntList->values
  - remove SPVM::LongList->values
  - remove SPVM::FloatList->values
  - remove SPVM::DoubleList->values
  - remove SPVM::StringList->values
  - remove SPVM::List->values
  - revert [0.0940]add norw package variable descriptor
  - revert [0.0940]add norw field descriptor
  - revert [0.0940]rw become package variable declaration default
  - revert [0.0940]rw become field declaration default
  - add SPVM::ByteList->set_array
  - add SPVM::ShortList->set_array
  - add SPVM::IntList->set_array
  - add SPVM::LongList->set_array
  - add SPVM::FloatList->set_array
  - add SPVM::DoubleList->set_array
  - add SPVM::StringList->set_array
  - add SPVM::List->set_array
0.0947 2021-04-27
  - array equals methods return 1 if both arrays is undef. return 0 if only one one arrays is undef.
    equals_byte_array
    equals_short_array
    equals_int_array
    equals_long_array
    equals_float_array
    equals_double_array
    equals_string_array
    equals_object_array
  - rename SPVM::ArrayUtil->slice_byte to SPVM::ArrayUtil->copy_array_range_byte
  - rename SPVM::ArrayUtil->slice_short to SPVM::ArrayUtil->copy_array_range_short
  - rename SPVM::ArrayUtil->slice_int to SPVM::ArrayUtil->copy_array_range_int
  - rename SPVM::ArrayUtil->slice_long to SPVM::ArrayUtil->copy_array_range_long
  - rename SPVM::ArrayUtil->slice_float to SPVM::ArrayUtil->copy_array_range_float
  - rename SPVM::ArrayUtil->slice_double to SPVM::ArrayUtil->copy_array_range_double
  - rename SPVM::ArrayUtil->slice_string to SPVM::ArrayUtil->copy_array_range_string
  - rename SPVM::ArrayUtil->slice_object to SPVM::ArrayUtil->copy_array_range_object
  - fix bug that import subroutine is not checked the existance
  - rename SPVM::Sort->sortb to SPVM::Sort->sort_byte
  - rename SPVM::Sort->sorts to SPVM::Sort->sort_short
  - rename SPVM::Sort->sorti to SPVM::Sort->sort_int
  - rename SPVM::Sort->sortl to SPVM::Sort->sort_long
  - rename SPVM::Sort->sortf to SPVM::Sort->sort_float
  - rename SPVM::Sort->sortd to SPVM::Sort->sort_double
  - rename SPVM::Sort->sorto to SPVM::Sort->sort_object
  - move SPVM::Sort->sort_byte   to SPVM::ArrayUtil->sort_byte  
  - move SPVM::Sort->sort_short  to SPVM::ArrayUtil->sort_short 
  - move SPVM::Sort->sort_int    to SPVM::ArrayUtil->sort_int   
  - move SPVM::Sort->sort_long   to SPVM::ArrayUtil->sort_long  
  - move SPVM::Sort->sort_float  to SPVM::ArrayUtil->sort_float 
  - move SPVM::Sort->sort_double to SPVM::ArrayUtil->sort_double
  - move SPVM::Sort->sort_object to SPVM::ArrayUtil->sort_object
  - remove SPVM::Sort
  - add SPVM::ArrayUtil->sort_string
  - add SPVM::Comparator::String
  - remove SPVM::StringUtil->contains in favor of SPVM::StringUtil->index
0.0946 2021-04-23
  - Create SPVM::ArrayUtil module
  - move the following SPVM::Util methods to SPVM::ArrayUtil
    copy_object_array
    copy_byte_array
    copy_short_array
    copy_int_array
    copy_long_array
    copy_float_array
    copy_double_array
    equals_object_array
    copy_string_array
    equals_byte_array
    equals_short_array
    equals_int_array
    equals_long_array
    equals_float_array
    equals_double_array
    equals_string_array
    dump_byte_array
    dump_short_array
    dump_int_array
    dump_long_array
    dump_unsigned_byte_array
    dump_unsigned_short_array
    dump_unsigned_int_array
    dump_unsigned_long_array
    dump_float_array
    dump_double_array
    memcpy_byte
    memcpy_short
    memcpy_int
    memcpy_long
    memcpy_float
    memcpy_double
    memmove_byte
    memmove_short
    memmove_int
    memmove_long
    memmove_float
    memmove_double
    new_object_array_proto
    slice_byte
    slice_short
    slice_int
    slice_long
    slice_float
    slice_double
  - move the following SPVM::Util methods to SPVM::StringUtil
    split
    chomp_lf
    chomp_crlf
    copy_str
    index
    isalnum
    isalpha
    isblank
    iscntrl
    isdigit
    isgraph
    islower
    isprint
    ispunct
    isspace
    isupper
    isxdigit
    tolower
    toupper
    is_perl_space
    is_perl_word
    join
    lc
    lcfirst
    replace
    replace_all
    strtoi
    strtol
    strtof
    strtod
    uc
    ucfirst
    rindex
    contains
  - remove SPVM::Util->join_object in favor of SPVM::ArrayUtil->dump_object_array
  - add SPVM::ArrayUtil->dump_object_array
  - rename SPVM::ArrayUtil->copy_str to SPVM::ArrayUtil->copy_string
  - rename SPVM::Util to SPVM::NumberUtil
  - fix bug that le operator means lt.
  - in eq, ne, gt, ge, lt, le string comparison, undef is treated as most small value
    and these string comparison operators don't throw a exception.
  - add SPVM::ArrayUtil->dump_array_string
  - add SPVM::ArrayUtil->slice_array_string
  - SPVM::ArrayUtil->copy_byte_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_short_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_int_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_long_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_float_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_double_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_string_array return undef if the argument is undef.
  - SPVM::ArrayUtil->copy_object_array return undef if the argument is undef.
0.0945 2021-04-22
  - rename SPVM::Byte->val to SPVM::Byte->value
  - rename SPVM::Short->val to SPVM::Short->value
  - rename SPVM::Int->val to SPVM::Int->value
  - rename SPVM::Long->val to SPVM::Long->value
  - rename SPVM::Float->val to SPVM::Float->value
  - rename SPVM::Double->val to SPVM::Double->value
  - move SPVM::Util->PI to SPVM::Math->PI
  - move SPVM::Util->E to SPVM::Math->E
  - remove SPVM::Math->pi
  - move SPVM::Util->abs to SPVM::Math->abs
  - move SPVM::Util->labs to SPVM::Math->labs

0.0944 2021-04-21
  - Logical Operator become non-expression.
  - rename SPVM::Util->copy_barray to SPVM::Util->copy_byte_array
  - rename SPVM::Util->equals_barray to SPVM::Util->equals_byte_array
  - rename SPVM::Util->copy_sarray to SPVM::Util->copy_short_array
  - rename SPVM::Util->equals_sarray to SPVM::Util->equals_short_array
  - rename SPVM::Util->copy_iarray to SPVM::Util->copy_int_array
  - rename SPVM::Util->equals_iarray to SPVM::Util->equals_int_array
  - rename SPVM::Util->copy_larray to SPVM::Util->copy_long_array
  - rename SPVM::Util->equals_larray to SPVM::Util->equals_long_array
  - rename SPVM::Util->copy_farray to SPVM::Util->copy_float_array
  - rename SPVM::Util->equals_farray to SPVM::Util->equals_float_array
  - rename SPVM::Util->copy_darray to SPVM::Util->copy_double_array
  - rename SPVM::Util->equals_darray to SPVM::Util->equals_double_array
  - rename SPVM::Util->copy_strarray to SPVM::Util->copy_string_array
  - rename SPVM::Util->equals_strarray to SPVM::Util->equals_string_array
  - rename SPVM::Util->copy_oarray to SPVM::Util->copy_object_array
  - rename SPVM::Util->equals_oarray to SPVM::Util->equals_object_array
  - rename SPVM::Util->sliceb to SPVM::Util->slice_byte
  - rename SPVM::Util->slices to SPVM::Util->slice_short
  - rename SPVM::Util->slicei to SPVM::Util->slice_int
  - rename SPVM::Util->slicel to SPVM::Util->slice_long
  - rename SPVM::Util->slicef to SPVM::Util->slice_float
  - rename SPVM::Util->sliced to SPVM::Util->slice_double
  - rename SPVM::Util->sliceo to SPVM::Util->slice_object
  - remove SPVM::Util->reverseb
  - remove SPVM::Util->reverses
  - remove SPVM::Util->reversei
  - remove SPVM::Util->reversel
  - remove SPVM::Util->reversef
  - remove SPVM::Util->reversed
  - remove SPVM::Util->reverseo
  - rename SPVM::Util->memcpyb to SPVM::Util->memcpy_byte
  - rename SPVM::Util->memcpys to SPVM::Util->memcpy_short
  - rename SPVM::Util->memcpyi to SPVM::Util->memcpy_int
  - rename SPVM::Util->memcpyl to SPVM::Util->memcpy_long
  - rename SPVM::Util->memcpyf to SPVM::Util->memcpy_float
  - rename SPVM::Util->memcpyd to SPVM::Util->memcpy_double
  - rename SPVM::Util->memmoveb to SPVM::Util->memmove_byte
  - rename SPVM::Util->memmoves to SPVM::Util->memmove_short
  - rename SPVM::Util->memmovei to SPVM::Util->memmove_int
  - rename SPVM::Util->memmovel to SPVM::Util->memmove_long
  - rename SPVM::Util->memmovef to SPVM::Util->memmove_float
  - rename SPVM::Util->memmoved to SPVM::Util->memmove_double
  - remove SPVM::Util->joinb
  - remove SPVM::Util->joins
  - remove SPVM::Util->joini
  - remove SPVM::Util->joinl
  - remove SPVM::Util->joinf
  - remove SPVM::Util->joind
  - add SPVM::Util->dump_byte_array
  - add SPVM::Util->dump_short_array
  - add SPVM::Util->dump_int_array
  - add SPVM::Util->dump_long_array
  - add SPVM::Util->dump_float_array
  - add SPVM::Util->dump_double_array
  - add SPVM::Util->dump_unsigned_byte_array
  - add SPVM::Util->dump_unsigned_short_array
  - add SPVM::Util->dump_unsigned_int_array
  - add SPVM::Util->dump_unsigned_long_array
  - add SPVM::Util->UINT8_MAX
  - add SPVM::Util->UINT16_MAX
  - add SPVM::Util->UINT32_MAX
  - add SPVM::Util->UINT64_MAX
  - rename SPVM::ArrayUtil->dump_byte_array to SPVM::ArrayUtil->dump_array_byte
  - rename SPVM::ArrayUtil->dump_short_array to SPVM::ArrayUtil->dump_array_short
  - rename SPVM::ArrayUtil->dump_int_array to SPVM::ArrayUtil->dump_array_int
  - rename SPVM::ArrayUtil->dump_long_array to SPVM::ArrayUtil->dump_array_long
  - rename SPVM::ArrayUtil->dump_float_array to SPVM::ArrayUtil->dump_array_float
  - rename SPVM::ArrayUtil->dump_double_array to SPVM::ArrayUtil->dump_array_double
  - rename SPVM::ArrayUtil->dump_object_array to SPVM::ArrayUtil->dump_array_object
  - rename SPVM::ArrayUtil->dump_unsigned_byte_array to SPVM::ArrayUtil->dump_array_unsigned_byte
  - rename SPVM::ArrayUtil->dump_unsigned_short_array to SPVM::ArrayUtil->dump_array_unsigned_short
  - rename SPVM::ArrayUtil->dump_unsigned_int_array to SPVM::ArrayUtil->dump_array_unsigned_int
  - rename SPVM::ArrayUtil->dump_unsigned_long_array to SPVM::ArrayUtil->dump_array_unsigned_long
  - rename SPVM::ArrayUtil->copy_byte_array to SPVM::ArrayUtil->copy_array_byte
  - rename SPVM::ArrayUtil->copy_short_array to SPVM::ArrayUtil->copy_array_short
  - rename SPVM::ArrayUtil->copy_int_array to SPVM::ArrayUtil->copy_array_int
  - rename SPVM::ArrayUtil->copy_long_array to SPVM::ArrayUtil->copy_array_long
  - rename SPVM::ArrayUtil->copy_float_array to SPVM::ArrayUtil->copy_array_float
  - rename SPVM::ArrayUtil->copy_double_array to SPVM::ArrayUtil->copy_array_double
  - rename SPVM::ArrayUtil->copy_string_array to SPVM::ArrayUtil->copy_array_string
  - rename SPVM::ArrayUtil->copy_object_array to SPVM::ArrayUtil->copy_array_object
  - rename SPVM::ArrayUtil->equals_byte_array to SPVM::ArrayUtil->equals_array_byte
  - rename SPVM::ArrayUtil->equals_short_array to SPVM::ArrayUtil->equals_array_short
  - rename SPVM::ArrayUtil->equals_int_array to SPVM::ArrayUtil->equals_array_int
  - rename SPVM::ArrayUtil->equals_long_array to SPVM::ArrayUtil->equals_array_long
  - rename SPVM::ArrayUtil->equals_float_array to SPVM::ArrayUtil->equals_array_float
  - rename SPVM::ArrayUtil->equals_double_array to SPVM::ArrayUtil->equals_array_double
  - rename SPVM::ArrayUtil->equals_string_array to SPVM::ArrayUtil->equals_array_string
  - rename SPVM::ArrayUtil->equals_object_array to SPVM::ArrayUtil->equals_array_object
  - rename SPVM::ArrayUtil->new_object_array_proto to SPVM::ArrayUtil->new_array_proto

0.0943 2021-04-19
  - add <=> and cmp operator
  - add {} array init syntax
  - remove SPVM::Sort->sortstr
  - change the definition of the following SPVM::Sort functions.
    
    [Before]
    sub sortb : void ($nums : byte[])
    [After]

    [Before]
    sub sorts : void ($nums : short[])
    [After]
    sub sorts : void ($nums : short[], $offset : int, $length : int, $comparator : SPVM::Comparator::Short)

    [Before]
    sub sorti : void ($nums : int[])
    [After]
    sub sorti : void ($nums : int[], $offset : int, $length : int, $comparator : SPVM::Comparator::Int)

    [Before]
    [After]
    sub sortl : void ($nums : long[], $offset : int, $length : int, $comparator : SPVM::Comparator::Long)

    [Before]
    sub sub sortf : void ($nums : float[])
    [After]
    sub sub sortf : void ($nums : float[], $offset : int, $length : int, $comparator : SPVM::Comparator::Float)

    [Before]
    [After]
    sub sortd : void ($nums : double[], $offset : int, $length : int, $comparator : SPVM::Comparator::Double)

    [Before]
    sub sorto : void ($objs : oarray, $comparator : SPVM::Comparator::Object)
    [After]
    sub sorto : void ($objs : oarray, $offset : int, $length : int, $comparator : SPVM::Comparator::Object)
  - remove SPVM::Comparator
  - add SPVM::Comparator::Byte
  - add SPVM::Comparator::Short
  - add SPVM::Comparator::Int
  - add SPVM::Comparator::Long
  - add SPVM::Comparator::Float
  - add SPVM::Comparator::Double
  - add SPVM::Comparator::Object

0.0942 2021-04-15
  - add ref operator to get object type name
  - remove SPVM::Util->get_type_name. use ref operator instead of this.
0.0941 2021-04-14
  - add SPVM::Hash->newa again. argument become oarray type
  
    sub newa : SPVM::Hash ($key_values : oarray)
    
0.0940 2021-04-13
  - add norw package variable descriptor
  - add norw field descriptor
  - rw become package variable declaration default
  - rw become field declaration default
0.0939 2021-04-13
  - fix bug that oarray element can't assign undef
  - Change SPVM::List values type from object[] to oarray.
  - Change SPVM::List new definition
    [before]
    sub new : SPVM::List ($objects : object[])
    [after]
    sub new : SPVM::List ($objects : oarray)
  - Change SPVM::List new_len definition
    [before]
    sub new_len : SPVM::List ($length : int)
    [after]
    sub new_len : SPVM::List ($proto_array : oarray, $length : int)
  - Change SPVM::List new definition
    [before]
    sub to_array : object[] ($self : self)
    [after]
    sub to_array : oarray ($self : self)
  - add any_object_basic_type_id native api
0.0938 2021-04-09
  - fix bug that segfault occur in SPVM::Builder->build_shared_lib_dist in syntax error
  - add SPVM::List->resize method
  - add SPVM::ByteList->resize method
  - add SPVM::ShortList->resize method
  - add SPVM::IntList->resize method
  - add SPVM::LongList->resize method
  - add SPVM::FloatList->resize method
  - add SPVM::DoubleList->resize method
0.0937 2021-04-06
  - fix accessor get chain bug
0.0936 2021-04-03
  - fix bug that when variable argument is empty, compile error occur.
0.0935 2021-04-02
  - add the following native APIs
    new_object_by_name,
    new_pointer_by_name,
    set_field_byte_by_name,
    set_field_short_by_name,
    set_field_int_by_name,
    set_field_long_by_name,
    set_field_float_by_name,
    set_field_double_by_name,
    set_field_object_by_name,
    get_field_byte_by_name,
    get_field_short_by_name,
    get_field_int_by_name,
    get_field_long_by_name,
    get_field_float_by_name,
    get_field_double_by_name,
    get_field_object_by_name,
    set_package_var_byte_by_name,
    set_package_var_short_by_name,
    set_package_var_int_by_name,
    set_package_var_long_by_name,
    set_package_var_float_by_name,
    set_package_var_double_by_name,
    set_package_var_object_by_name,
    get_package_var_byte_by_name,
    get_package_var_short_by_name,
    get_package_var_int_by_name,
    get_package_var_long_by_name,
    get_package_var_float_by_name,
    get_package_var_double_by_name,
    get_package_var_object_by_name,
    call_sub_by_name,
    call_poly_sub_by_name,
    get_field_string_chars_by_name,
  - rename native api get_method_sub_id to get_sub_id_by_object
  - remove the following native macro
    SPVM_SUCCESS
    SPVM_EXCEPTION
    SPVM_NEW_OBJECT
    SPVM_NEW_POINTER
    SPVM_SET_PACKAGE_VAR_BYTE
    SPVM_SET_PACKAGE_VAR_SHORT
    SPVM_SET_PACKAGE_VAR_INT
    SPVM_SET_PACKAGE_VAR_LONG
    SPVM_SET_PACKAGE_VAR_FLOAT
    SPVM_SET_PACKAGE_VAR_DOUBLE
    SPVM_SET_PACKAGE_VAR_OBJECT
    SPVM_GET_PACKAGE_VAR_BYTE
    SPVM_GET_PACKAGE_VAR_SHORT
    SPVM_GET_PACKAGE_VAR_INT
    SPVM_GET_PACKAGE_VAR_LONG
    SPVM_GET_PACKAGE_VAR_INT
    SPVM_GET_PACKAGE_VAR_LONG
    SPVM_GET_PACKAGE_VAR_FLOAT
    SPVM_GET_PACKAGE_VAR_DOUBLE
    SPVM_GET_PACKAGE_VAR_OBJECT
    SPVM_SET_FIELD_BYTE
    SPVM_SET_FIELD_SHORT
    SPVM_SET_FIELD_INT
    SPVM_SET_FIELD_LONG
    SPVM_SET_FIELD_FLOAT
    SPVM_SET_FIELD_DOUBLE
    SPVM_SET_FIELD_OBJECT
    SPVM_GET_FIELD_BYTE
    SPVM_GET_FIELD_SHORT
    SPVM_GET_FIELD_INT
    SPVM_GET_FIELD_LONG
    SPVM_GET_FIELD_INT
    SPVM_GET_FIELD_LONG
    SPVM_GET_FIELD_FLOAT
    SPVM_GET_FIELD_DOUBLE
    SPVM_GET_FIELD_OBJECT

0.0934 2021-03-29
  - add Add unsigned format for sprintf. %lu and %u.
  - fix msys2 t/ext fail bug.
  - fix spvmcc bug that if module name contain ::, compile fail.
0.0933 2021-02-10
  - Don't support old OpenBSD before 6.8.
0.0932 2021-02-08
  - spvmcc -I option module path order become top
0.0931 2021-02-06
  - SPVM::Config extra_compiler_flag related methods is removed
    because I want to use extra_compiler_flag for spvmcc --ccflags option for future
  - SPVM::Config extra_linker_flag related methods is removed
    because I want to use extra_linker_flag for spvmcc --lddlflags option for future
  - implement spvmcc -O option
  - add --ccflags option to spvmcc
  - add --lddlflags option to spvmcc
  - add -f or --force option to spvmcc to compile and link force
  - package part name must be start with lower case
    (Invalid package name example) Foo::bar
    because I want to use internal anon sub package name for this. Foo::anonsub_11_23
  - fix bug anon sub code is not precompile if package have precompile descriptor
  - exception message become more perlish
    (Exception Message Example)
    TestCase::OArray->basic called at t/default/lib/TestCase/OArray.spvm line 54
  - add [CompileError] to compile error message
0.0930 2021-01-28
  - remove subroutine precompile descriptor. SPVM become only support whole package precompile.
  - add SPVM::Builder::Exe again. This is more stable before SPVM::Builder::Exe because compiler and runtime and SPVM module sources is embeded to exe files directry.
  - add spvmcc again
  - remove SPVM::Byte, SPVM::Short, SPVM::Int, SPVM::Long, SPVM::Float, SPVM::Double source codes in module directry
    because this is embded into compiler to run SPVM independent from moduel sources.
0.0929 2020-12-23
  - remove cproj, cprojf from SPVM::Math because windows and macOS have a bug that right value don't return.
  - internal anon sub package name become unique
  - Package name must be same as the package name corresponding to module file.
  - fix duplicated anon sub package name adding
0.0928 2020-12-09
  - add get_chars function to native api
  - rename native api new_string_raw to new_string_nolen_raw and the argument string must be const string.
  - rename native api new_string to new_string_nolen and the argument string must be const string.
  - rename native api new_string_len_raw to new_string_raw.
  - rename native api new_string_len to new_string.
0.0927 2020-11-20
  - add SPVM::BlessedObject::String corresponding to SPVM string type
  - If argument type is string, the value is non ref scalar, the value is coverted to string object
  - If argument type is strgin array, the element value is non ref scalar, the value is converted to string object
  - If return value is string object, the object itself is return.
0.0926 2020-11-06
  - add SPVM::new_byte_array_unsigned, SPVM::new_short_array_unsigned, SPVM::new_int_array_unsigned, SPVM::new_long_array_unsigned
0.0925 2020-11-05
  - [revert]SPVM::Hash->newa is rename to new, and original new is renamed to new_empty
    because SPVM::Hash->new(["foo" => SPVM::Int->new(4)]) is not good interface from Perl code.
    I feel the following is more good code because Perl code and SPVM code is exactly same.
      my $hash = SPVM::Hash->new;
      $hash->set_int(5);
  - add SPVM::Hash method
    set_byte, set_short, set_int, set_long, set_float, set_double, get_byte, get_short, get_int, get_long, get_float, get_double
  - SPVM::Hash->max_load_factor field become private
  - SPVM::Hash->set_max_load_factor method is removed
  - SPVM::Hash->load_factor method become private
  - SPVM::Hash->new_opt method become private
  - SPVM::Hash->murmur_hash become private
  - remove SPVM::Hash newa method to avoid complexity bugs in object type conversion
  - SPVM::StringBuffer->new_opt recieve SPVM::Hash object as options
  - SPVM::Hash->keys return the string object itself instead of the copies because string become immutable in latest release
  - remove SPVM::Hash->each method because I feel internal iterator is not good.
0.0924 2020-10-16
  - fix echange api string return value bug
  - add real string type. before this relese runtime string type is same as byte[] type, but in this release string type is string type in also runtime
  - implicite conversion from byte[] to string become occur compile error
  - type conversion from byte[] to string become copy instead of reference copy
  - type conversion from string[] to byte become copy instead of reference copy
0.0923 2020-10-14
  - add SPVM::BlessedObject::Array set method
  - add SPVM::BlessedObject::Array get method
  - add SPVM::ByteList->new_len
  - add SPVM::ShortList->new_len
  - add SPVM::IntList->new_len
  - add SPVM::LongList->new_len
  - add SPVM::FloatList->new_len
  - add SPVM::DoubleList->new_len
  - add SPVM::StringList->new_len
  - add SPVM::List->new_len
  - SPVM::ByteList->newa is rename to new, and original new is removed
  - SPVM::ShortList->newa is rename to new, and original new is removed
  - SPVM::IntList->newa is rename to new, and original new is removed
  - SPVM::LongList->newa is rename to new, and original new is removed
  - SPVM::FloatList->newa is rename to new, and original new is removed
  - SPVM::DoubleList->newa is rename to new, and original new is removed
  - SPVM::StringList->newa is rename to new, and original new is removed
  - SPVM::List->newa is rename to new, and original new is removed
  - SPVM::Hash->newa is rename to new, and original new is renamed to new_empty
  - fix SPVM::ByteList capacity bug
  - fix SPVM::ShortList capacity bug
  - fix SPVM::IntList capacity bug
  - fix SPVM::LongList capacity bug
  - fix SPVM::FloatList capacity bug
  - fix SPVM::DobuleList capacity bug
  - fix SPVM::List capacity bug
  - fix SPVM::StringList capacity bug
0.0922 2020-10-12
  - add SPVM::new_byte_array_len
  - add SPVM::new_short_array_len
  - add SPVM::new_int_array_len
  - add SPVM::new_long_array_len
  - add SPVM::new_float_array_len
  - add SPVM::new_double_array_len
  - add SPVM::new_object_array_len
0.0921 2020-10-12
  - fix bug that in exchange api, any object return type is wrong.
0.0920 2020-10-12
  - rename SPVM::get_length to SPVM::length
  - rename SPVM ExchangeAPI get_length to length
0.0919 2020-10-12
  - rename SPVM::ObjectList to SPVM::List because this is maybe Perl to SPVM offten used interface, short name is good.
0.0918 2020-10-07
  - SPVM::Util->rand is renamed to crand because perl rand is different from C rand.
  - add SPVM::Util->rand. This is same as Perl rand(0 <= random_number < 1)
  - fix anon subroutine redefine warnings.
0.0917 2020-10-06
  - fix bug that when a module contains multi packages, Perl Package is not created for after seconds packages
0.0916 2020-10-05
  - SPVM::Util->rand function don't need argument
  - add SPVM::Util->srand static method
  - remove SPVM::Util->random static method
  - add SPVM::Util->RAND_MAX static method
0.0915 2020-10-05
  - add precompile package descriptor
0.0914 2020-09-26
  - Class method is renamed to Static method. This is only SPVM document changing.
  - Matrix modules is removed from SPVM core, and moved to SPVM::AI::Util of CPAN module.
  - Big array test become private tests because not understandable memory error occured in some environment.
0.0913 2020-09-23
  - add SPVM::Matrix::Util
  - SPVM::Matrix::Float methods is moved to SPVM::Matrix::Util
  - SPVM::Matrix::Double methods is moved to SPVM::Matrix::Util
0.0912 2020-09-14
  - rename SPVM::Complex_2d x to re
  - rename SPVM::Complex_2d y to im
  - rename SPVM::Complex_2f x to re
  - rename SPVM::Complex_2f y to im
  - rename SPVM::Matrix::Double col to columns_length
  - rename SPVM::Matrix::Double row to rows_length
  - rename SPVM::Matrix::Float col to columns_length
  - rename SPVM::Matrix::Float row to rows_length
  
0.0911 2020-09-04
  - add complex functions to SPVM::Math
  
    native sub cacos : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub cacosf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub casin : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub casinf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub catan : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub catanf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub ccos : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub ccosf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub csin : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub csinf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub ctan : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub ctanf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub cacosh : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub cacoshf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub casinh : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub casinhf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub catanh : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub catanhf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub ccosh : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub ccoshf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub csinh : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub csinhf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub ctanh : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub ctanhf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub cexp : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub cexpf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub clog : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub clogf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub cabs : double ($z : SPVM::Complex_2d);
    native sub cabsf : float ($z : SPVM::Complex_2f);

    native sub cpow : SPVM::Complex_2d ($z1 : SPVM::Complex_2d, $z2 : SPVM::Complex_2d);
    native sub cpowf : SPVM::Complex_2f ($z1 : SPVM::Complex_2f, $z2 : SPVM::Complex_2f);

    native sub csqrt : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub csqrtf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub carg : double ($z : SPVM::Complex_2d);
    native sub cargf : float ($z : SPVM::Complex_2f);

    native sub conj : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub conjf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

    native sub cproj : SPVM::Complex_2d ($z : SPVM::Complex_2d);
    native sub cprojf : SPVM::Complex_2f ($z : SPVM::Complex_2f);

  - Fix bug that not support Alpine Linux
  
  - SPVM::Math->pi become constant value.
0.0910 2020-08-31
  - add new_c method to SPVM::Builder::Config
  - add new_cpp11 method to SPVM::Builder::Config
  - fix C++ SPVM_DIE type conversion bug
0.0909 2020-08-26
  - remove SPVM::IO::File, SPVM::IO::File::Handle because File I/O is a little complex for SPVM project and has many bugs.
  - add complex examples
  - remove no needed module documents
0.0908 2020-08-20
  - add complex, complexf to SPVM::Math
  - move complex function from SPVM::Util to SPVM::Math
  - remove complex int, long complex functions
  - remove complex absolute, conjunction functions
  - Not support Alpine Linux because Alpine Linux tests fail in current SPVM
  - precompile C source code floating point constant become hex expression
0.0907 2020-08-16
  - add caddi, caddl, caddf, caddd to SPVM::Util
  - add csubi, csubl, csubf, csubd to SPVM::Util
  - add cmuli, cmull, cmulf, cmuld to SPVM::Util
  - add cdivi, cdivl, cdivf, cdivd to SPVM::Util
  - add cscamuli, cscamull, cscamulf, cscamuld to SPVM::Util
  - add cabsi, cabsl, cabsf, cabsd to SPVM::Util
  - add cconi, cconl, cconf, ccond to SPVM::Util
0.0906 2020-08-10
  - add add,sub,scamul,mul,new_ident,new_zero method to SPVM::Matrix::* class.
0.0905 2020-08-08
  - remove SPVM::NDArray and related modules because SPVM::NDArray is too big and complex for SPVM Core Modules.
  - add SPVM::Matrix related modules.
0.0904 2020-07-30
  - fix bug that segfault occur when new a package which don't have subroutines
0.0903 2020-07-17
  - fix big size array tests
0.0902 2020-07-17
  - fix array big size test bugs
  - change Perl version requirement from v5.10 to v5.8.7
0.0901 2020-07-15
  - add SPVM::get_length function
  - add SPVM::BlessedObject::get_length
  - SPVM Native API env->new_env return NULL if this method don't alloc memory
  - SPVM Native API env->call_sub set exception if this method alloc memory for call stack
  - SPVM Native API env->push_mortal return 1 if this method alloc memory for mortal stack
  - SPVM Native API env->alloc_memory_block_zero return NULL if this method alloc memory
  - SPVM Native API env->dec_ref_count become not exit at invalid status
  - SPVM Native API env->weaken return 1 if memory allocation fail
0.09 2020-07-13
  - env is created once before runtime
0.0710 2020-07-10
  - improve compile internal logic effective
  - skip the file which not have specified extension in Foo.native/src directory
0.0709 2020-07-10
  - BIGIN keyword is renamed to INIT because the process is just before runtime.
  - runtime internal is clenup and simplified. runtime and constant_pool structure is removed.
  - add memory_blocks_count field to SPVM_ENV
  - file name \ is replaced to /
  - remove SPVM::Math->FP_NORMAL, SPVM::Math->FP_SUBNORMAL, SPVM::Math->isnormal, SPVM::Math->isnormalf because it is not portable Windows and Linux.
  - use C99 llround, llroundd in SPVM::Math->lround, SPVM::Math->lroundf
  - fix bug that print and warn can't receive byte[] type
0.0708 2020-07-06
  - SPVM don't need the following manually initialization in Perl script because SPVM is compiled at each time to call import method.
      # Don't needed the following statement
      UNITCHECK { SPVM::init() }

0.0707 2020-07-06
  - rename SPVM::Builder::Config::add_include_dirs to unshift_include_dirs
  - add SPVM::Builder::Config::push_include_dirs
  - rename SPVM::Builder::Config::add_lib_dirs to unshift_lib_dirs
  - add SPVM::Builder::Config::push_lib_dirs
  - rename SPVM::Builder::Config::use_lib to unshift_libs
  - add SPVM::Builder::Config::push_libs
  - rename SPVM::Builder::Config::add_extra_compiler_flags to append_extra_compiler_flags
  - add SPVM::Builder::Config::prepend_extra_compiler_flags
  - rename SPVM::Builder::Config::add_extra_linker_flags to append_extra_linker_flags
  - rename SPVM::Builder::Config::add_ccflags to append_ccflags
  - rename SPVM::Builder::Config::add_lddlflags to append_lddlflags
  - add SPVM::Builder::Config::prepend_extra_linker_flags
  - add SPVM::Builder::Config::prepend_ccflags
  - add SPVM::Builder::Config::prepend_lddlflags
  - add SPVM::Builder::Config::get_cccdlflags
  - add SPVM::Builder::Config::set_cccdlflags
  - add SPVM::Builder::Config::append_cccdlflags
  - add SPVM::Builder::Config::prepend_cccdlflags
  - add SPVM::Builder::Config::get_archlibexp
  - add SPVM::Builder::Config::set_archlibexp
  - add SPVM::Builder::Config::get_shrpenv
  - add SPVM::Builder::Config::set_shrpenv

0.0706 2020-06-29
  - SPVM need manually initialization in Perl script because SPVM is not compiled some environment require, do, Mojo morbo, Mojo hypnotoad, mod_perl, etc
      UNITCHECK { SPVM::init() }
  - Increased Perl version requirement to 5.10.0 because UNITCHECK is needed for SPVM.
0.0705 2020-06-28
  - remove SPVM::Builder::quiet method
  - SPVM::Builder::Config quiet field default become 1
  - add get_lib_dirs to SPVM::Builder::Config
  - add set_lib_dirs to SPVM::Builder::Config
  - add add_lib_dirs to SPVM::Builder::Config
  - remove -L<lib_dir> from lddlflags and add to lib_dir field
  - lib_dir values is added before extra_linker_flags
  - rename SPVM::Builder::Config::add_include_dir to add_include_dirs
  - renmae SPVM::Builder::Config::add_lib_dir to add_lib_dirs
  - add_include_dirs become add arguments to first of elements.
  - SPVM::Builder::Config::add_lib_dirs become add arguments to first of elements.
  - SPVM::Builder::Config::add_libs become add arguments to first of elements.
  - rename  SPVM::Builder::Config::add_libs to use_lib, and library is added after last element

0.0704 2020-06-26
  - rename SPVM::Builder::Config::set_no_cache to set_force_compile
  - rename SPVM::Builder::Config::get_no_cache to get_force_compile
  - add native source dependency cache system
0.0703 2020-06-24
  - fixed broken test by using different perl version
0.0702 2020-06-24
  - add document of SPVM::Builder::Config::add_extra_compiler_flags
  - add document of SPVM::Builder::Config::add_extra_linker_flags
  - add document of SPVM::Builder::Config::set_extra_compiler_flags
  - add document of SPVM::Builder::Config::get_extra_compiler_flags
  - add document of SPVM::Builder::Config::set_extra_linker_flags
  - add document of SPVM::Builder::Config::get_extra_linker_flags
  - add SPVM::Builder::Config::set_include_dirs
  - add SPVM::Builder::Config::get_include_dirs
  - add SPVM::Builder::Config::add_include_dirs
  - add set_no_cache and get_no_cache
  - remove set_cache and get_cache
  - Support native source code and include files
    
    Foo.native/include
    Foo.native/src
  - Improve native include file and source file compile condition
  
0.0701 2020-02-19
  - add SPVM::NDArray::Byte
  - add SPVM::NDArray::Short
  - add SPVM::NDArray::Int
  - add SPVM::NDArray::Long
  - add SPVM::NDArray::Float
  - add SPVM::NDArray::Double
  - add SPVM::NDArray::String
  - fix module load bug
  - change SPVM::Complex_2x(x is b, s, i, l, f, and d) field name re to x, im to y, 
  - add SPVM::Quaternion_4x((x is b, s, i, l, f, and d).
  - add SPVM::NDArray::ComplexX(X is Byte, Short, Int, Long, Float, Double)
  - add SPVM::NDArray::QuaternionX(X is Byte, Short, Int, Long, Float, Double)
  - remove complex operation(+, -, * , /)
  - don't load SPVM::Complex_2f, SPVM::Complex_2d by default
  - remove complex function in SPVM::Util
0.07 2020-01-30
  - remove fileno, set_binmode methods because file nomber is not portable.
  - add warn and print empty string and undef spec
  - rename SPVM::EqualityChecker::Address to SPVM::EqualityChecker::SameObject]
  - SPVM::IO::File open mode is changed to <, >, >>, +<, +>, +>>
  - add SPVM::IO::File unlink function
  - add SPVM::IO::File rename function
  - remove SPVM::IO::File putc
  - remove SPVM::IO::File write
  - change native api macro functions SPVM_GET_xxx to
    #define SPVM_GET_FIELD_BYTE(env, obj, package_name, sub_name, value_address, file, line)
    #define SPVM_GET_FIELD_SHORT(env, obj, package_name, sub_name, value_address, file, line)
    #define SPVM_GET_FIELD_INT(env, obj, package_name, sub_name, value_address, file, line)
    #define SPVM_GET_FIELD_LONG(env, obj, package_name, sub_name, value_address, file, line)
    #define SPVM_GET_FIELD_FLOAT(env, obj, package_name, sub_name, value_address, file, line)
    #define SPVM_GET_FIELD_DOUBLE(env, obj, package_name, sub_name, value_address, file, line)
    #define SPVM_GET_FIELD_OBJECT(env, obj, package_name, sub_name, signature, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_BYTE(env, package_name, package_var_name, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_SHORT(env, package_name, package_var_name, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_INT(env, package_name, package_var_name, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_LONG(env, package_name, package_var_name, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_FLOAT(env, package_name, package_var_name, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_DOUBLE(env, package_name, package_var_name, value_address, file, line)
    #define SPVM_GET_PACKAGE_VAR_OBJECT(env, package_name, package_var_name, signature, value_address, file, line)
  - change native api macro functions SPVM_NEW_POINTER to
    SPVM_NEW_POINTER(env, package_name, pointer, object_address, file, line)
  - change native api macro functions SPVM_NEW_OBJECT to
    SPVM_NEW_OBJECT(env, package_name, object_address, file, line)
  - remove typedef in spvm_native.h
    typedef int8_t SPVM_VALUE_byte;
    typedef int16_t SPVM_VALUE_short;
    typedef int32_t SPVM_VALUE_int;
    typedef int64_t SPVM_VALUE_long;
    typedef float SPVM_VALUE_float;
    typedef double SPVM_VALUE_double;
    typedef void* SPVM_VALUE_object;

0.0445 2020-01-07
  - Web and Network module is separated to separate SPVM::Webkit to https://github.com/yuki-kimoto/SPVM-Webkit
  - remove SPVM::Builder::Exe and spvmcc because this logic is planed to separate to outer module after version 1.0.
  - SPVM_BUILD_DIR environment variable must be set for precompile and native subroutine in runtime
0.0444 2019-12-25
  - remove SPVM::Errno for portability
  - allow last camma in sub names, sub routine arguments definition
  - remove no needed SPVM::IO::File::EOF
  - rename SPVM::FileHandle to SPVM::IO::FileHandle
  - rename chompr to chomp_lf
  - add chomp_crlf
  - add SPVM::IO::Stdout
  - add SPVM::IO::Stderr
  - rename native and exchange api new_barray to new_byte_array
  - rename native and exchange api new_sarray to new_short_array
  - rename native and exchange api new_iarray to new_int_array
  - rename native and exchange api new_larray to new_long_array
  - rename native and exchange api new_farray to new_float_array
  - rename native and exchange api new_darray to new_double_array
  - rename native and exchange api new_oarray to new_object_array
  - rename native and exchange api new_marray to new_muldim_array
  - rename native and exchange api new_varray to new_mulnum_array
  - allow Foo contains use Foo.
  - print become stateiment instead of function
  - rename SPVM::IO::Select to SPVM::HTTP::Select, SPVM::IO::ClientSocketTCP to SPVM::HTTP::ClientSocketTCP
0.0443 2019-11-08
  - warn become keyword and add file and line number to the last of the message.
  - rename many Native APIs
0.0442 2019-10-21
  - add ctype.h function to SPVM::CORE
    isalnum
    isalpha
    isblank
    iscntrl
    isdigit
    isgraph
    islower
    isprint
    ispunct
    isspace
    isupper
    isxdigi
    tolower
    toupper
  - add SPVM::CORE random method
  - move strerror to SPVM::Errno
  - strerror become thread safe
  - Windows has no SIGPIPE
  
0.0441 2019-10-11
  - add pi method to SPVM::Math
  - cleanup SPVM::Unicode. Many methods is remaned.
  - cleanup SPVM::JSON. Many options is removed.
  - cleanup SPVM::Regex.
  - SPVM::Regex::caps method return captured string array.
  - SPVM::Regex::remove match_end method
  - add SPVM::Regex::match_length method
  - SPVM::Regex::replace method is separated to replace and replace_cb
  - SPVM::Regex::replace_all method is separated to replace_all and replace_all_cb
  - SPVM::Regex::match_offset is merged to SPVM::Regex::match
  - remove call_sub_depth and remove deep recursion check.
  - rename chomp to chompr
  - renmae complex_array to complex_darray
  - rename complex to complexd
  - move SPVM::CORE::copy_oarray to SPVM::Util::copy_oarray.
  - add SPVM::Cloner
  - SPVM::Util::copy_oarray do deep clone using SPVM::Cloner.
  - SPVM::Stringer argument change ($self : self) to ($self : self, $obj : object)
  - add SPVM::Regex::Replacer and use this in SPVM::Regex::replace_cb and SPVM::Regex::replace_all_cb method
  - subroutine belongging to package with callback_t descriptor must be anon subroutine.
  - add SPVM::EqualityChecker
  - add SPVM::EqualityChecker::Address
  - SPVM::CORE::equals_oarray is moved to SPVM::Util and recieve SPVM::EqualityChecker as third argument
0.0440 2019-09-06
  - Rename SPVM::Data to SPVM::BlessedObject
  - Rename SPVM::Data::Array to SPVM::BlessedObject::Array
  - Rename SPVM::Data::Package to SPVM::BlessedObject::Package
  - remove SPVM::Util->split 3rd argument
  - rename SPVM::Time->mktime to SPVM::Time->timelocal
  - fix SPVM::Regex character class negation bug
  - fix SPVM::Regex * capture bugs
  - SPVM::Regex caps start index become 0
  - remove to_iarray and to_strarray from SPVM::List
  - rename SPVM::List to SPVM::ObjectList
  - rename SPVM::ObjectList::new_with_capacity to new_capacity
  - add SPVM::ByteList::new_capacity
  - add SPVM::ShortList::new_capacity
  - add SPVM::IntList::new_capacity
  - add SPVM::LongList::new_capacity
  - add SPVM::FloatList::new_capacity
  - add SPVM::DoubleList::new_capacity
  - add SPVM::StringList::new_capacity
  - add SPVM::ByteList::capacity
  - add SPVM::ShortList::capacity
  - add SPVM::IntList::capacity
  - add SPVM::LongList::capacity
  - add SPVM::FloatList::capacity
  - add SPVM::DoubleList::capacity
  - add SPVM::StringList::capacity
  - add SPVM::ObjectList::capacity
  - add insert, remove method to SPVM::ByteList, SPVM::ShortList, SPVM::IntList, SPVM::LongList, SPVM::FloatList, SPVM::DoubleList, SPVM::StringList, SPVM::ObjectList
  
0.0439 2019-08-05
  - rename runtime_type to runtime_type_category
  - fix IO::Socket connect with IP address bug
  - cleanup SPVM::MIME::Base64 interface
      package SPVM::MIME::Base64 {
        sub new : SPVM::MIME::Base64 () {
          return new SPVM::MIME::Base64;
        }
        
        native sub encode : string ($self : self, $string : string);
        native sub decode : string ($self : self, $string : string);
      }
  - refactoring SPVM::StringBuffer
  - rename SPVM::IO::Socket to SPVM::IO::ClientSocketTCP
0.0438 2019-06-22
  - add SPVM::CORE::isdigit function
  - add SPVM::CORE::ispspace function
  - add SPVM::CORE::ispword function
  - fix while condition my memmory id wrong bug
  - fix "aaa\\" can't parsing bug
  - allow "aaa$" in string literal
  - support variable expansion field access, array constant index access, dereference, exception variable, package variable
  - \r\n is converted to \n in source code parsing
  - \r is converted to \n in source code parsing
  - support private enum
      private enum {
        ONE,
        TOW
      }
  - fix multi line string literal line number bug
0.0437 2019-06-10
  - rename SPVM::List->new_with_array to newa
  - rename SPVM::Hash->new_with_array to newa
  - rename SPVM::ByteList->new_with_array to newa
  - rename SPVM::ShortList->new_with_array to newa
  - rename SPVM::IntList->new_with_array to newa
  - rename SPVM::LongList->new_with_array to newa
  - rename SPVM::FloatList->new_with_array to newa
  - rename SPVM::DoubleList->new_with_array to newa
  - remove SPVM::Hash->new_with_capacity
  - add SPVM::Hash->new_opt
  - add SPVM::Util;
  - move SPVM::CORE::joino to SPVM::Util
  - move SPVM::CORE::split to SPVM::Util
  - add SPVM::Sort;
  - move SPVM::CORE::sortb, sorts, sorti, sortl, sortf, sortd, sorto to SPVM::Sort
  - If SPVM::call_sub argument is array of any object and element is non-ref scalar, it is encoded to UTF-8 and converted to byte[]
  - add SPVM::Unistd
  - move SPVM::CORE::sleep to SPVM::Unistd
  - fix siwtch and for block bug. 
  - remove SPVM::hash function
  - Last statement of case block must be break statement
  - allow byte and short value to place if condition
0.0436 2019-06-06
  - allow switch case byte constant. byte constant is converted to int constant.
  - add $ to string escape character
  - fix switch no default statement bug
  - case statement need block if your want to write statements.
  - default statement need block if your want to write statements.
  - switch statement only have case stetement and last of default statement
  - add break statement to escape from switch block, and last is only used to escape from loop block
  - Try to show NA in CPAN testers again
    In Makefile.PL, add the following lines
    warn "SPVM don't support NetBSD 6, 5, 4, 3, 2, 1";
    die "OS unsupported\n";

0.0435 2019-05-24
  - Try to show NA in CPAN testers
  - rename value_t package descriptor to mulnum_t
  - chomp return value instead of replacing argument string
  - remove utf8proc dependency of SPVM core
0.0434 2019-05-21
  - add  SPVM::StringList
  - remove SPVM::list
  - In any object array argument of SPVM::call_sub, array reference is converted to any object array
    
      SPVM::List->newa([SPVM::Int->new(1), SPVM::Double->new(2.5), undef])
  - Fix value fields 16 length bug.
  - add complex double and float operation +, -, *, /
  - rename new_dcomplex to complex
  - rename new_fcomplex to complexf
  - add SPVM::Unicode::uchar, u8, u16
  - rename SPVM::Build::Config::new_default to new_c99
  - fix Windows MinGW compile bugs
  - remove SPVM::Time::Moment, SPVM::Time::Format
  - remove getenv for Windows compatibility
  - fix winsocket bugs and exe bugs
0.0433 2019-05-08
  - Change IO::File::write, IO::Socket::write to 
      sub write : int ($self : self, $buffer : string, $legnth : int);
  - add fileno to SPVM::IO::Socket
  - add SPVM::IO::Select
  - remove SPVM::set_exception_undef
  - add SPVM::set_exception
  - add SPVM::exception
  - add shutdown, close to IO::Socket
  - add SPVM::ByteList, SPVM::ShortList, SPVM::IntList, SPVM::LongList, SPVM::FloatList, SPVM::DoubleList
  - remove SPVM::CORE::list function
  - rename memcpy to memcpyb
  - rename memmove to memmoveb
  - add memcpys, memcpyi, memcpyl, memcpyf, memcpyd
  - add memmoves, memmovei, memmovel, memmovef, memmoved
0.0432 2019-04-29
  - Allow lower case package variable name and allow upper case lexical variable name
    This is same implementation as Perl
0.0431 2019-04-27
  - move time function to SPVM::Time module
    because time module need to define _XOPEN_SOURCE for thread safe portability on unix/linux and Windows/minGW
  - add Time::localtime, Time::gmtime
  - add #define _XOPEN_SOURCE if needed
  - add strftime, strptime, mktime, timegm to SPVM::Time
  - remove fread, fwrite, fopen ,fclose, fseek, fgets, fgets_chomp, slurp_file. Thease functions is moved to SPVM::IO::File
  - implement SPVM::IO::File
  - add chomp function
  - remove gets_chomp
  - rename gets to readline
0.0430 2019-04-24
  - add SPVM::hash function
  - add SPVM::list function
  - fix any object return value bug
0.0429 2019-04-23
  - LICENSE is changed from MIT to same one as Perl.
    because SPVM is cpan module and SPVM want to use glibc code.
  - add rand function
  - SPVM::call_sub can receive decoded string
  - add stringify overload to SPVM::Data::Array
  - SPVM::call_sub can receive numeric array
  - SPVM::call_sub can receive string array
  - add to_strs to SPVM::Data::Array
0.0428 2019-04-22
  - rename new_list to list
  - rename new_hash to hash
  - add contains function
  - add index function
  - add memcpy function
  - add memmove function
  - add replace function
  - add replace_all function
  - fix native distribution make dependency bugs
  - fix env->pkgvar_id segfault bugs
  - rename SPVM::Socket to SPVM::IO::Socket
  - add SPVM_BFIELD macro
  - add SPVM_SFIELD macro
  - add SPVM_IFIELD macro
  - add SPVM_LFIELD macro
  - add SPVM_FFIELD macro
  - add SPVM_DFIELD macro
  - add SPVM_OFIELD macro
  - add SPVM_SET_BFIELD macro
  - add SPVM_SET_SFIELD macro
  - add SPVM_SET_IFIELD macro
  - add SPVM_SET_LFIELD macro
  - add SPVM_SET_FFIELD macro
  - add SPVM_SET_DFIELD macro
  - add SPVM_SET_OFIELD macro
  - add SPVM_BPKGVAR macro
  - add SPVM_SPKGVAR macro
  - add SPVM_IPKGVAR macro
  - add SPVM_LPKGVAR macro
  - add SPVM_FPKGVAR macro
  - add SPVM_DPKGVAR macro
  - add SPVM_OPKGVAR macro
  - add SPVM_SET_BPKGVAR macro
  - add SPVM_SET_SPKGVAR macro
  - add SPVM_SET_IPKGVAR macro
  - add SPVM_SET_LPKGVAR macro
  - add SPVM_SET_FPKGVAR macro
  - add SPVM_SET_DPKGVAR macro
  - add SPVM_SET_OPKGVAR macro
  - add lc, uc, lcfirst, ucfirst functions
  - rename interface_t to callback_t
0.0427 2019-04-17
  - add getenv function
  - add SPVM::Errno module
  - Errno tests become more portable
  - add strerror function
0.0426 2019-04-15
  - --no-as-needed is not portable. so I remove it again.
  - Create SPVM::Math module and math functions is moved to SPVM::Math.
0.0425 2019-04-12
  - add dl_error message
  - add -Wl,--no-as-needed for newer Ubuntu.
0.0424 2019-04-09
  - add get_ext to SPVM::Builder::Config
  - add set_ext to SPVM::Builder::Config
  - config file is required always in native
  - source extension become always one
  - If config file modified time is newer than object file, compile is done
  - fix FreeBSD getc bug. getc is replaced with fgetc
0.0423 2019-04-08
  - SPVM_DIE don't need to write "at %s line %d"
0.0422 2019-04-06
  - rename croak keyword to die
  - rename cache of SPVM::Builder::Config to get_cache
  - rename quiet of SPVM::Builder::Config to get_quiet
  - rename SPVM_CROAK macro to SPVM_DIE
  - SPVM_DIE can receive sprintf format
      
      SPVM_DIE("Hello %s at %s line %d", "foo", "bar.c", __LINE__);
  - dependency of dll is detected automatically
0.0421 2019-04-05
  - add quiet to SPVM::Builder::Config
  - add set_quiet to SPVM::Builder::Config
  - add cache to SPVM::Builder::Config
  - add set_cache to SPVM::Builder::Config
  - fix spvm_build/include directory not detected bug
  - add set_cache to SPVM::Builder::Config
  - add new_cpp to SPVM::Builder::Config
  - fix no needed object file is compiled bug
0.0420 2019-04-03
  - fix before relase bugs
0.0419 2019-04-03
  - add env->alloc_memory_block_zero
  - add env->free_memory_block
  - add socket modules

  - support oarray argument from SPVM::call_sub
  - change SPVM::new_oarray, SPVM::new_varray, SPVM::new_varray_from_bin first argument to array type
    [Before]"Point"
    [After]"Point[]"
  - SPVM::new_marray is merged to SPVM::new_oarray
  - add split core function
  - add env->remove_mortal function
  - add new_default method to SPVM::Builder::Config

0.0418 2019-03-01
  - fix t/exe/exe.t bug
0.0417 2019-03-01
  - add private and public descriptor to sub declaration
  - add allow syntax to allow to accsess to private things.
    
    allow TestCase::Allow;
  - rename SPVM::Stringer::to_string to to_str
  - fix spvmcc compile bugs

0.0416 2019-02-19
  - native sub routine prefix is changed from SPVM_NATIVE_ to SPNATIVE__
    // Before
		int32_t SPVM_NATIVE_TestCase__Extension__bpkgvar_test(SPVM_ENV* env, SPVM_VALUE* stack) {
		
		}
    // After
		int32_t SPNATIVE__TestCase__Extension__bpkgvar_test(SPVM_ENV* env, SPVM_VALUE* stack) {
		
		}
  - add refcnt keyword
  - remove ref_count function
  - temporary variable is freed after end of statement or end of condition
  - reduce lexical variable memory area to minimal size
  - fix isweak and unweaken bugs
  - syntax tree become more assign statements
  - comparison operator and logical operator become expression and return value
0.0415 2019-02-06
  - remove weken array, unweaken array, isweak array because of array elements move operation performance
  - add fgets
  - add fgets_chomp
  - Exception in destructor is changed to warning
  - add ref_count core function
  - fix precompile double, float constant precice and sign bug
0.0414 2019-01-29
  - add sequencial operator
    # $z is 3
    my $z = (1, 2, 3);
  - add env->set_pointer
  - add fopen
  - add fclose
  - add fread
  - add fwrite
  - improve error message
  - precompile anon sub is always compiled
  - eval{ } need semicolon. Must be eval { };
  - add chacaters position in compiler error message
    Unexpected token "byte" at /home/kimoto/labo/SPVM/t/default/lib/TestCase/CompileError/Assign/ConstToNoConst.spvm line 5:30
  - add slurp_file
  - fix package var inline expansion bug
  - remove SPVM::BuildDir module, and document SPVM_BUILD_DIR environment variable and default build directory become script diretory/spvm_build
  - fix POSIX barewaord test bugs
0.0413 2019-01-22
  - add replaceb
  - add replaces
  - add replacei
  - add replacel
  - add replacef
  - add replaced
  - add replaceo
  - rename copy_byte_array to copy_barray
  - rename copy_short_array to copy_sarray
  - rename copy_int_array to copy_iarray
  - rename copy_long_array to copy_larray
  - rename copy_float_array to copy_farray
  - rename copy_double_array to copy_darray
  - rename copy_object_array to copy_oarray
  - rename copy_string to copy_str
  - add copy_strarray
  - add equals_strarray
  - fix bug SPVM::CORE is not basic type
  - anon sub precompile have some bugs, so I suppress it for a while
0.0412 2019-01-17
  - add oarray type to implement sort algorithm
  - fix native and precompile file path bug
  - add equals_barray core function
  - add equals_sarray core function
  - add equals_iarray core function
  - add equals_larray core function
  - add equals_farray core function
  - add equals_darray core function
  - add equals_oarray core function
  - add sortb core function
  - add sorts core function
  - add sorti core function
  - add sortl core function
  - add sortf core function
  - add sortd core function
  - add sorto core function
  - add reverseb core function
  - add reverses core function
  - add reversei core function
  - add reversel core function
  - add reversef core function
  - add reversed core function
  - add reverseo core function
  - add sliceb core function
  - add slices core function
  - add slicei core function
  - add slicel core function
  - add slicef core function
  - add sliced core function
  - add sliceo core function
  - add env->object_basic_type_id
  - add env->object_type_dimension
  - add SPVM::Stringer interface
  - add joinb
  - add joins
  - add joini
  - add joinl
  - add joinf
  - add joind
  - add joino
0.0411 2019-01-16
  - remove rest of list context @ error check becuase SPVM can not define list context correctly
0.0410 2019-01-16
  - Fix realese of 0.0409
0.0409 2019-01-16
  - remove new Foo[] {x, y, z} syntax. Use [(Foo)x, y, z] instead.
  - Simplify native source file and config path
    change Foo/Bar.native/Bar.c to Foo/Bar.native.c
    change Foo/Bar.native/Bar.config to Foo/Bar.native.config
  - add default include path spvm_build/include
  - add default library path spvm_build/lib
  - rename SPVM::Builder::C to SPVM::Builder::CC
0.0408 2019-01-11
  - remove list context @ error check becuase SPVM can not define list context correctly
  - fix string comparison operator undef occur exception
  - add new_list core func
  - add new_hash core func
  - add to_iarray to SPVM::List
  - add unweaken and isweak statement
  - fat camma left name become string literal
    x => 1, y => 2
0.0407 2019-01-08
  - Change SPVM::Bool to SPVM::JSON::Bool
  - rename interface descriptor to interface_t
  - remove floating point x % y
  - shift operation right operand is used directory
  - isa operator can check any object type
  - empty array init type become object[]
    my $objects = [];
0.0406 2019-01-04
  - add signbit CORE func
  - add signbitf CORE func
  - add specification some tests
0.0405 2018-12-28
  - fix operator precidence. more perlish.
  - can omit for init, inc part
    for (;CONDITION;) {
      
    }
  - fix % operator error message seg fault bug
  - support my declaration in while condition
    while (my $num = 1) {
      
    }
  - add type_name core func
  - fix native object return bug
  - in runtime, string type become byte array type
  - support isa numeric type and value type
  - cast is done in (byte[])$string instead of copy
0.0404 2018-12-18
  - support ascii escape '\x1F' syntax in character literal
  - support string literal excape character '\0' '\a'
  - support string literal ascii escape character
  - support unicode escape in string literal "\N{U+3042}\N{U+3044}\N{U+3046}"
0.0403 2018-12-17
  - fix line terminator
  - add __LINE__
  - add __FILE__
  - add __PACKAGE__
  - If . left and right is both constant string, concat them at compile time.
  - SPVM::Bool::new_true is renamed to SPVM::Bool::TRUE and this become singleton
  - SPVM::Bool::new_false is renamed to SPVM::Bool::FALSE and this become singleton
  - add TRUE core function
  - add FALSE core function
  - add SPVM::Hash
0.0402 2018-12-07
  - add package variable access native api
  
	  int8_t (*bpkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  int16_t (*spkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  int32_t (*ipkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  int64_t (*lpkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  float (*fpkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  double (*dpkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  void* (*opkgvar)(SPVM_ENV* env, int32_t pkgvar_id);
	  void (*set_bpkgvar)(SPVM_ENV* env, int32_t pkgvar_id, int8_t value);
	  void (*set_spkgvar)(SPVM_ENV* env, int32_t pkgvar_id, int16_t value);
	  void (*set_ipkgvar)(SPVM_ENV* env, int32_t pkgvar_id, int32_t value);
	  void (*set_lpkgvar)(SPVM_ENV* env, int32_t pkgvar_id, int64_t value);
	  void (*set_fpkgvar)(SPVM_ENV* env, int32_t pkgvar_id, float value);
	  void (*set_dpkgvar)(SPVM_ENV* env, int32_t pkgvar_id, double value);
	  void (*set_opkgvar)(SPVM_ENV* env, int32_t pkgvar_id, void* value);

  - add is_type native api

	  int32_t (*is_type)(SPVM_ENV*, void* object, int32_t basic_type_id, int32_t type_dimension);
  
  - add number-to-string convertion native api

	  void* (*i_to_str_raw)(SPVM_ENV* env, int32_t value);
	  void* (*i_to_str)(SPVM_ENV* env, int32_t value);
	  void* (*l_to_str_raw)(SPVM_ENV* env, int64_t value);
	  void* (*l_to_str)(SPVM_ENV* env, int64_t value);
	  void* (*f_to_str_raw)(SPVM_ENV* env, float value);
	  void* (*f_to_str)(SPVM_ENV* env, float value);
	  void* (*d_to_str_raw)(SPVM_ENV* env, double value);
	  void* (*d_to_str)(SPVM_ENV* env, double value);
  
  - add public document 1.0 beta
  - support hex floating point leteral
0.0401 2018-12-06
  - fix windows dinamic link warnings
0.04 2018-12-06
  - Change many native api names

	  void* exception_object;
	  void* native_mortal_stack;
	  void* native_mortal_stack_top;
	  void* native_mortal_stack_capacity;
	  void* runtime;
	  void* runtime_package_vars_heap_offset;
	  void* object_header_byte_size;
	  void* object_ref_count_offset;
	  void* object_basic_type_id_offset;
	  void* object_type_dimension_offset;
	  void* object_array_length_offset;
	  void* byte_object_basic_type_id;
	  void* short_object_basic_type_id;
	  void* int_object_basic_type_id;
	  void* long_object_basic_type_id;
	  void* float_object_basic_type_id;
	  void* double_object_basic_type_id;
	  int32_t (*memory_blocks_count)(SPVM_ENV* env);
	  void* (*new_env)(SPVM_ENV*);
	  void (*free_env)(SPVM_ENV*);
	  int32_t (*len)(SPVM_ENV*, void*);
	  int8_t* (*belems)(SPVM_ENV*, void*);
	  int16_t* (*selems)(SPVM_ENV*, void*);
	  int32_t* (*ielems)(SPVM_ENV*, void*);
	  int64_t* (*lelems)(SPVM_ENV*, void*);
	  float* (*felems)(SPVM_ENV*, void*);
	  double* (*delems)(SPVM_ENV*, void*);
	  void* (*oelem)(SPVM_ENV*, void*, int32_t index);
	  void (*set_oelem)(SPVM_ENV*, void*, int32_t index, void* value);
	  int32_t (*field_id)(SPVM_ENV*, const char*, const char*, const char*);
	  int8_t (*bfield)(SPVM_ENV*, void*, int32_t);
	  int16_t (*sfield)(SPVM_ENV*, void*, int32_t);
	  int32_t (*ifield)(SPVM_ENV*, void*, int32_t);
	  int64_t (*lfield)(SPVM_ENV*, void*, int32_t);
	  float (*ffield)(SPVM_ENV*, void*, int32_t);
	  double (*dfield)(SPVM_ENV*, void*, int32_t);
	  void* (*ofield)(SPVM_ENV*, void*, int32_t);
	  void* (*pointer)(SPVM_ENV*, void*);
	  void (*set_bfield)(SPVM_ENV*, void*, int32_t, int8_t);
	  void (*set_sfield)(SPVM_ENV*, void*, int32_t, int16_t);
	  void (*set_ifield)(SPVM_ENV*, void*, int32_t, int32_t);
	  void (*set_lfield)(SPVM_ENV*, void*, int32_t, int64_t);
	  void (*set_ffield)(SPVM_ENV*, void*, int32_t, float);
	  void (*set_dfield)(SPVM_ENV*, void*, int32_t, double);
	  void (*set_ofield)(SPVM_ENV*, void*, int32_t, void*);
	  int32_t (*sub_id)(SPVM_ENV*, const char*, const char*, const char*);
	  int32_t (*method_sub_id)(SPVM_ENV*, void* object, const char*, const char*);
	  int32_t (*basic_type_id)(SPVM_ENV*, const char*);
	  int32_t (*pkgvar_id)(SPVM_ENV* env, const char* package_name, const char* pkgvar_name, const char* signature);
	  int32_t (*field_offset)(SPVM_ENV*, int32_t);
	  void* (*new_obj_raw)(SPVM_ENV*, int32_t);
	  void* (*new_barray_raw)(SPVM_ENV*, int32_t);
	  void* (*new_sarray_raw)(SPVM_ENV*, int32_t);
	  void* (*new_iarray_raw)(SPVM_ENV*, int32_t);
	  void* (*new_larray_raw)(SPVM_ENV*, int32_t);
	  void* (*new_farray_raw)(SPVM_ENV*, int32_t);
	  void* (*new_darray_raw)(SPVM_ENV*, int32_t);
	  void* (*new_oarray_raw)(SPVM_ENV*, int32_t, int32_t);
	  void* (*new_marray_raw)(SPVM_ENV*, int32_t, int32_t, int32_t);
	  void* (*new_varray_raw)(SPVM_ENV*, int32_t, int32_t);
	  void* (*new_str_raw)(SPVM_ENV* env, const char* bytes, int32_t length);
	  void* (*new_pointer_raw)(SPVM_ENV*, int32_t basic_type_id, void* ptr);
	  void* (*new_obj)(SPVM_ENV*, int32_t);
	  void* (*new_barray)(SPVM_ENV*, int32_t);
	  void* (*new_sarray)(SPVM_ENV*, int32_t);
	  void* (*new_iarray)(SPVM_ENV*, int32_t);
	  void* (*new_larray)(SPVM_ENV*, int32_t);
	  void* (*new_farray)(SPVM_ENV*, int32_t);
	  void* (*new_darray)(SPVM_ENV*, int32_t);
	  void* (*new_oarray)(SPVM_ENV*, int32_t, int32_t);
	  void* (*new_marray)(SPVM_ENV*, int32_t, int32_t, int32_t);
	  void* (*new_varray)(SPVM_ENV*, int32_t, int32_t);
	  void* (*new_str)(SPVM_ENV* env, const char* bytes, int32_t length);
	  void* (*new_pointer)(SPVM_ENV* env, int32_t basic_type_id, void* ptr);
	  void* (*exception)(SPVM_ENV* env);
	  void (*set_exception)(SPVM_ENV* env, void* exception);
	  int32_t (*ref_count)(SPVM_ENV* env, void* object);
	  void (*inc_ref_count)(SPVM_ENV* env, void* object);
	  void (*dec_ref_count)(SPVM_ENV* env, void* object);
	  void (*weaken)(SPVM_ENV* env, void** object_address);
	  int32_t (*isweak)(SPVM_ENV* env, void** object);
	  void (*unweaken)(SPVM_ENV* env, void** object_address);
	  void* (*concat)(SPVM_ENV* env, void* string1, void* string2);
	  void* (*create_stack_trace)(SPVM_ENV* env, void* excetpion, const char* package_name, const char* sub_name, const char* file, int32_t line);
	  int32_t (*call_sub)(SPVM_ENV* env, int32_t sub_id, SPVM_VALUE* args);
	  int32_t (*enter_scope)(SPVM_ENV* env);
	  void (*push_mortal)(SPVM_ENV* env, void* object);
	  void (*leave_scope)(SPVM_ENV* env, int32_t original_mortal_stack_top);
	  int32_t (*has_interface)(SPVM_ENV*, void* object, int32_t interface_basic_type_id);
  
  - Change many exchange api names

		SPVM::new_barray
		SPVM::new_sarray
		SPVM::new_iarray
		SPVM::new_larray
		SPVM::new_farray
		SPVM::new_darray
		SPVM::new_oarray
		
		$obj->to_elems
		$obj->to_str
		$obj->to_bin

0.0399 2018-12-05
  - SPVM_value field is changed to 
  
		union SPVM_value {
		  int8_t bval;
		  int16_t sval;
		  int32_t ival;
		  int64_t lval;
		  float fval;
		  double dval;
		  void* oval;
		  int8_t* bref;
		  int16_t* sref;
		  int32_t* iref;
		  int64_t* lref;
		  float* fref;
		  double* dref;
		};
  - pointer descriptor is renamed to pointer_t
  - revert function parenthes omit because not using core lib tests is fail
  - SPVM::Bool is loaded by default
  - SPVM::Bool, SPVM::Byte, SPVM::Short, SPVM::Int, SPVM::Long, SPVM::Float, SPVM::Double become immutable
0.0398 2018-12-04
  - reduce object size by reducing weaken information
  - env become thread safe
0.0397 2018-12-01
  - add if require statement
    if module loading is success, block is exists.
    
    if (require Foo) {
    
    }
    
0.0396 2018-11-30
  - add BEGIN block
  - change native api has_interface arguments
0.0395 2018-11-28
  - sub id, field id, package var id, basic type id, package id become start 0
  - valut_t type name rule is changed.
    for example
    Change SPVM::Point_d3 to SPVM::Point_3d
  - fix int literal out of range seg fault bug.
  - add rw, ro, rw descriptor to create field accessor
    has x : rw int;
  - add rw, ro, rw descriptor to create package variable accessor
    our $FOO : rw int;
  - setter and getter is inlined.
  - package become private by default except for anon sub
  - package variable become private by default
  - field become private by default
  - constant sub is inlined
  - simple constructor is inlined
0.0394 2018-11-24
  - reduce malloc count when object is created.
  - reduce object fields memory size.
0.0393 2018-11-20
  - add fat camma syntax
    "x", 1, "y", 2
    is same as
    "x" => 1, "y" => 2
0.0392 2018-11-20
  - add subroutine import syntax
    use Foo (bar, baz);
  - allow string index access
    my $char = $string->[0];
0.0392 2018-11-19
  - add copy_string;
  - add copy_byte_array;
  - add copy_short_array;
  - add copy_int_array;
  - add copy_long_array;
  - add copy_float_array;
  - add copy_double_array;
  - add copy_object_array;
  - add length keyword to get string length
  - don't allow @$foo in list context
0.0391 2018-11-17
  - field name become not conflict reserved words and core func names
  - rename Native Interface to Native API
  - rename SPVM::PerlAPI to SPVM::ExchangeAPI
  - add SPVM::Data::Package
  - add to_string to SPVM::Data::Array
  - add SPVM::Data::String for SPVM string type
  - add SPVM::new_string
  - add SPVM::new_string_from_binary
0.0390 2018-11-16
  - package variable must start upper case or contain ::
  - add SPVM::List module
  - add private private package variable
  - fix constant pool cache bug
  - support no parenthes sub
      INT8_MAX
      sin 0.5
  - string relative operator can receive byte array
    if ($bytes1 eq $bytes2) {
      
    }
  - concat operator can receive byte array
    $bytes1 . $bytes2
  - string type become real string type, instead of alias of const byte[]
  - rename SPVM::new_byte_array_string to SPVM::new_byte_array_from_binary.
    and recieve binary data instead of Perl internal string
  - rename new_value_t_array to new_value_array
  - add SPVM::new_value_array_from_binary
  - remove SPVM::set_array_elements
  - remove SPVM::set_array_elements_bin
  - add new_multi_array
  - rename SPVM::get_elements to SPVM::to_elements
  - rename SPVM::get_elements_bin to SPVM::to_binary
  - add to_elements to SPVM::Data::Array
  - add to_binary to SPVM::Data::Array
  - remove SPVM::to_elements
  - remove SPVM::to_binary
0.0389 2018-11-13
  - fix nested loop last bugs
  - fix nested loop next bugs
  - fix single quote escape sequence bug
0.0388 2018-11-10
  - add table switch
  - improve constant pool implementation
0.0387 2018-11-07
  - improve compile error check logic and fix some bugs.
  - SPVM don't support unnatural ccflags.
  - add global string pool
0.0386 2018-11-03
  - Extension can only allow one file.
  - spvmmcc create one exe file not depend sharaed library.
0.0385 2018-11-02
  - SPVM LICENSE is changed to MIT LICENSE
  
			MIT License

			Copyright (c) [2018] [Yuki Kimoto]

			Permission is hereby granted, free of charge, to any person obtaining a copy
			of this software and associated documentation files (the "Software"), to deal
			in the Software without restriction, including without limitation the rights
			to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
			copies of the Software, and to permit persons to whom the Software is
			furnished to do so, subject to the following conditions:

			The above copyright notice and this permission notice shall be included in all
			copies or substantial portions of the Software.

			THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
			IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
			FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
			AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
			LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
			OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
			SOFTWARE.
  - support variable length argument subroutine
      
      sub vaarg : void ($format : string, $nums : int[]...) { }

      vaarg("ddd", 20, 30);

0.0384 2018-10-31
  - remove ${$var} dereference syntax. use $$var always.
  - allow brace in variable ${foo}.
  - support variable expansion.
0.0383 2018-10-30
  - remove array list syntax. This syntax is very unnatural.
    [(1, 2), (3, 4)]

  - change new_fcomplex_array definition
    
      sub new_fcomplex_array : SPVM::Complex_f2[] ($re_values : float[], $im_values : float[]);
  
  - change new_dcomplex_array definition
  
      sub new_dcomplex_array : SPVM::Complex_d2[] ($re_values : double[], $im_values : double[]);
  
  - fix do string bugs. use open and eval string to load config file.

0.0382 2018-10-29
  - remove no needed runtime type check.
  - change sub signature
    [before](int)foo(int,int)
    [after]foo:int(int,int)
  - change field signature
    [before](int)foo
    [after]foo:int
  - change package variable signature
    [before](int)$FOO
    [after]$FOO:int
  - change get_package_var_id argument, and signature contain only type
    [before]int32_t SPVM_RUNTIME_API_get_package_var_id(SPVM_ENV* env, const char* package_name, const char* signature);
    [after]int32_t SPVM_RUNTIME_API_get_package_var_id(SPVM_ENV* env, const char* package_name, const char* package_var_name, const char* signature);
  - change get_field_id argument, and signature contain only type
    [before]int32_t SPVM_RUNTIME_API_get_field_id(SPVM_ENV* env, const char* package_name, const char* signature);
    [after]int32_t SPVM_RUNTIME_API_get_field_id(SPVM_ENV* env, const char* package_name, const char* field_name, const char* signature);
  - change get_sub_id argument, and signature contain only type
    [before]int32_t SPVM_RUNTIME_API_get_sub_id(SPVM_ENV* env, const char* package_name, const char* signature);
    [after]int32_t SPVM_RUNTIME_API_get_sub_id(SPVM_ENV* env, const char* package_name, const char* sub_name, const char* signature);
  - change get_sub_id_method_call argument, and signature contain only type
    [before]int32_t SPVM_RUNTIME_API_get_sub_id_method_call(SPVM_ENV* env, void* object, const char* signature);
    [after]int32_t SPVM_RUNTIME_API_get_sub_id_method_call(SPVM_ENV* env, void* object, const char* field_name, const char* signature);
  - support anon sub
    my $comparator = sub : int ($self : self, $x1 : object, $x2 : object) {
      ...;
    };
  - remove new sub syntax.
  - remove anon package syntax
  - support anon sub capture variable
    {
      my $capture1 = 7;
      my $capture2 = 10;
      my $anon_sub = [$capture1 : int, $capture2 : int] sub : int ($self : self, $x1 : object, $x2 : object) {
        print($capture1 . "\n");
        print($capture2 . "\n");

        $self->{capture1} = 5;
        
        print($capture1 . "\n");
        
        return -1;
      };
      
      $anon_sub->(undef, undef);
    }
  
0.0381 2018-10-24
  - remove directory path from runtime file name
  - reduce runtime constant pool size
0.0380 2018-10-12
  - improve call subroutine performance by reduce malloc count
  - fix XS value reference bugs
0.0379 2018-10-08
  - fix temporary variable memory position bugs
  - fix string eq bugs
  - fix remainder bugs
  - fix right shift precompile bug
  - fix left shift precompile bug
  - fix right shift unsigned precompile bug
  - fix bit and bugs
0.0378 2018-10-02
  - fix exe compiler error library bugs
0.0377 2018-10-01
  - fix exe compiler error bugs
0.0375 2018-09-26
  - improve increment/decrement, can use array element, field access, package variable, deref
  - allow value_t multi dimension array
0.0374 2018-09-24
  - fix assign operator return value bugs
  - support package variable relative name
0.0373 2018-09-21
  - add unless statement
  - change reference type syntax to 
    
      sub sum : double ($x_in : double, $x_in2 : double, $x_out : double&);
    
    & is after type name.
  - fix many weaken bugs
  - add weaken $values->[$index] syntax
0.0372 2018-09-17
  - add boxing and unboxing feature
0.0371 2018-09-14
  - add automatically concat string convertion
  - add automatically numeric type to string type convertion

0.0370 2018-09-14
  - fix check object type null segumentation fault bug
  - fix new array length is minus segfalt bug
  - rename SPVM::Byte->set_value to SPVM::Byte->set_val
  - rename SPVM::Short->set_value to SPVM::Short->set_val
  - rename SPVM::Int->set_value to SPVM::Int->set_val
  - rename SPVM::Long->set_value to SPVM::Long->set_val
  - rename SPVM::Float->set_value to SPVM::Float->set_val
  - rename SPVM::Double->set_value to SPVM::Double->set_val
  - rename SPVM::Byte->get_value to SPVM::Byte->val
  - rename SPVM::Short->get_value to SPVM::Short->val
  - rename SPVM::Int->get_value to SPVM::Int->val
  - rename SPVM::Long->get_value to SPVM::Long->val
  - rename SPVM::Float->get_value to SPVM::Float->val
  - rename SPVM::Double->get_value to SPVM::Double->val
  - free runtime memory
  - Interface must have only one method
  - fix mortal stack bug. mortal stack is extended to count of PUSH_MORTAL opcode
  - fix array init type bug
  - fix type semantics. Can't assign Class[] to object[]
  - fix narrowing convertion bug
  - remove anon subroutine. This is mistake of class design
  - add anon package syntax for which have one subroutine
    
      my $comparator = sub compare : long ($self : self, $x1 : long, $x2 : long) {
        return $x1 * $x2;
      };
      
  - isa can check interface
  - can cast (object)
  - can cast to interface
0.0369 2018-09-08
  - fix hash key buffer memory bug.
  - rename SPVM::Build to SPVM::Builder
  - spvmcc command can create exe file
    
      spvmcc TestCase::MyExe
      
      # Entry point is main subroutine
      package TestCase::MyExe {
        sub main : int ($argv : string[]) {
          my $test_num = 0;
        }
      }
      
0.0368 2018-09-03
  - remove global runtime. SPVM become reentrant.
  - more portable, remove all static and inline keywords.
0.0367 2018-09-01
  - runtime don't need compiler information
  - free compiler memory completly
  - add SPVM::set_array_elements, SPVM::set_array_elements_bin, SPVM::get_array_elements, SPVM::get_array_elements_bin, SPVM::set_array_element, SPVM::get_array_element
  - remove SPVM::Data::Array::set_element, remove SPVM::Data::Array::get_element, remove SPVM::Data::Array::to_elements, remove SPVM::Data::Array::set_bin
    remove SPVM::Data::Array::set_elements, remove SPVM::Data::Array::to_bin, remove SPVM::Data::Array::to_string
0.0366 2018-08-09
  - rename SPVM::Build::Setting to SPVM::Build::Config and many methods is added and changed.
0.0365 2018-08-01
  - add reference type syntax to type\. You can write the double\ like.
    
    sub sum : double ($x_in : double, $x_in2 : double, $x_out : &double);

  - remove byte_ref, short_ref, int_ref, long_ref, float_ref, double_ref type
  
  - add value ref type support.
    For example, you can pass value type ref to subroutine.

      sub pass_value_ref_double : void ($x_in1 : TestCase::Point_d3, $x_in2 : TestCase::Point_d3, $x_out : &TestCase::Point_d3) {
        $x_out->{x} = $x_in1->{x} + $x_in2->{x};
        $x_out->{y} = $x_in1->{y} + $x_in2->{y};
        $x_out->{z} = $x_in1->{z} + $x_in2->{z};
      }

      sub test_pass_value_ref_double : int () {
        my $point_out : TestCase::Point_d3;
        
        my $point1 : TestCase::Point_d3;
        $point1->{x} = 0.25;
        $point1->{y} = 0.5;
        $point1->{z} = 0.125;

        my $point2 : TestCase::Point_d3;
        $point2->{x} = 0.25;
        $point2->{y} = 0.5;
        $point2->{z} = 0.125;
        
        pass_value_ref_double($point1, $point2, \$point_out);
        
        if ($point_out->{x} == 0.5 && $point_out->{y} == 1 && $point_out->{z} == 0.25) {
          return 1;
        }
        return 0;
      }
  - Perl function become can pass numeric reference and value reference to SPVM
      {
        my $point1 = {x => $BYTE_MIN, y => 1, z => 2};
        my $value1 = 6;
        my $point2 = {x => 3, y => 4, z => 5};
        my $value2 = 7;
        TestCase::PerlAPI->call_sub_value_ref_numeric_ref_mixed_arg(\$point1, \$value1, \$point2, \$value2);
        is_deeply($point1, {x => $BYTE_MIN + 1, y => 2, z => 3});
        is($value1, 7);
        is_deeply($point2, {x => 4, y => 5, z => 6});
        is($value2, 8);
      }
  
0.0364 2018-07-28
  - support numeric reference type
    add byte_ref, short_ref, int_ref, long_ref, float_ref, double_ref type
    add reference \ and derefence $$num syntax
    
    sub main : int ($mvar : int) {
      {
        my $out : double;
        ref_sum(0.25, 0.5, \$out);
        
        print((string)$out);
      }
      {
        my $num = 4;
        
        my $num_ref = \$num;
        
        my $num2 = $$num_ref;
        
        $$num_ref = 5;
        
        print((string)$num2);
        print((string)$num);
      }
    }

    sub ref_sum : double ($x_in1 : double, $x_in2 : double, $x_out : double_ref) {
      $$x_out = $x_in1 + $x_in2;
    }
    
0.0363 2018-07-26
  - simplify anon package syntax. You don't need to write "new package { ... }".
      my $point = package {
        has x : int;
        has y : int;
        sub clear : void ($self : self) {
          $self->{x} = 0;
          $self->{y} = 0;
        }
      };
  - Perl API call_sub support value type arguments
  - add SPVM::new_object_array
  - add SPVM::new_value_t_array
  - remove SPVM::new_byte_array_bin
  - remove SPVM::new_short_array_bin
  - remove SPVM::new_int_array_bin
  - remove SPVM::new_long_array_bin
  - remove SPVM::new_float_array_bin
  - remove SPVM::new_double_array_bin
  - fix mortal stack length overflow bug
0.0362 2018-07-23
  - improve precompiled source code with more typing
0.0361 2018-07-21
  - add two anon sub syntax
    [First] Package is Foo, sub name is anonymous
    
      package Foo {
        sub : int ($self : self, $x1 : int, $x2 : int) {
          return $x1 + $x2;
        }
      }
    
    [Second] Package is anonymous(Internaly named), sub name is anonymous
    
      my $anon_sub = sub : int ($self : self, $x1 : int, $x2 : int) {
        return $x1 + $x2;
      }
  - add SPVM::Comparator
    This is used for object sort method
  
    package SPVM::Comparator : interface {
      sub : int ($self : self, $x1 : object, $x2 : object);
    }

0.0360 2018-07-20
  - Add Complex functions
      add cadd
      add csub
      add cmul
      add cdiv
      add caddf
      add csubf
      add cmulf
      add cdivf
      add new_fcomplex function
      add new_dcomplex function
      add new_fcomplex_array function
      add new_dcomplex_array function
      fix array init multi dimention bugs
0.0359 2018-07-16
  - SPVM::CORE become done native compile
  - add join function
  - fix const assignment bug
  - support list syntax
      my $nums = [(1, 2), (3, 4), (5, 6)];
  - object have body field at offset 0. This will fix alignment bugs.
0.0358 2018-07-13
  - add c source files and header files to distribution
  - Core function is done inline-expansion in precompile
0.0357 2018-07-11
  - value_t package must be end with [Prefix][FieldLength]
      package TestCase::Complex_b2 : value_t {
        has re : byte;
        has im : byte;
      }
      package TestCase::Complex_s2 : value_t {
        has re : short;
        has im : short;
      }
      package TestCase::Complex_i2 : value_t {
        has re : int;
        has im : int;
      }
      package TestCase::Complex_l2 : value_t {
        has re : long;
        has im : long;
      }
      package TestCase::Complex_f2 : value_t {
        has re : float;
        has im : float;
      }
      package TestCase::Complex_d2 : value_t {
        has re : double;
        has im : double;
      }
  - support value_t array
      my $nums1 = new TestCase::Complex_d2[10];
      $nums1->[9]{re} = 5;
      $nums1->[9]{im} = 9;
      
      my $nums1_9_re = $nums1->[9]{re};
      my $nums1_9_im = $nums1->[9]{im};
      
      my $nums2 = $nums1->[9];
      
      $nums1->[5] = $nums2;
  - add SPVM::Complex_i2, SPVM::Complex_l2, SPVM::Complex_f2, SPVM::Complex_d2

0.0356 2018-07-07
  - Support value_t package. This is value type.
      package TestCase::Complex_double_2 : value_t {
        has re : double;
        has im : double;
      }
0.0355 2018-07-05
  - Symbol name can't conatain __
  - Object alignment must be sizeof(SPVM_VALUE)
  - rename strcut descripter to pointer
  - rename env->new_struct to env->new_pointer
  - rename env->get_struct to env->get_pointer
  - remove object null check from env->get/set_xxx_field
  - fix env->get/set_xxx_field bugs
  - fix array store undef bug in precompile code
0.0354 2018-07-03
  - Get and check field index in top of subroutine in precompile
  - Get and check package variable id in top of subroutine in precompile
  - Get and check sub id in top of subroutine in precompile
0.0353 2018-06-30
  - env->get_sub_id receive package name and signature
      [Before]
      int32_t sub_id = env->get_sub_id(env, sub_abs_name);
      [After]
      int32_t sub_id = env->get_sub_id(env, package_name, signature);
      
      Signature contains return type, subroutine name, and argument types
      For example
      
        (int)foo(double,long)

  - rename env->get_field_rel_id to env->get_field_index and receive package name and signature
      [Before]
      int32_t field_index = env->get_field_rel_id(env, name);
      [After]
      int32_t field_index = env->get_field_index(env, package_name, signature);
      
      Signature contains field type and field name
      For example
      
        (int)x

  - add env->get_package_var_id

      int32_t package_var_id = env->get_field_index(env, package_name, signature);
      
      Signature contains package variable type and package variable name
      For example
      
        (int)$FOO
        
  - improve exception logic
  - improve precompile symbol name check
0.0352 2018-06-27
  - Separate mortal API and raw API
    raw API create object which reference count is zero.
    mortal API create object which refernece count is one and pushed to mortal stack.

      [Mortal API]
		  SPVM_RUNTIME_API_new_object
		  SPVM_RUNTIME_API_new_byte_array
		  SPVM_RUNTIME_API_new_short_array
		  SPVM_RUNTIME_API_new_int_array
		  SPVM_RUNTIME_API_new_long_array
		  SPVM_RUNTIME_API_new_float_array
		  SPVM_RUNTIME_API_new_double_array
		  SPVM_RUNTIME_API_new_object_array
		  SPVM_RUNTIME_API_new_multi_array
		  SPVM_RUNTIME_API_new_string
		  SPVM_RUNTIME_API_new_struct

		  [Raw API]
		  SPVM_RUNTIME_API_new_object_raw 
		  SPVM_RUNTIME_API_new_byte_array_raw 
		  SPVM_RUNTIME_API_new_short_array_raw 
		  SPVM_RUNTIME_API_new_int_array_raw 
		  SPVM_RUNTIME_API_new_long_array_raw 
		  SPVM_RUNTIME_API_new_float_array_raw 
		  SPVM_RUNTIME_API_new_double_array_raw 
		  SPVM_RUNTIME_API_new_object_array_raw 
		  SPVM_RUNTIME_API_new_multi_array_raw 
		  SPVM_RUNTIME_API_new_string_raw 
		  SPVM_RUNTIME_API_new_struct_raw 
  - Add enter_scope and leave_scope native.h
      If you use enter_scope, return scope_id. and you create objects,
      and use leave_scope, objects is automatically released.
		  {
		    // Enter scope
		    int32_t scope_id = env->enter_scope(env);

		    env->new_int_array(env, 3);
		    env->new_int_array(env, 3);
		    env->new_int_array(env, 3);
		    
		    // Leave scope
		    env->leave_scope(env, scope_id);
		  }
  
  - remove SPVM_NATIVE_SUB macro in spvm_native.h. Native function name become start with SPVM_NATIVE_

        SPVM_NATIVE_SUB(My__Point__clear)

      is changed to

        SPVM_NATIVE_My__Point__clear
  - add SPVM_SUCCESS and SPVM_EXCEPTION macro in native.h
      SPVM Native Interface must return 0 in success, or 1 in exception,
      This mean exception flag, but this is little difficult to keep in mind.
      I add SPVM_SUCCESS and SPVM_EXCEPTION macro.
      You can use them
      
        return SPVM_SUCCESS
        
        return SPVM_EXCEPTION;
      
0.0351 2018-06-23
  - improve exception message
  - create_exception_stack_trace become receive package_name, sub_name, file instead of sub_id
  - LOOKUP_SWITCH opcode become 1 operation
  - opcode become 64bit from 128bit
0.0350 2018-06-22
  - improve solo SPVM tests command
      You can run solo tests by the following commands. This comands is wrote in solo/README
      
     # Normal run
     yacc/bison.sh && perl Makefile.PL && make && perl solo/solo_Makefile.PL && make -f solo/Makefile && ./solo/spvm_main TestCase

     # Debug run - Print AST, package information, operaion codes
     yacc/bison.sh && perl Makefile.PL --OPTIMIZE=O --DEFINE=SPVM_DEBUG_DUMP --DEFINE=SPVM_DEBUG_OBJECT_COUNT && make && perl solo/solo_Makefile.PL && make -f solo/Makefile && ./solo/spvm_main TestCase

     # Parser Debug run - Print yacc result
     yacc/bison.sh && perl Makefile.PL --OPTIMIZE=O --DEFINE=SPVM_DEBUG_YACC && make && perl solo/solo_Makefile.PL && make -f solo/Makefile && ./solo/spvm_main TestCase
  - use package relative id in field access, call sub, package variable access, type
      
0.0349 2018-06-15
  - rename SPVM::Build::Base to SPVM::Build::CBuilder
  - rename SPVM::Build::Native to SPVM::Build::CBuilder::Native
  - rename SPVM::Build::Precompile to SPVM::Build::CBuilder::Precompile
  - rename SPVM::Build::SPVMInfo to SPVM::Build::Info
  - fix dynamic link library c func names
0.0348 2018-06-15
  - add SPVM::Build::Setting
    
    This module is to do setting ExtUtils::CBuilder. ExtUtils::CBuilder is used for native compile and precompile.
  - fix config path bug
  - add runtime allocator again to check objects count.
      spvm_runtime_allocator.h
      spvm_runtime_allocator.c
  - fix native function name set_object_array_element, get_object_array_element. this name was wrong by wrong replacing.
  - fix weaken memory broken bug
  - add C/C++ struct/class binding features
      add Native interface new_struct and get_struct
      new_struct create object which have C/C++ struct/class
      get_struct get struct/class from SPVM object
0.0347 2018-06-13
  - fix bug : [rt.cpan.org #125541] System perl used in build process
    
    I receive a advice
    
      "
       It seems that the system perl is used here (/usr/bin/perl),
       not the perl used for building the distribution. Typically this can 
       be fixed by using something like $^X.
      "
    
    This bug is fixed by using $^X.
0.0346 2018-06-12
  - fix Makefile.PL native and precompile make rule bug
    
    The following output become printed to Makefile
    
      dynamic :: spvm_native_SPVM__Example  

      spvm_native_SPVM__Example  :: blib/lib/SPVM/Example.native/Example.so

      blib/lib/SPVM/Example.native/Example.so :: lib/SPVM/Example.native/Example.c lib/SPVM/Example.spvm

      	perl -Mblib -MSPVM::Build -e "SPVM::Build->new(build_dir => 'spvm_build')->create_shared_lib_native_dist('SPVM::Example')"

      dynamic :: spvm_precompile_SPVM__Example  

      spvm_precompile_SPVM__Example  :: blib/lib/SPVM/Example.precompile/Example.so

      blib/lib/SPVM/Example.precompile/Example.so :: lib/SPVM/Example.spvm

      	perl -Mblib -MSPVM::Build -e "SPVM::Build->new(build_dir => 'spvm_build')->create_shared_lib_precompile_dist('SPVM::Example')"

  - fix INT64_MIN bugs
    In native function, -9223372036854775808LL is changed to -9223372036854775808ULL
  - fix INT32_MIN bugs
    In native function, -2147483648L is changed to -2147483648UL
0.0345 2018-06-12
  - Support precompile subroutine in distribution
    In this version, spvm subroutine can be precompiled before runtime.
    
    You can create precompiled shared library by the following command.
    
      perl -MSPVM::Build -e "SPVM::Build->new(build_dir => 'spvm_build')->create_shared_lib_precompile_dist('Point')";

  - remove len keyword and add scalar keyword
    SPVM don't have scalar context and list context, but Perl have them.
    In SPVM, you can get array by
    
      @$values
    
    syntax. but this confuse you sometime
    because
    
      foo(@$values);
    
    is seem list expansion. This is always array length in SPVM.
    Until now I provided len keyword , but this is not Perlish syntax.
    From now I provide scalar keyword and another array syntax.
      
      scalar @$values
    
    You can write the following subroutine call
    
      foo(scalar @$values);
  - add SPVM_NATIVE_SUB macro to spvm_native, and SPVM native function defenition way is changed to the following
      
      // My::Example::sin
      int32_t SPVM_NATIVE_SUB(My__Example__sin) (SPVM_ENV* env, SPVM_VALUE* args) {
        (void)env;
        
        double value = sin(args[0].dval);
        
        args[0].dval = value;
        
        return 0;
      }
    
    SPVM_NATIVE_SUB macro automatically expand function name to SPVM_NATIVE_My__Example__sin.
    This is very simple way to define native function.
    Newbie only learn SPVM_NATIVE_SUB macro and replace package name : to _ and join package name and subroutine name with __.
    
0.0345 2018-06-10
  - SPVM::Build can parse distribution module and get subrutine names from it
  - rename compile descriptor to precompile
0.0344 2018-06-6
  - Change native function return value.
    native function return value must be set args[0], and return croak_flag.
0.0343 2018-06-05
  - do inline expasion in subroutien of same precompile package
  - SPVM module loading path become same as Perl. You don't need to create SPVM/ directory.
  - remove SPVM::Math
  - remove SPVM::TypeUtil
  - Move SPVM::Math and SPVM::TypeUtil functions to CORE namespace
0.0342 2018-06-02
  - remove SPVM::Native
  - remove SPVM::Precompile
  - add compile descriptor to precompile
  - cleanup SPVM native and precompile build system
0.0340 2018-05-28
  - rename byte_value to bval
  - rename short_value to sval
  - rename int_value to ival
  - rename long_value to lval
  - rename float_value to fval
  - rename double_value to dval
  - rename object_value to oval
  - pointer_value, string_value, object_address_value is merged to oval
  - rename SPVM_API_byte to SPVM_VALUE_byte
  - rename SPVM_API_short to SPVM_VALUE_short
  - rename SPVM_API_int to SPVM_VALUE_int
  - rename SPVM_API_long to SPVM_VALUE_long
  - rename SPVM_API_float to SPVM_VALUE_float
  - rename SPVM_API_double to SPVM_VALUE_double
  - rename SPVM_API_OBJECT to SPVM_VALUE_object
  - rename SPVM_API to SPVM_ENV
  - rename spvm_api.h to spvm_native.h
  - rename $obj->get_elements to $obj->to_elements
  - rename $obj->to_data to $obj->to_bin
  - rename $obj->set_data to $obj->set_bin
  - rename SPVM::new_byte_array_data to SPVM::new_byte_array_bin
  - rename SPVM::new_short_array_data to SPVM::new_short_array_bin
  - rename SPVM::new_int_array_data to SPVM::new_int_array_bin
  - rename SPVM::new_long_array_data to SPVM::new_long_array_bin
  - rename SPVM::new_float_array_data to SPVM::new_float_array_bin
  - rename SPVM::new_double_array_data to SPVM::new_double_array_bin
  - remove range methods
  - rename $array->set to $array->set_element
  - rename SPVM::Perl::Object to SPVM::Object
  - add SPVM::new_multi_array_len
0.0339 2018-05-26
  - rename Std::Math to Math
  - renmae Std::Time to Time
  - renmae Std::TypeUtil to TypeUtil
  - rename Std::IO to IO
  - rename Std to CORE
  - merged CORE::Time to CORE
  - merged CORE::IO to CORE
  - CORE module is loaded by default
  - CORE functions become static functions
0.0338 2018-05-25
  - add examples
  - add const byte[] type
  - String type become string type to express it is core type.
  - Otring type become object type to express it is core type.
  - string type become syntax sugar of const byte[].
  - string next of end character become '\0'
0.0337 2018-05-24
  - remove jit descriptor
  - add SPVM::JIT moudle
  - JIT compile unit become package
  - implement JIT compile cache system
  - improve test peformance very much
0.0336 2018-05-19
  - fix hash insert and search bug
  - name string is shared intenally
  - only support NetBSD 7+, not support NetBSD 6
0.0335 2018-05-18
  - support multi dimension array initialization
    my $nums = [
      [1, 2, 3],
      [4, 5, 6]
    ];
0.0334 2018-05-07
  - add new array init syntax.
    my $nums = [3, 4, 5];
    my $nums = [0.1, 0.4, 0.8];
  - remove Std::Number::Util many subtoutines
  - rename Std::Number::Util to Std::TypeUtil
    and Std::TypeUtil become C language inttype.h and float.h wrapper
  - remove Std::Array::Util
0.0333 2018-05-05
  - fix array init type bug
  - fix 32bit environment not work bug
0.0332 2018-05-04
  - Cleanup internal ast
0.0331 2018-05-01
  - fix many assign reference count bug.
  - Object type become generic purpose type
  - Object can be assigned any array object
0.0329 2018-04-24
  - use sprintf "%g" format for string conversion
0.0328 2018-04-24
  - Numeric class become not private, and set_value method.
  - add Bool package
  - fix nan test bug
0.0327 2018-04-21
  - fix jit link subroutine name bug
  - only print warning message when SPVM_TEST_ENABLE_WARNINGS is defined
  - double, float string convertion more portable
  - fix windows long constant bug
  - fix windows jit dll file overwritten bug
0.0326 2018-04-20
  - forbidden function call from Perl. All subroutine become method or class method
  - rename Std::Arrays to Std::Array::Util
  - rename Std::Array::Util copy_of_xxx to copy_xxxs
  - rename Std::Array::Util equals_xxx to eq_xxxs
  - fix windows source file reading bug
  - inline source code must be in .inline instead of .native
  - fix temporary directory bug
  - add build directory cleanup logic
0.0325 2018-04-13
  - remove template feature
  - rename Math to Std::Math
  - rename Arrays to Std::Arrays
  - rename Number::Util to Std::Number::Util
  - add some Std::Math functions
  - remove absolute call subroutine syntax
    method is only instance method or class method
  - rename CORE to Std
  - need use Std to use print, warn and time
  - use must be in package block
0.0324 2018-04-07
  - implement string convertion
  - implement isa
  - implement string comparison operator
  - fix (term) is not allowed bug
0.0323 2018-04-06
  - fix file empty bug
0.0322 2018-04-04
  - allow numeric type to String convertion
  - remove string concat operator automatical type convertion
  - licence become MIT licence
0.0321 2018-04-02
  - rename Integer package to Int package
  - add Number::Util and move many number util funtions of Byte, Short, Int, Long, Float, Double to Number::Util
  - SPVM all C source file is compiled by -std=c99 option by default
0.0320 2018-03-29
  - add private and public descriptor
  - add private field
  - add private package
  - fix check cast bug
0.0319 2018-03-29
  - add interface descriptor to package declaration
  - fix bug that empty package parsing fail
  - add Object interface
  - add subroutine argument convertion
  - implement interface method call
  - implement check cast
0.0318 2018-03-20
  - field become public by default
  - remove set, get keyword
  - new become public by default
  - add self keyword to represent invocant
  - many module methods become class method
    Byte, Short, Integer, Long, Float, Double, Math
0.0317 2018-03-15
  - support escape character \0
  - cleanup leave scope logic
  - numeric variable become local variable in jitcode
0.0316 2018-03-10
  - remove runtime constant_pool
0.0315 2018-03-08
  - add JIT descripter
  - fix manifest not to contain SPVM-* files
0.0314 2018-03-01
  - remove build_shared_lib.pl script
  - fix jit subroutine not called bug
0.0313 2018-02-26
  - fix shared lib dependency bug
  - sub descripter position is changed
    before: sub sin : native double ($x : double);
    after : native sub sin : double ($x : double);
  - fix windows dll not loading bug
0.0312 2018-02-23
  - fix bug that last statement can't do leave scope logic
0.0311 2018-02-21
  - shared library building temporaly directory is cleaned up in the scope
  - cleanup shared library loading
  - fix exception stack trace subroutine name
  - fix all warnings
0.0310 2018-02-16
  - enum value must be int type
  - remove byte literal b
  - remove short literal s
  - add automatically type convertion to + operator
  - add automatically type convertion to - operator
  - add automatically type convertion to * operator
  - add automatically type convertion to / operator
  - add automatically type convertion to % operator
  - add automatically type convertion to unary -
  - fix unary + bug
  - add automatically type convertion to unary +
  - add automatically type convertion to == operator
  - add automatically type convertion to != operator
  - add automatically type convertion to > operator
  - add automatically type convertion to >= operator
  - add automatically type convertion to < operator
  - add automatically type convertion to <= operator
  - add automatically type convertion to array index
  - add automatically type convertion to lengh of new array
  - add automatically type convertion to ~ operator
  - add automatically type convertion to & operator
  - add automatically type convertion to | operator
  - add automatically type convertion to ^ operator
  - add automatically type convertion to << operator
  - add automatically type convertion to >> operator
  - add automatically type convertion to >>> operator
  - limit <<, >>, >>> right value
  - fix increment, decrelement assignment bug
  - implement float, double increment
  - add automatically type convertion to == operator
0.0309 2018-02-10
  - jit code is called from virtual machine
  - separate tests to succeed tests at less memory environment
0.0308 2018-02-05
  - implement Perl compatible GC system correctory
  - fix eval block stack bug
0.0307 2018-02-01
  - fix print function bug that print line break.
  - remove say relative functions. say, say_xxx, say_xxx_err
  - remove print relative functions. print_xxx, print_xxx_err
  - rename print_err to warn
  - sub definition is changed. sub NAME : RETURN_TYPE ($arg1 : ARG_TYPE1, ...) { }
0.0306 2018-01-23
  - remove SPVM::Debug
  - croak stack trace is on by default
0.0305 2018-01-20
  - fix MANIFEST
  - improve exception logic
0.0304 2018-01-18
  - add jit code in test(jit-spvm.t)
0.0303 2018-01-03
  - fix reference count bug in loop
  - support array initialization in any place.
    new int[] { 1, 2, 3} is used in any place.
  - add temporary JIT code for preparation for JIT compile
  - fix assign excecution order
  - fix type inference bug
0.0302 2017-12-07
  - add eval block stack max length
  - fix next statement bug
  - operation code become flexible 1 byte to fixed 64 byte for preparation of JIT compile
0.0301 2017-11-20
  - support relative name subroutine call
    sum(0, 1);
    At first, current package is searched, next core function
  - rename std package to CORE package
  - package variable must be start upper case
  - lexical variable must be start lower case
  - support relative name package variable
0.03 2017-11-17
  - SPVM VM change Stack Based VM to Register Based VM
    This change slow down performance temporary
  - fix bug that my variable type can't be detected.
  - fix my var scope bug
  - fix negate operator bug
  - add complement operator ~
    but, this is prepared for JIT compile
0.0284 2017-10-30
  - simplify SPVM internal to implement JIT compile
0.0283 2017-10-23
  - cleanup SPVM modules
  - implement get_type_id correctory
  - change array init syntax
    before: my $values : int[] = [1, 2, 3];
    after : my $values = new int[] {1, 2, 3};
0.0282 2017-10-23
  - support package variable
0.0281 2017-10-19
  - remove SPVM::new_object
  - remove SPVM::Object::Package::set
  - remove SPVM::Object::Package::get
  - can call method directory from SPVM object
    my $object = SPVM::TestCase::new();
    $object->set_x_byte($BYTE_MAX);
    $object->set_x_short($SHORT_MAX);
  - remove Package->name syntax because Perl subroutine call correspoing to SPVM subroutine call completely
  - remove relative name subroutine call because future keyword adding don't break backward compatible
  - fix method call bug
  - add getter and setter syntax
    set x, y;
    get x, y;
  - field become private
  - new keyword become private
0.0280 2017-10-13
  - add String type again
  - add Native API new_string
  - add Native API get_string_length
  - add Native API get_string_chars
0.0279 2017-10-12
  - fix catch exception bug that runtime exception can't be cached
0.0278 2017-10-11
  - throw exception when get array length of undef value
  - SPVM::new_xxx_array return undef if argument is undef
  - allow SPVM::call_sub undef argument
  - add std::say_err ($value : byte[]) : native void;
  - add std::say_err_byte ($value : byte) : native void;
  - add std::say_err_short ($value : short) : native void;
  - add std::say_err_int ($value : int) : native void;
  - add std::say_err_long ($value : long) : native void;
  - add std::say_err_float ($value : float) : native void;
  - add std::say_err_double ($value : double) : native void;
  - add std::print_err ($value : byte[]) : native void;
  - add std::print_err_byte ($value : byte) : native void;
  - add std::print_err_short ($value : short) : native void;
  - add std::print_err_int ($value : int) : native void;
  - add std::print_err_long ($value : long) : native void;
  - add std::print_err_float ($value : float) : native void;
  - add std::print_err_double ($value : double) : native void;
  - add std::time()
  - add Array::equals_byte()
  - add Array::equals_short()
  - add Array::equals_int()
  - add Array::equals_long()
  - add Array::equals_float()
  - add Array::equals_double()

0.0277 2017-10-10
  - allow resorved word for subroutine name
  - add Arrays package
  - add Arrays::copy_of_byte
  - add Arrays::copy_of_short
  - add Arrays::copy_of_int
  - add Arrays::copy_of_long
  - add Arrays::copy_of_float
  - add Arrays::copy_of_double
  - fix native subroutine exception bugs
  - array initialization allow all terms, and need type declaration
0.0276 2017-10-05
  - rename back to_array to get_elements
0.0275 2017-10-04
  - fix Math.spvm loading bug
0.0274 2017-10-04
  - add package name check
  - fix enum call bug
0.0273 2017-10-03
  - support octal literal
  - support binary literal
0.0272 2017-09-27
  - add Math::tan function
  - add Math::asin function
  - add Math::acos function
  - add Math::atan function
  - add Math::to_radians function
  - add Byte package
  - add Short package
  - add Integer package
  - add Long package
  - add Float package
  - add Double package
  - fix call native long function bug
  - change byte constatant specifier b to y
    124b -> 124y
  - a, b, c, d, e, f become hex character.
0.0271 2017-09-23
  - add Math::cos function
  - add Math::sin function
0.0270 2017-09-22
  - fix 0 length string bug
0.0269 2017-09-21
  - add SPVM::Object::Array::Short::set_data()
  - add SPVM::Object::Array::Int::set_data()
  - add SPVM::Object::Array::Long::set_data()
  - add SPVM::Object::Array::Float::set_data()
  - add SPVM::Object::Array::Double::set_data()
  - add SPVM::Object::Array::Short::to_data()
  - add SPVM::Object::Array::Int::to_data()
  - add SPVM::Object::Array::Long::to_data()
  - add SPVM::Object::Array::Float::to_data()
  - add SPVM::Object::Array::Double::to_data()
  - add SPVM::new_short_array_data()
  - add SPVM::new_int_array_data()
  - add SPVM::new_long_array_data()
  - add SPVM::new_float_array_data()
  - add SPVM::new_double_array_data()
  - add SPVM::Object::Array::Byte::set_elements_range()
  - add SPVM::Object::Array::Short::set_elements_range()
  - add SPVM::Object::Array::Int::set_elements_range()
  - add SPVM::Object::Array::Long::set_elements_range()
  - add SPVM::Object::Array::Float::set_elements_range()
  - add SPVM::Object::Array::Double::set_elements_range()
  - add SPVM::Object::Array::Byte::set_data_range()
  - add SPVM::Object::Array::Short::set_data_range()
  - add SPVM::Object::Array::Int::set_data_range()
  - add SPVM::Object::Array::Long::set_data_range()
  - add SPVM::Object::Array::Float::set_data_range()
  - add SPVM::Object::Array::Double::set_data_range()
  - add SPVM::Object::Array::Byte::to_array_range()
  - add SPVM::Object::Array::Short::to_array_range()
  - add SPVM::Object::Array::Int::to_array_range()
  - add SPVM::Object::Array::Long::to_array_range()
  - add SPVM::Object::Array::Float::to_array_range()
  - add SPVM::Object::Array::Double::to_array_range()
  - add SPVM::Object::Array::Byte::to_data_range()
  - add SPVM::Object::Array::Short::to_data_range()
  - add SPVM::Object::Array::Int::to_data_range()
  - add SPVM::Object::Array::Long::to_data_range()
  - add SPVM::Object::Array::Float::to_data_range()
  - add SPVM::Object::Array::Double::to_data_range()

0.0268 2017-09-19
  - remove string type. SPVM string become byte[].
  - SPVM::new_string_bytes renamed to SPVM::new_byte_array_data and return SPVM::Array::Byte object
  - SPVM::new_string renamed to SPVM::new_byte_array_string and return SPVM::Array::Byte object
  - rename get_elements to to_array
  - rename get_string to to_string
  - rename get_data to to_data
  
0.0267 2017-09-18
  - add .= operator
0.0266 2017-09-16
  - fix bug that empty string is not used
  - rename SPVM::new_string_raw to SPVM::new_string_bytes
  - implement . operator to concat string
  - renmae println to say
0.0265 2017-09-13
  - fix clang duplicate symbol bug
0.0264 2017-09-12
  - rename Inline to Extension
0.0263 2017-09-12
  - add native INC config
  - add native LIBS config
  - add special assign syntax
    +=	
    -=	
    *=	
    /=	
    %=	
    &=	
    ^=	
    |=	
    <<=	
    >>=	
    >>>=	
  - fix CBuilder config bug
0.0262 2017-09-12
  - fix make dependency
0.0261 2017-09-11
  - remove inline syntax
    __INLINE__
    __NATIVE__
  - add new runtime compile syntax
    Foo.spvm
    Foo.native/Foo.c
    Foo.native/Foo.config
    
0.0260 2017-09-08
  - fix windows dll bugs
0.0259 2017-09-06
  - add Math module
  - add Math::sin function
  - add Math->PI constant
  - add Math->E constant
0.0258 2017-09-06
  - fix temporary inline file name.
  - support inline native config
    __CONFIG__
  - support inline config following options
    CC
    CCFLAGS
    LD
    LDDLFLAGS
    OPTIMIZE
0.0257 2017-09-05
  - improve inline native source error message
  - inline source is separated each
0.0256 2017-09-04
  - CBuilder output become quite.
  - Fix some Windows compile error
0.0255 2017-09-04
  - detect automatically inline native function
  - remove SPVM::Inline
0.0254 2017-09-02
  - Support inline native function. implement SPVM::Inline
0.0253 2017-09-01
  - fix exception bugs
0.0252 2017-08-30
  - allow enum last camma
  - allow term last camma
  - allow args last camma
  - allow descripter last camma
  - forbidden double comma
0.0251 2017-08-30
  - fix bug that if package is not exists, compile is ok.
  - implement destructor
    sub DESTROY ($self : Foo) : void {
      
    }
0.0250 2017-08-29
  - cleanup runtime
  - cleanup api
  - fix exception some bug
0.0249 2017-08-25
  - string can't convert to byte[]
  - byte[] can't convert to string
  - allow $string->[0] to get byte value
  - improve get_sub_id, get_type_id, get_field_id performance
0.0248 2017-08-19
  - support xs.dll dynamiclin library
  - fix __END__ not used bug
0.0247 2017-08-19
  - Sorry, rename back stdout to std
    SPVM only have std package by default and automatically loaded without use std;
  - support dynamic link library
0.0246 2017-08-17
  - array element is initialized by zero.
0.0245 2017-08-16
  - fix get object byte field bug
  - fix set object byte field bug
  - fix bug that compiler can't load source file over 0xFF bytes
0.0244 2017-08-15
  - implement weak reference to resolve recursive reference
    weaken $obj->{foo};
  - Field become have any object
0.0243 2017-08-12
  - add SPVM::new_object_array_len function
  - add SPVM::Array::Object::set function
  - add SPVM::Array::Object::get function
0.0242 2017-08-11
  - array malloc length + 1. and last value is 0. This is for C level string API.
  - add debug mode. 
    use SPVM::Debug;
0.0241 2017-08-08
  - fix void subroutine bug that if return value is not exists, runtime error occur.
0.0240 2017-08-07
  - fix number literal bug that hex number e and E is floating point specifier
  - add byte and short number literal syntax
    123b
    123s
  - hex number only allow A, B, C, D, E, F because f is used to specify the number is floating point
    and b is used to specify the number is byte
  - fix array float store and load bug
  - support underline in number literal
    123_123
    0xFF_FF
0.0239 2017-08-05
  - cleanup enum internal logic
  - fix clang compiler error
  - fix all warnings 
0.0238 2017-08-04
  - Support nested switch statement
0.0237 2017-08-03
  - improve SPVM call_sub performance
0.0236 2017-08-01
  - add __END__
  - SPVM exception can be cached from Perl's eval { ... }
  - fix one character string bug.
0.0235 2017-07-31
  - fix default return value
  - imporve exception message
0.0234 2017-07-29
  - rename malloc to new. you can also define new function for object initialization.
    my $obj = new Foo;
    my $obj = Foo::new(3);
    package Foo {
      sub new($var1 : int) {
        
        # ...
        
        return new Foo;
      }
    }
  - object's fields are initialized by zero.
    
0.0233 2017-07-28
  - support package template.
  - support over 4G memory allocation
0.0232 2017-07-26
  - add len keyword to get array length
    reason is that
    foo(@$nums) looks like passing array itself, not array length.
    you can use len keyword for readability.
    foo(len $nums);
  - Fix bug that error occur when near small base_object_max_byte_size_use_memory_pool is malloced
0.0231 2017-07-25
  - Fix clang compile error
0.0230 2017-07-25
  - Fix POSIX function import bug
  - Package name must be start with upper case. Lowercase is reserved for core package.
  - Add SPVM/stdout.pm as Perl module
0.0229 2017-07-25
  - support array initialization
    my $nums = [1, 2, 3];
  - fix memory breaking bug when object is assigned from freelist
0.0228 2017-07-22
  - fix enum constant bug
  - support float enum
  - support double enum
0.0227 2017-07-21
  - fix tests bug
0.0226 2017-07-20
  - fix float convertion bugs
  - fix convert double to short bug
  - fix floating number which don't have point(for example, 346638529e+38) parsing bug.
  - rename std package to stdout
  - fix enum default type. Correct type is int.
  - fix enum { FOO = 1 } syntax. 
0.0225 2017-07-19
  - add SPVM::Array::Byte::get_elements method
  - add SPVM::Array::Short::get_elements method
  - add SPVM::Array::Int::get_elements method
  - add SPVM::Array::Long::get_elements method
  - add SPVM::Array::Float::get_elements method
  - add SPVM::Array::Double::get_elements method
0.0224 2017-07-19
  - fix memory leak bugs. fix reference count.
0.0223 2017-07-18
  - fix hash segmentation fault bug when many hash is created.
0.0222 2017-07-18
  - add SPVM::Object::set
  - add SPVM::Object::get
  - rename SPVM::byte_array to SPVM::new_byte_array
  - rename SPVM::short_array to SPVM::new_short_array
  - rename SPVM::int_array to SPVM::new_int_array
  - rename SPVM::long_array to SPVM::new_long_array
  - rename SPVM::float_array to SPVM::new_float_array
  - rename SPVM::double_array to SPVM::new_double_array
  - rename SPVM::string_raw to SPVM::new_string_raw
  - rename SPVM::string to SPVM::new_string
  - rename SPVM::object to SPVM::new_object
0.0221 2017-07-15
  - fix && not working bug
  - fix || not working bug
  - fix ! not working  bug
0.0220 2017-07-14
  - Support array return type in SPVM::call_sub
0.0219 2017-07-13
  - Support constant floating point E expression
    0.5E3
    0.5e3
    0.5E+3
    0.5e+3
    0.5E-3
    0.5e-3
  - add SPVM::string function
  - add SPVM::string_raw function
0.0218 2017-07-13
  - Fix float culcuration bugs
  - add SPVM::byte_array, SPVM::short_array, SPVM::long_array, SPVM::float_array, SPVM::double_array function
    to create SPVM array object.
0.0217 2017-07-12
  - Support SPVM::int_array([1, 2, 3]) function
    This values can be passed to SPVM function.
0.0216 2017-07-12
  - Fix constant sign is not initialized bug
0.0215 2017-07-11
  - Support while (my $var = 3) { ... }
  - Support long min constant -9223372036854775808
  - Fix array malloc bug
0.0214 2017-07-11
  - Fix for statement segmentaion fault bug
  - VAR = TERM return VAR. For example, allow the syntax "if (my $error = $@) { ... }
  - Fix if condition (byte, short, long, float) bugs.
0.0213 2017-07-10
  - Fix MANIFEST
0.0212 2017-07-10
  - Fix hex literal bug. 0xFFFFFFFFFFFFFFFFL is OK.
  - Fix bit shift bugs. <<, >>, >>> work well now.
0.0211 2017-07-08
  - Fix if statement condition not working bugs
  - try {  } catch () { } syntax is replaced with eval { }; if ($@) { ... } syntax.
0.0210 2017-07-08
  - Fix reference count bugs
0.0209 2017-07-07
  - len $nums is replaced with @$nums
  - $nums[0] is replaced with $nums->[0]
  - $obj{x} is replaced with $obj->{x}
0.0208 2017-07-06
  - add die logic when 32 bit Perl
  - add several SPVM internal functions
0.0207 2017-06-30
  - Fix amd64 segfault bug.
0.0206 2017-06-20
  - Argument and return value become normal SV which have IV or NV.
    # Example
    my $total = SPVM::MyModule2::foo(3, 5);
    print $total . "\n";

0.0205 2017-06-29
  - Only support 64 bit Perl.
    In 32 bit Perl, 64 bit integer is not supported. This means that Perl can not express 64 bit integers on source code.
0.0204 2017-06-28
  - add env interface. This is similar as JAVA JNI
0.0203 2017-06-26
  - build SPVM using same CCFLAG as Perl itself
0.0202 2017-06-25
  - use same CCFLAG in Makefile.PL
0.0201 2017-06-20
  - fix memset 0 bug
0.02 2017-06-20
  - improve XS type convertion logic
0.01 2017-06-17(DEVELOPMENT RELEASE
	- Fisrt development release