ruby-internal 0.6.0 → 0.7.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/README +204 -6
- data/ext/cached/ruby-1.6.8/internal/binding/block.h +35 -0
- data/ext/cached/ruby-1.6.8/internal/method/method.h +19 -0
- data/ext/cached/ruby-1.6.8/internal/module/classpath.c +3 -0
- data/ext/cached/ruby-1.6.8/internal/module/classpath.h +8 -0
- data/ext/cached/ruby-1.6.8/internal/node/block.h +35 -0
- data/ext/cached/ruby-1.6.8/internal/node/global_entry.h +15 -0
- data/ext/cached/ruby-1.6.8/internal/node/node_type_descrip.c +149 -0
- data/ext/cached/ruby-1.6.8/internal/node/nodeinfo.c +5582 -0
- data/ext/cached/ruby-1.6.8/internal/node/nodeinfo.h +69 -0
- data/ext/cached/ruby-1.6.8/internal/proc/block.h +35 -0
- data/ext/cached/ruby-1.6.8/internal/tag/tag.h +15 -0
- data/ext/cached/ruby-1.6.8/internal/vm/instruction/insns_info.c +39 -0
- data/ext/cached/ruby-1.6.8/internal/vm/instruction/insns_info.h +21 -0
- data/ext/cached/ruby-1.6.8/internal/vm/iseq/insns_info.inc +12 -0
- data/ext/cached/ruby-1.6.8/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.0/internal/node/node_type_descrip.c +91 -91
- data/ext/cached/ruby-1.8.0/internal/node/nodeinfo.c +1909 -1909
- data/ext/cached/ruby-1.8.0/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.1/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.c +1946 -1946
- data/ext/cached/ruby-1.8.1/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.2/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.c +1946 -1946
- data/ext/cached/ruby-1.8.2/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.3/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.c +1946 -1946
- data/ext/cached/ruby-1.8.3/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.4/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.4/internal/node/nodeinfo.c +1946 -1946
- data/ext/cached/ruby-1.8.4/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.5/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.5/internal/node/nodeinfo.c +1909 -1909
- data/ext/cached/ruby-1.8.5/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.6/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.6/internal/node/nodeinfo.c +1909 -1909
- data/ext/cached/ruby-1.8.6/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.8.7/internal/node/node_type_descrip.c +90 -90
- data/ext/cached/ruby-1.8.7/internal/node/nodeinfo.c +1909 -1909
- data/ext/cached/ruby-1.8.7/internal/vm/iseq/iseq_load.inc +9 -0
- data/ext/cached/ruby-1.9.0/internal/node/node_type_descrip.c +85 -85
- data/ext/cached/ruby-1.9.0/internal/node/nodeinfo.c +1800 -1800
- data/ext/cached/ruby-1.9.0/internal/vm/iseq/iseq_load.inc +13 -0
- data/ext/cached/ruby-1.9.0/internal/yarv-headers/transdb.h +51 -51
- data/ext/cached/ruby-1.9.1/internal/node/node_type_descrip.c +85 -85
- data/ext/cached/ruby-1.9.1/internal/node/nodeinfo.c +1800 -1800
- data/ext/cached/ruby-1.9.1/internal/vm/instruction/insns_info.h +1 -2
- data/ext/cached/ruby-1.9.1/internal/vm/iseq/iseq_load.inc +356 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/eval_intern.h +15 -9
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/id.h +45 -66
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/iseq.h +12 -3
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/node.h +2 -2
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/parse.h +23 -138
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/revision.h +1 -1
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/transcode_data.h +9 -2
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/transdb.h +62 -0
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/version.h +17 -23
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_core.h +20 -29
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_exec.h +4 -7
- data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_insnhelper.h +6 -5
- data/ext/internal/module/cfp.h +13 -0
- data/ext/internal/module/extconf.rb +2 -2
- data/ext/internal/module/module.c +3 -8
- data/ext/internal/node/nodes.rb +2 -1
- data/ext/internal/vm/iseq/iseq.c +2 -3
- data/ext/internal/vm/iseq/iseq_load.inc.rpp +61 -0
- data/ext/internal/yarv-headers/debug.h +36 -0
- data/ext/internal/yarv-headers/dln.h +41 -0
- data/ext/internal/yarv-headers/encdb.h +147 -0
- data/ext/internal/yarv-headers/eval_intern.h +215 -0
- data/ext/internal/yarv-headers/gc.h +75 -0
- data/ext/internal/yarv-headers/id.h +163 -0
- data/ext/internal/yarv-headers/iseq.h +103 -0
- data/ext/internal/yarv-headers/node.h +516 -0
- data/ext/internal/yarv-headers/parse.h +188 -0
- data/ext/internal/yarv-headers/regenc.h +207 -0
- data/ext/internal/yarv-headers/regint.h +842 -0
- data/ext/internal/yarv-headers/regparse.h +351 -0
- data/ext/internal/yarv-headers/revision.h +1 -0
- data/ext/internal/yarv-headers/thread_pthread.h +24 -0
- data/ext/internal/yarv-headers/thread_win32.h +33 -0
- data/ext/internal/yarv-headers/transcode_data.h +106 -0
- data/ext/internal/yarv-headers/transdb.h +147 -0
- data/ext/internal/yarv-headers/version.h +54 -0
- data/ext/internal/yarv-headers/vm_core.h +646 -0
- data/ext/internal/yarv-headers/vm_exec.h +184 -0
- data/ext/internal/yarv-headers/vm_insnhelper.h +195 -0
- data/ext/internal/yarv-headers/vm_opts.h +51 -0
- data/publish_rdoc.rb +4 -0
- metadata +52 -2
|
@@ -2894,88 +2894,86 @@ void define_node_subclass_methods()
|
|
|
2894
2894
|
}
|
|
2895
2895
|
|
|
2896
2896
|
|
|
2897
|
-
/* Document-class: Node::
|
|
2898
|
-
* Represents
|
|
2899
|
-
*
|
|
2897
|
+
/* Document-class: Node::ALIAS
|
|
2898
|
+
* Represents an alias expression of the form:
|
|
2899
|
+
* alias 1st 2nd
|
|
2900
|
+
* where 2nd is the name of an existing method and 1st is the name of
|
|
2901
|
+
* its new alias.
|
|
2900
2902
|
*/
|
|
2901
2903
|
{
|
|
2902
|
-
VALUE
|
|
2904
|
+
VALUE rb_cALIAS = rb_define_class_under(rb_cNode, "ALIAS", rb_cNode);
|
|
2903
2905
|
members = rb_ary_new();
|
|
2904
|
-
rb_cNodeSubclass[
|
|
2905
|
-
rb_iv_set(
|
|
2906
|
-
rb_iv_set(
|
|
2907
|
-
rb_define_singleton_method(
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
rb_define_method(rb_cDASGN_CURR, "value", node_value, 0);
|
|
2913
|
-
rb_ary_push(members, rb_str_new2("value"));
|
|
2914
|
-
|
|
2915
|
-
/* Document-method: vid
|
|
2916
|
-
* the name of the local variable
|
|
2917
|
-
*/
|
|
2918
|
-
rb_define_method(rb_cDASGN_CURR, "vid", node_vid, 0);
|
|
2919
|
-
rb_ary_push(members, rb_str_new2("vid"));
|
|
2906
|
+
rb_cNodeSubclass[NODE_ALIAS] = rb_cALIAS;
|
|
2907
|
+
rb_iv_set(rb_cALIAS, "__member__", members);
|
|
2908
|
+
rb_iv_set(rb_cALIAS, "__type__", INT2NUM(NODE_ALIAS));
|
|
2909
|
+
rb_define_singleton_method(rb_cALIAS, "members", node_s_members, 0);
|
|
2910
|
+
rb_define_method(rb_cALIAS, "first", node_1st, 0);
|
|
2911
|
+
rb_ary_push(members, rb_str_new2("first"));
|
|
2912
|
+
rb_define_method(rb_cALIAS, "second", node_2nd, 0);
|
|
2913
|
+
rb_ary_push(members, rb_str_new2("second"));
|
|
2920
2914
|
}
|
|
2921
2915
|
|
|
2922
|
-
/* Document-class: Node::
|
|
2923
|
-
*
|
|
2924
|
-
*
|
|
2925
|
-
*
|
|
2926
|
-
*
|
|
2916
|
+
/* Document-class: Node::ALLOCA
|
|
2917
|
+
* A node used for temporary allocation of memory on platforms that do
|
|
2918
|
+
* not support alloca.
|
|
2919
|
+
*
|
|
2920
|
+
* It should never be evaluated as an expression.
|
|
2927
2921
|
*/
|
|
2922
|
+
#ifdef HAVE_NODE_ALLOCA
|
|
2928
2923
|
{
|
|
2929
|
-
VALUE
|
|
2924
|
+
VALUE rb_cALLOCA = rb_define_class_under(rb_cNode, "ALLOCA", rb_cNode);
|
|
2930
2925
|
members = rb_ary_new();
|
|
2931
|
-
rb_cNodeSubclass[
|
|
2932
|
-
rb_iv_set(
|
|
2933
|
-
rb_iv_set(
|
|
2934
|
-
rb_define_singleton_method(
|
|
2926
|
+
rb_cNodeSubclass[NODE_ALLOCA] = rb_cALLOCA;
|
|
2927
|
+
rb_iv_set(rb_cALLOCA, "__member__", members);
|
|
2928
|
+
rb_iv_set(rb_cALLOCA, "__type__", INT2NUM(NODE_ALLOCA));
|
|
2929
|
+
rb_define_singleton_method(rb_cALLOCA, "members", node_s_members, 0);
|
|
2935
2930
|
|
|
2936
|
-
/* Document-method:
|
|
2937
|
-
*
|
|
2931
|
+
/* Document-method: cfnc
|
|
2932
|
+
* a pointer to the allocated memory
|
|
2938
2933
|
*/
|
|
2939
|
-
rb_define_method(
|
|
2940
|
-
rb_ary_push(members, rb_str_new2("
|
|
2934
|
+
rb_define_method(rb_cALLOCA, "cfnc", node_cfnc, 0);
|
|
2935
|
+
rb_ary_push(members, rb_str_new2("cfnc"));
|
|
2941
2936
|
|
|
2942
|
-
/* Document-method:
|
|
2943
|
-
* a
|
|
2937
|
+
/* Document-method: value
|
|
2938
|
+
* a pointer to the previously allocated temporary node
|
|
2944
2939
|
*/
|
|
2945
|
-
rb_define_method(
|
|
2946
|
-
rb_ary_push(members, rb_str_new2("
|
|
2947
|
-
|
|
2948
|
-
|
|
2940
|
+
rb_define_method(rb_cALLOCA, "value", node_value, 0);
|
|
2941
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
2942
|
+
|
|
2943
|
+
/* Document-method: cnt
|
|
2944
|
+
* the number of bytes allocated
|
|
2945
|
+
*/
|
|
2946
|
+
rb_define_method(rb_cALLOCA, "cnt", node_cnt, 0);
|
|
2947
|
+
rb_ary_push(members, rb_str_new2("cnt"));
|
|
2949
2948
|
}
|
|
2949
|
+
#endif
|
|
2950
2950
|
|
|
2951
|
-
/* Document-class: Node::
|
|
2952
|
-
* Represents
|
|
2953
|
-
*
|
|
2954
|
-
*
|
|
2955
|
-
*
|
|
2956
|
-
*
|
|
2951
|
+
/* Document-class: Node::AND
|
|
2952
|
+
* Represents a logical 'and' of the form:
|
|
2953
|
+
* first && second
|
|
2954
|
+
* The expression will short-circuit and yield the result of the left
|
|
2955
|
+
* hand side if it is false or nil, else it will evaluate the right
|
|
2956
|
+
* hand side and use it as the result of the expression.
|
|
2957
2957
|
*/
|
|
2958
2958
|
{
|
|
2959
|
-
VALUE
|
|
2959
|
+
VALUE rb_cAND = rb_define_class_under(rb_cNode, "AND", rb_cNode);
|
|
2960
2960
|
members = rb_ary_new();
|
|
2961
|
-
rb_cNodeSubclass[
|
|
2962
|
-
rb_iv_set(
|
|
2963
|
-
rb_iv_set(
|
|
2964
|
-
rb_define_singleton_method(
|
|
2961
|
+
rb_cNodeSubclass[NODE_AND] = rb_cAND;
|
|
2962
|
+
rb_iv_set(rb_cAND, "__member__", members);
|
|
2963
|
+
rb_iv_set(rb_cAND, "__type__", INT2NUM(NODE_AND));
|
|
2964
|
+
rb_define_singleton_method(rb_cAND, "members", node_s_members, 0);
|
|
2965
2965
|
|
|
2966
|
-
/* Document-method:
|
|
2967
|
-
* the
|
|
2968
|
-
* reference, one of '&', '`', '\'', or '+'
|
|
2966
|
+
/* Document-method: first
|
|
2967
|
+
* the expression on the left hand side
|
|
2969
2968
|
*/
|
|
2970
|
-
rb_define_method(
|
|
2971
|
-
rb_ary_push(members, rb_str_new2("
|
|
2969
|
+
rb_define_method(rb_cAND, "first", node_1st, 0);
|
|
2970
|
+
rb_ary_push(members, rb_str_new2("first"));
|
|
2972
2971
|
|
|
2973
|
-
/* Document-method:
|
|
2974
|
-
* the
|
|
2975
|
-
* stored
|
|
2972
|
+
/* Document-method: second
|
|
2973
|
+
* the expression on the right hand side
|
|
2976
2974
|
*/
|
|
2977
|
-
rb_define_method(
|
|
2978
|
-
rb_ary_push(members, rb_str_new2("
|
|
2975
|
+
rb_define_method(rb_cAND, "second", node_2nd, 0);
|
|
2976
|
+
rb_ary_push(members, rb_str_new2("second"));
|
|
2979
2977
|
}
|
|
2980
2978
|
|
|
2981
2979
|
/* Document-class: Node::ARGS
|
|
@@ -3009,220 +3007,183 @@ void define_node_subclass_methods()
|
|
|
3009
3007
|
rb_ary_push(members, rb_str_new2("cnt"));
|
|
3010
3008
|
}
|
|
3011
3009
|
|
|
3012
|
-
/* Document-class: Node::
|
|
3013
|
-
* Represents
|
|
3014
|
-
*
|
|
3015
|
-
*
|
|
3016
|
-
*
|
|
3017
|
-
*
|
|
3018
|
-
*
|
|
3010
|
+
/* Document-class: Node::ARGSCAT
|
|
3011
|
+
* Represents the concatenation of a list of arguments and a splatted
|
|
3012
|
+
* value, e.g.:
|
|
3013
|
+
* a, b, *value
|
|
3014
|
+
* Evaluates head to create an array. Evaluates body and performs a
|
|
3015
|
+
* splat operation on the result to create another array (see SPLAT).
|
|
3016
|
+
* Concatenates the the second array onto the end of the first to
|
|
3017
|
+
* produce the result.
|
|
3019
3018
|
*/
|
|
3020
3019
|
{
|
|
3021
|
-
VALUE
|
|
3020
|
+
VALUE rb_cARGSCAT = rb_define_class_under(rb_cNode, "ARGSCAT", rb_cNode);
|
|
3022
3021
|
members = rb_ary_new();
|
|
3023
|
-
rb_cNodeSubclass[
|
|
3024
|
-
rb_iv_set(
|
|
3025
|
-
rb_iv_set(
|
|
3026
|
-
rb_define_singleton_method(
|
|
3022
|
+
rb_cNodeSubclass[NODE_ARGSCAT] = rb_cARGSCAT;
|
|
3023
|
+
rb_iv_set(rb_cARGSCAT, "__member__", members);
|
|
3024
|
+
rb_iv_set(rb_cARGSCAT, "__type__", INT2NUM(NODE_ARGSCAT));
|
|
3025
|
+
rb_define_singleton_method(rb_cARGSCAT, "members", node_s_members, 0);
|
|
3027
3026
|
|
|
3028
|
-
/* Document-method:
|
|
3029
|
-
*
|
|
3030
|
-
* performed if the left hand side is true
|
|
3027
|
+
/* Document-method: head
|
|
3028
|
+
* a list of fixed arguments
|
|
3031
3029
|
*/
|
|
3032
|
-
rb_define_method(
|
|
3033
|
-
rb_ary_push(members, rb_str_new2("
|
|
3030
|
+
rb_define_method(rb_cARGSCAT, "head", node_head, 0);
|
|
3031
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
3034
3032
|
|
|
3035
|
-
/* Document-method:
|
|
3036
|
-
*
|
|
3033
|
+
/* Document-method: body
|
|
3034
|
+
* the last argument, which will be splatted onto the end of the
|
|
3035
|
+
* fixed arguments
|
|
3037
3036
|
*/
|
|
3038
|
-
rb_define_method(
|
|
3039
|
-
rb_ary_push(members, rb_str_new2("
|
|
3037
|
+
rb_define_method(rb_cARGSCAT, "body", node_body, 0);
|
|
3038
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
3040
3039
|
}
|
|
3041
3040
|
|
|
3042
|
-
/* Document-class: Node::
|
|
3043
|
-
* Represents the
|
|
3044
|
-
*
|
|
3045
|
-
*
|
|
3046
|
-
*
|
|
3041
|
+
/* Document-class: Node::ARGSPUSH
|
|
3042
|
+
* Represents the splat portion of the index in an expression:
|
|
3043
|
+
* obj[arg, arg, *head] = body
|
|
3044
|
+
* Evaluates head to create an array. Evaluates body and pushes the
|
|
3045
|
+
* result onto the end of the array, which will then be used to form
|
|
3046
|
+
* the arguments of the method call.
|
|
3047
3047
|
*/
|
|
3048
3048
|
{
|
|
3049
|
-
VALUE
|
|
3049
|
+
VALUE rb_cARGSPUSH = rb_define_class_under(rb_cNode, "ARGSPUSH", rb_cNode);
|
|
3050
3050
|
members = rb_ary_new();
|
|
3051
|
-
rb_cNodeSubclass[
|
|
3052
|
-
rb_iv_set(
|
|
3053
|
-
rb_iv_set(
|
|
3054
|
-
rb_define_singleton_method(
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
rb_define_method(rb_cRETURN, "stts", node_stts, 0);
|
|
3060
|
-
rb_ary_push(members, rb_str_new2("stts"));
|
|
3051
|
+
rb_cNodeSubclass[NODE_ARGSPUSH] = rb_cARGSPUSH;
|
|
3052
|
+
rb_iv_set(rb_cARGSPUSH, "__member__", members);
|
|
3053
|
+
rb_iv_set(rb_cARGSPUSH, "__type__", INT2NUM(NODE_ARGSPUSH));
|
|
3054
|
+
rb_define_singleton_method(rb_cARGSPUSH, "members", node_s_members, 0);
|
|
3055
|
+
rb_define_method(rb_cARGSPUSH, "head", node_head, 0);
|
|
3056
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
3057
|
+
rb_define_method(rb_cARGSPUSH, "body", node_body, 0);
|
|
3058
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
3061
3059
|
}
|
|
3062
3060
|
|
|
3063
|
-
/* Document-class: Node::
|
|
3064
|
-
* Represents
|
|
3065
|
-
*
|
|
3066
|
-
*
|
|
3067
|
-
* or the longer form:
|
|
3068
|
-
* begin
|
|
3069
|
-
* head
|
|
3070
|
-
* rescue exception
|
|
3071
|
-
* expr
|
|
3072
|
-
* end
|
|
3073
|
-
*
|
|
3074
|
-
* or the form using the else keyword:
|
|
3075
|
-
* begin
|
|
3076
|
-
* head
|
|
3077
|
-
* rescue exception
|
|
3078
|
-
* expr
|
|
3079
|
-
* else
|
|
3080
|
-
* else_expr
|
|
3081
|
-
* end
|
|
3082
|
-
*
|
|
3083
|
-
* The head expression is first evaluated, and if an exception is
|
|
3084
|
-
* raised, evaluates the resq node. If no exception is raised, the
|
|
3085
|
-
* else node is evaluated if it is not false (0).
|
|
3086
|
-
*
|
|
3087
|
-
* The resq node will be a RESBDOY node, which will test the exception
|
|
3088
|
-
* to see if it matches one of the expected types. If it does it will
|
|
3089
|
-
* handle the exception, otherwise it will allow the expression to pass
|
|
3090
|
-
* to the outer scope.
|
|
3061
|
+
/* Document-class: Node::ARRAY
|
|
3062
|
+
* Represents an array of elements. Evaluation of this node creates a
|
|
3063
|
+
* new Array by evalating the given expressions and placing them into
|
|
3064
|
+
* the array.
|
|
3091
3065
|
*/
|
|
3092
3066
|
{
|
|
3093
|
-
VALUE
|
|
3067
|
+
VALUE rb_cARRAY = rb_define_class_under(rb_cNode, "ARRAY", rb_cNode);
|
|
3094
3068
|
members = rb_ary_new();
|
|
3095
|
-
rb_cNodeSubclass[
|
|
3096
|
-
rb_iv_set(
|
|
3097
|
-
rb_iv_set(
|
|
3098
|
-
rb_define_singleton_method(
|
|
3069
|
+
rb_cNodeSubclass[NODE_ARRAY] = rb_cARRAY;
|
|
3070
|
+
rb_iv_set(rb_cARRAY, "__member__", members);
|
|
3071
|
+
rb_iv_set(rb_cARRAY, "__type__", INT2NUM(NODE_ARRAY));
|
|
3072
|
+
rb_define_singleton_method(rb_cARRAY, "members", node_s_members, 0);
|
|
3099
3073
|
|
|
3100
3074
|
/* Document-method: head
|
|
3101
|
-
* the
|
|
3075
|
+
* the first element of the array
|
|
3102
3076
|
*/
|
|
3103
|
-
rb_define_method(
|
|
3077
|
+
rb_define_method(rb_cARRAY, "head", node_head, 0);
|
|
3104
3078
|
rb_ary_push(members, rb_str_new2("head"));
|
|
3079
|
+
rb_define_method(rb_cARRAY, "alen", node_alen, 0);
|
|
3080
|
+
rb_ary_push(members, rb_str_new2("alen"));
|
|
3105
3081
|
|
|
3106
|
-
/* Document-method:
|
|
3107
|
-
* the
|
|
3108
|
-
*/
|
|
3109
|
-
rb_define_method(rb_cRESCUE, "else", node_else, 0);
|
|
3110
|
-
rb_ary_push(members, rb_str_new2("else"));
|
|
3111
|
-
|
|
3112
|
-
/* Document-method: resq
|
|
3113
|
-
* the expression to be evaluated if an exception is raised
|
|
3082
|
+
/* Document-method: next
|
|
3083
|
+
* the tail of the array
|
|
3114
3084
|
*/
|
|
3115
|
-
rb_define_method(
|
|
3116
|
-
rb_ary_push(members, rb_str_new2("
|
|
3085
|
+
rb_define_method(rb_cARRAY, "next", node_next, 0);
|
|
3086
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
3117
3087
|
}
|
|
3118
3088
|
|
|
3119
|
-
/* Document-class: Node::
|
|
3120
|
-
* Represents
|
|
3121
|
-
*
|
|
3089
|
+
/* Document-class: Node::ATTRASGN
|
|
3090
|
+
* Represents attribute assignment in the form:
|
|
3091
|
+
* recv.mid = args
|
|
3092
|
+
* or:
|
|
3093
|
+
* recv.mid=(args).
|
|
3122
3094
|
*/
|
|
3123
3095
|
{
|
|
3124
|
-
VALUE
|
|
3096
|
+
VALUE rb_cATTRASGN = rb_define_class_under(rb_cNode, "ATTRASGN", rb_cNode);
|
|
3125
3097
|
members = rb_ary_new();
|
|
3126
|
-
rb_cNodeSubclass[
|
|
3127
|
-
rb_iv_set(
|
|
3128
|
-
rb_iv_set(
|
|
3129
|
-
rb_define_singleton_method(
|
|
3098
|
+
rb_cNodeSubclass[NODE_ATTRASGN] = rb_cATTRASGN;
|
|
3099
|
+
rb_iv_set(rb_cATTRASGN, "__member__", members);
|
|
3100
|
+
rb_iv_set(rb_cATTRASGN, "__type__", INT2NUM(NODE_ATTRASGN));
|
|
3101
|
+
rb_define_singleton_method(rb_cATTRASGN, "members", node_s_members, 0);
|
|
3130
3102
|
|
|
3131
|
-
/* Document-method:
|
|
3132
|
-
* the
|
|
3103
|
+
/* Document-method: args
|
|
3104
|
+
* the arguments to the method
|
|
3133
3105
|
*/
|
|
3134
|
-
rb_define_method(
|
|
3135
|
-
rb_ary_push(members, rb_str_new2("
|
|
3106
|
+
rb_define_method(rb_cATTRASGN, "args", node_args, 0);
|
|
3107
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
3108
|
+
|
|
3109
|
+
/* Document-method: mid
|
|
3110
|
+
* the id of the attribute, with a trailing '=' sign
|
|
3111
|
+
*/
|
|
3112
|
+
rb_define_method(rb_cATTRASGN, "mid", node_mid, 0);
|
|
3113
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
3114
|
+
|
|
3115
|
+
/* Document-method: recv
|
|
3116
|
+
* the receiver of the method
|
|
3117
|
+
*/
|
|
3118
|
+
rb_define_method(rb_cATTRASGN, "recv", node_recv, 0);
|
|
3119
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
3136
3120
|
}
|
|
3137
3121
|
|
|
3138
|
-
/* Document-class: Node::
|
|
3139
|
-
*
|
|
3122
|
+
/* Document-class: Node::ATTRSET
|
|
3123
|
+
* A placeholder for an attribute writer method, which can added to a
|
|
3124
|
+
* class by using attr_writer:
|
|
3125
|
+
* attr_writer :attribute
|
|
3126
|
+
* Its reader counterpart is IVAR.
|
|
3140
3127
|
*/
|
|
3141
3128
|
{
|
|
3142
|
-
VALUE
|
|
3129
|
+
VALUE rb_cATTRSET = rb_define_class_under(rb_cNode, "ATTRSET", rb_cNode);
|
|
3143
3130
|
members = rb_ary_new();
|
|
3144
|
-
rb_cNodeSubclass[
|
|
3145
|
-
rb_iv_set(
|
|
3146
|
-
rb_iv_set(
|
|
3147
|
-
rb_define_singleton_method(
|
|
3131
|
+
rb_cNodeSubclass[NODE_ATTRSET] = rb_cATTRSET;
|
|
3132
|
+
rb_iv_set(rb_cATTRSET, "__member__", members);
|
|
3133
|
+
rb_iv_set(rb_cATTRSET, "__type__", INT2NUM(NODE_ATTRSET));
|
|
3134
|
+
rb_define_singleton_method(rb_cATTRSET, "members", node_s_members, 0);
|
|
3135
|
+
|
|
3136
|
+
/* Document-method: vid
|
|
3137
|
+
* the name of the attribute, with a leading '@' sign
|
|
3138
|
+
*/
|
|
3139
|
+
rb_define_method(rb_cATTRSET, "vid", node_vid, 0);
|
|
3140
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3148
3141
|
}
|
|
3149
3142
|
|
|
3150
|
-
/* Document-class: Node::
|
|
3151
|
-
*
|
|
3143
|
+
/* Document-class: Node::BACK_REF
|
|
3144
|
+
* Represents one of the regex back reference variables:
|
|
3145
|
+
* * $& - last match
|
|
3146
|
+
* * $` - pre
|
|
3147
|
+
* * $' - post
|
|
3148
|
+
* * $+ - last
|
|
3152
3149
|
*/
|
|
3153
3150
|
{
|
|
3154
|
-
VALUE
|
|
3151
|
+
VALUE rb_cBACK_REF = rb_define_class_under(rb_cNode, "BACK_REF", rb_cNode);
|
|
3155
3152
|
members = rb_ary_new();
|
|
3156
|
-
rb_cNodeSubclass[
|
|
3157
|
-
rb_iv_set(
|
|
3158
|
-
rb_iv_set(
|
|
3159
|
-
rb_define_singleton_method(
|
|
3160
|
-
|
|
3161
|
-
/* Document-method: cfnc
|
|
3162
|
-
* a pointer to the C function to which to yield
|
|
3163
|
-
*/
|
|
3164
|
-
rb_define_method(rb_cIFUNC, "cfnc", node_cfnc, 0);
|
|
3165
|
-
rb_ary_push(members, rb_str_new2("cfnc"));
|
|
3153
|
+
rb_cNodeSubclass[NODE_BACK_REF] = rb_cBACK_REF;
|
|
3154
|
+
rb_iv_set(rb_cBACK_REF, "__member__", members);
|
|
3155
|
+
rb_iv_set(rb_cBACK_REF, "__type__", INT2NUM(NODE_BACK_REF));
|
|
3156
|
+
rb_define_singleton_method(rb_cBACK_REF, "members", node_s_members, 0);
|
|
3166
3157
|
|
|
3167
|
-
/* Document-method:
|
|
3168
|
-
* the
|
|
3169
|
-
*
|
|
3158
|
+
/* Document-method: nth
|
|
3159
|
+
* the integer representation of the character of the variable to
|
|
3160
|
+
* reference, one of '&', '`', '\'', or '+'
|
|
3170
3161
|
*/
|
|
3171
|
-
rb_define_method(
|
|
3172
|
-
rb_ary_push(members, rb_str_new2("
|
|
3162
|
+
rb_define_method(rb_cBACK_REF, "nth", node_nth, 0);
|
|
3163
|
+
rb_ary_push(members, rb_str_new2("nth"));
|
|
3173
3164
|
|
|
3174
|
-
/* Document-method:
|
|
3175
|
-
*
|
|
3165
|
+
/* Document-method: cnt
|
|
3166
|
+
* the index into the local variable table where the match data is
|
|
3167
|
+
* stored
|
|
3176
3168
|
*/
|
|
3177
|
-
rb_define_method(
|
|
3178
|
-
rb_ary_push(members, rb_str_new2("
|
|
3169
|
+
rb_define_method(rb_cBACK_REF, "cnt", node_cnt, 0);
|
|
3170
|
+
rb_ary_push(members, rb_str_new2("cnt"));
|
|
3179
3171
|
}
|
|
3180
3172
|
|
|
3181
|
-
/* Document-class: Node::
|
|
3182
|
-
* Represents
|
|
3183
|
-
* arguments. The arguments to the base class method are obtained from
|
|
3184
|
-
* the arguments passed to the current method, which are store in the
|
|
3185
|
-
* current frame.
|
|
3173
|
+
/* Document-class: Node::BEGIN
|
|
3174
|
+
* Represents a begin/end block.
|
|
3186
3175
|
*
|
|
3187
|
-
*
|
|
3188
|
-
* deferred to the base class.
|
|
3189
|
-
*/
|
|
3190
|
-
{
|
|
3191
|
-
VALUE rb_cZSUPER = rb_define_class_under(rb_cNode, "ZSUPER", rb_cNode);
|
|
3192
|
-
members = rb_ary_new();
|
|
3193
|
-
rb_cNodeSubclass[NODE_ZSUPER] = rb_cZSUPER;
|
|
3194
|
-
rb_iv_set(rb_cZSUPER, "__member__", members);
|
|
3195
|
-
rb_iv_set(rb_cZSUPER, "__type__", INT2NUM(NODE_ZSUPER));
|
|
3196
|
-
rb_define_singleton_method(rb_cZSUPER, "members", node_s_members, 0);
|
|
3197
|
-
}
|
|
3198
|
-
|
|
3199
|
-
/* Document-class: Node::WHILE
|
|
3200
|
-
* Represents a loop constructed with the 'while' keyword, e.g.:
|
|
3201
|
-
* while cond do
|
|
3202
|
-
* body
|
|
3203
|
-
* end
|
|
3176
|
+
* TODO: Need an example
|
|
3204
3177
|
*/
|
|
3205
3178
|
{
|
|
3206
|
-
VALUE
|
|
3179
|
+
VALUE rb_cBEGIN = rb_define_class_under(rb_cNode, "BEGIN", rb_cNode);
|
|
3207
3180
|
members = rb_ary_new();
|
|
3208
|
-
rb_cNodeSubclass[
|
|
3209
|
-
rb_iv_set(
|
|
3210
|
-
rb_iv_set(
|
|
3211
|
-
rb_define_singleton_method(
|
|
3212
|
-
|
|
3213
|
-
/* Document-method: body
|
|
3214
|
-
* the body of the loop
|
|
3215
|
-
*/
|
|
3216
|
-
rb_define_method(rb_cWHILE, "body", node_body, 0);
|
|
3181
|
+
rb_cNodeSubclass[NODE_BEGIN] = rb_cBEGIN;
|
|
3182
|
+
rb_iv_set(rb_cBEGIN, "__member__", members);
|
|
3183
|
+
rb_iv_set(rb_cBEGIN, "__type__", INT2NUM(NODE_BEGIN));
|
|
3184
|
+
rb_define_singleton_method(rb_cBEGIN, "members", node_s_members, 0);
|
|
3185
|
+
rb_define_method(rb_cBEGIN, "body", node_body, 0);
|
|
3217
3186
|
rb_ary_push(members, rb_str_new2("body"));
|
|
3218
|
-
|
|
3219
|
-
/* Document-method: cond
|
|
3220
|
-
* a condition to terminate the loop when it becomes false
|
|
3221
|
-
*/
|
|
3222
|
-
rb_define_method(rb_cWHILE, "cond", node_cond, 0);
|
|
3223
|
-
rb_ary_push(members, rb_str_new2("cond"));
|
|
3224
|
-
rb_define_method(rb_cWHILE, "state", node_state, 0);
|
|
3225
|
-
rb_ary_push(members, rb_str_new2("state"));
|
|
3226
3187
|
}
|
|
3227
3188
|
|
|
3228
3189
|
/* Document-class: Node::BLOCK
|
|
@@ -3256,138 +3217,244 @@ void define_node_subclass_methods()
|
|
|
3256
3217
|
rb_ary_push(members, rb_str_new2("next"));
|
|
3257
3218
|
}
|
|
3258
3219
|
|
|
3259
|
-
/* Document-class: Node::
|
|
3260
|
-
* Represents a
|
|
3261
|
-
*
|
|
3262
|
-
*
|
|
3263
|
-
* This makes a method call on an object using self as the implicit
|
|
3264
|
-
* receiver.
|
|
3220
|
+
/* Document-class: Node::BLOCK_ARG
|
|
3221
|
+
* Represents a block argument in a method definition, e.g.:
|
|
3222
|
+
* def foo(&arg)
|
|
3223
|
+
* end
|
|
3265
3224
|
*/
|
|
3266
3225
|
{
|
|
3267
|
-
VALUE
|
|
3226
|
+
VALUE rb_cBLOCK_ARG = rb_define_class_under(rb_cNode, "BLOCK_ARG", rb_cNode);
|
|
3268
3227
|
members = rb_ary_new();
|
|
3269
|
-
rb_cNodeSubclass[
|
|
3270
|
-
rb_iv_set(
|
|
3271
|
-
rb_iv_set(
|
|
3272
|
-
rb_define_singleton_method(
|
|
3273
|
-
|
|
3274
|
-
/* Document-method: args
|
|
3275
|
-
* the arguments to the method
|
|
3276
|
-
*/
|
|
3277
|
-
rb_define_method(rb_cFCALL, "args", node_args, 0);
|
|
3278
|
-
rb_ary_push(members, rb_str_new2("args"));
|
|
3228
|
+
rb_cNodeSubclass[NODE_BLOCK_ARG] = rb_cBLOCK_ARG;
|
|
3229
|
+
rb_iv_set(rb_cBLOCK_ARG, "__member__", members);
|
|
3230
|
+
rb_iv_set(rb_cBLOCK_ARG, "__type__", INT2NUM(NODE_BLOCK_ARG));
|
|
3231
|
+
rb_define_singleton_method(rb_cBLOCK_ARG, "members", node_s_members, 0);
|
|
3279
3232
|
|
|
3280
|
-
/* Document-method:
|
|
3281
|
-
* the
|
|
3233
|
+
/* Document-method: cnt
|
|
3234
|
+
* the index into the local variable table of the name of the block
|
|
3235
|
+
* argument, not including the implicit variables.
|
|
3282
3236
|
*/
|
|
3283
|
-
rb_define_method(
|
|
3284
|
-
rb_ary_push(members, rb_str_new2("
|
|
3237
|
+
rb_define_method(rb_cBLOCK_ARG, "cnt", node_cnt, 0);
|
|
3238
|
+
rb_ary_push(members, rb_str_new2("cnt"));
|
|
3285
3239
|
}
|
|
3286
3240
|
|
|
3287
|
-
/* Document-class: Node::
|
|
3288
|
-
* Represents
|
|
3289
|
-
*
|
|
3290
|
-
*
|
|
3241
|
+
/* Document-class: Node::BLOCK_PASS
|
|
3242
|
+
* Represents an object being passed to a method as a block, e.g.:
|
|
3243
|
+
* foo(&bar)
|
|
3244
|
+
*
|
|
3245
|
+
* The body node is first evaluates to get an object, then #to_proc to
|
|
3246
|
+
* convert it into a proc if necessary. The iter node is then
|
|
3247
|
+
* evaluated to call a method, passing the proc as a block parameter to
|
|
3248
|
+
* the method.
|
|
3291
3249
|
*/
|
|
3292
3250
|
{
|
|
3293
|
-
VALUE
|
|
3251
|
+
VALUE rb_cBLOCK_PASS = rb_define_class_under(rb_cNode, "BLOCK_PASS", rb_cNode);
|
|
3294
3252
|
members = rb_ary_new();
|
|
3295
|
-
rb_cNodeSubclass[
|
|
3296
|
-
rb_iv_set(
|
|
3297
|
-
rb_iv_set(
|
|
3298
|
-
rb_define_singleton_method(
|
|
3299
|
-
|
|
3300
|
-
/* Document-method: lit
|
|
3301
|
-
* a string
|
|
3302
|
-
*/
|
|
3303
|
-
rb_define_method(rb_cDREGX_ONCE, "lit", node_lit, 0);
|
|
3304
|
-
rb_ary_push(members, rb_str_new2("lit"));
|
|
3253
|
+
rb_cNodeSubclass[NODE_BLOCK_PASS] = rb_cBLOCK_PASS;
|
|
3254
|
+
rb_iv_set(rb_cBLOCK_PASS, "__member__", members);
|
|
3255
|
+
rb_iv_set(rb_cBLOCK_PASS, "__type__", INT2NUM(NODE_BLOCK_PASS));
|
|
3256
|
+
rb_define_singleton_method(rb_cBLOCK_PASS, "members", node_s_members, 0);
|
|
3305
3257
|
|
|
3306
|
-
/* Document-method:
|
|
3307
|
-
*
|
|
3308
|
-
* expression. See DREGX for a list of valid values.
|
|
3258
|
+
/* Document-method: body
|
|
3259
|
+
* the object to pass as a block
|
|
3309
3260
|
*/
|
|
3310
|
-
rb_define_method(
|
|
3311
|
-
rb_ary_push(members, rb_str_new2("
|
|
3261
|
+
rb_define_method(rb_cBLOCK_PASS, "body", node_body, 0);
|
|
3262
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
3312
3263
|
|
|
3313
|
-
/* Document-method:
|
|
3314
|
-
*
|
|
3264
|
+
/* Document-method: iter
|
|
3265
|
+
* an expression which calls a method
|
|
3315
3266
|
*/
|
|
3316
|
-
rb_define_method(
|
|
3317
|
-
rb_ary_push(members, rb_str_new2("
|
|
3267
|
+
rb_define_method(rb_cBLOCK_PASS, "iter", node_iter, 0);
|
|
3268
|
+
rb_ary_push(members, rb_str_new2("iter"));
|
|
3318
3269
|
}
|
|
3319
3270
|
|
|
3320
|
-
/* Document-class: Node::
|
|
3321
|
-
*
|
|
3322
|
-
*
|
|
3323
|
-
*
|
|
3324
|
-
*
|
|
3325
|
-
*
|
|
3271
|
+
/* Document-class: Node::BMETHOD
|
|
3272
|
+
* A placeholder for a method defined using define_method, e.g.:
|
|
3273
|
+
* define_method(:foo) {
|
|
3274
|
+
* ...
|
|
3275
|
+
* }
|
|
3276
|
+
*
|
|
3277
|
+
* See also DMETHOD.
|
|
3326
3278
|
*/
|
|
3327
3279
|
{
|
|
3328
|
-
VALUE
|
|
3280
|
+
VALUE rb_cBMETHOD = rb_define_class_under(rb_cNode, "BMETHOD", rb_cNode);
|
|
3329
3281
|
members = rb_ary_new();
|
|
3330
|
-
rb_cNodeSubclass[
|
|
3331
|
-
rb_iv_set(
|
|
3332
|
-
rb_iv_set(
|
|
3333
|
-
rb_define_singleton_method(
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
|
|
3337
|
-
|
|
3282
|
+
rb_cNodeSubclass[NODE_BMETHOD] = rb_cBMETHOD;
|
|
3283
|
+
rb_iv_set(rb_cBMETHOD, "__member__", members);
|
|
3284
|
+
rb_iv_set(rb_cBMETHOD, "__type__", INT2NUM(NODE_BMETHOD));
|
|
3285
|
+
rb_define_singleton_method(rb_cBMETHOD, "members", node_s_members, 0);
|
|
3286
|
+
|
|
3287
|
+
/* Document-method: cval
|
|
3288
|
+
* the Proc object passed to define_method, which contains the body
|
|
3289
|
+
* of the method
|
|
3290
|
+
*/
|
|
3291
|
+
rb_define_method(rb_cBMETHOD, "cval", node_cval, 0);
|
|
3292
|
+
rb_ary_push(members, rb_str_new2("cval"));
|
|
3338
3293
|
}
|
|
3339
3294
|
|
|
3340
|
-
/* Document-class: Node::
|
|
3341
|
-
* Represents the
|
|
3342
|
-
*
|
|
3295
|
+
/* Document-class: Node::BREAK
|
|
3296
|
+
* Represents the 'break' keyword. Causes control to be transferred
|
|
3297
|
+
* out of the current loop.
|
|
3343
3298
|
*/
|
|
3344
3299
|
{
|
|
3345
|
-
VALUE
|
|
3300
|
+
VALUE rb_cBREAK = rb_define_class_under(rb_cNode, "BREAK", rb_cNode);
|
|
3346
3301
|
members = rb_ary_new();
|
|
3347
|
-
rb_cNodeSubclass[
|
|
3348
|
-
rb_iv_set(
|
|
3349
|
-
rb_iv_set(
|
|
3350
|
-
rb_define_singleton_method(
|
|
3302
|
+
rb_cNodeSubclass[NODE_BREAK] = rb_cBREAK;
|
|
3303
|
+
rb_iv_set(rb_cBREAK, "__member__", members);
|
|
3304
|
+
rb_iv_set(rb_cBREAK, "__type__", INT2NUM(NODE_BREAK));
|
|
3305
|
+
rb_define_singleton_method(rb_cBREAK, "members", node_s_members, 0);
|
|
3306
|
+
|
|
3307
|
+
/* Document-method: stts
|
|
3308
|
+
* the value to be used as the "return" value of the loop, 0 if nil is to be used.
|
|
3309
|
+
*/
|
|
3310
|
+
rb_define_method(rb_cBREAK, "stts", node_stts, 0);
|
|
3311
|
+
rb_ary_push(members, rb_str_new2("stts"));
|
|
3312
|
+
}
|
|
3313
|
+
|
|
3314
|
+
/* Document-class: Node::CALL
|
|
3315
|
+
* Represents a method call in the form recv.mid(args).
|
|
3316
|
+
*/
|
|
3317
|
+
{
|
|
3318
|
+
VALUE rb_cCALL = rb_define_class_under(rb_cNode, "CALL", rb_cNode);
|
|
3319
|
+
members = rb_ary_new();
|
|
3320
|
+
rb_cNodeSubclass[NODE_CALL] = rb_cCALL;
|
|
3321
|
+
rb_iv_set(rb_cCALL, "__member__", members);
|
|
3322
|
+
rb_iv_set(rb_cCALL, "__type__", INT2NUM(NODE_CALL));
|
|
3323
|
+
rb_define_singleton_method(rb_cCALL, "members", node_s_members, 0);
|
|
3324
|
+
|
|
3325
|
+
/* Document-method: args
|
|
3326
|
+
* the arguments to the method
|
|
3327
|
+
*/
|
|
3328
|
+
rb_define_method(rb_cCALL, "args", node_args, 0);
|
|
3329
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
3330
|
+
|
|
3331
|
+
/* Document-method: mid
|
|
3332
|
+
* the method id
|
|
3333
|
+
*/
|
|
3334
|
+
rb_define_method(rb_cCALL, "mid", node_mid, 0);
|
|
3335
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
3336
|
+
|
|
3337
|
+
/* Document-method: recv
|
|
3338
|
+
* the receiver of the method
|
|
3339
|
+
*/
|
|
3340
|
+
rb_define_method(rb_cCALL, "recv", node_recv, 0);
|
|
3341
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
3342
|
+
}
|
|
3343
|
+
|
|
3344
|
+
/* Document-class: Node::CASE
|
|
3345
|
+
* Represents the value portion of a case/end block, e.g.:
|
|
3346
|
+
* case head
|
|
3347
|
+
* body
|
|
3348
|
+
* end
|
|
3349
|
+
* next
|
|
3350
|
+
*/
|
|
3351
|
+
{
|
|
3352
|
+
VALUE rb_cCASE = rb_define_class_under(rb_cNode, "CASE", rb_cNode);
|
|
3353
|
+
members = rb_ary_new();
|
|
3354
|
+
rb_cNodeSubclass[NODE_CASE] = rb_cCASE;
|
|
3355
|
+
rb_iv_set(rb_cCASE, "__member__", members);
|
|
3356
|
+
rb_iv_set(rb_cCASE, "__type__", INT2NUM(NODE_CASE));
|
|
3357
|
+
rb_define_singleton_method(rb_cCASE, "members", node_s_members, 0);
|
|
3358
|
+
|
|
3359
|
+
/* Document-method: head
|
|
3360
|
+
* the value to select on
|
|
3361
|
+
*/
|
|
3362
|
+
rb_define_method(rb_cCASE, "head", node_head, 0);
|
|
3363
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
3351
3364
|
|
|
3352
3365
|
/* Document-method: body
|
|
3353
|
-
*
|
|
3366
|
+
* a linked list of nodes, each node representing a when
|
|
3367
|
+
* conditional
|
|
3354
3368
|
*/
|
|
3355
|
-
rb_define_method(
|
|
3369
|
+
rb_define_method(rb_cCASE, "body", node_body, 0);
|
|
3356
3370
|
rb_ary_push(members, rb_str_new2("body"));
|
|
3371
|
+
rb_define_method(rb_cCASE, "next", node_next, 0);
|
|
3372
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
3357
3373
|
}
|
|
3358
3374
|
|
|
3359
|
-
/* Document-class: Node::
|
|
3360
|
-
*
|
|
3361
|
-
*
|
|
3362
|
-
* OP_ASGN2 node.
|
|
3375
|
+
/* Document-class: Node::CDECL
|
|
3376
|
+
* Represents constant assignment of the form:
|
|
3377
|
+
* vid = value
|
|
3363
3378
|
*/
|
|
3364
3379
|
{
|
|
3365
|
-
VALUE
|
|
3380
|
+
VALUE rb_cCDECL = rb_define_class_under(rb_cNode, "CDECL", rb_cNode);
|
|
3366
3381
|
members = rb_ary_new();
|
|
3367
|
-
rb_cNodeSubclass[
|
|
3368
|
-
rb_iv_set(
|
|
3369
|
-
rb_iv_set(
|
|
3370
|
-
rb_define_singleton_method(
|
|
3382
|
+
rb_cNodeSubclass[NODE_CDECL] = rb_cCDECL;
|
|
3383
|
+
rb_iv_set(rb_cCDECL, "__member__", members);
|
|
3384
|
+
rb_iv_set(rb_cCDECL, "__type__", INT2NUM(NODE_CDECL));
|
|
3385
|
+
rb_define_singleton_method(rb_cCDECL, "members", node_s_members, 0);
|
|
3386
|
+
|
|
3387
|
+
/* Document-method: value
|
|
3388
|
+
* the value to be assigned to the constant
|
|
3389
|
+
*/
|
|
3390
|
+
rb_define_method(rb_cCDECL, "value", node_value, 0);
|
|
3391
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
3371
3392
|
|
|
3372
3393
|
/* Document-method: vid
|
|
3373
|
-
*
|
|
3394
|
+
* the name of the constant to be assigned, all uppercase
|
|
3374
3395
|
*/
|
|
3375
|
-
rb_define_method(
|
|
3396
|
+
rb_define_method(rb_cCDECL, "vid", node_vid, 0);
|
|
3376
3397
|
rb_ary_push(members, rb_str_new2("vid"));
|
|
3398
|
+
}
|
|
3377
3399
|
|
|
3378
|
-
|
|
3379
|
-
|
|
3400
|
+
/* Document-class: Node::CFUNC
|
|
3401
|
+
* A placeholder for a function implemented in C.
|
|
3402
|
+
*/
|
|
3403
|
+
{
|
|
3404
|
+
VALUE rb_cCFUNC = rb_define_class_under(rb_cNode, "CFUNC", rb_cNode);
|
|
3405
|
+
members = rb_ary_new();
|
|
3406
|
+
rb_cNodeSubclass[NODE_CFUNC] = rb_cCFUNC;
|
|
3407
|
+
rb_iv_set(rb_cCFUNC, "__member__", members);
|
|
3408
|
+
rb_iv_set(rb_cCFUNC, "__type__", INT2NUM(NODE_CFUNC));
|
|
3409
|
+
rb_define_singleton_method(rb_cCFUNC, "members", node_s_members, 0);
|
|
3410
|
+
rb_define_method(rb_cCFUNC, "cfnc", node_cfnc, 0);
|
|
3411
|
+
rb_ary_push(members, rb_str_new2("cfnc"));
|
|
3412
|
+
rb_define_method(rb_cCFUNC, "argc", node_argc, 0);
|
|
3413
|
+
rb_ary_push(members, rb_str_new2("argc"));
|
|
3414
|
+
}
|
|
3415
|
+
|
|
3416
|
+
/* Document-class: Node::CLASS
|
|
3417
|
+
* Represents a class definition, e.g.:
|
|
3418
|
+
* class cpath
|
|
3419
|
+
* body
|
|
3420
|
+
* end
|
|
3421
|
+
*
|
|
3422
|
+
* or:
|
|
3423
|
+
* class cpath < super
|
|
3424
|
+
* body
|
|
3425
|
+
* end
|
|
3426
|
+
*
|
|
3427
|
+
* The class definition is evaluated in a new lexical scope.
|
|
3428
|
+
*
|
|
3429
|
+
* The result of the expression is the last expression evaluated in the
|
|
3430
|
+
* body.
|
|
3431
|
+
*/
|
|
3432
|
+
{
|
|
3433
|
+
VALUE rb_cCLASS = rb_define_class_under(rb_cNode, "CLASS", rb_cNode);
|
|
3434
|
+
members = rb_ary_new();
|
|
3435
|
+
rb_cNodeSubclass[NODE_CLASS] = rb_cCLASS;
|
|
3436
|
+
rb_iv_set(rb_cCLASS, "__member__", members);
|
|
3437
|
+
rb_iv_set(rb_cCLASS, "__type__", INT2NUM(NODE_CLASS));
|
|
3438
|
+
rb_define_singleton_method(rb_cCLASS, "members", node_s_members, 0);
|
|
3439
|
+
|
|
3440
|
+
/* Document-method: cpath
|
|
3441
|
+
* the name of the class to define
|
|
3380
3442
|
*/
|
|
3381
|
-
rb_define_method(
|
|
3382
|
-
rb_ary_push(members, rb_str_new2("
|
|
3443
|
+
rb_define_method(rb_cCLASS, "cpath", node_cpath, 0);
|
|
3444
|
+
rb_ary_push(members, rb_str_new2("cpath"));
|
|
3383
3445
|
|
|
3384
|
-
/* Document-method:
|
|
3385
|
-
*
|
|
3386
|
-
* be 0 (false) to indicate "logical or" or 1 (nil) to indicate
|
|
3387
|
-
* "logical and".
|
|
3446
|
+
/* Document-method: body
|
|
3447
|
+
* the body of the class definition
|
|
3388
3448
|
*/
|
|
3389
|
-
rb_define_method(
|
|
3390
|
-
rb_ary_push(members, rb_str_new2("
|
|
3449
|
+
rb_define_method(rb_cCLASS, "body", node_body, 0);
|
|
3450
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
3451
|
+
|
|
3452
|
+
/* Document-method: super
|
|
3453
|
+
* an expression returning the base class, or false if there is no
|
|
3454
|
+
* base class specified
|
|
3455
|
+
*/
|
|
3456
|
+
rb_define_method(rb_cCLASS, "super", node_super, 0);
|
|
3457
|
+
rb_ary_push(members, rb_str_new2("super"));
|
|
3391
3458
|
}
|
|
3392
3459
|
|
|
3393
3460
|
/* Document-class: Node::COLON2
|
|
@@ -3419,38 +3486,6 @@ void define_node_subclass_methods()
|
|
|
3419
3486
|
rb_ary_push(members, rb_str_new2("mid"));
|
|
3420
3487
|
}
|
|
3421
3488
|
|
|
3422
|
-
/* Document-class: Node::FBODY
|
|
3423
|
-
* A placeholder for a method alias, which can be added to a class by
|
|
3424
|
-
* using alias or alias_method:
|
|
3425
|
-
* alias old new
|
|
3426
|
-
*/
|
|
3427
|
-
{
|
|
3428
|
-
VALUE rb_cFBODY = rb_define_class_under(rb_cNode, "FBODY", rb_cNode);
|
|
3429
|
-
members = rb_ary_new();
|
|
3430
|
-
rb_cNodeSubclass[NODE_FBODY] = rb_cFBODY;
|
|
3431
|
-
rb_iv_set(rb_cFBODY, "__member__", members);
|
|
3432
|
-
rb_iv_set(rb_cFBODY, "__type__", INT2NUM(NODE_FBODY));
|
|
3433
|
-
rb_define_singleton_method(rb_cFBODY, "members", node_s_members, 0);
|
|
3434
|
-
|
|
3435
|
-
/* Document-method: head
|
|
3436
|
-
* the method body
|
|
3437
|
-
*/
|
|
3438
|
-
rb_define_method(rb_cFBODY, "head", node_head, 0);
|
|
3439
|
-
rb_ary_push(members, rb_str_new2("head"));
|
|
3440
|
-
|
|
3441
|
-
/* Document-method: orig
|
|
3442
|
-
* the origin class
|
|
3443
|
-
*/
|
|
3444
|
-
rb_define_method(rb_cFBODY, "orig", node_orig, 0);
|
|
3445
|
-
rb_ary_push(members, rb_str_new2("orig"));
|
|
3446
|
-
|
|
3447
|
-
/* Document-method: mid
|
|
3448
|
-
* the name of the method
|
|
3449
|
-
*/
|
|
3450
|
-
rb_define_method(rb_cFBODY, "mid", node_mid, 0);
|
|
3451
|
-
rb_ary_push(members, rb_str_new2("mid"));
|
|
3452
|
-
}
|
|
3453
|
-
|
|
3454
3489
|
/* Document-class: Node::COLON3
|
|
3455
3490
|
* Represents a constant lookup or method call in class Object. This
|
|
3456
3491
|
* expression has the form:
|
|
@@ -3471,670 +3506,455 @@ void define_node_subclass_methods()
|
|
|
3471
3506
|
rb_ary_push(members, rb_str_new2("mid"));
|
|
3472
3507
|
}
|
|
3473
3508
|
|
|
3474
|
-
/* Document-class: Node::
|
|
3475
|
-
* Represents
|
|
3476
|
-
*
|
|
3477
|
-
*
|
|
3478
|
-
* body
|
|
3479
|
-
* end
|
|
3480
|
-
*
|
|
3481
|
-
* A new block is created so that dynamic variables created inside the
|
|
3482
|
-
* loop do not persist once the loop has terminated.
|
|
3483
|
-
*
|
|
3484
|
-
* If the iter node is a POSTEXE node, indicates that the expression
|
|
3485
|
-
* should be evaluated when the program terminates.
|
|
3509
|
+
/* Document-class: Node::CONST
|
|
3510
|
+
* Represents a constant lookup in the current class. The current
|
|
3511
|
+
* class is the class in which the containing scope was defined. The
|
|
3512
|
+
* result of the expression is the value of the constant.
|
|
3486
3513
|
*/
|
|
3487
3514
|
{
|
|
3488
|
-
VALUE
|
|
3515
|
+
VALUE rb_cCONST = rb_define_class_under(rb_cNode, "CONST", rb_cNode);
|
|
3489
3516
|
members = rb_ary_new();
|
|
3490
|
-
rb_cNodeSubclass[
|
|
3491
|
-
rb_iv_set(
|
|
3492
|
-
rb_iv_set(
|
|
3493
|
-
rb_define_singleton_method(
|
|
3517
|
+
rb_cNodeSubclass[NODE_CONST] = rb_cCONST;
|
|
3518
|
+
rb_iv_set(rb_cCONST, "__member__", members);
|
|
3519
|
+
rb_iv_set(rb_cCONST, "__type__", INT2NUM(NODE_CONST));
|
|
3520
|
+
rb_define_singleton_method(rb_cCONST, "members", node_s_members, 0);
|
|
3494
3521
|
|
|
3495
|
-
/* Document-method:
|
|
3496
|
-
* the
|
|
3522
|
+
/* Document-method: vid
|
|
3523
|
+
* the name of the constant to look up
|
|
3497
3524
|
*/
|
|
3498
|
-
rb_define_method(
|
|
3499
|
-
rb_ary_push(members, rb_str_new2("
|
|
3525
|
+
rb_define_method(rb_cCONST, "vid", node_vid, 0);
|
|
3526
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3527
|
+
}
|
|
3500
3528
|
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
/* Document-method: var
|
|
3509
|
-
* an assignment node which assigns the next value in the sequence
|
|
3510
|
-
* to a variable, which may or may not be local. May also be a
|
|
3511
|
-
* multiple assignment.
|
|
3512
|
-
*/
|
|
3513
|
-
rb_define_method(rb_cITER, "var", node_var, 0);
|
|
3514
|
-
rb_ary_push(members, rb_str_new2("var"));
|
|
3515
|
-
}
|
|
3516
|
-
|
|
3517
|
-
/* Document-class: Node::NOT
|
|
3518
|
-
* Represents a logical negation.
|
|
3529
|
+
/* Document-class: Node::CREF
|
|
3530
|
+
* A temporary node used to store the value of ruby_cref or
|
|
3531
|
+
* ruby_top_cref and later restore it. The cref holds a reference to
|
|
3532
|
+
* the cbase, which, among other things, is used for constant and class
|
|
3533
|
+
* variable lookup.
|
|
3534
|
+
*
|
|
3535
|
+
* It should never be evaluated as an expression.
|
|
3519
3536
|
*/
|
|
3520
3537
|
{
|
|
3521
|
-
VALUE
|
|
3538
|
+
VALUE rb_cCREF = rb_define_class_under(rb_cNode, "CREF", rb_cNode);
|
|
3522
3539
|
members = rb_ary_new();
|
|
3523
|
-
rb_cNodeSubclass[
|
|
3524
|
-
rb_iv_set(
|
|
3525
|
-
rb_iv_set(
|
|
3526
|
-
rb_define_singleton_method(
|
|
3540
|
+
rb_cNodeSubclass[NODE_CREF] = rb_cCREF;
|
|
3541
|
+
rb_iv_set(rb_cCREF, "__member__", members);
|
|
3542
|
+
rb_iv_set(rb_cCREF, "__type__", INT2NUM(NODE_CREF));
|
|
3543
|
+
rb_define_singleton_method(rb_cCREF, "members", node_s_members, 0);
|
|
3527
3544
|
|
|
3528
3545
|
/* Document-method: body
|
|
3529
|
-
*
|
|
3546
|
+
* always 0 (false)
|
|
3530
3547
|
*/
|
|
3531
|
-
rb_define_method(
|
|
3548
|
+
rb_define_method(rb_cCREF, "body", node_body, 0);
|
|
3532
3549
|
rb_ary_push(members, rb_str_new2("body"));
|
|
3550
|
+
|
|
3551
|
+
/* Document-method: next
|
|
3552
|
+
* the previous value of ruby_cref or ruby_top_cref
|
|
3553
|
+
*/
|
|
3554
|
+
rb_define_method(rb_cCREF, "next", node_next, 0);
|
|
3555
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
3556
|
+
|
|
3557
|
+
/* Document-method: clss
|
|
3558
|
+
* the new class to use for the cbase.
|
|
3559
|
+
*/
|
|
3560
|
+
rb_define_method(rb_cCREF, "clss", node_clss, 0);
|
|
3561
|
+
rb_ary_push(members, rb_str_new2("clss"));
|
|
3533
3562
|
}
|
|
3534
3563
|
|
|
3535
|
-
/* Document-class: Node::
|
|
3536
|
-
* Represents
|
|
3564
|
+
/* Document-class: Node::CVAR
|
|
3565
|
+
* Represents a class variable retrieval. The result of the expression
|
|
3566
|
+
* is the value of the class variable.
|
|
3537
3567
|
*/
|
|
3538
3568
|
{
|
|
3539
|
-
VALUE
|
|
3569
|
+
VALUE rb_cCVAR = rb_define_class_under(rb_cNode, "CVAR", rb_cNode);
|
|
3540
3570
|
members = rb_ary_new();
|
|
3541
|
-
rb_cNodeSubclass[
|
|
3542
|
-
rb_iv_set(
|
|
3543
|
-
rb_iv_set(
|
|
3544
|
-
rb_define_singleton_method(
|
|
3571
|
+
rb_cNodeSubclass[NODE_CVAR] = rb_cCVAR;
|
|
3572
|
+
rb_iv_set(rb_cCVAR, "__member__", members);
|
|
3573
|
+
rb_iv_set(rb_cCVAR, "__type__", INT2NUM(NODE_CVAR));
|
|
3574
|
+
rb_define_singleton_method(rb_cCVAR, "members", node_s_members, 0);
|
|
3545
3575
|
|
|
3546
|
-
/* Document-method:
|
|
3547
|
-
* the
|
|
3576
|
+
/* Document-method: vid
|
|
3577
|
+
* the name of the class variable, with two leading '@' characters.
|
|
3548
3578
|
*/
|
|
3549
|
-
rb_define_method(
|
|
3550
|
-
rb_ary_push(members, rb_str_new2("
|
|
3579
|
+
rb_define_method(rb_cCVAR, "vid", node_vid, 0);
|
|
3580
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3551
3581
|
}
|
|
3552
3582
|
|
|
3553
|
-
/* Document-class: Node::
|
|
3554
|
-
* Represents
|
|
3583
|
+
/* Document-class: Node::CVASGN
|
|
3584
|
+
* Represents class variable assignment in a method context.
|
|
3555
3585
|
*/
|
|
3556
3586
|
{
|
|
3557
|
-
VALUE
|
|
3587
|
+
VALUE rb_cCVASGN = rb_define_class_under(rb_cNode, "CVASGN", rb_cNode);
|
|
3558
3588
|
members = rb_ary_new();
|
|
3559
|
-
rb_cNodeSubclass[
|
|
3560
|
-
rb_iv_set(
|
|
3561
|
-
rb_iv_set(
|
|
3562
|
-
rb_define_singleton_method(
|
|
3589
|
+
rb_cNodeSubclass[NODE_CVASGN] = rb_cCVASGN;
|
|
3590
|
+
rb_iv_set(rb_cCVASGN, "__member__", members);
|
|
3591
|
+
rb_iv_set(rb_cCVASGN, "__type__", INT2NUM(NODE_CVASGN));
|
|
3592
|
+
rb_define_singleton_method(rb_cCVASGN, "members", node_s_members, 0);
|
|
3593
|
+
|
|
3594
|
+
/* Document-method: value
|
|
3595
|
+
* an expression whose result is the new value of the class
|
|
3596
|
+
* variable
|
|
3597
|
+
*/
|
|
3598
|
+
rb_define_method(rb_cCVASGN, "value", node_value, 0);
|
|
3599
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
3600
|
+
|
|
3601
|
+
/* Document-method: vid
|
|
3602
|
+
* the name of the class variable to assign
|
|
3603
|
+
*/
|
|
3604
|
+
rb_define_method(rb_cCVASGN, "vid", node_vid, 0);
|
|
3605
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3563
3606
|
}
|
|
3564
3607
|
|
|
3565
|
-
/* Document-class: Node::
|
|
3566
|
-
* Represents
|
|
3608
|
+
/* Document-class: Node::CVDECL
|
|
3609
|
+
* Represents class variable assignment in a class context.
|
|
3610
|
+
*
|
|
3611
|
+
* A warning is emitted if the variable already exists.
|
|
3567
3612
|
*/
|
|
3568
3613
|
{
|
|
3569
|
-
VALUE
|
|
3614
|
+
VALUE rb_cCVDECL = rb_define_class_under(rb_cNode, "CVDECL", rb_cNode);
|
|
3570
3615
|
members = rb_ary_new();
|
|
3571
|
-
rb_cNodeSubclass[
|
|
3572
|
-
rb_iv_set(
|
|
3573
|
-
rb_iv_set(
|
|
3574
|
-
rb_define_singleton_method(
|
|
3575
|
-
|
|
3576
|
-
/* Document-method: args
|
|
3577
|
-
* the arguments to the method
|
|
3578
|
-
*/
|
|
3579
|
-
rb_define_method(rb_cCALL, "args", node_args, 0);
|
|
3580
|
-
rb_ary_push(members, rb_str_new2("args"));
|
|
3616
|
+
rb_cNodeSubclass[NODE_CVDECL] = rb_cCVDECL;
|
|
3617
|
+
rb_iv_set(rb_cCVDECL, "__member__", members);
|
|
3618
|
+
rb_iv_set(rb_cCVDECL, "__type__", INT2NUM(NODE_CVDECL));
|
|
3619
|
+
rb_define_singleton_method(rb_cCVDECL, "members", node_s_members, 0);
|
|
3581
3620
|
|
|
3582
|
-
/* Document-method:
|
|
3583
|
-
* the
|
|
3621
|
+
/* Document-method: value
|
|
3622
|
+
* an expression whose result is the new value of the class
|
|
3623
|
+
* variable
|
|
3584
3624
|
*/
|
|
3585
|
-
rb_define_method(
|
|
3586
|
-
rb_ary_push(members, rb_str_new2("
|
|
3625
|
+
rb_define_method(rb_cCVDECL, "value", node_value, 0);
|
|
3626
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
3587
3627
|
|
|
3588
|
-
/* Document-method:
|
|
3589
|
-
* the
|
|
3628
|
+
/* Document-method: vid
|
|
3629
|
+
* the name of the class variable to assign
|
|
3590
3630
|
*/
|
|
3591
|
-
rb_define_method(
|
|
3592
|
-
rb_ary_push(members, rb_str_new2("
|
|
3631
|
+
rb_define_method(rb_cCVDECL, "vid", node_vid, 0);
|
|
3632
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3593
3633
|
}
|
|
3594
3634
|
|
|
3595
|
-
/* Document-class: Node::
|
|
3596
|
-
* Represents
|
|
3597
|
-
*
|
|
3598
|
-
*
|
|
3599
|
-
*
|
|
3600
|
-
*
|
|
3601
|
-
*
|
|
3635
|
+
/* Document-class: Node::DASGN
|
|
3636
|
+
* Represents dynamic local variable assignment. Dynamic assignment
|
|
3637
|
+
* differs from static assignment in that the slots for static local
|
|
3638
|
+
* variables are allocated when the method is called, wereas slots for
|
|
3639
|
+
* dynamic variables are allocated when the variable is first assigned
|
|
3640
|
+
* to. When searching for the variable, dynamic assignment searches
|
|
3641
|
+
* backward up the stack to see if the variable exists in any previous
|
|
3642
|
+
* block in the current frame; if it does, it assigns to the slot found
|
|
3643
|
+
* in that block, otherwise it creates a new variable slot. As a
|
|
3644
|
+
* result, dynamic assignment is typically much slower than static
|
|
3645
|
+
* assignment.
|
|
3602
3646
|
*/
|
|
3603
3647
|
{
|
|
3604
|
-
VALUE
|
|
3648
|
+
VALUE rb_cDASGN = rb_define_class_under(rb_cNode, "DASGN", rb_cNode);
|
|
3605
3649
|
members = rb_ary_new();
|
|
3606
|
-
rb_cNodeSubclass[
|
|
3607
|
-
rb_iv_set(
|
|
3608
|
-
rb_iv_set(
|
|
3609
|
-
rb_define_singleton_method(
|
|
3610
|
-
|
|
3611
|
-
/* Document-method: aid
|
|
3612
|
-
* if this indicator is nonzero, ruby will check to see if the
|
|
3613
|
-
* provided expression is defined, otherwise it will assume that
|
|
3614
|
-
* the provided expression is defined.
|
|
3615
|
-
*/
|
|
3616
|
-
rb_define_method(rb_cOP_ASGN_OR, "aid", node_aid, 0);
|
|
3617
|
-
rb_ary_push(members, rb_str_new2("aid"));
|
|
3650
|
+
rb_cNodeSubclass[NODE_DASGN] = rb_cDASGN;
|
|
3651
|
+
rb_iv_set(rb_cDASGN, "__member__", members);
|
|
3652
|
+
rb_iv_set(rb_cDASGN, "__type__", INT2NUM(NODE_DASGN));
|
|
3653
|
+
rb_define_singleton_method(rb_cDASGN, "members", node_s_members, 0);
|
|
3618
3654
|
|
|
3619
3655
|
/* Document-method: value
|
|
3620
|
-
* the
|
|
3656
|
+
* the value to assign to the local variable
|
|
3621
3657
|
*/
|
|
3622
|
-
rb_define_method(
|
|
3658
|
+
rb_define_method(rb_cDASGN, "value", node_value, 0);
|
|
3623
3659
|
rb_ary_push(members, rb_str_new2("value"));
|
|
3624
3660
|
|
|
3625
|
-
/* Document-method:
|
|
3626
|
-
* the
|
|
3661
|
+
/* Document-method: vid
|
|
3662
|
+
* the name of the local variable
|
|
3627
3663
|
*/
|
|
3628
|
-
rb_define_method(
|
|
3629
|
-
rb_ary_push(members, rb_str_new2("
|
|
3664
|
+
rb_define_method(rb_cDASGN, "vid", node_vid, 0);
|
|
3665
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3630
3666
|
}
|
|
3631
3667
|
|
|
3632
|
-
/* Document-class: Node::
|
|
3633
|
-
* Represents the
|
|
3668
|
+
/* Document-class: Node::DASGN_CURR
|
|
3669
|
+
* Represents dynamic local variable assignment in the current frame.
|
|
3670
|
+
* See DASGN for a description of how dynamic assignment works.
|
|
3634
3671
|
*/
|
|
3635
3672
|
{
|
|
3636
|
-
VALUE
|
|
3673
|
+
VALUE rb_cDASGN_CURR = rb_define_class_under(rb_cNode, "DASGN_CURR", rb_cNode);
|
|
3637
3674
|
members = rb_ary_new();
|
|
3638
|
-
rb_cNodeSubclass[
|
|
3639
|
-
rb_iv_set(
|
|
3640
|
-
rb_iv_set(
|
|
3641
|
-
rb_define_singleton_method(
|
|
3675
|
+
rb_cNodeSubclass[NODE_DASGN_CURR] = rb_cDASGN_CURR;
|
|
3676
|
+
rb_iv_set(rb_cDASGN_CURR, "__member__", members);
|
|
3677
|
+
rb_iv_set(rb_cDASGN_CURR, "__type__", INT2NUM(NODE_DASGN_CURR));
|
|
3678
|
+
rb_define_singleton_method(rb_cDASGN_CURR, "members", node_s_members, 0);
|
|
3679
|
+
|
|
3680
|
+
/* Document-method: value
|
|
3681
|
+
* the value to assign to the local variable
|
|
3682
|
+
*/
|
|
3683
|
+
rb_define_method(rb_cDASGN_CURR, "value", node_value, 0);
|
|
3684
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
3685
|
+
|
|
3686
|
+
/* Document-method: vid
|
|
3687
|
+
* the name of the local variable
|
|
3688
|
+
*/
|
|
3689
|
+
rb_define_method(rb_cDASGN_CURR, "vid", node_vid, 0);
|
|
3690
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
3642
3691
|
}
|
|
3643
3692
|
|
|
3644
|
-
/* Document-class: Node::
|
|
3645
|
-
* Represents
|
|
3693
|
+
/* Document-class: Node::DEFINED
|
|
3694
|
+
* Represents an expression using the 'defined?' keyword. The result
|
|
3695
|
+
* is either nil or a string describing the expression.
|
|
3646
3696
|
*/
|
|
3647
3697
|
{
|
|
3648
|
-
VALUE
|
|
3698
|
+
VALUE rb_cDEFINED = rb_define_class_under(rb_cNode, "DEFINED", rb_cNode);
|
|
3649
3699
|
members = rb_ary_new();
|
|
3650
|
-
rb_cNodeSubclass[
|
|
3651
|
-
rb_iv_set(
|
|
3652
|
-
rb_iv_set(
|
|
3653
|
-
rb_define_singleton_method(
|
|
3654
|
-
|
|
3655
|
-
/* Document-method: args
|
|
3656
|
-
* TODO
|
|
3657
|
-
*/
|
|
3658
|
-
rb_define_method(rb_cMASGN, "args", node_args, 0);
|
|
3659
|
-
rb_ary_push(members, rb_str_new2("args"));
|
|
3700
|
+
rb_cNodeSubclass[NODE_DEFINED] = rb_cDEFINED;
|
|
3701
|
+
rb_iv_set(rb_cDEFINED, "__member__", members);
|
|
3702
|
+
rb_iv_set(rb_cDEFINED, "__type__", INT2NUM(NODE_DEFINED));
|
|
3703
|
+
rb_define_singleton_method(rb_cDEFINED, "members", node_s_members, 0);
|
|
3660
3704
|
|
|
3661
3705
|
/* Document-method: head
|
|
3662
|
-
*
|
|
3706
|
+
* the expression to inspect
|
|
3663
3707
|
*/
|
|
3664
|
-
rb_define_method(
|
|
3708
|
+
rb_define_method(rb_cDEFINED, "head", node_head, 0);
|
|
3665
3709
|
rb_ary_push(members, rb_str_new2("head"));
|
|
3666
|
-
|
|
3667
|
-
/* Document-method: value
|
|
3668
|
-
* TODO
|
|
3669
|
-
*/
|
|
3670
|
-
rb_define_method(rb_cMASGN, "value", node_value, 0);
|
|
3671
|
-
rb_ary_push(members, rb_str_new2("value"));
|
|
3672
3710
|
}
|
|
3673
3711
|
|
|
3674
|
-
/* Document-class: Node::
|
|
3675
|
-
* Represents a
|
|
3676
|
-
*
|
|
3677
|
-
*
|
|
3678
|
-
*
|
|
3712
|
+
/* Document-class: Node::DEFN
|
|
3713
|
+
* Represents a method definition, e.g.:
|
|
3714
|
+
* def mid
|
|
3715
|
+
* defn
|
|
3716
|
+
* end
|
|
3679
3717
|
*/
|
|
3680
3718
|
{
|
|
3681
|
-
VALUE
|
|
3719
|
+
VALUE rb_cDEFN = rb_define_class_under(rb_cNode, "DEFN", rb_cNode);
|
|
3682
3720
|
members = rb_ary_new();
|
|
3683
|
-
rb_cNodeSubclass[
|
|
3684
|
-
rb_iv_set(
|
|
3685
|
-
rb_iv_set(
|
|
3686
|
-
rb_define_singleton_method(
|
|
3721
|
+
rb_cNodeSubclass[NODE_DEFN] = rb_cDEFN;
|
|
3722
|
+
rb_iv_set(rb_cDEFN, "__member__", members);
|
|
3723
|
+
rb_iv_set(rb_cDEFN, "__type__", INT2NUM(NODE_DEFN));
|
|
3724
|
+
rb_define_singleton_method(rb_cDEFN, "members", node_s_members, 0);
|
|
3687
3725
|
|
|
3688
|
-
/* Document-method:
|
|
3689
|
-
*
|
|
3726
|
+
/* Document-method: defn
|
|
3727
|
+
* the body of the method definition
|
|
3690
3728
|
*/
|
|
3691
|
-
rb_define_method(
|
|
3692
|
-
rb_ary_push(members, rb_str_new2("
|
|
3729
|
+
rb_define_method(rb_cDEFN, "defn", node_defn, 0);
|
|
3730
|
+
rb_ary_push(members, rb_str_new2("defn"));
|
|
3731
|
+
|
|
3732
|
+
/* Document-method: mid
|
|
3733
|
+
* the name of the method* defn the body of the method
|
|
3734
|
+
*/
|
|
3735
|
+
rb_define_method(rb_cDEFN, "mid", node_mid, 0);
|
|
3736
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
3737
|
+
|
|
3738
|
+
/* Document-method: noex
|
|
3739
|
+
* the flags which should be used to define the method
|
|
3740
|
+
*/
|
|
3741
|
+
rb_define_method(rb_cDEFN, "noex", node_noex, 0);
|
|
3742
|
+
rb_ary_push(members, rb_str_new2("noex"));
|
|
3693
3743
|
}
|
|
3694
3744
|
|
|
3695
|
-
/* Document-class: Node::
|
|
3696
|
-
* Represents a
|
|
3697
|
-
*
|
|
3698
|
-
*
|
|
3699
|
-
* end
|
|
3700
|
-
*
|
|
3701
|
-
* This expression is equivalent to:
|
|
3702
|
-
* if /lit/ =~ $_ then
|
|
3703
|
-
* ...
|
|
3745
|
+
/* Document-class: Node::DEFS
|
|
3746
|
+
* Represents a singleton method definition, e.g.:
|
|
3747
|
+
* def recv.mid
|
|
3748
|
+
* defn
|
|
3704
3749
|
* end
|
|
3705
|
-
*
|
|
3706
|
-
* On ruby 1.8 and newer, this type of expression causes ruby to emit a
|
|
3707
|
-
* warning, unless script is running with -e.
|
|
3708
3750
|
*/
|
|
3709
3751
|
{
|
|
3710
|
-
VALUE
|
|
3752
|
+
VALUE rb_cDEFS = rb_define_class_under(rb_cNode, "DEFS", rb_cNode);
|
|
3711
3753
|
members = rb_ary_new();
|
|
3712
|
-
rb_cNodeSubclass[
|
|
3713
|
-
rb_iv_set(
|
|
3714
|
-
rb_iv_set(
|
|
3715
|
-
rb_define_singleton_method(
|
|
3754
|
+
rb_cNodeSubclass[NODE_DEFS] = rb_cDEFS;
|
|
3755
|
+
rb_iv_set(rb_cDEFS, "__member__", members);
|
|
3756
|
+
rb_iv_set(rb_cDEFS, "__type__", INT2NUM(NODE_DEFS));
|
|
3757
|
+
rb_define_singleton_method(rb_cDEFS, "members", node_s_members, 0);
|
|
3758
|
+
rb_define_method(rb_cDEFS, "defn", node_defn, 0);
|
|
3759
|
+
rb_ary_push(members, rb_str_new2("defn"));
|
|
3716
3760
|
|
|
3717
|
-
/* Document-method:
|
|
3718
|
-
* the
|
|
3761
|
+
/* Document-method: mid
|
|
3762
|
+
* the name of the method* defn the body of the method
|
|
3719
3763
|
*/
|
|
3720
|
-
rb_define_method(
|
|
3721
|
-
rb_ary_push(members, rb_str_new2("
|
|
3764
|
+
rb_define_method(rb_cDEFS, "mid", node_mid, 0);
|
|
3765
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
3722
3766
|
|
|
3723
|
-
/* Document-method:
|
|
3724
|
-
* the
|
|
3767
|
+
/* Document-method: recv
|
|
3768
|
+
* the object to whose singleton class the new method is to be added
|
|
3725
3769
|
*/
|
|
3726
|
-
rb_define_method(
|
|
3727
|
-
rb_ary_push(members, rb_str_new2("
|
|
3770
|
+
rb_define_method(rb_cDEFS, "recv", node_recv, 0);
|
|
3771
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
3728
3772
|
}
|
|
3729
3773
|
|
|
3730
|
-
/* Document-class: Node::
|
|
3731
|
-
*
|
|
3732
|
-
*
|
|
3733
|
-
*
|
|
3734
|
-
* ensure
|
|
3735
|
-
* ensr
|
|
3736
|
-
* end
|
|
3737
|
-
*
|
|
3738
|
-
* The head expression is first evaluated. After the expression is
|
|
3739
|
-
* evaluated, whether or not the expression raises an exception, the
|
|
3740
|
-
* ensr expression is evaluated.
|
|
3774
|
+
/* Document-class: Node::DMETHOD
|
|
3775
|
+
* A placeholder for a method defined using define_method where the
|
|
3776
|
+
* passed block is created from a Method object, e.g.:
|
|
3777
|
+
* define_method(:name, method(:foo))
|
|
3741
3778
|
*
|
|
3742
|
-
* See also
|
|
3779
|
+
* See also BMETHOD.
|
|
3743
3780
|
*/
|
|
3744
3781
|
{
|
|
3745
|
-
VALUE
|
|
3782
|
+
VALUE rb_cDMETHOD = rb_define_class_under(rb_cNode, "DMETHOD", rb_cNode);
|
|
3746
3783
|
members = rb_ary_new();
|
|
3747
|
-
rb_cNodeSubclass[
|
|
3748
|
-
rb_iv_set(
|
|
3749
|
-
rb_iv_set(
|
|
3750
|
-
rb_define_singleton_method(
|
|
3784
|
+
rb_cNodeSubclass[NODE_DMETHOD] = rb_cDMETHOD;
|
|
3785
|
+
rb_iv_set(rb_cDMETHOD, "__member__", members);
|
|
3786
|
+
rb_iv_set(rb_cDMETHOD, "__type__", INT2NUM(NODE_DMETHOD));
|
|
3787
|
+
rb_define_singleton_method(rb_cDMETHOD, "members", node_s_members, 0);
|
|
3751
3788
|
|
|
3752
|
-
/* Document-method:
|
|
3753
|
-
* the
|
|
3789
|
+
/* Document-method: cval
|
|
3790
|
+
* the Method object passed to define_method, which contains the
|
|
3791
|
+
* body of the method
|
|
3754
3792
|
*/
|
|
3755
|
-
rb_define_method(
|
|
3756
|
-
rb_ary_push(members, rb_str_new2("
|
|
3793
|
+
rb_define_method(rb_cDMETHOD, "cval", node_cval, 0);
|
|
3794
|
+
rb_ary_push(members, rb_str_new2("cval"));
|
|
3795
|
+
}
|
|
3757
3796
|
|
|
3758
|
-
|
|
3759
|
-
|
|
3797
|
+
/* Document-class: Node::DOT2
|
|
3798
|
+
* Represents a range created with the form:
|
|
3799
|
+
* beg..end
|
|
3800
|
+
* Creates a range which does not exclude the range end.
|
|
3801
|
+
*/
|
|
3802
|
+
{
|
|
3803
|
+
VALUE rb_cDOT2 = rb_define_class_under(rb_cNode, "DOT2", rb_cNode);
|
|
3804
|
+
members = rb_ary_new();
|
|
3805
|
+
rb_cNodeSubclass[NODE_DOT2] = rb_cDOT2;
|
|
3806
|
+
rb_iv_set(rb_cDOT2, "__member__", members);
|
|
3807
|
+
rb_iv_set(rb_cDOT2, "__type__", INT2NUM(NODE_DOT2));
|
|
3808
|
+
rb_define_singleton_method(rb_cDOT2, "members", node_s_members, 0);
|
|
3809
|
+
|
|
3810
|
+
/* Document-method: beg
|
|
3811
|
+
* the beginning of the range
|
|
3760
3812
|
*/
|
|
3761
|
-
rb_define_method(
|
|
3762
|
-
rb_ary_push(members, rb_str_new2("
|
|
3813
|
+
rb_define_method(rb_cDOT2, "beg", node_beg, 0);
|
|
3814
|
+
rb_ary_push(members, rb_str_new2("beg"));
|
|
3815
|
+
|
|
3816
|
+
/* Document-method: end
|
|
3817
|
+
* the end of the range
|
|
3818
|
+
*/
|
|
3819
|
+
rb_define_method(rb_cDOT2, "end", node_end, 0);
|
|
3820
|
+
rb_ary_push(members, rb_str_new2("end"));
|
|
3821
|
+
rb_define_method(rb_cDOT2, "state", node_state, 0);
|
|
3822
|
+
rb_ary_push(members, rb_str_new2("state"));
|
|
3763
3823
|
}
|
|
3764
3824
|
|
|
3765
|
-
/* Document-class: Node::
|
|
3766
|
-
* Represents
|
|
3767
|
-
*
|
|
3825
|
+
/* Document-class: Node::DOT3
|
|
3826
|
+
* Represents a range created with the form:
|
|
3827
|
+
* beg...end
|
|
3828
|
+
* Creates a range which excludes the range end.
|
|
3768
3829
|
*/
|
|
3769
3830
|
{
|
|
3770
|
-
VALUE
|
|
3831
|
+
VALUE rb_cDOT3 = rb_define_class_under(rb_cNode, "DOT3", rb_cNode);
|
|
3771
3832
|
members = rb_ary_new();
|
|
3772
|
-
rb_cNodeSubclass[
|
|
3773
|
-
rb_iv_set(
|
|
3774
|
-
rb_iv_set(
|
|
3775
|
-
rb_define_singleton_method(
|
|
3833
|
+
rb_cNodeSubclass[NODE_DOT3] = rb_cDOT3;
|
|
3834
|
+
rb_iv_set(rb_cDOT3, "__member__", members);
|
|
3835
|
+
rb_iv_set(rb_cDOT3, "__type__", INT2NUM(NODE_DOT3));
|
|
3836
|
+
rb_define_singleton_method(rb_cDOT3, "members", node_s_members, 0);
|
|
3776
3837
|
|
|
3777
|
-
/* Document-method:
|
|
3778
|
-
* the
|
|
3838
|
+
/* Document-method: beg
|
|
3839
|
+
* the beginning of the range
|
|
3779
3840
|
*/
|
|
3780
|
-
rb_define_method(
|
|
3781
|
-
rb_ary_push(members, rb_str_new2("
|
|
3841
|
+
rb_define_method(rb_cDOT3, "beg", node_beg, 0);
|
|
3842
|
+
rb_ary_push(members, rb_str_new2("beg"));
|
|
3782
3843
|
|
|
3783
|
-
/* Document-method:
|
|
3784
|
-
* the
|
|
3844
|
+
/* Document-method: end
|
|
3845
|
+
* the end of the range
|
|
3785
3846
|
*/
|
|
3786
|
-
rb_define_method(
|
|
3787
|
-
rb_ary_push(members, rb_str_new2("
|
|
3847
|
+
rb_define_method(rb_cDOT3, "end", node_end, 0);
|
|
3848
|
+
rb_ary_push(members, rb_str_new2("end"));
|
|
3849
|
+
rb_define_method(rb_cDOT3, "state", node_state, 0);
|
|
3850
|
+
rb_ary_push(members, rb_str_new2("state"));
|
|
3788
3851
|
}
|
|
3789
3852
|
|
|
3790
|
-
/* Document-class: Node::
|
|
3791
|
-
* Represents a
|
|
3792
|
-
*
|
|
3793
|
-
*
|
|
3794
|
-
*
|
|
3795
|
-
*
|
|
3796
|
-
*
|
|
3797
|
-
* Each node found should evalate to an string, and each resulting
|
|
3798
|
-
* string is appended onto the original string.
|
|
3799
|
-
*
|
|
3800
|
-
* The resulting string is executed in a subshell and the output from
|
|
3801
|
-
* its stdout stored in a string, which becomes the result of the
|
|
3802
|
-
* expression. Interpolation is represented with the EVSTR node.
|
|
3853
|
+
/* Document-class: Node::DREGX
|
|
3854
|
+
* Represents a regular expresion with interpolation. The node is
|
|
3855
|
+
* evaluated by duplicating the regex stored in the 'lit' element, then
|
|
3856
|
+
* iterating over the nodes stored in the 'next' element. Each node
|
|
3857
|
+
* found should evaluate to a string, and each resulting string is
|
|
3858
|
+
* appended onto the original string. Interpolation is represented
|
|
3859
|
+
* with the EVSTR node.
|
|
3803
3860
|
*/
|
|
3804
3861
|
{
|
|
3805
|
-
VALUE
|
|
3862
|
+
VALUE rb_cDREGX = rb_define_class_under(rb_cNode, "DREGX", rb_cNode);
|
|
3806
3863
|
members = rb_ary_new();
|
|
3807
|
-
rb_cNodeSubclass[
|
|
3808
|
-
rb_iv_set(
|
|
3809
|
-
rb_iv_set(
|
|
3810
|
-
rb_define_singleton_method(
|
|
3864
|
+
rb_cNodeSubclass[NODE_DREGX] = rb_cDREGX;
|
|
3865
|
+
rb_iv_set(rb_cDREGX, "__member__", members);
|
|
3866
|
+
rb_iv_set(rb_cDREGX, "__type__", INT2NUM(NODE_DREGX));
|
|
3867
|
+
rb_define_singleton_method(rb_cDREGX, "members", node_s_members, 0);
|
|
3811
3868
|
|
|
3812
3869
|
/* Document-method: lit
|
|
3813
3870
|
* a string
|
|
3814
3871
|
*/
|
|
3815
|
-
rb_define_method(
|
|
3872
|
+
rb_define_method(rb_cDREGX, "lit", node_lit, 0);
|
|
3816
3873
|
rb_ary_push(members, rb_str_new2("lit"));
|
|
3817
3874
|
|
|
3875
|
+
/* Document-method: cflag
|
|
3876
|
+
* a bitfield containing the options used in the regular
|
|
3877
|
+
* expression. Valid values include:
|
|
3878
|
+
* * RE_OPTION_IGNORECASE
|
|
3879
|
+
* * RE_OPTION_EXTENDED
|
|
3880
|
+
* * RE_OPTION_MULTILINE
|
|
3881
|
+
* * RE_OPTION_SINGLELINE
|
|
3882
|
+
* * RE_OPTION_LONGEST
|
|
3883
|
+
* * RE_MAY_IGNORECASE
|
|
3884
|
+
* * RE_OPTIMIZE_ANCHOR
|
|
3885
|
+
* * RE_OPTIMIZE_EXACTN
|
|
3886
|
+
* * RE_OPTIMIZE_NO_BM
|
|
3887
|
+
* * RE_OPTIMIZE_BMATCH
|
|
3888
|
+
*/
|
|
3889
|
+
rb_define_method(rb_cDREGX, "cflag", node_cflag, 0);
|
|
3890
|
+
rb_ary_push(members, rb_str_new2("cflag"));
|
|
3891
|
+
|
|
3818
3892
|
/* Document-method: next
|
|
3819
3893
|
* a list of expressions to be appended onto the string
|
|
3820
3894
|
*/
|
|
3821
|
-
rb_define_method(
|
|
3895
|
+
rb_define_method(rb_cDREGX, "next", node_next, 0);
|
|
3822
3896
|
rb_ary_push(members, rb_str_new2("next"));
|
|
3823
3897
|
}
|
|
3824
3898
|
|
|
3825
|
-
/* Document-class: Node::
|
|
3826
|
-
* Represents a
|
|
3827
|
-
*
|
|
3899
|
+
/* Document-class: Node::DREGX_ONCE
|
|
3900
|
+
* Represents a regular expression with interpolation with the 'once'
|
|
3901
|
+
* flag set. The regular expression is only interpolated the first
|
|
3902
|
+
* time it is encountered.
|
|
3828
3903
|
*/
|
|
3829
3904
|
{
|
|
3830
|
-
VALUE
|
|
3905
|
+
VALUE rb_cDREGX_ONCE = rb_define_class_under(rb_cNode, "DREGX_ONCE", rb_cNode);
|
|
3831
3906
|
members = rb_ary_new();
|
|
3832
|
-
rb_cNodeSubclass[
|
|
3833
|
-
rb_iv_set(
|
|
3834
|
-
rb_iv_set(
|
|
3835
|
-
rb_define_singleton_method(
|
|
3907
|
+
rb_cNodeSubclass[NODE_DREGX_ONCE] = rb_cDREGX_ONCE;
|
|
3908
|
+
rb_iv_set(rb_cDREGX_ONCE, "__member__", members);
|
|
3909
|
+
rb_iv_set(rb_cDREGX_ONCE, "__type__", INT2NUM(NODE_DREGX_ONCE));
|
|
3910
|
+
rb_define_singleton_method(rb_cDREGX_ONCE, "members", node_s_members, 0);
|
|
3836
3911
|
|
|
3837
|
-
/* Document-method:
|
|
3838
|
-
*
|
|
3912
|
+
/* Document-method: lit
|
|
3913
|
+
* a string
|
|
3839
3914
|
*/
|
|
3840
|
-
rb_define_method(
|
|
3841
|
-
rb_ary_push(members, rb_str_new2("
|
|
3842
|
-
}
|
|
3843
|
-
|
|
3844
|
-
/* Document-class: Node::ZARRAY
|
|
3845
|
-
* Represents an array of zero elements. Evalation of this node
|
|
3846
|
-
* creates a new array of length zero.
|
|
3847
|
-
*/
|
|
3848
|
-
{
|
|
3849
|
-
VALUE rb_cZARRAY = rb_define_class_under(rb_cNode, "ZARRAY", rb_cNode);
|
|
3850
|
-
members = rb_ary_new();
|
|
3851
|
-
rb_cNodeSubclass[NODE_ZARRAY] = rb_cZARRAY;
|
|
3852
|
-
rb_iv_set(rb_cZARRAY, "__member__", members);
|
|
3853
|
-
rb_iv_set(rb_cZARRAY, "__type__", INT2NUM(NODE_ZARRAY));
|
|
3854
|
-
rb_define_singleton_method(rb_cZARRAY, "members", node_s_members, 0);
|
|
3855
|
-
}
|
|
3856
|
-
|
|
3857
|
-
/* Document-class: Node::BLOCK_ARG
|
|
3858
|
-
* Represents a block argument in a method definition, e.g.:
|
|
3859
|
-
* def foo(&arg)
|
|
3860
|
-
* end
|
|
3861
|
-
*/
|
|
3862
|
-
{
|
|
3863
|
-
VALUE rb_cBLOCK_ARG = rb_define_class_under(rb_cNode, "BLOCK_ARG", rb_cNode);
|
|
3864
|
-
members = rb_ary_new();
|
|
3865
|
-
rb_cNodeSubclass[NODE_BLOCK_ARG] = rb_cBLOCK_ARG;
|
|
3866
|
-
rb_iv_set(rb_cBLOCK_ARG, "__member__", members);
|
|
3867
|
-
rb_iv_set(rb_cBLOCK_ARG, "__type__", INT2NUM(NODE_BLOCK_ARG));
|
|
3868
|
-
rb_define_singleton_method(rb_cBLOCK_ARG, "members", node_s_members, 0);
|
|
3869
|
-
|
|
3870
|
-
/* Document-method: cnt
|
|
3871
|
-
* the index into the local variable table of the name of the block
|
|
3872
|
-
* argument, not including the implicit variables.
|
|
3873
|
-
*/
|
|
3874
|
-
rb_define_method(rb_cBLOCK_ARG, "cnt", node_cnt, 0);
|
|
3875
|
-
rb_ary_push(members, rb_str_new2("cnt"));
|
|
3876
|
-
}
|
|
3877
|
-
|
|
3878
|
-
/* Document-class: Node::AND
|
|
3879
|
-
* Represents a logical 'and' of the form:
|
|
3880
|
-
* first && second
|
|
3881
|
-
* The expression will short-circuit and yield the result of the left
|
|
3882
|
-
* hand side if it is false or nil, else it will evaluate the right
|
|
3883
|
-
* hand side and use it as the result of the expression.
|
|
3884
|
-
*/
|
|
3885
|
-
{
|
|
3886
|
-
VALUE rb_cAND = rb_define_class_under(rb_cNode, "AND", rb_cNode);
|
|
3887
|
-
members = rb_ary_new();
|
|
3888
|
-
rb_cNodeSubclass[NODE_AND] = rb_cAND;
|
|
3889
|
-
rb_iv_set(rb_cAND, "__member__", members);
|
|
3890
|
-
rb_iv_set(rb_cAND, "__type__", INT2NUM(NODE_AND));
|
|
3891
|
-
rb_define_singleton_method(rb_cAND, "members", node_s_members, 0);
|
|
3892
|
-
|
|
3893
|
-
/* Document-method: first
|
|
3894
|
-
* the expression on the left hand side
|
|
3895
|
-
*/
|
|
3896
|
-
rb_define_method(rb_cAND, "first", node_1st, 0);
|
|
3897
|
-
rb_ary_push(members, rb_str_new2("first"));
|
|
3898
|
-
|
|
3899
|
-
/* Document-method: second
|
|
3900
|
-
* the expression on the right hand side
|
|
3901
|
-
*/
|
|
3902
|
-
rb_define_method(rb_cAND, "second", node_2nd, 0);
|
|
3903
|
-
rb_ary_push(members, rb_str_new2("second"));
|
|
3904
|
-
}
|
|
3905
|
-
|
|
3906
|
-
/* Document-class: Node::SCLASS
|
|
3907
|
-
* Represents the body of a singleton class definition, e.g.:
|
|
3908
|
-
* class << recv
|
|
3909
|
-
* body
|
|
3910
|
-
* end
|
|
3911
|
-
*
|
|
3912
|
-
* The class definition is evaluated in a new lexical scope.
|
|
3913
|
-
*
|
|
3914
|
-
* The result of the expression is the last expression evaluated in the
|
|
3915
|
-
* body.
|
|
3916
|
-
*/
|
|
3917
|
-
{
|
|
3918
|
-
VALUE rb_cSCLASS = rb_define_class_under(rb_cNode, "SCLASS", rb_cNode);
|
|
3919
|
-
members = rb_ary_new();
|
|
3920
|
-
rb_cNodeSubclass[NODE_SCLASS] = rb_cSCLASS;
|
|
3921
|
-
rb_iv_set(rb_cSCLASS, "__member__", members);
|
|
3922
|
-
rb_iv_set(rb_cSCLASS, "__type__", INT2NUM(NODE_SCLASS));
|
|
3923
|
-
rb_define_singleton_method(rb_cSCLASS, "members", node_s_members, 0);
|
|
3924
|
-
|
|
3925
|
-
/* Document-method: body
|
|
3926
|
-
* the body of the class definition
|
|
3927
|
-
*/
|
|
3928
|
-
rb_define_method(rb_cSCLASS, "body", node_body, 0);
|
|
3929
|
-
rb_ary_push(members, rb_str_new2("body"));
|
|
3930
|
-
|
|
3931
|
-
/* Document-method: recv
|
|
3932
|
-
* the object whose singleton class is to be modified
|
|
3933
|
-
*/
|
|
3934
|
-
rb_define_method(rb_cSCLASS, "recv", node_recv, 0);
|
|
3935
|
-
rb_ary_push(members, rb_str_new2("recv"));
|
|
3936
|
-
}
|
|
3937
|
-
|
|
3938
|
-
/* Document-class: Node::DEFINED
|
|
3939
|
-
* Represents an expression using the 'defined?' keyword. The result
|
|
3940
|
-
* is either nil or a string describing the expression.
|
|
3941
|
-
*/
|
|
3942
|
-
{
|
|
3943
|
-
VALUE rb_cDEFINED = rb_define_class_under(rb_cNode, "DEFINED", rb_cNode);
|
|
3944
|
-
members = rb_ary_new();
|
|
3945
|
-
rb_cNodeSubclass[NODE_DEFINED] = rb_cDEFINED;
|
|
3946
|
-
rb_iv_set(rb_cDEFINED, "__member__", members);
|
|
3947
|
-
rb_iv_set(rb_cDEFINED, "__type__", INT2NUM(NODE_DEFINED));
|
|
3948
|
-
rb_define_singleton_method(rb_cDEFINED, "members", node_s_members, 0);
|
|
3949
|
-
|
|
3950
|
-
/* Document-method: head
|
|
3951
|
-
* the expression to inspect
|
|
3952
|
-
*/
|
|
3953
|
-
rb_define_method(rb_cDEFINED, "head", node_head, 0);
|
|
3954
|
-
rb_ary_push(members, rb_str_new2("head"));
|
|
3955
|
-
}
|
|
3956
|
-
|
|
3957
|
-
/* Document-class: Node::VALIAS
|
|
3958
|
-
* Represents an alias expression of the form:
|
|
3959
|
-
* alias 1st 2nd
|
|
3960
|
-
* where 2nd is the name of a variable and 1st is the name of its new
|
|
3961
|
-
* alias.
|
|
3962
|
-
*/
|
|
3963
|
-
{
|
|
3964
|
-
VALUE rb_cVALIAS = rb_define_class_under(rb_cNode, "VALIAS", rb_cNode);
|
|
3965
|
-
members = rb_ary_new();
|
|
3966
|
-
rb_cNodeSubclass[NODE_VALIAS] = rb_cVALIAS;
|
|
3967
|
-
rb_iv_set(rb_cVALIAS, "__member__", members);
|
|
3968
|
-
rb_iv_set(rb_cVALIAS, "__type__", INT2NUM(NODE_VALIAS));
|
|
3969
|
-
rb_define_singleton_method(rb_cVALIAS, "members", node_s_members, 0);
|
|
3970
|
-
rb_define_method(rb_cVALIAS, "first", node_1st, 0);
|
|
3971
|
-
rb_ary_push(members, rb_str_new2("first"));
|
|
3972
|
-
rb_define_method(rb_cVALIAS, "second", node_2nd, 0);
|
|
3973
|
-
rb_ary_push(members, rb_str_new2("second"));
|
|
3974
|
-
}
|
|
3975
|
-
|
|
3976
|
-
/* Document-class: Node::REDO
|
|
3977
|
-
* Represents the 'redo' keyword. Causes control to be transferred to
|
|
3978
|
-
* the beginning of the loop. The loop assignment is not repeated.
|
|
3979
|
-
*/
|
|
3980
|
-
{
|
|
3981
|
-
VALUE rb_cREDO = rb_define_class_under(rb_cNode, "REDO", rb_cNode);
|
|
3982
|
-
members = rb_ary_new();
|
|
3983
|
-
rb_cNodeSubclass[NODE_REDO] = rb_cREDO;
|
|
3984
|
-
rb_iv_set(rb_cREDO, "__member__", members);
|
|
3985
|
-
rb_iv_set(rb_cREDO, "__type__", INT2NUM(NODE_REDO));
|
|
3986
|
-
rb_define_singleton_method(rb_cREDO, "members", node_s_members, 0);
|
|
3987
|
-
}
|
|
3988
|
-
|
|
3989
|
-
/* Document-class: Node::BLOCK_PASS
|
|
3990
|
-
* Represents an object being passed to a method as a block, e.g.:
|
|
3991
|
-
* foo(&bar)
|
|
3992
|
-
*
|
|
3993
|
-
* The body node is first evaluates to get an object, then #to_proc to
|
|
3994
|
-
* convert it into a proc if necessary. The iter node is then
|
|
3995
|
-
* evaluated to call a method, passing the proc as a block parameter to
|
|
3996
|
-
* the method.
|
|
3997
|
-
*/
|
|
3998
|
-
{
|
|
3999
|
-
VALUE rb_cBLOCK_PASS = rb_define_class_under(rb_cNode, "BLOCK_PASS", rb_cNode);
|
|
4000
|
-
members = rb_ary_new();
|
|
4001
|
-
rb_cNodeSubclass[NODE_BLOCK_PASS] = rb_cBLOCK_PASS;
|
|
4002
|
-
rb_iv_set(rb_cBLOCK_PASS, "__member__", members);
|
|
4003
|
-
rb_iv_set(rb_cBLOCK_PASS, "__type__", INT2NUM(NODE_BLOCK_PASS));
|
|
4004
|
-
rb_define_singleton_method(rb_cBLOCK_PASS, "members", node_s_members, 0);
|
|
4005
|
-
|
|
4006
|
-
/* Document-method: body
|
|
4007
|
-
* the object to pass as a block
|
|
4008
|
-
*/
|
|
4009
|
-
rb_define_method(rb_cBLOCK_PASS, "body", node_body, 0);
|
|
4010
|
-
rb_ary_push(members, rb_str_new2("body"));
|
|
4011
|
-
|
|
4012
|
-
/* Document-method: iter
|
|
4013
|
-
* an expression which calls a method
|
|
4014
|
-
*/
|
|
4015
|
-
rb_define_method(rb_cBLOCK_PASS, "iter", node_iter, 0);
|
|
4016
|
-
rb_ary_push(members, rb_str_new2("iter"));
|
|
4017
|
-
}
|
|
4018
|
-
|
|
4019
|
-
/* Document-class: Node::DREGX
|
|
4020
|
-
* Represents a regular expresion with interpolation. The node is
|
|
4021
|
-
* evaluated by duplicating the regex stored in the 'lit' element, then
|
|
4022
|
-
* iterating over the nodes stored in the 'next' element. Each node
|
|
4023
|
-
* found should evaluate to a string, and each resulting string is
|
|
4024
|
-
* appended onto the original string. Interpolation is represented
|
|
4025
|
-
* with the EVSTR node.
|
|
4026
|
-
*/
|
|
4027
|
-
{
|
|
4028
|
-
VALUE rb_cDREGX = rb_define_class_under(rb_cNode, "DREGX", rb_cNode);
|
|
4029
|
-
members = rb_ary_new();
|
|
4030
|
-
rb_cNodeSubclass[NODE_DREGX] = rb_cDREGX;
|
|
4031
|
-
rb_iv_set(rb_cDREGX, "__member__", members);
|
|
4032
|
-
rb_iv_set(rb_cDREGX, "__type__", INT2NUM(NODE_DREGX));
|
|
4033
|
-
rb_define_singleton_method(rb_cDREGX, "members", node_s_members, 0);
|
|
4034
|
-
|
|
4035
|
-
/* Document-method: lit
|
|
4036
|
-
* a string
|
|
4037
|
-
*/
|
|
4038
|
-
rb_define_method(rb_cDREGX, "lit", node_lit, 0);
|
|
4039
|
-
rb_ary_push(members, rb_str_new2("lit"));
|
|
3915
|
+
rb_define_method(rb_cDREGX_ONCE, "lit", node_lit, 0);
|
|
3916
|
+
rb_ary_push(members, rb_str_new2("lit"));
|
|
4040
3917
|
|
|
4041
3918
|
/* Document-method: cflag
|
|
4042
3919
|
* a bitfield containing the options used in the regular
|
|
4043
|
-
* expression.
|
|
4044
|
-
* * RE_OPTION_IGNORECASE
|
|
4045
|
-
* * RE_OPTION_EXTENDED
|
|
4046
|
-
* * RE_OPTION_MULTILINE
|
|
4047
|
-
* * RE_OPTION_SINGLELINE
|
|
4048
|
-
* * RE_OPTION_LONGEST
|
|
4049
|
-
* * RE_MAY_IGNORECASE
|
|
4050
|
-
* * RE_OPTIMIZE_ANCHOR
|
|
4051
|
-
* * RE_OPTIMIZE_EXACTN
|
|
4052
|
-
* * RE_OPTIMIZE_NO_BM
|
|
4053
|
-
* * RE_OPTIMIZE_BMATCH
|
|
3920
|
+
* expression. See DREGX for a list of valid values.
|
|
4054
3921
|
*/
|
|
4055
|
-
rb_define_method(
|
|
3922
|
+
rb_define_method(rb_cDREGX_ONCE, "cflag", node_cflag, 0);
|
|
4056
3923
|
rb_ary_push(members, rb_str_new2("cflag"));
|
|
4057
3924
|
|
|
4058
3925
|
/* Document-method: next
|
|
4059
3926
|
* a list of expressions to be appended onto the string
|
|
4060
3927
|
*/
|
|
4061
|
-
rb_define_method(
|
|
3928
|
+
rb_define_method(rb_cDREGX_ONCE, "next", node_next, 0);
|
|
4062
3929
|
rb_ary_push(members, rb_str_new2("next"));
|
|
4063
3930
|
}
|
|
4064
3931
|
|
|
4065
|
-
/* Document-class: Node::
|
|
4066
|
-
* Represents a
|
|
4067
|
-
*
|
|
4068
|
-
*
|
|
4069
|
-
*
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
VALUE rb_cDEFN = rb_define_class_under(rb_cNode, "DEFN", rb_cNode);
|
|
4073
|
-
members = rb_ary_new();
|
|
4074
|
-
rb_cNodeSubclass[NODE_DEFN] = rb_cDEFN;
|
|
4075
|
-
rb_iv_set(rb_cDEFN, "__member__", members);
|
|
4076
|
-
rb_iv_set(rb_cDEFN, "__type__", INT2NUM(NODE_DEFN));
|
|
4077
|
-
rb_define_singleton_method(rb_cDEFN, "members", node_s_members, 0);
|
|
4078
|
-
|
|
4079
|
-
/* Document-method: mid
|
|
4080
|
-
* the name of the method* defn the body of the method
|
|
4081
|
-
*/
|
|
4082
|
-
rb_define_method(rb_cDEFN, "mid", node_mid, 0);
|
|
4083
|
-
rb_ary_push(members, rb_str_new2("mid"));
|
|
4084
|
-
|
|
4085
|
-
/* Document-method: defn
|
|
4086
|
-
* the body of the method definition
|
|
4087
|
-
*/
|
|
4088
|
-
rb_define_method(rb_cDEFN, "defn", node_defn, 0);
|
|
4089
|
-
rb_ary_push(members, rb_str_new2("defn"));
|
|
4090
|
-
|
|
4091
|
-
/* Document-method: noex
|
|
4092
|
-
* the flags which should be used to define the method
|
|
4093
|
-
*/
|
|
4094
|
-
rb_define_method(rb_cDEFN, "noex", node_noex, 0);
|
|
4095
|
-
rb_ary_push(members, rb_str_new2("noex"));
|
|
4096
|
-
}
|
|
4097
|
-
|
|
4098
|
-
/* Document-class: Node::SCOPE
|
|
4099
|
-
* Represents a lexical scope.
|
|
4100
|
-
*
|
|
4101
|
-
* A new scope is created when a method is invoked. The scope node
|
|
4102
|
-
* holds information about local variables and arguments to the method.
|
|
4103
|
-
* The first two variables in the local variable table are the implicit
|
|
4104
|
-
* variables $_ and $~.
|
|
4105
|
-
*
|
|
4106
|
-
* The next variables listed in the local variable table are the
|
|
4107
|
-
* arguments to the method. More information about the arguments to
|
|
4108
|
-
* the method are stored in the ARGS node, which will either be the
|
|
4109
|
-
* first node in the scope or the first node in the BLOCK held by the
|
|
4110
|
-
* scope.
|
|
3932
|
+
/* Document-class: Node::DSTR
|
|
3933
|
+
* Represents a string object with interpolation. The node is
|
|
3934
|
+
* evaluated by duplicating the string stored in the 'lit' element,
|
|
3935
|
+
* then iterating over the nodes stored in the 'next' element. Each
|
|
3936
|
+
* node found should evalate to a string, and each resulting string is
|
|
3937
|
+
* appended onto the regex. Interpolation is represented with the
|
|
3938
|
+
* EVSTR node.
|
|
4111
3939
|
*/
|
|
4112
3940
|
{
|
|
4113
|
-
VALUE
|
|
3941
|
+
VALUE rb_cDSTR = rb_define_class_under(rb_cNode, "DSTR", rb_cNode);
|
|
4114
3942
|
members = rb_ary_new();
|
|
4115
|
-
rb_cNodeSubclass[
|
|
4116
|
-
rb_iv_set(
|
|
4117
|
-
rb_iv_set(
|
|
4118
|
-
rb_define_singleton_method(
|
|
4119
|
-
|
|
4120
|
-
/* Document-method: tbl
|
|
4121
|
-
* the names of the local variables* next the first expression in
|
|
4122
|
-
* the scope
|
|
4123
|
-
*/
|
|
4124
|
-
rb_define_method(rb_cSCOPE, "tbl", node_tbl, 0);
|
|
4125
|
-
rb_ary_push(members, rb_str_new2("tbl"));
|
|
3943
|
+
rb_cNodeSubclass[NODE_DSTR] = rb_cDSTR;
|
|
3944
|
+
rb_iv_set(rb_cDSTR, "__member__", members);
|
|
3945
|
+
rb_iv_set(rb_cDSTR, "__type__", INT2NUM(NODE_DSTR));
|
|
3946
|
+
rb_define_singleton_method(rb_cDSTR, "members", node_s_members, 0);
|
|
4126
3947
|
|
|
4127
|
-
/* Document-method:
|
|
4128
|
-
*
|
|
4129
|
-
* in this scope
|
|
3948
|
+
/* Document-method: lit
|
|
3949
|
+
* a string
|
|
4130
3950
|
*/
|
|
4131
|
-
rb_define_method(
|
|
4132
|
-
rb_ary_push(members, rb_str_new2("
|
|
3951
|
+
rb_define_method(rb_cDSTR, "lit", node_lit, 0);
|
|
3952
|
+
rb_ary_push(members, rb_str_new2("lit"));
|
|
4133
3953
|
|
|
4134
3954
|
/* Document-method: next
|
|
4135
|
-
*
|
|
3955
|
+
* a list of expressions to be appended onto the string
|
|
4136
3956
|
*/
|
|
4137
|
-
rb_define_method(
|
|
3957
|
+
rb_define_method(rb_cDSTR, "next", node_next, 0);
|
|
4138
3958
|
rb_ary_push(members, rb_str_new2("next"));
|
|
4139
3959
|
}
|
|
4140
3960
|
|
|
@@ -4162,762 +3982,808 @@ void define_node_subclass_methods()
|
|
|
4162
3982
|
rb_ary_push(members, rb_str_new2("next"));
|
|
4163
3983
|
}
|
|
4164
3984
|
|
|
4165
|
-
/* Document-class: Node::
|
|
4166
|
-
*
|
|
4167
|
-
* define_method(:foo) {
|
|
4168
|
-
* ...
|
|
4169
|
-
* }
|
|
4170
|
-
*
|
|
4171
|
-
* See also DMETHOD.
|
|
3985
|
+
/* Document-class: Node::DVAR
|
|
3986
|
+
* Represents dynamic local variable retrieval. See also DASGN.
|
|
4172
3987
|
*/
|
|
4173
3988
|
{
|
|
4174
|
-
VALUE
|
|
3989
|
+
VALUE rb_cDVAR = rb_define_class_under(rb_cNode, "DVAR", rb_cNode);
|
|
4175
3990
|
members = rb_ary_new();
|
|
4176
|
-
rb_cNodeSubclass[
|
|
4177
|
-
rb_iv_set(
|
|
4178
|
-
rb_iv_set(
|
|
4179
|
-
rb_define_singleton_method(
|
|
3991
|
+
rb_cNodeSubclass[NODE_DVAR] = rb_cDVAR;
|
|
3992
|
+
rb_iv_set(rb_cDVAR, "__member__", members);
|
|
3993
|
+
rb_iv_set(rb_cDVAR, "__type__", INT2NUM(NODE_DVAR));
|
|
3994
|
+
rb_define_singleton_method(rb_cDVAR, "members", node_s_members, 0);
|
|
4180
3995
|
|
|
4181
|
-
/* Document-method:
|
|
4182
|
-
* the
|
|
4183
|
-
* of the method
|
|
3996
|
+
/* Document-method: vid
|
|
3997
|
+
* the name of the local variable to retrieve.
|
|
4184
3998
|
*/
|
|
4185
|
-
rb_define_method(
|
|
4186
|
-
rb_ary_push(members, rb_str_new2("
|
|
3999
|
+
rb_define_method(rb_cDVAR, "vid", node_vid, 0);
|
|
4000
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
4187
4001
|
}
|
|
4188
4002
|
|
|
4189
|
-
/* Document-class: Node::
|
|
4190
|
-
* Represents a
|
|
4191
|
-
*
|
|
4192
|
-
*
|
|
4193
|
-
* end
|
|
4194
|
-
*
|
|
4195
|
-
* or the form:
|
|
4196
|
-
* if cond then
|
|
4197
|
-
* body
|
|
4198
|
-
* else
|
|
4199
|
-
* else
|
|
4200
|
-
* end
|
|
4003
|
+
/* Document-class: Node::DXSTR
|
|
4004
|
+
* Represents a string object with interpolation inside backticks,
|
|
4005
|
+
* e.g.:
|
|
4006
|
+
* `lit#{next}`
|
|
4201
4007
|
*
|
|
4202
|
-
* The
|
|
4203
|
-
*
|
|
4204
|
-
*
|
|
4205
|
-
*
|
|
4008
|
+
* The node is evaluated by duplicating the string stored in the 'lit'
|
|
4009
|
+
* element, then iterating over the nodes stored in the 'next' element.
|
|
4010
|
+
* Each node found should evalate to an string, and each resulting
|
|
4011
|
+
* string is appended onto the original string.
|
|
4206
4012
|
*
|
|
4207
|
-
*
|
|
4208
|
-
*
|
|
4013
|
+
* The resulting string is executed in a subshell and the output from
|
|
4014
|
+
* its stdout stored in a string, which becomes the result of the
|
|
4015
|
+
* expression. Interpolation is represented with the EVSTR node.
|
|
4209
4016
|
*/
|
|
4210
4017
|
{
|
|
4211
|
-
VALUE
|
|
4018
|
+
VALUE rb_cDXSTR = rb_define_class_under(rb_cNode, "DXSTR", rb_cNode);
|
|
4212
4019
|
members = rb_ary_new();
|
|
4213
|
-
rb_cNodeSubclass[
|
|
4214
|
-
rb_iv_set(
|
|
4215
|
-
rb_iv_set(
|
|
4216
|
-
rb_define_singleton_method(
|
|
4217
|
-
|
|
4218
|
-
/* Document-method: cond
|
|
4219
|
-
* the condition to evaluate
|
|
4220
|
-
*/
|
|
4221
|
-
rb_define_method(rb_cIF, "cond", node_cond, 0);
|
|
4222
|
-
rb_ary_push(members, rb_str_new2("cond"));
|
|
4020
|
+
rb_cNodeSubclass[NODE_DXSTR] = rb_cDXSTR;
|
|
4021
|
+
rb_iv_set(rb_cDXSTR, "__member__", members);
|
|
4022
|
+
rb_iv_set(rb_cDXSTR, "__type__", INT2NUM(NODE_DXSTR));
|
|
4023
|
+
rb_define_singleton_method(rb_cDXSTR, "members", node_s_members, 0);
|
|
4223
4024
|
|
|
4224
|
-
/* Document-method:
|
|
4225
|
-
*
|
|
4226
|
-
* if the expression is empty
|
|
4025
|
+
/* Document-method: lit
|
|
4026
|
+
* a string
|
|
4227
4027
|
*/
|
|
4228
|
-
rb_define_method(
|
|
4229
|
-
rb_ary_push(members, rb_str_new2("
|
|
4028
|
+
rb_define_method(rb_cDXSTR, "lit", node_lit, 0);
|
|
4029
|
+
rb_ary_push(members, rb_str_new2("lit"));
|
|
4230
4030
|
|
|
4231
|
-
/* Document-method:
|
|
4232
|
-
*
|
|
4233
|
-
* if the expression is empty
|
|
4031
|
+
/* Document-method: next
|
|
4032
|
+
* a list of expressions to be appended onto the string
|
|
4234
4033
|
*/
|
|
4235
|
-
rb_define_method(
|
|
4236
|
-
rb_ary_push(members, rb_str_new2("
|
|
4034
|
+
rb_define_method(rb_cDXSTR, "next", node_next, 0);
|
|
4035
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
4237
4036
|
}
|
|
4238
4037
|
|
|
4239
|
-
/* Document-class: Node::
|
|
4240
|
-
* Represents
|
|
4241
|
-
*
|
|
4242
|
-
*
|
|
4243
|
-
*
|
|
4244
|
-
*
|
|
4245
|
-
* end
|
|
4246
|
-
*
|
|
4247
|
-
* or the first element of a a case/end block with no conditional:
|
|
4248
|
-
* case
|
|
4249
|
-
* when head
|
|
4250
|
-
* body
|
|
4251
|
-
* next
|
|
4038
|
+
/* Document-class: Node::ENSURE
|
|
4039
|
+
* Represents an ensure expression, e.g.:
|
|
4040
|
+
* begin
|
|
4041
|
+
* head
|
|
4042
|
+
* ensure
|
|
4043
|
+
* ensr
|
|
4252
4044
|
* end
|
|
4253
4045
|
*
|
|
4254
|
-
*
|
|
4255
|
-
*
|
|
4256
|
-
*
|
|
4257
|
-
* the interpreter evaluates the next node.
|
|
4258
|
-
*
|
|
4259
|
-
* In the second case, head is tested using rtest(value). If the
|
|
4260
|
-
* result is true, then body is evaluated and no more when conditions
|
|
4261
|
-
* are tried, otherwise the interpreter evaluates the next node.
|
|
4262
|
-
*
|
|
4263
|
-
* If the condition evaluates to false and there are no more when
|
|
4264
|
-
* conditions to try, the result of the expression is nil.
|
|
4046
|
+
* The head expression is first evaluated. After the expression is
|
|
4047
|
+
* evaluated, whether or not the expression raises an exception, the
|
|
4048
|
+
* ensr expression is evaluated.
|
|
4265
4049
|
*
|
|
4266
|
-
*
|
|
4267
|
-
* an else element and is evaluated unconditionally.
|
|
4050
|
+
* See also RESCUE and RESBDOY.
|
|
4268
4051
|
*/
|
|
4269
4052
|
{
|
|
4270
|
-
VALUE
|
|
4053
|
+
VALUE rb_cENSURE = rb_define_class_under(rb_cNode, "ENSURE", rb_cNode);
|
|
4271
4054
|
members = rb_ary_new();
|
|
4272
|
-
rb_cNodeSubclass[
|
|
4273
|
-
rb_iv_set(
|
|
4274
|
-
rb_iv_set(
|
|
4275
|
-
rb_define_singleton_method(
|
|
4055
|
+
rb_cNodeSubclass[NODE_ENSURE] = rb_cENSURE;
|
|
4056
|
+
rb_iv_set(rb_cENSURE, "__member__", members);
|
|
4057
|
+
rb_iv_set(rb_cENSURE, "__type__", INT2NUM(NODE_ENSURE));
|
|
4058
|
+
rb_define_singleton_method(rb_cENSURE, "members", node_s_members, 0);
|
|
4276
4059
|
|
|
4277
4060
|
/* Document-method: head
|
|
4278
|
-
*
|
|
4061
|
+
* the expression to protect
|
|
4279
4062
|
*/
|
|
4280
|
-
rb_define_method(
|
|
4063
|
+
rb_define_method(rb_cENSURE, "head", node_head, 0);
|
|
4281
4064
|
rb_ary_push(members, rb_str_new2("head"));
|
|
4282
4065
|
|
|
4066
|
+
/* Document-method: ensr
|
|
4067
|
+
* the expression to evaluate after the head is evaluated
|
|
4068
|
+
*/
|
|
4069
|
+
rb_define_method(rb_cENSURE, "ensr", node_ensr, 0);
|
|
4070
|
+
rb_ary_push(members, rb_str_new2("ensr"));
|
|
4071
|
+
}
|
|
4072
|
+
|
|
4073
|
+
/* Document-class: Node::EVSTR
|
|
4074
|
+
* Represents a single string interpolation.
|
|
4075
|
+
*
|
|
4076
|
+
* Evaluates the given expression and converts its result to a string
|
|
4077
|
+
* with #to_s.
|
|
4078
|
+
*/
|
|
4079
|
+
{
|
|
4080
|
+
VALUE rb_cEVSTR = rb_define_class_under(rb_cNode, "EVSTR", rb_cNode);
|
|
4081
|
+
members = rb_ary_new();
|
|
4082
|
+
rb_cNodeSubclass[NODE_EVSTR] = rb_cEVSTR;
|
|
4083
|
+
rb_iv_set(rb_cEVSTR, "__member__", members);
|
|
4084
|
+
rb_iv_set(rb_cEVSTR, "__type__", INT2NUM(NODE_EVSTR));
|
|
4085
|
+
rb_define_singleton_method(rb_cEVSTR, "members", node_s_members, 0);
|
|
4086
|
+
|
|
4283
4087
|
/* Document-method: body
|
|
4284
|
-
* an expression to evaluate
|
|
4088
|
+
* an expression to evaluate
|
|
4285
4089
|
*/
|
|
4286
|
-
rb_define_method(
|
|
4090
|
+
rb_define_method(rb_cEVSTR, "body", node_body, 0);
|
|
4287
4091
|
rb_ary_push(members, rb_str_new2("body"));
|
|
4092
|
+
}
|
|
4288
4093
|
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
|
|
4094
|
+
/* Document-class: Node::FALSE
|
|
4095
|
+
* Represents the keyword 'false'.
|
|
4096
|
+
*/
|
|
4097
|
+
{
|
|
4098
|
+
VALUE rb_cFALSE = rb_define_class_under(rb_cNode, "FALSE", rb_cNode);
|
|
4099
|
+
members = rb_ary_new();
|
|
4100
|
+
rb_cNodeSubclass[NODE_FALSE] = rb_cFALSE;
|
|
4101
|
+
rb_iv_set(rb_cFALSE, "__member__", members);
|
|
4102
|
+
rb_iv_set(rb_cFALSE, "__type__", INT2NUM(NODE_FALSE));
|
|
4103
|
+
rb_define_singleton_method(rb_cFALSE, "members", node_s_members, 0);
|
|
4294
4104
|
}
|
|
4295
4105
|
|
|
4296
|
-
/* Document-class: Node::
|
|
4297
|
-
*
|
|
4298
|
-
*
|
|
4299
|
-
*
|
|
4300
|
-
* Evaluates head to create an array. Evaluates body and performs a
|
|
4301
|
-
* splat operation on the result to create another array (see SPLAT).
|
|
4302
|
-
* Concatenates the the second array onto the end of the first to
|
|
4303
|
-
* produce the result.
|
|
4106
|
+
/* Document-class: Node::FBODY
|
|
4107
|
+
* A placeholder for a method alias, which can be added to a class by
|
|
4108
|
+
* using alias or alias_method:
|
|
4109
|
+
* alias old new
|
|
4304
4110
|
*/
|
|
4305
4111
|
{
|
|
4306
|
-
VALUE
|
|
4112
|
+
VALUE rb_cFBODY = rb_define_class_under(rb_cNode, "FBODY", rb_cNode);
|
|
4307
4113
|
members = rb_ary_new();
|
|
4308
|
-
rb_cNodeSubclass[
|
|
4309
|
-
rb_iv_set(
|
|
4310
|
-
rb_iv_set(
|
|
4311
|
-
rb_define_singleton_method(
|
|
4114
|
+
rb_cNodeSubclass[NODE_FBODY] = rb_cFBODY;
|
|
4115
|
+
rb_iv_set(rb_cFBODY, "__member__", members);
|
|
4116
|
+
rb_iv_set(rb_cFBODY, "__type__", INT2NUM(NODE_FBODY));
|
|
4117
|
+
rb_define_singleton_method(rb_cFBODY, "members", node_s_members, 0);
|
|
4312
4118
|
|
|
4313
4119
|
/* Document-method: head
|
|
4314
|
-
*
|
|
4120
|
+
* the method body
|
|
4315
4121
|
*/
|
|
4316
|
-
rb_define_method(
|
|
4122
|
+
rb_define_method(rb_cFBODY, "head", node_head, 0);
|
|
4317
4123
|
rb_ary_push(members, rb_str_new2("head"));
|
|
4318
4124
|
|
|
4319
|
-
/* Document-method:
|
|
4320
|
-
* the
|
|
4321
|
-
* fixed arguments
|
|
4125
|
+
/* Document-method: orig
|
|
4126
|
+
* the origin class
|
|
4322
4127
|
*/
|
|
4323
|
-
rb_define_method(
|
|
4324
|
-
rb_ary_push(members, rb_str_new2("
|
|
4128
|
+
rb_define_method(rb_cFBODY, "orig", node_orig, 0);
|
|
4129
|
+
rb_ary_push(members, rb_str_new2("orig"));
|
|
4130
|
+
|
|
4131
|
+
/* Document-method: mid
|
|
4132
|
+
* the name of the method
|
|
4133
|
+
*/
|
|
4134
|
+
rb_define_method(rb_cFBODY, "mid", node_mid, 0);
|
|
4135
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
4325
4136
|
}
|
|
4326
4137
|
|
|
4327
|
-
/* Document-class: Node::
|
|
4328
|
-
* Represents a
|
|
4329
|
-
*
|
|
4138
|
+
/* Document-class: Node::FCALL
|
|
4139
|
+
* Represents a method call in the form:
|
|
4140
|
+
* mid(args).
|
|
4141
|
+
*
|
|
4142
|
+
* This makes a method call on an object using self as the implicit
|
|
4143
|
+
* receiver.
|
|
4330
4144
|
*/
|
|
4331
4145
|
{
|
|
4332
|
-
VALUE
|
|
4146
|
+
VALUE rb_cFCALL = rb_define_class_under(rb_cNode, "FCALL", rb_cNode);
|
|
4333
4147
|
members = rb_ary_new();
|
|
4334
|
-
rb_cNodeSubclass[
|
|
4335
|
-
rb_iv_set(
|
|
4336
|
-
rb_iv_set(
|
|
4337
|
-
rb_define_singleton_method(
|
|
4148
|
+
rb_cNodeSubclass[NODE_FCALL] = rb_cFCALL;
|
|
4149
|
+
rb_iv_set(rb_cFCALL, "__member__", members);
|
|
4150
|
+
rb_iv_set(rb_cFCALL, "__type__", INT2NUM(NODE_FCALL));
|
|
4151
|
+
rb_define_singleton_method(rb_cFCALL, "members", node_s_members, 0);
|
|
4338
4152
|
|
|
4339
|
-
/* Document-method:
|
|
4340
|
-
*
|
|
4153
|
+
/* Document-method: args
|
|
4154
|
+
* the arguments to the method
|
|
4341
4155
|
*/
|
|
4342
|
-
rb_define_method(
|
|
4343
|
-
rb_ary_push(members, rb_str_new2("
|
|
4156
|
+
rb_define_method(rb_cFCALL, "args", node_args, 0);
|
|
4157
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
4158
|
+
|
|
4159
|
+
/* Document-method: mid
|
|
4160
|
+
* the method id
|
|
4161
|
+
*/
|
|
4162
|
+
rb_define_method(rb_cFCALL, "mid", node_mid, 0);
|
|
4163
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
4344
4164
|
}
|
|
4345
4165
|
|
|
4346
|
-
/* Document-class: Node::
|
|
4347
|
-
*
|
|
4348
|
-
*
|
|
4349
|
-
*
|
|
4350
|
-
*
|
|
4166
|
+
/* Document-class: Node::FLIP2
|
|
4167
|
+
* Represents part of an awk-like flip-flop expression of the form:
|
|
4168
|
+
* if beg..end then
|
|
4169
|
+
* body
|
|
4170
|
+
* end
|
|
4351
4171
|
*/
|
|
4352
|
-
#ifdef HAVE_NODE_ALLOCA
|
|
4353
4172
|
{
|
|
4354
|
-
VALUE
|
|
4173
|
+
VALUE rb_cFLIP2 = rb_define_class_under(rb_cNode, "FLIP2", rb_cNode);
|
|
4355
4174
|
members = rb_ary_new();
|
|
4356
|
-
rb_cNodeSubclass[
|
|
4357
|
-
rb_iv_set(
|
|
4358
|
-
rb_iv_set(
|
|
4359
|
-
rb_define_singleton_method(
|
|
4175
|
+
rb_cNodeSubclass[NODE_FLIP2] = rb_cFLIP2;
|
|
4176
|
+
rb_iv_set(rb_cFLIP2, "__member__", members);
|
|
4177
|
+
rb_iv_set(rb_cFLIP2, "__type__", INT2NUM(NODE_FLIP2));
|
|
4178
|
+
rb_define_singleton_method(rb_cFLIP2, "members", node_s_members, 0);
|
|
4360
4179
|
|
|
4361
|
-
/* Document-method:
|
|
4362
|
-
*
|
|
4180
|
+
/* Document-method: beg
|
|
4181
|
+
* the beginning of the range
|
|
4363
4182
|
*/
|
|
4364
|
-
rb_define_method(
|
|
4365
|
-
rb_ary_push(members, rb_str_new2("
|
|
4183
|
+
rb_define_method(rb_cFLIP2, "beg", node_beg, 0);
|
|
4184
|
+
rb_ary_push(members, rb_str_new2("beg"));
|
|
4366
4185
|
|
|
4367
|
-
/* Document-method:
|
|
4368
|
-
*
|
|
4186
|
+
/* Document-method: end
|
|
4187
|
+
* the end of the range
|
|
4369
4188
|
*/
|
|
4370
|
-
rb_define_method(
|
|
4371
|
-
rb_ary_push(members, rb_str_new2("
|
|
4189
|
+
rb_define_method(rb_cFLIP2, "end", node_end, 0);
|
|
4190
|
+
rb_ary_push(members, rb_str_new2("end"));
|
|
4372
4191
|
|
|
4373
4192
|
/* Document-method: cnt
|
|
4374
|
-
* the
|
|
4193
|
+
* the index into the local variable table of the special variable
|
|
4194
|
+
* to use in the flip-flop expression (usually 2 for $_)
|
|
4375
4195
|
*/
|
|
4376
|
-
rb_define_method(
|
|
4196
|
+
rb_define_method(rb_cFLIP2, "cnt", node_cnt, 0);
|
|
4377
4197
|
rb_ary_push(members, rb_str_new2("cnt"));
|
|
4378
4198
|
}
|
|
4379
|
-
#endif
|
|
4380
4199
|
|
|
4381
|
-
/* Document-class: Node::
|
|
4382
|
-
* Represents
|
|
4383
|
-
*
|
|
4384
|
-
*
|
|
4385
|
-
*
|
|
4386
|
-
*
|
|
4387
|
-
* The index is obtained from args.body.
|
|
4388
|
-
*
|
|
4389
|
-
* The value is obtained from args.head.
|
|
4390
|
-
*
|
|
4391
|
-
* In the case of ||=, mid will be 0. The rhs will be equal to the
|
|
4392
|
-
* result of evaluating args.head if the lhs is false, otherwise the
|
|
4393
|
-
* rhs will be equal to lhs.
|
|
4394
|
-
*
|
|
4395
|
-
* In the case of &&=, mid will be 1. The rhs will be equal to the lhs
|
|
4396
|
-
* if lhs is false, otherwise the rhs will be equal to the result of
|
|
4397
|
-
* evaluating args.head. In all other cases, mid will be the name of
|
|
4398
|
-
* the method to call to calculate value, such that the expression is
|
|
4399
|
-
* equivalent to:
|
|
4400
|
-
* recv[args.body] = recv[args.body].mid(args.head)
|
|
4401
|
-
*
|
|
4402
|
-
* In no case does ruby short-circuit the assignment.
|
|
4200
|
+
/* Document-class: Node::FLIP3
|
|
4201
|
+
* Represents part of a sed-like flip-flop expression of the form:
|
|
4202
|
+
* if beg..end then
|
|
4203
|
+
* body
|
|
4204
|
+
* end
|
|
4403
4205
|
*/
|
|
4404
4206
|
{
|
|
4405
|
-
VALUE
|
|
4207
|
+
VALUE rb_cFLIP3 = rb_define_class_under(rb_cNode, "FLIP3", rb_cNode);
|
|
4406
4208
|
members = rb_ary_new();
|
|
4407
|
-
rb_cNodeSubclass[
|
|
4408
|
-
rb_iv_set(
|
|
4409
|
-
rb_iv_set(
|
|
4410
|
-
rb_define_singleton_method(
|
|
4209
|
+
rb_cNodeSubclass[NODE_FLIP3] = rb_cFLIP3;
|
|
4210
|
+
rb_iv_set(rb_cFLIP3, "__member__", members);
|
|
4211
|
+
rb_iv_set(rb_cFLIP3, "__type__", INT2NUM(NODE_FLIP3));
|
|
4212
|
+
rb_define_singleton_method(rb_cFLIP3, "members", node_s_members, 0);
|
|
4411
4213
|
|
|
4412
|
-
/* Document-method:
|
|
4413
|
-
* the
|
|
4214
|
+
/* Document-method: beg
|
|
4215
|
+
* the beginning of the range
|
|
4414
4216
|
*/
|
|
4415
|
-
rb_define_method(
|
|
4416
|
-
rb_ary_push(members, rb_str_new2("
|
|
4217
|
+
rb_define_method(rb_cFLIP3, "beg", node_beg, 0);
|
|
4218
|
+
rb_ary_push(members, rb_str_new2("beg"));
|
|
4417
4219
|
|
|
4418
|
-
/* Document-method:
|
|
4419
|
-
*
|
|
4420
|
-
* rhs
|
|
4220
|
+
/* Document-method: end
|
|
4221
|
+
* the end of the range
|
|
4421
4222
|
*/
|
|
4422
|
-
rb_define_method(
|
|
4423
|
-
rb_ary_push(members, rb_str_new2("
|
|
4223
|
+
rb_define_method(rb_cFLIP3, "end", node_end, 0);
|
|
4224
|
+
rb_ary_push(members, rb_str_new2("end"));
|
|
4424
4225
|
|
|
4425
|
-
/* Document-method:
|
|
4426
|
-
* the
|
|
4226
|
+
/* Document-method: cnt
|
|
4227
|
+
* the index into the local variable table of the special variable
|
|
4228
|
+
* to use in the flip-flop expression (usually 2 for $_)
|
|
4427
4229
|
*/
|
|
4428
|
-
rb_define_method(
|
|
4429
|
-
rb_ary_push(members, rb_str_new2("
|
|
4230
|
+
rb_define_method(rb_cFLIP3, "cnt", node_cnt, 0);
|
|
4231
|
+
rb_ary_push(members, rb_str_new2("cnt"));
|
|
4430
4232
|
}
|
|
4431
4233
|
|
|
4432
|
-
/* Document-class: Node::
|
|
4433
|
-
* Represents
|
|
4434
|
-
*
|
|
4435
|
-
*
|
|
4234
|
+
/* Document-class: Node::FOR
|
|
4235
|
+
* Represents a loop constructed with the 'for' keyword, e.g.:
|
|
4236
|
+
* for var in iter do
|
|
4237
|
+
* body
|
|
4436
4238
|
* end
|
|
4437
|
-
*
|
|
4239
|
+
*
|
|
4240
|
+
* This is equivalent to:
|
|
4241
|
+
* iter.each do |*args|
|
|
4242
|
+
* assign args to var
|
|
4243
|
+
* body
|
|
4244
|
+
* end
|
|
4245
|
+
*
|
|
4246
|
+
* Except that a new block is not created.
|
|
4438
4247
|
*/
|
|
4439
4248
|
{
|
|
4440
|
-
VALUE
|
|
4249
|
+
VALUE rb_cFOR = rb_define_class_under(rb_cNode, "FOR", rb_cNode);
|
|
4441
4250
|
members = rb_ary_new();
|
|
4442
|
-
rb_cNodeSubclass[
|
|
4443
|
-
rb_iv_set(
|
|
4444
|
-
rb_iv_set(
|
|
4445
|
-
rb_define_singleton_method(
|
|
4446
|
-
|
|
4447
|
-
/* Document-method: head
|
|
4448
|
-
* the value to select on
|
|
4449
|
-
*/
|
|
4450
|
-
rb_define_method(rb_cCASE, "head", node_head, 0);
|
|
4451
|
-
rb_ary_push(members, rb_str_new2("head"));
|
|
4251
|
+
rb_cNodeSubclass[NODE_FOR] = rb_cFOR;
|
|
4252
|
+
rb_iv_set(rb_cFOR, "__member__", members);
|
|
4253
|
+
rb_iv_set(rb_cFOR, "__type__", INT2NUM(NODE_FOR));
|
|
4254
|
+
rb_define_singleton_method(rb_cFOR, "members", node_s_members, 0);
|
|
4452
4255
|
|
|
4453
4256
|
/* Document-method: body
|
|
4454
|
-
*
|
|
4455
|
-
* conditional
|
|
4257
|
+
* the body of the loop
|
|
4456
4258
|
*/
|
|
4457
|
-
rb_define_method(
|
|
4259
|
+
rb_define_method(rb_cFOR, "body", node_body, 0);
|
|
4458
4260
|
rb_ary_push(members, rb_str_new2("body"));
|
|
4459
|
-
rb_define_method(rb_cCASE, "next", node_next, 0);
|
|
4460
|
-
rb_ary_push(members, rb_str_new2("next"));
|
|
4461
|
-
}
|
|
4462
4261
|
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
rb_ary_push(members, rb_str_new2("argc"));
|
|
4262
|
+
/* Document-method: iter
|
|
4263
|
+
* the sequence over which to iterate
|
|
4264
|
+
*/
|
|
4265
|
+
rb_define_method(rb_cFOR, "iter", node_iter, 0);
|
|
4266
|
+
rb_ary_push(members, rb_str_new2("iter"));
|
|
4267
|
+
|
|
4268
|
+
/* Document-method: var
|
|
4269
|
+
* an assignment node which assigns the next value in the sequence
|
|
4270
|
+
* to a variable, which may or may not be local. May also be a
|
|
4271
|
+
* multiple assignment.
|
|
4272
|
+
*/
|
|
4273
|
+
rb_define_method(rb_cFOR, "var", node_var, 0);
|
|
4274
|
+
rb_ary_push(members, rb_str_new2("var"));
|
|
4477
4275
|
}
|
|
4478
4276
|
|
|
4479
|
-
/* Document-class: Node::
|
|
4480
|
-
* Represents
|
|
4481
|
-
* recv.attr op value
|
|
4482
|
-
*
|
|
4483
|
-
* where recv is the receiver of the attr method, attr is the attribute
|
|
4484
|
-
* to which to assign, op is an assignment operation (e.g. +=), and
|
|
4485
|
-
* value is the value to assign to the attribute.
|
|
4486
|
-
*
|
|
4487
|
-
* The 'next' member of this class is also of type OP_ASGN2, though it
|
|
4488
|
-
* has different members than its parent. This child node is
|
|
4489
|
-
* documented under OP_ASGN2_ARG.
|
|
4277
|
+
/* Document-class: Node::GASGN
|
|
4278
|
+
* Represents global variable assignment.
|
|
4490
4279
|
*/
|
|
4491
4280
|
{
|
|
4492
|
-
VALUE
|
|
4281
|
+
VALUE rb_cGASGN = rb_define_class_under(rb_cNode, "GASGN", rb_cNode);
|
|
4493
4282
|
members = rb_ary_new();
|
|
4494
|
-
rb_cNodeSubclass[
|
|
4495
|
-
rb_iv_set(
|
|
4496
|
-
rb_iv_set(
|
|
4497
|
-
rb_define_singleton_method(
|
|
4498
|
-
|
|
4499
|
-
/* Document-method: value
|
|
4500
|
-
* the value to assign to the attribute
|
|
4501
|
-
*/
|
|
4502
|
-
rb_define_method(rb_cOP_ASGN2, "value", node_value, 0);
|
|
4503
|
-
rb_ary_push(members, rb_str_new2("value"));
|
|
4283
|
+
rb_cNodeSubclass[NODE_GASGN] = rb_cGASGN;
|
|
4284
|
+
rb_iv_set(rb_cGASGN, "__member__", members);
|
|
4285
|
+
rb_iv_set(rb_cGASGN, "__type__", INT2NUM(NODE_GASGN));
|
|
4286
|
+
rb_define_singleton_method(rb_cGASGN, "members", node_s_members, 0);
|
|
4504
4287
|
|
|
4505
|
-
/* Document-method:
|
|
4506
|
-
*
|
|
4507
|
-
* about the assignment operation than can fit in this node alone
|
|
4288
|
+
/* Document-method: value
|
|
4289
|
+
* an expression whose result is the new value of the global variable
|
|
4508
4290
|
*/
|
|
4509
|
-
rb_define_method(
|
|
4510
|
-
rb_ary_push(members, rb_str_new2("
|
|
4291
|
+
rb_define_method(rb_cGASGN, "value", node_value, 0);
|
|
4292
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
4511
4293
|
|
|
4512
|
-
/* Document-method:
|
|
4513
|
-
* the
|
|
4294
|
+
/* Document-method: vid
|
|
4295
|
+
* the name of the global variable, with a leading '$' character.
|
|
4514
4296
|
*/
|
|
4515
|
-
rb_define_method(
|
|
4516
|
-
rb_ary_push(members, rb_str_new2("
|
|
4297
|
+
rb_define_method(rb_cGASGN, "vid", node_vid, 0);
|
|
4298
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
4299
|
+
rb_define_method(rb_cGASGN, "entry", node_entry, 0);
|
|
4300
|
+
rb_ary_push(members, rb_str_new2("entry"));
|
|
4517
4301
|
}
|
|
4518
4302
|
|
|
4519
|
-
/* Document-class: Node::
|
|
4520
|
-
* Represents
|
|
4521
|
-
* def recv.mid
|
|
4522
|
-
* defn
|
|
4523
|
-
* end
|
|
4303
|
+
/* Document-class: Node::GVAR
|
|
4304
|
+
* Represents global variable retrieval.
|
|
4524
4305
|
*/
|
|
4525
4306
|
{
|
|
4526
|
-
VALUE
|
|
4307
|
+
VALUE rb_cGVAR = rb_define_class_under(rb_cNode, "GVAR", rb_cNode);
|
|
4527
4308
|
members = rb_ary_new();
|
|
4528
|
-
rb_cNodeSubclass[
|
|
4529
|
-
rb_iv_set(
|
|
4530
|
-
rb_iv_set(
|
|
4531
|
-
rb_define_singleton_method(
|
|
4309
|
+
rb_cNodeSubclass[NODE_GVAR] = rb_cGVAR;
|
|
4310
|
+
rb_iv_set(rb_cGVAR, "__member__", members);
|
|
4311
|
+
rb_iv_set(rb_cGVAR, "__type__", INT2NUM(NODE_GVAR));
|
|
4312
|
+
rb_define_singleton_method(rb_cGVAR, "members", node_s_members, 0);
|
|
4532
4313
|
|
|
4533
|
-
/* Document-method:
|
|
4534
|
-
* the name of the
|
|
4314
|
+
/* Document-method: vid
|
|
4315
|
+
* the name of the global variable to retrieve, with a leading '$'
|
|
4535
4316
|
*/
|
|
4536
|
-
rb_define_method(
|
|
4537
|
-
rb_ary_push(members, rb_str_new2("
|
|
4538
|
-
rb_define_method(
|
|
4539
|
-
rb_ary_push(members, rb_str_new2("
|
|
4317
|
+
rb_define_method(rb_cGVAR, "vid", node_vid, 0);
|
|
4318
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
4319
|
+
rb_define_method(rb_cGVAR, "entry", node_entry, 0);
|
|
4320
|
+
rb_ary_push(members, rb_str_new2("entry"));
|
|
4321
|
+
}
|
|
4540
4322
|
|
|
4541
|
-
|
|
4542
|
-
|
|
4323
|
+
/* Document-class: Node::HASH
|
|
4324
|
+
* Represents a hash table. Evaluation of this node creates a new Hash
|
|
4325
|
+
* by evaluating the given expressions and placing them into the table.
|
|
4326
|
+
*/
|
|
4327
|
+
{
|
|
4328
|
+
VALUE rb_cHASH = rb_define_class_under(rb_cNode, "HASH", rb_cNode);
|
|
4329
|
+
members = rb_ary_new();
|
|
4330
|
+
rb_cNodeSubclass[NODE_HASH] = rb_cHASH;
|
|
4331
|
+
rb_iv_set(rb_cHASH, "__member__", members);
|
|
4332
|
+
rb_iv_set(rb_cHASH, "__type__", INT2NUM(NODE_HASH));
|
|
4333
|
+
rb_define_singleton_method(rb_cHASH, "members", node_s_members, 0);
|
|
4334
|
+
|
|
4335
|
+
/* Document-method: head
|
|
4336
|
+
* an array of successive keys and values
|
|
4543
4337
|
*/
|
|
4544
|
-
rb_define_method(
|
|
4545
|
-
rb_ary_push(members, rb_str_new2("
|
|
4338
|
+
rb_define_method(rb_cHASH, "head", node_head, 0);
|
|
4339
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
4546
4340
|
}
|
|
4547
4341
|
|
|
4548
|
-
/* Document-class: Node::
|
|
4549
|
-
* Represents
|
|
4342
|
+
/* Document-class: Node::IASGN
|
|
4343
|
+
* Represents instance variable assignment.
|
|
4550
4344
|
*/
|
|
4551
4345
|
{
|
|
4552
|
-
VALUE
|
|
4346
|
+
VALUE rb_cIASGN = rb_define_class_under(rb_cNode, "IASGN", rb_cNode);
|
|
4553
4347
|
members = rb_ary_new();
|
|
4554
|
-
rb_cNodeSubclass[
|
|
4555
|
-
rb_iv_set(
|
|
4556
|
-
rb_iv_set(
|
|
4557
|
-
rb_define_singleton_method(
|
|
4348
|
+
rb_cNodeSubclass[NODE_IASGN] = rb_cIASGN;
|
|
4349
|
+
rb_iv_set(rb_cIASGN, "__member__", members);
|
|
4350
|
+
rb_iv_set(rb_cIASGN, "__type__", INT2NUM(NODE_IASGN));
|
|
4351
|
+
rb_define_singleton_method(rb_cIASGN, "members", node_s_members, 0);
|
|
4558
4352
|
|
|
4559
4353
|
/* Document-method: value
|
|
4560
|
-
* the value to assign to the
|
|
4354
|
+
* the value to assign to the instance variable
|
|
4561
4355
|
*/
|
|
4562
|
-
rb_define_method(
|
|
4356
|
+
rb_define_method(rb_cIASGN, "value", node_value, 0);
|
|
4563
4357
|
rb_ary_push(members, rb_str_new2("value"));
|
|
4564
4358
|
|
|
4565
4359
|
/* Document-method: vid
|
|
4566
|
-
* the name of the
|
|
4360
|
+
* the name of the instance variable, with a leading '@' sign
|
|
4567
4361
|
*/
|
|
4568
|
-
rb_define_method(
|
|
4362
|
+
rb_define_method(rb_cIASGN, "vid", node_vid, 0);
|
|
4569
4363
|
rb_ary_push(members, rb_str_new2("vid"));
|
|
4570
|
-
rb_define_method(rb_cLASGN, "cnt", node_cnt, 0);
|
|
4571
|
-
rb_ary_push(members, rb_str_new2("cnt"));
|
|
4572
4364
|
}
|
|
4573
4365
|
|
|
4574
|
-
/* Document-class: Node::
|
|
4575
|
-
* Represents
|
|
4576
|
-
*
|
|
4366
|
+
/* Document-class: Node::IF
|
|
4367
|
+
* Represents a conditional of the form:
|
|
4368
|
+
* if cond then
|
|
4369
|
+
* body
|
|
4370
|
+
* end
|
|
4577
4371
|
*
|
|
4578
|
-
*
|
|
4579
|
-
*
|
|
4372
|
+
* or the form:
|
|
4373
|
+
* if cond then
|
|
4374
|
+
* body
|
|
4375
|
+
* else
|
|
4376
|
+
* else
|
|
4377
|
+
* end
|
|
4378
|
+
*
|
|
4379
|
+
* The condition is first evaluated. If it is true, then body is
|
|
4380
|
+
* evaluated, otherwise else is evaluated. The result is the value of
|
|
4381
|
+
* the expression evaluated, or nil if there was no expression
|
|
4382
|
+
* present.
|
|
4383
|
+
*
|
|
4384
|
+
* A conditional block using elsif has another IF node as the else
|
|
4385
|
+
* expression.
|
|
4580
4386
|
*/
|
|
4581
4387
|
{
|
|
4582
|
-
VALUE
|
|
4388
|
+
VALUE rb_cIF = rb_define_class_under(rb_cNode, "IF", rb_cNode);
|
|
4583
4389
|
members = rb_ary_new();
|
|
4584
|
-
rb_cNodeSubclass[
|
|
4585
|
-
rb_iv_set(
|
|
4586
|
-
rb_iv_set(
|
|
4587
|
-
rb_define_singleton_method(
|
|
4588
|
-
}
|
|
4390
|
+
rb_cNodeSubclass[NODE_IF] = rb_cIF;
|
|
4391
|
+
rb_iv_set(rb_cIF, "__member__", members);
|
|
4392
|
+
rb_iv_set(rb_cIF, "__type__", INT2NUM(NODE_IF));
|
|
4393
|
+
rb_define_singleton_method(rb_cIF, "members", node_s_members, 0);
|
|
4589
4394
|
|
|
4590
|
-
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
VALUE rb_cSTR = rb_define_class_under(rb_cNode, "STR", rb_cNode);
|
|
4596
|
-
members = rb_ary_new();
|
|
4597
|
-
rb_cNodeSubclass[NODE_STR] = rb_cSTR;
|
|
4598
|
-
rb_iv_set(rb_cSTR, "__member__", members);
|
|
4599
|
-
rb_iv_set(rb_cSTR, "__type__", INT2NUM(NODE_STR));
|
|
4600
|
-
rb_define_singleton_method(rb_cSTR, "members", node_s_members, 0);
|
|
4395
|
+
/* Document-method: cond
|
|
4396
|
+
* the condition to evaluate
|
|
4397
|
+
*/
|
|
4398
|
+
rb_define_method(rb_cIF, "cond", node_cond, 0);
|
|
4399
|
+
rb_ary_push(members, rb_str_new2("cond"));
|
|
4601
4400
|
|
|
4602
|
-
/* Document-method:
|
|
4603
|
-
* the
|
|
4401
|
+
/* Document-method: body
|
|
4402
|
+
* the expression to evaluate if the expression is true, or false
|
|
4403
|
+
* if the expression is empty
|
|
4604
4404
|
*/
|
|
4605
|
-
rb_define_method(
|
|
4606
|
-
rb_ary_push(members, rb_str_new2("
|
|
4405
|
+
rb_define_method(rb_cIF, "body", node_body, 0);
|
|
4406
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
4407
|
+
|
|
4408
|
+
/* Document-method: else
|
|
4409
|
+
* the expression to evaluate if the expression is false, or false
|
|
4410
|
+
* if the expression is empty
|
|
4411
|
+
*/
|
|
4412
|
+
rb_define_method(rb_cIF, "else", node_else, 0);
|
|
4413
|
+
rb_ary_push(members, rb_str_new2("else"));
|
|
4607
4414
|
}
|
|
4608
4415
|
|
|
4609
|
-
/* Document-class: Node::
|
|
4610
|
-
* A
|
|
4611
|
-
* class by using attr_writer:
|
|
4612
|
-
* attr_writer :attribute
|
|
4613
|
-
* Its reader counterpart is IVAR.
|
|
4416
|
+
/* Document-class: Node::IFUNC
|
|
4417
|
+
* A temporary node used in iteration.
|
|
4614
4418
|
*/
|
|
4615
4419
|
{
|
|
4616
|
-
VALUE
|
|
4420
|
+
VALUE rb_cIFUNC = rb_define_class_under(rb_cNode, "IFUNC", rb_cNode);
|
|
4617
4421
|
members = rb_ary_new();
|
|
4618
|
-
rb_cNodeSubclass[
|
|
4619
|
-
rb_iv_set(
|
|
4620
|
-
rb_iv_set(
|
|
4621
|
-
rb_define_singleton_method(
|
|
4422
|
+
rb_cNodeSubclass[NODE_IFUNC] = rb_cIFUNC;
|
|
4423
|
+
rb_iv_set(rb_cIFUNC, "__member__", members);
|
|
4424
|
+
rb_iv_set(rb_cIFUNC, "__type__", INT2NUM(NODE_IFUNC));
|
|
4425
|
+
rb_define_singleton_method(rb_cIFUNC, "members", node_s_members, 0);
|
|
4622
4426
|
|
|
4623
|
-
/* Document-method:
|
|
4624
|
-
*
|
|
4427
|
+
/* Document-method: cfnc
|
|
4428
|
+
* a pointer to the C function to which to yield
|
|
4625
4429
|
*/
|
|
4626
|
-
rb_define_method(
|
|
4627
|
-
rb_ary_push(members, rb_str_new2("
|
|
4430
|
+
rb_define_method(rb_cIFUNC, "cfnc", node_cfnc, 0);
|
|
4431
|
+
rb_ary_push(members, rb_str_new2("cfnc"));
|
|
4432
|
+
|
|
4433
|
+
/* Document-method: tval
|
|
4434
|
+
* the user-specified data to be passed as the second argument to
|
|
4435
|
+
* cfnc
|
|
4436
|
+
*/
|
|
4437
|
+
rb_define_method(rb_cIFUNC, "tval", node_tval, 0);
|
|
4438
|
+
rb_ary_push(members, rb_str_new2("tval"));
|
|
4439
|
+
|
|
4440
|
+
/* Document-method: state
|
|
4441
|
+
* always 0
|
|
4442
|
+
*/
|
|
4443
|
+
rb_define_method(rb_cIFUNC, "state", node_state, 0);
|
|
4444
|
+
rb_ary_push(members, rb_str_new2("state"));
|
|
4628
4445
|
}
|
|
4629
4446
|
|
|
4630
|
-
/* Document-class: Node::
|
|
4631
|
-
* Represents an
|
|
4632
|
-
*
|
|
4447
|
+
/* Document-class: Node::ITER
|
|
4448
|
+
* Represents an iteration loop, e.g.:
|
|
4449
|
+
* iter do |*args|
|
|
4450
|
+
* assign args to var
|
|
4451
|
+
* body
|
|
4452
|
+
* end
|
|
4633
4453
|
*
|
|
4634
|
-
*
|
|
4635
|
-
*
|
|
4454
|
+
* A new block is created so that dynamic variables created inside the
|
|
4455
|
+
* loop do not persist once the loop has terminated.
|
|
4456
|
+
*
|
|
4457
|
+
* If the iter node is a POSTEXE node, indicates that the expression
|
|
4458
|
+
* should be evaluated when the program terminates.
|
|
4636
4459
|
*/
|
|
4637
4460
|
{
|
|
4638
|
-
VALUE
|
|
4461
|
+
VALUE rb_cITER = rb_define_class_under(rb_cNode, "ITER", rb_cNode);
|
|
4639
4462
|
members = rb_ary_new();
|
|
4640
|
-
rb_cNodeSubclass[
|
|
4641
|
-
rb_iv_set(
|
|
4642
|
-
rb_iv_set(
|
|
4643
|
-
rb_define_singleton_method(
|
|
4463
|
+
rb_cNodeSubclass[NODE_ITER] = rb_cITER;
|
|
4464
|
+
rb_iv_set(rb_cITER, "__member__", members);
|
|
4465
|
+
rb_iv_set(rb_cITER, "__type__", INT2NUM(NODE_ITER));
|
|
4466
|
+
rb_define_singleton_method(rb_cITER, "members", node_s_members, 0);
|
|
4644
4467
|
|
|
4645
4468
|
/* Document-method: body
|
|
4646
|
-
*
|
|
4469
|
+
* the body of the loop
|
|
4647
4470
|
*/
|
|
4648
|
-
rb_define_method(
|
|
4471
|
+
rb_define_method(rb_cITER, "body", node_body, 0);
|
|
4649
4472
|
rb_ary_push(members, rb_str_new2("body"));
|
|
4650
|
-
}
|
|
4651
4473
|
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4659
|
-
|
|
4660
|
-
|
|
4661
|
-
|
|
4662
|
-
|
|
4663
|
-
|
|
4664
|
-
|
|
4474
|
+
/* Document-method: iter
|
|
4475
|
+
* an expression which calls the desired iteration method, usually
|
|
4476
|
+
* recv.each
|
|
4477
|
+
*/
|
|
4478
|
+
rb_define_method(rb_cITER, "iter", node_iter, 0);
|
|
4479
|
+
rb_ary_push(members, rb_str_new2("iter"));
|
|
4480
|
+
|
|
4481
|
+
/* Document-method: var
|
|
4482
|
+
* an assignment node which assigns the next value in the sequence
|
|
4483
|
+
* to a variable, which may or may not be local. May also be a
|
|
4484
|
+
* multiple assignment.
|
|
4485
|
+
*/
|
|
4486
|
+
rb_define_method(rb_cITER, "var", node_var, 0);
|
|
4487
|
+
rb_ary_push(members, rb_str_new2("var"));
|
|
4488
|
+
}
|
|
4489
|
+
|
|
4490
|
+
/* Document-class: Node::IVAR
|
|
4491
|
+
* A placeholder for an attribute reader method, which can added to a
|
|
4492
|
+
* class by using attr_reader:
|
|
4493
|
+
* attr_reader :attribute
|
|
4494
|
+
* Its writer counterpart is ATTRSET.
|
|
4665
4495
|
*/
|
|
4666
4496
|
{
|
|
4667
|
-
VALUE
|
|
4497
|
+
VALUE rb_cIVAR = rb_define_class_under(rb_cNode, "IVAR", rb_cNode);
|
|
4668
4498
|
members = rb_ary_new();
|
|
4669
|
-
rb_cNodeSubclass[
|
|
4670
|
-
rb_iv_set(
|
|
4671
|
-
rb_iv_set(
|
|
4672
|
-
rb_define_singleton_method(
|
|
4499
|
+
rb_cNodeSubclass[NODE_IVAR] = rb_cIVAR;
|
|
4500
|
+
rb_iv_set(rb_cIVAR, "__member__", members);
|
|
4501
|
+
rb_iv_set(rb_cIVAR, "__type__", INT2NUM(NODE_IVAR));
|
|
4502
|
+
rb_define_singleton_method(rb_cIVAR, "members", node_s_members, 0);
|
|
4503
|
+
|
|
4504
|
+
/* Document-method: vid
|
|
4505
|
+
* the name of the attribute, with a leading '@' sign
|
|
4506
|
+
*/
|
|
4507
|
+
rb_define_method(rb_cIVAR, "vid", node_vid, 0);
|
|
4508
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
4673
4509
|
}
|
|
4674
4510
|
|
|
4675
|
-
/* Document-class: Node::
|
|
4676
|
-
* Represents
|
|
4677
|
-
* Evaluation of this node converts its argument to an array by calling
|
|
4678
|
-
* \#to_ary on the argument.
|
|
4511
|
+
/* Document-class: Node::LASGN
|
|
4512
|
+
* Represents local variable assignment.
|
|
4679
4513
|
*/
|
|
4680
4514
|
{
|
|
4681
|
-
VALUE
|
|
4515
|
+
VALUE rb_cLASGN = rb_define_class_under(rb_cNode, "LASGN", rb_cNode);
|
|
4682
4516
|
members = rb_ary_new();
|
|
4683
|
-
rb_cNodeSubclass[
|
|
4684
|
-
rb_iv_set(
|
|
4685
|
-
rb_iv_set(
|
|
4686
|
-
rb_define_singleton_method(
|
|
4517
|
+
rb_cNodeSubclass[NODE_LASGN] = rb_cLASGN;
|
|
4518
|
+
rb_iv_set(rb_cLASGN, "__member__", members);
|
|
4519
|
+
rb_iv_set(rb_cLASGN, "__type__", INT2NUM(NODE_LASGN));
|
|
4520
|
+
rb_define_singleton_method(rb_cLASGN, "members", node_s_members, 0);
|
|
4687
4521
|
|
|
4688
|
-
/* Document-method:
|
|
4689
|
-
* the
|
|
4522
|
+
/* Document-method: value
|
|
4523
|
+
* the value to assign to the local variable
|
|
4690
4524
|
*/
|
|
4691
|
-
rb_define_method(
|
|
4692
|
-
rb_ary_push(members, rb_str_new2("
|
|
4525
|
+
rb_define_method(rb_cLASGN, "value", node_value, 0);
|
|
4526
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
4527
|
+
|
|
4528
|
+
/* Document-method: vid
|
|
4529
|
+
* the name of the local variable
|
|
4530
|
+
*/
|
|
4531
|
+
rb_define_method(rb_cLASGN, "vid", node_vid, 0);
|
|
4532
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
4533
|
+
rb_define_method(rb_cLASGN, "cnt", node_cnt, 0);
|
|
4534
|
+
rb_ary_push(members, rb_str_new2("cnt"));
|
|
4693
4535
|
}
|
|
4694
4536
|
|
|
4695
|
-
/* Document-class: Node::
|
|
4696
|
-
* Represents a
|
|
4697
|
-
*
|
|
4698
|
-
* The given string is executed in a subshell and the output from its
|
|
4699
|
-
* stdout stored in a string.
|
|
4537
|
+
/* Document-class: Node::LIT
|
|
4538
|
+
* Represents a literal object. The result of the expression is the
|
|
4539
|
+
* object contained in this node.
|
|
4700
4540
|
*/
|
|
4701
4541
|
{
|
|
4702
|
-
VALUE
|
|
4542
|
+
VALUE rb_cLIT = rb_define_class_under(rb_cNode, "LIT", rb_cNode);
|
|
4703
4543
|
members = rb_ary_new();
|
|
4704
|
-
rb_cNodeSubclass[
|
|
4705
|
-
rb_iv_set(
|
|
4706
|
-
rb_iv_set(
|
|
4707
|
-
rb_define_singleton_method(
|
|
4544
|
+
rb_cNodeSubclass[NODE_LIT] = rb_cLIT;
|
|
4545
|
+
rb_iv_set(rb_cLIT, "__member__", members);
|
|
4546
|
+
rb_iv_set(rb_cLIT, "__type__", INT2NUM(NODE_LIT));
|
|
4547
|
+
rb_define_singleton_method(rb_cLIT, "members", node_s_members, 0);
|
|
4708
4548
|
|
|
4709
4549
|
/* Document-method: lit
|
|
4710
|
-
* the
|
|
4550
|
+
* the object
|
|
4711
4551
|
*/
|
|
4712
|
-
rb_define_method(
|
|
4552
|
+
rb_define_method(rb_cLIT, "lit", node_lit, 0);
|
|
4713
4553
|
rb_ary_push(members, rb_str_new2("lit"));
|
|
4714
4554
|
}
|
|
4715
4555
|
|
|
4716
|
-
/* Document-class: Node::
|
|
4717
|
-
* Represents
|
|
4718
|
-
* examples).
|
|
4719
|
-
*
|
|
4720
|
-
* If the head node of the rescue expresion raises an exception, the
|
|
4721
|
-
* resq node is evaluated. The resq node is of type RESBDOY.
|
|
4722
|
-
*
|
|
4723
|
-
* As it is evaluated, the type of the exception is tested against the
|
|
4724
|
-
* class(es) listed in the args node. If there is a match, the body
|
|
4725
|
-
* node is evaluated, otherwise the head node is evaluated. The head
|
|
4726
|
-
* node is either another RESBDOY node or false (0).
|
|
4556
|
+
/* Document-class: Node::LVAR
|
|
4557
|
+
* Represents local variable retrieval.
|
|
4727
4558
|
*/
|
|
4728
4559
|
{
|
|
4729
|
-
VALUE
|
|
4560
|
+
VALUE rb_cLVAR = rb_define_class_under(rb_cNode, "LVAR", rb_cNode);
|
|
4730
4561
|
members = rb_ary_new();
|
|
4731
|
-
rb_cNodeSubclass[
|
|
4732
|
-
rb_iv_set(
|
|
4733
|
-
rb_iv_set(
|
|
4734
|
-
rb_define_singleton_method(
|
|
4735
|
-
|
|
4736
|
-
/* Document-method: head
|
|
4737
|
-
* the next rescue
|
|
4738
|
-
*/
|
|
4739
|
-
rb_define_method(rb_cRESBODY, "head", node_head, 0);
|
|
4740
|
-
rb_ary_push(members, rb_str_new2("head"));
|
|
4741
|
-
|
|
4742
|
-
/* Document-method: args
|
|
4743
|
-
* the expression type to match against
|
|
4744
|
-
*/
|
|
4745
|
-
rb_define_method(rb_cRESBODY, "args", node_args, 0);
|
|
4746
|
-
rb_ary_push(members, rb_str_new2("args"));
|
|
4562
|
+
rb_cNodeSubclass[NODE_LVAR] = rb_cLVAR;
|
|
4563
|
+
rb_iv_set(rb_cLVAR, "__member__", members);
|
|
4564
|
+
rb_iv_set(rb_cLVAR, "__type__", INT2NUM(NODE_LVAR));
|
|
4565
|
+
rb_define_singleton_method(rb_cLVAR, "members", node_s_members, 0);
|
|
4747
4566
|
|
|
4748
|
-
/* Document-method:
|
|
4749
|
-
* the
|
|
4567
|
+
/* Document-method: vid
|
|
4568
|
+
* the name of the local variable to retrieve.
|
|
4750
4569
|
*/
|
|
4751
|
-
rb_define_method(
|
|
4752
|
-
rb_ary_push(members, rb_str_new2("
|
|
4570
|
+
rb_define_method(rb_cLVAR, "vid", node_vid, 0);
|
|
4571
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
4572
|
+
rb_define_method(rb_cLVAR, "cnt", node_cnt, 0);
|
|
4573
|
+
rb_ary_push(members, rb_str_new2("cnt"));
|
|
4753
4574
|
}
|
|
4754
4575
|
|
|
4755
|
-
/* Document-class: Node::
|
|
4756
|
-
* Represents
|
|
4757
|
-
* alias 1st 2nd
|
|
4758
|
-
* where 2nd is the name of an existing method and 1st is the name of
|
|
4759
|
-
* its new alias.
|
|
4576
|
+
/* Document-class: Node::MASGN
|
|
4577
|
+
* Represents multiple assignment.
|
|
4760
4578
|
*/
|
|
4761
4579
|
{
|
|
4762
|
-
VALUE
|
|
4580
|
+
VALUE rb_cMASGN = rb_define_class_under(rb_cNode, "MASGN", rb_cNode);
|
|
4763
4581
|
members = rb_ary_new();
|
|
4764
|
-
rb_cNodeSubclass[
|
|
4765
|
-
rb_iv_set(
|
|
4766
|
-
rb_iv_set(
|
|
4767
|
-
rb_define_singleton_method(
|
|
4768
|
-
rb_define_method(rb_cALIAS, "first", node_1st, 0);
|
|
4769
|
-
rb_ary_push(members, rb_str_new2("first"));
|
|
4770
|
-
rb_define_method(rb_cALIAS, "second", node_2nd, 0);
|
|
4771
|
-
rb_ary_push(members, rb_str_new2("second"));
|
|
4772
|
-
}
|
|
4582
|
+
rb_cNodeSubclass[NODE_MASGN] = rb_cMASGN;
|
|
4583
|
+
rb_iv_set(rb_cMASGN, "__member__", members);
|
|
4584
|
+
rb_iv_set(rb_cMASGN, "__type__", INT2NUM(NODE_MASGN));
|
|
4585
|
+
rb_define_singleton_method(rb_cMASGN, "members", node_s_members, 0);
|
|
4773
4586
|
|
|
4774
|
-
|
|
4775
|
-
|
|
4776
|
-
|
|
4777
|
-
|
|
4778
|
-
|
|
4779
|
-
{
|
|
4780
|
-
VALUE rb_cARRAY = rb_define_class_under(rb_cNode, "ARRAY", rb_cNode);
|
|
4781
|
-
members = rb_ary_new();
|
|
4782
|
-
rb_cNodeSubclass[NODE_ARRAY] = rb_cARRAY;
|
|
4783
|
-
rb_iv_set(rb_cARRAY, "__member__", members);
|
|
4784
|
-
rb_iv_set(rb_cARRAY, "__type__", INT2NUM(NODE_ARRAY));
|
|
4785
|
-
rb_define_singleton_method(rb_cARRAY, "members", node_s_members, 0);
|
|
4587
|
+
/* Document-method: args
|
|
4588
|
+
* TODO
|
|
4589
|
+
*/
|
|
4590
|
+
rb_define_method(rb_cMASGN, "args", node_args, 0);
|
|
4591
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
4786
4592
|
|
|
4787
4593
|
/* Document-method: head
|
|
4788
|
-
*
|
|
4594
|
+
* TODO
|
|
4789
4595
|
*/
|
|
4790
|
-
rb_define_method(
|
|
4596
|
+
rb_define_method(rb_cMASGN, "head", node_head, 0);
|
|
4791
4597
|
rb_ary_push(members, rb_str_new2("head"));
|
|
4792
|
-
rb_define_method(rb_cARRAY, "alen", node_alen, 0);
|
|
4793
|
-
rb_ary_push(members, rb_str_new2("alen"));
|
|
4794
4598
|
|
|
4795
|
-
/* Document-method:
|
|
4796
|
-
*
|
|
4599
|
+
/* Document-method: value
|
|
4600
|
+
* TODO
|
|
4797
4601
|
*/
|
|
4798
|
-
rb_define_method(
|
|
4799
|
-
rb_ary_push(members, rb_str_new2("
|
|
4602
|
+
rb_define_method(rb_cMASGN, "value", node_value, 0);
|
|
4603
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
4800
4604
|
}
|
|
4801
4605
|
|
|
4802
|
-
/* Document-class: Node::
|
|
4803
|
-
* Represents
|
|
4804
|
-
*
|
|
4805
|
-
*
|
|
4606
|
+
/* Document-class: Node::MATCH
|
|
4607
|
+
* Represents a regular expression match in a conditional, e.g.:
|
|
4608
|
+
* if /lit/ then
|
|
4609
|
+
* ...
|
|
4610
|
+
* end
|
|
4611
|
+
*
|
|
4612
|
+
* This expression is equivalent to:
|
|
4613
|
+
* if /lit/ =~ $_ then
|
|
4614
|
+
* ...
|
|
4615
|
+
* end
|
|
4616
|
+
*
|
|
4617
|
+
* On ruby 1.8 and newer, this type of expression causes ruby to emit a
|
|
4618
|
+
* warning, unless script is running with -e.
|
|
4806
4619
|
*/
|
|
4807
4620
|
{
|
|
4808
|
-
VALUE
|
|
4621
|
+
VALUE rb_cMATCH = rb_define_class_under(rb_cNode, "MATCH", rb_cNode);
|
|
4809
4622
|
members = rb_ary_new();
|
|
4810
|
-
rb_cNodeSubclass[
|
|
4811
|
-
rb_iv_set(
|
|
4812
|
-
rb_iv_set(
|
|
4813
|
-
rb_define_singleton_method(
|
|
4814
|
-
|
|
4815
|
-
|
|
4623
|
+
rb_cNodeSubclass[NODE_MATCH] = rb_cMATCH;
|
|
4624
|
+
rb_iv_set(rb_cMATCH, "__member__", members);
|
|
4625
|
+
rb_iv_set(rb_cMATCH, "__type__", INT2NUM(NODE_MATCH));
|
|
4626
|
+
rb_define_singleton_method(rb_cMATCH, "members", node_s_members, 0);
|
|
4627
|
+
|
|
4628
|
+
/* Document-method: lit
|
|
4629
|
+
* the regular expression to use in the condition.
|
|
4630
|
+
*/
|
|
4631
|
+
rb_define_method(rb_cMATCH, "lit", node_lit, 0);
|
|
4632
|
+
rb_ary_push(members, rb_str_new2("lit"));
|
|
4633
|
+
|
|
4634
|
+
/* Document-method: value
|
|
4635
|
+
* the value to compare against
|
|
4636
|
+
*/
|
|
4637
|
+
rb_define_method(rb_cMATCH, "value", node_value, 0);
|
|
4638
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
4816
4639
|
}
|
|
4817
4640
|
|
|
4818
|
-
/* Document-class: Node::
|
|
4819
|
-
* Represents
|
|
4641
|
+
/* Document-class: Node::MATCH2
|
|
4642
|
+
* Represents a match in a conditional with a regular expression using
|
|
4643
|
+
* interpolation, e.g.:
|
|
4644
|
+
* if /#{recv}/ then
|
|
4645
|
+
* ...
|
|
4646
|
+
* end
|
|
4647
|
+
*
|
|
4648
|
+
* which is equivalent to:
|
|
4649
|
+
* if /#{recv}/ =~ $_ then
|
|
4650
|
+
* ...
|
|
4651
|
+
* end
|
|
4652
|
+
*
|
|
4653
|
+
* or a match with a regular expression on the left hand side and an
|
|
4654
|
+
* expression on the right hand side, e.g.:
|
|
4655
|
+
*
|
|
4656
|
+
* /recv/ =~ value
|
|
4820
4657
|
*/
|
|
4821
4658
|
{
|
|
4822
|
-
VALUE
|
|
4659
|
+
VALUE rb_cMATCH2 = rb_define_class_under(rb_cNode, "MATCH2", rb_cNode);
|
|
4823
4660
|
members = rb_ary_new();
|
|
4824
|
-
rb_cNodeSubclass[
|
|
4825
|
-
rb_iv_set(
|
|
4826
|
-
rb_iv_set(
|
|
4827
|
-
rb_define_singleton_method(
|
|
4661
|
+
rb_cNodeSubclass[NODE_MATCH2] = rb_cMATCH2;
|
|
4662
|
+
rb_iv_set(rb_cMATCH2, "__member__", members);
|
|
4663
|
+
rb_iv_set(rb_cMATCH2, "__type__", INT2NUM(NODE_MATCH2));
|
|
4664
|
+
rb_define_singleton_method(rb_cMATCH2, "members", node_s_members, 0);
|
|
4828
4665
|
|
|
4829
4666
|
/* Document-method: value
|
|
4830
|
-
*
|
|
4667
|
+
* the expression on the right hand side of the match operator, or
|
|
4668
|
+
* an expression returning $_ if there is nothing on the right hand
|
|
4669
|
+
* side
|
|
4831
4670
|
*/
|
|
4832
|
-
rb_define_method(
|
|
4671
|
+
rb_define_method(rb_cMATCH2, "value", node_value, 0);
|
|
4833
4672
|
rb_ary_push(members, rb_str_new2("value"));
|
|
4834
4673
|
|
|
4835
|
-
/* Document-method:
|
|
4836
|
-
* the
|
|
4674
|
+
/* Document-method: recv
|
|
4675
|
+
* the regular expression on the left hand side of the match
|
|
4676
|
+
* operator
|
|
4837
4677
|
*/
|
|
4838
|
-
rb_define_method(
|
|
4839
|
-
rb_ary_push(members, rb_str_new2("
|
|
4840
|
-
rb_define_method(rb_cGASGN, "entry", node_entry, 0);
|
|
4841
|
-
rb_ary_push(members, rb_str_new2("entry"));
|
|
4678
|
+
rb_define_method(rb_cMATCH2, "recv", node_recv, 0);
|
|
4679
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
4842
4680
|
}
|
|
4843
4681
|
|
|
4844
|
-
/* Document-class: Node::
|
|
4845
|
-
* Represents
|
|
4682
|
+
/* Document-class: Node::MATCH3
|
|
4683
|
+
* Represents a regular expression match of the form:
|
|
4684
|
+
* recv =~ /value/
|
|
4846
4685
|
*
|
|
4847
|
-
*
|
|
4686
|
+
* where recv is an expression that returns an object and value is a
|
|
4687
|
+
* regular expression literal.
|
|
4848
4688
|
*/
|
|
4849
4689
|
{
|
|
4850
|
-
VALUE
|
|
4690
|
+
VALUE rb_cMATCH3 = rb_define_class_under(rb_cNode, "MATCH3", rb_cNode);
|
|
4851
4691
|
members = rb_ary_new();
|
|
4852
|
-
rb_cNodeSubclass[
|
|
4853
|
-
rb_iv_set(
|
|
4854
|
-
rb_iv_set(
|
|
4855
|
-
rb_define_singleton_method(
|
|
4692
|
+
rb_cNodeSubclass[NODE_MATCH3] = rb_cMATCH3;
|
|
4693
|
+
rb_iv_set(rb_cMATCH3, "__member__", members);
|
|
4694
|
+
rb_iv_set(rb_cMATCH3, "__type__", INT2NUM(NODE_MATCH3));
|
|
4695
|
+
rb_define_singleton_method(rb_cMATCH3, "members", node_s_members, 0);
|
|
4856
4696
|
|
|
4857
4697
|
/* Document-method: value
|
|
4858
|
-
*
|
|
4859
|
-
* variable
|
|
4698
|
+
* the right hand side of the match
|
|
4860
4699
|
*/
|
|
4861
|
-
rb_define_method(
|
|
4700
|
+
rb_define_method(rb_cMATCH3, "value", node_value, 0);
|
|
4862
4701
|
rb_ary_push(members, rb_str_new2("value"));
|
|
4863
4702
|
|
|
4864
|
-
/* Document-method:
|
|
4865
|
-
* the
|
|
4703
|
+
/* Document-method: recv
|
|
4704
|
+
* the left hand side of the match
|
|
4866
4705
|
*/
|
|
4867
|
-
rb_define_method(
|
|
4868
|
-
rb_ary_push(members, rb_str_new2("
|
|
4706
|
+
rb_define_method(rb_cMATCH3, "recv", node_recv, 0);
|
|
4707
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
4869
4708
|
}
|
|
4870
4709
|
|
|
4871
|
-
/* Document-class: Node::
|
|
4872
|
-
*
|
|
4873
|
-
*
|
|
4874
|
-
*
|
|
4875
|
-
*
|
|
4710
|
+
/* Document-class: Node::MEMO
|
|
4711
|
+
* A node used for temporary storage.
|
|
4712
|
+
*
|
|
4713
|
+
* It is used by the rb_protect function so that the cont_protect
|
|
4714
|
+
* variable can be restored when the function returns.
|
|
4715
|
+
*
|
|
4716
|
+
* It is also used in the Enumerable module and by autoload as a
|
|
4717
|
+
* temporary placeholder.
|
|
4718
|
+
*
|
|
4719
|
+
* It should never be evaluated as an expression.
|
|
4720
|
+
*
|
|
4721
|
+
* It holds up to three nodes or ruby objects, depending on how it is
|
|
4722
|
+
* used.
|
|
4876
4723
|
*/
|
|
4877
4724
|
{
|
|
4878
|
-
VALUE
|
|
4725
|
+
VALUE rb_cMEMO = rb_define_class_under(rb_cNode, "MEMO", rb_cNode);
|
|
4879
4726
|
members = rb_ary_new();
|
|
4880
|
-
rb_cNodeSubclass[
|
|
4881
|
-
rb_iv_set(
|
|
4882
|
-
rb_iv_set(
|
|
4883
|
-
rb_define_singleton_method(
|
|
4727
|
+
rb_cNodeSubclass[NODE_MEMO] = rb_cMEMO;
|
|
4728
|
+
rb_iv_set(rb_cMEMO, "__member__", members);
|
|
4729
|
+
rb_iv_set(rb_cMEMO, "__type__", INT2NUM(NODE_MEMO));
|
|
4730
|
+
rb_define_singleton_method(rb_cMEMO, "members", node_s_members, 0);
|
|
4731
|
+
}
|
|
4884
4732
|
|
|
4885
|
-
|
|
4886
|
-
|
|
4887
|
-
|
|
4888
|
-
|
|
4889
|
-
|
|
4733
|
+
/* Document-class: Node::METHOD
|
|
4734
|
+
* A placeholder for a method entry in a class's method table.
|
|
4735
|
+
*/
|
|
4736
|
+
{
|
|
4737
|
+
VALUE rb_cMETHOD = rb_define_class_under(rb_cNode, "METHOD", rb_cNode);
|
|
4738
|
+
members = rb_ary_new();
|
|
4739
|
+
rb_cNodeSubclass[NODE_METHOD] = rb_cMETHOD;
|
|
4740
|
+
rb_iv_set(rb_cMETHOD, "__member__", members);
|
|
4741
|
+
rb_iv_set(rb_cMETHOD, "__type__", INT2NUM(NODE_METHOD));
|
|
4742
|
+
rb_define_singleton_method(rb_cMETHOD, "members", node_s_members, 0);
|
|
4890
4743
|
|
|
4891
|
-
/* Document-method:
|
|
4892
|
-
* the
|
|
4744
|
+
/* Document-method: body
|
|
4745
|
+
* the body of the method
|
|
4893
4746
|
*/
|
|
4894
|
-
rb_define_method(
|
|
4895
|
-
rb_ary_push(members, rb_str_new2("
|
|
4747
|
+
rb_define_method(rb_cMETHOD, "body", node_body, 0);
|
|
4748
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
4896
4749
|
|
|
4897
|
-
/* Document-method:
|
|
4898
|
-
* the
|
|
4750
|
+
/* Document-method: noex
|
|
4751
|
+
* the method's flags
|
|
4899
4752
|
*/
|
|
4900
|
-
rb_define_method(
|
|
4901
|
-
rb_ary_push(members, rb_str_new2("
|
|
4753
|
+
rb_define_method(rb_cMETHOD, "noex", node_noex, 0);
|
|
4754
|
+
rb_ary_push(members, rb_str_new2("noex"));
|
|
4902
4755
|
}
|
|
4903
4756
|
|
|
4904
|
-
/* Document-class: Node::
|
|
4905
|
-
* Represents
|
|
4906
|
-
*
|
|
4757
|
+
/* Document-class: Node::MODULE
|
|
4758
|
+
* Represents a module definition, e.g.:
|
|
4759
|
+
* module cpath
|
|
4760
|
+
* body
|
|
4761
|
+
* end
|
|
4762
|
+
*
|
|
4763
|
+
* The module definition is evaluated in a new lexical scope.
|
|
4764
|
+
*
|
|
4765
|
+
* The result of the expression is the last expression evaluated in the
|
|
4766
|
+
* body.
|
|
4907
4767
|
*/
|
|
4908
4768
|
{
|
|
4909
|
-
VALUE
|
|
4769
|
+
VALUE rb_cMODULE = rb_define_class_under(rb_cNode, "MODULE", rb_cNode);
|
|
4910
4770
|
members = rb_ary_new();
|
|
4911
|
-
rb_cNodeSubclass[
|
|
4912
|
-
rb_iv_set(
|
|
4913
|
-
rb_iv_set(
|
|
4914
|
-
rb_define_singleton_method(
|
|
4771
|
+
rb_cNodeSubclass[NODE_MODULE] = rb_cMODULE;
|
|
4772
|
+
rb_iv_set(rb_cMODULE, "__member__", members);
|
|
4773
|
+
rb_iv_set(rb_cMODULE, "__type__", INT2NUM(NODE_MODULE));
|
|
4774
|
+
rb_define_singleton_method(rb_cMODULE, "members", node_s_members, 0);
|
|
4915
4775
|
|
|
4916
|
-
/* Document-method:
|
|
4917
|
-
* the
|
|
4776
|
+
/* Document-method: cpath
|
|
4777
|
+
* the name of the module to define
|
|
4918
4778
|
*/
|
|
4919
|
-
rb_define_method(
|
|
4920
|
-
rb_ary_push(members, rb_str_new2("
|
|
4779
|
+
rb_define_method(rb_cMODULE, "cpath", node_cpath, 0);
|
|
4780
|
+
rb_ary_push(members, rb_str_new2("cpath"));
|
|
4781
|
+
|
|
4782
|
+
/* Document-method: body
|
|
4783
|
+
* the body of the module definition
|
|
4784
|
+
*/
|
|
4785
|
+
rb_define_method(rb_cMODULE, "body", node_body, 0);
|
|
4786
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
4921
4787
|
}
|
|
4922
4788
|
|
|
4923
4789
|
/* Document-class: Node::NEWLINE
|
|
@@ -4939,6 +4805,52 @@ void define_node_subclass_methods()
|
|
|
4939
4805
|
rb_ary_push(members, rb_str_new2("next"));
|
|
4940
4806
|
}
|
|
4941
4807
|
|
|
4808
|
+
/* Document-class: Node::NEXT
|
|
4809
|
+
* Represents the 'next' keyword.
|
|
4810
|
+
* Causes control to be transferred to the end of the loop, causing the
|
|
4811
|
+
* next value in the sequence to be retrieved.
|
|
4812
|
+
*/
|
|
4813
|
+
{
|
|
4814
|
+
VALUE rb_cNEXT = rb_define_class_under(rb_cNode, "NEXT", rb_cNode);
|
|
4815
|
+
members = rb_ary_new();
|
|
4816
|
+
rb_cNodeSubclass[NODE_NEXT] = rb_cNEXT;
|
|
4817
|
+
rb_iv_set(rb_cNEXT, "__member__", members);
|
|
4818
|
+
rb_iv_set(rb_cNEXT, "__type__", INT2NUM(NODE_NEXT));
|
|
4819
|
+
rb_define_singleton_method(rb_cNEXT, "members", node_s_members, 0);
|
|
4820
|
+
rb_define_method(rb_cNEXT, "stts", node_stts, 0);
|
|
4821
|
+
rb_ary_push(members, rb_str_new2("stts"));
|
|
4822
|
+
}
|
|
4823
|
+
|
|
4824
|
+
/* Document-class: Node::NIL
|
|
4825
|
+
* Represents the keyword 'nil'.
|
|
4826
|
+
*/
|
|
4827
|
+
{
|
|
4828
|
+
VALUE rb_cNIL = rb_define_class_under(rb_cNode, "NIL", rb_cNode);
|
|
4829
|
+
members = rb_ary_new();
|
|
4830
|
+
rb_cNodeSubclass[NODE_NIL] = rb_cNIL;
|
|
4831
|
+
rb_iv_set(rb_cNIL, "__member__", members);
|
|
4832
|
+
rb_iv_set(rb_cNIL, "__type__", INT2NUM(NODE_NIL));
|
|
4833
|
+
rb_define_singleton_method(rb_cNIL, "members", node_s_members, 0);
|
|
4834
|
+
}
|
|
4835
|
+
|
|
4836
|
+
/* Document-class: Node::NOT
|
|
4837
|
+
* Represents a logical negation.
|
|
4838
|
+
*/
|
|
4839
|
+
{
|
|
4840
|
+
VALUE rb_cNOT = rb_define_class_under(rb_cNode, "NOT", rb_cNode);
|
|
4841
|
+
members = rb_ary_new();
|
|
4842
|
+
rb_cNodeSubclass[NODE_NOT] = rb_cNOT;
|
|
4843
|
+
rb_iv_set(rb_cNOT, "__member__", members);
|
|
4844
|
+
rb_iv_set(rb_cNOT, "__type__", INT2NUM(NODE_NOT));
|
|
4845
|
+
rb_define_singleton_method(rb_cNOT, "members", node_s_members, 0);
|
|
4846
|
+
|
|
4847
|
+
/* Document-method: body
|
|
4848
|
+
* the value to negate.
|
|
4849
|
+
*/
|
|
4850
|
+
rb_define_method(rb_cNOT, "body", node_body, 0);
|
|
4851
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
4852
|
+
}
|
|
4853
|
+
|
|
4942
4854
|
/* Document-class: Node::NTH_REF
|
|
4943
4855
|
* Represents the nth match data item, e.g. $1, $2, etc.
|
|
4944
4856
|
*/
|
|
@@ -4963,310 +4875,367 @@ void define_node_subclass_methods()
|
|
|
4963
4875
|
rb_ary_push(members, rb_str_new2("cnt"));
|
|
4964
4876
|
}
|
|
4965
4877
|
|
|
4966
|
-
/* Document-class: Node::
|
|
4967
|
-
* Represents
|
|
4968
|
-
*
|
|
4969
|
-
* Creates a range which does not exclude the range end.
|
|
4970
|
-
*/
|
|
4971
|
-
{
|
|
4972
|
-
VALUE rb_cDOT2 = rb_define_class_under(rb_cNode, "DOT2", rb_cNode);
|
|
4973
|
-
members = rb_ary_new();
|
|
4974
|
-
rb_cNodeSubclass[NODE_DOT2] = rb_cDOT2;
|
|
4975
|
-
rb_iv_set(rb_cDOT2, "__member__", members);
|
|
4976
|
-
rb_iv_set(rb_cDOT2, "__type__", INT2NUM(NODE_DOT2));
|
|
4977
|
-
rb_define_singleton_method(rb_cDOT2, "members", node_s_members, 0);
|
|
4978
|
-
|
|
4979
|
-
/* Document-method: beg
|
|
4980
|
-
* the beginning of the range
|
|
4981
|
-
*/
|
|
4982
|
-
rb_define_method(rb_cDOT2, "beg", node_beg, 0);
|
|
4983
|
-
rb_ary_push(members, rb_str_new2("beg"));
|
|
4984
|
-
|
|
4985
|
-
/* Document-method: end
|
|
4986
|
-
* the end of the range
|
|
4987
|
-
*/
|
|
4988
|
-
rb_define_method(rb_cDOT2, "end", node_end, 0);
|
|
4989
|
-
rb_ary_push(members, rb_str_new2("end"));
|
|
4990
|
-
rb_define_method(rb_cDOT2, "state", node_state, 0);
|
|
4991
|
-
rb_ary_push(members, rb_str_new2("state"));
|
|
4992
|
-
}
|
|
4993
|
-
|
|
4994
|
-
/* Document-class: Node::GVAR
|
|
4995
|
-
* Represents global variable retrieval.
|
|
4878
|
+
/* Document-class: Node::OPT_N
|
|
4879
|
+
* Represents the top-level loop when the -n or -p options are used
|
|
4880
|
+
* with the interpreter.
|
|
4996
4881
|
*/
|
|
4997
4882
|
{
|
|
4998
|
-
VALUE
|
|
4883
|
+
VALUE rb_cOPT_N = rb_define_class_under(rb_cNode, "OPT_N", rb_cNode);
|
|
4999
4884
|
members = rb_ary_new();
|
|
5000
|
-
rb_cNodeSubclass[
|
|
5001
|
-
rb_iv_set(
|
|
5002
|
-
rb_iv_set(
|
|
5003
|
-
rb_define_singleton_method(
|
|
4885
|
+
rb_cNodeSubclass[NODE_OPT_N] = rb_cOPT_N;
|
|
4886
|
+
rb_iv_set(rb_cOPT_N, "__member__", members);
|
|
4887
|
+
rb_iv_set(rb_cOPT_N, "__type__", INT2NUM(NODE_OPT_N));
|
|
4888
|
+
rb_define_singleton_method(rb_cOPT_N, "members", node_s_members, 0);
|
|
5004
4889
|
|
|
5005
|
-
/* Document-method:
|
|
5006
|
-
* the
|
|
4890
|
+
/* Document-method: body
|
|
4891
|
+
* the body of the loop
|
|
5007
4892
|
*/
|
|
5008
|
-
rb_define_method(
|
|
5009
|
-
rb_ary_push(members, rb_str_new2("
|
|
5010
|
-
rb_define_method(rb_cGVAR, "entry", node_entry, 0);
|
|
5011
|
-
rb_ary_push(members, rb_str_new2("entry"));
|
|
4893
|
+
rb_define_method(rb_cOPT_N, "body", node_body, 0);
|
|
4894
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
5012
4895
|
}
|
|
5013
4896
|
|
|
5014
|
-
/* Document-class: Node::
|
|
5015
|
-
* Represents
|
|
5016
|
-
*
|
|
5017
|
-
*
|
|
4897
|
+
/* Document-class: Node::OP_ASGN1
|
|
4898
|
+
* Represents bracket assignment of the form:
|
|
4899
|
+
* recv[index] += value or
|
|
4900
|
+
* recv[index] ||= value or
|
|
4901
|
+
* recv[index] &&= value.
|
|
4902
|
+
*
|
|
4903
|
+
* The index is obtained from args.body.
|
|
4904
|
+
*
|
|
4905
|
+
* The value is obtained from args.head.
|
|
4906
|
+
*
|
|
4907
|
+
* In the case of ||=, mid will be 0. The rhs will be equal to the
|
|
4908
|
+
* result of evaluating args.head if the lhs is false, otherwise the
|
|
4909
|
+
* rhs will be equal to lhs.
|
|
4910
|
+
*
|
|
4911
|
+
* In the case of &&=, mid will be 1. The rhs will be equal to the lhs
|
|
4912
|
+
* if lhs is false, otherwise the rhs will be equal to the result of
|
|
4913
|
+
* evaluating args.head. In all other cases, mid will be the name of
|
|
4914
|
+
* the method to call to calculate value, such that the expression is
|
|
4915
|
+
* equivalent to:
|
|
4916
|
+
* recv[args.body] = recv[args.body].mid(args.head)
|
|
4917
|
+
*
|
|
4918
|
+
* In no case does ruby short-circuit the assignment.
|
|
5018
4919
|
*/
|
|
5019
4920
|
{
|
|
5020
|
-
VALUE
|
|
4921
|
+
VALUE rb_cOP_ASGN1 = rb_define_class_under(rb_cNode, "OP_ASGN1", rb_cNode);
|
|
5021
4922
|
members = rb_ary_new();
|
|
5022
|
-
rb_cNodeSubclass[
|
|
5023
|
-
rb_iv_set(
|
|
5024
|
-
rb_iv_set(
|
|
5025
|
-
rb_define_singleton_method(
|
|
4923
|
+
rb_cNodeSubclass[NODE_OP_ASGN1] = rb_cOP_ASGN1;
|
|
4924
|
+
rb_iv_set(rb_cOP_ASGN1, "__member__", members);
|
|
4925
|
+
rb_iv_set(rb_cOP_ASGN1, "__type__", INT2NUM(NODE_OP_ASGN1));
|
|
4926
|
+
rb_define_singleton_method(rb_cOP_ASGN1, "members", node_s_members, 0);
|
|
5026
4927
|
|
|
5027
|
-
/* Document-method:
|
|
5028
|
-
* the
|
|
4928
|
+
/* Document-method: args
|
|
4929
|
+
* the arguments to the assigment
|
|
5029
4930
|
*/
|
|
5030
|
-
rb_define_method(
|
|
5031
|
-
rb_ary_push(members, rb_str_new2("
|
|
4931
|
+
rb_define_method(rb_cOP_ASGN1, "args", node_args, 0);
|
|
4932
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
5032
4933
|
|
|
5033
|
-
/* Document-method:
|
|
5034
|
-
* the
|
|
4934
|
+
/* Document-method: mid
|
|
4935
|
+
* 0, 1, or the name a method to call to calculate the value of the
|
|
4936
|
+
* rhs
|
|
5035
4937
|
*/
|
|
5036
|
-
rb_define_method(
|
|
5037
|
-
rb_ary_push(members, rb_str_new2("
|
|
5038
|
-
|
|
5039
|
-
|
|
4938
|
+
rb_define_method(rb_cOP_ASGN1, "mid", node_mid, 0);
|
|
4939
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
4940
|
+
|
|
4941
|
+
/* Document-method: recv
|
|
4942
|
+
* the receiver of the assignment
|
|
4943
|
+
*/
|
|
4944
|
+
rb_define_method(rb_cOP_ASGN1, "recv", node_recv, 0);
|
|
4945
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
5040
4946
|
}
|
|
5041
4947
|
|
|
5042
|
-
/* Document-class: Node::
|
|
5043
|
-
* Represents
|
|
4948
|
+
/* Document-class: Node::OP_ASGN2
|
|
4949
|
+
* Represents attribute assignment of the form:
|
|
4950
|
+
* recv.attr op value
|
|
4951
|
+
*
|
|
4952
|
+
* where recv is the receiver of the attr method, attr is the attribute
|
|
4953
|
+
* to which to assign, op is an assignment operation (e.g. +=), and
|
|
4954
|
+
* value is the value to assign to the attribute.
|
|
4955
|
+
*
|
|
4956
|
+
* The 'next' member of this class is also of type OP_ASGN2, though it
|
|
4957
|
+
* has different members than its parent. This child node is
|
|
4958
|
+
* documented under OP_ASGN2_ARG.
|
|
5044
4959
|
*/
|
|
5045
4960
|
{
|
|
5046
|
-
VALUE
|
|
4961
|
+
VALUE rb_cOP_ASGN2 = rb_define_class_under(rb_cNode, "OP_ASGN2", rb_cNode);
|
|
5047
4962
|
members = rb_ary_new();
|
|
5048
|
-
rb_cNodeSubclass[
|
|
5049
|
-
rb_iv_set(
|
|
5050
|
-
rb_iv_set(
|
|
5051
|
-
rb_define_singleton_method(
|
|
4963
|
+
rb_cNodeSubclass[NODE_OP_ASGN2] = rb_cOP_ASGN2;
|
|
4964
|
+
rb_iv_set(rb_cOP_ASGN2, "__member__", members);
|
|
4965
|
+
rb_iv_set(rb_cOP_ASGN2, "__type__", INT2NUM(NODE_OP_ASGN2));
|
|
4966
|
+
rb_define_singleton_method(rb_cOP_ASGN2, "members", node_s_members, 0);
|
|
5052
4967
|
|
|
5053
4968
|
/* Document-method: value
|
|
5054
|
-
*
|
|
5055
|
-
* variable
|
|
4969
|
+
* the value to assign to the attribute
|
|
5056
4970
|
*/
|
|
5057
|
-
rb_define_method(
|
|
4971
|
+
rb_define_method(rb_cOP_ASGN2, "value", node_value, 0);
|
|
5058
4972
|
rb_ary_push(members, rb_str_new2("value"));
|
|
5059
4973
|
|
|
5060
|
-
/* Document-method:
|
|
5061
|
-
*
|
|
4974
|
+
/* Document-method: next
|
|
4975
|
+
* another node of type OP_ASGN2 which contains more information
|
|
4976
|
+
* about the assignment operation than can fit in this node alone
|
|
5062
4977
|
*/
|
|
5063
|
-
rb_define_method(
|
|
5064
|
-
rb_ary_push(members, rb_str_new2("
|
|
4978
|
+
rb_define_method(rb_cOP_ASGN2, "next", node_next, 0);
|
|
4979
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
4980
|
+
|
|
4981
|
+
/* Document-method: recv
|
|
4982
|
+
* the receiver of the attribute
|
|
4983
|
+
*/
|
|
4984
|
+
rb_define_method(rb_cOP_ASGN2, "recv", node_recv, 0);
|
|
4985
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
5065
4986
|
}
|
|
5066
4987
|
|
|
5067
|
-
/* Document-class: Node::
|
|
5068
|
-
*
|
|
5069
|
-
*
|
|
5070
|
-
*
|
|
5071
|
-
* variable lookup.
|
|
5072
|
-
*
|
|
5073
|
-
* It should never be evaluated as an expression.
|
|
4988
|
+
/* Document-class: Node::OP_ASGN2_ARG
|
|
4989
|
+
* Actually a node of type OP_ASGN2, this is a placeholder for
|
|
4990
|
+
* additional information about the assignment than can fit in a single
|
|
4991
|
+
* OP_ASGN2 node.
|
|
5074
4992
|
*/
|
|
5075
4993
|
{
|
|
5076
|
-
VALUE
|
|
4994
|
+
VALUE rb_cOP_ASGN2_ARG = rb_define_class_under(rb_cNode, "OP_ASGN2_ARG", rb_cNode);
|
|
5077
4995
|
members = rb_ary_new();
|
|
5078
|
-
rb_cNodeSubclass[
|
|
5079
|
-
rb_iv_set(
|
|
5080
|
-
rb_iv_set(
|
|
5081
|
-
rb_define_singleton_method(
|
|
4996
|
+
rb_cNodeSubclass[NODE_OP_ASGN2_ARG] = rb_cOP_ASGN2_ARG;
|
|
4997
|
+
rb_iv_set(rb_cOP_ASGN2_ARG, "__member__", members);
|
|
4998
|
+
rb_iv_set(rb_cOP_ASGN2_ARG, "__type__", INT2NUM(NODE_OP_ASGN2_ARG));
|
|
4999
|
+
rb_define_singleton_method(rb_cOP_ASGN2_ARG, "members", node_s_members, 0);
|
|
5082
5000
|
|
|
5083
|
-
/* Document-method:
|
|
5084
|
-
*
|
|
5001
|
+
/* Document-method: vid
|
|
5002
|
+
* The method to call on the receiver to retrieve the attribute
|
|
5085
5003
|
*/
|
|
5086
|
-
rb_define_method(
|
|
5087
|
-
rb_ary_push(members, rb_str_new2("
|
|
5004
|
+
rb_define_method(rb_cOP_ASGN2_ARG, "vid", node_vid, 0);
|
|
5005
|
+
rb_ary_push(members, rb_str_new2("vid"));
|
|
5088
5006
|
|
|
5089
|
-
/* Document-method:
|
|
5090
|
-
* the
|
|
5007
|
+
/* Document-method: aid
|
|
5008
|
+
* The method to call on the receiver to set the attribute
|
|
5091
5009
|
*/
|
|
5092
|
-
rb_define_method(
|
|
5093
|
-
rb_ary_push(members, rb_str_new2("
|
|
5010
|
+
rb_define_method(rb_cOP_ASGN2_ARG, "aid", node_aid, 0);
|
|
5011
|
+
rb_ary_push(members, rb_str_new2("aid"));
|
|
5094
5012
|
|
|
5095
|
-
/* Document-method:
|
|
5096
|
-
*
|
|
5013
|
+
/* Document-method: mid
|
|
5014
|
+
* The operation to apply to the attribute before setting it. May
|
|
5015
|
+
* be 0 (false) to indicate "logical or" or 1 (nil) to indicate
|
|
5016
|
+
* "logical and".
|
|
5097
5017
|
*/
|
|
5098
|
-
rb_define_method(
|
|
5099
|
-
rb_ary_push(members, rb_str_new2("
|
|
5018
|
+
rb_define_method(rb_cOP_ASGN2_ARG, "mid", node_mid, 0);
|
|
5019
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
5100
5020
|
}
|
|
5101
5021
|
|
|
5102
|
-
/* Document-class: Node::
|
|
5103
|
-
* Represents
|
|
5104
|
-
*
|
|
5105
|
-
*
|
|
5106
|
-
*
|
|
5107
|
-
*
|
|
5108
|
-
*
|
|
5022
|
+
/* Document-class: Node::OP_ASGN_AND
|
|
5023
|
+
* Represents an expression of the form:
|
|
5024
|
+
* recv &&= value
|
|
5025
|
+
* Ruby will evaluate the expression on the left hand side of the
|
|
5026
|
+
* assignment; if it is true, then it will assign the result of the
|
|
5027
|
+
* expression on the right hand side to the receiver on the left hand
|
|
5028
|
+
* side.
|
|
5109
5029
|
*/
|
|
5110
5030
|
{
|
|
5111
|
-
VALUE
|
|
5031
|
+
VALUE rb_cOP_ASGN_AND = rb_define_class_under(rb_cNode, "OP_ASGN_AND", rb_cNode);
|
|
5112
5032
|
members = rb_ary_new();
|
|
5113
|
-
rb_cNodeSubclass[
|
|
5114
|
-
rb_iv_set(
|
|
5115
|
-
rb_iv_set(
|
|
5116
|
-
rb_define_singleton_method(
|
|
5033
|
+
rb_cNodeSubclass[NODE_OP_ASGN_AND] = rb_cOP_ASGN_AND;
|
|
5034
|
+
rb_iv_set(rb_cOP_ASGN_AND, "__member__", members);
|
|
5035
|
+
rb_iv_set(rb_cOP_ASGN_AND, "__type__", INT2NUM(NODE_OP_ASGN_AND));
|
|
5036
|
+
rb_define_singleton_method(rb_cOP_ASGN_AND, "members", node_s_members, 0);
|
|
5117
5037
|
|
|
5118
|
-
/* Document-method:
|
|
5119
|
-
* the
|
|
5038
|
+
/* Document-method: value
|
|
5039
|
+
* an expression representing the assignment that should be
|
|
5040
|
+
* performed if the left hand side is true
|
|
5120
5041
|
*/
|
|
5121
|
-
rb_define_method(
|
|
5122
|
-
rb_ary_push(members, rb_str_new2("
|
|
5042
|
+
rb_define_method(rb_cOP_ASGN_AND, "value", node_value, 0);
|
|
5043
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
5044
|
+
|
|
5045
|
+
/* Document-method: recv
|
|
5046
|
+
* an expression representing the left hand side of the assignment
|
|
5047
|
+
*/
|
|
5048
|
+
rb_define_method(rb_cOP_ASGN_AND, "recv", node_recv, 0);
|
|
5049
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
5123
5050
|
}
|
|
5124
5051
|
|
|
5125
|
-
/* Document-class: Node::
|
|
5126
|
-
* Represents
|
|
5127
|
-
*
|
|
5128
|
-
*
|
|
5129
|
-
*
|
|
5130
|
-
*
|
|
5131
|
-
*
|
|
5132
|
-
*
|
|
5133
|
-
* The result of the expression is the last expression evaluated in the
|
|
5134
|
-
* body.
|
|
5052
|
+
/* Document-class: Node::OP_ASGN_OR
|
|
5053
|
+
* Represents an expression of the form:
|
|
5054
|
+
* recv ||= value
|
|
5055
|
+
* Ruby will evaluate the expression on the left hand side. If it is
|
|
5056
|
+
* undefined, nil, or false, then ruby will evaluate the expression on
|
|
5057
|
+
* the right hand side and assign it to recv. The expression will
|
|
5058
|
+
* short-circuit if recv is defined and true (non-false, non-nil).
|
|
5135
5059
|
*/
|
|
5136
5060
|
{
|
|
5137
|
-
VALUE
|
|
5061
|
+
VALUE rb_cOP_ASGN_OR = rb_define_class_under(rb_cNode, "OP_ASGN_OR", rb_cNode);
|
|
5138
5062
|
members = rb_ary_new();
|
|
5139
|
-
rb_cNodeSubclass[
|
|
5140
|
-
rb_iv_set(
|
|
5141
|
-
rb_iv_set(
|
|
5142
|
-
rb_define_singleton_method(
|
|
5063
|
+
rb_cNodeSubclass[NODE_OP_ASGN_OR] = rb_cOP_ASGN_OR;
|
|
5064
|
+
rb_iv_set(rb_cOP_ASGN_OR, "__member__", members);
|
|
5065
|
+
rb_iv_set(rb_cOP_ASGN_OR, "__type__", INT2NUM(NODE_OP_ASGN_OR));
|
|
5066
|
+
rb_define_singleton_method(rb_cOP_ASGN_OR, "members", node_s_members, 0);
|
|
5143
5067
|
|
|
5144
|
-
/* Document-method:
|
|
5145
|
-
*
|
|
5068
|
+
/* Document-method: aid
|
|
5069
|
+
* if this indicator is nonzero, ruby will check to see if the
|
|
5070
|
+
* provided expression is defined, otherwise it will assume that
|
|
5071
|
+
* the provided expression is defined.
|
|
5146
5072
|
*/
|
|
5147
|
-
rb_define_method(
|
|
5148
|
-
rb_ary_push(members, rb_str_new2("
|
|
5073
|
+
rb_define_method(rb_cOP_ASGN_OR, "aid", node_aid, 0);
|
|
5074
|
+
rb_ary_push(members, rb_str_new2("aid"));
|
|
5149
5075
|
|
|
5150
|
-
/* Document-method:
|
|
5151
|
-
* the
|
|
5076
|
+
/* Document-method: value
|
|
5077
|
+
* the right hand side of the assignment
|
|
5152
5078
|
*/
|
|
5153
|
-
rb_define_method(
|
|
5154
|
-
rb_ary_push(members, rb_str_new2("
|
|
5079
|
+
rb_define_method(rb_cOP_ASGN_OR, "value", node_value, 0);
|
|
5080
|
+
rb_ary_push(members, rb_str_new2("value"));
|
|
5081
|
+
|
|
5082
|
+
/* Document-method: recv
|
|
5083
|
+
* the receiver of the assignment
|
|
5084
|
+
*/
|
|
5085
|
+
rb_define_method(rb_cOP_ASGN_OR, "recv", node_recv, 0);
|
|
5086
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
5155
5087
|
}
|
|
5156
5088
|
|
|
5157
|
-
/* Document-class: Node::
|
|
5158
|
-
* Represents a
|
|
5159
|
-
*
|
|
5160
|
-
*
|
|
5161
|
-
*
|
|
5162
|
-
*
|
|
5163
|
-
* This is equivalent to:
|
|
5164
|
-
* iter.each do |*args|
|
|
5165
|
-
* assign args to var
|
|
5166
|
-
* body
|
|
5167
|
-
* end
|
|
5168
|
-
*
|
|
5169
|
-
* Except that a new block is not created.
|
|
5089
|
+
/* Document-class: Node::OR
|
|
5090
|
+
* Represents a logical 'or' of the form:
|
|
5091
|
+
* first || second
|
|
5092
|
+
* The expression will short-circuit and yield the result of the left
|
|
5093
|
+
* hand side if it is true, else it will evaluate the right hand side
|
|
5094
|
+
* and use it as the result of the expression.
|
|
5170
5095
|
*/
|
|
5171
5096
|
{
|
|
5172
|
-
VALUE
|
|
5097
|
+
VALUE rb_cOR = rb_define_class_under(rb_cNode, "OR", rb_cNode);
|
|
5173
5098
|
members = rb_ary_new();
|
|
5174
|
-
rb_cNodeSubclass[
|
|
5175
|
-
rb_iv_set(
|
|
5176
|
-
rb_iv_set(
|
|
5177
|
-
rb_define_singleton_method(
|
|
5178
|
-
|
|
5179
|
-
/* Document-method: body
|
|
5180
|
-
* the body of the loop
|
|
5181
|
-
*/
|
|
5182
|
-
rb_define_method(rb_cFOR, "body", node_body, 0);
|
|
5183
|
-
rb_ary_push(members, rb_str_new2("body"));
|
|
5099
|
+
rb_cNodeSubclass[NODE_OR] = rb_cOR;
|
|
5100
|
+
rb_iv_set(rb_cOR, "__member__", members);
|
|
5101
|
+
rb_iv_set(rb_cOR, "__type__", INT2NUM(NODE_OR));
|
|
5102
|
+
rb_define_singleton_method(rb_cOR, "members", node_s_members, 0);
|
|
5184
5103
|
|
|
5185
|
-
/* Document-method:
|
|
5186
|
-
* the
|
|
5104
|
+
/* Document-method: first
|
|
5105
|
+
* the expression on the left hand side
|
|
5187
5106
|
*/
|
|
5188
|
-
rb_define_method(
|
|
5189
|
-
rb_ary_push(members, rb_str_new2("
|
|
5107
|
+
rb_define_method(rb_cOR, "first", node_1st, 0);
|
|
5108
|
+
rb_ary_push(members, rb_str_new2("first"));
|
|
5190
5109
|
|
|
5191
|
-
/* Document-method:
|
|
5192
|
-
*
|
|
5193
|
-
* to a variable, which may or may not be local. May also be a
|
|
5194
|
-
* multiple assignment.
|
|
5110
|
+
/* Document-method: second
|
|
5111
|
+
* the expression on the right hand side
|
|
5195
5112
|
*/
|
|
5196
|
-
rb_define_method(
|
|
5197
|
-
rb_ary_push(members, rb_str_new2("
|
|
5113
|
+
rb_define_method(rb_cOR, "second", node_2nd, 0);
|
|
5114
|
+
rb_ary_push(members, rb_str_new2("second"));
|
|
5198
5115
|
}
|
|
5199
5116
|
|
|
5200
|
-
/* Document-class: Node::
|
|
5201
|
-
* Represents
|
|
5117
|
+
/* Document-class: Node::POSTEXE
|
|
5118
|
+
* Represents the END keyword, e.g.:
|
|
5119
|
+
* END { ... }
|
|
5120
|
+
*
|
|
5121
|
+
* Indicating that the enclosing ITER node is to be excecuted only
|
|
5122
|
+
* once, when the program terminates.
|
|
5202
5123
|
*/
|
|
5203
5124
|
{
|
|
5204
|
-
VALUE
|
|
5125
|
+
VALUE rb_cPOSTEXE = rb_define_class_under(rb_cNode, "POSTEXE", rb_cNode);
|
|
5205
5126
|
members = rb_ary_new();
|
|
5206
|
-
rb_cNodeSubclass[
|
|
5207
|
-
rb_iv_set(
|
|
5208
|
-
rb_iv_set(
|
|
5209
|
-
rb_define_singleton_method(
|
|
5127
|
+
rb_cNodeSubclass[NODE_POSTEXE] = rb_cPOSTEXE;
|
|
5128
|
+
rb_iv_set(rb_cPOSTEXE, "__member__", members);
|
|
5129
|
+
rb_iv_set(rb_cPOSTEXE, "__type__", INT2NUM(NODE_POSTEXE));
|
|
5130
|
+
rb_define_singleton_method(rb_cPOSTEXE, "members", node_s_members, 0);
|
|
5131
|
+
}
|
|
5210
5132
|
|
|
5211
|
-
|
|
5212
|
-
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5133
|
+
/* Document-class: Node::REDO
|
|
5134
|
+
* Represents the 'redo' keyword. Causes control to be transferred to
|
|
5135
|
+
* the beginning of the loop. The loop assignment is not repeated.
|
|
5136
|
+
*/
|
|
5137
|
+
{
|
|
5138
|
+
VALUE rb_cREDO = rb_define_class_under(rb_cNode, "REDO", rb_cNode);
|
|
5139
|
+
members = rb_ary_new();
|
|
5140
|
+
rb_cNodeSubclass[NODE_REDO] = rb_cREDO;
|
|
5141
|
+
rb_iv_set(rb_cREDO, "__member__", members);
|
|
5142
|
+
rb_iv_set(rb_cREDO, "__type__", INT2NUM(NODE_REDO));
|
|
5143
|
+
rb_define_singleton_method(rb_cREDO, "members", node_s_members, 0);
|
|
5216
5144
|
}
|
|
5217
5145
|
|
|
5218
|
-
/* Document-class: Node::
|
|
5219
|
-
* Represents a
|
|
5220
|
-
*
|
|
5221
|
-
*
|
|
5222
|
-
*
|
|
5223
|
-
*
|
|
5224
|
-
*
|
|
5146
|
+
/* Document-class: Node::RESBODY
|
|
5147
|
+
* Represents the rescue portion of a rescue expression (see RESCUE for
|
|
5148
|
+
* examples).
|
|
5149
|
+
*
|
|
5150
|
+
* If the head node of the rescue expresion raises an exception, the
|
|
5151
|
+
* resq node is evaluated. The resq node is of type RESBDOY.
|
|
5152
|
+
*
|
|
5153
|
+
* As it is evaluated, the type of the exception is tested against the
|
|
5154
|
+
* class(es) listed in the args node. If there is a match, the body
|
|
5155
|
+
* node is evaluated, otherwise the head node is evaluated. The head
|
|
5156
|
+
* node is either another RESBDOY node or false (0).
|
|
5225
5157
|
*/
|
|
5226
5158
|
{
|
|
5227
|
-
VALUE
|
|
5159
|
+
VALUE rb_cRESBODY = rb_define_class_under(rb_cNode, "RESBODY", rb_cNode);
|
|
5228
5160
|
members = rb_ary_new();
|
|
5229
|
-
rb_cNodeSubclass[
|
|
5230
|
-
rb_iv_set(
|
|
5231
|
-
rb_iv_set(
|
|
5232
|
-
rb_define_singleton_method(
|
|
5161
|
+
rb_cNodeSubclass[NODE_RESBODY] = rb_cRESBODY;
|
|
5162
|
+
rb_iv_set(rb_cRESBODY, "__member__", members);
|
|
5163
|
+
rb_iv_set(rb_cRESBODY, "__type__", INT2NUM(NODE_RESBODY));
|
|
5164
|
+
rb_define_singleton_method(rb_cRESBODY, "members", node_s_members, 0);
|
|
5233
5165
|
|
|
5234
|
-
/* Document-method:
|
|
5235
|
-
*
|
|
5166
|
+
/* Document-method: head
|
|
5167
|
+
* the next rescue
|
|
5236
5168
|
*/
|
|
5237
|
-
rb_define_method(
|
|
5238
|
-
rb_ary_push(members, rb_str_new2("
|
|
5169
|
+
rb_define_method(rb_cRESBODY, "head", node_head, 0);
|
|
5170
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
5239
5171
|
|
|
5240
|
-
/* Document-method:
|
|
5241
|
-
*
|
|
5172
|
+
/* Document-method: args
|
|
5173
|
+
* the expression type to match against
|
|
5242
5174
|
*/
|
|
5243
|
-
rb_define_method(
|
|
5244
|
-
rb_ary_push(members, rb_str_new2("
|
|
5175
|
+
rb_define_method(rb_cRESBODY, "args", node_args, 0);
|
|
5176
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
5177
|
+
|
|
5178
|
+
/* Document-method: body
|
|
5179
|
+
* the expresion to evaluate if the exception type matches
|
|
5180
|
+
*/
|
|
5181
|
+
rb_define_method(rb_cRESBODY, "body", node_body, 0);
|
|
5182
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
5245
5183
|
}
|
|
5246
5184
|
|
|
5247
|
-
/* Document-class: Node::
|
|
5248
|
-
* Represents
|
|
5249
|
-
*
|
|
5250
|
-
*
|
|
5251
|
-
*
|
|
5252
|
-
*
|
|
5253
|
-
*
|
|
5254
|
-
*
|
|
5255
|
-
*
|
|
5185
|
+
/* Document-class: Node::RESCUE
|
|
5186
|
+
* Represents part of a rescue expression of the form:
|
|
5187
|
+
* head rescue expr
|
|
5188
|
+
*
|
|
5189
|
+
* or the longer form:
|
|
5190
|
+
* begin
|
|
5191
|
+
* head
|
|
5192
|
+
* rescue exception
|
|
5193
|
+
* expr
|
|
5194
|
+
* end
|
|
5195
|
+
*
|
|
5196
|
+
* or the form using the else keyword:
|
|
5197
|
+
* begin
|
|
5198
|
+
* head
|
|
5199
|
+
* rescue exception
|
|
5200
|
+
* expr
|
|
5201
|
+
* else
|
|
5202
|
+
* else_expr
|
|
5203
|
+
* end
|
|
5204
|
+
*
|
|
5205
|
+
* The head expression is first evaluated, and if an exception is
|
|
5206
|
+
* raised, evaluates the resq node. If no exception is raised, the
|
|
5207
|
+
* else node is evaluated if it is not false (0).
|
|
5208
|
+
*
|
|
5209
|
+
* The resq node will be a RESBDOY node, which will test the exception
|
|
5210
|
+
* to see if it matches one of the expected types. If it does it will
|
|
5211
|
+
* handle the exception, otherwise it will allow the expression to pass
|
|
5212
|
+
* to the outer scope.
|
|
5256
5213
|
*/
|
|
5257
5214
|
{
|
|
5258
|
-
VALUE
|
|
5215
|
+
VALUE rb_cRESCUE = rb_define_class_under(rb_cNode, "RESCUE", rb_cNode);
|
|
5259
5216
|
members = rb_ary_new();
|
|
5260
|
-
rb_cNodeSubclass[
|
|
5261
|
-
rb_iv_set(
|
|
5262
|
-
rb_iv_set(
|
|
5263
|
-
rb_define_singleton_method(
|
|
5217
|
+
rb_cNodeSubclass[NODE_RESCUE] = rb_cRESCUE;
|
|
5218
|
+
rb_iv_set(rb_cRESCUE, "__member__", members);
|
|
5219
|
+
rb_iv_set(rb_cRESCUE, "__type__", INT2NUM(NODE_RESCUE));
|
|
5220
|
+
rb_define_singleton_method(rb_cRESCUE, "members", node_s_members, 0);
|
|
5264
5221
|
|
|
5265
5222
|
/* Document-method: head
|
|
5266
|
-
*
|
|
5223
|
+
* the body of the block to evaluate
|
|
5267
5224
|
*/
|
|
5268
|
-
rb_define_method(
|
|
5225
|
+
rb_define_method(rb_cRESCUE, "head", node_head, 0);
|
|
5269
5226
|
rb_ary_push(members, rb_str_new2("head"));
|
|
5227
|
+
|
|
5228
|
+
/* Document-method: else
|
|
5229
|
+
* the expression to be evaluated if no exception is raised
|
|
5230
|
+
*/
|
|
5231
|
+
rb_define_method(rb_cRESCUE, "else", node_else, 0);
|
|
5232
|
+
rb_ary_push(members, rb_str_new2("else"));
|
|
5233
|
+
|
|
5234
|
+
/* Document-method: resq
|
|
5235
|
+
* the expression to be evaluated if an exception is raised
|
|
5236
|
+
*/
|
|
5237
|
+
rb_define_method(rb_cRESCUE, "resq", node_resq, 0);
|
|
5238
|
+
rb_ary_push(members, rb_str_new2("resq"));
|
|
5270
5239
|
}
|
|
5271
5240
|
|
|
5272
5241
|
/* Document-class: Node::RETRY
|
|
@@ -5281,14 +5250,30 @@ void define_node_subclass_methods()
|
|
|
5281
5250
|
rb_define_singleton_method(rb_cRETRY, "members", node_s_members, 0);
|
|
5282
5251
|
}
|
|
5283
5252
|
|
|
5284
|
-
/* Document-class: Node::
|
|
5285
|
-
* Represents
|
|
5286
|
-
*
|
|
5287
|
-
*
|
|
5288
|
-
*
|
|
5289
|
-
|
|
5290
|
-
|
|
5291
|
-
|
|
5253
|
+
/* Document-class: Node::RETURN
|
|
5254
|
+
* Represents the 'return' keyword. Evaluation of this node results in
|
|
5255
|
+
* a return from the current method. If no argument is supplied,
|
|
5256
|
+
* returns nil, otherwise returns the result of the supplied
|
|
5257
|
+
* expression.
|
|
5258
|
+
*/
|
|
5259
|
+
{
|
|
5260
|
+
VALUE rb_cRETURN = rb_define_class_under(rb_cNode, "RETURN", rb_cNode);
|
|
5261
|
+
members = rb_ary_new();
|
|
5262
|
+
rb_cNodeSubclass[NODE_RETURN] = rb_cRETURN;
|
|
5263
|
+
rb_iv_set(rb_cRETURN, "__member__", members);
|
|
5264
|
+
rb_iv_set(rb_cRETURN, "__type__", INT2NUM(NODE_RETURN));
|
|
5265
|
+
rb_define_singleton_method(rb_cRETURN, "members", node_s_members, 0);
|
|
5266
|
+
|
|
5267
|
+
/* Document-method: stts
|
|
5268
|
+
* an expression representing the value to return
|
|
5269
|
+
*/
|
|
5270
|
+
rb_define_method(rb_cRETURN, "stts", node_stts, 0);
|
|
5271
|
+
rb_ary_push(members, rb_str_new2("stts"));
|
|
5272
|
+
}
|
|
5273
|
+
|
|
5274
|
+
/* Document-class: Node::SCLASS
|
|
5275
|
+
* Represents the body of a singleton class definition, e.g.:
|
|
5276
|
+
* class << recv
|
|
5292
5277
|
* body
|
|
5293
5278
|
* end
|
|
5294
5279
|
*
|
|
@@ -5298,392 +5283,392 @@ void define_node_subclass_methods()
|
|
|
5298
5283
|
* body.
|
|
5299
5284
|
*/
|
|
5300
5285
|
{
|
|
5301
|
-
VALUE
|
|
5286
|
+
VALUE rb_cSCLASS = rb_define_class_under(rb_cNode, "SCLASS", rb_cNode);
|
|
5302
5287
|
members = rb_ary_new();
|
|
5303
|
-
rb_cNodeSubclass[
|
|
5304
|
-
rb_iv_set(
|
|
5305
|
-
rb_iv_set(
|
|
5306
|
-
rb_define_singleton_method(
|
|
5307
|
-
|
|
5308
|
-
/* Document-method: cpath
|
|
5309
|
-
* the name of the class to define
|
|
5310
|
-
*/
|
|
5311
|
-
rb_define_method(rb_cCLASS, "cpath", node_cpath, 0);
|
|
5312
|
-
rb_ary_push(members, rb_str_new2("cpath"));
|
|
5288
|
+
rb_cNodeSubclass[NODE_SCLASS] = rb_cSCLASS;
|
|
5289
|
+
rb_iv_set(rb_cSCLASS, "__member__", members);
|
|
5290
|
+
rb_iv_set(rb_cSCLASS, "__type__", INT2NUM(NODE_SCLASS));
|
|
5291
|
+
rb_define_singleton_method(rb_cSCLASS, "members", node_s_members, 0);
|
|
5313
5292
|
|
|
5314
5293
|
/* Document-method: body
|
|
5315
5294
|
* the body of the class definition
|
|
5316
5295
|
*/
|
|
5317
|
-
rb_define_method(
|
|
5296
|
+
rb_define_method(rb_cSCLASS, "body", node_body, 0);
|
|
5318
5297
|
rb_ary_push(members, rb_str_new2("body"));
|
|
5319
5298
|
|
|
5320
|
-
/* Document-method:
|
|
5321
|
-
*
|
|
5322
|
-
* base class specified
|
|
5299
|
+
/* Document-method: recv
|
|
5300
|
+
* the object whose singleton class is to be modified
|
|
5323
5301
|
*/
|
|
5324
|
-
rb_define_method(
|
|
5325
|
-
rb_ary_push(members, rb_str_new2("
|
|
5302
|
+
rb_define_method(rb_cSCLASS, "recv", node_recv, 0);
|
|
5303
|
+
rb_ary_push(members, rb_str_new2("recv"));
|
|
5326
5304
|
}
|
|
5327
5305
|
|
|
5328
|
-
/* Document-class: Node::
|
|
5329
|
-
* Represents
|
|
5330
|
-
*
|
|
5331
|
-
*
|
|
5332
|
-
*
|
|
5333
|
-
*
|
|
5334
|
-
*
|
|
5335
|
-
*
|
|
5336
|
-
*
|
|
5337
|
-
*
|
|
5338
|
-
*
|
|
5306
|
+
/* Document-class: Node::SCOPE
|
|
5307
|
+
* Represents a lexical scope.
|
|
5308
|
+
*
|
|
5309
|
+
* A new scope is created when a method is invoked. The scope node
|
|
5310
|
+
* holds information about local variables and arguments to the method.
|
|
5311
|
+
* The first two variables in the local variable table are the implicit
|
|
5312
|
+
* variables $_ and $~.
|
|
5313
|
+
*
|
|
5314
|
+
* The next variables listed in the local variable table are the
|
|
5315
|
+
* arguments to the method. More information about the arguments to
|
|
5316
|
+
* the method are stored in the ARGS node, which will either be the
|
|
5317
|
+
* first node in the scope or the first node in the BLOCK held by the
|
|
5318
|
+
* scope.
|
|
5339
5319
|
*/
|
|
5340
5320
|
{
|
|
5341
|
-
VALUE
|
|
5321
|
+
VALUE rb_cSCOPE = rb_define_class_under(rb_cNode, "SCOPE", rb_cNode);
|
|
5342
5322
|
members = rb_ary_new();
|
|
5343
|
-
rb_cNodeSubclass[
|
|
5344
|
-
rb_iv_set(
|
|
5345
|
-
rb_iv_set(
|
|
5346
|
-
rb_define_singleton_method(
|
|
5323
|
+
rb_cNodeSubclass[NODE_SCOPE] = rb_cSCOPE;
|
|
5324
|
+
rb_iv_set(rb_cSCOPE, "__member__", members);
|
|
5325
|
+
rb_iv_set(rb_cSCOPE, "__type__", INT2NUM(NODE_SCOPE));
|
|
5326
|
+
rb_define_singleton_method(rb_cSCOPE, "members", node_s_members, 0);
|
|
5347
5327
|
|
|
5348
|
-
/* Document-method:
|
|
5349
|
-
* the
|
|
5328
|
+
/* Document-method: tbl
|
|
5329
|
+
* the names of the local variables* next the first expression in
|
|
5330
|
+
* the scope
|
|
5350
5331
|
*/
|
|
5351
|
-
rb_define_method(
|
|
5352
|
-
rb_ary_push(members, rb_str_new2("
|
|
5332
|
+
rb_define_method(rb_cSCOPE, "tbl", node_tbl, 0);
|
|
5333
|
+
rb_ary_push(members, rb_str_new2("tbl"));
|
|
5353
5334
|
|
|
5354
|
-
/* Document-method:
|
|
5355
|
-
*
|
|
5335
|
+
/* Document-method: rval
|
|
5336
|
+
* holds information about which class(es) to search for constants
|
|
5337
|
+
* in this scope
|
|
5356
5338
|
*/
|
|
5357
|
-
rb_define_method(
|
|
5358
|
-
rb_ary_push(members, rb_str_new2("
|
|
5339
|
+
rb_define_method(rb_cSCOPE, "rval", node_rval, 0);
|
|
5340
|
+
rb_ary_push(members, rb_str_new2("rval"));
|
|
5341
|
+
|
|
5342
|
+
/* Document-method: next
|
|
5343
|
+
* the body of the lexical scope
|
|
5344
|
+
*/
|
|
5345
|
+
rb_define_method(rb_cSCOPE, "next", node_next, 0);
|
|
5346
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
5359
5347
|
}
|
|
5360
5348
|
|
|
5361
|
-
/* Document-class: Node::
|
|
5362
|
-
* Represents the keyword '
|
|
5349
|
+
/* Document-class: Node::SELF
|
|
5350
|
+
* Represents the keyword 'self'.
|
|
5363
5351
|
*/
|
|
5364
5352
|
{
|
|
5365
|
-
VALUE
|
|
5353
|
+
VALUE rb_cSELF = rb_define_class_under(rb_cNode, "SELF", rb_cNode);
|
|
5366
5354
|
members = rb_ary_new();
|
|
5367
|
-
rb_cNodeSubclass[
|
|
5368
|
-
rb_iv_set(
|
|
5369
|
-
rb_iv_set(
|
|
5370
|
-
rb_define_singleton_method(
|
|
5355
|
+
rb_cNodeSubclass[NODE_SELF] = rb_cSELF;
|
|
5356
|
+
rb_iv_set(rb_cSELF, "__member__", members);
|
|
5357
|
+
rb_iv_set(rb_cSELF, "__type__", INT2NUM(NODE_SELF));
|
|
5358
|
+
rb_define_singleton_method(rb_cSELF, "members", node_s_members, 0);
|
|
5371
5359
|
}
|
|
5372
5360
|
|
|
5373
|
-
/* Document-class: Node::
|
|
5374
|
-
*
|
|
5375
|
-
*
|
|
5376
|
-
*
|
|
5377
|
-
*
|
|
5361
|
+
/* Document-class: Node::SPLAT
|
|
5362
|
+
* Represents the splat (*) operation as an rvalue, e.g.:
|
|
5363
|
+
* *head
|
|
5364
|
+
* If the argument is an array, returns self.
|
|
5365
|
+
* If the argument is nil, returns [nil].
|
|
5366
|
+
* If the argument is any other value, returns the result of calling #to_a on the
|
|
5367
|
+
* argument.
|
|
5378
5368
|
*/
|
|
5379
5369
|
{
|
|
5380
|
-
VALUE
|
|
5370
|
+
VALUE rb_cSPLAT = rb_define_class_under(rb_cNode, "SPLAT", rb_cNode);
|
|
5381
5371
|
members = rb_ary_new();
|
|
5382
|
-
rb_cNodeSubclass[
|
|
5383
|
-
rb_iv_set(
|
|
5384
|
-
rb_iv_set(
|
|
5385
|
-
rb_define_singleton_method(
|
|
5372
|
+
rb_cNodeSubclass[NODE_SPLAT] = rb_cSPLAT;
|
|
5373
|
+
rb_iv_set(rb_cSPLAT, "__member__", members);
|
|
5374
|
+
rb_iv_set(rb_cSPLAT, "__type__", INT2NUM(NODE_SPLAT));
|
|
5375
|
+
rb_define_singleton_method(rb_cSPLAT, "members", node_s_members, 0);
|
|
5386
5376
|
|
|
5387
|
-
/* Document-method:
|
|
5388
|
-
* the
|
|
5377
|
+
/* Document-method: head
|
|
5378
|
+
* the argument to splat.
|
|
5389
5379
|
*/
|
|
5390
|
-
rb_define_method(
|
|
5391
|
-
rb_ary_push(members, rb_str_new2("
|
|
5380
|
+
rb_define_method(rb_cSPLAT, "head", node_head, 0);
|
|
5381
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
5392
5382
|
}
|
|
5393
5383
|
|
|
5394
|
-
/* Document-class: Node::
|
|
5395
|
-
* Represents
|
|
5384
|
+
/* Document-class: Node::STR
|
|
5385
|
+
* Represents a string object. Duplicates the string stored in the
|
|
5386
|
+
* node.
|
|
5396
5387
|
*/
|
|
5397
5388
|
{
|
|
5398
|
-
VALUE
|
|
5389
|
+
VALUE rb_cSTR = rb_define_class_under(rb_cNode, "STR", rb_cNode);
|
|
5399
5390
|
members = rb_ary_new();
|
|
5400
|
-
rb_cNodeSubclass[
|
|
5401
|
-
rb_iv_set(
|
|
5402
|
-
rb_iv_set(
|
|
5403
|
-
rb_define_singleton_method(
|
|
5391
|
+
rb_cNodeSubclass[NODE_STR] = rb_cSTR;
|
|
5392
|
+
rb_iv_set(rb_cSTR, "__member__", members);
|
|
5393
|
+
rb_iv_set(rb_cSTR, "__type__", INT2NUM(NODE_STR));
|
|
5394
|
+
rb_define_singleton_method(rb_cSTR, "members", node_s_members, 0);
|
|
5404
5395
|
|
|
5405
|
-
/* Document-method:
|
|
5406
|
-
* the
|
|
5396
|
+
/* Document-method: lit
|
|
5397
|
+
* the string to be duplicated
|
|
5407
5398
|
*/
|
|
5408
|
-
rb_define_method(
|
|
5409
|
-
rb_ary_push(members, rb_str_new2("
|
|
5410
|
-
rb_define_method(rb_cLVAR, "cnt", node_cnt, 0);
|
|
5411
|
-
rb_ary_push(members, rb_str_new2("cnt"));
|
|
5399
|
+
rb_define_method(rb_cSTR, "lit", node_lit, 0);
|
|
5400
|
+
rb_ary_push(members, rb_str_new2("lit"));
|
|
5412
5401
|
}
|
|
5413
5402
|
|
|
5414
|
-
/* Document-class: Node::
|
|
5415
|
-
* Represents
|
|
5416
|
-
* interpolation, e.g.:
|
|
5417
|
-
* if /#{recv}/ then
|
|
5418
|
-
* ...
|
|
5419
|
-
* end
|
|
5420
|
-
*
|
|
5421
|
-
* which is equivalent to:
|
|
5422
|
-
* if /#{recv}/ =~ $_ then
|
|
5423
|
-
* ...
|
|
5424
|
-
* end
|
|
5425
|
-
*
|
|
5426
|
-
* or a match with a regular expression on the left hand side and an
|
|
5427
|
-
* expression on the right hand side, e.g.:
|
|
5428
|
-
*
|
|
5429
|
-
* /recv/ =~ value
|
|
5403
|
+
/* Document-class: Node::SUPER
|
|
5404
|
+
* Represents the keyword 'super' when used with parens or with arguments.
|
|
5430
5405
|
*/
|
|
5431
5406
|
{
|
|
5432
|
-
VALUE
|
|
5407
|
+
VALUE rb_cSUPER = rb_define_class_under(rb_cNode, "SUPER", rb_cNode);
|
|
5433
5408
|
members = rb_ary_new();
|
|
5434
|
-
rb_cNodeSubclass[
|
|
5435
|
-
rb_iv_set(
|
|
5436
|
-
rb_iv_set(
|
|
5437
|
-
rb_define_singleton_method(
|
|
5438
|
-
|
|
5439
|
-
/* Document-method: value
|
|
5440
|
-
* the expression on the right hand side of the match operator, or
|
|
5441
|
-
* an expression returning $_ if there is nothing on the right hand
|
|
5442
|
-
* side
|
|
5443
|
-
*/
|
|
5444
|
-
rb_define_method(rb_cMATCH2, "value", node_value, 0);
|
|
5445
|
-
rb_ary_push(members, rb_str_new2("value"));
|
|
5409
|
+
rb_cNodeSubclass[NODE_SUPER] = rb_cSUPER;
|
|
5410
|
+
rb_iv_set(rb_cSUPER, "__member__", members);
|
|
5411
|
+
rb_iv_set(rb_cSUPER, "__type__", INT2NUM(NODE_SUPER));
|
|
5412
|
+
rb_define_singleton_method(rb_cSUPER, "members", node_s_members, 0);
|
|
5446
5413
|
|
|
5447
|
-
/* Document-method:
|
|
5448
|
-
* the
|
|
5449
|
-
* operator
|
|
5414
|
+
/* Document-method: args
|
|
5415
|
+
* the arguments to be passed to the base class
|
|
5450
5416
|
*/
|
|
5451
|
-
rb_define_method(
|
|
5452
|
-
rb_ary_push(members, rb_str_new2("
|
|
5417
|
+
rb_define_method(rb_cSUPER, "args", node_args, 0);
|
|
5418
|
+
rb_ary_push(members, rb_str_new2("args"));
|
|
5453
5419
|
}
|
|
5454
5420
|
|
|
5455
|
-
/* Document-class: Node::
|
|
5456
|
-
* Represents
|
|
5457
|
-
*
|
|
5458
|
-
*
|
|
5459
|
-
*
|
|
5421
|
+
/* Document-class: Node::SVALUE
|
|
5422
|
+
* Represents the collection of multiple values of the right hand side
|
|
5423
|
+
* of an assignment into a single value, for use in single assignment,
|
|
5424
|
+
* e.g.:
|
|
5425
|
+
* lhs = a, b, c
|
|
5426
|
+
* The argument to this node is an Array.
|
|
5427
|
+
* If it is length 0, returns nil.
|
|
5428
|
+
* If it is length 1, returns the first element in the array.
|
|
5429
|
+
* Otherwise, returns the array.
|
|
5460
5430
|
*/
|
|
5461
5431
|
{
|
|
5462
|
-
VALUE
|
|
5432
|
+
VALUE rb_cSVALUE = rb_define_class_under(rb_cNode, "SVALUE", rb_cNode);
|
|
5463
5433
|
members = rb_ary_new();
|
|
5464
|
-
rb_cNodeSubclass[
|
|
5465
|
-
rb_iv_set(
|
|
5466
|
-
rb_iv_set(
|
|
5467
|
-
rb_define_singleton_method(
|
|
5434
|
+
rb_cNodeSubclass[NODE_SVALUE] = rb_cSVALUE;
|
|
5435
|
+
rb_iv_set(rb_cSVALUE, "__member__", members);
|
|
5436
|
+
rb_iv_set(rb_cSVALUE, "__type__", INT2NUM(NODE_SVALUE));
|
|
5437
|
+
rb_define_singleton_method(rb_cSVALUE, "members", node_s_members, 0);
|
|
5468
5438
|
|
|
5469
|
-
/* Document-method:
|
|
5470
|
-
*
|
|
5439
|
+
/* Document-method: head
|
|
5440
|
+
* an expression which returns an Array.
|
|
5471
5441
|
*/
|
|
5472
|
-
rb_define_method(
|
|
5473
|
-
rb_ary_push(members, rb_str_new2("
|
|
5442
|
+
rb_define_method(rb_cSVALUE, "head", node_head, 0);
|
|
5443
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
5444
|
+
}
|
|
5474
5445
|
|
|
5475
|
-
|
|
5476
|
-
|
|
5477
|
-
|
|
5478
|
-
|
|
5479
|
-
|
|
5446
|
+
/* Document-class: Node::TO_ARY
|
|
5447
|
+
* Represents a conversion from one object type to an array type.
|
|
5448
|
+
* Evaluation of this node converts its argument to an array by calling
|
|
5449
|
+
* \#to_ary on the argument.
|
|
5450
|
+
*/
|
|
5451
|
+
{
|
|
5452
|
+
VALUE rb_cTO_ARY = rb_define_class_under(rb_cNode, "TO_ARY", rb_cNode);
|
|
5453
|
+
members = rb_ary_new();
|
|
5454
|
+
rb_cNodeSubclass[NODE_TO_ARY] = rb_cTO_ARY;
|
|
5455
|
+
rb_iv_set(rb_cTO_ARY, "__member__", members);
|
|
5456
|
+
rb_iv_set(rb_cTO_ARY, "__type__", INT2NUM(NODE_TO_ARY));
|
|
5457
|
+
rb_define_singleton_method(rb_cTO_ARY, "members", node_s_members, 0);
|
|
5480
5458
|
|
|
5481
|
-
/* Document-method:
|
|
5482
|
-
* the
|
|
5483
|
-
* to use in the flip-flop expression (usually 2 for $_)
|
|
5459
|
+
/* Document-method: head
|
|
5460
|
+
* the object to convert to an array
|
|
5484
5461
|
*/
|
|
5485
|
-
rb_define_method(
|
|
5486
|
-
rb_ary_push(members, rb_str_new2("
|
|
5462
|
+
rb_define_method(rb_cTO_ARY, "head", node_head, 0);
|
|
5463
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
5487
5464
|
}
|
|
5488
5465
|
|
|
5489
|
-
/* Document-class: Node::
|
|
5490
|
-
* Represents
|
|
5491
|
-
* class is the class in which the containing scope was defined. The
|
|
5492
|
-
* result of the expression is the value of the constant.
|
|
5466
|
+
/* Document-class: Node::TRUE
|
|
5467
|
+
* Represents the keyword 'true'.
|
|
5493
5468
|
*/
|
|
5494
5469
|
{
|
|
5495
|
-
VALUE
|
|
5470
|
+
VALUE rb_cTRUE = rb_define_class_under(rb_cNode, "TRUE", rb_cNode);
|
|
5496
5471
|
members = rb_ary_new();
|
|
5497
|
-
rb_cNodeSubclass[
|
|
5498
|
-
rb_iv_set(
|
|
5499
|
-
rb_iv_set(
|
|
5500
|
-
rb_define_singleton_method(
|
|
5501
|
-
|
|
5502
|
-
/* Document-method: vid
|
|
5503
|
-
* the name of the constant to look up
|
|
5504
|
-
*/
|
|
5505
|
-
rb_define_method(rb_cCONST, "vid", node_vid, 0);
|
|
5506
|
-
rb_ary_push(members, rb_str_new2("vid"));
|
|
5472
|
+
rb_cNodeSubclass[NODE_TRUE] = rb_cTRUE;
|
|
5473
|
+
rb_iv_set(rb_cTRUE, "__member__", members);
|
|
5474
|
+
rb_iv_set(rb_cTRUE, "__type__", INT2NUM(NODE_TRUE));
|
|
5475
|
+
rb_define_singleton_method(rb_cTRUE, "members", node_s_members, 0);
|
|
5507
5476
|
}
|
|
5508
5477
|
|
|
5509
|
-
/* Document-class: Node::
|
|
5510
|
-
*
|
|
5478
|
+
/* Document-class: Node::UNDEF
|
|
5479
|
+
* Represents an expression using the undef keyword, e.g.:
|
|
5480
|
+
* undef :mid
|
|
5481
|
+
*
|
|
5482
|
+
* This causes the method identified by mid in the current class to be
|
|
5483
|
+
* undefined.
|
|
5511
5484
|
*/
|
|
5512
5485
|
{
|
|
5513
|
-
VALUE
|
|
5486
|
+
VALUE rb_cUNDEF = rb_define_class_under(rb_cNode, "UNDEF", rb_cNode);
|
|
5514
5487
|
members = rb_ary_new();
|
|
5515
|
-
rb_cNodeSubclass[
|
|
5516
|
-
rb_iv_set(
|
|
5517
|
-
rb_iv_set(
|
|
5518
|
-
rb_define_singleton_method(
|
|
5488
|
+
rb_cNodeSubclass[NODE_UNDEF] = rb_cUNDEF;
|
|
5489
|
+
rb_iv_set(rb_cUNDEF, "__member__", members);
|
|
5490
|
+
rb_iv_set(rb_cUNDEF, "__type__", INT2NUM(NODE_UNDEF));
|
|
5491
|
+
rb_define_singleton_method(rb_cUNDEF, "members", node_s_members, 0);
|
|
5519
5492
|
|
|
5520
5493
|
/* Document-method: body
|
|
5521
|
-
* the
|
|
5494
|
+
* an expression returning the id of the method to undefine
|
|
5522
5495
|
*/
|
|
5523
|
-
rb_define_method(
|
|
5496
|
+
rb_define_method(rb_cUNDEF, "body", node_body, 0);
|
|
5524
5497
|
rb_ary_push(members, rb_str_new2("body"));
|
|
5525
|
-
|
|
5526
|
-
/* Document-method: noex
|
|
5527
|
-
* the method's flags
|
|
5528
|
-
*/
|
|
5529
|
-
rb_define_method(rb_cMETHOD, "noex", node_noex, 0);
|
|
5530
|
-
rb_ary_push(members, rb_str_new2("noex"));
|
|
5531
5498
|
}
|
|
5532
5499
|
|
|
5533
|
-
/* Document-class: Node::
|
|
5534
|
-
* Represents a
|
|
5535
|
-
*
|
|
5536
|
-
*
|
|
5537
|
-
*
|
|
5538
|
-
* regular expression literal.
|
|
5500
|
+
/* Document-class: Node::UNTIL
|
|
5501
|
+
* Represents a loop constructed with the 'until' keyword, e.g.:
|
|
5502
|
+
* until cond do
|
|
5503
|
+
* body
|
|
5504
|
+
* end
|
|
5539
5505
|
*/
|
|
5540
5506
|
{
|
|
5541
|
-
VALUE
|
|
5507
|
+
VALUE rb_cUNTIL = rb_define_class_under(rb_cNode, "UNTIL", rb_cNode);
|
|
5542
5508
|
members = rb_ary_new();
|
|
5543
|
-
rb_cNodeSubclass[
|
|
5544
|
-
rb_iv_set(
|
|
5545
|
-
rb_iv_set(
|
|
5546
|
-
rb_define_singleton_method(
|
|
5509
|
+
rb_cNodeSubclass[NODE_UNTIL] = rb_cUNTIL;
|
|
5510
|
+
rb_iv_set(rb_cUNTIL, "__member__", members);
|
|
5511
|
+
rb_iv_set(rb_cUNTIL, "__type__", INT2NUM(NODE_UNTIL));
|
|
5512
|
+
rb_define_singleton_method(rb_cUNTIL, "members", node_s_members, 0);
|
|
5547
5513
|
|
|
5548
|
-
/* Document-method:
|
|
5549
|
-
* the
|
|
5514
|
+
/* Document-method: body
|
|
5515
|
+
* the body of the loop
|
|
5550
5516
|
*/
|
|
5551
|
-
rb_define_method(
|
|
5552
|
-
rb_ary_push(members, rb_str_new2("
|
|
5517
|
+
rb_define_method(rb_cUNTIL, "body", node_body, 0);
|
|
5518
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
5553
5519
|
|
|
5554
|
-
/* Document-method:
|
|
5555
|
-
* the
|
|
5520
|
+
/* Document-method: cond
|
|
5521
|
+
* a condition to terminate the loop when it becomes true
|
|
5556
5522
|
*/
|
|
5557
|
-
rb_define_method(
|
|
5558
|
-
rb_ary_push(members, rb_str_new2("
|
|
5523
|
+
rb_define_method(rb_cUNTIL, "cond", node_cond, 0);
|
|
5524
|
+
rb_ary_push(members, rb_str_new2("cond"));
|
|
5525
|
+
rb_define_method(rb_cUNTIL, "state", node_state, 0);
|
|
5526
|
+
rb_ary_push(members, rb_str_new2("state"));
|
|
5559
5527
|
}
|
|
5560
5528
|
|
|
5561
|
-
/* Document-class: Node::
|
|
5562
|
-
* Represents
|
|
5529
|
+
/* Document-class: Node::VALIAS
|
|
5530
|
+
* Represents an alias expression of the form:
|
|
5531
|
+
* alias 1st 2nd
|
|
5532
|
+
* where 2nd is the name of a variable and 1st is the name of its new
|
|
5533
|
+
* alias.
|
|
5563
5534
|
*/
|
|
5564
5535
|
{
|
|
5565
|
-
VALUE
|
|
5536
|
+
VALUE rb_cVALIAS = rb_define_class_under(rb_cNode, "VALIAS", rb_cNode);
|
|
5566
5537
|
members = rb_ary_new();
|
|
5567
|
-
rb_cNodeSubclass[
|
|
5568
|
-
rb_iv_set(
|
|
5569
|
-
rb_iv_set(
|
|
5570
|
-
rb_define_singleton_method(
|
|
5571
|
-
|
|
5572
|
-
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
rb_define_method(rb_cIASGN, "value", node_value, 0);
|
|
5576
|
-
rb_ary_push(members, rb_str_new2("value"));
|
|
5577
|
-
|
|
5578
|
-
/* Document-method: vid
|
|
5579
|
-
* the name of the instance variable, with a leading '@' sign
|
|
5580
|
-
*/
|
|
5581
|
-
rb_define_method(rb_cIASGN, "vid", node_vid, 0);
|
|
5582
|
-
rb_ary_push(members, rb_str_new2("vid"));
|
|
5538
|
+
rb_cNodeSubclass[NODE_VALIAS] = rb_cVALIAS;
|
|
5539
|
+
rb_iv_set(rb_cVALIAS, "__member__", members);
|
|
5540
|
+
rb_iv_set(rb_cVALIAS, "__type__", INT2NUM(NODE_VALIAS));
|
|
5541
|
+
rb_define_singleton_method(rb_cVALIAS, "members", node_s_members, 0);
|
|
5542
|
+
rb_define_method(rb_cVALIAS, "first", node_1st, 0);
|
|
5543
|
+
rb_ary_push(members, rb_str_new2("first"));
|
|
5544
|
+
rb_define_method(rb_cVALIAS, "second", node_2nd, 0);
|
|
5545
|
+
rb_ary_push(members, rb_str_new2("second"));
|
|
5583
5546
|
}
|
|
5584
5547
|
|
|
5585
|
-
/* Document-class: Node::
|
|
5586
|
-
*
|
|
5587
|
-
*
|
|
5588
|
-
* define_method(:name, method(:foo))
|
|
5589
|
-
*
|
|
5590
|
-
* See also BMETHOD.
|
|
5548
|
+
/* Document-class: Node::VCALL
|
|
5549
|
+
* Represents a local variable or a method call without an explicit
|
|
5550
|
+
* receiver, to be determined at run-time.
|
|
5591
5551
|
*/
|
|
5592
5552
|
{
|
|
5593
|
-
VALUE
|
|
5553
|
+
VALUE rb_cVCALL = rb_define_class_under(rb_cNode, "VCALL", rb_cNode);
|
|
5594
5554
|
members = rb_ary_new();
|
|
5595
|
-
rb_cNodeSubclass[
|
|
5596
|
-
rb_iv_set(
|
|
5597
|
-
rb_iv_set(
|
|
5598
|
-
rb_define_singleton_method(
|
|
5555
|
+
rb_cNodeSubclass[NODE_VCALL] = rb_cVCALL;
|
|
5556
|
+
rb_iv_set(rb_cVCALL, "__member__", members);
|
|
5557
|
+
rb_iv_set(rb_cVCALL, "__type__", INT2NUM(NODE_VCALL));
|
|
5558
|
+
rb_define_singleton_method(rb_cVCALL, "members", node_s_members, 0);
|
|
5599
5559
|
|
|
5600
|
-
/* Document-method:
|
|
5601
|
-
* the
|
|
5602
|
-
* body of the method
|
|
5560
|
+
/* Document-method: mid
|
|
5561
|
+
* the name of the variable or method
|
|
5603
5562
|
*/
|
|
5604
|
-
rb_define_method(
|
|
5605
|
-
rb_ary_push(members, rb_str_new2("
|
|
5563
|
+
rb_define_method(rb_cVCALL, "mid", node_mid, 0);
|
|
5564
|
+
rb_ary_push(members, rb_str_new2("mid"));
|
|
5606
5565
|
}
|
|
5607
5566
|
|
|
5608
|
-
/* Document-class: Node::
|
|
5609
|
-
* Represents
|
|
5610
|
-
*
|
|
5567
|
+
/* Document-class: Node::WHEN
|
|
5568
|
+
* Represents either a conditional in a case/end block:
|
|
5569
|
+
* case value
|
|
5570
|
+
* when head
|
|
5571
|
+
* body
|
|
5572
|
+
* next
|
|
5573
|
+
* end
|
|
5574
|
+
*
|
|
5575
|
+
* or the first element of a a case/end block with no conditional:
|
|
5576
|
+
* case
|
|
5577
|
+
* when head
|
|
5611
5578
|
* body
|
|
5579
|
+
* next
|
|
5612
5580
|
* end
|
|
5581
|
+
*
|
|
5582
|
+
* In the first case, value is evaluated and head is evaluated, and
|
|
5583
|
+
* they are compared using head === value. If the result is true, then
|
|
5584
|
+
* body is evaluated and no more when conditions are tried, otherwise
|
|
5585
|
+
* the interpreter evaluates the next node.
|
|
5586
|
+
*
|
|
5587
|
+
* In the second case, head is tested using rtest(value). If the
|
|
5588
|
+
* result is true, then body is evaluated and no more when conditions
|
|
5589
|
+
* are tried, otherwise the interpreter evaluates the next node.
|
|
5590
|
+
*
|
|
5591
|
+
* If the condition evaluates to false and there are no more when
|
|
5592
|
+
* conditions to try, the result of the expression is nil.
|
|
5593
|
+
*
|
|
5594
|
+
* If the next expression to try is not a WHEN node, then it represents
|
|
5595
|
+
* an else element and is evaluated unconditionally.
|
|
5613
5596
|
*/
|
|
5614
5597
|
{
|
|
5615
|
-
VALUE
|
|
5598
|
+
VALUE rb_cWHEN = rb_define_class_under(rb_cNode, "WHEN", rb_cNode);
|
|
5616
5599
|
members = rb_ary_new();
|
|
5617
|
-
rb_cNodeSubclass[
|
|
5618
|
-
rb_iv_set(
|
|
5619
|
-
rb_iv_set(
|
|
5620
|
-
rb_define_singleton_method(
|
|
5600
|
+
rb_cNodeSubclass[NODE_WHEN] = rb_cWHEN;
|
|
5601
|
+
rb_iv_set(rb_cWHEN, "__member__", members);
|
|
5602
|
+
rb_iv_set(rb_cWHEN, "__type__", INT2NUM(NODE_WHEN));
|
|
5603
|
+
rb_define_singleton_method(rb_cWHEN, "members", node_s_members, 0);
|
|
5621
5604
|
|
|
5622
|
-
/* Document-method:
|
|
5623
|
-
*
|
|
5605
|
+
/* Document-method: head
|
|
5606
|
+
* a value to compare against, or a condition to be tested
|
|
5624
5607
|
*/
|
|
5625
|
-
rb_define_method(
|
|
5626
|
-
rb_ary_push(members, rb_str_new2("
|
|
5608
|
+
rb_define_method(rb_cWHEN, "head", node_head, 0);
|
|
5609
|
+
rb_ary_push(members, rb_str_new2("head"));
|
|
5627
5610
|
|
|
5628
|
-
/* Document-method:
|
|
5629
|
-
*
|
|
5611
|
+
/* Document-method: body
|
|
5612
|
+
* an expression to evaluate if the condition evaluates to true
|
|
5630
5613
|
*/
|
|
5631
|
-
rb_define_method(
|
|
5632
|
-
rb_ary_push(members, rb_str_new2("
|
|
5614
|
+
rb_define_method(rb_cWHEN, "body", node_body, 0);
|
|
5615
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
5633
5616
|
|
|
5634
|
-
/* Document-method:
|
|
5635
|
-
* the
|
|
5636
|
-
* to use in the flip-flop expression (usually 2 for $_)
|
|
5617
|
+
/* Document-method: next
|
|
5618
|
+
* the next expression to be evaluated if the condition is false
|
|
5637
5619
|
*/
|
|
5638
|
-
rb_define_method(
|
|
5639
|
-
rb_ary_push(members, rb_str_new2("
|
|
5620
|
+
rb_define_method(rb_cWHEN, "next", node_next, 0);
|
|
5621
|
+
rb_ary_push(members, rb_str_new2("next"));
|
|
5640
5622
|
}
|
|
5641
5623
|
|
|
5642
|
-
/* Document-class: Node::
|
|
5643
|
-
* Represents a
|
|
5644
|
-
*
|
|
5645
|
-
*
|
|
5646
|
-
*
|
|
5647
|
-
* and use it as the result of the expression.
|
|
5624
|
+
/* Document-class: Node::WHILE
|
|
5625
|
+
* Represents a loop constructed with the 'while' keyword, e.g.:
|
|
5626
|
+
* while cond do
|
|
5627
|
+
* body
|
|
5628
|
+
* end
|
|
5648
5629
|
*/
|
|
5649
5630
|
{
|
|
5650
|
-
VALUE
|
|
5631
|
+
VALUE rb_cWHILE = rb_define_class_under(rb_cNode, "WHILE", rb_cNode);
|
|
5651
5632
|
members = rb_ary_new();
|
|
5652
|
-
rb_cNodeSubclass[
|
|
5653
|
-
rb_iv_set(
|
|
5654
|
-
rb_iv_set(
|
|
5655
|
-
rb_define_singleton_method(
|
|
5633
|
+
rb_cNodeSubclass[NODE_WHILE] = rb_cWHILE;
|
|
5634
|
+
rb_iv_set(rb_cWHILE, "__member__", members);
|
|
5635
|
+
rb_iv_set(rb_cWHILE, "__type__", INT2NUM(NODE_WHILE));
|
|
5636
|
+
rb_define_singleton_method(rb_cWHILE, "members", node_s_members, 0);
|
|
5656
5637
|
|
|
5657
|
-
/* Document-method:
|
|
5658
|
-
* the
|
|
5638
|
+
/* Document-method: body
|
|
5639
|
+
* the body of the loop
|
|
5659
5640
|
*/
|
|
5660
|
-
rb_define_method(
|
|
5661
|
-
rb_ary_push(members, rb_str_new2("
|
|
5641
|
+
rb_define_method(rb_cWHILE, "body", node_body, 0);
|
|
5642
|
+
rb_ary_push(members, rb_str_new2("body"));
|
|
5662
5643
|
|
|
5663
|
-
/* Document-method:
|
|
5664
|
-
*
|
|
5644
|
+
/* Document-method: cond
|
|
5645
|
+
* a condition to terminate the loop when it becomes false
|
|
5665
5646
|
*/
|
|
5666
|
-
rb_define_method(
|
|
5667
|
-
rb_ary_push(members, rb_str_new2("
|
|
5647
|
+
rb_define_method(rb_cWHILE, "cond", node_cond, 0);
|
|
5648
|
+
rb_ary_push(members, rb_str_new2("cond"));
|
|
5649
|
+
rb_define_method(rb_cWHILE, "state", node_state, 0);
|
|
5650
|
+
rb_ary_push(members, rb_str_new2("state"));
|
|
5668
5651
|
}
|
|
5669
5652
|
|
|
5670
|
-
/* Document-class: Node::
|
|
5671
|
-
* Represents a
|
|
5672
|
-
*
|
|
5653
|
+
/* Document-class: Node::XSTR
|
|
5654
|
+
* Represents a string object inside backticks, e.g.:
|
|
5655
|
+
* `lit`
|
|
5656
|
+
* The given string is executed in a subshell and the output from its
|
|
5657
|
+
* stdout stored in a string.
|
|
5673
5658
|
*/
|
|
5674
5659
|
{
|
|
5675
|
-
VALUE
|
|
5660
|
+
VALUE rb_cXSTR = rb_define_class_under(rb_cNode, "XSTR", rb_cNode);
|
|
5676
5661
|
members = rb_ary_new();
|
|
5677
|
-
rb_cNodeSubclass[
|
|
5678
|
-
rb_iv_set(
|
|
5679
|
-
rb_iv_set(
|
|
5680
|
-
rb_define_singleton_method(
|
|
5662
|
+
rb_cNodeSubclass[NODE_XSTR] = rb_cXSTR;
|
|
5663
|
+
rb_iv_set(rb_cXSTR, "__member__", members);
|
|
5664
|
+
rb_iv_set(rb_cXSTR, "__type__", INT2NUM(NODE_XSTR));
|
|
5665
|
+
rb_define_singleton_method(rb_cXSTR, "members", node_s_members, 0);
|
|
5681
5666
|
|
|
5682
|
-
/* Document-method:
|
|
5683
|
-
* the
|
|
5667
|
+
/* Document-method: lit
|
|
5668
|
+
* the string to be executed
|
|
5684
5669
|
*/
|
|
5685
|
-
rb_define_method(
|
|
5686
|
-
rb_ary_push(members, rb_str_new2("
|
|
5670
|
+
rb_define_method(rb_cXSTR, "lit", node_lit, 0);
|
|
5671
|
+
rb_ary_push(members, rb_str_new2("lit"));
|
|
5687
5672
|
}
|
|
5688
5673
|
|
|
5689
5674
|
/* Document-class: Node::YIELD
|
|
@@ -5712,20 +5697,35 @@ void define_node_subclass_methods()
|
|
|
5712
5697
|
rb_ary_push(members, rb_str_new2("state"));
|
|
5713
5698
|
}
|
|
5714
5699
|
|
|
5715
|
-
/* Document-class: Node::
|
|
5716
|
-
* Represents
|
|
5700
|
+
/* Document-class: Node::ZARRAY
|
|
5701
|
+
* Represents an array of zero elements. Evalation of this node
|
|
5702
|
+
* creates a new array of length zero.
|
|
5703
|
+
*/
|
|
5704
|
+
{
|
|
5705
|
+
VALUE rb_cZARRAY = rb_define_class_under(rb_cNode, "ZARRAY", rb_cNode);
|
|
5706
|
+
members = rb_ary_new();
|
|
5707
|
+
rb_cNodeSubclass[NODE_ZARRAY] = rb_cZARRAY;
|
|
5708
|
+
rb_iv_set(rb_cZARRAY, "__member__", members);
|
|
5709
|
+
rb_iv_set(rb_cZARRAY, "__type__", INT2NUM(NODE_ZARRAY));
|
|
5710
|
+
rb_define_singleton_method(rb_cZARRAY, "members", node_s_members, 0);
|
|
5711
|
+
}
|
|
5712
|
+
|
|
5713
|
+
/* Document-class: Node::ZSUPER
|
|
5714
|
+
* Represents the keyword 'super' when used without parens nor
|
|
5715
|
+
* arguments. The arguments to the base class method are obtained from
|
|
5716
|
+
* the arguments passed to the current method, which are store in the
|
|
5717
|
+
* current frame.
|
|
5717
5718
|
*
|
|
5718
|
-
*
|
|
5719
|
+
* Can also be a placeholder for a method when its implementation is
|
|
5720
|
+
* deferred to the base class.
|
|
5719
5721
|
*/
|
|
5720
5722
|
{
|
|
5721
|
-
VALUE
|
|
5723
|
+
VALUE rb_cZSUPER = rb_define_class_under(rb_cNode, "ZSUPER", rb_cNode);
|
|
5722
5724
|
members = rb_ary_new();
|
|
5723
|
-
rb_cNodeSubclass[
|
|
5724
|
-
rb_iv_set(
|
|
5725
|
-
rb_iv_set(
|
|
5726
|
-
rb_define_singleton_method(
|
|
5727
|
-
rb_define_method(rb_cBEGIN, "body", node_body, 0);
|
|
5728
|
-
rb_ary_push(members, rb_str_new2("body"));
|
|
5725
|
+
rb_cNodeSubclass[NODE_ZSUPER] = rb_cZSUPER;
|
|
5726
|
+
rb_iv_set(rb_cZSUPER, "__member__", members);
|
|
5727
|
+
rb_iv_set(rb_cZSUPER, "__type__", INT2NUM(NODE_ZSUPER));
|
|
5728
|
+
rb_define_singleton_method(rb_cZSUPER, "members", node_s_members, 0);
|
|
5729
5729
|
}
|
|
5730
5730
|
}
|
|
5731
5731
|
|