Skip to content

Commit

Permalink
fix(common): Workaround the Arc and rkyv issue (#7321)
Browse files Browse the repository at this point in the history
**Description:**

Attempt to workaround #7238.

Originally I thought this is related with oom or memory layout, then realized actual deserialization error occurs in weird position - it tries to deserialize BytePos (which is obvious type) and it fails. It made me think maybe a property next to the struct layout have some unexpected behavior, notably Arc<String>.

PR applies same workaround as Atom does, and it seems to at least pass swc-coverage-instrument's usecases. May need bit more verification with other plugins to see if we can call this out as reliable workaround.
  • Loading branch information
kwonoj committed Apr 24, 2023
1 parent 51f3840 commit 577f81e
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
50 changes: 50 additions & 0 deletions crates/swc_common/src/syntax_pos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,55 @@ impl Sub<BytePos> for NonNarrowChar {
}
}

/// This is not a public interface, workaround for https://github.com/swc-project/swc/issues/7238
#[doc(hidden)]
#[cfg(feature = "rkyv-impl")]
#[derive(Debug, Clone, Copy)]
pub struct EncodeArcString;

#[cfg(feature = "rkyv-impl")]
impl rkyv::with::ArchiveWith<Lrc<String>> for EncodeArcString {
type Archived = rkyv::Archived<String>;
type Resolver = rkyv::Resolver<String>;

unsafe fn resolve_with(
field: &Lrc<String>,
pos: usize,
resolver: Self::Resolver,
out: *mut Self::Archived,
) {
let s = field.to_string();
rkyv::Archive::resolve(&s, pos, resolver, out);
}
}

#[cfg(feature = "rkyv-impl")]
impl<S> rkyv::with::SerializeWith<Lrc<String>, S> for EncodeArcString
where
S: ?Sized + rkyv::ser::Serializer,
{
fn serialize_with(field: &Lrc<String>, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
rkyv::string::ArchivedString::serialize_from_str(field, serializer)
}
}

#[cfg(feature = "rkyv-impl")]
impl<D> rkyv::with::DeserializeWith<rkyv::Archived<String>, Lrc<String>, D> for EncodeArcString
where
D: ?Sized + rkyv::Fallible,
{
fn deserialize_with(
field: &rkyv::Archived<String>,
deserializer: &mut D,
) -> Result<Lrc<String>, D::Error> {
use rkyv::Deserialize;

let s: String = field.deserialize(deserializer)?;

Ok(s.into())
}
}

/// A single source in the SourceMap.
#[cfg_attr(
any(feature = "rkyv-impl"),
Expand All @@ -836,6 +885,7 @@ pub struct SourceFile {
/// Indicates which crate this `SourceFile` was imported from.
pub crate_of_origin: u32,
/// The complete source code
#[cfg_attr(any(feature = "rkyv-impl"), with(EncodeArcString))]
pub src: Lrc<String>,
/// The source code's hash
pub src_hash: u128,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@ use swc_common::plugin::serialized::{deserialize_from_ptr, PluginSerializedBytes
)]
pub struct AllocatedBytesPtr(pub u32, pub u32);

#[cfg(target_arch = "wasm32")]
extern "C" {
fn __free(ptr: *mut u8, size: i32) -> i32;
}
#[cfg(target_arch = "wasm32")]
impl Drop for AllocatedBytesPtr {
fn drop(&mut self) {
unsafe {
__free(self.0 as _, self.1 as _);
}
}
}

