Một số tìm kiếm ý nghĩa phát hiện ra này thú vị chút fragment (Tôi thực sự đã như xa như trang của việc tìm kiếm của Google):
if (inline_depth() > MaxInlineLevel) {
return "inlining too deep";
}
if (method() == callee_method
&& inline_depth() > MaxRecursiveInlineLevel) {
return "recursively inlining too deep";
}
những gợi ý rằng MaxInlineLevel
là như mong đợi một giới hạn cứng để cách sâu bạn đi trước khi bạn ngừng nội tuyến. Nó cũng cho thấy rằng MaxRecursiveInlineLevel
chỉ đề cập đến các cuộc gọi đệ quy trực tiếp, chứ không phải các cuộc gọi đệ quy đột biến chẳng hạn như foo()
gọi bar()
gọi foo()
.
Vì vậy, tôi nghĩ rằng tôi đã đúng trong nhận xét đoán của tôi - MaxInlineLevel
là để bảo vệ chống lại lẫn nhau đệ quy vì để phát hiện ra rằng bạn sẽ cần phải giữ tham chiếu đến chiều sâu đầy đủ của ngăn xếp cuộc gọi nội tuyến.
MaxInlineResursionLevel
điều khiển foo()
gọi foo()
nội tuyến.
Lưu ý rằng mã được tham chiếu có thể không phải là JVM thực.
Nhận xét của @apangin đặt phiên bản hiện đại hơn của điểm phát sóng từ Open JDK 8 cho thấy rằng hiện nay không còn đơn giản như vậy nữa. Dường như ngăn xếp đầy đủ được tìm kiếm cho các cuộc gọi đệ quy để đệ quy lẫn nhau bây giờ có thể bị chặn đi quá MaxRecursiveInlineLevel
.
Không nhất thiết phải chắc chắn nhưng có lẽ để tránh bẫy đệ quy lẫn nhau có thể khó khăn/tốn kém để phòng thủ theo những cách khác. – OldCurmudgeon
@OldCurmudgeon nhưng sau đó bạn có MaxRecursiveInlineLevel – MrSimpleMind
@MrSimpleMind - Thú vị - do đó tôi rõ ràng là sai. Phải là một lý do khác. – OldCurmudgeon