@@ -216,6 +216,10 @@ func (t Type) String() string {
216
216
}
217
217
}
218
218
219
+ func (t Type ) isObject () bool {
220
+ return t == TypeObject || t == TypeFunction
221
+ }
222
+
219
223
// Type returns the JavaScript type of the value v. It is similar to JavaScript's typeof operator,
220
224
// except that it returns TypeNull instead of TypeObject for null.
221
225
func (v Value ) Type () Type {
@@ -244,28 +248,44 @@ func (v Value) Type() Type {
244
248
}
245
249
246
250
// Get returns the JavaScript property p of value v.
251
+ // It panics if v is not a JavaScript object.
247
252
func (v Value ) Get (p string ) Value {
253
+ if vType := v .Type (); ! vType .isObject () {
254
+ panic (& ValueError {"Value.Get" , vType })
255
+ }
248
256
return makeValue (valueGet (v .ref , p ))
249
257
}
250
258
251
259
func valueGet (v ref , p string ) ref
252
260
253
261
// Set sets the JavaScript property p of value v to ValueOf(x).
262
+ // It panics if v is not a JavaScript object.
254
263
func (v Value ) Set (p string , x interface {}) {
264
+ if vType := v .Type (); ! vType .isObject () {
265
+ panic (& ValueError {"Value.Set" , vType })
266
+ }
255
267
valueSet (v .ref , p , ValueOf (x ).ref )
256
268
}
257
269
258
270
func valueSet (v ref , p string , x ref )
259
271
260
272
// Index returns JavaScript index i of value v.
273
+ // It panics if v is not a JavaScript object.
261
274
func (v Value ) Index (i int ) Value {
275
+ if vType := v .Type (); ! vType .isObject () {
276
+ panic (& ValueError {"Value.Index" , vType })
277
+ }
262
278
return makeValue (valueIndex (v .ref , i ))
263
279
}
264
280
265
281
func valueIndex (v ref , i int ) ref
266
282
267
283
// SetIndex sets the JavaScript index i of value v to ValueOf(x).
284
+ // It panics if v is not a JavaScript object.
268
285
func (v Value ) SetIndex (i int , x interface {}) {
286
+ if vType := v .Type (); ! vType .isObject () {
287
+ panic (& ValueError {"Value.SetIndex" , vType })
288
+ }
269
289
valueSetIndex (v .ref , i , ValueOf (x ).ref )
270
290
}
271
291
@@ -280,7 +300,11 @@ func makeArgs(args []interface{}) []ref {
280
300
}
281
301
282
302
// Length returns the JavaScript property "length" of v.
303
+ // It panics if v is not a JavaScript object.
283
304
func (v Value ) Length () int {
305
+ if vType := v .Type (); ! vType .isObject () {
306
+ panic (& ValueError {"Value.SetIndex" , vType })
307
+ }
284
308
return valueLength (v .ref )
285
309
}
286
310
@@ -292,7 +316,7 @@ func valueLength(v ref) int
292
316
func (v Value ) Call (m string , args ... interface {}) Value {
293
317
res , ok := valueCall (v .ref , m , makeArgs (args ))
294
318
if ! ok {
295
- if vType := v .Type (); vType != TypeObject && vType != TypeFunction { // check here to avoid overhead in success case
319
+ if vType := v .Type (); ! vType . isObject () { // check here to avoid overhead in success case
296
320
panic (& ValueError {"Value.Call" , vType })
297
321
}
298
322
if propType := v .Get (m ).Type (); propType != TypeFunction {
@@ -306,7 +330,7 @@ func (v Value) Call(m string, args ...interface{}) Value {
306
330
func valueCall (v ref , m string , args []ref ) (ref , bool )
307
331
308
332
// Invoke does a JavaScript call of the value v with the given arguments.
309
- // It panics if v is not a function.
333
+ // It panics if v is not a JavaScript function.
310
334
// The arguments get mapped to JavaScript values according to the ValueOf function.
311
335
func (v Value ) Invoke (args ... interface {}) Value {
312
336
res , ok := valueInvoke (v .ref , makeArgs (args ))
@@ -322,11 +346,14 @@ func (v Value) Invoke(args ...interface{}) Value {
322
346
func valueInvoke (v ref , args []ref ) (ref , bool )
323
347
324
348
// New uses JavaScript's "new" operator with value v as constructor and the given arguments.
325
- // It panics if v is not a function.
349
+ // It panics if v is not a JavaScript function.
326
350
// The arguments get mapped to JavaScript values according to the ValueOf function.
327
351
func (v Value ) New (args ... interface {}) Value {
328
352
res , ok := valueNew (v .ref , makeArgs (args ))
329
353
if ! ok {
354
+ if vType := v .Type (); vType != TypeFunction { // check here to avoid overhead in success case
355
+ panic (& ValueError {"Value.Invoke" , vType })
356
+ }
330
357
panic (Error {makeValue (res )})
331
358
}
332
359
return makeValue (res )
@@ -350,17 +377,20 @@ func (v Value) float(method string) float64 {
350
377
return * (* float64 )(unsafe .Pointer (& v .ref ))
351
378
}
352
379
353
- // Float returns the value v as a float64. It panics if v is not a JavaScript number.
380
+ // Float returns the value v as a float64.
381
+ // It panics if v is not a JavaScript number.
354
382
func (v Value ) Float () float64 {
355
383
return v .float ("Value.Float" )
356
384
}
357
385
358
- // Int returns the value v truncated to an int. It panics if v is not a JavaScript number.
386
+ // Int returns the value v truncated to an int.
387
+ // It panics if v is not a JavaScript number.
359
388
func (v Value ) Int () int {
360
389
return int (v .float ("Value.Int" ))
361
390
}
362
391
363
- // Bool returns the value v as a bool. It panics if v is not a JavaScript boolean.
392
+ // Bool returns the value v as a bool.
393
+ // It panics if v is not a JavaScript boolean.
364
394
func (v Value ) Bool () bool {
365
395
switch v .ref {
366
396
case valueTrue .ref :
0 commit comments