extpp 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
 - data/Rakefile +10 -10
 - data/doc/text/news.md +14 -0
 - data/ext/extpp/class.cpp +19 -6
 - data/ext/extpp/extconf.rb +8 -2
 - data/ext/extpp/object.cpp +1 -1
 - data/ext/extpp/protect.cpp +12 -0
 - data/include/ruby.hpp +1 -0
 - data/include/ruby/cast.hpp +37 -13
 - data/include/ruby/class.hpp +2 -1
 - data/include/ruby/object.hpp +4 -1
 - data/include/ruby/protect.hpp +37 -0
 - data/include/ruby/type.hpp +3 -1
 - data/lib/extpp.rb +1 -1
 - data/lib/extpp/compiler.rb +44 -10
 - data/lib/extpp/version.rb +1 -1
 - data/test/fixtures/cast/Makefile +15 -13
 - data/test/fixtures/cast/cast.cpp +7 -0
 - data/test/fixtures/cast/cast.o +0 -0
 - data/test/fixtures/cast/cast.so +0 -0
 - data/test/fixtures/cast/mkmf.log +133 -1
 - data/test/fixtures/class/Makefile +15 -13
 - data/test/fixtures/class/class.o +0 -0
 - data/test/fixtures/class/class.so +0 -0
 - data/test/fixtures/class/mkmf.log +133 -1
 - data/test/fixtures/object/Makefile +15 -13
 - data/test/fixtures/object/mkmf.log +133 -1
 - data/test/fixtures/object/object.o +0 -0
 - data/test/fixtures/object/object.so +0 -0
 - data/test/fixtures/protect/Makefile +269 -0
 - data/test/fixtures/protect/extconf.rb +4 -0
 - data/test/fixtures/protect/mkmf.log +140 -0
 - data/test/fixtures/protect/protect.cpp +70 -0
 - data/test/fixtures/protect/protect.o +0 -0
 - data/test/fixtures/protect/protect.so +0 -0
 - data/test/test-cast.rb +4 -0
 - data/test/test-protect.rb +54 -0
 - metadata +19 -45
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 1c37906ea8ea871e171e387ce61d68bc162cdc7d45aa94c85e9a080c1565b4a1
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c1f54dea942fa0329b8e275bdb296e880d1b1731ec16eff59ef663509bad2fbc
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 0dd33cc753814d03f1d2f1177a4ff74138a1c52808ee4bccfd3f4d8c52f8667e35f310d7d9afd3b64c3f0233d6549e2e0977b80a8d6947f3297f4188b4c5f089
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 92f0058fb4af4f2da3702a0af37a4afb3095cb7fc3e5891b7500e29458a3fe21f4a7cf4c17c82553a916603643eb871fd921df3cf354336fb903d0ddf184756f
         
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -2,7 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require "rubygems"
         
     | 
| 
       4 
4 
     | 
    
         
             
            require "bundler/gem_helper"
         
     | 
| 
       5 
     | 
    
         
            -
            require " 
     | 
| 
      
 5 
     | 
    
         
            +
            require "rake/clean"
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            base_dir = File.join(File.dirname(__FILE__))
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
         @@ -12,15 +12,6 @@ def helper.version_tag 
     | 
|
| 
       12 
12 
     | 
    
         
             
            end
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
            helper.install
         
     | 
| 
       15 
     | 
    
         
            -
            spec = helper.gemspec
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
            Packnga::DocumentTask.new(spec) do |task|
         
     | 
| 
       18 
     | 
    
         
            -
              task.original_language = "en"
         
     | 
| 
       19 
     | 
    
         
            -
              task.translate_language = "ja"
         
     | 
| 
       20 
     | 
    
         
            -
            end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            Packnga::ReleaseTask.new(spec) do
         
     | 
| 
       23 
     | 
    
         
            -
            end
         
     | 
| 
       24 
15 
     | 
    
         | 
| 
       25 
16 
     | 
    
         
             
            def run_extconf(*arguments)
         
     | 
| 
       26 
17 
     | 
    
         
             
              cd("ext/extpp") do
         
     | 
| 
         @@ -40,6 +31,15 @@ namespace :configure do 
     | 
|
| 
       40 
31 
     | 
    
         
             
              end
         
     | 
| 
       41 
32 
     | 
    
         
             
            end
         
     | 
| 
       42 
33 
     | 
    
         | 
| 
      
 34 
     | 
    
         
            +
            task :clean do
         
     | 
| 
      
 35 
     | 
    
         
            +
              makefile = "ext/extpp/Makefile"
         
     | 
| 
      
 36 
     | 
    
         
            +
              if File.exists?(makefile)
         
     | 
