github.com/dop251/goja@v0.0.0-20240220182346-e401ed450204/builtin_boolean.go (about) 1 package goja 2 3 func (r *Runtime) booleanproto_toString(call FunctionCall) Value { 4 var b bool 5 switch o := call.This.(type) { 6 case valueBool: 7 b = bool(o) 8 goto success 9 case *Object: 10 if p, ok := o.self.(*primitiveValueObject); ok { 11 if b1, ok := p.pValue.(valueBool); ok { 12 b = bool(b1) 13 goto success 14 } 15 } 16 if o, ok := o.self.(*objectGoReflect); ok { 17 if o.class == classBoolean && o.toString != nil { 18 return o.toString() 19 } 20 } 21 } 22 r.typeErrorResult(true, "Method Boolean.prototype.toString is called on incompatible receiver") 23 24 success: 25 if b { 26 return stringTrue 27 } 28 return stringFalse 29 } 30 31 func (r *Runtime) booleanproto_valueOf(call FunctionCall) Value { 32 switch o := call.This.(type) { 33 case valueBool: 34 return o 35 case *Object: 36 if p, ok := o.self.(*primitiveValueObject); ok { 37 if b, ok := p.pValue.(valueBool); ok { 38 return b 39 } 40 } 41 if o, ok := o.self.(*objectGoReflect); ok { 42 if o.class == classBoolean && o.valueOf != nil { 43 return o.valueOf() 44 } 45 } 46 } 47 48 r.typeErrorResult(true, "Method Boolean.prototype.valueOf is called on incompatible receiver") 49 return nil 50 } 51 52 func (r *Runtime) getBooleanPrototype() *Object { 53 ret := r.global.BooleanPrototype 54 if ret == nil { 55 ret = r.newPrimitiveObject(valueFalse, r.global.ObjectPrototype, classBoolean) 56 r.global.BooleanPrototype = ret 57 o := ret.self 58 o._putProp("toString", r.newNativeFunc(r.booleanproto_toString, "toString", 0), true, false, true) 59 o._putProp("valueOf", r.newNativeFunc(r.booleanproto_valueOf, "valueOf", 0), true, false, true) 60 o._putProp("constructor", r.getBoolean(), true, false, true) 61 } 62 return ret 63 } 64 65 func (r *Runtime) getBoolean() *Object { 66 ret := r.global.Boolean 67 if ret == nil { 68 ret = &Object{runtime: r} 69 r.global.Boolean = ret 70 proto := r.getBooleanPrototype() 71 r.newNativeFuncAndConstruct(ret, r.builtin_Boolean, 72 r.wrapNativeConstruct(r.builtin_newBoolean, ret, proto), proto, "Boolean", intToValue(1)) 73 } 74 return ret 75 }