Maintenance of Ruby 2.0.0 ended on February 24, 2016. Read more
BasicObject
# File dl/callback/mkcallback.rb, line 109 def foreach_proc_entry for calltype in CALLTYPES case calltype when CDECL proc_entry = "rb_DLCdeclCallbackProcs" when STDCALL proc_entry = "rb_DLStdcallCallbackProcs" else raise "unknown calltype: #{calltype}" end yield calltype, proc_entry end end
# File dl/callback/mkcallback.rb, line 91 def func_name(ty, argc, n, calltype) "rb_dl_callback_#{DLTYPE[ty][:name]}_#{argc}_#{n}_#{calltype}" end
# File dl/callback/mkcallback.rb, line 165 def gen_callback_file(ty) filename = "#{$output}-#{ty}.c" initname = "rb_dl_init_callbacks_#{ty}" body = <<-EOS #include "dl.h" extern VALUE rb_DLCdeclCallbackAddrs, rb_DLCdeclCallbackProcs; #ifdef FUNC_STDCALL extern VALUE rb_DLStdcallCallbackAddrs, rb_DLStdcallCallbackProcs; #endif extern ID rb_dl_cb_call; EOS yield body body << <<-EOS void #{initname}() { #{gen_push_proc_ary(ty, "rb_DLCdeclCallbackProcs")} #{gen_push_addr_ary(ty, "rb_DLCdeclCallbackAddrs", CDECL)} #ifdef FUNC_STDCALL #{gen_push_proc_ary(ty, "rb_DLStdcallCallbackProcs")} #{gen_push_addr_ary(ty, "rb_DLStdcallCallbackAddrs", STDCALL)} #endif } EOS [filename, initname, body] end
# File dl/callback/mkcallback.rb, line 155 def gen_push_addr_ary(ty, aryname, calltype) sprintf(" rb_ary_push(#{aryname}, rb_ary_new3(%d,%s));", MAX_CALLBACK * DLSTACK_SIZE, (0...MAX_CALLBACK).collect{|i| (0...DLSTACK_SIZE).collect{|argc| "PTR2NUM(%s)" % func_name(ty,argc,i,calltype) }.join(",") }.join(",")) end
# File dl/callback/mkcallback.rb, line 147 def gen_push_proc_ary(ty, aryname) sprintf(" rb_ary_push(#{aryname}, rb_ary_new3(%d,%s));", MAX_CALLBACK * DLSTACK_SIZE, (0...MAX_CALLBACK).collect{ (0...DLSTACK_SIZE).collect{ "Qnil" }.join(",") }.join(",")) end
# File dl/callback/mkcallback.rb, line 123 def gencallback(ty, calltype, proc_entry, argc, n) dltype = DLTYPE[ty] ret = dltype[:conv] src = <<-EOS #{calltype == STDCALL ? "\n#ifdef FUNC_STDCALL" : ""} static #{dltype[:type]} FUNC_#{calltype.upcase}(#{func_name(ty,argc,n,calltype)})(#{(0...argc).collect{|i| "DLSTACK_TYPE stack#{i}"}.join(", ")}) { VALUE #{ret ? "ret, " : ""}cb#{argc > 0 ? ", args[#{argc}]" : ""}; #{ (0...argc).collect{|i| "\n args[#{i}] = PTR2NUM(stack#{i});" }.join("") } cb = rb_ary_entry(rb_ary_entry(#{proc_entry}, #{ty}), #{(n * DLSTACK_SIZE) + argc}); #{ret ? "ret = " : ""}rb_funcall2(cb, rb_dl_cb_call, #{argc}, #{argc > 0 ? 'args' : 'NULL'}); EOS src << " return #{ret % "ret"};\n" if ret src << <<-EOS } #{calltype == STDCALL ? "#endif\n" : ""} EOS end