mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.7 KiB
54 lines
1.7 KiB
/*
|
|
* GetValue() and PutValue() coerce the base reference to an object if it
|
|
* is a primitive value, and then use a variant of [[Get]] and [[Put]] to
|
|
* access the value.
|
|
*
|
|
* This variant is identical to the default one except for one small detail:
|
|
* if a getter/setter is invoked, the 'this' binding for the getter/setter
|
|
* is the primitive value, not the coerced object. Presumably this is nicer
|
|
* from an implementation perspective, because the coerced object is never
|
|
* exposed to user code (even through a getter/setter).
|
|
*
|
|
* Note that the getter/setter must be strict to avoid a this binding
|
|
* object coercion which happens during call setup: E5 Section 10.4.3.
|
|
*
|
|
* Implementation behavior differs:
|
|
*
|
|
* - Some implementations provide the coerced (object) value to the
|
|
* setter/getter (e.g. Rhino and Smjs)
|
|
*
|
|
* - Some implementations omit the "foo".test assignment test below
|
|
* entirely (e.g. NodeJS / V8). This is presumably because the
|
|
* assignment goes to a temporary object which is never accessible
|
|
* to user code. So except for the setter call side effect and
|
|
* potential error throwing side effects, the assignment has no
|
|
* observable effect.
|
|
*/
|
|
|
|
/*===
|
|
string
|
|
object
|
|
string
|
|
object
|
|
===*/
|
|
|
|
// add test getter
|
|
Object.defineProperty(String.prototype, 'test', {
|
|
get: function() { 'use strict'; print(typeof this); },
|
|
set: function(x) { 'use strict'; print(typeof this); },
|
|
});
|
|
|
|
var s = new String("foo");
|
|
|
|
// Should print 'string'. Rhino and Smjs print 'object'.
|
|
"foo".test;
|
|
|
|
// Should print 'object'.
|
|
s.test;
|
|
|
|
// Should print 'string'. Rhino and Smjs print 'object, while
|
|
// V8 omits the statement entirely and prints nothing.
|
|
"foo".test = "bar";
|
|
|
|
// Should print 'object'.
|
|
s.test = "bar";
|
|
|