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