Created

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist

Ruby 1.9.2-p180 require performance patch

View load.patch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
--- a/load.c 2010-10-23 05:36:38.000000000 -0400
+++ b/patchload.c 2011-06-05 08:58:00.000000000 -0400
@@ -40,14 +40,6 @@
VALUE ary;
long i;
- for (i = 0; i < RARRAY_LEN(load_path); ++i) {
- VALUE str = rb_check_string_type(RARRAY_PTR(load_path)[i]);
- if (NIL_P(str) || !rb_is_absolute_path(RSTRING_PTR(str)))
- goto relative_path_found;
- }
- return load_path;
-
- relative_path_found:
ary = rb_ary_new2(RARRAY_LEN(load_path));
for (i = 0; i < RARRAY_LEN(load_path); ++i) {
VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
@@ -81,16 +73,27 @@
int type, VALUE load_path)
{
long i;
+ long plen;
+ const char *e;
+ if(vlen < len) return 0;
+ if (!strncmp(name+(vlen-len),feature,len)){
+ plen = vlen - len - 1;
+ } else {
+ for (e = name + vlen; name != e && *e != '.' && *e != '/'; --e);
+ if (*e!='.' ||
+ e-name < len ||
+ strncmp(e-len,feature,len) )
+ return 0;
+ plen = e - name - len - 1;
+ }
for (i = 0; i < RARRAY_LEN(load_path); ++i) {
VALUE p = RARRAY_PTR(load_path)[i];
const char *s = StringValuePtr(p);
long n = RSTRING_LEN(p);
- if (vlen < n + len + 1) continue;
+ if (n != plen ) continue;
if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
- if (strncmp(name + n + 1, feature, len)) continue;
- if (name[n+len+1] && name[n+len+1] != '.') continue;
switch (type) {
case 's':
if (IS_DLEXT(&name[n+len+1])) return p;
View load.patch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
--- a/load.c 2010-10-23 05:36:38.000000000 -0400
+++ b/patchload.c 2011-06-05 08:58:00.000000000 -0400
@@ -81,16 +73,27 @@
int type, VALUE load_path)
{
long i;
+ long plen;
+ const char *e;
+ if(vlen < len) return 0;
+ if (!strncmp(name+(vlen-len),feature,len)){
+ plen = vlen - len - 1;
+ } else {
+ for (e = name + vlen; name != e && *e != '.' && *e != '/'; --e);
+ if (*e!='.' ||
+ e-name < len ||
+ strncmp(e-len,feature,len) )
+ return 0;
+ plen = e - name - len - 1;
+ }
for (i = 0; i < RARRAY_LEN(load_path); ++i) {
VALUE p = RARRAY_PTR(load_path)[i];
const char *s = StringValuePtr(p);
long n = RSTRING_LEN(p);
- if (vlen < n + len + 1) continue;
+ if (n != plen ) continue;
if (n && (strncmp(name, s, n) || name[n] != '/')) continue;
- if (strncmp(name + n + 1, feature, len)) continue;
- if (name[n+len+1] && name[n+len+1] != '.') continue;
switch (type) {
case 's':
if (IS_DLEXT(&name[n+len+1])) return p;
Owner
taf2 commented

Based on the performance patch in ruby-head e.g. 1.9.3 but back ported to 1.9.2-p180... easy
curl https://gist.github.com/raw/1008945/f32c4973c4e5aec47fa541b0f79d2757c3a79e0c/load.patch > load.patch
rvm install ruby-1.9.2-p180 --patch load.patch

dgm commented

[2011-06-05 09:32:21] patch -F25 -p1 -f <"/Users/dgm/workspace/load.patch"
missing header for unified diff at line 3 of patch
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?

The text leading up to this was:

|--- load.c 2010-10-23 05:36:38.000000000 -0400

|+++ patchload.c 2011-06-05 08:58:00.000000000 -0400

No file to patch. Skipping patch.
2 out of 2 hunks ignored

Owner
taf2 commented

dgm, worked here... I created it as diff -u load.c loadpatch.c >load.patch... to apply manually, patch -p0 <load.patch

Owner
taf2 commented

Okay, I see, i updated the patch to be rvm friendly, prefixed a/ and b/

dgm commented

Ok, the url changed. This appears to work:

curl https://gist.github.com/raw/1008945/7532898172cd9f03b4c0d0db145bc2440dcbb2f6/load.patch > load.patch
rvm install ruby-1.9.2-p180 --patch load.patch

the url failed for me with a redirect to this
curl https://raw.github.com/gist/1008945/7532898172cd9f03b4c0d0db145bc2440dcbb2f6 > load.patch
rvm install ruby-1.9.2-p180 --patch load.patch

Owner
taf2 commented

Thought it might be worth pointing out there is a much faster way to apply this patch, assuming you already have 1.9.2 installed via rvm. It requires 1 extra step, but avoids a full recompile.

  1. download this patch: https://gist.github.com/1014298, it doesn't have the leading a/ and b/
  2. apply the patch: patch -p0 < path/to/load.patch
  3. make && make install
Bregor commented

After running

$ rvm install ruby-1.9.2-p180 --patch ./load.patch -n patched

I got following error:

ERROR: Error running 'make ', please read /Users/bregor/Developer/.rvm/log/ruby-1.9.2-p180-patched/make.log
ERROR: There has been an error while running make. Halting the installation.

Log:

$ cat /Users/bregor/Developer/.rvm/log/ruby-1.9.2-p180-patched/make.log

[2011-06-09 13:36:20] make 
gcc -I/Users/bregor/Developer/include -fno-common -pipe -I. -I.ext/include/x86_64-darwin10.7.4 -I./include -I. -DRUBY_EXPORT -I/Users/bregor/Developer/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -o load.o -c load.c
load.c: In function ‘get_loaded_features_hash’:
load.c:99: error: ‘rb_vm_t’ has no member named ‘loaded_features_hash’
load.c:102: error: ‘rb_vm_t’ has no member named ‘loaded_features_hash’
load.c: In function ‘get_filename_expansion_hash’:
load.c:112: error: ‘rb_vm_t’ has no member named ‘filename_expansion_hash’
load.c:115: error: ‘rb_vm_t’ has no member named ‘filename_expansion_hash’
load.c: In function ‘rb_feature_p’:
load.c:292: error: ‘loadable_ext’ undeclared (first use in this function)
load.c:292: error: (Each undeclared identifier is reported only once
load.c:292: error: for each function it appears in.)
load.c: In function ‘Init_load’:
load.c:773: error: ‘j’ undeclared (first use in this function)
make: *** [load.o] Error 1

Environment:

$ uname -a
Darwin marcuria 10.7.4 Darwin Kernel Version 10.7.4: Mon Apr 18 21:24:17 PDT 2011; root:xnu-1504.14.12~3/RELEASE_X86_64 x86_64

$ rvm --version                                              
rvm 1.6.20 by Wayne E. Seguin (wayneeseguin@gmail.com) [https://rvm.beginrescueend.com/]

$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Owner
taf2 commented

@Bregor, you'll need to reapply the patch from a clean tree... I think rvm clean and then try the patch.

Bregor commented

@taf2 thank you! Works like a charm.

Bregor commented

@taf2, have you any plans to update this patch for 1.9.2-p290?

Owner
taf2 commented

@Bregor, I bet it works for p290? Have you tried it?

Bregor commented

@taf2:

Applying patch './load.patch' (located at /tmp/load.patch)
ERROR: Error running 'patch -F25 -p1 -f <"/tmp/load.patch"', please read /Users/bregor/Developer/.rvm/log/ruby-1.9.2-p290-patched/patch.apply.load.patch.log

log:

[2011-07-15 19:13:29] patch -F25 -p1 -f <"/tmp/load.patch"
patching file load.c
Hunk #1 FAILED at 40.
Hunk #2 succeeded at 65 (offset -8 lines).
1 out of 2 hunks FAILED -- saving rejects to file load.c.rej
Owner
taf2 commented

Alright, I'll take a look.

Owner
taf2 commented

@Bregor, i attached the updated patch it's actually much smaller: ruby-1.9.2p290.patch

The patch is failing for me using RVM and 1.9.2 . Did I get the wrong version? where do I find the ruby-1.9.2p290.patch?

[2011-10-27 15:40:24] patch -F25 -p1 -f <"/home/emmanuel/require.patch"
patching file load.c
Hunk #1 FAILED at 40.
Hunk #2 succeeded at 73 (offset -8 lines).
1 out of 2 hunks FAILED -- saving rejects to file load.c.rej
~

@epinault-ttc I wouldn't recommend using any of these any more, these patchsets work great: https://github.com/skaes/rvm-patchsets

@aaronjensen: Thanks! seems to work now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.