[前][次][番号順一覧][スレッド一覧]

ruby-changes:66453

From: Aaron <ko1@a...>
Date: Fri, 11 Jun 2021 08:31:55 +0900 (JST)
Subject: [ruby-changes:66453] d74e5d5b4f (master): Crash more nicely when the VM isn't fully set up

https://git.ruby-lang.org/ruby.git/commit/?id=d74e5d5b4f

From d74e5d5b4fba41a9120b3ed2762cf765478605ad Mon Sep 17 00:00:00 2001
From: Aaron Patterson <tenderlove@r...>
Date: Thu, 10 Jun 2021 16:03:11 -0700
Subject: Crash more nicely when the VM isn't fully set up

If we crash but the VM isn't fully alive, we can get an infinite loop.
---
 vm_dump.c | 62 ++++++++++++++++++++++++++++++++------------------------------
 1 file changed, 32 insertions(+), 30 deletions(-)

diff --git a/vm_dump.c b/vm_dump.c
index ea94ee1..bc23f7a 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -1062,36 +1062,38 @@ rb_vm_bugreport(const void *ctx) https://github.com/ruby/ruby/blob/trunk/vm_dump.c#L1062
 		    LIMITED_NAME_LENGTH(name), RSTRING_PTR(name));
 	    fprintf(stderr, "\n");
         }
-	fprintf(stderr, "* Loaded features:\n\n");
-	for (i=0; i<RARRAY_LEN(vm->loaded_features); i++) {
-	    name = RARRAY_AREF(vm->loaded_features, i);
-	    if (RB_TYPE_P(name, T_STRING)) {
-		fprintf(stderr, " %4d %.*s\n", i,
-			LIMITED_NAME_LENGTH(name), RSTRING_PTR(name));
-	    }
-	    else if (RB_TYPE_P(name, T_CLASS) || RB_TYPE_P(name, T_MODULE)) {
-		const char *const type = RB_TYPE_P(name, T_CLASS) ?
-		    "class" : "module";
-		name = rb_search_class_path(rb_class_real(name));
-		if (!RB_TYPE_P(name, T_STRING)) {
-		    fprintf(stderr, " %4d %s:<unnamed>\n", i, type);
-		    continue;
-		}
-		fprintf(stderr, " %4d %s:%.*s\n", i, type,
-			LIMITED_NAME_LENGTH(name), RSTRING_PTR(name));
-	    }
-	    else {
-		VALUE klass = rb_search_class_path(rb_obj_class(name));
-		if (!RB_TYPE_P(klass, T_STRING)) {
-		    fprintf(stderr, " %4d #<%p:%p>\n", i,
-			    (void *)CLASS_OF(name), (void *)name);
-		    continue;
-		}
-		fprintf(stderr, " %4d #<%.*s:%p>\n", i,
-			LIMITED_NAME_LENGTH(klass), RSTRING_PTR(klass),
-			(void *)name);
-	    }
-	}
+        if (vm->loaded_features) {
+            fprintf(stderr, "* Loaded features:\n\n");
+            for (i=0; i<RARRAY_LEN(vm->loaded_features); i++) {
+                name = RARRAY_AREF(vm->loaded_features, i);
+                if (RB_TYPE_P(name, T_STRING)) {
+                    fprintf(stderr, " %4d %.*s\n", i,
+                            LIMITED_NAME_LENGTH(name), RSTRING_PTR(name));
+                }
+                else if (RB_TYPE_P(name, T_CLASS) || RB_TYPE_P(name, T_MODULE)) {
+                    const char *const type = RB_TYPE_P(name, T_CLASS) ?
+                        "class" : "module";
+                    name = rb_search_class_path(rb_class_real(name));
+                    if (!RB_TYPE_P(name, T_STRING)) {
+                        fprintf(stderr, " %4d %s:<unnamed>\n", i, type);
+                        continue;
+                    }
+                    fprintf(stderr, " %4d %s:%.*s\n", i, type,
+                            LIMITED_NAME_LENGTH(name), RSTRING_PTR(name));
+                }
+                else {
+                    VALUE klass = rb_search_class_path(rb_obj_class(name));
+                    if (!RB_TYPE_P(klass, T_STRING)) {
+                        fprintf(stderr, " %4d #<%p:%p>\n", i,
+                                (void *)CLASS_OF(name), (void *)name);
+                        continue;
+                    }
+                    fprintf(stderr, " %4d #<%.*s:%p>\n", i,
+                            LIMITED_NAME_LENGTH(klass), RSTRING_PTR(klass),
+                            (void *)name);
+                }
+            }
+        }
 	fprintf(stderr, "\n");
     }
 
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]