#[cfg(not(feature = "__rkyv"))]
fn read_returned_result_from_host_inner<F>(f: F) -> Option<AllocatedBytesPtr> {
unimplemented!("Plugin proxy does not work without serialization support")
Expand Down

1 comment on commit 577f81e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 577f81e Previous: 66b5b11 Ratio
es/full/bugs-1 298983 ns/iter (± 13936) 315130 ns/iter (± 29303) 0.95
es/full/minify/libraries/antd 1547551128 ns/iter (± 21711343) 1556386961 ns/iter (± 33976196) 0.99
es/full/minify/libraries/d3 294247426 ns/iter (± 14248468) 319328800 ns/iter (± 12490364) 0.92
es/full/minify/libraries/echarts 1186462242 ns/iter (± 30465419) 1235412101 ns/iter (± 29968872) 0.96
es/full/minify/libraries/jquery 90737149 ns/iter (± 1000954) 96364130 ns/iter (± 3130069) 0.94
es/full/minify/libraries/lodash 104932341 ns/iter (± 1069936) 111597376 ns/iter (± 2287661) 0.94
es/full/minify/libraries/moment 52215407 ns/iter (± 1210417) 55267452 ns/iter (± 1156841) 0.94
es/full/minify/libraries/react 19177403 ns/iter (± 221925) 20022557 ns/iter (± 290704) 0.96
es/full/minify/libraries/terser 240715459 ns/iter (± 3639104) 268182671 ns/iter (± 9232028) 0.90
es/full/minify/libraries/three 425957653 ns/iter (± 7627247) 473456184 ns/iter (± 7553186) 0.90
es/full/minify/libraries/typescript 2925690377 ns/iter (± 29457031) 3083660039 ns/iter (± 29305191) 0.95
es/full/minify/libraries/victory 641826585 ns/iter (± 12141999) 731788394 ns/iter (± 21062814) 0.88
es/full/minify/libraries/vue 129122406 ns/iter (± 1209971) 137752256 ns/iter (± 4526069) 0.94
es/full/codegen/es3 28543 ns/iter (± 503) 28421 ns/iter (± 37) 1.00
es/full/codegen/es5 28569 ns/iter (± 53) 28485 ns/iter (± 51) 1.00
es/full/codegen/es2015 28583 ns/iter (± 134) 28431 ns/iter (± 62) 1.01
es/full/codegen/es2016 28570 ns/iter (± 64) 28468 ns/iter (± 79) 1.00
es/full/codegen/es2017 28597 ns/iter (± 42) 28434 ns/iter (± 57) 1.01
es/full/codegen/es2018 28538 ns/iter (± 84) 28486 ns/iter (± 151) 1.00
es/full/codegen/es2019 28572 ns/iter (± 63) 28443 ns/iter (± 39) 1.00
es/full/codegen/es2020 28570 ns/iter (± 121) 28389 ns/iter (± 76) 1.01
es/full/all/es3 181312398 ns/iter (± 3273099) 186884436 ns/iter (± 3676890) 0.97
es/full/all/es5 172889094 ns/iter (± 1478819) 177211936 ns/iter (± 3689546) 0.98
es/full/all/es2015 132291989 ns/iter (± 1732927) 140583862 ns/iter (± 1456501) 0.94
es/full/all/es2016 131326943 ns/iter (± 1383088) 138149280 ns/iter (± 2919830) 0.95
es/full/all/es2017 128751199 ns/iter (± 1932390) 136311552 ns/iter (± 3207420) 0.94
es/full/all/es2018 125832962 ns/iter (± 1709115) 134522313 ns/iter (± 3038772) 0.94
es/full/all/es2019 122797541 ns/iter (± 1526521) 128580084 ns/iter (± 3841300) 0.96
es/full/all/es2020 117824261 ns/iter (± 1345075) 122131400 ns/iter (± 3751089) 0.96
es/full/parser 508968 ns/iter (± 6868) 521482 ns/iter (± 6820) 0.98
es/full/base/fixer 22643 ns/iter (± 26) 22687 ns/iter (± 30) 1.00
es/full/base/resolver_and_hygiene 87933 ns/iter (± 74) 84782 ns/iter (± 165) 1.04
serialization of serde 121 ns/iter (± 0) 130 ns/iter (± 4) 0.93
css/minify/libraries/bootstrap 27659258 ns/iter (± 100260) 27606261 ns/iter (± 212942) 1.00
css/visitor/compare/clone 2134688 ns/iter (± 6005) 2083874 ns/iter (± 13140) 1.02
css/visitor/compare/visit_mut_span 2286812 ns/iter (± 9777) 2328045 ns/iter (± 29272) 0.98
css/visitor/compare/visit_mut_span_panic 2333647 ns/iter (± 6462) 2366513 ns/iter (± 17979) 0.99
css/visitor/compare/fold_span 3069323 ns/iter (± 19735) 3095045 ns/iter (± 13035) 0.99
css/visitor/compare/fold_span_panic 3228820 ns/iter (± 10816) 3257871 ns/iter (± 9971) 0.99
css/lexer/bootstrap_5_1_3 5179174 ns/iter (± 15600) 5160461 ns/iter (± 89422) 1.00
css/lexer/foundation_6_7_4 4358110 ns/iter (± 3257) 4330618 ns/iter (± 11522) 1.01
css/lexer/tailwind_3_1_1 827428 ns/iter (± 1140) 820386 ns/iter (± 2033) 1.01
css/parser/bootstrap_5_1_3 20827921 ns/iter (± 198652) 20811952 ns/iter (± 241362) 1.00
css/parser/foundation_6_7_4 16615141 ns/iter (± 64983) 16561851 ns/iter (± 79720) 1.00
css/parser/tailwind_3_1_1 3211951 ns/iter (± 4920) 3198542 ns/iter (± 2985) 1.00
es/codegen/colors 325583 ns/iter (± 184816) 327945 ns/iter (± 186553) 0.99
es/codegen/large 1250660 ns/iter (± 646650) 1261853 ns/iter (± 650645) 0.99
es/codegen/with-parser/colors 47018 ns/iter (± 115) 46717 ns/iter (± 174) 1.01
es/codegen/with-parser/large 506703 ns/iter (± 1200) 504680 ns/iter (± 1573) 1.00
es/minify/libraries/antd 1340286134 ns/iter (± 16685987) 1395986973 ns/iter (± 26555676) 0.96
es/minify/libraries/d3 249929680 ns/iter (± 5055993) 262470463 ns/iter (± 7280490) 0.95
es/minify/libraries/echarts 1034521237 ns/iter (± 37383615) 1074367424 ns/iter (± 33442070) 0.96
es/minify/libraries/jquery 79795260 ns/iter (± 1118357) 80354076 ns/iter (± 1417927) 0.99
es/minify/libraries/lodash 95486819 ns/iter (± 1332321) 95925667 ns/iter (± 1452124) 1.00
es/minify/libraries/moment 45576917 ns/iter (± 521101) 45894656 ns/iter (± 404304) 0.99
es/minify/libraries/react 17045960 ns/iter (± 152495) 17535547 ns/iter (± 318248) 0.97
es/minify/libraries/terser 205907701 ns/iter (± 6836831) 210776240 ns/iter (± 4000706) 0.98
es/minify/libraries/three 364804431 ns/iter (± 9097477) 360067127 ns/iter (± 7120977) 1.01
es/minify/libraries/typescript 2507621727 ns/iter (± 22876742) 2511776584 ns/iter (± 53032610) 1.00
es/minify/libraries/victory 551192739 ns/iter (± 14811206) 563488440 ns/iter (± 13442037) 0.98
es/minify/libraries/vue 115120280 ns/iter (± 2407344) 120300276 ns/iter (± 1690389) 0.96
es/visitor/compare/clone 2308004 ns/iter (± 11593) 2331258 ns/iter (± 8244) 0.99
es/visitor/compare/visit_mut_span 2715254 ns/iter (± 6967) 2700935 ns/iter (± 4776) 1.01
es/visitor/compare/visit_mut_span_panic 2749092 ns/iter (± 12778) 2758759 ns/iter (± 8247) 1.00
es/visitor/compare/fold_span 3815535 ns/iter (± 4826) 3794751 ns/iter (± 8834) 1.01
es/visitor/compare/fold_span_panic 3947230 ns/iter (± 16000) 3935462 ns/iter (± 14045) 1.00
es/lexer/colors 13207 ns/iter (± 7) 13039 ns/iter (± 27) 1.01
es/lexer/angular 6425559 ns/iter (± 7407) 6352735 ns/iter (± 17215) 1.01
es/lexer/backbone 793392 ns/iter (± 470) 783177 ns/iter (± 2528) 1.01
es/lexer/jquery 4455130 ns/iter (± 5842) 4384433 ns/iter (± 19876) 1.02
es/lexer/jquery mobile 6946206 ns/iter (± 4132) 6842040 ns/iter (± 20475) 1.02
es/lexer/mootools 3478974 ns/iter (± 2383) 3428318 ns/iter (± 8600) 1.01
es/lexer/underscore 654352 ns/iter (± 998) 648466 ns/iter (± 1616) 1.01
es/lexer/three 20933337 ns/iter (± 31774) 20771920 ns/iter (± 26287) 1.01
es/lexer/yui 3880086 ns/iter (± 3424) 3896357 ns/iter (± 196958) 1.00
es/parser/colors 28870 ns/iter (± 62) 28482 ns/iter (± 79) 1.01
es/parser/angular 14977212 ns/iter (± 153738) 14890670 ns/iter (± 157370) 1.01
es/parser/backbone 2176491 ns/iter (± 12337) 2151527 ns/iter (± 12224) 1.01
es/parser/jquery 11773064 ns/iter (± 104772) 11705996 ns/iter (± 115199) 1.01
es/parser/jquery mobile 18307940 ns/iter (± 219958) 18190781 ns/iter (± 216171) 1.01
es/parser/mootools 8983330 ns/iter (± 36871) 8866872 ns/iter (± 39650) 1.01
es/parser/underscore 1829299 ns/iter (± 11647) 1815765 ns/iter (± 13971) 1.01
es/parser/three 53294371 ns/iter (± 223514) 53789231 ns/iter (± 625683) 0.99
es/parser/yui 9070565 ns/iter (± 99375) 8961876 ns/iter (± 78580) 1.01
es/preset-env/usage/builtin_type 144152 ns/iter (± 36068) 140352 ns/iter (± 34337) 1.03
es/preset-env/usage/property 19623 ns/iter (± 126) 19592 ns/iter (± 95) 1.00
es/resolver/typescript 109498443 ns/iter (± 2064699) 112304712 ns/iter (± 1777386) 0.98
es/fixer/typescript 78318336 ns/iter (± 430810) 78526405 ns/iter (± 821533) 1.00
es/hygiene/typescript 167910079 ns/iter (± 1664295) 173160354 ns/iter (± 1995656) 0.97
es/resolver_with_hygiene/typescript 305079780 ns/iter (± 3466630) 312002339 ns/iter (± 5175599) 0.98
es/visitor/base-perf/module_clone 81133 ns/iter (± 404) 81181 ns/iter (± 820) 1.00
es/visitor/base-perf/fold_empty 90554 ns/iter (± 1658) 90651 ns/iter (± 3093) 1.00
es/visitor/base-perf/fold_noop_impl_all 90680 ns/iter (± 398) 90975 ns/iter (± 360) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91270 ns/iter (± 349) 97512 ns/iter (± 2122) 0.94
es/visitor/base-perf/boxing_boxed_clone 58 ns/iter (± 0) 56 ns/iter (± 0) 1.04
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 41 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 109 ns/iter (± 0) 101 ns/iter (± 0) 1.08
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 78 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3588 ns/iter (± 88) 3648 ns/iter (± 90) 0.98
es/base/parallel/resolver/typescript 6173373655 ns/iter (± 384900029) 6206447327 ns/iter (± 493776645) 0.99
es/base/parallel/hygiene/typescript 1993401115 ns/iter (± 37776244) 2035659449 ns/iter (± 25583791) 0.98
misc/visitors/time-complexity/time 5 101 ns/iter (± 0) 109 ns/iter (± 0) 0.93
misc/visitors/time-complexity/time 10 338 ns/iter (± 7) 353 ns/iter (± 1) 0.96
misc/visitors/time-complexity/time 15 643 ns/iter (± 1) 669 ns/iter (± 11) 0.96
misc/visitors/time-complexity/time 20 1196 ns/iter (± 18) 1238 ns/iter (± 0) 0.97
misc/visitors/time-complexity/time 40 6525 ns/iter (± 72) 6642 ns/iter (± 28) 0.98
misc/visitors/time-complexity/time 60 17281 ns/iter (± 51) 17113 ns/iter (± 34) 1.01
es/full-target/es2016 253316 ns/iter (± 535) 254264 ns/iter (± 877) 1.00
es/full-target/es2017 245757 ns/iter (± 487) 245761 ns/iter (± 704) 1.00
es/full-target/es2018 235703 ns/iter (± 558) 235047 ns/iter (± 364) 1.00
es2020_nullish_coalescing 93423 ns/iter (± 379) 93000 ns/iter (± 507) 1.00
es2020_optional_chaining 124239 ns/iter (± 317) 125097 ns/iter (± 343) 0.99
es2022_class_properties 149967 ns/iter (± 344) 149210 ns/iter (± 283) 1.01
es2018_object_rest_spread 96332 ns/iter (± 221) 95832 ns/iter (± 251) 1.01
es2019_optional_catch_binding 85528 ns/iter (± 180) 85488 ns/iter (± 244) 1.00
es2017_async_to_generator 86254 ns/iter (± 274) 85765 ns/iter (± 334) 1.01
es2016_exponentiation 91224 ns/iter (± 271) 90596 ns/iter (± 362) 1.01
es2015_arrow 94030 ns/iter (± 294) 93822 ns/iter (± 165) 1.00
es2015_block_scoped_fn 92537 ns/iter (± 165) 91847 ns/iter (± 417) 1.01
es2015_block_scoping 170503 ns/iter (± 246) 168819 ns/iter (± 849) 1.01

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.