es-meta / esmeta

ECMAScript Specification (ECMA-262) Metalanguage
BSD 3-Clause "New" or "Revised" License
188 stars 12 forks source link

Refine on field existence condition #187

Closed hyp3rflow closed 1 year ago

hyp3rflow commented 1 year ago

This PR includes:

The result of this PR:

iter: 70,202 → 70,098 (-104)
analyzed-nodes: 16,307/20,020 (81.45%) → 16,313/20,020 (81.48%)

diff of analyze/types:

    def <BUILTIN>:INTRINSICS.BigInt.prototype.valueOf(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Unknown
--> def <BUILTIN>:INTRINSICS.BigInt.prototype.valueOf(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[BigInt | Undefined] | Abrupt[throw]
+-> def <BUILTIN>:INTRINSICS.BigInt.prototype.valueOf(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[BigInt] | Abrupt[throw]
 --------------------------------------------------------------------------------
    def <BUILTIN>:INTRINSICS.Function.prototype.toString(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Unknown
--> def <BUILTIN>:INTRINSICS.Function.prototype.toString(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[String | Absent] | Abrupt[throw]
+-> def <BUILTIN>:INTRINSICS.Function.prototype.toString(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[String] | Abrupt[throw]
 --------------------------------------------------------------------------------
    def <BUILTIN>:INTRINSICS.get DataView.prototype.buffer(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Unknown
--> def <BUILTIN>:INTRINSICS.get DataView.prototype.buffer(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[ArrayBufferObject | Undefined] | Abrupt[throw]
+-> def <BUILTIN>:INTRINSICS.get DataView.prototype.buffer(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[ArrayBufferObject] | Abrupt[throw]
 --------------------------------------------------------------------------------
    def <BUILTIN>:INTRINSICS.get TypedArray.prototype.buffer(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Unknown
--> def <BUILTIN>:INTRINSICS.get TypedArray.prototype.buffer(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[ArrayBufferObject | Undefined] | Abrupt[throw]
+-> def <BUILTIN>:INTRINSICS.get TypedArray.prototype.buffer(this: ESValue, ArgumentsList: List[ESValue], NewTarget: Object | Undefined): Normal[ArrayBufferObject] | Abrupt[throw]
 --------------------------------------------------------------------------------
    def IsArray(argument: Unknown): Normal[Boolean] | Abrupt
--> def IsArray(argument?: ESValue): Normal[Boolean] | Abrupt[throw]
+-> def IsArray(argument: ESValue): Normal[Boolean] | Abrupt[throw]
 --------------------------------------------------------------------------------
    def thisBigIntValue(value: Unknown): Unknown
--> def thisBigIntValue(value: ESValue): Abrupt[throw] | BigInt | Absent
+-> def thisBigIntValue(value: ESValue): Abrupt[throw] | BigInt
 --------------------------------------------------------------------------------

Due to the pruning involving the field existence check, many values that previously contained Absent or Undefined have been refined.