datadog-ruby_core_source 3.4.0 → 3.4.2
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 +4 -4
- data/CHANGELOG.datadog.md +4 -0
- data/README.md +8 -5
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ccan/build_assert/build_assert.h +40 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ccan/check_type/check_type.h +63 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ccan/container_of/container_of.h +142 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ccan/list/list.h +791 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ccan/str/str.h +17 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/id.h +352 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/id_table.h +39 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/array.h +152 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/basic_operators.h +65 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/bignum.h +244 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/bits.h +650 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/class.h +283 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/cmdlineopt.h +61 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/compar.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/compile.h +34 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/compilers.h +107 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/complex.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/cont.h +35 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/dir.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/enc.h +19 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/encoding.h +38 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/enum.h +18 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/enumerator.h +21 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/error.h +244 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/eval.h +33 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/file.h +38 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/fixnum.h +185 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/gc.h +333 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/hash.h +193 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/imemo.h +257 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/inits.h +47 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/io.h +143 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/load.h +18 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/loadpath.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/math.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/missing.h +19 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/numeric.h +274 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/object.h +63 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/parse.h +131 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/proc.h +30 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/process.h +124 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/ractor.h +10 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/random.h +17 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/range.h +40 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/rational.h +71 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/re.h +28 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/ruby_parser.h +102 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/sanitizers.h +330 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/serial.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/signal.h +24 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/st.h +11 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/static_assert.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/string.h +199 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/struct.h +119 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/symbol.h +47 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/thread.h +108 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/time.h +37 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/transcode.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/util.h +27 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/variable.h +70 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/vm.h +137 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal/warnings.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/internal.h +108 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/iseq.h +351 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/method.h +258 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/node.h +122 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/parser_st.h +162 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/parser_value.h +106 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/ast.h +7964 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/defines.h +260 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/diagnostic.h +451 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/encoding.h +283 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/extension.h +19 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/node.h +129 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/options.h +442 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/pack.h +163 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/parser.h +933 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/prettyprint.h +34 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/prism.h +383 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/regexp.h +43 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/static_literals.h +121 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_buffer.h +228 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_char.h +204 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_constant_pool.h +218 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_integer.h +126 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_list.h +97 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_memchr.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_newline_list.h +113 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_string.h +190 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_strncasecmp.h +32 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/util/pm_strpbrk.h +46 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism/version.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/prism_compile.h +105 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ractor_core.h +382 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ruby_assert.h +14 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/ruby_atomic.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/rubyparser.h +1380 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/shape.h +234 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/thread_none.h +21 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/thread_pthread.h +167 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/vm_core.h +2235 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/vm_debug.h +124 -0
- data/lib/datadog/ruby_core_source/ruby-3.5.0-preview1/vm_opts.h +67 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ccan/build_assert/build_assert.h +40 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ccan/check_type/check_type.h +63 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ccan/container_of/container_of.h +142 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ccan/list/list.h +791 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ccan/str/str.h +17 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/id.h +354 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/id_table.h +54 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/array.h +154 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/basic_operators.h +65 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/bignum.h +245 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/bits.h +650 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/box.h +81 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/class.h +805 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/cmdlineopt.h +64 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/compar.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/compile.h +34 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/compilers.h +107 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/complex.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/concurrent_set.h +21 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/cont.h +35 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/dir.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/enc.h +19 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/encoding.h +39 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/enum.h +18 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/enumerator.h +21 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/error.h +251 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/eval.h +41 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/file.h +38 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/fixnum.h +185 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/gc.h +358 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/hash.h +194 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/imemo.h +322 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/inits.h +51 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/io.h +163 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/load.h +20 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/loadpath.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/math.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/missing.h +19 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/numeric.h +275 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/object.h +63 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/parse.h +131 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/proc.h +30 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/process.h +124 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/ractor.h +10 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/random.h +17 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/range.h +40 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/rational.h +71 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/re.h +33 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/ruby_parser.h +102 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/sanitizers.h +346 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/serial.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/set_table.h +70 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/signal.h +25 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/st.h +11 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/static_assert.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/string.h +203 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/struct.h +160 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/symbol.h +46 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/thread.h +112 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/time.h +37 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/transcode.h +23 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/util.h +27 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/variable.h +74 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/vm.h +136 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal/warnings.h +16 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/internal.h +105 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/iseq.h +357 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/method.h +271 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/node.h +122 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/parser_st.h +162 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/parser_value.h +106 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/ast.h +8233 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/defines.h +260 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/diagnostic.h +458 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/encoding.h +283 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/extension.h +19 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/node.h +129 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/options.h +485 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/pack.h +163 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/parser.h +936 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/prettyprint.h +34 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/prism.h +408 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/regexp.h +43 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/static_literals.h +121 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_buffer.h +236 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_char.h +204 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_constant_pool.h +218 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_integer.h +130 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_list.h +103 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_memchr.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_newline_list.h +113 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_string.h +200 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_strncasecmp.h +32 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/util/pm_strpbrk.h +46 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism/version.h +29 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/prism_compile.h +106 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ractor_core.h +306 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ruby_assert.h +14 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/ruby_atomic.h +66 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/rubyparser.h +1394 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/shape.h +444 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/thread_none.h +21 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/thread_pthread.h +175 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/vm_core.h +2350 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/vm_debug.h +124 -0
- data/lib/datadog/ruby_core_source/ruby-4.0.0-preview2/vm_opts.h +67 -0
- data/lib/datadog/ruby_core_source/version.rb +1 -1
- data/lib/datadog/ruby_core_source.rb +1 -1
- metadata +211 -2
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#ifndef RUBY_DEBUG_H
|
|
2
|
+
#define RUBY_DEBUG_H
|
|
3
|
+
/**********************************************************************
|
|
4
|
+
|
|
5
|
+
vm_debug.h - YARV Debug function interface
|
|
6
|
+
|
|
7
|
+
$Author$
|
|
8
|
+
created at: 04/08/25 02:33:49 JST
|
|
9
|
+
|
|
10
|
+
Copyright (C) 2004-2007 Koichi Sasada
|
|
11
|
+
|
|
12
|
+
**********************************************************************/
|
|
13
|
+
|
|
14
|
+
#include "ruby/ruby.h"
|
|
15
|
+
|
|
16
|
+
RUBY_SYMBOL_EXPORT_BEGIN
|
|
17
|
+
|
|
18
|
+
#define dpv(h,v) ruby_debug_print_value(-1, 0, (h), (v))
|
|
19
|
+
#define dp(v) ruby_debug_print_value(-1, 0, "", (v))
|
|
20
|
+
#define dpi(i) ruby_debug_print_id(-1, 0, "", (i))
|
|
21
|
+
#define dpn(n) ruby_debug_print_node(-1, 0, "", (n))
|
|
22
|
+
|
|
23
|
+
struct RNode;
|
|
24
|
+
|
|
25
|
+
VALUE ruby_debug_print_value(int level, int debug_level, const char *header, VALUE v);
|
|
26
|
+
void ruby_debug_print_v(VALUE v);
|
|
27
|
+
ID ruby_debug_print_id(int level, int debug_level, const char *header, ID id);
|
|
28
|
+
struct RNode *ruby_debug_print_node(int level, int debug_level, const char *header, const struct RNode *node);
|
|
29
|
+
void ruby_debug_print_n(const struct RNode *node);
|
|
30
|
+
int ruby_debug_print_indent(int level, int debug_level, int indent_level);
|
|
31
|
+
void ruby_debug_gc_check_func(void);
|
|
32
|
+
void ruby_set_debug_option(const char *str);
|
|
33
|
+
|
|
34
|
+
RUBY_SYMBOL_EXPORT_END
|
|
35
|
+
|
|
36
|
+
#ifndef USE_RUBY_DEBUG_LOG
|
|
37
|
+
#define USE_RUBY_DEBUG_LOG 0
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
/* RUBY_DEBUG_LOG: Logging debug information mechanism
|
|
41
|
+
*
|
|
42
|
+
* This feature provides a mechanism to store logging information
|
|
43
|
+
* to a file, stderr or memory space with simple macros.
|
|
44
|
+
*
|
|
45
|
+
* The following information will be stored.
|
|
46
|
+
* * (1) __FILE__, __LINE__ in C
|
|
47
|
+
* * (2) __FILE__, __LINE__ in Ruby
|
|
48
|
+
* * (3) __func__ in C (message title)
|
|
49
|
+
* * (4) given string with sprintf format
|
|
50
|
+
* * (5) Thread number (if multiple threads are running)
|
|
51
|
+
*
|
|
52
|
+
* This feature is enabled only USE_RUBY_DEBUG_LOG is enabled.
|
|
53
|
+
* Release version should not enable it.
|
|
54
|
+
*
|
|
55
|
+
* Running with the `RUBY_DEBUG_LOG` environment variable enables
|
|
56
|
+
* this feature.
|
|
57
|
+
*
|
|
58
|
+
* # logging into a file
|
|
59
|
+
* RUBY_DEBUG_LOG=/path/to/file STDERR
|
|
60
|
+
*
|
|
61
|
+
* # logging into STDERR
|
|
62
|
+
* RUBY_DEBUG_LOG=stderr
|
|
63
|
+
*
|
|
64
|
+
* # logging into memory space (check with a debugger)
|
|
65
|
+
* # It will help if the timing is important.
|
|
66
|
+
* RUBY_DEBUG_LOG=mem
|
|
67
|
+
*
|
|
68
|
+
* RUBY_DEBUG_LOG_FILTER environment variable can specify the filter string.
|
|
69
|
+
* If "(3) __func__ in C (message title)" contains the specified string, the
|
|
70
|
+
* information will be stored (example: RUBY_DEBUG_LOG_FILTER=str will enable
|
|
71
|
+
* only on str related information).
|
|
72
|
+
*
|
|
73
|
+
* In a MRI source code, you can use the following macros:
|
|
74
|
+
* * RUBY_DEBUG_LOG(fmt, ...): Above (1) to (4) will be logged.
|
|
75
|
+
* * RUBY_DEBUG_LOG2(file, line, fmt, ...):
|
|
76
|
+
* Same as RUBY_DEBUG_LOG(), but (1) will be replaced with given file, line.
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
extern enum ruby_debug_log_mode {
|
|
80
|
+
ruby_debug_log_disabled = 0x00,
|
|
81
|
+
ruby_debug_log_memory = 0x01,
|
|
82
|
+
ruby_debug_log_stderr = 0x02,
|
|
83
|
+
ruby_debug_log_file = 0x04,
|
|
84
|
+
} ruby_debug_log_mode;
|
|
85
|
+
|
|
86
|
+
RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 4, 5)
|
|
87
|
+
void ruby_debug_log(const char *file, int line, const char *func_name, const char *fmt, ...);
|
|
88
|
+
void ruby_debug_log_print(unsigned int n);
|
|
89
|
+
bool ruby_debug_log_filter(const char *func_name, const char *file_name);
|
|
90
|
+
|
|
91
|
+
#if RBIMPL_COMPILER_IS(GCC) && defined(__OPTIMIZE__)
|
|
92
|
+
# define ruby_debug_log(...) \
|
|
93
|
+
RB_GNUC_EXTENSION_BLOCK( \
|
|
94
|
+
RBIMPL_WARNING_PUSH(); \
|
|
95
|
+
RBIMPL_WARNING_IGNORED(-Wformat-zero-length); \
|
|
96
|
+
ruby_debug_log(__VA_ARGS__); \
|
|
97
|
+
RBIMPL_WARNING_POP())
|
|
98
|
+
#endif
|
|
99
|
+
|
|
100
|
+
// convenient macro to log even if the USE_RUBY_DEBUG_LOG macro is not specified.
|
|
101
|
+
// You can use this macro for temporary usage (you should not commit it).
|
|
102
|
+
#define _RUBY_DEBUG_LOG(...) ruby_debug_log(__FILE__, __LINE__, RUBY_FUNCTION_NAME_STRING, "" __VA_ARGS__)
|
|
103
|
+
|
|
104
|
+
#if USE_RUBY_DEBUG_LOG
|
|
105
|
+
# define RUBY_DEBUG_LOG_ENABLED(func_name, file_name) \
|
|
106
|
+
(ruby_debug_log_mode && ruby_debug_log_filter(func_name, file_name))
|
|
107
|
+
|
|
108
|
+
#define RUBY_DEBUG_LOG(...) do { \
|
|
109
|
+
if (RUBY_DEBUG_LOG_ENABLED(RUBY_FUNCTION_NAME_STRING, __FILE__)) \
|
|
110
|
+
ruby_debug_log(__FILE__, __LINE__, RUBY_FUNCTION_NAME_STRING, "" __VA_ARGS__); \
|
|
111
|
+
} while (0)
|
|
112
|
+
|
|
113
|
+
#define RUBY_DEBUG_LOG2(file, line, ...) do { \
|
|
114
|
+
if (RUBY_DEBUG_LOG_ENABLED(RUBY_FUNCTION_NAME_STRING, file)) \
|
|
115
|
+
ruby_debug_log(file, line, RUBY_FUNCTION_NAME_STRING, "" __VA_ARGS__); \
|
|
116
|
+
} while (0)
|
|
117
|
+
|
|
118
|
+
#else // USE_RUBY_DEBUG_LOG
|
|
119
|
+
// do nothing
|
|
120
|
+
#define RUBY_DEBUG_LOG(...)
|
|
121
|
+
#define RUBY_DEBUG_LOG2(file, line, ...)
|
|
122
|
+
#endif // USE_RUBY_DEBUG_LOG
|
|
123
|
+
|
|
124
|
+
#endif /* RUBY_DEBUG_H */
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#ifndef RUBY_VM_OPTS_H/*-*-c-*-*/
|
|
2
|
+
#define RUBY_VM_OPTS_H
|
|
3
|
+
/**********************************************************************
|
|
4
|
+
|
|
5
|
+
vm_opts.h - VM optimize option
|
|
6
|
+
|
|
7
|
+
$Author$
|
|
8
|
+
|
|
9
|
+
Copyright (C) 2004-2007 Koichi Sasada
|
|
10
|
+
|
|
11
|
+
**********************************************************************/
|
|
12
|
+
|
|
13
|
+
/* Compile options.
|
|
14
|
+
* You can change these options at runtime by VM::CompileOption.
|
|
15
|
+
* Following definitions are default values.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#define OPT_TAILCALL_OPTIMIZATION 0
|
|
19
|
+
#define OPT_PEEPHOLE_OPTIMIZATION 1
|
|
20
|
+
#define OPT_SPECIALISED_INSTRUCTION 1
|
|
21
|
+
#define OPT_INLINE_CONST_CACHE 1
|
|
22
|
+
#define OPT_FROZEN_STRING_LITERAL -1
|
|
23
|
+
#define OPT_DEBUG_FROZEN_STRING_LITERAL 0
|
|
24
|
+
|
|
25
|
+
/* Build Options.
|
|
26
|
+
* You can't change these options at runtime.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/* C compiler dependent */
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* 0: direct (using labeled goto using GCC special)
|
|
33
|
+
* 1: token (switch/case)
|
|
34
|
+
* 2: call (function call for each insn dispatch)
|
|
35
|
+
*/
|
|
36
|
+
#ifndef OPT_THREADED_CODE
|
|
37
|
+
#define OPT_THREADED_CODE 0
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
#define OPT_DIRECT_THREADED_CODE (OPT_THREADED_CODE == 0)
|
|
41
|
+
#define OPT_TOKEN_THREADED_CODE (OPT_THREADED_CODE == 1)
|
|
42
|
+
#define OPT_CALL_THREADED_CODE (OPT_THREADED_CODE == 2)
|
|
43
|
+
|
|
44
|
+
/* VM running option */
|
|
45
|
+
#define OPT_CHECKED_RUN 1
|
|
46
|
+
#define OPT_INLINE_METHOD_CACHE 1
|
|
47
|
+
#define OPT_GLOBAL_METHOD_CACHE 1
|
|
48
|
+
|
|
49
|
+
#ifndef OPT_IC_FOR_IVAR
|
|
50
|
+
#define OPT_IC_FOR_IVAR 1
|
|
51
|
+
#endif
|
|
52
|
+
|
|
53
|
+
/* architecture independent, affects generated code */
|
|
54
|
+
#define OPT_OPERANDS_UNIFICATION 1
|
|
55
|
+
#define OPT_INSTRUCTIONS_UNIFICATION 0
|
|
56
|
+
#define OPT_UNIFY_ALL_COMBINATION 0
|
|
57
|
+
|
|
58
|
+
/* misc */
|
|
59
|
+
#ifndef OPT_SUPPORT_JOKE
|
|
60
|
+
#define OPT_SUPPORT_JOKE 0
|
|
61
|
+
#endif
|
|
62
|
+
|
|
63
|
+
#ifndef VM_COLLECT_USAGE_DETAILS
|
|
64
|
+
#define VM_COLLECT_USAGE_DETAILS 0
|
|
65
|
+
#endif
|
|
66
|
+
|
|
67
|
+
#endif /* RUBY_VM_OPTS_H */
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
|
|
2
|
+
#ifndef CCAN_BUILD_ASSERT_H
|
|
3
|
+
#define CCAN_BUILD_ASSERT_H
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* CCAN_BUILD_ASSERT - assert a build-time dependency.
|
|
7
|
+
* @cond: the compile-time condition which must be true.
|
|
8
|
+
*
|
|
9
|
+
* Your compile will fail if the condition isn't true, or can't be evaluated
|
|
10
|
+
* by the compiler. This can only be used within a function.
|
|
11
|
+
*
|
|
12
|
+
* Example:
|
|
13
|
+
* #include <stddef.h>
|
|
14
|
+
* ...
|
|
15
|
+
* static char *foo_to_char(struct foo *foo)
|
|
16
|
+
* {
|
|
17
|
+
* // This code needs string to be at start of foo.
|
|
18
|
+
* CCAN_BUILD_ASSERT(offsetof(struct foo, string) == 0);
|
|
19
|
+
* return (char *)foo;
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
#define CCAN_BUILD_ASSERT(cond) \
|
|
23
|
+
do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* CCAN_BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression.
|
|
27
|
+
* @cond: the compile-time condition which must be true.
|
|
28
|
+
*
|
|
29
|
+
* Your compile will fail if the condition isn't true, or can't be evaluated
|
|
30
|
+
* by the compiler. This can be used in an expression: its value is "0".
|
|
31
|
+
*
|
|
32
|
+
* Example:
|
|
33
|
+
* #define foo_to_char(foo) \
|
|
34
|
+
* ((char *)(foo) \
|
|
35
|
+
* + CCAN_BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))
|
|
36
|
+
*/
|
|
37
|
+
#define CCAN_BUILD_ASSERT_OR_ZERO(cond) \
|
|
38
|
+
(sizeof(char [1 - 2*!(cond)]) - 1)
|
|
39
|
+
|
|
40
|
+
#endif /* CCAN_BUILD_ASSERT_H */
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
|
|
2
|
+
#ifndef CCAN_CHECK_TYPE_H
|
|
3
|
+
#define CCAN_CHECK_TYPE_H
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* ccan_check_type - issue a warning or build failure if type is not correct.
|
|
7
|
+
* @expr: the expression whose type we should check (not evaluated).
|
|
8
|
+
* @type: the exact type we expect the expression to be.
|
|
9
|
+
*
|
|
10
|
+
* This macro is usually used within other macros to try to ensure that a macro
|
|
11
|
+
* argument is of the expected type. No type promotion of the expression is
|
|
12
|
+
* done: an unsigned int is not the same as an int!
|
|
13
|
+
*
|
|
14
|
+
* ccan_check_type() always evaluates to 0.
|
|
15
|
+
*
|
|
16
|
+
* If your compiler does not support typeof, then the best we can do is fail
|
|
17
|
+
* to compile if the sizes of the types are unequal (a less complete check).
|
|
18
|
+
*
|
|
19
|
+
* Example:
|
|
20
|
+
* // They should always pass a 64-bit value to _set_some_value!
|
|
21
|
+
* #define set_some_value(expr) \
|
|
22
|
+
* _set_some_value((ccan_check_type((expr), uint64_t), (expr)))
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* ccan_check_types_match - issue a warning or build failure if types are not same.
|
|
27
|
+
* @expr1: the first expression (not evaluated).
|
|
28
|
+
* @expr2: the second expression (not evaluated).
|
|
29
|
+
*
|
|
30
|
+
* This macro is usually used within other macros to try to ensure that
|
|
31
|
+
* arguments are of identical types. No type promotion of the expressions is
|
|
32
|
+
* done: an unsigned int is not the same as an int!
|
|
33
|
+
*
|
|
34
|
+
* ccan_check_types_match() always evaluates to 0.
|
|
35
|
+
*
|
|
36
|
+
* If your compiler does not support typeof, then the best we can do is fail
|
|
37
|
+
* to compile if the sizes of the types are unequal (a less complete check).
|
|
38
|
+
*
|
|
39
|
+
* Example:
|
|
40
|
+
* // Do subtraction to get to enclosing type, but make sure that
|
|
41
|
+
* // pointer is of correct type for that member.
|
|
42
|
+
* #define ccan_container_of(mbr_ptr, encl_type, mbr) \
|
|
43
|
+
* (ccan_check_types_match((mbr_ptr), &((encl_type *)0)->mbr), \
|
|
44
|
+
* ((encl_type *) \
|
|
45
|
+
* ((char *)(mbr_ptr) - offsetof(enclosing_type, mbr))))
|
|
46
|
+
*/
|
|
47
|
+
#if defined(HAVE_TYPEOF) && HAVE_TYPEOF
|
|
48
|
+
#define ccan_check_type(expr, type) \
|
|
49
|
+
((typeof(expr) *)0 != (type *)0)
|
|
50
|
+
|
|
51
|
+
#define ccan_check_types_match(expr1, expr2) \
|
|
52
|
+
((typeof(expr1) *)0 != (typeof(expr2) *)0)
|
|
53
|
+
#else
|
|
54
|
+
#include "ccan/build_assert/build_assert.h"
|
|
55
|
+
/* Without typeof, we can only test the sizes. */
|
|
56
|
+
#define ccan_check_type(expr, type) \
|
|
57
|
+
CCAN_BUILD_ASSERT_OR_ZERO(sizeof(expr) == sizeof(type))
|
|
58
|
+
|
|
59
|
+
#define ccan_check_types_match(expr1, expr2) \
|
|
60
|
+
CCAN_BUILD_ASSERT_OR_ZERO(sizeof(expr1) == sizeof(expr2))
|
|
61
|
+
#endif /* HAVE_TYPEOF */
|
|
62
|
+
|
|
63
|
+
#endif /* CCAN_CHECK_TYPE_H */
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
|
|
2
|
+
#ifndef CCAN_CONTAINER_OF_H
|
|
3
|
+
#define CCAN_CONTAINER_OF_H
|
|
4
|
+
#include "ccan/check_type/check_type.h"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* ccan_container_of - get pointer to enclosing structure
|
|
8
|
+
* @member_ptr: pointer to the structure member
|
|
9
|
+
* @containing_type: the type this member is within
|
|
10
|
+
* @member: the name of this member within the structure.
|
|
11
|
+
*
|
|
12
|
+
* Given a pointer to a member of a structure, this macro does pointer
|
|
13
|
+
* subtraction to return the pointer to the enclosing type.
|
|
14
|
+
*
|
|
15
|
+
* Example:
|
|
16
|
+
* struct foo {
|
|
17
|
+
* int fielda, fieldb;
|
|
18
|
+
* // ...
|
|
19
|
+
* };
|
|
20
|
+
* struct info {
|
|
21
|
+
* int some_other_field;
|
|
22
|
+
* struct foo my_foo;
|
|
23
|
+
* };
|
|
24
|
+
*
|
|
25
|
+
* static struct info *foo_to_info(struct foo *foo)
|
|
26
|
+
* {
|
|
27
|
+
* return ccan_container_of(foo, struct info, my_foo);
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
#define ccan_container_of(member_ptr, containing_type, member) \
|
|
31
|
+
((containing_type *) \
|
|
32
|
+
((char *)(member_ptr) \
|
|
33
|
+
- ccan_container_off(containing_type, member)) \
|
|
34
|
+
+ ccan_check_types_match(*(member_ptr), ((containing_type *)0)->member))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* ccan_container_of_or_null - get pointer to enclosing structure, or NULL
|
|
39
|
+
* @member_ptr: pointer to the structure member
|
|
40
|
+
* @containing_type: the type this member is within
|
|
41
|
+
* @member: the name of this member within the structure.
|
|
42
|
+
*
|
|
43
|
+
* Given a pointer to a member of a structure, this macro does pointer
|
|
44
|
+
* subtraction to return the pointer to the enclosing type, unless it
|
|
45
|
+
* is given NULL, in which case it also returns NULL.
|
|
46
|
+
*
|
|
47
|
+
* Example:
|
|
48
|
+
* struct foo {
|
|
49
|
+
* int fielda, fieldb;
|
|
50
|
+
* // ...
|
|
51
|
+
* };
|
|
52
|
+
* struct info {
|
|
53
|
+
* int some_other_field;
|
|
54
|
+
* struct foo my_foo;
|
|
55
|
+
* };
|
|
56
|
+
*
|
|
57
|
+
* static struct info *foo_to_info_allowing_null(struct foo *foo)
|
|
58
|
+
* {
|
|
59
|
+
* return ccan_container_of_or_null(foo, struct info, my_foo);
|
|
60
|
+
* }
|
|
61
|
+
*/
|
|
62
|
+
static inline char *container_of_or_null_(void *member_ptr, size_t offset)
|
|
63
|
+
{
|
|
64
|
+
return member_ptr ? (char *)member_ptr - offset : NULL;
|
|
65
|
+
}
|
|
66
|
+
#define ccan_container_of_or_null(member_ptr, containing_type, member) \
|
|
67
|
+
((containing_type *) \
|
|
68
|
+
ccan_container_of_or_null_(member_ptr, \
|
|
69
|
+
ccan_container_off(containing_type, member)) \
|
|
70
|
+
+ ccan_check_types_match(*(member_ptr), ((containing_type *)0)->member))
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* ccan_container_off - get offset to enclosing structure
|
|
74
|
+
* @containing_type: the type this member is within
|
|
75
|
+
* @member: the name of this member within the structure.
|
|
76
|
+
*
|
|
77
|
+
* Given a pointer to a member of a structure, this macro does
|
|
78
|
+
* typechecking and figures out the offset to the enclosing type.
|
|
79
|
+
*
|
|
80
|
+
* Example:
|
|
81
|
+
* struct foo {
|
|
82
|
+
* int fielda, fieldb;
|
|
83
|
+
* // ...
|
|
84
|
+
* };
|
|
85
|
+
* struct info {
|
|
86
|
+
* int some_other_field;
|
|
87
|
+
* struct foo my_foo;
|
|
88
|
+
* };
|
|
89
|
+
*
|
|
90
|
+
* static struct info *foo_to_info(struct foo *foo)
|
|
91
|
+
* {
|
|
92
|
+
* size_t off = ccan_container_off(struct info, my_foo);
|
|
93
|
+
* return (void *)((char *)foo - off);
|
|
94
|
+
* }
|
|
95
|
+
*/
|
|
96
|
+
#define ccan_container_off(containing_type, member) \
|
|
97
|
+
offsetof(containing_type, member)
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* ccan_container_of_var - get pointer to enclosing structure using a variable
|
|
101
|
+
* @member_ptr: pointer to the structure member
|
|
102
|
+
* @container_var: a pointer of same type as this member's container
|
|
103
|
+
* @member: the name of this member within the structure.
|
|
104
|
+
*
|
|
105
|
+
* Given a pointer to a member of a structure, this macro does pointer
|
|
106
|
+
* subtraction to return the pointer to the enclosing type.
|
|
107
|
+
*
|
|
108
|
+
* Example:
|
|
109
|
+
* static struct info *foo_to_i(struct foo *foo)
|
|
110
|
+
* {
|
|
111
|
+
* struct info *i = ccan_container_of_var(foo, i, my_foo);
|
|
112
|
+
* return i;
|
|
113
|
+
* }
|
|
114
|
+
*/
|
|
115
|
+
#if defined(HAVE_TYPEOF) && HAVE_TYPEOF
|
|
116
|
+
#define ccan_container_of_var(member_ptr, container_var, member) \
|
|
117
|
+
ccan_container_of(member_ptr, typeof(*container_var), member)
|
|
118
|
+
#else
|
|
119
|
+
#define ccan_container_of_var(member_ptr, container_var, member) \
|
|
120
|
+
((void *)((char *)(member_ptr) - \
|
|
121
|
+
ccan_container_off_var(container_var, member)))
|
|
122
|
+
#endif
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* ccan_container_off_var - get offset of a field in enclosing structure
|
|
126
|
+
* @container_var: a pointer to a container structure
|
|
127
|
+
* @member: the name of a member within the structure.
|
|
128
|
+
*
|
|
129
|
+
* Given (any) pointer to a structure and a its member name, this
|
|
130
|
+
* macro does pointer subtraction to return offset of member in a
|
|
131
|
+
* structure memory layout.
|
|
132
|
+
*
|
|
133
|
+
*/
|
|
134
|
+
#if defined(HAVE_TYPEOF) && HAVE_TYPEOF
|
|
135
|
+
#define ccan_container_off_var(var, member) \
|
|
136
|
+
ccan_container_off(typeof(*var), member)
|
|
137
|
+
#else
|
|
138
|
+
#define ccan_container_off_var(var, member) \
|
|
139
|
+
((const char *)&(var)->member - (const char *)(var))
|
|
140
|
+
#endif
|
|
141
|
+
|
|
142
|
+
#endif /* CCAN_CONTAINER_OF_H */
|