ruby-internal 0.6.0
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.
- data/COPYING +59 -0
- data/LGPL +515 -0
- data/LICENSE +9 -0
- data/README +31 -0
- data/Rakefile +20 -0
- data/TODO +9 -0
- data/example/README +5 -0
- data/example/simple_client.rb +12 -0
- data/example/simple_server.rb +11 -0
- data/example/triangle_client.rb +7 -0
- data/example/triangle_server.rb +24 -0
- data/ext/cached/ruby-1.8.0/internal/binding/block.h +37 -0
- data/ext/cached/ruby-1.8.0/internal/method/method.h +19 -0
- data/ext/cached/ruby-1.8.0/internal/module/classpath.c +27 -0
- data/ext/cached/ruby-1.8.0/internal/module/classpath.h +14 -0
- data/ext/cached/ruby-1.8.0/internal/node/block.h +37 -0
- data/ext/cached/ruby-1.8.0/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.0/internal/node/node_type_descrip.c +155 -0
- data/ext/cached/ruby-1.8.0/internal/node/nodeinfo.c +5741 -0
- data/ext/cached/ruby-1.8.0/internal/node/nodeinfo.h +69 -0
- data/ext/cached/ruby-1.8.0/internal/proc/block.h +37 -0
- data/ext/cached/ruby-1.8.0/internal/tag/tag.h +15 -0
- data/ext/cached/ruby-1.8.0/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.0/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.0/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.1/internal/binding/block.h +31 -0
- data/ext/cached/ruby-1.8.1/internal/method/method.h +19 -0
- data/ext/cached/ruby-1.8.1/internal/module/classpath.c +27 -0
- data/ext/cached/ruby-1.8.1/internal/module/classpath.h +14 -0
- data/ext/cached/ruby-1.8.1/internal/node/block.h +31 -0
- data/ext/cached/ruby-1.8.1/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.1/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.c +5733 -0
- data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.h +69 -0
- data/ext/cached/ruby-1.8.1/internal/proc/block.h +31 -0
- data/ext/cached/ruby-1.8.1/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.1/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.1/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.1/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.2/internal/binding/block.h +32 -0
- data/ext/cached/ruby-1.8.2/internal/method/method.h +19 -0
- data/ext/cached/ruby-1.8.2/internal/module/classpath.c +45 -0
- data/ext/cached/ruby-1.8.2/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.8.2/internal/node/block.h +32 -0
- data/ext/cached/ruby-1.8.2/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.2/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.c +5733 -0
- data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.h +69 -0
- data/ext/cached/ruby-1.8.2/internal/proc/block.h +32 -0
- data/ext/cached/ruby-1.8.2/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.2/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.2/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.2/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.3/internal/binding/block.h +32 -0
- data/ext/cached/ruby-1.8.3/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.8.3/internal/module/classpath.c +45 -0
- data/ext/cached/ruby-1.8.3/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.8.3/internal/node/block.h +32 -0
- data/ext/cached/ruby-1.8.3/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.3/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.c +5733 -0
- data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.h +69 -0
- data/ext/cached/ruby-1.8.3/internal/proc/block.h +32 -0
- data/ext/cached/ruby-1.8.3/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.3/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.3/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.3/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.4/internal/binding/block.h +32 -0
- data/ext/cached/ruby-1.8.4/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.8.4/internal/module/classpath.c +45 -0
- data/ext/cached/ruby-1.8.4/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.8.4/internal/node/block.h +32 -0
- data/ext/cached/ruby-1.8.4/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.4/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.4/internal/node/nodeinfo.c +5733 -0
- data/ext/cached/ruby-1.8.4/internal/node/nodeinfo.h +69 -0
- data/ext/cached/ruby-1.8.4/internal/proc/block.h +32 -0
- data/ext/cached/ruby-1.8.4/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.4/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.4/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.4/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.5/internal/binding/block.h +32 -0
- data/ext/cached/ruby-1.8.5/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.8.5/internal/module/classpath.c +45 -0
- data/ext/cached/ruby-1.8.5/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.8.5/internal/node/block.h +32 -0
- data/ext/cached/ruby-1.8.5/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.5/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.5/internal/node/nodeinfo.c +5732 -0
- data/ext/cached/ruby-1.8.5/internal/node/nodeinfo.h +67 -0
- data/ext/cached/ruby-1.8.5/internal/proc/block.h +32 -0
- data/ext/cached/ruby-1.8.5/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.5/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.5/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.5/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.6/internal/binding/block.h +32 -0
- data/ext/cached/ruby-1.8.6/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.8.6/internal/module/classpath.c +45 -0
- data/ext/cached/ruby-1.8.6/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.8.6/internal/node/block.h +32 -0
- data/ext/cached/ruby-1.8.6/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.6/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.6/internal/node/nodeinfo.c +5732 -0
- data/ext/cached/ruby-1.8.6/internal/node/nodeinfo.h +67 -0
- data/ext/cached/ruby-1.8.6/internal/proc/block.h +32 -0
- data/ext/cached/ruby-1.8.6/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.6/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.6/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.6/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.8.7/internal/binding/block.h +32 -0
- data/ext/cached/ruby-1.8.7/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.8.7/internal/module/classpath.c +45 -0
- data/ext/cached/ruby-1.8.7/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.8.7/internal/node/block.h +32 -0
- data/ext/cached/ruby-1.8.7/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.7/internal/node/node_type_descrip.c +154 -0
- data/ext/cached/ruby-1.8.7/internal/node/nodeinfo.c +5732 -0
- data/ext/cached/ruby-1.8.7/internal/node/nodeinfo.h +67 -0
- data/ext/cached/ruby-1.8.7/internal/proc/block.h +32 -0
- data/ext/cached/ruby-1.8.7/internal/tag/tag.h +16 -0
- data/ext/cached/ruby-1.8.7/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.8.7/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.8.7/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.9.0/internal/binding/block.h +12 -0
- data/ext/cached/ruby-1.9.0/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.9.0/internal/module/classpath.c +42 -0
- data/ext/cached/ruby-1.9.0/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.9.0/internal/node/block.h +12 -0
- data/ext/cached/ruby-1.9.0/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.9.0/internal/node/node_type_descrip.c +149 -0
- data/ext/cached/ruby-1.9.0/internal/node/nodeinfo.c +5579 -0
- data/ext/cached/ruby-1.9.0/internal/node/nodeinfo.h +70 -0
- data/ext/cached/ruby-1.9.0/internal/proc/block.h +12 -0
- data/ext/cached/ruby-1.9.0/internal/tag/tag.h +6 -0
- data/ext/cached/ruby-1.9.0/internal/vm/instruction/insns_info.c +5936 -0
- data/ext/cached/ruby-1.9.0/internal/vm/instruction/insns_info.h +891 -0
- data/ext/cached/ruby-1.9.0/internal/vm/iseq/insns_info.inc +700 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/debug.h +36 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/dln.h +41 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/encdb.h +147 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/eval_intern.h +221 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/gc.h +75 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/id.h +83 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/iseq.h +94 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/node.h +516 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/parse.h +303 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/regenc.h +207 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/regint.h +842 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/regparse.h +351 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/revision.h +1 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/thread_pthread.h +24 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/thread_win32.h +33 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/transcode_data.h +99 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/transdb.h +67 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/version.h +57 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_core.h +663 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_exec.h +187 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_insnhelper.h +191 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_opts.h +51 -0
- data/ext/cached/ruby-1.9.1/internal/binding/block.h +12 -0
- data/ext/cached/ruby-1.9.1/internal/method/method.h +20 -0
- data/ext/cached/ruby-1.9.1/internal/module/classpath.c +42 -0
- data/ext/cached/ruby-1.9.1/internal/module/classpath.h +17 -0
- data/ext/cached/ruby-1.9.1/internal/node/block.h +12 -0
- data/ext/cached/ruby-1.9.1/internal/node/global_entry.h +10 -0
- data/ext/cached/ruby-1.9.1/internal/node/node_type_descrip.c +149 -0
- data/ext/cached/ruby-1.9.1/internal/node/nodeinfo.c +5579 -0
- data/ext/cached/ruby-1.9.1/internal/node/nodeinfo.h +70 -0
- data/ext/cached/ruby-1.9.1/internal/proc/block.h +12 -0
- data/ext/cached/ruby-1.9.1/internal/tag/tag.h +6 -0
- data/ext/cached/ruby-1.9.1/internal/vm/instruction/insns_info.c +5936 -0
- data/ext/cached/ruby-1.9.1/internal/vm/instruction/insns_info.h +891 -0
- data/ext/cached/ruby-1.9.1/internal/vm/iseq/insns_info.inc +700 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/debug.h +36 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/dln.h +41 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/encdb.h +147 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/eval_intern.h +209 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/gc.h +75 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/id.h +184 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/iseq.h +94 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/node.h +516 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/parse.h +303 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/regenc.h +207 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/regint.h +842 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/regparse.h +351 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/revision.h +1 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/thread_pthread.h +24 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/thread_win32.h +33 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/transcode_data.h +99 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/transdb.h +85 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/version.h +60 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_core.h +655 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_exec.h +187 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_insnhelper.h +194 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_opts.h +51 -0
- data/ext/internal/binding/binding.c +45 -0
- data/ext/internal/binding/block.h.rpp +44 -0
- data/ext/internal/binding/extconf.rb +6 -0
- data/ext/internal/method/extconf.rb +8 -0
- data/ext/internal/method/method.c +269 -0
- data/ext/internal/method/method.h.rpp +58 -0
- data/ext/internal/module/classpath.c.rpp +29 -0
- data/ext/internal/module/classpath.h.rpp +36 -0
- data/ext/internal/module/extconf.rb +11 -0
- data/ext/internal/module/module.c +797 -0
- data/ext/internal/module/module.h +7 -0
- data/ext/internal/node/block.h.rpp +44 -0
- data/ext/internal/node/builtins.h +41 -0
- data/ext/internal/node/extconf.rb +66 -0
- data/ext/internal/node/global_entry.h.rpp +26 -0
- data/ext/internal/node/node.c +1147 -0
- data/ext/internal/node/node_type_descrip.c.rpp +72 -0
- data/ext/internal/node/node_type_descrip.h +17 -0
- data/ext/internal/node/node_type_descrip.rb +39 -0
- data/ext/internal/node/nodeinfo.c.rpp +587 -0
- data/ext/internal/node/nodeinfo.h.rpp +30 -0
- data/ext/internal/node/nodes.rb +78 -0
- data/ext/internal/node/read_node_h.rb +34 -0
- data/ext/internal/node/ruby_internal_node.h +31 -0
- data/ext/internal/noex/extconf.rb +6 -0
- data/ext/internal/noex/noex.c +44 -0
- data/ext/internal/object/extconf.rb +4 -0
- data/ext/internal/object/object.c +75 -0
- data/ext/internal/proc/block.h.rpp +44 -0
- data/ext/internal/proc/extconf.rb +9 -0
- data/ext/internal/proc/proc.c +331 -0
- data/ext/internal/tag/extconf.rb +3 -0
- data/ext/internal/tag/tag.c +17 -0
- data/ext/internal/tag/tag.h.rpp +22 -0
- data/ext/internal/thread/extconf.rb +3 -0
- data/ext/internal/thread/thread.c +107 -0
- data/ext/internal/vm/constants/constants.c +33 -0
- data/ext/internal/vm/constants/extconf.rb +3 -0
- data/ext/internal/vm/control_frame/control_frame.c +185 -0
- data/ext/internal/vm/control_frame/control_frame.h +18 -0
- data/ext/internal/vm/control_frame/extconf.rb +3 -0
- data/ext/internal/vm/extconf.rb +3 -0
- data/ext/internal/vm/inline_cache/extconf.rb +6 -0
- data/ext/internal/vm/inline_cache/inline_cache.c +79 -0
- data/ext/internal/vm/instruction/extconf.rb +6 -0
- data/ext/internal/vm/instruction/insns_info.c.rpp +213 -0
- data/ext/internal/vm/instruction/insns_info.h.rpp +53 -0
- data/ext/internal/vm/instruction/instruction.c +78 -0
- data/ext/internal/vm/instruction/instruction.h +10 -0
- data/ext/internal/vm/iseq/extconf.rb +7 -0
- data/ext/internal/vm/iseq/insns_info.inc.rpp +30 -0
- data/ext/internal/vm/iseq/internal_iseq.h +9 -0
- data/ext/internal/vm/iseq/iseq.c +555 -0
- data/ext/internal/vm/vm.c +55 -0
- data/ext/mkmf-ruby-internal.rb +111 -0
- data/ext/ruby_source_dir.rb +24 -0
- data/ext/rubypp.rb +97 -0
- data/generate_rdoc.rb +33 -0
- data/lib/internal/binding.rb +1 -0
- data/lib/internal/classtree.rb +55 -0
- data/lib/internal/debug.rb +16 -0
- data/lib/internal/method.rb +1 -0
- data/lib/internal/method/as_code.rb +33 -0
- data/lib/internal/method/as_expression.rb +34 -0
- data/lib/internal/method/signature.rb +442 -0
- data/lib/internal/module.rb +1 -0
- data/lib/internal/module/as_code.rb +45 -0
- data/lib/internal/node.rb +3 -0
- data/lib/internal/node/as_code.rb +233 -0
- data/lib/internal/node/as_expression.rb +619 -0
- data/lib/internal/node/dump.rb +53 -0
- data/lib/internal/node/pp.rb +72 -0
- data/lib/internal/node/to_a.rb +52 -0
- data/lib/internal/noex.rb +1 -0
- data/lib/internal/obfusc.rb +57 -0
- data/lib/internal/object.rb +1 -0
- data/lib/internal/object/as_code.rb +10 -0
- data/lib/internal/proc.rb +1 -0
- data/lib/internal/proc/as_code.rb +21 -0
- data/lib/internal/proc/as_expression.rb +14 -0
- data/lib/internal/proc/signature.rb +184 -0
- data/lib/internal/tag.rb +1 -0
- data/lib/internal/thread.rb +1 -0
- data/lib/internal/vm.rb +1 -0
- data/lib/internal/vm/bytedecoder.rb +866 -0
- data/lib/internal/vm/constants.rb +1 -0
- data/lib/internal/vm/control_frame.rb +1 -0
- data/lib/internal/vm/inline_cache.rb +1 -0
- data/lib/internal/vm/instruction.rb +1 -0
- data/lib/internal/vm/iseq.rb +1 -0
- data/lib/internal/vm/iseq/as_code.rb +27 -0
- data/lib/internal/vm/iseq/as_expression.rb +26 -0
- data/metaconfig +19 -0
- data/post-config.rb +1 -0
- data/post-install.rb +4 -0
- data/post-setup.rb +7 -0
- data/pre-config.rb +96 -0
- data/pre-install.rb +13 -0
- data/pre-setup.rb +8 -0
- data/run_tests.rb +26 -0
- data/setup.rb +1599 -0
- data/test/expression_samples.rb +160 -0
- data/test/node_samples.rb +122 -0
- data/test/test_as_code.rb +261 -0
- data/test/test_as_expression.rb +229 -0
- data/test/test_dump_class.rb +187 -0
- data/test/test_dump_method.rb +144 -0
- data/test/test_dump_proc.rb +118 -0
- data/test/test_helpers.rb +61 -0
- data/test/test_method.rb +72 -0
- data/test/test_methodsig.rb +267 -0
- data/test/test_module.rb +49 -0
- data/test/test_node.rb +77 -0
- data/test/test_proc.rb +47 -0
- metadata +377 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#ifndef nodeinfo_h
|
|
2
|
+
#define nodeinfo_h
|
|
3
|
+
|
|
4
|
+
#include "ruby_internal_node.h"
|
|
5
|
+
|
|
6
|
+
#include "ruby.h"
|
|
7
|
+
|
|
8
|
+
enum Node_Elem_Name
|
|
9
|
+
{
|
|
10
|
+
NEN_NONE,
|
|
11
|
+
#ruby <<END
|
|
12
|
+
require 'read_node_h.rb'
|
|
13
|
+
|
|
14
|
+
NODEINFO.sort.each do |node_elem_name, node_elem_ref|
|
|
15
|
+
puts " NEN_#{node_elem_name.upcase},"
|
|
16
|
+
end
|
|
17
|
+
nil
|
|
18
|
+
END
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash);
|
|
22
|
+
void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash, VALUE id_hash);
|
|
23
|
+
VALUE node_s_members(VALUE klass);
|
|
24
|
+
void define_node_subclass_methods();
|
|
25
|
+
|
|
26
|
+
#define NODE_OP_ASGN2_ARG NODE_LAST + 1
|
|
27
|
+
#define NUM_NODE_TYPE_DESCRIPS NODE_OP_ASGN2_ARG + 1
|
|
28
|
+
|
|
29
|
+
#endif
|
|
30
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
|
|
3
|
+
class NodeVersionRange
|
|
4
|
+
def initialize(str)
|
|
5
|
+
if not str or str =~ /^\s*$/ then
|
|
6
|
+
@inclusive_start = true
|
|
7
|
+
@range_start = 0
|
|
8
|
+
@range_end = 1.0 / 0
|
|
9
|
+
@inclusive_end = true
|
|
10
|
+
elsif str =~ / ([\[(]) (.*?), \s* (.*?) ([\])]) /x then
|
|
11
|
+
@inclusive_start = $1 == '['
|
|
12
|
+
@range_start = $2.to_i
|
|
13
|
+
@range_end = $3 == 'oo' ? (1.0 / 0) : $3.to_i
|
|
14
|
+
@inclusive_end = $4 == ']'
|
|
15
|
+
else
|
|
16
|
+
raise "Invalid version range: #{str}"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def includes?(version_code)
|
|
21
|
+
if @inclusive_start then
|
|
22
|
+
return false if version_code < @range_start
|
|
23
|
+
else
|
|
24
|
+
return false if version_code <= @range_start
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
if @inclusive_end then
|
|
28
|
+
return false if version_code > @range_end
|
|
29
|
+
else
|
|
30
|
+
return false if version_code >= @range_end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return true
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class Nodes
|
|
38
|
+
NodeInfo = Struct.new(:name, :doc, :members, :version_range)
|
|
39
|
+
MemberInfo = Struct.new(:doc, :type)
|
|
40
|
+
|
|
41
|
+
def initialize(filename = nil)
|
|
42
|
+
if not filename then
|
|
43
|
+
dir = File.dirname(__FILE__)
|
|
44
|
+
filename = File.join(dir, 'nodes.yaml')
|
|
45
|
+
end
|
|
46
|
+
nodes = File.open(filename) { |io| YAML.load(io) }
|
|
47
|
+
|
|
48
|
+
@nodes = {}
|
|
49
|
+
nodes.each do |name, node|
|
|
50
|
+
members = {}
|
|
51
|
+
(node['members'] || {}).each do |member_name, member|
|
|
52
|
+
member ||= {}
|
|
53
|
+
members[member_name] = MemberInfo.new(
|
|
54
|
+
member['doc'],
|
|
55
|
+
member['type'])
|
|
56
|
+
end
|
|
57
|
+
version_range = NodeVersionRange.new(node['version'])
|
|
58
|
+
@nodes[name] = NodeInfo.new(
|
|
59
|
+
name.gsub(/\(.*\)/, ''),
|
|
60
|
+
node['doc'],
|
|
61
|
+
members,
|
|
62
|
+
version_range)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def each(&block)
|
|
67
|
+
@nodes.each(&block)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def [](name)
|
|
71
|
+
@nodes[name]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def include?(name)
|
|
75
|
+
@nodes.include?(name)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
$: << '../..'
|
|
2
|
+
require 'ruby_source_dir'
|
|
3
|
+
|
|
4
|
+
NODE_H_LOCATION = "#{RUBY_INCLUDE_DIR}/node.h"
|
|
5
|
+
NODE_H_ALT_LOCATION = "#{RUBY_SOURCE_DIR}/node.h"
|
|
6
|
+
|
|
7
|
+
def open_alt(*files, &block)
|
|
8
|
+
last_exc = nil
|
|
9
|
+
files.each do |file|
|
|
10
|
+
begin
|
|
11
|
+
File.open(file, &block)
|
|
12
|
+
return
|
|
13
|
+
rescue Errno::ENOENT
|
|
14
|
+
last_exc = $!
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
raise last_exc
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
NODEINFO = Hash.new
|
|
21
|
+
open_alt(NODE_H_LOCATION, NODE_H_ALT_LOCATION) do |node_h|
|
|
22
|
+
while line = node_h.gets do
|
|
23
|
+
case line
|
|
24
|
+
when /^#define\s+nd_(\w+)\s+(.*)/
|
|
25
|
+
NODEINFO[$1] = $2
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if __FILE__ == $0 then
|
|
31
|
+
require 'pp'
|
|
32
|
+
pp NODEINFO
|
|
33
|
+
end
|
|
34
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#ifndef ruby_internal_node__h_
|
|
2
|
+
#define ruby_internal_node__h_
|
|
3
|
+
|
|
4
|
+
#include <ruby.h>
|
|
5
|
+
|
|
6
|
+
#if defined(HAVE_NODE_H)
|
|
7
|
+
#include "node.h"
|
|
8
|
+
#elif defined(HAVE_RUBY_NODE_H)
|
|
9
|
+
#include "ruby/node.h"
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
VALUE wrap_node(NODE * n);
|
|
13
|
+
VALUE wrap_node_as(NODE * n, VALUE klass);
|
|
14
|
+
|
|
15
|
+
NODE * unwrap_node(VALUE r);
|
|
16
|
+
|
|
17
|
+
VALUE node_id(NODE * n);
|
|
18
|
+
NODE * id_to_node(VALUE id);
|
|
19
|
+
|
|
20
|
+
VALUE eval_ruby_node(NODE * node, VALUE self, VALUE cref);
|
|
21
|
+
|
|
22
|
+
void dump_node_or_iseq_to_hash(VALUE n, int node_type, VALUE node_hash);
|
|
23
|
+
VALUE load_node_or_iseq_from_hash(VALUE node_id, VALUE node_hash, VALUE id_hash);
|
|
24
|
+
|
|
25
|
+
void dump_node_to_hash(NODE * n, int node_type, VALUE node_hash);
|
|
26
|
+
NODE * load_node_from_hash(VALUE arr, VALUE orig_node_id, VALUE node_hash, VALUE id_hash);
|
|
27
|
+
|
|
28
|
+
extern VALUE rb_cNodeSubclass[NODE_LAST];
|
|
29
|
+
|
|
30
|
+
#endif
|
|
31
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
|
|
3
|
+
#include "internal/node/ruby_internal_node.h"
|
|
4
|
+
|
|
5
|
+
void Init_noex(void)
|
|
6
|
+
{
|
|
7
|
+
/*
|
|
8
|
+
* Document-module: Noex
|
|
9
|
+
*
|
|
10
|
+
* The Noex module contains all the Noex constants from node.h. These
|
|
11
|
+
* constants can be passed to Module#add_method as modifiers to the
|
|
12
|
+
* method being added.
|
|
13
|
+
*
|
|
14
|
+
* [+PUBLIC+] Method is public.
|
|
15
|
+
* [+UNDEF+] Method is undefined.
|
|
16
|
+
* [+PRIVATE+] Method is private.
|
|
17
|
+
* [+PROTECTED+] Method is protected.
|
|
18
|
+
*
|
|
19
|
+
* The following are available in Ruby 1.8 and below:
|
|
20
|
+
* [+CFUNC+] Method is a C function.
|
|
21
|
+
*
|
|
22
|
+
* And these are available in Ruby 1.9 and above:
|
|
23
|
+
* [+NOSUPER+] ???
|
|
24
|
+
* [+MASK+] ???
|
|
25
|
+
*/
|
|
26
|
+
VALUE rb_mNoex = rb_define_module("Noex");
|
|
27
|
+
rb_define_const(rb_mNoex, "PUBLIC", INT2NUM(NOEX_PUBLIC));
|
|
28
|
+
rb_define_const(rb_mNoex, "UNDEF", INT2NUM(NOEX_UNDEF));
|
|
29
|
+
rb_define_const(rb_mNoex, "PRIVATE", INT2NUM(NOEX_PRIVATE));
|
|
30
|
+
rb_define_const(rb_mNoex, "PROTECTED", INT2NUM(NOEX_PROTECTED));
|
|
31
|
+
|
|
32
|
+
#ifdef NOEX_CFUNC
|
|
33
|
+
rb_define_const(rb_mNoex, "CFUNC", INT2NUM(NOEX_CFUNC));
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
#ifdef NOEX_NOSUPER
|
|
37
|
+
rb_define_const(rb_mNoex, "NOSUPER", INT2NUM(NOEX_NOSUPER));
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
#ifdef NOEX_MASK
|
|
41
|
+
rb_define_const(rb_mNoex, "MASK", INT2NUM(NOEX_MASK));
|
|
42
|
+
#endif
|
|
43
|
+
}
|
|
44
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* call-seq:
|
|
5
|
+
* class.real_class => Class
|
|
6
|
+
*
|
|
7
|
+
* Return the object's first immediate ancestor; this may be the
|
|
8
|
+
* object's class, its singleton class, or a module singleton.
|
|
9
|
+
*/
|
|
10
|
+
static VALUE real_class(VALUE self)
|
|
11
|
+
{
|
|
12
|
+
if(IMMEDIATE_P(self))
|
|
13
|
+
{
|
|
14
|
+
return CLASS_OF(self);
|
|
15
|
+
}
|
|
16
|
+
else
|
|
17
|
+
{
|
|
18
|
+
return RBASIC(self)->klass;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* call-seq:
|
|
24
|
+
* class.singleton? => true or false
|
|
25
|
+
*
|
|
26
|
+
* Return true if this object is a singleton (that is, it has the
|
|
27
|
+
* FL_SINGLETON flag set).
|
|
28
|
+
*/
|
|
29
|
+
static VALUE is_singleton(VALUE self)
|
|
30
|
+
{
|
|
31
|
+
return FL_TEST(self, FL_SINGLETON) ? Qtrue : Qfalse;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* call-seq:
|
|
36
|
+
* class.has_singleton? => true or false
|
|
37
|
+
*
|
|
38
|
+
* Return true if this object has a singleton class.
|
|
39
|
+
*/
|
|
40
|
+
static VALUE has_singleton(VALUE self)
|
|
41
|
+
{
|
|
42
|
+
if(FIXNUM_P(self) || SYMBOL_P(self))
|
|
43
|
+
{
|
|
44
|
+
return Qfalse;
|
|
45
|
+
}
|
|
46
|
+
else if(rb_special_const_p(self))
|
|
47
|
+
{
|
|
48
|
+
return Qtrue;
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
{
|
|
52
|
+
return FL_TEST(RBASIC(self)->klass, FL_SINGLETON) ? Qtrue : Qfalse;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* call-seq:
|
|
58
|
+
* class.singleton_class => Class
|
|
59
|
+
*
|
|
60
|
+
* Return the object's singleton class. Creats a new singleton class
|
|
61
|
+
* for the object if it does not have one. See RCR#231.
|
|
62
|
+
*/
|
|
63
|
+
static VALUE singleton_class(VALUE self)
|
|
64
|
+
{
|
|
65
|
+
return rb_singleton_class(self);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void Init_object(void)
|
|
69
|
+
{
|
|
70
|
+
rb_define_method(rb_mKernel, "real_class", real_class, 0);
|
|
71
|
+
rb_define_method(rb_mKernel, "singleton?", is_singleton, 0);
|
|
72
|
+
rb_define_method(rb_mKernel, "has_singleton?", has_singleton, 0);
|
|
73
|
+
rb_define_method(rb_mKernel, "singleton_class", singleton_class, 0);
|
|
74
|
+
}
|
|
75
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#ifndef ruby_internal_block__h_
|
|
2
|
+
#define ruby_internal_block__h_
|
|
3
|
+
|
|
4
|
+
#include <ruby.h>
|
|
5
|
+
|
|
6
|
+
#ifndef RUBY_VM
|
|
7
|
+
#include "env.h"
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
#ruby <<END
|
|
11
|
+
$: << '../..'
|
|
12
|
+
require 'ruby_source_dir'
|
|
13
|
+
vm_c_location = "#{RUBY_SOURCE_DIR}/vm.c"
|
|
14
|
+
eval_c_location = "#{RUBY_SOURCE_DIR}/eval.c"
|
|
15
|
+
|
|
16
|
+
[ vm_c_location, eval_c_location ].each do |file|
|
|
17
|
+
next if not File.exist?(file)
|
|
18
|
+
|
|
19
|
+
File.open(file) do |eval_c|
|
|
20
|
+
write = false
|
|
21
|
+
stopwrite = false
|
|
22
|
+
while (line = eval_c.gets) != nil do
|
|
23
|
+
case line
|
|
24
|
+
when /^struct (BLOCK)/
|
|
25
|
+
write = true
|
|
26
|
+
stopwrite = false
|
|
27
|
+
when /^\}/
|
|
28
|
+
stopwrite = true
|
|
29
|
+
end
|
|
30
|
+
puts line if write
|
|
31
|
+
if write and stopwrite then
|
|
32
|
+
stopwrite = false
|
|
33
|
+
write = false
|
|
34
|
+
puts ''
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
nil
|
|
41
|
+
END
|
|
42
|
+
|
|
43
|
+
#endif
|
|
44
|
+
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include "internal/node/ruby_internal_node.h"
|
|
3
|
+
#include "block.h"
|
|
4
|
+
|
|
5
|
+
#ifdef RUBY_VM
|
|
6
|
+
#include "vm_core.h"
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
#ifdef HAVE_ISEQ_H
|
|
10
|
+
#include "iseq.h"
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#ifndef RARRAY_LEN
|
|
14
|
+
#define RARRAY_LEN(a) RARRAY(a)->len
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
#ifndef RARRAY_PTR
|
|
18
|
+
#define RARRAY_PTR(a) RARRAY(a)->ptr
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
static VALUE rb_cUnboundProc = Qnil;
|
|
22
|
+
|
|
23
|
+
static VALUE rb_mMarshal;
|
|
24
|
+
|
|
25
|
+
static VALUE marshal_dump(VALUE obj, VALUE limit)
|
|
26
|
+
{
|
|
27
|
+
return rb_funcall(rb_mMarshal, rb_intern("dump"), 2, obj, limit);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static VALUE marshal_load(VALUE obj)
|
|
31
|
+
{
|
|
32
|
+
return rb_funcall(rb_mMarshal, rb_intern("load"), 1, obj);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* call-seq:
|
|
37
|
+
* proc.body => Node
|
|
38
|
+
*
|
|
39
|
+
* Returns the Proc's body Node.
|
|
40
|
+
*
|
|
41
|
+
* On YARV, this will return the instruction sequence for the proc's
|
|
42
|
+
* block.
|
|
43
|
+
*/
|
|
44
|
+
static VALUE proc_body(VALUE self)
|
|
45
|
+
{
|
|
46
|
+
#ifdef RUBY_VM
|
|
47
|
+
rb_proc_t * p;
|
|
48
|
+
GetProcPtr(self, p);
|
|
49
|
+
return p->block.iseq->self;
|
|
50
|
+
#else
|
|
51
|
+
struct BLOCK * b;
|
|
52
|
+
if(rb_safe_level() >= 4)
|
|
53
|
+
{
|
|
54
|
+
/* no access to potentially sensitive data from the sandbox */
|
|
55
|
+
rb_raise(rb_eSecurityError, "Insecure: can't get proc body");
|
|
56
|
+
}
|
|
57
|
+
Data_Get_Struct(self, struct BLOCK, b);
|
|
58
|
+
return wrap_node(b->body);
|
|
59
|
+
#endif
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#ifndef RUBY_VM
|
|
63
|
+
/*
|
|
64
|
+
* call-seq:
|
|
65
|
+
* proc.var => Node
|
|
66
|
+
*
|
|
67
|
+
* Returns the Proc's argument Node.
|
|
68
|
+
*
|
|
69
|
+
* This method is undefined on YARV.
|
|
70
|
+
*/
|
|
71
|
+
static VALUE proc_var(VALUE self)
|
|
72
|
+
{
|
|
73
|
+
struct BLOCK * b;
|
|
74
|
+
if(rb_safe_level() >= 4)
|
|
75
|
+
{
|
|
76
|
+
/* no access to potentially sensitive data from the sandbox */
|
|
77
|
+
rb_raise(rb_eSecurityError, "Insecure: can't get proc var");
|
|
78
|
+
}
|
|
79
|
+
Data_Get_Struct(self, struct BLOCK, b);
|
|
80
|
+
if(b->var == (NODE*)1)
|
|
81
|
+
{
|
|
82
|
+
/* no parameter || */
|
|
83
|
+
return INT2NUM(1);
|
|
84
|
+
}
|
|
85
|
+
else if(b->var == (NODE*)2)
|
|
86
|
+
{
|
|
87
|
+
/* also no params, but I'm not sure how this one gets generated */
|
|
88
|
+
return INT2NUM(2);
|
|
89
|
+
}
|
|
90
|
+
else
|
|
91
|
+
{
|
|
92
|
+
return wrap_node(b->var);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#else
|
|
97
|
+
|
|
98
|
+
/* From iseq.c */
|
|
99
|
+
static rb_iseq_t *
|
|
100
|
+
iseq_check(VALUE val)
|
|
101
|
+
{
|
|
102
|
+
rb_iseq_t *iseq;
|
|
103
|
+
if(!rb_obj_is_kind_of(val, rb_cISeq))
|
|
104
|
+
{
|
|
105
|
+
rb_raise(
|
|
106
|
+
rb_eTypeError,
|
|
107
|
+
"Expected VM::InstructionSequence, but got %s",
|
|
108
|
+
rb_class2name(CLASS_OF(val)));
|
|
109
|
+
}
|
|
110
|
+
GetISeqPtr(val, iseq);
|
|
111
|
+
if (!iseq->name) {
|
|
112
|
+
rb_raise(rb_eTypeError, "uninitialized InstructionSequence");
|
|
113
|
+
}
|
|
114
|
+
return iseq;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* call-seq:
|
|
121
|
+
* proc.dump(limit) => String
|
|
122
|
+
*
|
|
123
|
+
* Dump a Proc to a String.
|
|
124
|
+
*/
|
|
125
|
+
static VALUE proc_dump(VALUE self, VALUE limit)
|
|
126
|
+
{
|
|
127
|
+
if(rb_safe_level() >= 4)
|
|
128
|
+
{
|
|
129
|
+
/* no access to potentially sensitive data from the sandbox */
|
|
130
|
+
rb_raise(rb_eSecurityError, "Insecure: can't dump proc");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
{
|
|
134
|
+
#ifdef RUBY_VM
|
|
135
|
+
rb_proc_t * p;
|
|
136
|
+
VALUE iseq;
|
|
137
|
+
rb_iseq_t * iseqdat;
|
|
138
|
+
GetProcPtr(self, p);
|
|
139
|
+
iseq = p->block.iseq->self;
|
|
140
|
+
iseqdat = iseq_check(iseq);
|
|
141
|
+
iseqdat->type = ISEQ_TYPE_TOP; /* TODO: is this right? */
|
|
142
|
+
VALUE str = marshal_dump(iseq, limit);
|
|
143
|
+
return str;
|
|
144
|
+
#else
|
|
145
|
+
struct BLOCK * b;
|
|
146
|
+
VALUE body, var, arr;
|
|
147
|
+
|
|
148
|
+
Data_Get_Struct(self, struct BLOCK, b);
|
|
149
|
+
body = wrap_node(b->body);
|
|
150
|
+
var = wrap_node(b->var);
|
|
151
|
+
arr = rb_assoc_new(body, var);
|
|
152
|
+
return marshal_dump(arr, limit);
|
|
153
|
+
#endif
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#ifdef RUBY_VM
|
|
158
|
+
|
|
159
|
+
static VALUE create_proc(VALUE klass, VALUE binding, rb_iseq_t * iseq)
|
|
160
|
+
{
|
|
161
|
+
VALUE new_proc;
|
|
162
|
+
rb_proc_t * p;
|
|
163
|
+
|
|
164
|
+
if(binding == Qnil)
|
|
165
|
+
{
|
|
166
|
+
binding = rb_binding_new();
|
|
167
|
+
}
|
|
168
|
+
new_proc = rb_funcall(
|
|
169
|
+
rb_cObject, rb_intern("eval"), 2, rb_str_new2("proc { }"), binding);
|
|
170
|
+
GetProcPtr(new_proc, p);
|
|
171
|
+
p->block.iseq = iseq;
|
|
172
|
+
RBASIC(new_proc)->klass = klass;
|
|
173
|
+
return new_proc;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
#else
|
|
177
|
+
|
|
178
|
+
static VALUE create_proc(VALUE klass, VALUE binding, NODE * body, NODE * var)
|
|
179
|
+
{
|
|
180
|
+
/* Calling eval will do a security check */
|
|
181
|
+
VALUE new_proc = rb_funcall(
|
|
182
|
+
rb_cObject, rb_intern("eval"), 2, rb_str_new2("proc { }"), binding);
|
|
183
|
+
struct BLOCK * b;
|
|
184
|
+
Data_Get_Struct(new_proc, struct BLOCK, b);
|
|
185
|
+
b->body = body;
|
|
186
|
+
b->var = var;
|
|
187
|
+
RBASIC(new_proc)->klass = klass;
|
|
188
|
+
return new_proc;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#endif
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* call-seq:
|
|
195
|
+
* Proc.load(str) => UnboundProc
|
|
196
|
+
*
|
|
197
|
+
* Load a Proc from a String. When it is loaded, it will be an
|
|
198
|
+
* UnboundProc, until it is bound to a Binding with UnboundProc#bind.
|
|
199
|
+
*/
|
|
200
|
+
static VALUE proc_load(VALUE klass, VALUE str)
|
|
201
|
+
{
|
|
202
|
+
#ifdef RUBY_VM
|
|
203
|
+
VALUE iseq = marshal_load(str);
|
|
204
|
+
return create_proc(rb_cUnboundProc, Qnil, iseq_check(iseq));
|
|
205
|
+
#else
|
|
206
|
+
VALUE arr = marshal_load(str);
|
|
207
|
+
NODE * body, * var;
|
|
208
|
+
|
|
209
|
+
if( rb_safe_level() >= 4
|
|
210
|
+
|| (rb_safe_level() >= 1 && OBJ_TAINTED(str)))
|
|
211
|
+
{
|
|
212
|
+
/* no playing with knives in the sandbox */
|
|
213
|
+
rb_raise(rb_eSecurityError, "Insecure: can't load proc");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
Check_Type(arr, T_ARRAY);
|
|
217
|
+
body = unwrap_node(RARRAY_PTR(arr)[0]);
|
|
218
|
+
var = unwrap_node(RARRAY_PTR(arr)[1]);
|
|
219
|
+
return create_proc(rb_cUnboundProc, Qnil, body, var);
|
|
220
|
+
#endif
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/*
|
|
224
|
+
* call-seq:
|
|
225
|
+
* proc.unbind => UnboundProc
|
|
226
|
+
*
|
|
227
|
+
* Create an UnboundProc from a Proc.
|
|
228
|
+
*/
|
|
229
|
+
static VALUE proc_unbind(VALUE self)
|
|
230
|
+
{
|
|
231
|
+
#ifdef RUBY_VM
|
|
232
|
+
rb_proc_t * p;
|
|
233
|
+
GetProcPtr(self, p);
|
|
234
|
+
return create_proc(rb_cUnboundProc, Qnil, p->block.iseq);
|
|
235
|
+
#else
|
|
236
|
+
struct BLOCK * b;
|
|
237
|
+
Data_Get_Struct(self, struct BLOCK, b);
|
|
238
|
+
/* no need for a security check to unbind a proc -- though without the
|
|
239
|
+
* ability to bind, this doesn't seem very useful.
|
|
240
|
+
*/
|
|
241
|
+
return create_proc(rb_cUnboundProc, Qnil, b->body, b->var);
|
|
242
|
+
#endif
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/*
|
|
246
|
+
* call-seq:
|
|
247
|
+
* proc.push(anotherProc) => self
|
|
248
|
+
*
|
|
249
|
+
* Append the body of anotherProc onto proc.
|
|
250
|
+
*/
|
|
251
|
+
static VALUE proc_push(VALUE self, VALUE other)
|
|
252
|
+
{
|
|
253
|
+
#ifdef RUBY_VM
|
|
254
|
+
rb_raise(rb_eRuntimeError, "Proc#push not implemented yet for YARV");
|
|
255
|
+
#else
|
|
256
|
+
struct BLOCK * b1;
|
|
257
|
+
struct BLOCK * b2;
|
|
258
|
+
Data_Get_Struct(self, struct BLOCK, b1);
|
|
259
|
+
Data_Get_Struct(other, struct BLOCK, b2);
|
|
260
|
+
b1->body = NEW_NODE(NODE_BLOCK, b1->body, 0, b2->body);
|
|
261
|
+
return self;
|
|
262
|
+
#endif
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/*
|
|
266
|
+
* call-seq:
|
|
267
|
+
* unbound_proc.bind(Binding) => Proc
|
|
268
|
+
*
|
|
269
|
+
* Bind an UnboundProc to a Binding. Returns a Proc that has been bound
|
|
270
|
+
* to the given binding.
|
|
271
|
+
*/
|
|
272
|
+
static VALUE unboundproc_bind(VALUE self, VALUE binding)
|
|
273
|
+
{
|
|
274
|
+
#ifdef RUBY_VM
|
|
275
|
+
rb_proc_t * p;
|
|
276
|
+
GetProcPtr(self, p);
|
|
277
|
+
return create_proc(rb_cProc, binding, p->block.iseq);
|
|
278
|
+
#else
|
|
279
|
+
struct BLOCK * b;
|
|
280
|
+
Data_Get_Struct(self, struct BLOCK, b);
|
|
281
|
+
/* create_proc will do a security check */
|
|
282
|
+
return create_proc(rb_cProc, binding, b->body, b->var);
|
|
283
|
+
#endif
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/*
|
|
287
|
+
* call-seq:
|
|
288
|
+
* unbound_proc.call => raises TypeError
|
|
289
|
+
*
|
|
290
|
+
* Raises a TypeError; UnboundProc objects cannot be called.
|
|
291
|
+
*/
|
|
292
|
+
static VALUE unboundproc_call(VALUE self, VALUE args)
|
|
293
|
+
{
|
|
294
|
+
rb_raise(rb_eTypeError, "you cannot call unbound proc; bind first");
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/*
|
|
298
|
+
* call-seq:
|
|
299
|
+
* unbound_proc.binding => raises TypeError
|
|
300
|
+
*
|
|
301
|
+
* Raises a TypeError; UnboundProc objects have no binding.
|
|
302
|
+
*/
|
|
303
|
+
static VALUE unboundproc_binding(VALUE self)
|
|
304
|
+
{
|
|
305
|
+
rb_raise(rb_eTypeError, "unbound proc has no binding");
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
void Init_proc(void)
|
|
309
|
+
{
|
|
310
|
+
rb_require("internal/node");
|
|
311
|
+
|
|
312
|
+
rb_mMarshal = rb_const_get(rb_cObject, rb_intern("Marshal"));
|
|
313
|
+
|
|
314
|
+
/* For rdoc: rb_cProc = rb_define_class("Proc", rb_cObject) */
|
|
315
|
+
rb_define_method(rb_cProc, "body", proc_body, 0);
|
|
316
|
+
#ifndef RUBY_VM
|
|
317
|
+
rb_define_method(rb_cProc, "var", proc_var, 0);
|
|
318
|
+
#endif
|
|
319
|
+
rb_define_method(rb_cProc, "unbind", proc_unbind, 0);
|
|
320
|
+
rb_define_method(rb_cProc, "<<", proc_push, 1);
|
|
321
|
+
rb_define_method(rb_cProc, "push", proc_push, 1);
|
|
322
|
+
rb_define_method(rb_cProc, "_dump", proc_dump, 1);
|
|
323
|
+
rb_define_singleton_method(rb_cProc, "_load", proc_load, 1);
|
|
324
|
+
|
|
325
|
+
rb_cUnboundProc = rb_define_class("UnboundProc", rb_cProc);
|
|
326
|
+
rb_define_method(rb_cUnboundProc, "bind", unboundproc_bind, 1);
|
|
327
|
+
rb_define_method(rb_cUnboundProc, "call", unboundproc_call, -2);
|
|
328
|
+
rb_define_method(rb_cUnboundProc, "[]", unboundproc_call, -2);
|
|
329
|
+
rb_define_method(rb_cUnboundProc, "binding", unboundproc_binding, 0);
|
|
330
|
+
}
|
|
331
|
+
|