| 
      
 37 
     | 
    
         
            +
                cd(File.dirname(makefile)) do
         
     | 
| 
      
 38 
     | 
    
         
            +
                  sh("make", "clean")
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
       43 
43 
     | 
    
         
             
            desc "Run tests"
         
     | 
| 
       44 
44 
     | 
    
         
             
            task :test do
         
     | 
| 
       45 
45 
     | 
    
         
             
              ruby("test/run-test.rb")
         
     | 
    
        data/doc/text/news.md
    CHANGED
    
    | 
         @@ -1,5 +1,19 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # News
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## 0.0.4 - 2019-02-16
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ### Improvements
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              * `rb::Class(const char *name)`: Added.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              * `rb::protect()`: Added.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              * `rb::cast<std::string>(rb::Object)`: Added.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              * `rb::cast<rb::Object(std::string)`: Added.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              * Added support for auto needless C++ compiler warning flags remove.
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       3 
17 
     | 
    
         
             
            ## 0.0.3 - 2018-02-18
         
     | 
| 
       4 
18 
     | 
    
         | 
| 
       5 
19 
     | 
    
         
             
            ### Improvements
         
     | 
    
        data/ext/extpp/class.cpp
    CHANGED
    
    | 
         @@ -108,7 +108,7 @@ namespace { 
     | 
|
| 
       108 
108 
     | 
    
         
             
                  (*method_table)[name_id] = definition.function;
         
     | 
| 
       109 
109 
     | 
    
         
             
                  rb_define_method(klass,
         
     | 
| 
       110 
110 
     | 
    
         
             
                                   definition.name.c_str(),
         
     | 
| 
       111 
     | 
    
         
            -
                                   reinterpret_cast<rb:: 
     | 
| 
      
 111 
     | 
    
         
            +
                                   reinterpret_cast<rb::RawMethod>(call_func),
         
     | 
| 
       112 
112 
     | 
    
         
             
                                   -1);
         
     | 
| 
       113 
113 
     | 
    
         
             
                }
         
     | 
| 
       114 
114 
     | 
    
         
             
                rb_ivar_set(klass, id_method_definitions, Qnil);
         
     | 
| 
         @@ -179,18 +179,18 @@ namespace rb { 
     | 
|
| 
       179 
179 
     | 
    
         
             
                            method_definitions_to_ruby(method_definitions_));
         
     | 
| 
       180 
180 
     | 
    
         
             
                  rb_define_method(class_,
         
     | 
| 
       181 
181 
     | 
    
         
             
                                   "method_missing",
         
     | 
| 
       182 
     | 
    
         
            -
                                   reinterpret_cast< 
     | 
| 
      
 182 
     | 
    
         
            +
                                   reinterpret_cast<RawMethod>(method_missing),
         
     | 
| 
       183 
183 
     | 
    
         
             
                                   -1);
         
     | 
| 
       184 
184 
     | 
    
         
             
                  rb_define_method(class_,
         
     | 
| 
       185 
185 
     | 
    
         
             
                                   "respond_to_missing?",
         
     | 
| 
       186 
     | 
    
         
            -
                                   reinterpret_cast< 
     | 
| 
      
 186 
     | 
    
         
            +
                                   reinterpret_cast<RawMethod>(respond_to_missing_p),
         
     | 
| 
       187 
187 
     | 
    
         
             
                                   -1);
         
     | 
| 
       188 
188 
     | 
    
         
             
                }
         
     | 
| 
       189 
189 
     | 
    
         | 
| 
       190 
190 
     | 
    
         
             
                void define_method(const char *name, VALUE (*body)(VALUE self)) {
         
     | 
| 
       191 
191 
     | 
    
         
             
                  rb_define_method(class_,
         
     | 
| 
       192 
192 
     | 
    
         
             
                                   name,
         
     | 
| 
       193 
     | 
    
         
            -
                                   reinterpret_cast< 
     | 
| 
      
 193 
     | 
    
         
            +
                                   reinterpret_cast<RawMethod>(body),
         
     | 
| 
       194 
194 
     | 
    
         
             
                                   0);
         
     | 
| 
       195 
195 
     | 
    
         
             
                }
         
     | 
| 
       196 
196 
     | 
    
         | 
| 
         @@ -198,7 +198,7 @@ namespace rb { 
     | 
|
| 
       198 
198 
     | 
    
         
             
                                   VALUE (*body)(int argc, VALUE *argv, VALUE self)) {
         
     | 
| 
       199 
199 
     | 
    
         
             
                  rb_define_method(class_,
         
     | 
| 
       200 
200 
     | 
    
         
             
                                   name,
         
     | 
| 
       201 
     | 
    
         
            -
                                   reinterpret_cast< 
     | 
| 
      
 201 
     | 
    
         
            +
                                   reinterpret_cast<RawMethod>(body),
         
     | 
| 
       202 
202 
     | 
    
         
             
                                   -1);
         
     | 
| 
       203 
203 
     | 
    
         
             
                }
         
     | 
