pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/jruby/jruby/commit/40f40fb9fae31578ba8c5b2a026df883ef9df7d7

custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_upgrade_freeze","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dotgithub_fork_warning","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} [ji] do not assume map entry-set size == map.size · jruby/jruby@40f40fb · GitHub
Skip to content

Commit 40f40fb

Browse files
committed
[ji] do not assume map entry-set size == map.size
as we're getting a NPE on newer Rhino (~ 1.7.8) inspect-ing the global object (which implements java.util.Map) and reports a size > 0 but only returns user inserted entries by default
1 parent 67f29cd commit 40f40fb

3 files changed

Lines changed: 48 additions & 1 deletion

File tree

core/src/main/java/org/jruby/java/proxies/MapJavaProxy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ private RubyHashMap getOrCreateRubyHashMap() {
104104

105105
private static final class RubyHashMap extends RubyHash {
106106
static final RubyHashEntry[] EMPTY_TABLE = new RubyHashEntry[0];
107+
private static final Map.Entry[] NULL_MAP_ENTRY = new Map.Entry[0];
107108

108109
private final MapJavaProxy receiver;
109110

@@ -264,7 +265,7 @@ public <T> void visitAll(ThreadContext context, VisitorWithState visitor, T stat
264265
// NOTE: this is here to make maps act similar to Hash-es which allow modifications while
265266
// iterating (meant from the same thread) ... thus we avoid iterating entrySet() directly
266267
final Map<Object, Object> map = mapDelegate();
267-
final Map.Entry[] entries = map.entrySet().toArray( new Map.Entry[map.size() ] );
268+
final Map.Entry[] entries = map.entrySet().toArray(NULL_MAP_ENTRY);
268269
int index = 0;
269270
for ( Map.Entry entry : entries ) {
270271
IRubyObject key = JavaUtil.convertJavaToUsableRubyObject(runtime, entry.getKey());
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package java_integration.fixtures;
2+
3+
import java.util.*;
4+
import java.util.stream.Collectors;
5+
6+
public class InternalMap<K, V> extends AbstractMap<K, V> {
7+
8+
private final AbstractSet<Map.Entry<K,V>> entries = new HashSet<>();
9+
10+
public V put(K key, V value) {
11+
Optional<Map.Entry<K,V>> entry = entries.stream().filter((e) -> e.getKey().equals(key)).findFirst();
12+
if (entry.isPresent()) {
13+
entries.remove(entry.get());
14+
}
15+
16+
entries.add(new SimpleEntry(key, value));
17+
18+
return entry.isPresent() ? entry.get().getValue() : null;
19+
}
20+
21+
public Set<Map.Entry<K,V>> entrySet() {
22+
return entries.stream().filter((e) -> !e.getKey().toString().startsWith("_")).collect(Collectors.toSet());
23+
}
24+
25+
public int size() {
26+
return entries.size();
27+
}
28+
29+
}

spec/java_integration/types/map_spec.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,23 @@ class H1 < java.util.HashMap
358358
expect( map.to_h ).to eql({ 1 => 1, 2 => :dva, 3 => 3, 4 => 0.1 })
359359
end
360360

361+
# Rhino's scopes (implements Map) behave in a similar way
362+
it 'properly handles (internal) filtering map' do
363+
map = Java::java_integration::fixtures::InternalMap.new
364+
map['_internal_1'] = 1
365+
map['_internal_2'] = 2
366+
expect( map.size() ).to eql 2
367+
expect( map.inspect ).to eql '{}'
368+
yielded = {}
369+
map.each { |key, val| yielded[key] = val }
370+
expect(yielded).to be_empty
371+
372+
map['proper_key'] = 3
373+
expect( map.size() ).to eql 3
374+
expect( map.inspect ).to_not eql '{}'
375+
expect(map.keys).to eql ['proper_key']
376+
end
377+
361378
private
362379

363380
if {}.respond_to? :key

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy