Commit Graph
1155 Commits
Author SHA1 Message Date
Tobi Lutke 94562eae32 Fast return for primitive types in find_variable — skip to_liquid and respond_to?(:context=)\n\nResult: {"status":"keep","combined_µs":4225,"parse_µs":3009,"render_µs":1216,"allocations":25535} 2026-03-11 10:31:59 -04:00
Tobi Lutke 0e84955531 Skip find_index when only one scope in find_variable — go straight to environments\n\nResult: {"status":"keep","combined_µs":4323,"parse_µs":3055,"render_µs":1268,"allocations":25535} 2026-03-11 10:31:35 -04:00
Tobi Lutke c4593ceeb6 Skip respond_to?(:context=) for primitive types in find_variable — avoids method lookup overhead\n\nResult: {"status":"keep","combined_µs":4207,"parse_µs":2943,"render_µs":1264,"allocations":25535} 2026-03-11 10:30:41 -04:00
Tobi Lutke 9e2937945b Use EMPTY_ARRAY for empty static_environments in Context — avoids 60 array allocs per render cycle\n\nResult: {"status":"keep","combined_µs":4262,"parse_µs":3079,"render_µs":1183,"allocations":25535} 2026-03-11 10:26:30 -04:00
Tobi Lutke cd308b8b01 Lazy @changes hash in Registers — only allocate when a register is actually written\n\nResult: {"status":"keep","combined_µs":4287,"parse_µs":3059,"render_µs":1228,"allocations":25595} 2026-03-11 10:25:29 -04:00
Tobi Lutke e3fc735de7 Cache block_delimiter strings per tag name — avoids repeated string interpolation\n\nResult: {"status":"keep","combined_µs":4372,"parse_µs":3127,"render_µs":1245,"allocations":25605} 2026-03-11 10:23:56 -04:00
Tobi Lutke 9af3ba3aa7 Lazy Context init: defer StringScanner and @interrupts array allocation until needed\n\nResult: {"status":"keep","combined_µs":4299,"parse_µs":3057,"render_µs":1242,"allocations":26015} 2026-03-11 10:22:29 -04:00
Tobi Lutke 99e55c2eb5 Cache small integer to_s (0-999): avoids 267 Integer#to_s allocations per render cycle\n\nResult: {"status":"keep","combined_µs":4158,"parse_µs":2920,"render_µs":1238,"allocations":26128} 2026-03-11 10:20:45 -04:00
Tobi Lutke b48615f4a7 Replace split+join in truncatewords with manual word scan — avoids array + string allocations\n\nResult: {"status":"keep","combined_µs":4280,"parse_µs":3009,"render_µs":1271,"allocations":26395} 2026-03-11 10:20:11 -04:00
Tobi Lutke 6723d4fa15 Extend fast-path filter parsing to handle comma-separated multi-arg filters (e.g. pluralize: 'item', 'items')\n\nResult: {"status":"keep","combined_µs":4266,"parse_µs":3032,"render_µs":1234,"allocations":26480} 2026-03-11 10:16:39 -04:00
Tobi Lutke c252d50aa0 Avoid expr_markup byteslice when name is entire markup string (no whitespace, no filters)\n\nResult: {"status":"keep","combined_µs":4277,"parse_µs":3057,"render_µs":1220,"allocations":27026} 2026-03-11 10:12:26 -04:00
Tobi Lutke a249010cef Fast-path single-arg filter parsing: handle quoted strings, numbers, identifiers without Lexer/Parser\n\nResult: {"status":"keep","combined_µs":4427,"parse_µs":3181,"render_µs":1246,"allocations":27235} 2026-03-11 10:09:59 -04:00
Tobi Lutke 18a72db820 fix rubocop offenses: autocorrect style/layout violations 2026-03-11 09:53:44 -04:00
Tobi Lutke cdc34388e3 For tag: migrate lax_parse to Cursor with zero-alloc skip_id/expect_id 2026-03-11 09:19:59 -04:00
Tobi Lutke bf1f5cb62d Cursor: add skip_id, expect_id, skip_fragment for zero-alloc scanning 2026-03-11 09:19:27 -04:00
Tobi Lutke 0596591fdf REVERTED: Cursor for For tag adds 148 allocs from scan_id/scan_fragment string creation\n\nResult: {"status":"discard","combined_µs":5049,"parse_us":3765,"render_us":1284,"allocations":29793,"parse_µs":3765,"render_µs":1284} 2026-03-11 09:18:35 -04:00
Tobi Lutke dd4a100346 remove dead BlockBody.parse_tag_token and If SIMPLE_CONDITION - now in Cursor 2026-03-11 09:17:29 -04:00
Tobi Lutke 9de1527099 introduce Cursor class: centralize byte-level scanning for tag/variable/condition parsing 2026-03-11 09:15:21 -04:00
Tobi Lutke 091534f981 add parse_simple to skip simple_lookup? check when caller validates 2026-03-11 09:10:05 -04:00
Tobi Lutke 0b07487e0c fast-path VariableLookup init: skip scan_variable for simple identifier chains 2026-03-11 09:08:44 -04:00
Tobi Lutke 3799d4c488 avoid allocating seen={} hash in Utils.to_s/inspect when not needed 2026-03-11 09:02:42 -04:00
Tobi Lutke b90d7f0a08 optimize Context init: avoid unnecessary array wrapping for environments 2026-03-11 08:56:45 -04:00
Tobi Lutke 405e3dca48 use frozen EMPTY_ARRAY/EMPTY_HASH for Context @filters/@disabled_tags 2026-03-11 08:55:55 -04:00
Tobi Lutke 69430e9a88 replace INTEGER_REGEX/FLOAT_REGEX with byte-level parse_number 2026-03-11 08:54:31 -04:00
Tobi Lutke 79840b1eaa replace SIMPLE_CONDITION regex with manual byte parser in if/elsif lax_parse 2026-03-11 08:52:49 -04:00
Tobi Lutke 4cda1a578c fast-path slice_collection: skip copy for full Array without offset/limit 2026-03-11 08:50:34 -04:00
Tobi Lutke d574f193dc add invoke_two fast path for single-arg filter invocation, avoids splat chain 2026-03-11 08:49:37 -04:00
Tobi Lutke 76ae8f13e9 fast-path find_variable: check top scope first before find_index 2026-03-11 08:48:16 -04:00
Tobi Lutke 526af22574 add invoke_single fast path for no-arg filter invocation, avoids splat alloc 2026-03-11 08:47:21 -04:00
Tobi Lutke 03a1977ffe fast-path simple if truthiness: use byte scanner before SIMPLE_CONDITION regex 2026-03-11 08:36:28 -04:00
Tobi Lutke 2e207e6844 replace WhitespaceOrNothing regex with byte-level blank_string? check 2026-03-11 08:34:15 -04:00
Tobi Lutke e5933fc6e4 avoid array allocation in parse_tag_token: return tag_name, store markup/newlines as class ivars 2026-03-11 08:33:19 -04:00
Tobi Lutke 1882edb1e1 clean up filter parsing: Lexer fallback for args, no-arg fast scan stays 2026-03-11 08:31:30 -04:00
Tobi Lutke 9fd7cec564 split filter parsing: scan no-arg filters directly, only invoke Lexer when args present 2026-03-11 08:26:04 -04:00
Tobi Lutke 17daac92da extend fast-path to handle quoted string literal variables (262 more fast-pathed) 2026-03-11 08:20:39 -04:00
Tobi Lutke 283961d6c9 skip filter arg splat for no-arg filters, trim render loop comments 2026-03-11 08:06:23 -04:00
Tobi Lutke db434923d0 hoist write score check out of render loop: skip increment_write_score when no limits active 2026-03-11 08:04:40 -04:00
Tobi Lutke b86143eb0e use frozen EMPTY_ARRAY for disabled_tags in Variable 2026-03-11 07:47:51 -04:00
Tobi Lutke 58d2514521 return [tag_name, markup, newlines] from parse_tag_token: avoid 2 whitespace string allocs 2026-03-11 07:45:15 -04:00
Tobi Lutke 82407092cc use getbyte dispatch instead of start_with? in parse_for_document 2026-03-11 07:44:12 -04:00
Tobi Lutke 544d8f1c17 avoid empty array allocation in evaluate_filter_expressions for no-arg filters 2026-03-11 07:43:09 -04:00
Tobi Lutke cfa0dfe3ca replace For tag Syntax regex with manual byte-level parser 2026-03-11 07:39:36 -04:00
Tobi Lutke 2d3b856b36 expose expression_cache/string_scanner via attr_reader, skip regex in filter args without colon 2026-03-11 07:38:16 -04:00
Tobi Lutke 8a92a4e451 unified fast-path Variable parsing: handle both plain lookups and filter chains without full Lexer pass for name 2026-03-11 07:36:29 -04:00
Tobi Lutke f8b015646a fast-path render for filter-less variables: skip render method overhead 2026-03-11 07:33:18 -04:00
Tobi Lutke 6bcc2936a2 skip TagAttributes scan in for tag when no colon present 2026-03-11 07:32:39 -04:00
Tobi Lutke fe7a2f5aa8 fast-path simple if conditions: skip ExpressionsAndOperators scan for single conditions 2026-03-11 07:31:26 -04:00
Tobi Lutke 3939d74531 replace SIMPLE_VARIABLE regex with byte-level scanner to avoid MatchData 2026-03-11 07:30:34 -04:00
Tobi Lutke 25f9224c85 fast-path simple variable parsing: skip Lexer/Parser for plain dot-separated lookups 2026-03-11 07:29:47 -04:00
Tobi Lutke 5da223275a use frozen EMPTY_ARRAY for Variable filters when no filters present 2026-03-11 07:28:04 -04:00