| 
       204 
204 
     | 
    
         | 
| 
         @@ -210,7 +210,7 @@ namespace rb { 
     | 
|
| 
       210 
210 
     | 
    
         
             
                    (*method_table_)[name_id] = function;
         
     | 
| 
       211 
211 
     | 
    
         
             
                    rb_define_method(class_,
         
     | 
| 
       212 
212 
     | 
    
         
             
                                     name,
         
     | 
| 
       213 
     | 
    
         
            -
                                     reinterpret_cast< 
     | 
| 
      
 213 
     | 
    
         
            +
                                     reinterpret_cast<RawMethod>(call_func),
         
     | 
| 
       214 
214 
     | 
    
         
             
                                     -1);
         
     | 
| 
       215 
215 
     | 
    
         
             
                  }
         
     | 
| 
       216 
216 
     | 
    
         
             
                }
         
     | 
| 
         @@ -222,6 +222,19 @@ namespace rb { 
     | 
|
| 
       222 
222 
     | 
    
         
             
                MethodDefinitions *method_definitions_;
         
     | 
| 
       223 
223 
     | 
    
         
             
              };
         
     | 
| 
       224 
224 
     | 
    
         | 
| 
      
 225 
     | 
    
         
            +
              Class::Class(const char *name) :
         
     | 
| 
      
 226 
     | 
    
         
            +
                Object(RTEST(rb_funcall(rb_cObject,
         
     | 
| 
      
 227 
     | 
    
         
            +
                                        rb_intern("const_defined?"),
         
     | 
| 
      
 228 
     | 
    
         
            +
                                        1,
         
     | 
| 
      
 229 
     | 
    
         
            +
                                        rb_str_new_static(name, strlen(name)))) ?
         
     | 
| 
      
 230 
     | 
    
         
            +
                       rb_funcall(rb_cObject,
         
     | 
| 
      
 231 
     | 
    
         
            +
                                  rb_intern("const_get"),
         
     | 
| 
      
 232 
     | 
    
         
            +
                                  1,
         
     | 
| 
      
 233 
     | 
    
         
            +
                                  rb_str_new_static(name, strlen(name))) :
         
     | 
| 
      
 234 
     | 
    
         
            +
                       rb_define_class(name, rb_cObject)),
         
     | 
| 
      
 235 
     | 
    
         
            +
                impl_(new ClassImpl(this->to_ruby())) {
         
     | 
| 
      
 236 
     | 
    
         
            +
              }
         
     | 
| 
      
 237 
     | 
    
         
            +
             
     | 
| 
       225 
238 
     | 
    
         
             
              Class::Class(const char *name, VALUE parent) :
         
     | 
| 
       226 
239 
     | 
    
         
             
                Object(rb_define_class(name, parent)),
         
     | 
| 
       227 
