Compare commits
6 commits
rawhide
...
stream-rub
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
709c4f4f66 | ||
|
|
c04bbcf7b9 | ||
|
|
6636c3656a | ||
|
|
14ae992fbf | ||
|
|
98fb2bc83c | ||
|
|
914377f3fa |
13 changed files with 259 additions and 827 deletions
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
|||
index d261ea57b5..3c13076b82 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3105,6 +3105,11 @@ AS_IF([test ${multiarch+set}], [
|
||||
@@ -3121,6 +3121,11 @@ AS_IF([test ${multiarch+set}], [
|
||||
])
|
||||
|
||||
archlibdir='${libdir}/${arch}'
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ diff --git a/configure.ac b/configure.ac
|
|||
index c42436c23d..d261ea57b5 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3743,7 +3743,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||
@@ -3759,7 +3759,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||
|
||||
if test -z "${ruby_version_dir_name}"; then
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
|||
index 3c13076b82..93af30321d 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3807,6 +3807,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||
@@ -3823,6 +3823,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ diff --git a/configure.ac b/configure.ac
|
|||
index 93af30321d..bc13397e0e 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3779,6 +3779,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||
@@ -3795,6 +3795,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||
[vendorarchdir=$withval],
|
||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||
|
||||
|
|
@ -26,7 +26,7 @@ index 93af30321d..bc13397e0e 100644
|
|||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
RUBY_EXEC_PREFIX=''
|
||||
@@ -3803,6 +3807,7 @@ AC_SUBST(sitearchdir)dnl
|
||||
@@ -3819,6 +3823,7 @@ AC_SUBST(sitearchdir)dnl
|
||||
AC_SUBST(vendordir)dnl
|
||||
AC_SUBST(vendorlibdir)dnl
|
||||
AC_SUBST(vendorarchdir)dnl
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ diff --git a/configure.ac b/configure.ac
|
|||
index 80b137e380..63cd3b4f8b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -3694,9 +3694,6 @@ AS_CASE(["$target_os"],
|
||||
@@ -3710,9 +3710,6 @@ AS_CASE(["$target_os"],
|
||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||
])
|
||||
|
||||
|
|
@ -30,7 +30,7 @@ index 80b137e380..63cd3b4f8b 100644
|
|||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||
AC_ARG_WITH(rubyarchprefix,
|
||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||
@@ -3719,56 +3716,62 @@ AC_ARG_WITH(ridir,
|
||||
@@ -3735,56 +3732,62 @@ AC_ARG_WITH(ridir,
|
||||
AC_SUBST(ridir)
|
||||
AC_SUBST(RI_BASE_NAME)
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ index 80b137e380..63cd3b4f8b 100644
|
|||
|
||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||
@@ -3785,6 +3788,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||
@@ -3801,6 +3804,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||
AC_SUBST(arch)dnl
|
||||
AC_SUBST(sitearch)dnl
|
||||
AC_SUBST(ruby_version)dnl
|
||||
|
|
|
|||
|
|
@ -1,178 +0,0 @@
|
|||
From c5806d668f84a86e9e6a522f84b8aa6cb4cdaae9 Mon Sep 17 00:00:00 2001
|
||||
From: Ali Saidi <alisaidi@amazon.com>
|
||||
Date: Wed, 5 Aug 2020 20:46:28 -0500
|
||||
Subject: [PATCH 1/3] Enable unaligned accesses on arm64
|
||||
|
||||
64-bit Arm platforms support unaligned accesses.
|
||||
|
||||
Running the string benchmarks this change improves performance
|
||||
by an average of 1.04x, min .96x, max 1.21x, median 1.01x
|
||||
---
|
||||
include/ruby/defines.h | 2 +-
|
||||
regint.h | 2 +-
|
||||
siphash.c | 2 +-
|
||||
st.c | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
|
||||
index 49f673ef936a..0193275e8b78 100644
|
||||
--- a/include/ruby/defines.h
|
||||
+++ b/include/ruby/defines.h
|
||||
@@ -485,7 +485,7 @@
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# else
|
||||
diff --git a/regint.h b/regint.h
|
||||
index a2f5bbba1d1f..0740429688bc 100644
|
||||
--- a/regint.h
|
||||
+++ b/regint.h
|
||||
@@ -52,7 +52,7 @@
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# else
|
||||
diff --git a/siphash.c b/siphash.c
|
||||
index 153d2c690ab9..ddf8ee245d81 100644
|
||||
--- a/siphash.c
|
||||
+++ b/siphash.c
|
||||
@@ -30,7 +30,7 @@
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# endif
|
||||
diff --git a/st.c b/st.c
|
||||
index c11535ef9779..8be466bf733f 100644
|
||||
--- a/st.c
|
||||
+++ b/st.c
|
||||
@@ -1815,7 +1815,7 @@ st_values_check(st_table *tab, st_data_t *values, st_index_t size,
|
||||
#ifndef UNALIGNED_WORD_ACCESS
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
||||
- defined(__powerpc64__) || \
|
||||
+ defined(__powerpc64__) || defined(__aarch64__) || \
|
||||
defined(__mc68020__)
|
||||
# define UNALIGNED_WORD_ACCESS 1
|
||||
# endif
|
||||
|
||||
From 79b7b9143fda0f33fc9375980cecc61eb42c6f66 Mon Sep 17 00:00:00 2001
|
||||
From: Ali Saidi <alisaidi@amazon.com>
|
||||
Date: Wed, 5 Aug 2020 21:04:37 -0500
|
||||
Subject: [PATCH 2/3] arm64 enable gc optimizations
|
||||
|
||||
Similar to x86 and powerpc optimizations.
|
||||
|
||||
| |compare-ruby|built-ruby|
|
||||
|:------|-----------:|---------:|
|
||||
|hash1 | 0.225| 0.237|
|
||||
| | -| 1.05x|
|
||||
|hash2 | 0.110| 0.110|
|
||||
| | 1.00x| -|
|
||||
---
|
||||
gc.c | 13 +++++++++++++
|
||||
gc.h | 2 ++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/gc.c b/gc.c
|
||||
index 22972dfc806c..788f06f1586e 100644
|
||||
--- a/gc.c
|
||||
+++ b/gc.c
|
||||
@@ -1153,6 +1153,19 @@ tick(void)
|
||||
return val;
|
||||
}
|
||||
|
||||
+#elif defined(__aarch64__) && defined(__GNUC__)
|
||||
+typedef unsigned long tick_t;
|
||||
+#define PRItick "lu"
|
||||
+
|
||||
+static __inline__ tick_t
|
||||
+tick(void)
|
||||
+{
|
||||
+ unsigned long val;
|
||||
+ __asm__ __volatile__ ("mrs %0, cntvct_el0", : "=r" (val));
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+
|
||||
#elif defined(_WIN32) && defined(_MSC_VER)
|
||||
#include <intrin.h>
|
||||
typedef unsigned __int64 tick_t;
|
||||
diff --git a/gc.h b/gc.h
|
||||
index 6568079c54e5..47a4ca19a0c5 100644
|
||||
--- a/gc.h
|
||||
+++ b/gc.h
|
||||
@@ -8,6 +8,8 @@
|
||||
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("movl\t%%esp, %0" : "=r" (*(p)))
|
||||
#elif defined(__powerpc64__) && defined(__GNUC__)
|
||||
#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mr\t%0, %%r1" : "=r" (*(p)))
|
||||
+#elif defined(__aarch64__) && defined(__GNUC__)
|
||||
+#define SET_MACHINE_STACK_END(p) __asm__ __volatile__ ("mov\t%0, sp" : "=r" (*(p)))
|
||||
#else
|
||||
NOINLINE(void rb_gc_set_stack_end(VALUE **stack_end_p));
|
||||
#define SET_MACHINE_STACK_END(p) rb_gc_set_stack_end(p)
|
||||
|
||||
From c985b8c6868a380e44e285368af4a4f414ce3309 Mon Sep 17 00:00:00 2001
|
||||
From: Ali Saidi <alisaidi@amazon.com>
|
||||
Date: Wed, 5 Aug 2020 21:15:55 -0500
|
||||
Subject: [PATCH 3/3] vm_exec.c: improve performance for arm64
|
||||
|
||||
| |compare-ruby|built-ruby|
|
||||
|:------------------------------|-----------:|---------:|
|
||||
|vm_array | 26.501M| 27.959M|
|
||||
| | -| 1.06x|
|
||||
|vm_attr_ivar | 21.606M| 31.429M|
|
||||
| | -| 1.45x|
|
||||
|vm_attr_ivar_set | 21.178M| 26.113M|
|
||||
| | -| 1.23x|
|
||||
|vm_backtrace | 6.621| 6.668|
|
||||
| | -| 1.01x|
|
||||
|vm_bigarray | 26.205M| 29.958M|
|
||||
| | -| 1.14x|
|
||||
|vm_bighash | 504.155k| 479.306k|
|
||||
| | 1.05x| -|
|
||||
|vm_block | 16.692M| 21.315M|
|
||||
| | -| 1.28x|
|
||||
|block_handler_type_iseq | 5.083| 7.004|
|
||||
| | -| 1.38x|
|
||||
---
|
||||
vm_exec.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/vm_exec.c b/vm_exec.c
|
||||
index ce2e053ee745..7aa56f6ad620 100644
|
||||
--- a/vm_exec.c
|
||||
+++ b/vm_exec.c
|
||||
@@ -27,6 +27,9 @@ static void vm_insns_counter_count_insn(int insn) {}
|
||||
#elif defined(__GNUC__) && defined(__powerpc64__)
|
||||
#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
|
||||
|
||||
+#elif defined(__GNUC__) && defined(__aarch64__)
|
||||
+#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("x" reg)
|
||||
+
|
||||
#else
|
||||
#define DECL_SC_REG(type, r, reg) register type reg_##r
|
||||
#endif
|
||||
@@ -74,6 +77,11 @@ vm_exec_core(rb_execution_context_t *ec, VALUE initial)
|
||||
DECL_SC_REG(rb_control_frame_t *, cfp, "15");
|
||||
#define USE_MACHINE_REGS 1
|
||||
|
||||
+#elif defined(__GNUC__) && defined(__aarch64__)
|
||||
+ DECL_SC_REG(const VALUE *, pc, "19");
|
||||
+ DECL_SC_REG(rb_control_frame_t *, cfp, "20");
|
||||
+#define USE_MACHINE_REGS 1
|
||||
+
|
||||
#else
|
||||
register rb_control_frame_t *reg_cfp;
|
||||
const VALUE *reg_pc;
|
||||
217
ruby-dwarf5-avoid_crash-r1.patch
Normal file
217
ruby-dwarf5-avoid_crash-r1.patch
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
--- a/addr2line.c
|
||||
+++ b/addr2line.c
|
||||
@@ -163,11 +163,12 @@
|
||||
struct dwarf_section debug_info;
|
||||
struct dwarf_section debug_line;
|
||||
struct dwarf_section debug_ranges;
|
||||
+ struct dwarf_section debug_rnglists;
|
||||
struct dwarf_section debug_str;
|
||||
struct obj_info *next;
|
||||
} obj_info_t;
|
||||
|
||||
-#define DWARF_SECTION_COUNT 5
|
||||
+#define DWARF_SECTION_COUNT 6
|
||||
|
||||
static struct dwarf_section *
|
||||
obj_dwarf_section_at(obj_info_t *obj, int n)
|
||||
@@ -177,6 +177,7 @@
|
||||
&obj->debug_info,
|
||||
&obj->debug_line,
|
||||
&obj->debug_ranges,
|
||||
+ &obj->debug_rnglists,
|
||||
&obj->debug_str
|
||||
};
|
||||
if (n < 0 || DWARF_SECTION_COUNT <= n) {
|
||||
@@ -415,7 +415,7 @@
|
||||
FILL_LINE();
|
||||
break;
|
||||
case DW_LNS_advance_pc:
|
||||
- a = uleb128((char **)&p);
|
||||
+ a = uleb128((char **)&p) * header.minimum_instruction_length;
|
||||
addr += a;
|
||||
break;
|
||||
case DW_LNS_advance_line: {
|
||||
@@ -454,7 +454,7 @@
|
||||
/* isa = (unsigned int)*/(void)uleb128((char **)&p);
|
||||
break;
|
||||
case 0:
|
||||
- a = *(unsigned char *)p++;
|
||||
+ a = uleb128((char **)&p);
|
||||
op = *p++;
|
||||
switch (op) {
|
||||
case DW_LNE_end_sequence:
|
||||
@@ -768,6 +768,18 @@
|
||||
DW_FORM_addrx4 = 0x2c
|
||||
};
|
||||
|
||||
+/* Range list entry encodings */
|
||||
+enum {
|
||||
+ DW_RLE_end_of_list = 0x00,
|
||||
+ DW_RLE_base_addressx = 0x01,
|
||||
+ DW_RLE_startx_endx = 0x02,
|
||||
+ DW_RLE_startx_length = 0x03,
|
||||
+ DW_RLE_offset_pair = 0x04,
|
||||
+ DW_RLE_base_address = 0x05,
|
||||
+ DW_RLE_start_end = 0x06,
|
||||
+ DW_RLE_start_length = 0x07
|
||||
+};
|
||||
+
|
||||
enum {
|
||||
VAL_none = 0,
|
||||
VAL_cstr = 1,
|
||||
@@ -921,6 +921,23 @@
|
||||
}
|
||||
|
||||
static void
|
||||
+di_skip_die_attributes(char **p)
|
||||
+{
|
||||
+ for (;;) {
|
||||
+ uint64_t at = uleb128(p);
|
||||
+ uint64_t form = uleb128(p);
|
||||
+ if (!at && !form) break;
|
||||
+ switch (form) {
|
||||
+ default:
|
||||
+ break;
|
||||
+ case DW_FORM_implicit_const:
|
||||
+ sleb128(p);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
di_read_debug_abbrev_cu(DebugInfoReader *reader)
|
||||
{
|
||||
uint64_t prev = 0;
|
||||
@@ -934,12 +934,7 @@
|
||||
prev = abbrev_number;
|
||||
uleb128(&p); /* tag */
|
||||
p++; /* has_children */
|
||||
- /* skip content */
|
||||
- for (;;) {
|
||||
- uint64_t at = uleb128(&p);
|
||||
- uint64_t form = uleb128(&p);
|
||||
- if (!at && !form) break;
|
||||
- }
|
||||
+ di_skip_die_attributes(&p);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1203,12 +1203,7 @@
|
||||
/* skip 255th record */
|
||||
uleb128(&p); /* tag */
|
||||
p++; /* has_children */
|
||||
- /* skip content */
|
||||
- for (;;) {
|
||||
- uint64_t at = uleb128(&p);
|
||||
- uint64_t form = uleb128(&p);
|
||||
- if (!at && !form) break;
|
||||
- }
|
||||
+ di_skip_die_attributes(&p);
|
||||
for (uint64_t n = uleb128(&p); abbrev_number != n; n = uleb128(&p)) {
|
||||
if (n == 0) {
|
||||
fprintf(stderr,"%d: Abbrev Number %"PRId64" not found\n",__LINE__, abbrev_number);
|
||||
@@ -1216,12 +1216,7 @@
|
||||
}
|
||||
uleb128(&p); /* tag */
|
||||
p++; /* has_children */
|
||||
- /* skip content */
|
||||
- for (;;) {
|
||||
- uint64_t at = uleb128(&p);
|
||||
- uint64_t form = uleb128(&p);
|
||||
- if (!at && !form) break;
|
||||
- }
|
||||
+ di_skip_die_attributes(&p);
|
||||
}
|
||||
return p;
|
||||
}
|
||||
@@ -1349,6 +1349,21 @@
|
||||
}
|
||||
}
|
||||
|
||||
+static uint64_t
|
||||
+read_dw_form_addr(DebugInfoReader *reader, char **ptr)
|
||||
+{
|
||||
+ char *p = *ptr;
|
||||
+ *ptr = p + reader->format;
|
||||
+ if (reader->format == 4) {
|
||||
+ return read_uint32(&p);
|
||||
+ } else if (reader->format == 8) {
|
||||
+ return read_uint64(&p);
|
||||
+ } else {
|
||||
+ fprintf(stderr,"unknown address_size:%d", reader->address_size);
|
||||
+ abort();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static uintptr_t
|
||||
ranges_include(DebugInfoReader *reader, ranges_t *ptr, uint64_t addr)
|
||||
{
|
||||
@@ -1362,8 +1362,50 @@
|
||||
}
|
||||
else if (ptr->ranges_set) {
|
||||
/* TODO: support base address selection entry */
|
||||
- char *p = reader->obj->debug_ranges.ptr + ptr->ranges;
|
||||
+ char *p;
|
||||
uint64_t base = ptr->low_pc_set ? ptr->low_pc : reader->current_low_pc;
|
||||
+ if (reader->obj->debug_rnglists.ptr) {
|
||||
+ p = reader->obj->debug_rnglists.ptr + ptr->ranges;
|
||||
+ for (;;) {
|
||||
+ uint8_t rle = read_uint8(&p);
|
||||
+ uintptr_t base_address = 0;
|
||||
+ uintptr_t from, to;
|
||||
+ if (rle == DW_RLE_end_of_list) break;
|
||||
+ switch (rle) {
|
||||
+ case DW_RLE_base_addressx:
|
||||
+ uleb128(&p);
|
||||
+ break;
|
||||
+ case DW_RLE_startx_endx:
|
||||
+ uleb128(&p);
|
||||
+ uleb128(&p);
|
||||
+ break;
|
||||
+ case DW_RLE_startx_length:
|
||||
+ uleb128(&p);
|
||||
+ uleb128(&p);
|
||||
+ break;
|
||||
+ case DW_RLE_offset_pair:
|
||||
+ from = base_address + uleb128(&p);
|
||||
+ to = base_address + uleb128(&p);
|
||||
+ if (base + from <= addr && addr < base + to) {
|
||||
+ return from;
|
||||
+ }
|
||||
+ break;
|
||||
+ case DW_RLE_base_address:
|
||||
+ base_address = read_dw_form_addr(reader, &p);
|
||||
+ break;
|
||||
+ case DW_RLE_start_end:
|
||||
+ read_dw_form_addr(reader, &p);
|
||||
+ read_dw_form_addr(reader, &p);
|
||||
+ break;
|
||||
+ case DW_RLE_start_length:
|
||||
+ read_dw_form_addr(reader, &p);
|
||||
+ uleb128(&p);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+ p = reader->obj->debug_ranges.ptr + ptr->ranges;
|
||||
for (;;) {
|
||||
uintptr_t from = read_uintptr(&p);
|
||||
uintptr_t to = read_uintptr(&p);
|
||||
@@ -1701,6 +1701,7 @@
|
||||
".debug_info",
|
||||
".debug_line",
|
||||
".debug_ranges",
|
||||
+ ".debug_rnglists",
|
||||
".debug_str"
|
||||
};
|
||||
|
||||
@@ -1950,6 +1950,7 @@
|
||||
"__debug_info",
|
||||
"__debug_line",
|
||||
"__debug_ranges",
|
||||
+ "__debug_rnglists",
|
||||
"__debug_str"
|
||||
};
|
||||
struct LP(segment_command) *scmd = (struct LP(segment_command) *)lcmd;
|
||||
61
ruby.spec
61
ruby.spec
|
|
@ -1,6 +1,6 @@
|
|||
%global major_version 2
|
||||
%global minor_version 7
|
||||
%global teeny_version 2
|
||||
%global teeny_version 4
|
||||
%global major_minor_version %{major_version}.%{minor_version}
|
||||
|
||||
%global ruby_version %{major_minor_version}.%{teeny_version}
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
%endif
|
||||
|
||||
|
||||
%global release 137
|
||||
%global release 139
|
||||
%{!?release_string:%define release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
|
||||
|
||||
# The RubyGems library has to stay out of Ruby directory tree, since the
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
%global rubygems_dir %{_datadir}/rubygems
|
||||
|
||||
# Bundled libraries versions
|
||||
%global rubygems_version 3.1.4
|
||||
%global rubygems_version 3.1.6
|
||||
%global rubygems_molinillo_version 0.5.7
|
||||
|
||||
# Default gems.
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
%global openssl_version 2.1.2
|
||||
%global psych_version 3.1.0
|
||||
%global racc_version 1.4.16
|
||||
%global rdoc_version 6.2.1
|
||||
%global rdoc_version 6.2.1.1
|
||||
%global xmlrpc_version 0.3.0
|
||||
|
||||
# Bundled gems.
|
||||
|
|
@ -114,8 +114,8 @@ Source14: test_systemtap.rb
|
|||
|
||||
# The load directive is supported since RPM 4.12, i.e. F21+. The build process
|
||||
# fails on older Fedoras.
|
||||
%{?load:%{SOURCE4}}
|
||||
%{?load:%{SOURCE5}}
|
||||
%{load:%{SOURCE4}}
|
||||
%{load:%{SOURCE5}}
|
||||
|
||||
# Fix ruby_version abuse.
|
||||
# https://bugs.ruby-lang.org/issues/11002
|
||||
|
|
@ -153,25 +153,13 @@ Patch10: ruby-2.7.0-Remove-RubyGems-dependency.patch
|
|||
# Prevent issues with openssl loading when RubyGems are disabled.
|
||||
# https://github.com/ruby/openssl/pull/242
|
||||
Patch13: ruby-2.8.0-remove-unneeded-gem-require-for-ipaddr.patch
|
||||
# Fix `require` behavior allowing to load libraries multiple times.
|
||||
# https://github.com/rubygems/rubygems/issues/3647
|
||||
# Because there were multiple fixes in `Kernel.require` in recent months,
|
||||
# pickup all the changes one by one instead of squashing them.
|
||||
# https://github.com/rubygems/rubygems/pull/3124
|
||||
Patch15: rubygems-3.1.3-Fix-I-require-priority.patch
|
||||
# https://github.com/rubygems/rubygems/pull/3133
|
||||
Patch16: rubygems-3.1.3-Improve-require.patch
|
||||
# https://github.com/rubygems/rubygems/pull/3153
|
||||
Patch17: rubygems-3.1.3-Revert-Exclude-empty-suffix-from-I-require-loop.patch
|
||||
# https://github.com/rubygems/rubygems/pull/3639
|
||||
Patch18: rubygems-3.1.3-Fix-correctness-and-performance-regression-in-require.patch
|
||||
# Fix DWARF5 support.
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1920533
|
||||
# https://bugs.ruby-lang.org/issues/17585
|
||||
Patch15: ruby-dwarf5-avoid_crash-r1.patch
|
||||
# Avoid possible timeout errors in TestBugReporter#test_bug_reporter_add.
|
||||
# https://bugs.ruby-lang.org/issues/16492
|
||||
Patch19: ruby-2.7.1-Timeout-the-test_bug_reporter_add-witout-raising-err.patch
|
||||
# Enable arm64 optimizations.
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1884728
|
||||
# https://github.com/ruby/ruby/pull/3393
|
||||
Patch20: ruby-3.0.0-preview1-Enable-arm64-optimizations-that-exist-for-power-x86.patch
|
||||
|
||||
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
||||
Suggests: rubypick
|
||||
|
|
@ -587,11 +575,7 @@ rm -rf ext/fiddle/libffi*
|
|||
%patch10 -p1
|
||||
%patch13 -p1
|
||||
%patch15 -p1
|
||||
%patch16 -p1
|
||||
%patch17 -p1
|
||||
%patch18 -p1
|
||||
%patch19 -p1
|
||||
%patch20 -p1
|
||||
|
||||
# Provide an example of usage of the tapset:
|
||||
cp -a %{SOURCE3} .
|
||||
|
|
@ -788,6 +772,10 @@ sed -i 's/^/%lang(ja) /' .ruby-doc.ja
|
|||
# https://github.com/ruby/rake/pull/333
|
||||
rm -rf %{buildroot}%{gem_dir}/gems/rake-%{rake_version}/.github
|
||||
|
||||
# Remove accidentaly added files
|
||||
# https://bugs.ruby-lang.org/issues/17784
|
||||
rm -rf %{buildroot}%{ruby_libdir}/exe/
|
||||
|
||||
%check
|
||||
%if 0%{?with_hardening_test}
|
||||
# Check Ruby hardening.
|
||||
|
|
@ -1160,7 +1148,7 @@ MSPECOPTS="$MSPECOPTS -P 'File.lchmod changes the file mode of the link and not
|
|||
%{gem_dir}/specifications/default/readline-0.0.2.gemspec
|
||||
%{gem_dir}/specifications/default/readline-ext-0.1.0.gemspec
|
||||
%{gem_dir}/specifications/default/reline-0.1.5.gemspec
|
||||
%{gem_dir}/specifications/default/rexml-3.2.3.gemspec
|
||||
%{gem_dir}/specifications/default/rexml-3.2.3.1.gemspec
|
||||
%{gem_dir}/specifications/default/rss-0.2.8.gemspec
|
||||
%{gem_dir}/specifications/default/sdbm-1.0.0.gemspec
|
||||
%{gem_dir}/specifications/default/singleton-0.1.0.gemspec
|
||||
|
|
@ -1169,7 +1157,7 @@ MSPECOPTS="$MSPECOPTS -P 'File.lchmod changes the file mode of the link and not
|
|||
%{gem_dir}/specifications/default/timeout-0.1.0.gemspec
|
||||
%{gem_dir}/specifications/default/tracer-0.1.0.gemspec
|
||||
%{gem_dir}/specifications/default/uri-0.10.0.gemspec
|
||||
%{gem_dir}/specifications/default/webrick-1.6.0.gemspec
|
||||
%{gem_dir}/specifications/default/webrick-1.6.1.gemspec
|
||||
%{gem_dir}/specifications/default/yaml-0.1.0.gemspec
|
||||
%{gem_dir}/specifications/default/zlib-1.1.0.gemspec
|
||||
|
||||
|
|
@ -1289,6 +1277,23 @@ MSPECOPTS="$MSPECOPTS -P 'File.lchmod changes the file mode of the link and not
|
|||
|
||||
|
||||
%changelog
|
||||
* Thu Jul 15 2021 Jun Aruga <jaruga@redhat.com> - 2.7.4-139
|
||||
- Upgrade to Ruby 2.7.4.
|
||||
- Fix command injection vulnerability in RDoc.
|
||||
Resolves: CVE-2021-31799
|
||||
- Fix FTP PASV command response can cause Net::FTP to connect to arbitrary host.
|
||||
Resolves: CVE-2021-31810
|
||||
- Fix StartTLS stripping vulnerability in Net::IMAP.
|
||||
Resolves: CVE-2021-32066
|
||||
|
||||
* Tue Jun 15 2021 Jarek Prokop <jprokop@redhat.com> - 2.7.3-138
|
||||
- Properly support DWARF5 debug information.
|
||||
Resolves: rhbz#1920533
|
||||
- Fix FTBFS due to incompatible load directive.
|
||||
|
||||
* Wed Apr 07 2021 Pavel Valena <pvalena@redhat.com> - 2.7.3-138
|
||||
- Upgrade to Ruby 2.7.3.
|
||||
|
||||
* Tue Dec 15 16:26:46 CET 2020 Pavel Valena <pvalena@redhat.com> - 2.7.2-137
|
||||
- Add Recommends: redhat-rpm-config to devel subpackage.
|
||||
Resolves: rhbz#1905222
|
||||
|
|
|
|||
|
|
@ -1,167 +0,0 @@
|
|||
From 912d141a351053d0f6d915b5e7807f6a8f4c0631 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 4 Feb 2020 17:25:56 +0100
|
||||
Subject: [PATCH 1/2] Make non "test_" method private
|
||||
|
||||
---
|
||||
test/rubygems/test_require.rb | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index aa2675af5d..d618a93473 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -532,6 +532,8 @@ def test_require_bundler_with_bundler_version
|
||||
end
|
||||
end
|
||||
|
||||
+ private
|
||||
+
|
||||
def silence_warnings
|
||||
old_verbose, $VERBOSE = $VERBOSE, false
|
||||
yield
|
||||
|
||||
From b3944384f44b869985051863d8b05b545d09a585 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 4 Feb 2020 17:26:28 +0100
|
||||
Subject: [PATCH 2/2] Fix require issue with file extension priority
|
||||
|
||||
If `require "a"` is run when two folders have been specified in the -I
|
||||
option including a "a.rb" file and a "a.so" file respectively, the ruby
|
||||
spec says that the ".rb" file should always be preferred. However, the
|
||||
logic we added in https://github.com/rubygems/rubygems/commit/6b81076d9
|
||||
to make the -I option always beat default gems does not respect this
|
||||
spec, creating a difference from the original ruby-core's require.
|
||||
|
||||
[the ruby spec says]: https://github.com/ruby/spec/blob/d80a6e2b221d4f17a8cadcac75ef950c59cba901/core/kernel/shared/require.rb#L234-L246
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 28 +++++------
|
||||
test/rubygems/test_require.rb | 62 +++++++++++++++++++++++++
|
||||
2 files changed, 74 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 60f4d18712..369f2c743e 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,18 +43,18 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
- $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
||||
- safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
- begin
|
||||
- if File.symlink? safe_lp # for backward compatibility
|
||||
- next
|
||||
+ Gem.suffixes.each do |s|
|
||||
+ $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
||||
+ safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
+ begin
|
||||
+ if File.symlink? safe_lp # for backward compatibility
|
||||
+ next
|
||||
+ end
|
||||
+ rescue SecurityError
|
||||
+ RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
+ raise
|
||||
end
|
||||
- rescue SecurityError
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- raise
|
||||
- end
|
||||
|
||||
- Gem.suffixes.each do |s|
|
||||
full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
|
||||
if File.file?(full_path)
|
||||
rp = full_path
|
||||
@@ -67,12 +67,8 @@ def require(path)
|
||||
end
|
||||
|
||||
if resolved_path
|
||||
- begin
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- return gem_original_require(resolved_path)
|
||||
- rescue LoadError
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.enter
|
||||
- end
|
||||
+ RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
+ return gem_original_require(resolved_path)
|
||||
end
|
||||
|
||||
if spec = Gem.find_unresolved_default_spec(path)
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index d618a93473..7cffbfa7fe 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -120,6 +120,24 @@ def test_dash_i_beats_default_gems
|
||||
Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
|
||||
end
|
||||
|
||||
+ def test_dash_i_respects_default_library_extension_priority
|
||||
+ skip "extensions don't quite work on jruby" if Gem.java_platform?
|
||||
+
|
||||
+ dash_i_ext_arg = util_install_extension_file('a')
|
||||
+ dash_i_lib_arg = util_install_ruby_file('a')
|
||||
+
|
||||
+ lp = $LOAD_PATH.dup
|
||||
+
|
||||
+ begin
|
||||
+ $LOAD_PATH.unshift dash_i_lib_arg
|
||||
+ $LOAD_PATH.unshift dash_i_ext_arg
|
||||
+ assert_require 'a'
|
||||
+ assert_match(/a\.rb$/, $LOADED_FEATURES.last)
|
||||
+ ensure
|
||||
+ $LOAD_PATH.replace lp
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
def test_concurrent_require
|
||||
Object.const_set :FILE_ENTERED_LATCH, Latch.new(2)
|
||||
Object.const_set :FILE_EXIT_LATCH, Latch.new(1)
|
||||
@@ -541,4 +559,48 @@ def silence_warnings
|
||||
$VERBOSE = old_verbose
|
||||
end
|
||||
|
||||
+ def util_install_extension_file(name)
|
||||
+ spec = quick_gem name
|
||||
+ util_build_gem spec
|
||||
+
|
||||
+ spec.extensions << "extconf.rb"
|
||||
+ write_file File.join(@tempdir, "extconf.rb") do |io|
|
||||
+ io.write <<-RUBY
|
||||
+ require "mkmf"
|
||||
+ create_makefile("#{name}")
|
||||
+ RUBY
|
||||
+ end
|
||||
+
|
||||
+ write_file File.join(@tempdir, "#{name}.c") do |io|
|
||||
+ io.write <<-C
|
||||
+ #include <ruby.h>
|
||||
+ void Init_#{name}() { }
|
||||
+ C
|
||||
+ end
|
||||
+
|
||||
+ spec.files += ["extconf.rb", "#{name}.c"]
|
||||
+
|
||||
+ so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
|
||||
+ refute_path_exists so
|
||||
+
|
||||
+ path = Gem::Package.build spec
|
||||
+ installer = Gem::Installer.at path
|
||||
+ installer.install
|
||||
+ assert_path_exists so
|
||||
+
|
||||
+ spec.gem_dir
|
||||
+ end
|
||||
+
|
||||
+ def util_install_ruby_file(name)
|
||||
+ dir_lib = Dir.mktmpdir("test_require_lib", @tempdir)
|
||||
+ dash_i_lib_arg = File.join dir_lib
|
||||
+
|
||||
+ a_rb = File.join dash_i_lib_arg, "#{name}.rb"
|
||||
+
|
||||
+ FileUtils.mkdir_p File.dirname a_rb
|
||||
+ File.open(a_rb, 'w') { |f| f.write "# #{name}.rb" }
|
||||
+
|
||||
+ dash_i_lib_arg
|
||||
+ end
|
||||
+
|
||||
end
|
||||
|
|
@ -1,324 +0,0 @@
|
|||
From 00d98eb8a3245fb93a475ecbbbc4c7ec7e6704cd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 19 May 2020 14:00:00 +0200
|
||||
Subject: [PATCH 1/5] Fix performance regression in `require`
|
||||
|
||||
Our check for `-I` paths should not go through all activated gems.
|
||||
---
|
||||
lib/rubygems.rb | 10 ++++++++++
|
||||
lib/rubygems/core_ext/kernel_require.rb | 2 +-
|
||||
lib/rubygems/test_case.rb | 1 +
|
||||
test/rubygems/test_require.rb | 11 +++++++++++
|
||||
4 files changed, 23 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||
index 843cb49e4a..d1a9a1c7e1 100644
|
||||
--- a/lib/rubygems.rb
|
||||
+++ b/lib/rubygems.rb
|
||||
@@ -662,10 +662,20 @@ def self.load_path_insert_index
|
||||
index
|
||||
end
|
||||
|
||||
+ ##
|
||||
+ # The number of paths in the `$LOAD_PATH` from activated gems. Used to
|
||||
+ # prioritize `-I` and `ENV['RUBYLIB`]` entries during `require`.
|
||||
+
|
||||
+ def self.activated_gem_paths
|
||||
+ @activated_gem_paths ||= 0
|
||||
+ end
|
||||
+
|
||||
##
|
||||
# Add a list of paths to the $LOAD_PATH at the proper place.
|
||||
|
||||
def self.add_to_load_path(*paths)
|
||||
+ @activated_gem_paths = activated_gem_paths + paths.size
|
||||
+
|
||||
insert_index = load_path_insert_index
|
||||
|
||||
if insert_index
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index ed24111bd5..7625ce1bee 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -47,7 +47,7 @@ def require(path)
|
||||
load_path_insert_index = Gem.load_path_insert_index
|
||||
break unless load_path_insert_index
|
||||
|
||||
- $LOAD_PATH[0...load_path_insert_index].each do |lp|
|
||||
+ $LOAD_PATH[0...load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb
|
||||
index a05a2898d1..53dd495aef 100644
|
||||
--- a/lib/rubygems/test_case.rb
|
||||
+++ b/lib/rubygems/test_case.rb
|
||||
@@ -385,6 +385,7 @@ def setup
|
||||
Gem::Security.reset
|
||||
|
||||
Gem.loaded_specs.clear
|
||||
+ Gem.instance_variable_set(:@activated_gem_paths, 0)
|
||||
Gem.clear_default_specs
|
||||
Bundler.reset!
|
||||
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index f36892f8cc..9f2fe3439a 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -382,6 +382,17 @@ def test_default_gem_require_activates_just_once
|
||||
assert_equal 0, times_called
|
||||
end
|
||||
|
||||
+ def test_second_gem_require_does_not_resolve_path_manually_before_going_through_standard_require
|
||||
+ a1 = util_spec "a", "1", nil, "lib/test_gem_require_a.rb"
|
||||
+ install_gem a1
|
||||
+
|
||||
+ assert_require "test_gem_require_a"
|
||||
+
|
||||
+ stub(:gem_original_require, ->(path) { assert_equal "test_gem_require_a", path }) do
|
||||
+ require "test_gem_require_a"
|
||||
+ end
|
||||
+ end
|
||||
+
|
||||
def test_realworld_default_gem
|
||||
testing_ruby_repo = !ENV["GEM_COMMAND"].nil?
|
||||
skip "this test can't work under ruby-core setup" if testing_ruby_repo || java_platform?
|
||||
|
||||
From ae95885dff6189c5ac59bbdf685cb4ec4751fdef Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 19 May 2020 14:08:19 +0200
|
||||
Subject: [PATCH 2/5] Refactor `Gem.load_path_insert_index`
|
||||
|
||||
---
|
||||
lib/rubygems.rb | 13 +++----------
|
||||
lib/rubygems/core_ext/kernel_require.rb | 5 +----
|
||||
2 files changed, 4 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
|
||||
index d1a9a1c7e1..ca80326459 100644
|
||||
--- a/lib/rubygems.rb
|
||||
+++ b/lib/rubygems.rb
|
||||
@@ -659,7 +659,7 @@ def self.load_path_insert_index
|
||||
|
||||
index = $LOAD_PATH.index RbConfig::CONFIG['sitelibdir']
|
||||
|
||||
- index
|
||||
+ index || 0
|
||||
end
|
||||
|
||||
##
|
||||
@@ -676,15 +676,8 @@ def self.activated_gem_paths
|
||||
def self.add_to_load_path(*paths)
|
||||
@activated_gem_paths = activated_gem_paths + paths.size
|
||||
|
||||
- insert_index = load_path_insert_index
|
||||
-
|
||||
- if insert_index
|
||||
- # gem directories must come after -I and ENV['RUBYLIB']
|
||||
- $LOAD_PATH.insert(insert_index, *paths)
|
||||
- else
|
||||
- # we are probably testing in core, -I and RUBYLIB don't apply
|
||||
- $LOAD_PATH.unshift(*paths)
|
||||
- end
|
||||
+ # gem directories must come after -I and ENV['RUBYLIB']
|
||||
+ $LOAD_PATH.insert(Gem.load_path_insert_index, *paths)
|
||||
end
|
||||
|
||||
@yaml_loaded = false
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 7625ce1bee..decf4829f1 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -44,10 +44,7 @@ def require(path)
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
Gem.suffixes.each do |s|
|
||||
- load_path_insert_index = Gem.load_path_insert_index
|
||||
- break unless load_path_insert_index
|
||||
-
|
||||
- $LOAD_PATH[0...load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
+ $LOAD_PATH[0...Gem.load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
|
||||
From da1492e9d7b28d068fbfbb0ba1cafcc516681567 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 19 May 2020 14:32:12 +0200
|
||||
Subject: [PATCH 3/5] Extract a local outside the loop
|
||||
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index decf4829f1..6a7faaf2d1 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,8 +43,9 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
+ load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
Gem.suffixes.each do |s|
|
||||
- $LOAD_PATH[0...Gem.load_path_insert_index - Gem.activated_gem_paths].each do |lp|
|
||||
+ $LOAD_PATH[0...load_path_check_index].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
|
||||
From 22ad5717c38feda2375b53628d15ae3db2195684 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Thu, 21 May 2020 15:20:57 +0200
|
||||
Subject: [PATCH 4/5] Fix `$LOADED_FEATURES` cache sometimes not respected
|
||||
|
||||
In the cases where the initial manually `-I` path resolution succeeded,
|
||||
we were passing a full path to the original require effectively skipping
|
||||
the `$LOADED_FEATURES` cache. With this change, we _only_ do the
|
||||
resolution when a matching requirable path is found in a default gem. In
|
||||
that case, we skip activation of the default gem if we detect that the
|
||||
required file will be picked up for a `-I` path.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 53 +++++++++++--------------
|
||||
test/rubygems/test_require.rb | 29 ++++++++++++++
|
||||
2 files changed, 53 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 6a7faaf2d1..81e37b98bf 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -39,46 +39,41 @@ def require(path)
|
||||
|
||||
path = path.to_path if path.respond_to? :to_path
|
||||
|
||||
- # Ensure -I beats a default gem
|
||||
- # https://github.com/rubygems/rubygems/pull/1868
|
||||
- resolved_path = begin
|
||||
- rp = nil
|
||||
- load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
- Gem.suffixes.each do |s|
|
||||
- $LOAD_PATH[0...load_path_check_index].each do |lp|
|
||||
- safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
- begin
|
||||
- if File.symlink? safe_lp # for backward compatibility
|
||||
- next
|
||||
+ if spec = Gem.find_unresolved_default_spec(path)
|
||||
+ # Ensure -I beats a default gem
|
||||
+ # https://github.com/rubygems/rubygems/pull/1868
|
||||
+ resolved_path = begin
|
||||
+ rp = nil
|
||||
+ load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
+ Gem.suffixes.each do |s|
|
||||
+ $LOAD_PATH[0...load_path_check_index].each do |lp|
|
||||
+ safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
+ begin
|
||||
+ if File.symlink? safe_lp # for backward compatibility
|
||||
+ next
|
||||
+ end
|
||||
+ rescue SecurityError
|
||||
+ RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
+ raise
|
||||
end
|
||||
- rescue SecurityError
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- raise
|
||||
- end
|
||||
|
||||
- full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
|
||||
- if File.file?(full_path)
|
||||
- rp = full_path
|
||||
- break
|
||||
+ full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
|
||||
+ if File.file?(full_path)
|
||||
+ rp = full_path
|
||||
+ break
|
||||
+ end
|
||||
end
|
||||
+ break if rp
|
||||
end
|
||||
- break if rp
|
||||
+ rp
|
||||
end
|
||||
- rp
|
||||
- end
|
||||
|
||||
- if resolved_path
|
||||
- RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
- return gem_original_require(resolved_path)
|
||||
- end
|
||||
-
|
||||
- if spec = Gem.find_unresolved_default_spec(path)
|
||||
begin
|
||||
Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease)
|
||||
rescue Exception
|
||||
RUBYGEMS_ACTIVATION_MONITOR.exit
|
||||
raise
|
||||
- end
|
||||
+ end unless resolved_path
|
||||
end
|
||||
|
||||
# If there are no unresolved deps, then we can use just try
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index 9f2fe3439a..2b11e26dfe 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -45,6 +45,35 @@ def refute_require(path)
|
||||
refute require(path), "'#{path}' was not yet required"
|
||||
end
|
||||
|
||||
+ def test_respect_loaded_features_caching_like_standard_require
|
||||
+ dir = Dir.mktmpdir("test_require", @tempdir)
|
||||
+
|
||||
+ lp1 = File.join dir, 'foo1'
|
||||
+ foo1 = File.join lp1, 'foo.rb'
|
||||
+
|
||||
+ FileUtils.mkdir_p lp1
|
||||
+ File.open(foo1, 'w') { |f| f.write "class Object; HELLO = 'foo1' end" }
|
||||
+
|
||||
+ lp = $LOAD_PATH.dup
|
||||
+
|
||||
+ $LOAD_PATH.unshift lp1
|
||||
+ assert_require 'foo'
|
||||
+ assert_equal "foo1", ::Object::HELLO
|
||||
+
|
||||
+ lp2 = File.join dir, 'foo2'
|
||||
+ foo2 = File.join lp2, 'foo.rb'
|
||||
+
|
||||
+ FileUtils.mkdir_p lp2
|
||||
+ File.open(foo2, 'w') { |f| f.write "class Object; HELLO = 'foo2' end" }
|
||||
+
|
||||
+ $LOAD_PATH.unshift lp2
|
||||
+ refute_require 'foo'
|
||||
+ assert_equal "foo1", ::Object::HELLO
|
||||
+ ensure
|
||||
+ $LOAD_PATH.replace lp
|
||||
+ Object.send :remove_const, :HELLO if Object.const_defined? :HELLO
|
||||
+ end
|
||||
+
|
||||
# Providing -I on the commandline should always beat gems
|
||||
def test_dash_i_beats_gems
|
||||
a1 = util_spec "a", "1", {"b" => "= 1"}, "lib/test_gem_require_a.rb"
|
||||
|
||||
From db872c7a18d616f4447bdcca3130be6db9e5cb03 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Sat, 23 May 2020 20:18:41 +0200
|
||||
Subject: [PATCH 5/5] Remove direct reference to PR
|
||||
|
||||
The code is quite different now, so I think the link might be even
|
||||
confusing. If you want to know more, use git history.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 81e37b98bf..115ae0cb50 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -41,7 +41,6 @@ def require(path)
|
||||
|
||||
if spec = Gem.find_unresolved_default_spec(path)
|
||||
# Ensure -I beats a default gem
|
||||
- # https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
From c5197b2ab35ba389f48918e0c773b43b6dca2fa5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Fri, 7 Feb 2020 17:16:05 +0100
|
||||
Subject: [PATCH 1/3] Tweaks to get test passing more reliably
|
||||
|
||||
---
|
||||
test/rubygems/test_require.rb | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/test/rubygems/test_require.rb b/test/rubygems/test_require.rb
|
||||
index 7cffbfa7fe..67c55416d4 100644
|
||||
--- a/test/rubygems/test_require.rb
|
||||
+++ b/test/rubygems/test_require.rb
|
||||
@@ -567,18 +567,20 @@ def util_install_extension_file(name)
|
||||
write_file File.join(@tempdir, "extconf.rb") do |io|
|
||||
io.write <<-RUBY
|
||||
require "mkmf"
|
||||
+ CONFIG['LDSHARED'] = '$(TOUCH) $@ ||'
|
||||
create_makefile("#{name}")
|
||||
RUBY
|
||||
end
|
||||
|
||||
write_file File.join(@tempdir, "#{name}.c") do |io|
|
||||
io.write <<-C
|
||||
- #include <ruby.h>
|
||||
void Init_#{name}() { }
|
||||
C
|
||||
end
|
||||
|
||||
- spec.files += ["extconf.rb", "#{name}.c"]
|
||||
+ write_file File.join(@tempdir, "depend")
|
||||
+
|
||||
+ spec.files += ["extconf.rb", "depend", "#{name}.c"]
|
||||
|
||||
so = File.join(spec.gem_dir, "#{name}.#{RbConfig::CONFIG["DLEXT"]}")
|
||||
refute_path_exists so
|
||||
|
||||
From 7bfd7319cd751837c3ccaf1d97b02846eaaf39d5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 11 Feb 2020 11:56:06 +0100
|
||||
Subject: [PATCH 2/3] Fix bug bug calculating $LOAD_PATH's to check in
|
||||
`require`
|
||||
|
||||
In `Gem.load_path_insert_index` is not set, we end up having
|
||||
`$LOAD_PATH[0...-1]`, unintentionally skipping the last $LOAD_PATH entry
|
||||
from the check.
|
||||
|
||||
The correct thing to do in that case is to not even try since we have no
|
||||
way of distinguisng default LOAD_PATH entries from those added with -I.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 369f2c743e..a8d170f13a 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -44,7 +44,10 @@ def require(path)
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
Gem.suffixes.each do |s|
|
||||
- $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp|
|
||||
+ load_path_insert_index = Gem.load_path_insert_index
|
||||
+ break unless load_path_insert_index
|
||||
+
|
||||
+ $LOAD_PATH[0...load_path_insert_index].each do |lp|
|
||||
safe_lp = lp.dup.tap(&Gem::UNTAINT)
|
||||
begin
|
||||
if File.symlink? safe_lp # for backward compatibility
|
||||
|
||||
From 4fc0ab21c0f7713829abb522ce3b6d8e24c126b3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Fri, 14 Feb 2020 02:03:04 +0100
|
||||
Subject: [PATCH 3/3] Exclude empty suffix from `-I` require loop
|
||||
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index a8d170f13a..9712fb6ac0 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,7 +43,7 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
- Gem.suffixes.each do |s|
|
||||
+ Gem.suffixes[1..-1].each do |s|
|
||||
load_path_insert_index = Gem.load_path_insert_index
|
||||
break unless load_path_insert_index
|
||||
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From 301e30bf97dd603ca81d52b90186908575c4ddf8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?David=20Rodr=C3=ADguez?= <deivid.rodriguez@riseup.net>
|
||||
Date: Tue, 25 Feb 2020 15:01:44 +0100
|
||||
Subject: [PATCH] Revert "Exclude empty suffix from `-I` require loop"
|
||||
|
||||
This reverts commit 4fc0ab21c0f7713829abb522ce3b6d8e24c126b3.
|
||||
|
||||
Technically, extensionless ruby files are valid ruby files that can be
|
||||
required. For example, `bin/bundle` is sometimes required from other
|
||||
binstubs even if it's also runnable directly.
|
||||
|
||||
So, we should technically consider this kind of files too.
|
||||
---
|
||||
lib/rubygems/core_ext/kernel_require.rb | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
|
||||
index 9712fb6ac0..a8d170f13a 100644
|
||||
--- a/lib/rubygems/core_ext/kernel_require.rb
|
||||
+++ b/lib/rubygems/core_ext/kernel_require.rb
|
||||
@@ -43,7 +43,7 @@ def require(path)
|
||||
# https://github.com/rubygems/rubygems/pull/1868
|
||||
resolved_path = begin
|
||||
rp = nil
|
||||
- Gem.suffixes[1..-1].each do |s|
|
||||
+ Gem.suffixes.each do |s|
|
||||
load_path_insert_index = Gem.load_path_insert_index
|
||||
break unless load_path_insert_index
|
||||
|
||||
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
SHA512 (ruby-2.7.2.tar.xz) = 7972278b096aa768c7adf2befd26003e18781a29ca317640317d30d93d6e963ded197724c8e2f1dfe1e838c5647176d414a74732a62e931fb50d6f2e0f777349
|
||||
SHA512 (ruby-2.7.4.tar.xz) = 2cbb70ecfdd69120e789023ddb2b25cab0d03bc33fdc367a8f74ca8a3ee785c18c8ded9de3ecee627c7e275ffb85147e6abf921b6a61e31851b37c7fedf45bf9
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue