Преглед на файлове

Fixed __proto__ getter.

Dmitry Panov преди 5 години
родител
ревизия
281a94b359
променени са 6 файла, в които са добавени 17 реда и са изтрити 6 реда
  1. 1 1
      builtin_json.go
  2. 1 1
      compiler_expr.go
  3. 2 2
      object.go
  4. 7 0
      runtime_test.go
  5. 5 1
      string.go
  6. 1 1
      vm.go

+ 1 - 1
builtin_json.go

@@ -85,7 +85,7 @@ func (r *Runtime) builtinJSON_decodeObject(d *json.Decoder) (*Object, error) {
 			return nil, err
 		}
 
-		if key == "__proto__" {
+		if key == __proto__ {
 			descr := propertyDescr{
 				Value:        value,
 				Writable:     FLAG_TRUE,

+ 1 - 1
compiler_expr.go

@@ -1337,7 +1337,7 @@ func (e *compiledObjectLiteral) emitGetter(putOnStack bool) {
 		e.c.compileExpression(prop.Value).emitGetter(true)
 		switch prop.Kind {
 		case "value":
-			if prop.Key == "__proto__" {
+			if prop.Key == __proto__ {
 				e.c.emit(setProto)
 			} else {
 				e.c.emit(setProp1(prop.Key))

+ 2 - 2
object.go

@@ -213,7 +213,7 @@ func (o *baseObject) put(n Value, val Value, throw bool) {
 
 func (o *baseObject) getOwnProp(name string) Value {
 	v := o.values[name]
-	if v == nil && name == "__proto" {
+	if v == nil && name == __proto__ {
 		return o.prototype
 	}
 	return v
@@ -233,7 +233,7 @@ func (o *baseObject) putStr(name string, val Value, throw bool) {
 		return
 	}
 
-	if name == "__proto__" {
+	if name == __proto__ {
 		if !o.extensible {
 			o.val.runtime.typeErrorResult(throw, "%s is not extensible", o.val)
 			return

+ 7 - 0
runtime_test.go

@@ -1320,6 +1320,13 @@ func TestAutoBoxing(t *testing.T) {
 	testScript1(SCRIPT, valueTrue, t)
 }
 
+func TestProtoGetter(t *testing.T) {
+	const SCRIPT = `
+	({}).__proto__ === Object.prototype && [].__proto__ === Array.prototype;
+	`
+	testScript1(SCRIPT, valueTrue, t)
+}
+
 /*
 func TestArrayConcatSparse(t *testing.T) {
 function foo(a,b,c)

+ 5 - 1
string.go

@@ -7,6 +7,10 @@ import (
 	"unicode/utf8"
 )
 
+const (
+	__proto__ = "__proto__"
+)
+
 var (
 	stringTrue         valueString = asciiString("true")
 	stringFalse        valueString = asciiString("false")
@@ -22,7 +26,7 @@ var (
 	stringPlusInfinity             = asciiString("+Infinity")
 	stringNegInfinity              = asciiString("-Infinity")
 	stringEmpty        valueString = asciiString("")
-	string__proto__    valueString = asciiString("__proto__")
+	string__proto__    valueString = asciiString(__proto__)
 
 	stringError          valueString = asciiString("Error")
 	stringTypeError      valueString = asciiString("TypeError")

+ 1 - 1
vm.go

@@ -1073,7 +1073,7 @@ type _setProto struct{}
 var setProto _setProto
 
 func (_setProto) exec(vm *vm) {
-	vm.r.toObject(vm.stack[vm.sp-2]).self.putStr("__proto__", vm.stack[vm.sp-1], true)
+	vm.r.toObject(vm.stack[vm.sp-2]).self.putStr(__proto__, vm.stack[vm.sp-1], true)
 
 	vm.sp--
 	vm.pc++