17 오류 처리 및 언어 확장
구현은 관련 ECMAScript 언어 구성요소가 평가될 때 대부분의 오류를 보고해야 한다. early error(조기 오류) 는 그 오류를 포함하는 Script 안의 어떤 구성요소도 평가되기 전에 검출·보고될 수 있는 오류이다. 조기 오류가 존재하면 그 구성요소의 평가가 차단된다. 구현은 ParseScript 과정에서 해당 Script 를 파싱하는 일부로 Script 의 조기 오류를 보고해야 한다. Module 의 조기 오류는 그 Module 이 평가될 지점에서 보고되며 그 Module 은 결코 초기화되지 않는다. eval 코드의 조기 오류는 eval
이 호출되는 시점에 보고되며 해당 eval 코드의 평가를 막는다. 조기 오류가 아닌 모든 오류는 런타임 오류이다.
구현은 이 명세의 “Static Semantics: Early Errors” 하위 절에 열거된 조건이 발생하면 반드시 그것을 조기 오류로 보고해야 한다.
구현은 (컴파일러가 어떤 구성요소가 어떤 상황에서도 오류 없이 실행될 수 없음을 입증할 수 있더라도) 다른 종류의 오류를 조기 오류로 취급해서는 안 된다. 그런 경우 구현이 조기 경고를 낼 수는 있지만, 관련 구성요소가 실제로 실행될 때까지 오류를 보고해서는 안 된다.
구현은 다음과 같은 경우를 제외하고 명세된 대로 모든 오류를 보고해야 한다:
-
17.1 에서 제한된 경우를 제외하고 호스트 또는 구현은 Script 구문, Module 구문, 그리고 정규 표현식 패턴 또는 플래그 구문을 확장할 수 있다. 이를 허용하기 위해 SyntaxError 를 던질 수 있는(예:
eval
호출, 정규 표현식 리터럴 사용, Function 또는 RegExp 생성자 사용) 모든 연산은 스크립트 구문이나 정규 표현식 패턴/플래그 구문에 대한 호스트 정의 확장을 만나면 SyntaxError 를 던지는 대신 호스트 정의 동작을 보일 수 있다.
-
17.1 에서 제한된 경우를 제외하고 호스트 또는 구현은 이 명세에 기술된 것 이외의 추가적인 타입, 값, 객체, 프로퍼티, 함수를 제공할 수 있다. 이는 (예: 전역 스코프에서 변수 조회 같은) 구성요소가 오류(예: ReferenceError) 를 던지는 대신 호스트 정의 동작을 갖도록 만들 수 있다.
17.1 금지된 확장
구현은 다음과 같은 방식으로 이 명세를 확장해서는 안 된다:
-
strict 모드 코드에서 구문 생성자를 사용해 정의된 ECMAScript 함수 객체는 자체(own) 프로퍼티로 "caller", "arguments" 라는 이름을 갖도록 생성되어서는 안 된다. 또한 ArrowFunction, MethodDefinition, GeneratorDeclaration, GeneratorExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, ClassDeclaration, ClassExpression, AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncArrowFunction 으로 정의된 함수 객체 역시 정의가 strict 모드 코드 안에 있든 없든 그러한 own 프로퍼티를 가져서는 안 된다. 내장 함수, Function 생성자로 생성된 strict 함수, Generator 생성자로 생성된 generator 함수, AsyncFunction 생성자로 생성된 async 함수,
bind
메서드로 생성된 함수 역시 그러한 own 프로퍼티를 가져서는 안 된다.
-
구현이 어떤 함수 객체를 "caller" 라는 own 프로퍼티로 확장하는 경우 [[Get]] 또는 [[GetOwnProperty]] 로 관찰되는 그 프로퍼티의 값은 strict 함수 객체가 되어서는 안 된다. 그것이 접근자 프로퍼티라면 [[Get]] 특성의 값인 함수는 호출 시 strict 함수를 반환해서는 안 된다.
-
매핑되었거나 매핑되지 않은 arguments 객체 모두 "caller" 라는 own 프로퍼티로 생성되어서는 안 된다.
-
ECMA-402 에 명세된(예:
toLocaleString
라는 이름을 가진) 내장 메서드의 동작은 ECMA-402 에서 명시된 것 이외로 확장되어서는 안 된다.
-
22.2.1 및 B.1.2 의 RegExp 패턴 문법은 [UnicodeMode] 문법 매개변수가 존재할 때 A-Z 또는 a-z 소스 문자를 IdentityEscape[+UnicodeMode] 로 인식하도록 확장되어서는 안 된다.
-
어휘 비단말 기호 BindingIdentifier 로 매치되는 소스 텍스트 바로 뒤에 토큰
:
이 올 수 있게 하는 방식으로 구문 문법을 확장해서는 안 된다.
-
strict 모드 코드를 처리할 때 구현은 12.9.3.1 의 조기 오류 규칙을 완화해서는 안 된다.
-
TemplateEscapeSequence 는 12.9.4 에 정의된 LegacyOctalEscapeSequence 또는 NonOctalDecimalEscapeSequence 를 포함하도록 확장되어서는 안 된다.
-
strict 모드 코드를 처리할 때 B.3.1, B.3.2, B.3.3, B.3.5 에 정의된 확장은 지원되어서는 안 된다.
-
Module 목표 심볼을 파싱할 때 B.1.1 에 정의된 어휘(grammar) 확장은 지원되어서는 안 된다.
-
ImportCall 은 확장되어서는 안 된다.