瀏覽代碼

Enabled tests that use ** operator. Some array fixes as a result.

Dmitry Panov 3 年之前
父節點
當前提交
3faab1d8f2
共有 2 個文件被更改,包括 42 次插入52 次删除
  1. 42 27
      builtin_array.go
  2. 0 25
      tc39_test.go

+ 42 - 27
builtin_array.go

@@ -397,9 +397,12 @@ func (r *Runtime) arrayproto_splice(call FunctionCall) Value {
 	default:
 		actualDeleteCount = min(max(call.Argument(1).ToInteger(), 0), length-actualStart)
 	}
-	a := arraySpeciesCreate(o, actualDeleteCount)
 	itemCount := max(int64(len(call.Arguments)-2), 0)
 	newLength := length - actualDeleteCount + itemCount
+	if newLength >= maxInt {
+		panic(r.NewTypeError("Invalid array length"))
+	}
+	a := arraySpeciesCreate(o, actualDeleteCount)
 	if src := r.checkStdArrayObj(o); src != nil {
 		if dst := r.checkStdArrayObjWithProto(a); dst != nil {
 			values := make([]Value, actualDeleteCount)
@@ -488,31 +491,36 @@ func (r *Runtime) arrayproto_unshift(call FunctionCall) Value {
 	length := toLength(o.self.getStr("length", nil))
 	argCount := int64(len(call.Arguments))
 	newLen := intToValue(length + argCount)
-	newSize := length + argCount
-	if arr := r.checkStdArrayObjWithProto(o); arr != nil && newSize < math.MaxUint32 {
-		if int64(cap(arr.values)) >= newSize {
-			arr.values = arr.values[:newSize]
-			copy(arr.values[argCount:], arr.values[:length])
-		} else {
-			values := make([]Value, newSize)
-			copy(values[argCount:], arr.values)
-			arr.values = values
+	if argCount > 0 {
+		newSize := length + argCount
+		if newSize >= maxInt {
+			panic(r.NewTypeError("Invalid array length"))
 		}
-		copy(arr.values, call.Arguments)
-		arr.objCount = int(arr.length)
-	} else {
-		for k := length - 1; k >= 0; k-- {
-			from := valueInt(k)
-			to := valueInt(k + argCount)
-			if o.self.hasPropertyIdx(from) {
-				o.self.setOwnIdx(to, nilSafe(o.self.getIdx(from, nil)), true)
+		if arr := r.checkStdArrayObjWithProto(o); arr != nil && newSize < math.MaxUint32 {
+			if int64(cap(arr.values)) >= newSize {
+				arr.values = arr.values[:newSize]
+				copy(arr.values[argCount:], arr.values[:length])
 			} else {
-				o.self.deleteIdx(to, true)
+				values := make([]Value, newSize)
+				copy(values[argCount:], arr.values)
+				arr.values = values
+			}
+			copy(arr.values, call.Arguments)
+			arr.objCount = int(arr.length)
+		} else {
+			for k := length - 1; k >= 0; k-- {
+				from := valueInt(k)
+				to := valueInt(k + argCount)
+				if o.self.hasPropertyIdx(from) {
+					o.self.setOwnIdx(to, nilSafe(o.self.getIdx(from, nil)), true)
+				} else {
+					o.self.deleteIdx(to, true)
+				}
 			}
-		}
 
-		for k, arg := range call.Arguments {
-			o.self.setOwnIdx(valueInt(int64(k)), arg, true)
+			for k, arg := range call.Arguments {
+				o.self.setOwnIdx(valueInt(int64(k)), arg, true)
+			}
 		}
 	}
 
@@ -882,15 +890,22 @@ func (r *Runtime) arrayproto_reduceRight(call FunctionCall) Value {
 func arrayproto_reverse_generic_step(o *Object, lower, upper int64) {
 	lowerP := valueInt(lower)
 	upperP := valueInt(upper)
-	lowerValue := o.self.getIdx(lowerP, nil)
-	upperValue := o.self.getIdx(upperP, nil)
-	if lowerValue != nil && upperValue != nil {
+	var lowerValue, upperValue Value
+	lowerExists := o.self.hasPropertyIdx(lowerP)
+	if lowerExists {
+		lowerValue = nilSafe(o.self.getIdx(lowerP, nil))
+	}
+	upperExists := o.self.hasPropertyIdx(upperP)
+	if upperExists {
+		upperValue = nilSafe(o.self.getIdx(upperP, nil))
+	}
+	if lowerExists && upperExists {
 		o.self.setOwnIdx(lowerP, upperValue, true)
 		o.self.setOwnIdx(upperP, lowerValue, true)
-	} else if lowerValue == nil && upperValue != nil {
+	} else if !lowerExists && upperExists {
 		o.self.setOwnIdx(lowerP, upperValue, true)
 		o.self.deleteIdx(upperP, true)
-	} else if lowerValue != nil && upperValue == nil {
+	} else if lowerExists && !upperExists {
 		o.self.deleteIdx(lowerP, true)
 		o.self.setOwnIdx(upperP, lowerValue, true)
 	}

+ 0 - 25
tc39_test.go

@@ -148,31 +148,6 @@ var (
 		"test/annexB/built-ins/RegExp/RegExp-leading-escape-BMP.js":  true,
 		"test/annexB/built-ins/RegExp/RegExp-trailing-escape-BMP.js": true,
 
-		// x ** y
-		"test/built-ins/Array/prototype/pop/clamps-to-integer-limit.js":                                        true,
-		"test/built-ins/Array/prototype/pop/length-near-integer-limit.js":                                      true,
-		"test/built-ins/Array/prototype/push/clamps-to-integer-limit.js":                                       true,
-		"test/built-ins/Array/prototype/push/length-near-integer-limit.js":                                     true,
-		"test/built-ins/Array/prototype/push/throws-if-integer-limit-exceeded.js":                              true,
-		"test/built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-object.js":                 true,
-		"test/built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-proxy.js":                  true,
-		"test/built-ins/Array/prototype/slice/length-exceeding-integer-limit.js":                               true,
-		"test/built-ins/Array/prototype/splice/clamps-length-to-integer-limit.js":                              true,
-		"test/built-ins/Array/prototype/splice/length-and-deleteCount-exceeding-integer-limit.js":              true,
-		"test/built-ins/Array/prototype/splice/length-exceeding-integer-limit-shrink-array.js":                 true,
-		"test/built-ins/Array/prototype/splice/length-near-integer-limit-grow-array.js":                        true,
-		"test/built-ins/Array/prototype/splice/throws-if-integer-limit-exceeded.js":                            true,
-		"test/built-ins/Array/prototype/unshift/clamps-to-integer-limit.js":                                    true,
-		"test/built-ins/Array/prototype/unshift/length-near-integer-limit.js":                                  true,
-		"test/built-ins/Array/prototype/unshift/throws-if-integer-limit-exceeded.js":                           true,
-		"test/built-ins/String/prototype/split/separator-undef-limit-custom.js":                                true,
-		"test/built-ins/Array/prototype/splice/create-species-length-exceeding-integer-limit.js":               true,
-		"test/built-ins/Array/prototype/slice/length-exceeding-integer-limit-proxied-array.js":                 true,
-		"test/built-ins/String/prototype/split/separator-undef-limit-zero.js":                                  true,
-		"test/language/expressions/object/cpn-obj-lit-computed-property-name-from-exponetiation-expression.js": true,
-		"test/language/expressions/object/cpn-obj-lit-computed-property-name-from-math.js":                     true,
-		"test/built-ins/RegExp/prototype/exec/failure-lastindex-set.js":                                        true,
-
 		// generators
 		"test/annexB/built-ins/RegExp/RegExp-control-escape-russian-letter.js":                                       true,
 		"test/language/statements/switch/scope-lex-generator.js":                                                     true,