prism 0.28.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -1
- data/CONTRIBUTING.md +0 -4
- data/README.md +1 -0
- data/config.yml +95 -26
- data/docs/fuzzing.md +1 -1
- data/docs/ripper_translation.md +22 -0
- data/ext/prism/api_node.c +70 -52
- data/ext/prism/extconf.rb +27 -23
- data/ext/prism/extension.c +107 -372
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +170 -102
- data/include/prism/diagnostic.h +18 -3
- data/include/prism/node.h +0 -21
- data/include/prism/parser.h +23 -25
- data/include/prism/regexp.h +17 -8
- data/include/prism/static_literals.h +3 -2
- data/include/prism/util/pm_char.h +1 -2
- data/include/prism/util/pm_constant_pool.h +0 -8
- data/include/prism/util/pm_integer.h +16 -9
- data/include/prism/util/pm_string.h +0 -8
- data/include/prism/version.h +2 -2
- data/include/prism.h +0 -11
- data/lib/prism/compiler.rb +3 -0
- data/lib/prism/desugar_compiler.rb +4 -4
- data/lib/prism/dispatcher.rb +14 -0
- data/lib/prism/dot_visitor.rb +54 -35
- data/lib/prism/dsl.rb +23 -18
- data/lib/prism/ffi.rb +25 -4
- data/lib/prism/inspect_visitor.rb +26 -24
- data/lib/prism/mutation_compiler.rb +6 -1
- data/lib/prism/node.rb +314 -389
- data/lib/prism/node_ext.rb +175 -17
- data/lib/prism/parse_result/comments.rb +1 -8
- data/lib/prism/parse_result/newlines.rb +102 -12
- data/lib/prism/parse_result.rb +17 -0
- data/lib/prism/reflection.rb +11 -9
- data/lib/prism/serialize.rb +91 -68
- data/lib/prism/translation/parser/compiler.rb +288 -138
- data/lib/prism/translation/parser.rb +7 -2
- data/lib/prism/translation/ripper.rb +24 -22
- data/lib/prism/translation/ruby_parser.rb +32 -14
- data/lib/prism/visitor.rb +3 -0
- data/lib/prism.rb +0 -4
- data/prism.gemspec +2 -4
- data/rbi/prism/node.rbi +114 -57
- data/rbi/prism/node_ext.rbi +5 -0
- data/rbi/prism/parse_result.rbi +1 -1
- data/rbi/prism/visitor.rbi +3 -0
- data/rbi/prism.rbi +6 -0
- data/sig/prism/dsl.rbs +13 -10
- data/sig/prism/lex_compat.rbs +10 -0
- data/sig/prism/mutation_compiler.rbs +1 -0
- data/sig/prism/node.rbs +72 -48
- data/sig/prism/node_ext.rbs +4 -0
- data/sig/prism/visitor.rbs +1 -0
- data/sig/prism.rbs +21 -0
- data/src/diagnostic.c +56 -27
- data/src/node.c +432 -1690
- data/src/prettyprint.c +97 -54
- data/src/prism.c +1286 -1196
- data/src/regexp.c +133 -68
- data/src/serialize.c +22 -17
- data/src/static_literals.c +63 -84
- data/src/token_type.c +4 -4
- data/src/util/pm_constant_pool.c +0 -8
- data/src/util/pm_integer.c +39 -11
- data/src/util/pm_string.c +0 -12
- data/src/util/pm_strpbrk.c +32 -6
- metadata +3 -5
- data/include/prism/util/pm_string_list.h +0 -44
- data/lib/prism/debug.rb +0 -249
- data/src/util/pm_string_list.c +0 -28
data/ext/prism/api_node.c
CHANGED
@@ -102,6 +102,7 @@ static VALUE rb_cPrismInterpolatedRegularExpressionNode;
|
|
102
102
|
static VALUE rb_cPrismInterpolatedStringNode;
|
103
103
|
static VALUE rb_cPrismInterpolatedSymbolNode;
|
104
104
|
static VALUE rb_cPrismInterpolatedXStringNode;
|
105
|
+
static VALUE rb_cPrismItLocalVariableReadNode;
|
105
106
|
static VALUE rb_cPrismItParametersNode;
|
106
107
|
static VALUE rb_cPrismKeywordHashNode;
|
107
108
|
static VALUE rb_cPrismKeywordRestParameterNode;
|
@@ -980,12 +981,6 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
980
981
|
pm_node_stack_push(&node_stack, (pm_node_t *) cast->right);
|
981
982
|
break;
|
982
983
|
}
|
983
|
-
#line 146 "api_node.c.erb"
|
984
|
-
case PM_RATIONAL_NODE: {
|
985
|
-
pm_rational_node_t *cast = (pm_rational_node_t *) node;
|
986
|
-
pm_node_stack_push(&node_stack, (pm_node_t *) cast->numeric);
|
987
|
-
break;
|
988
|
-
}
|
989
984
|
#line 146 "api_node.c.erb"
|
990
985
|
case PM_RESCUE_MODIFIER_NODE: {
|
991
986
|
pm_rescue_modifier_node_t *cast = (pm_rescue_modifier_node_t *) node;
|
@@ -1708,14 +1703,14 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
1708
1703
|
assert(cast->write_name != 0);
|
1709
1704
|
argv[6] = RARRAY_AREF(constants, cast->write_name - 1);
|
1710
1705
|
|
1711
|
-
//
|
1706
|
+
// binary_operator
|
1712
1707
|
#line 198 "api_node.c.erb"
|
1713
|
-
assert(cast->
|
1714
|
-
argv[7] = RARRAY_AREF(constants, cast->
|
1708
|
+
assert(cast->binary_operator != 0);
|
1709
|
+
argv[7] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
1715
1710
|
|
1716
|
-
//
|
1711
|
+
// binary_operator_loc
|
1717
1712
|
#line 211 "api_node.c.erb"
|
1718
|
-
argv[8] = pm_location_new(parser, cast->
|
1713
|
+
argv[8] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
1719
1714
|
|
1720
1715
|
// value
|
1721
1716
|
#line 186 "api_node.c.erb"
|
@@ -2009,18 +2004,18 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
2009
2004
|
#line 211 "api_node.c.erb"
|
2010
2005
|
argv[2] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end);
|
2011
2006
|
|
2012
|
-
//
|
2007
|
+
// binary_operator_loc
|
2013
2008
|
#line 211 "api_node.c.erb"
|
2014
|
-
argv[3] = pm_location_new(parser, cast->
|
2009
|
+
argv[3] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
2015
2010
|
|
2016
2011
|
// value
|
2017
2012
|
#line 186 "api_node.c.erb"
|
2018
2013
|
argv[4] = rb_ary_pop(value_stack);
|
2019
2014
|
|
2020
|
-
//
|
2015
|
+
// binary_operator
|
2021
2016
|
#line 198 "api_node.c.erb"
|
2022
|
-
assert(cast->
|
2023
|
-
argv[5] = RARRAY_AREF(constants, cast->
|
2017
|
+
assert(cast->binary_operator != 0);
|
2018
|
+
argv[5] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
2024
2019
|
|
2025
2020
|
// location
|
2026
2021
|
argv[6] = pm_location_new(parser, node->location.start, node->location.end);
|
@@ -2176,18 +2171,18 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
2176
2171
|
#line 211 "api_node.c.erb"
|
2177
2172
|
argv[2] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end);
|
2178
2173
|
|
2179
|
-
//
|
2174
|
+
// binary_operator_loc
|
2180
2175
|
#line 211 "api_node.c.erb"
|
2181
|
-
argv[3] = pm_location_new(parser, cast->
|
2176
|
+
argv[3] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
2182
2177
|
|
2183
2178
|
// value
|
2184
2179
|
#line 186 "api_node.c.erb"
|
2185
2180
|
argv[4] = rb_ary_pop(value_stack);
|
2186
2181
|
|
2187
|
-
//
|
2182
|
+
// binary_operator
|
2188
2183
|
#line 198 "api_node.c.erb"
|
2189
|
-
assert(cast->
|
2190
|
-
argv[5] = RARRAY_AREF(constants, cast->
|
2184
|
+
assert(cast->binary_operator != 0);
|
2185
|
+
argv[5] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
2191
2186
|
|
2192
2187
|
// location
|
2193
2188
|
argv[6] = pm_location_new(parser, node->location.start, node->location.end);
|
@@ -2293,18 +2288,18 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
2293
2288
|
#line 186 "api_node.c.erb"
|
2294
2289
|
argv[1] = rb_ary_pop(value_stack);
|
2295
2290
|
|
2296
|
-
//
|
2291
|
+
// binary_operator_loc
|
2297
2292
|
#line 211 "api_node.c.erb"
|
2298
|
-
argv[2] = pm_location_new(parser, cast->
|
2293
|
+
argv[2] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
2299
2294
|
|
2300
2295
|
// value
|
2301
2296
|
#line 186 "api_node.c.erb"
|
2302
2297
|
argv[3] = rb_ary_pop(value_stack);
|
2303
2298
|
|
2304
|
-
//
|
2299
|
+
// binary_operator
|
2305
2300
|
#line 198 "api_node.c.erb"
|
2306
|
-
assert(cast->
|
2307
|
-
argv[4] = RARRAY_AREF(constants, cast->
|
2301
|
+
assert(cast->binary_operator != 0);
|
2302
|
+
argv[4] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
2308
2303
|
|
2309
2304
|
// location
|
2310
2305
|
argv[5] = pm_location_new(parser, node->location.start, node->location.end);
|
@@ -2894,18 +2889,18 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
2894
2889
|
#line 211 "api_node.c.erb"
|
2895
2890
|
argv[2] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end);
|
2896
2891
|
|
2897
|
-
//
|
2892
|
+
// binary_operator_loc
|
2898
2893
|
#line 211 "api_node.c.erb"
|
2899
|
-
argv[3] = pm_location_new(parser, cast->
|
2894
|
+
argv[3] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
2900
2895
|
|
2901
2896
|
// value
|
2902
2897
|
#line 186 "api_node.c.erb"
|
2903
2898
|
argv[4] = rb_ary_pop(value_stack);
|
2904
2899
|
|
2905
|
-
//
|
2900
|
+
// binary_operator
|
2906
2901
|
#line 198 "api_node.c.erb"
|
2907
|
-
assert(cast->
|
2908
|
-
argv[5] = RARRAY_AREF(constants, cast->
|
2902
|
+
assert(cast->binary_operator != 0);
|
2903
|
+
argv[5] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
2909
2904
|
|
2910
2905
|
// location
|
2911
2906
|
argv[6] = pm_location_new(parser, node->location.start, node->location.end);
|
@@ -3280,14 +3275,14 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
3280
3275
|
#line 186 "api_node.c.erb"
|
3281
3276
|
argv[7] = rb_ary_pop(value_stack);
|
3282
3277
|
|
3283
|
-
//
|
3278
|
+
// binary_operator
|
3284
3279
|
#line 198 "api_node.c.erb"
|
3285
|
-
assert(cast->
|
3286
|
-
argv[8] = RARRAY_AREF(constants, cast->
|
3280
|
+
assert(cast->binary_operator != 0);
|
3281
|
+
argv[8] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
3287
3282
|
|
3288
|
-
//
|
3283
|
+
// binary_operator_loc
|
3289
3284
|
#line 211 "api_node.c.erb"
|
3290
|
-
argv[9] = pm_location_new(parser, cast->
|
3285
|
+
argv[9] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
3291
3286
|
|
3292
3287
|
// value
|
3293
3288
|
#line 186 "api_node.c.erb"
|
@@ -3435,18 +3430,18 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
3435
3430
|
#line 211 "api_node.c.erb"
|
3436
3431
|
argv[2] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end);
|
3437
3432
|
|
3438
|
-
//
|
3433
|
+
// binary_operator_loc
|
3439
3434
|
#line 211 "api_node.c.erb"
|
3440
|
-
argv[3] = pm_location_new(parser, cast->
|
3435
|
+
argv[3] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
3441
3436
|
|
3442
3437
|
// value
|
3443
3438
|
#line 186 "api_node.c.erb"
|
3444
3439
|
argv[4] = rb_ary_pop(value_stack);
|
3445
3440
|
|
3446
|
-
//
|
3441
|
+
// binary_operator
|
3447
3442
|
#line 198 "api_node.c.erb"
|
3448
|
-
assert(cast->
|
3449
|
-
argv[5] = RARRAY_AREF(constants, cast->
|
3443
|
+
assert(cast->binary_operator != 0);
|
3444
|
+
argv[5] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
3450
3445
|
|
3451
3446
|
// location
|
3452
3447
|
argv[6] = pm_location_new(parser, node->location.start, node->location.end);
|
@@ -3733,6 +3728,19 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
3733
3728
|
rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cPrismInterpolatedXStringNode));
|
3734
3729
|
break;
|
3735
3730
|
}
|
3731
|
+
#line 172 "api_node.c.erb"
|
3732
|
+
case PM_IT_LOCAL_VARIABLE_READ_NODE: {
|
3733
|
+
VALUE argv[2];
|
3734
|
+
|
3735
|
+
// source
|
3736
|
+
argv[0] = source;
|
3737
|
+
|
3738
|
+
// location
|
3739
|
+
argv[1] = pm_location_new(parser, node->location.start, node->location.end);
|
3740
|
+
|
3741
|
+
rb_ary_push(value_stack, rb_class_new_instance(2, argv, rb_cPrismItLocalVariableReadNode));
|
3742
|
+
break;
|
3743
|
+
}
|
3736
3744
|
#line 172 "api_node.c.erb"
|
3737
3745
|
case PM_IT_PARAMETERS_NODE: {
|
3738
3746
|
VALUE argv[2];
|
@@ -3889,9 +3897,9 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
3889
3897
|
#line 211 "api_node.c.erb"
|
3890
3898
|
argv[1] = pm_location_new(parser, cast->name_loc.start, cast->name_loc.end);
|
3891
3899
|
|
3892
|
-
//
|
3900
|
+
// binary_operator_loc
|
3893
3901
|
#line 211 "api_node.c.erb"
|
3894
|
-
argv[2] = pm_location_new(parser, cast->
|
3902
|
+
argv[2] = pm_location_new(parser, cast->binary_operator_loc.start, cast->binary_operator_loc.end);
|
3895
3903
|
|
3896
3904
|
// value
|
3897
3905
|
#line 186 "api_node.c.erb"
|
@@ -3902,10 +3910,10 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
3902
3910
|
assert(cast->name != 0);
|
3903
3911
|
argv[4] = RARRAY_AREF(constants, cast->name - 1);
|
3904
3912
|
|
3905
|
-
//
|
3913
|
+
// binary_operator
|
3906
3914
|
#line 198 "api_node.c.erb"
|
3907
|
-
assert(cast->
|
3908
|
-
argv[5] = RARRAY_AREF(constants, cast->
|
3915
|
+
assert(cast->binary_operator != 0);
|
3916
|
+
argv[5] = RARRAY_AREF(constants, cast->binary_operator - 1);
|
3909
3917
|
|
3910
3918
|
// depth
|
3911
3919
|
#line 220 "api_node.c.erb"
|
@@ -4723,19 +4731,28 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
|
|
4723
4731
|
}
|
4724
4732
|
#line 172 "api_node.c.erb"
|
4725
4733
|
case PM_RATIONAL_NODE: {
|
4726
|
-
|
4734
|
+
pm_rational_node_t *cast = (pm_rational_node_t *) node;
|
4735
|
+
VALUE argv[5];
|
4727
4736
|
|
4728
4737
|
// source
|
4729
4738
|
argv[0] = source;
|
4730
4739
|
|
4731
|
-
//
|
4732
|
-
#line
|
4733
|
-
argv[1] =
|
4740
|
+
// flags
|
4741
|
+
#line 223 "api_node.c.erb"
|
4742
|
+
argv[1] = ULONG2NUM(node->flags & ~PM_NODE_FLAG_COMMON_MASK);
|
4743
|
+
|
4744
|
+
// numerator
|
4745
|
+
#line 226 "api_node.c.erb"
|
4746
|
+
argv[2] = pm_integer_new(&cast->numerator);
|
4747
|
+
|
4748
|
+
// denominator
|
4749
|
+
#line 226 "api_node.c.erb"
|
4750
|
+
argv[3] = pm_integer_new(&cast->denominator);
|
4734
4751
|
|
4735
4752
|
// location
|
4736
|
-
argv[
|
4753
|
+
argv[4] = pm_location_new(parser, node->location.start, node->location.end);
|
4737
4754
|
|
4738
|
-
rb_ary_push(value_stack, rb_class_new_instance(
|
4755
|
+
rb_ary_push(value_stack, rb_class_new_instance(5, argv, rb_cPrismRationalNode));
|
4739
4756
|
break;
|
4740
4757
|
}
|
4741
4758
|
#line 172 "api_node.c.erb"
|
@@ -5578,6 +5595,7 @@ Init_prism_api_node(void) {
|
|
5578
5595
|
rb_cPrismInterpolatedStringNode = rb_define_class_under(rb_cPrism, "InterpolatedStringNode", rb_cPrismNode);
|
5579
5596
|
rb_cPrismInterpolatedSymbolNode = rb_define_class_under(rb_cPrism, "InterpolatedSymbolNode", rb_cPrismNode);
|
5580
5597
|
rb_cPrismInterpolatedXStringNode = rb_define_class_under(rb_cPrism, "InterpolatedXStringNode", rb_cPrismNode);
|
5598
|
+
rb_cPrismItLocalVariableReadNode = rb_define_class_under(rb_cPrism, "ItLocalVariableReadNode", rb_cPrismNode);
|
5581
5599
|
rb_cPrismItParametersNode = rb_define_class_under(rb_cPrism, "ItParametersNode", rb_cPrismNode);
|
5582
5600
|
rb_cPrismKeywordHashNode = rb_define_class_under(rb_cPrism, "KeywordHashNode", rb_cPrismNode);
|
5583
5601
|
rb_cPrismKeywordRestParameterNode = rb_define_class_under(rb_cPrism, "KeywordRestParameterNode", rb_cPrismNode);
|
data/ext/prism/extconf.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "rbconfig"
|
4
|
+
|
3
5
|
if ARGV.delete("--help")
|
4
6
|
print(<<~TEXT)
|
5
7
|
USAGE: ruby #{$PROGRAM_NAME} [options]
|
@@ -40,26 +42,6 @@ def generate_templates
|
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
43
|
-
# We're going to need to run `make` using prism's `Makefile`. We want to match
|
44
|
-
# up as much of the configuration to the configuration that built the current
|
45
|
-
# version of Ruby as possible.
|
46
|
-
require "rbconfig"
|
47
|
-
env = RbConfig::CONFIG.slice("SOEXT", "CPPFLAGS", "CFLAGS", "CC", "AR", "ARFLAGS", "MAKEDIRS", "RMALL")
|
48
|
-
|
49
|
-
# It's possible that the Ruby that is being run wasn't actually compiled on this
|
50
|
-
# machine, in which case the configuration might be incorrect. In this case
|
51
|
-
# we'll need to do some additional checks and potentially fall back to defaults.
|
52
|
-
if env.key?("CC") && !File.exist?(env["CC"])
|
53
|
-
env.delete("CC")
|
54
|
-
env.delete("CFLAGS")
|
55
|
-
env.delete("CPPFLAGS")
|
56
|
-
end
|
57
|
-
|
58
|
-
if env.key?("AR") && !File.exist?(env["AR"])
|
59
|
-
env.delete("AR")
|
60
|
-
env.delete("ARFLAGS")
|
61
|
-
end
|
62
|
-
|
63
45
|
# Runs `make` in the root directory of the project. Note that this is the
|
64
46
|
# `Makefile` for the overall project, not the `Makefile` that is being generated
|
65
47
|
# by this script.`
|
@@ -77,15 +59,37 @@ end
|
|
77
59
|
|
78
60
|
# On non-CRuby we only need the shared library since we'll interface with it
|
79
61
|
# through FFI, so we'll build only that and not the C extension. We also avoid
|
80
|
-
# `require "mkmf"` as that prepends the LLVM toolchain to PATH on TruffleRuby,
|
81
|
-
# but we want to use the
|
62
|
+
# `require "mkmf"` as that prepends the GraalVM LLVM toolchain to PATH on TruffleRuby < 24.0,
|
63
|
+
# but we want to use the system toolchain here since libprism is run natively.
|
82
64
|
if RUBY_ENGINE != "ruby"
|
83
65
|
generate_templates
|
84
|
-
|
66
|
+
soext = RbConfig::CONFIG["SOEXT"]
|
67
|
+
# Pass SOEXT to avoid an extra subprocess just to query that
|
68
|
+
make({ "SOEXT" => soext }, "build/libprism.#{soext}")
|
85
69
|
File.write("Makefile", "all install clean:\n\t@#{RbConfig::CONFIG["NULLCMD"]}\n")
|
86
70
|
return
|
87
71
|
end
|
88
72
|
|
73
|
+
# We're going to need to run `make` using prism's `Makefile`.
|
74
|
+
# We want to use the same toolchain (compiler, flags, etc) to compile libprism.a and
|
75
|
+
# the C extension since they will be linked together.
|
76
|
+
# The C extension uses RbConfig, which contains values from the toolchain that built the running Ruby.
|
77
|
+
env = RbConfig::CONFIG.slice("SOEXT", "CPPFLAGS", "CFLAGS", "CC", "AR", "ARFLAGS", "MAKEDIRS", "RMALL")
|
78
|
+
|
79
|
+
# It's possible that the Ruby that is being run wasn't actually compiled on this
|
80
|
+
# machine, in which case parts of RbConfig might be incorrect. In this case
|
81
|
+
# we'll need to do some additional checks and potentially fall back to defaults.
|
82
|
+
if env.key?("CC") && !File.exist?(env["CC"])
|
83
|
+
env.delete("CC")
|
84
|
+
env.delete("CFLAGS")
|
85
|
+
env.delete("CPPFLAGS")
|
86
|
+
end
|
87
|
+
|
88
|
+
if env.key?("AR") && !File.exist?(env["AR"])
|
89
|
+
env.delete("AR")
|
90
|
+
env.delete("ARFLAGS")
|
91
|
+
end
|
92
|
+
|
89
93
|
require "mkmf"
|
90
94
|
|
91
95
|
# First, ensure that we can find the header for the prism library.
|