[fix] Maximum call stack size exceeded (#4694)

pull/6716/head
milahu 5 years ago
parent c040f130b7
commit 3387e22a42

@ -1,3 +1,4 @@
import { push_array } from '../../utils/push_array';
import MagicString from 'magic-string'; import MagicString from 'magic-string';
import { walk } from 'estree-walker'; import { walk } from 'estree-walker';
import Selector from './Selector'; import Selector from './Selector';
@ -351,7 +352,7 @@ export default class Stylesheet {
const at_rule_declarations = node.block.children const at_rule_declarations = node.block.children
.filter(node => node.type === 'Declaration') .filter(node => node.type === 'Declaration')
.map(node => new Declaration(node)); .map(node => new Declaration(node));
atrule.declarations.push(...at_rule_declarations); push_array(atrule.declarations, at_rule_declarations);
} }
current_atrule = atrule; current_atrule = atrule;

@ -1,3 +1,4 @@
import { push_array } from '../../../utils/push_array';
import AwaitBlock from '../AwaitBlock'; import AwaitBlock from '../AwaitBlock';
import Body from '../Body'; import Body from '../Body';
import Comment from '../Comment'; import Comment from '../Comment';
@ -58,7 +59,7 @@ export default function map_children(component, parent, scope, children: Templat
if (use_ignores) component.pop_ignores(), ignores = []; if (use_ignores) component.pop_ignores(), ignores = [];
if (node.type === 'Comment' && node.ignores.length) { if (node.type === 'Comment' && node.ignores.length) {
ignores.push(...node.ignores); push_array(ignores, node.ignores);
} }
if (last) last.next = node; if (last) last.next = node;

@ -1,3 +1,4 @@
import { push_array } from '../../../../utils/push_array';
import Renderer from '../../Renderer'; import Renderer from '../../Renderer';
import Element from '../../../nodes/Element'; import Element from '../../../nodes/Element';
import Wrapper from '../shared/Wrapper'; import Wrapper from '../shared/Wrapper';
@ -596,7 +597,7 @@ export default class ElementWrapper extends Wrapper {
this.attributes.forEach((attribute) => { this.attributes.forEach((attribute) => {
if (attribute.node.name === 'class') { if (attribute.node.name === 'class') {
const dependencies = attribute.node.get_dependencies(); const dependencies = attribute.node.get_dependencies();
this.class_dependencies.push(...dependencies); push_array(this.class_dependencies, dependencies);
} }
}); });

@ -1,3 +1,4 @@
import { push_array } from '../../../utils/push_array';
import Wrapper from './shared/Wrapper'; import Wrapper from './shared/Wrapper';
import Renderer from '../Renderer'; import Renderer from '../Renderer';
import Block from '../Block'; import Block from '../Block';
@ -166,7 +167,7 @@ export default class IfBlockWrapper extends Wrapper {
block.has_outro_method = has_outros; block.has_outro_method = has_outros;
}); });
renderer.blocks.push(...blocks); push_array(renderer.blocks, blocks);
} }
render( render(

@ -1,3 +1,4 @@
import { push_array } from '../utils/push_array';
import { decode as decode_mappings } from 'sourcemap-codec'; import { decode as decode_mappings } from 'sourcemap-codec';
import { Processed } from './types'; import { Processed } from './types';
@ -50,7 +51,7 @@ function decoded_sourcemap_from_generator(generator: any) {
result_segment = result_line[result_line.length - 1]; result_segment = result_line[result_line.length - 1];
if (mapping.source != null) { if (mapping.source != null) {
result_segment.push(...[ push_array(result_segment, [
source_idx[mapping.source], source_idx[mapping.source],
mapping.originalLine - 1, // line is one-based mapping.originalLine - 1, // line is one-based
mapping.originalColumn mapping.originalColumn

@ -1,3 +1,4 @@
import { push_array } from '../utils/push_array';
import { RawSourceMap, DecodedSourceMap } from '@ampproject/remapping/dist/types/types'; import { RawSourceMap, DecodedSourceMap } from '@ampproject/remapping/dist/types/types';
import { getLocator } from 'locate-character'; import { getLocator } from 'locate-character';
import { MappedCode, SourceLocation, parse_attached_sourcemap, sourcemap_add_offset, combine_sourcemaps } from '../utils/mapped_code'; import { MappedCode, SourceLocation, parse_attached_sourcemap, sourcemap_add_offset, combine_sourcemaps } from '../utils/mapped_code';
@ -48,7 +49,7 @@ class PreprocessResult implements Source {
} }
if (dependencies) { if (dependencies) {
this.dependencies.push(...dependencies); push_array(this.dependencies, dependencies);
} }
} }
@ -165,7 +166,7 @@ async function process_tag(
}); });
if (!processed) return no_change(); if (!processed) return no_change();
if (processed.dependencies) dependencies.push(...processed.dependencies); if (processed.dependencies) push_array(dependencies, processed.dependencies);
if (!processed.map && processed.code === content) return no_change(); if (!processed.map && processed.code === content) return no_change();
return processed_tag_to_code(processed, tag_name, attributes, slice_source(content, tag_offset, source)); return processed_tag_to_code(processed, tag_name, attributes, slice_source(content, tag_offset, source));

@ -0,0 +1,11 @@
export function push_array(thisArray: any[], ...otherList: any[]) {
let count = 0;
for (let a = 0; a < otherList.length; a++) {
const other = otherList[a];
for (let i = 0; i < other.length; i++) {
thisArray.push(other[i]);
}
count += other.length;
}
return count;
}
Loading…
Cancel
Save