|
@@ -259,7 +259,14 @@ type objStrRef struct {
|
|
|
}
|
|
|
|
|
|
func (r *objStrRef) get() Value {
|
|
|
- return r.base.self.getStr(r.name, r.this)
|
|
|
+ if v := r.base.self.getStr(r.name, r.this); v != nil {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ if r.binding {
|
|
|
+ rt := r.base.runtime
|
|
|
+ panic(rt.newReferenceError(r.name))
|
|
|
+ }
|
|
|
+ return _undefined
|
|
|
}
|
|
|
|
|
|
func (r *objStrRef) set(v Value) {
|
|
@@ -3382,12 +3389,7 @@ var getValue _getValue
|
|
|
|
|
|
func (_getValue) exec(vm *vm) {
|
|
|
ref := vm.refStack[len(vm.refStack)-1]
|
|
|
- if v := ref.get(); v != nil {
|
|
|
- vm.push(v)
|
|
|
- } else {
|
|
|
- vm.throw(vm.r.newReferenceError(ref.refname()))
|
|
|
- return
|
|
|
- }
|
|
|
+ vm.push(nilSafe(ref.get()))
|
|
|
vm.pc++
|
|
|
}
|
|
|
|
|
@@ -3404,6 +3406,17 @@ func (_putValue) exec(vm *vm) {
|
|
|
vm.pc++
|
|
|
}
|
|
|
|
|
|
+type _popRef struct{}
|
|
|
+
|
|
|
+var popRef _popRef
|
|
|
+
|
|
|
+func (_popRef) exec(vm *vm) {
|
|
|
+ l := len(vm.refStack) - 1
|
|
|
+ vm.refStack[l] = nil
|
|
|
+ vm.refStack = vm.refStack[:l]
|
|
|
+ vm.pc++
|
|
|
+}
|
|
|
+
|
|
|
type _putValueP struct{}
|
|
|
|
|
|
var putValueP _putValueP
|
|
@@ -4282,9 +4295,9 @@ func (b *bindGlobal) exec(vm *vm) {
|
|
|
vm.pc++
|
|
|
}
|
|
|
|
|
|
-type jne int32
|
|
|
+type jneP int32
|
|
|
|
|
|
-func (j jne) exec(vm *vm) {
|
|
|
+func (j jneP) exec(vm *vm) {
|
|
|
vm.sp--
|
|
|
if !vm.stack[vm.sp].ToBoolean() {
|
|
|
vm.pc += int(j)
|
|
@@ -4293,9 +4306,9 @@ func (j jne) exec(vm *vm) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-type jeq int32
|
|
|
+type jeqP int32
|
|
|
|
|
|
-func (j jeq) exec(vm *vm) {
|
|
|
+func (j jeqP) exec(vm *vm) {
|
|
|
vm.sp--
|
|
|
if vm.stack[vm.sp].ToBoolean() {
|
|
|
vm.pc += int(j)
|
|
@@ -4304,9 +4317,9 @@ func (j jeq) exec(vm *vm) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-type jeq1 int32
|
|
|
+type jeq int32
|
|
|
|
|
|
-func (j jeq1) exec(vm *vm) {
|
|
|
+func (j jeq) exec(vm *vm) {
|
|
|
if vm.stack[vm.sp-1].ToBoolean() {
|
|
|
vm.pc += int(j)
|
|
|
} else {
|
|
@@ -4315,9 +4328,9 @@ func (j jeq1) exec(vm *vm) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-type jneq1 int32
|
|
|
+type jne int32
|
|
|
|
|
|
-func (j jneq1) exec(vm *vm) {
|
|
|
+func (j jne) exec(vm *vm) {
|
|
|
if !vm.stack[vm.sp-1].ToBoolean() {
|
|
|
vm.pc += int(j)
|
|
|
} else {
|
|
@@ -4387,6 +4400,18 @@ func (j jcoalesc) exec(vm *vm) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+type jcoalescP int32
|
|
|
+
|
|
|
+func (j jcoalescP) exec(vm *vm) {
|
|
|
+ vm.sp--
|
|
|
+ switch vm.stack[vm.sp] {
|
|
|
+ case _undefined, _null:
|
|
|
+ vm.pc++
|
|
|
+ default:
|
|
|
+ vm.pc += int(j)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
type _not struct{}
|
|
|
|
|
|
var not _not
|