1 | /* Copyright 2017 Mozilla Foundation |
2 | * |
3 | * Licensed under the Apache License, Version 2.0 (the "License"); |
4 | * you may not use this file except in compliance with the License. |
5 | * You may obtain a copy of the License at |
6 | * |
7 | * http://www.apache.org/licenses/LICENSE-2.0 |
8 | * |
9 | * Unless required by applicable law or agreed to in writing, software |
10 | * distributed under the License is distributed on an "AS IS" BASIS, |
11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | * See the License for the specific language governing permissions and |
13 | * limitations under the License. |
14 | */ |
15 | |
16 | #![cfg_attr (not(feature = "validate" ), allow(dead_code))] |
17 | |
18 | // The following limits are imposed by wasmparser on WebAssembly modules. |
19 | // The limits are agreed upon with other engines for consistency. |
20 | pub const MAX_WASM_TYPES: usize = 1_000_000; |
21 | pub const MAX_WASM_SUPERTYPES: usize = 1; |
22 | pub const MAX_WASM_FUNCTIONS: usize = 1_000_000; |
23 | pub const MAX_WASM_IMPORTS: usize = 1_000_000; |
24 | pub const MAX_WASM_EXPORTS: usize = 1_000_000; |
25 | pub const MAX_WASM_GLOBALS: usize = 1_000_000; |
26 | pub const MAX_WASM_ELEMENT_SEGMENTS: usize = 100_000; |
27 | pub const MAX_WASM_DATA_SEGMENTS: usize = 100_000; |
28 | pub const MAX_WASM_STRING_SIZE: usize = 100_000; |
29 | pub const MAX_WASM_FUNCTION_SIZE: usize = 128 * 1024; |
30 | pub const MAX_WASM_FUNCTION_LOCALS: usize = 50000; |
31 | pub const MAX_WASM_FUNCTION_PARAMS: usize = 1000; |
32 | pub const MAX_WASM_FUNCTION_RETURNS: usize = 1000; |
33 | pub const _MAX_WASM_TABLE_SIZE: usize = 10_000_000; |
34 | pub const MAX_WASM_TABLE_ENTRIES: usize = 10_000_000; |
35 | pub const MAX_WASM_TABLES: usize = 100; |
36 | pub const MAX_WASM_MEMORIES: usize = 100; |
37 | pub const MAX_WASM_TAGS: usize = 1_000_000; |
38 | pub const MAX_WASM_BR_TABLE_SIZE: usize = MAX_WASM_FUNCTION_SIZE; |
39 | pub const MAX_WASM_STRUCT_FIELDS: usize = 10_000; |
40 | pub const MAX_WASM_CATCHES: usize = 10_000; |
41 | pub const MAX_WASM_SUBTYPING_DEPTH: usize = 63; |
42 | pub const MAX_WASM_HANDLERS: usize = 10_000; |
43 | pub const MAX_WASM_TYPE_SIZE: u32 = 1_000_000; |
44 | |
45 | pub const DEFAULT_WASM_PAGE_SIZE: u64 = 1 << 16; |
46 | |
47 | pub fn max_wasm_memory32_pages(page_size: u64) -> u64 { |
48 | assert!(page_size.is_power_of_two()); |
49 | assert!(page_size <= DEFAULT_WASM_PAGE_SIZE); |
50 | (1 << 32) / page_size |
51 | } |
52 | |
53 | pub fn max_wasm_memory64_pages(page_size: u64) -> u64 { |
54 | assert!(page_size.is_power_of_two()); |
55 | assert!(page_size <= DEFAULT_WASM_PAGE_SIZE); |
56 | u64::try_from((1_u128 << 64) / u128::from(page_size)).unwrap_or(default:u64::MAX) |
57 | } |
58 | |
59 | // Component-related limits |
60 | |
61 | #[cfg (feature = "component-model" )] |
62 | pub use self::component_limits::*; |
63 | #[cfg (feature = "component-model" )] |
64 | mod component_limits { |
65 | pub const MAX_WASM_MODULE_SIZE: usize = 1024 * 1024 * 1024; //= 1 GiB |
66 | pub const MAX_WASM_MODULE_TYPE_DECLS: usize = 100_000; |
67 | pub const MAX_WASM_COMPONENT_TYPE_DECLS: usize = 100_000; |
68 | pub const MAX_WASM_INSTANCE_TYPE_DECLS: usize = 100_000; |
69 | pub const MAX_WASM_RECORD_FIELDS: usize = 10_000; |
70 | pub const MAX_WASM_VARIANT_CASES: usize = 10_000; |
71 | pub const MAX_WASM_TUPLE_TYPES: usize = 10_000; |
72 | pub const MAX_WASM_FLAG_NAMES: usize = 1_000; |
73 | pub const MAX_WASM_ENUM_CASES: usize = 10_000; |
74 | pub const MAX_WASM_INSTANTIATION_EXPORTS: usize = 100_000; |
75 | pub const MAX_WASM_CANONICAL_OPTIONS: usize = 10; |
76 | pub const MAX_WASM_INSTANTIATION_ARGS: usize = 100_000; |
77 | pub const MAX_WASM_START_ARGS: usize = 1000; |
78 | pub const MAX_WASM_MODULES: usize = 1_000; |
79 | pub const MAX_WASM_COMPONENTS: usize = 1_000; |
80 | pub const MAX_WASM_INSTANCES: usize = 1_000; |
81 | pub const MAX_WASM_VALUES: usize = 1_000; |
82 | |
83 | /// Core items in components such as globals/memories/tables don't actually |
84 | /// create new definitions but are instead just aliases to preexisting items. |
85 | /// This means they have a different limit than the core wasm based limits. |
86 | pub const MAX_CORE_INDEX_SPACE_ITEMS: usize = 1_000_000; |
87 | } |
88 | |