ruby-internal 0.6.0 → 0.7.0

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