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,442 @@
|
|
|
1
|
+
require 'internal/method'
|
|
2
|
+
require 'internal/node'
|
|
3
|
+
require 'internal/node/as_expression'
|
|
4
|
+
|
|
5
|
+
if defined?(RubyVM) then
|
|
6
|
+
require 'internal/vm/bytedecoder'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module MethodSig
|
|
10
|
+
class Argument
|
|
11
|
+
attr_reader :name
|
|
12
|
+
|
|
13
|
+
def required?
|
|
14
|
+
return !optional?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def optional?
|
|
18
|
+
return rest? || block?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def rest?
|
|
22
|
+
return @is_rest
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def block?
|
|
26
|
+
return @is_block
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def default
|
|
30
|
+
return nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def initialize(name, is_rest, is_block)
|
|
34
|
+
@name = name
|
|
35
|
+
@is_rest = is_rest
|
|
36
|
+
@is_block = is_block
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def to_s
|
|
40
|
+
if @is_rest then
|
|
41
|
+
prefix = "*"
|
|
42
|
+
elsif @is_block then
|
|
43
|
+
prefix = "&"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if self.default then
|
|
47
|
+
suffix = "=#{default()}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
return "#{prefix}#{@name}#{suffix}"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class OptionalArgument < Argument
|
|
55
|
+
def optional?
|
|
56
|
+
return true
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class NodeOptionalArgument < OptionalArgument
|
|
61
|
+
attr_reader :node_for_default
|
|
62
|
+
attr_reader :default
|
|
63
|
+
|
|
64
|
+
def initialize(name, default, node_for_default, is_rest, is_block)
|
|
65
|
+
super(name, is_rest, is_block)
|
|
66
|
+
@default = default
|
|
67
|
+
@node_for_default = node_for_default
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class YarvOptionalArgument < OptionalArgument
|
|
72
|
+
attr_reader :iseq
|
|
73
|
+
attr_reader :pc_start
|
|
74
|
+
attr_reader :local_idx
|
|
75
|
+
|
|
76
|
+
def initialize(name, iseq, pc_start, local_idx, is_rest, is_block)
|
|
77
|
+
super(name, is_rest, is_block)
|
|
78
|
+
@iseq = iseq
|
|
79
|
+
@pc_start = pc_start
|
|
80
|
+
@local_idx = local_idx
|
|
81
|
+
@default = nil
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def inspect
|
|
85
|
+
default()
|
|
86
|
+
super
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def default
|
|
90
|
+
return @default if @default
|
|
91
|
+
|
|
92
|
+
env = Nodewrap::ByteDecoder::Environment.new(@iseq.local_table())
|
|
93
|
+
local_table_idx = local_table_idx()
|
|
94
|
+
@iseq.bytedecode(env, @pc_start) do |instr|
|
|
95
|
+
RubyVM::Instruction::SETLOCAL === instr &&
|
|
96
|
+
instr.operands[0] == local_table_idx
|
|
97
|
+
end
|
|
98
|
+
expressions = env.expressions + env.stack
|
|
99
|
+
|
|
100
|
+
@default = expressions[0].rhs.to_s
|
|
101
|
+
return @default
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def local_table_idx
|
|
105
|
+
return @iseq.local_table.size - @local_idx + 1
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def local_vars
|
|
110
|
+
return self.body.local_vars
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Return the names of the arguments this method takes, in the order in
|
|
114
|
+
# which they appear in the argument list.
|
|
115
|
+
def argument_names
|
|
116
|
+
return self.body.argument_names
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def args_node
|
|
120
|
+
return self.body.args_node
|
|
121
|
+
end
|
|
122
|
+
private :args_node
|
|
123
|
+
|
|
124
|
+
# If this method has a "rest" argument, that is, it has an argument
|
|
125
|
+
# that is preceded by an asterisk (*) in the argument list, then
|
|
126
|
+
# return its index, otherwise return nil.
|
|
127
|
+
def rest_arg
|
|
128
|
+
return self.body.rest_arg
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# If this method has a "block" argument, that is, it has an argument
|
|
132
|
+
# that is preceded by an ampersand (&) in the argument list, then
|
|
133
|
+
# return its index, otherwise return nil.
|
|
134
|
+
def block_arg
|
|
135
|
+
return self.body.block_arg
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def set_optional_args(args, args_node, names)
|
|
139
|
+
self.body.set_optional_args(args, args_node, names)
|
|
140
|
+
end
|
|
141
|
+
private :set_optional_args
|
|
142
|
+
|
|
143
|
+
# Return a hash mapping each argument name to a description of that
|
|
144
|
+
# argument.
|
|
145
|
+
def arguments
|
|
146
|
+
names = self.argument_names()
|
|
147
|
+
block_arg = self.block_arg()
|
|
148
|
+
|
|
149
|
+
args = {}
|
|
150
|
+
names.each do |name|
|
|
151
|
+
args[name] = Argument.new(name, false, false)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Optional args
|
|
155
|
+
args_node = args_node()
|
|
156
|
+
set_optional_args(args, args_node, names)
|
|
157
|
+
|
|
158
|
+
# Rest arg
|
|
159
|
+
if self.rest_arg then
|
|
160
|
+
rest_name = names[rest_arg]
|
|
161
|
+
args[rest_name] = Argument.new(rest_name, true, false)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Block arg
|
|
165
|
+
if block_arg then
|
|
166
|
+
block_name = names[block_arg]
|
|
167
|
+
args[block_name] = Argument.new(block_name, false, true)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
return args
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# An abstraction for a method signature.
|
|
174
|
+
class Signature
|
|
175
|
+
attr_reader :origin_class, :name, :arg_names, :args
|
|
176
|
+
|
|
177
|
+
def initialize(origin_class, name, arg_names, args)
|
|
178
|
+
@origin_class = origin_class
|
|
179
|
+
@name = name
|
|
180
|
+
@arg_names = arg_names
|
|
181
|
+
@args = args
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def to_s
|
|
185
|
+
return "#{@origin_class}\##{@name}(#{param_list})"
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def param_list
|
|
189
|
+
params = @arg_names.map{ |n| args[n].to_s }
|
|
190
|
+
return params.join(', ')
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# An abstraction for a method origin.
|
|
195
|
+
class Origin
|
|
196
|
+
attr_reader :file, :line
|
|
197
|
+
|
|
198
|
+
def initialize(file, line)
|
|
199
|
+
@file = file
|
|
200
|
+
@line = line
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def to_s
|
|
204
|
+
return "#{file}:#{line}"
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Return a Method::Origin representing where the method was defined.
|
|
209
|
+
def origin
|
|
210
|
+
block = body().next
|
|
211
|
+
return Origin.new(block.nd_file, block.nd_line)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
class Method
|
|
216
|
+
include MethodSig
|
|
217
|
+
|
|
218
|
+
# Return a String representing the method's signature.
|
|
219
|
+
def signature
|
|
220
|
+
return Signature.new(
|
|
221
|
+
attached_class(),
|
|
222
|
+
method_oid().to_s,
|
|
223
|
+
argument_names(),
|
|
224
|
+
arguments())
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
class UnboundMethod
|
|
229
|
+
include MethodSig
|
|
230
|
+
|
|
231
|
+
# Return a String representing the method's signature.
|
|
232
|
+
def signature
|
|
233
|
+
return Signature.new(
|
|
234
|
+
origin_class(),
|
|
235
|
+
method_oid().to_s,
|
|
236
|
+
argument_names(),
|
|
237
|
+
arguments())
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
class Node
|
|
242
|
+
# pre-YARV
|
|
243
|
+
class SCOPE
|
|
244
|
+
include MethodSig
|
|
245
|
+
|
|
246
|
+
def local_vars
|
|
247
|
+
return self.tbl || []
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def argument_names
|
|
251
|
+
local_vars = self.local_vars
|
|
252
|
+
args = self.args_node
|
|
253
|
+
num_required_args = args.cnt
|
|
254
|
+
num_optional_args = 0
|
|
255
|
+
opt = args.opt
|
|
256
|
+
while opt do
|
|
257
|
+
num_optional_args += 1
|
|
258
|
+
opt = opt.next
|
|
259
|
+
end
|
|
260
|
+
num_args = \
|
|
261
|
+
num_required_args + \
|
|
262
|
+
num_optional_args + \
|
|
263
|
+
(rest_arg ? 1 : 0) + \
|
|
264
|
+
(block_arg ? 1 : 0)
|
|
265
|
+
return local_vars[0...num_args]
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def args_node
|
|
269
|
+
if self.next.class == Node::ARGS then
|
|
270
|
+
return self.next
|
|
271
|
+
elsif self.next.head.class == Node::ARGS then
|
|
272
|
+
return self.next.head
|
|
273
|
+
else
|
|
274
|
+
raise "Could not find method arguments"
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def rest_arg
|
|
279
|
+
args_node = args_node()
|
|
280
|
+
rest = args_node.rest()
|
|
281
|
+
if rest.class == Node::LASGN then
|
|
282
|
+
# subtract 2 to account for implicit vars
|
|
283
|
+
return rest.cnt - 2
|
|
284
|
+
elsif not rest
|
|
285
|
+
return nil
|
|
286
|
+
else
|
|
287
|
+
return rest > 0 ? rest - 2 : nil
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def block_arg
|
|
292
|
+
block = self.next
|
|
293
|
+
if block.class == Node::BLOCK and
|
|
294
|
+
block.next.head.class == Node::BLOCK_ARG then
|
|
295
|
+
# subtract 2 to account for implicit vars
|
|
296
|
+
return block.next.head.cnt - 2
|
|
297
|
+
else
|
|
298
|
+
return nil
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def set_optional_args(args, args_node, names)
|
|
303
|
+
opt = args_node.opt
|
|
304
|
+
while opt do
|
|
305
|
+
head = opt.head
|
|
306
|
+
if head.class == Node::LASGN then
|
|
307
|
+
args[head.vid] = NodeOptionalArgument.new(
|
|
308
|
+
head.vid, head.value.as_expression, head.value, false, false)
|
|
309
|
+
else
|
|
310
|
+
raise "Unexpected node type: #{opt.class}"
|
|
311
|
+
end
|
|
312
|
+
opt = opt.next
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# Pre-YARV, I think
|
|
318
|
+
class BMETHOD
|
|
319
|
+
def local_vars
|
|
320
|
+
raise "TODO: Not implemented yet"
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def argument_names
|
|
324
|
+
return self.cval.arguments.names
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def arguments
|
|
328
|
+
return self.cval.arguments
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def args_node
|
|
332
|
+
raise "TODO: Not implemented yet"
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def rest_arg
|
|
336
|
+
raise "TODO: Not implemented yet"
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def block_arg
|
|
340
|
+
raise "TODO: Not implemented yet"
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def set_optional_args(args, args_node, names)
|
|
344
|
+
raise "TODO: Not implemented yet"
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
# YARV
|
|
349
|
+
class METHOD
|
|
350
|
+
include MethodSig
|
|
351
|
+
|
|
352
|
+
def local_vars
|
|
353
|
+
iseq = self.body
|
|
354
|
+
local_vars = iseq.local_table
|
|
355
|
+
return local_vars
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def argument_names
|
|
359
|
+
local_vars = self.local_vars
|
|
360
|
+
iseq = self.body
|
|
361
|
+
opt_args = iseq.arg_opt_table
|
|
362
|
+
opt_args.pop # last arg is a pointer to the start of the code
|
|
363
|
+
num_args = \
|
|
364
|
+
iseq.argc + \
|
|
365
|
+
opt_args.size + \
|
|
366
|
+
(rest_arg ? 1 : 0) + \
|
|
367
|
+
(block_arg ? 1 : 0)
|
|
368
|
+
return local_vars[0...num_args]
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def args_node
|
|
372
|
+
return nil
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def rest_arg
|
|
376
|
+
arg_rest = self.body.arg_rest
|
|
377
|
+
return arg_rest >= 0 ? arg_rest : nil
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def block_arg
|
|
381
|
+
arg_block = self.body.arg_block
|
|
382
|
+
return arg_block >= 0 ? arg_block : nil
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
def set_optional_args(args, args_node, names)
|
|
386
|
+
opt_table = self.body.arg_opt_table
|
|
387
|
+
opt_table.pop
|
|
388
|
+
first_opt_idx =
|
|
389
|
+
names.size -
|
|
390
|
+
opt_table.size -
|
|
391
|
+
(self.rest_arg ? 1 : 0) -
|
|
392
|
+
(self.block_arg ? 1 : 0)
|
|
393
|
+
opt_table.each_with_index do |pc, idx|
|
|
394
|
+
name = names[first_opt_idx + idx]
|
|
395
|
+
args[name] = YarvOptionalArgument.new(name, self.body, pc, idx, false, false)
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
if __FILE__ == $0 then
|
|
402
|
+
def foo(); end
|
|
403
|
+
puts method(:foo).signature
|
|
404
|
+
|
|
405
|
+
def foo(foo); end
|
|
406
|
+
puts method(:foo).signature
|
|
407
|
+
|
|
408
|
+
def foo(foo, bar); end
|
|
409
|
+
puts method(:foo).signature
|
|
410
|
+
|
|
411
|
+
def foo(foo=42, bar=10); end
|
|
412
|
+
puts method(:foo).signature
|
|
413
|
+
|
|
414
|
+
def foo(*args); end
|
|
415
|
+
puts method(:foo).signature
|
|
416
|
+
|
|
417
|
+
def foo(foo, bar=42, *args, &block); end
|
|
418
|
+
puts method(:foo).signature
|
|
419
|
+
puts method(:foo).origin
|
|
420
|
+
|
|
421
|
+
def foo(foo, bar=obj.foo(1, 2, foo(10)), *args, &block); end
|
|
422
|
+
puts method(:foo).signature
|
|
423
|
+
|
|
424
|
+
def foo(foo, bar=obj.foo(1 + 1), *args, &block); end
|
|
425
|
+
puts method(:foo).signature
|
|
426
|
+
|
|
427
|
+
def foo(foo, bar=true ? false : 0, *args, &block); end
|
|
428
|
+
puts method(:foo).signature
|
|
429
|
+
|
|
430
|
+
def foo(foo, bar=true, *args, &block); end
|
|
431
|
+
puts method(:foo).signature
|
|
432
|
+
|
|
433
|
+
def foo(foo, bar=nil, *args, &block); end
|
|
434
|
+
puts method(:foo).signature
|
|
435
|
+
|
|
436
|
+
def foo(foo, bar={1=>2}, *args, &block); end
|
|
437
|
+
puts method(:foo).signature
|
|
438
|
+
|
|
439
|
+
def foo(foo, bar=[1,2], *args, &block); end
|
|
440
|
+
puts method(:foo).signature
|
|
441
|
+
end
|
|
442
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'internal/module/module'
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'internal/node/as_code'
|
|
2
|
+
require 'internal/module'
|
|
3
|
+
|
|
4
|
+
class Module
|
|
5
|
+
# TODO: it would be nice if we could go back and find the AST
|
|
6
|
+
# for the class instead of recreating the code from the class's
|
|
7
|
+
# current state.
|
|
8
|
+
def as_code(indent=0)
|
|
9
|
+
imethods = self.instance_methods - self.superclass.instance_methods
|
|
10
|
+
cmethods = self.instance_methods - self.superclass.instance_methods
|
|
11
|
+
constants = self.constants - self.superclass.constants
|
|
12
|
+
name = self.name.gsub(/.*::/, '')
|
|
13
|
+
|
|
14
|
+
# TODO: included modules?
|
|
15
|
+
if self.class == Class then
|
|
16
|
+
s = "#{' '*indent}class #{name} < #{self.superclass}\n"
|
|
17
|
+
else
|
|
18
|
+
s = "#{' '*indent}module #{name}\n"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
constants.each do |constant|
|
|
22
|
+
s += "#{' '*indent} #{constant}=#{self.const_get(constant).as_code}\n"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# TODO: protected/private
|
|
26
|
+
imethods.each do |method|
|
|
27
|
+
s += self.instance_method(method).as_code(indent+1)
|
|
28
|
+
s += "\n"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
cmethods.each do |method|
|
|
32
|
+
s += self.instance_method(method).as_code(indent+1, "self.#{method}")
|
|
33
|
+
s += "\n"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# TODO: singleton class constants
|
|
37
|
+
# TODO: class variables
|
|
38
|
+
# TODO: singleton instance variables
|
|
39
|
+
|
|
40
|
+
s += "#{' '*indent}end"
|
|
41
|
+
|
|
42
|
+
return s
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|