240 
     | 
    
         
             
                impl_(new ClassImpl(this->to_ruby())) {
         
     | 
    
        data/ext/extpp/extconf.rb
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require_relative "../../lib/extpp/compiler"
         
     | 
| 
       2 
2 
     | 
    
         
             
            require_relative "../../lib/extpp/platform"
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
            cxxflags = RbConfig 
     | 
| 
      
 4 
     | 
    
         
            +
            cxxflags = RbConfig.expand("$(CXXFLAGS)")
         
     | 
| 
       5 
5 
     | 
    
         
             
            compiler = ExtPP::Compiler.new(cxxflags)
         
     | 
| 
       6 
6 
     | 
    
         
             
            compiler.check
         
     | 
| 
       7 
7 
     | 
    
         
             
            cxxflags = compiler.cxx_flags
         
     | 
| 
         @@ -38,6 +38,11 @@ else 
     | 
|
| 
       38 
38 
     | 
    
         
             
              ldsharedxx = RbConfig::CONFIG["LDSHAREDXX"]
         
     | 
| 
       39 
39 
     | 
    
         
             
            end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
      
 41 
     | 
    
         
            +
            librubyarg_shared = RbConfig::CONFIG["LIBRUBYARG_SHARED"]
         
     | 
| 
      
 42 
     | 
    
         
            +
            if compiler.gcc? and !librubyarg_shared.include?("-L")
         
     | 
| 
      
 43 
     | 
    
         
            +
              librubyarg_shared += " -L$(libdir)"
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
       41 
46 
     | 
    
         
             
            File.open("Makefile", "w") do |makefile|
         
     | 
| 
       42 
47 
     | 
    
         
             
              makefile.puts(<<-MAKEFILE)
         
     | 
| 
       43 
48 
     | 
    
         
             
            LIBRARY = libruby-extpp.#{platform.dynamic_library_extension}
         
     | 
| 
         @@ -54,10 +59,11 @@ RUBY = #{RbConfig.ruby.quote} 
     | 
|
| 
       54 
59 
     | 
    
         
             
            RUBY_HEADER_DIR = #{RbConfig::CONFIG["rubyhdrdir"].quote}
         
     | 
| 
       55 
60 
     | 
    
         
             
            RUBY_ARCH_HEADER_DIR = #{RbConfig::CONFIG["rubyarchhdrdir"].quote}
         
     | 
| 
       56 
61 
     | 
    
         | 
| 
      
 62 
     | 
    
         
            +
            libdir = #{RbConfig::CONFIG["libdir"].quote}
         
     | 
| 
       57 
63 
     | 
    
         
             
            sitearchdir = #{RbConfig::CONFIG["sitearchdir"].quote}
         
     | 
| 
       58 
64 
     | 
    
         
             
            sitelibdir = #{RbConfig::CONFIG["sitelibdir"].quote}
         
     | 
| 
       59 
65 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
            LIBRUBYARG_SHARED = #{ 
     | 
| 
      
 66 
     | 
    
         
            +
            LIBRUBYARG_SHARED = #{librubyarg_shared}
         
     | 
| 
       61 
67 
     | 
    
         
             
            ARCH_FLAG = #{RbConfig::CONFIG["ARCH_FLAG"]}
         
     | 
| 
       62 
68 
     | 
    
         
             
            LDFLAGS = #{RbConfig::CONFIG["LDFLAGS"]}
         
     | 
| 
       63 
69 
     | 
    
         
             
            DLDFLAGS = #{RbConfig::CONFIG["DLDFLAGS"]}
         
     | 
    
        data/ext/extpp/object.cpp
    CHANGED
    
    
| 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include <ruby/protect.hpp>
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rb {
         
     | 
| 
      
 4 
     | 
    
         
            +
              VALUE protect(RawCallback callback, VALUE callback_data) {
         
     | 
| 
      
 5 
     | 
    
         
            +
                int state = 0;
         
     | 
| 
      
 6 
     | 
    
         
            +
                auto result = rb_protect(callback, callback_data, &state);
         
     | 
| 
      
 7 
     | 
    
         
            +
                if (state != 0) {
         
     | 
| 
      
 8 
     | 
    
         
            +
                  throw State(state);
         
     | 
| 
      
 9 
     | 
    
         
            +
                }
         
     | 
| 
      
 10 
     | 
    
         
            +
                return result;
         
     | 
| 
      
 11 
     | 
    
         
            +
              }
         
     | 
| 
      
 12 
     | 
    
         
            +
            }
         
     | 
    
        data/include/ruby.hpp
    CHANGED
    
    
    
        data/include/ruby/cast.hpp
    CHANGED
    
    | 
         @@ -1,74 +1,98 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #pragma once
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            #include <string>
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
            #include <ruby/object.hpp>
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            namespace rb {
         
     | 
| 
       6 
8 
     | 
    
         
             
              template <typename RETURN_TYPE, typename ARGUMENT_TYPE>
         
     | 
| 
       7 
     | 
    
         
            -
              inline RETURN_TYPE cast(ARGUMENT_TYPE object);
         
     | 
| 
      
 9 
     | 
    
         
            +
              inline RETURN_TYPE cast(const ARGUMENT_TYPE& object);
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              template <typename RETURN_TYPE, typename ARGUMENT_TYPE>
         
     | 
| 
      
 12 
     | 
    
         
            +
              inline RETURN_TYPE cast(const ARGUMENT_TYPE *object);
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              template <typename RETURN_TYPE,
         
     | 
| 
      
 15 
     | 
    
         
            +
                        typename ARGUMENT_TYPE,
         
     | 
| 
      
 16 
     | 
    
         
            +
                        typename ADDTIONAL_DATA_TYPE1>
         
     | 
| 
      
 17 
     | 
    
         
            +
              inline RETURN_TYPE cast(const ARGUMENT_TYPE& object,
         
     | 
| 
      
 18 
     | 
    
         
            +
                                      ADDTIONAL_DATA_TYPE1 data1);
         
     | 
| 
       8 
19 
     | 
    
         | 
| 
       9 
20 
     | 
    
         
             
              template <typename RETURN_TYPE,
         
     | 
| 
       10 
21 
     | 
    
         
             
                        typename ARGUMENT_TYPE,
         
     | 
| 
       11 
22 
     | 
    
         
             
                        typename ADDTIONAL_DATA_TYPE1>
         
     | 
| 
       12 
     | 
    
         
            -
              inline RETURN_TYPE cast(ARGUMENT_TYPE object,
         
     | 
| 
      
 23 
     | 
    
         
            +
              inline RETURN_TYPE cast(const ARGUMENT_TYPE *object,
         
     | 
| 
       13 
24 
     | 
    
         
             
                                      ADDTIONAL_DATA_TYPE1 data1);
         
     | 
| 
       14 
25 
     | 
    
         | 
| 
       15 
26 
     | 
    
         
             
              template <>
         
     | 
| 
       16 
     | 
    
         
            -
              inline int32_t cast<int32_t, Object>(Object rb_object) {
         
     | 
| 
      
 27 
     | 
    
         
            +
              inline int32_t cast<int32_t, Object>(const Object& rb_object) {
         
     | 
| 
       17 
28 
     | 
    
         
             
                return NUM2INT(rb_object);
         
     | 
| 
       18 
29 
     | 
    
         
             
              }
         
     | 
| 
       19 
30 
     | 
    
         | 
| 
       20 
31 
     | 
    
         
             
              template <>
         
     | 
| 
       21 
     | 
    
         
            -
              inline Object cast<Object, int32_t>(int32_t n) {
         
     | 
| 
      
 32 
     | 
    
         
            +
              inline Object cast<Object, int32_t>(const int32_t& n) {
         
     | 
| 
       22 
33 
     | 
    
         
             
                return Object(INT2NUM(n));
         
     | 
| 
       23 
34 
     | 
    
         
             
              }
         
     | 
| 
       24 
35 
     | 
    
         | 
| 
       25 
36 
     | 
    
         | 
| 
       26 
37 
     | 
    
         
             
              template <>
         
     | 
| 
       27 
     | 
    
         
            -
              inline int64_t cast<int64_t, Object>(Object rb_object) {
         
     | 
| 
      
 38 
     | 
    
         
            +
              inline int64_t cast<int64_t, Object>(const Object& rb_object) {
         
     | 
| 
       28 
39 
     | 
    
         
             
                return NUM2LONG(rb_object);
         
     | 
| 
       29 
40 
     | 
    
         
             
              }
         
     | 
| 
       30 
41 
     | 
    
         | 
| 
       31 
42 
     | 
    
         
             
              template <>
         
     | 
| 
       32 
     | 
    
         
            -
              inline Object cast<Object, int64_t>(int64_t n) {
         
     | 
| 
      
 43 
     | 
    
         
            +
              inline Object cast<Object, int64_t>(const int64_t& n) {
         
     | 
| 
       33 
44 
     | 
    
         
             
                return Object(LONG2NUM(n));
         
     | 
| 
       34 
45 
     | 
    
         
             
              }
         
     | 
| 
       35 
46 
     | 
    
         | 
| 
       36 
47 
     | 
    
         | 
| 
       37 
48 
     | 
    
         
             
              template <>
         
     | 
| 
       38 
     | 
    
         
            -
              inline uint32_t cast<uint32_t, Object>(Object rb_object) {
         
     | 
| 
      
 49 
     | 
    
         
            +
              inline uint32_t cast<uint32_t, Object>(const Object& rb_object) {
         
     | 
| 
       39 
50 
     | 
    
         
             
                return NUM2UINT(rb_object);
         
     | 
| 
       40 
51 
     | 
    
         
             
              }
         
     | 
| 
       41 
52 
     | 
    
         | 
| 
       42 
53 
     | 
    
         
             
              template <>
         
     | 
| 
       43 
     | 
    
         
            -
              inline Object cast<Object, uint32_t>(uint32_t n) {
         
     | 
| 
      
 54 
     | 
    
         
            +
              inline Object cast<Object, uint32_t>(const uint32_t& n) {
         
     | 
| 
       44 
55 
     | 
    
         
             
                return Object(UINT2NUM(n));
         
     | 
| 
       45 
56 
     | 
    
         
             
              }
         
     | 
| 
       46 
57 
     | 
    
         | 
| 
       47 
58 
     | 
    
         | 
| 
       48 
59 
     | 
    
         
             
              template <>
         
     | 
| 
       49 
     | 
    
         
            -
              inline uint64_t cast<uint64_t, Object>(Object rb_object) {
         
     | 
| 
      
 60 
     | 
    
         
            +
              inline uint64_t cast<uint64_t, Object>(const Object& rb_object) {
         
     | 
| 
       50 
61 
     | 
    
         
             
                return NUM2ULONG(rb_object);
         
     | 
| 
       51 
62 
     | 
    
         
             
              }
         
     | 
| 
       52 
63 
     | 
    
         | 
| 
       53 
64 
     | 
    
         
             
              template <>
         
     | 
| 
       54 
     | 
    
         
            -
              inline Object cast<Object, uint64_t>(uint64_t n) {
         
     | 
| 
      
 65 
     | 
    
         
            +
              inline Object cast<Object, uint64_t>(const uint64_t& n) {
         
     | 
| 
       55 
66 
     | 
    
         
             
                return Object(ULONG2NUM(n));
         
     | 
| 
       56 
67 
     | 
    
         
             
              }
         
     | 
| 
       57 
68 
     | 
    
         | 
| 
       58 
69 
     | 
    
         | 
| 
       59 
70 
     | 
    
         
             
              template <>
         
     | 
| 
       60 
     | 
    
         
            -
              inline const char *cast<const char *, Object>(Object rb_object) {
         
     | 
| 
      
 71 
     | 
    
         
            +
              inline const char *cast<const char *, Object>(const Object& rb_object) {
         
     | 
| 
       61 
72 
     | 
    
         
             
                VALUE rb_object_raw = rb_object;
         
     | 
| 
       62 
73 
     | 
    
         
             
                return StringValueCStr(rb_object_raw);
         
     | 
| 
       63 
74 
     | 
    
         
             
              }
         
     | 
| 
       64 
75 
     | 
    
         | 
| 
       65 
76 
     | 
    
         
             
              template <>
         
     | 
| 
       66 
     | 
    
         
            -
              inline Object cast<Object,  
     | 
| 
      
 77 
     | 
    
         
            +
              inline Object cast<Object, char>(const char *c_string) {
         
     | 
| 
       67 
78 
     | 
    
         
             
                return Object(rb_str_new_cstr(c_string));
         
     | 
| 
       68 
79 
     | 
    
         
             
              }
         
     | 
| 
       69 
80 
     | 
    
         | 
| 
       70 
81 
     | 
    
         
             
              template <>
         
     | 
| 
       71 
     | 
    
         
            -
              inline Object cast<Object,  
     | 
| 
      
 82 
     | 
    
         
            +
              inline Object cast<Object, char, long>(const char *data, long size) {
         
     | 
| 
       72 
83 
     | 
    
         
             
                return Object(rb_str_new(data, size));
         
     | 
| 
       73 
84 
     | 
    
         
             
              }
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
              template <>
         
     | 
| 
      
 88 
     | 
    
         
            +
              inline std::string cast<std::string, Object>(const Object& rb_object) {
         
     | 
| 
      
 89 
     | 
    
         
            +
                VALUE rb_object_raw = rb_object;
         
     | 
| 
      
 90 
     | 
    
         
            +
                return std::string(RSTRING_PTR(rb_object_raw),
         
     | 
| 
      
 91 
     | 
    
         
            +
                                   RSTRING_LEN(rb_object_raw));
         
     | 
| 
      
 92 
     | 
    
         
            +
              }
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              template <>
         
     | 
| 
      
 95 
     | 
    
         
            +
              inline Object cast<Object, std::string>(const std::string& string) {
         
     | 
| 
      
 96 
     | 
    
         
            +
                return Object(rb_str_new(string.data(), string.size()));
         
     | 
| 
      
 97 
     | 
    
         
            +
              }
         
     | 
| 
       74 
98 
     | 
    
         
             
            }
         
     | 
    
        data/include/ruby/class.hpp
    CHANGED
    
    
    
        data/include/ruby/object.hpp
    CHANGED
    
    | 
         @@ -13,7 +13,10 @@ namespace rb { 
     | 
|
| 
       13 
13 
     | 
    
         
             
                }
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                explicit Object(const char *name) :
         
     | 
| 
       16 
     | 
    
         
            -
                  rb_object_( 
     | 
| 
      
 16 
     | 
    
         
            +
                  rb_object_(rb_funcall(rb_cObject,
         
     | 
| 
      
 17 
     | 
    
         
            +
                                        rb_intern("const_get"),
         
     | 
| 
      
 18 
     | 
    
         
            +
                                        1,
         
     | 
| 
      
 19 
     | 
    
         
            +
                                        rb_str_new_static(name, strlen(name)))),
         
     | 
| 
       17 
20 
     | 
    
         
             
                  is_gc_guarding_(false) {
         
     | 
| 
       18 
21 
     | 
    
         
             
                }
         
     | 
| 
       19 
22 
     | 
    
         | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #pragma once
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            #include <ruby/type.hpp>
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            namespace rb {
         
     | 
| 
      
 6 
     | 
    
         
            +
              class State {
         
     | 
| 
      
 7 
     | 
    
         
            +
              public:
         
     | 
| 
      
 8 
     | 
    
         
            +
                explicit State(int state) :
         
     | 
| 
      
 9 
     | 
    
         
            +
                  state_(state) {
         
     | 
| 
      
 10 
     | 
    
         
            +
                }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                inline void jump() {
         
     | 
| 
      
 13 
     | 
    
         
            +
                  rb_jump_tag(state_);
         
     | 
| 
      
 14 
     | 
    
         
            +
                }
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              private:
         
     | 
| 
      
 17 
     | 
    
         
            +
                int state_;
         
     | 
| 
      
 18 
     | 
    
         
            +
              };
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              VALUE protect(RawCallback callback, VALUE callback_data);
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              template <typename CALLBACK>
         
     | 
| 
      
 23 
     | 
    
         
            +
              VALUE protect(const CALLBACK& callback) {
         
     | 
| 
      
 24 
     | 
    
         
            +
                struct Data {
         
     | 
| 
      
 25 
     | 
    
         
            +
                  Data(const CALLBACK& callback) :
         
     | 
| 
      
 26 
     | 
    
         
            +
                    callback_(callback) {
         
     | 
| 
      
 27 
     | 
    
         
            +
                  }
         
     | 
| 
      
 28 
     | 
    
         
            +
                  const CALLBACK& callback_;
         
     | 
| 
      
 29 
     | 
    
         
            +
                } data(callback);
         
     | 
| 
      
 30 
     | 
    
         
            +
                auto callback_data = reinterpret_cast<VALUE>(&data);
         
     | 
| 
      
 31 
     | 
    
         
            +
                return protect([](VALUE callback_data) -> VALUE {
         
     | 
| 
      
 32 
     | 
    
         
            +
                                 auto data = reinterpret_cast<Data *>(callback_data);
         
     | 
| 
      
 33 
     | 
    
         
            +
                                 return data->callback_();
         
     | 
| 
      
 34 
     | 
    
         
            +
                               },
         
     | 
| 
      
 35 
     | 
    
         
            +
                               callback_data);
         
     | 
| 
      
 36 
     | 
    
         
            +
              };
         
     | 
| 
      
 37 
     | 
    
         
            +
            }
         
     | 
    
        data/include/ruby/type.hpp
    CHANGED
    
    | 
         @@ -3,10 +3,12 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            #include <ruby.h>
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            namespace rb {
         
     | 
| 
       6 
     | 
    
         
            -
              using  
     | 
| 
      
 6 
     | 
    
         
            +
              using RawMethod = VALUE (*)(ANYARGS);
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
              using MethodWithoutArguments = VALUE (*)(VALUE self);
         
     | 
| 
       9 
9 
     | 
    
         
             
              using MethodWithArguments = VALUE (*)(VALUE self, int argc, VALUE *argv);
         
     | 
| 
       10 
10 
     | 
    
         
             
              using MethodWithArgumentsCompatible =
         
     | 
| 
       11 
11 
     | 
    
         
             
                VALUE (*)(int argc, VALUE *argv, VALUE self);
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              using RawCallback = VALUE (*)(VALUE user_data);
         
     | 
| 
       12 
14 
     | 
    
         
             
            }
         
     | 
    
        data/lib/extpp.rb
    CHANGED
    
    
    
        data/lib/extpp/compiler.rb
    CHANGED
    
    | 
         @@ -14,6 +14,7 @@ module ExtPP 
     | 
|
| 
       14 
14 
     | 
    
         
             
                def check
         
     | 
| 
       15 
15 
     | 
    
         
             
                  check_debug_build
         
     | 
| 
       16 
16 
     | 
    
         
             
                  check_version
         
     | 
| 
      
 17 
     | 
    
         
            +
                  check_warning_flags
         
     | 
| 
       17 
18 
     | 
    
         
             
                end
         
     | 
| 
       18 
19 
     | 
    
         | 
| 
       19 
20 
     | 
    
         
             
                private
         
     | 
| 
         @@ -28,6 +29,22 @@ module ExtPP 
     | 
|
| 
       28 
29 
     | 
    
         
             
                  end
         
     | 
| 
       29 
30 
     | 
    
         
             
                end
         
     | 
| 
       30 
31 
     | 
    
         | 
| 
      
 32 
     | 
    
         
            +
                def disable_optimization_build_flag(flags)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  if gcc?
         
     | 
| 
      
 34 
     | 
    
         
            +
                    flags.gsub(/(^|\s)-O\d(\s|$)/, '\\1-O0\\2')
         
     | 
| 
      
 35 
     | 
    
         
            +
                  else
         
     | 
| 
      
 36 
     | 
    
         
            +
                    flags
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                def enable_debug_build_flag(flags)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  if gcc?
         
     | 
| 
      
 42 
     | 
    
         
            +
                    flags.gsub(/(^|\s)(?:-g|-g\d|-ggdb\d?)(\s|$)/, '\\1-g3\\2')
         
     | 
| 
      
 43 
     | 
    
         
            +
                  else
         
     | 
| 
      
 44 
     | 
    
         
            +
                    flags
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       31 
48 
     | 
    
         
             
                def check_version
         
     | 
| 
       32 
49 
     | 
    
         
             
                  return unless gcc?
         
     | 
| 
       33 
50 
     | 
    
         | 
| 
         @@ -73,20 +90,37 @@ module ExtPP 
     | 
|
| 
       73 
90 
     | 
    
         
             
                  end
         
     | 
| 
       74 
91 
     | 
    
         
             
                end
         
     | 
| 
       75 
92 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                def  
     | 
| 
       77 
     | 
    
         
            -
                   
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                     
     | 
| 
      
 93 
     | 
    
         
            +
                def try_cxx_warning_flag(warning_flag)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  conftest_cxx = "#{CONFTEST}.cpp"
         
     | 
| 
      
 95 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 96 
     | 
    
         
            +
                    source = "int main(void) {return 0;}"
         
     | 
| 
      
 97 
     | 
    
         
            +
                    open(conftest_cxx, "wb") do |cxx_file|
         
     | 
| 
      
 98 
     | 
    
         
            +
                      cxx_file.print(source)
         
     | 
| 
      
 99 
     | 
    
         
            +
                    end
         
     | 
| 
      
 100 
     | 
    
         
            +
                    flags = "-Werror #{warning_flag}"
         
     | 
| 
      
 101 
     | 
    
         
            +
                    xsystem(RbConfig.expand("$(CXX) #{flags} -c #{conftest_cxx}"))
         
     | 
| 
      
 102 
     | 
    
         
            +
                  ensure
         
     | 
| 
      
 103 
     | 
    
         
            +
                    log_src(source)
         
     | 
| 
      
 104 
     | 
    
         
            +
                    MakeMakefile.rm_f(conftest_cxx)
         
     | 
| 
       81 
105 
     | 
    
         
             
                  end
         
     | 
| 
       82 
106 
     | 
    
         
             
                end
         
     | 
| 
       83 
107 
     | 
    
         | 
| 
       84 
     | 
    
         
            -
                def  
     | 
| 
       85 
     | 
    
         
            -
                   
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
                   
     | 
| 
       88 
     | 
    
         
            -
                     
     | 
| 
      
 108 
     | 
    
         
            +
                def check_warning_flags
         
     | 
| 
      
 109 
     | 
    
         
            +
                  flags = []
         
     | 
| 
      
 110 
     | 
    
         
            +
                  warning_flags = []
         
     | 
| 
      
 111 
     | 
    
         
            +
                  Shellwords.split(@cxx_flags).each do |flag|
         
     | 
| 
      
 112 
     | 
    
         
            +
                    if flag.start_with?("-W")
         
     | 
| 
      
 113 
     | 
    
         
            +
                      warning_flags << flag
         
     | 
| 
      
 114 
     | 
    
         
            +
                    else
         
     | 
| 
      
 115 
     | 
    
         
            +
                      flags << flag
         
     | 
| 
      
 116 
     | 
    
         
            +
                    end
         
     | 
| 
      
 117 
     | 
    
         
            +
                  end
         
     | 
| 
      
 118 
     | 
    
         
            +
                  warning_flags.each do |warning_flag|
         
     | 
| 
      
 119 
     | 
    
         
            +
                    if try_cxx_warning_flag(warning_flag.gsub(/\A-Wno-/, "-W"))
         
     | 
| 
      
 120 
     | 
    
         
            +
                      flags << warning_flag
         
     | 
| 
      
 121 
     | 
    
         
            +
                    end
         
     | 
| 
       89 
122 
     | 
    
         
             
                  end
         
     | 
| 
      
 123 
     | 
    
         
            +
                  @cxx_flags = Shellwords.join(flags)
         
     | 
| 
       90 
124 
     | 
    
         
             
                end
         
     | 
| 
       91 
125 
     | 
    
         
             
              end
         
     | 
| 
       92 
126 
     | 
    
         
             
            end
         
     |