@@ -189,6 +189,9 @@ func ValueOf(x interface{}) Value {
189
189
}
190
190
191
191
func (v Value ) Bool () bool {
192
+ if vType := v .Type (); vType != TypeBoolean {
193
+ panic (& ValueError {"Value.Bool" , vType })
194
+ }
192
195
return v .v .Bool ()
193
196
}
194
197
@@ -202,10 +205,19 @@ func convertArgs(args []interface{}) []interface{} {
202
205
}
203
206
204
207
func (v Value ) Call (m string , args ... interface {}) Value {
208
+ if vType := v .Type (); vType != TypeObject && vType != TypeFunction {
209
+ panic (& ValueError {"Value.Call" , vType })
210
+ }
211
+ if propType := v .Get (m ).Type (); propType != TypeFunction {
212
+ panic ("js: Value.Call: property " + m + " is not a function, got " + propType .String ())
213
+ }
205
214
return Value {v : v .v .Call (m , convertArgs (args )... )}
206
215
}
207
216
208
217
func (v Value ) Float () float64 {
218
+ if vType := v .Type (); vType != TypeNumber {
219
+ panic (& ValueError {"Value.Float" , vType })
220
+ }
209
221
return v .v .Float ()
210
222
}
211
223
@@ -218,10 +230,16 @@ func (v Value) Index(i int) Value {
218
230
}
219
231
220
232
func (v Value ) Int () int {
233
+ if vType := v .Type (); vType != TypeNumber {
234
+ panic (& ValueError {"Value.Int" , vType })
235
+ }
221
236
return v .v .Int ()
222
237
}
223
238
224
239
func (v Value ) Invoke (args ... interface {}) Value {
240
+ if vType := v .Type (); vType != TypeFunction {
241
+ panic (& ValueError {"Value.Invoke" , vType })
242
+ }
225
243
return Value {v : v .v .Invoke (convertArgs (args )... )}
226
244
}
227
245
@@ -273,3 +291,12 @@ func (t *TypedArray) Release() {
273
291
func GetInternalObject (v Value ) interface {} {
274
292
return v .v
275
293
}
294
+
295
+ type ValueError struct {
296
+ Method string
297
+ Type Type
298
+ }
299
+
300
+ func (e * ValueError ) Error () string {
301
+ return "syscall/js: call of " + e .Method + " on " + e .Type .String ()
302
+ }
0 commit comments