Diff
Added: trunk/JSTests/stress/put-by-id-direct.js (0 => 230459)
--- trunk/JSTests/stress/put-by-id-direct.js (rev 0)
+++ trunk/JSTests/stress/put-by-id-direct.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -0,0 +1,23 @@
+var createBuiltin = $vm.createBuiltin;
+
+function shouldBe(actual, expected) {
+ if (actual !== expected)
+ throw new Error('bad value: ' + actual);
+}
+
+(function () {
+ var builtin = createBuiltin(`(function (obj, value) {
+ return @putByIdDirect(obj, "hello", value);
+ })`);
+ noInline(builtin);
+
+ var setValue = null;
+ var object = {
+ __proto__: {
+ hello: 30
+ }
+ };
+ builtin(object, 42);
+ shouldBe(object.hello, 42);
+ shouldBe(object.hasOwnProperty("hello"), true);
+}());
Modified: trunk/Source/_javascript_Core/ChangeLog (230458 => 230459)
--- trunk/Source/_javascript_Core/ChangeLog 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/ChangeLog 2018-04-10 01:05:40 UTC (rev 230459)
@@ -1,3 +1,62 @@
+2018-04-08 Yusuke Suzuki <utatane....@gmail.com>
+
+ [JSC] Introduce @putByIdDirectPrivate
+ https://bugs.webkit.org/show_bug.cgi?id=184400
+
+ Reviewed by Saam Barati.
+
+ This patch adds @putByIdDirectPrivate() to use it for builtin JS.
+ @getByIdDirectPrivate and @putByIdDirectPrivate are pair of intrinsics
+ accessing to ECMAScript internal fields.
+
+ This change removes accidental [[Put]] operation to an object whose [[Prototype]]
+ has internal fields (not direct properties). By using @getByIdDirectPrivate() and
+ @putByIdDirectPrivate(), we strongly keep the semantics of the ECMAScript internal
+ fields that accessing to the internal fields does not traverse prototype chains.
+
+ * builtins/ArrayIteratorPrototype.js:
+ (globalPrivate.arrayIteratorValueNext):
+ (globalPrivate.arrayIteratorKeyNext):
+ (globalPrivate.arrayIteratorKeyValueNext):
+ * builtins/ArrayPrototype.js:
+ (globalPrivate.createArrayIterator):
+ * builtins/AsyncFromSyncIteratorPrototype.js:
+ (globalPrivate.AsyncFromSyncIteratorConstructor):
+ * builtins/AsyncFunctionPrototype.js:
+ (globalPrivate.asyncFunctionResume):
+ * builtins/AsyncGeneratorPrototype.js:
+ (globalPrivate.asyncGeneratorQueueEnqueue):
+ (globalPrivate.asyncGeneratorQueueDequeue):
+ (asyncGeneratorYieldAwaited):
+ (globalPrivate.asyncGeneratorYield):
+ (globalPrivate.doAsyncGeneratorBodyCall):
+ (globalPrivate.asyncGeneratorResumeNext):
+ * builtins/GeneratorPrototype.js:
+ (globalPrivate.generatorResume):
+ * builtins/MapIteratorPrototype.js:
+ (globalPrivate.mapIteratorNext):
+ * builtins/MapPrototype.js:
+ (globalPrivate.createMapIterator):
+ * builtins/ModuleLoaderPrototype.js:
+ (forceFulfillPromise):
+ * builtins/PromiseOperations.js:
+ (globalPrivate.newHandledRejectedPromise):
+ (globalPrivate.rejectPromise):
+ (globalPrivate.fulfillPromise):
+ (globalPrivate.initializePromise):
+ * builtins/PromisePrototype.js:
+ (then):
+ * builtins/SetIteratorPrototype.js:
+ (globalPrivate.setIteratorNext):
+ * builtins/SetPrototype.js:
+ (globalPrivate.createSetIterator):
+ * builtins/StringIteratorPrototype.js:
+ (next):
+ * bytecode/BytecodeIntrinsicRegistry.h:
+ * bytecompiler/NodesCodegen.cpp:
+ (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirect):
+ (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate):
+
2018-04-09 Mark Lam <mark....@apple.com>
Decorate method table entries to support pointer profiling.
Modified: trunk/Source/_javascript_Core/builtins/ArrayIteratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/ArrayIteratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/ArrayIteratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -49,10 +49,10 @@
if (!@getByIdDirectPrivate(this, "arrayIteratorIsDone")) {
var index = @getByIdDirectPrivate(this, "arrayIteratorNextIndex");
var length = array.length >>> 0;
- if (index >= length) {
- this.@arrayIteratorIsDone = true;
- } else {
- this.@arrayIteratorNextIndex = index + 1;
+ if (index >= length)
+ @putByIdDirectPrivate(this, "arrayIteratorIsDone", true);
+ else {
+ @putByIdDirectPrivate(this, "arrayIteratorNextIndex", index + 1);
done = false;
value = array[index];
}
@@ -72,10 +72,10 @@
if (!@getByIdDirectPrivate(this, "arrayIteratorIsDone")) {
var index = @getByIdDirectPrivate(this, "arrayIteratorNextIndex");
var length = array.length >>> 0;
- if (index >= length) {
- this.@arrayIteratorIsDone = true;
- } else {
- this.@arrayIteratorNextIndex = index + 1;
+ if (index >= length)
+ @putByIdDirectPrivate(this, "arrayIteratorIsDone", true);
+ else {
+ @putByIdDirectPrivate(this, "arrayIteratorNextIndex", index + 1);
done = false;
value = index;
}
@@ -95,10 +95,10 @@
if (!@getByIdDirectPrivate(this, "arrayIteratorIsDone")) {
var index = @getByIdDirectPrivate(this, "arrayIteratorNextIndex");
var length = array.length >>> 0;
- if (index >= length) {
- this.@arrayIteratorIsDone = true;
- } else {
- this.@arrayIteratorNextIndex = index + 1;
+ if (index >= length)
+ @putByIdDirectPrivate(this, "arrayIteratorIsDone", true);
+ else {
+ @putByIdDirectPrivate(this, "arrayIteratorNextIndex", index + 1);
done = false;
value = [ index, array[index] ];
}
Modified: trunk/Source/_javascript_Core/builtins/ArrayPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/ArrayPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/ArrayPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -30,11 +30,11 @@
{
"use strict";
- this.@iteratedObject = iteratedObject;
- this.@arrayIteratorKind = kind;
- this.@arrayIteratorNextIndex = 0;
- this.@arrayIteratorNext = iterationFunction;
- this.@arrayIteratorIsDone = false;
+ @putByIdDirectPrivate(this, "iteratedObject", iteratedObject);
+ @putByIdDirectPrivate(this, "arrayIteratorKind", kind);
+ @putByIdDirectPrivate(this, "arrayIteratorNextIndex", 0);
+ @putByIdDirectPrivate(this, "arrayIteratorNext", iterationFunction);
+ @putByIdDirectPrivate(this, "arrayIteratorIsDone", false);
}
function values()
Modified: trunk/Source/_javascript_Core/builtins/AsyncFromSyncIteratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/AsyncFromSyncIteratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/AsyncFromSyncIteratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -161,6 +161,6 @@
@constructor
function AsyncFromSyncIteratorConstructor(syncIterator, nextMethod)
{
- this.@syncIterator = syncIterator;
- this.@nextMethod = nextMethod;
+ @putByIdDirectPrivate(this, "syncIterator", syncIterator);
+ @putByIdDirectPrivate(this, "nextMethod", nextMethod);
}
Modified: trunk/Source/_javascript_Core/builtins/AsyncFunctionPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/AsyncFunctionPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/AsyncFunctionPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -34,15 +34,15 @@
@throwTypeError("Async function illegally resumed");
try {
- generator.@generatorState = @GeneratorStateExecuting;
+ @putByIdDirectPrivate(generator, "generatorState", @GeneratorStateExecuting);
value = @getByIdDirectPrivate(generator, "generatorNext").@call(@getByIdDirectPrivate(generator, "generatorThis"), generator, state, sentValue, resumeMode, @getByIdDirectPrivate(generator, "generatorFrame"));
if (@getByIdDirectPrivate(generator, "generatorState") === @GeneratorStateExecuting) {
- generator.@generatorState = @GeneratorStateCompleted;
+ @putByIdDirectPrivate(generator, "generatorState", @GeneratorStateCompleted);
promiseCapability.@resolve(value);
return promiseCapability.@promise;
}
} catch (error) {
- generator.@generatorState = @GeneratorStateCompleted;
+ @putByIdDirectPrivate(generator, "generatorState", @GeneratorStateCompleted);
promiseCapability.@reject(error);
return promiseCapability.@promise;
}
Modified: trunk/Source/_javascript_Core/builtins/AsyncGeneratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/AsyncGeneratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/AsyncGeneratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -41,13 +41,13 @@
if (@getByIdDirectPrivate(generator, "asyncGeneratorQueueFirst") === null) {
@assert(@getByIdDirectPrivate(generator, "asyncGeneratorQueueLast") === null);
- generator.@asyncGeneratorQueueFirst = item;
- generator.@asyncGeneratorQueueLast = item;
+ @putByIdDirectPrivate(generator, "asyncGeneratorQueueFirst", item);
+ @putByIdDirectPrivate(generator, "asyncGeneratorQueueLast", item);
} else {
var last = @getByIdDirectPrivate(generator, "asyncGeneratorQueueLast");
- item.@asyncGeneratorQueueItemPrevious = last;
- last.@asyncGeneratorQueueItemNext = item;
- generator.@asyncGeneratorQueueLast = item;
+ @putByIdDirectPrivate(item, "asyncGeneratorQueueItemPrevious", last);
+ @putByIdDirectPrivate(last, "asyncGeneratorQueueItemNext", item);
+ @putByIdDirectPrivate(generator, "asyncGeneratorQueueLast", item);
}
}
@@ -61,10 +61,10 @@
return null;
var updatedFirst = @getByIdDirectPrivate(result, "asyncGeneratorQueueItemNext");
- generator.@asyncGeneratorQueueFirst = updatedFirst;
+ @putByIdDirectPrivate(generator, "asyncGeneratorQueueFirst", updatedFirst);
if (updatedFirst === null)
- generator.@asyncGeneratorQueueLast = null;
+ @putByIdDirectPrivate(generator, "asyncGeneratorQueueLast", null);
return result;
}
@@ -136,11 +136,11 @@
function asyncGeneratorYieldAwaited(result)
{
- generator.@asyncGeneratorSuspendReason = @AsyncGeneratorSuspendReasonYield;
+ @putByIdDirectPrivate(generator, "asyncGeneratorSuspendReason", @AsyncGeneratorSuspendReasonYield);
@asyncGeneratorResolve(generator, result, false);
}
- generator.@asyncGeneratorSuspendReason = @AsyncGeneratorSuspendReasonAwait;
+ @putByIdDirectPrivate(generator, "asyncGeneratorSuspendReason", @AsyncGeneratorSuspendReasonAwait);
@awaitValue(generator, value, asyncGeneratorYieldAwaited);
@@ -170,16 +170,16 @@
let value = @undefined;
let state = @getByIdDirectPrivate(generator, "generatorState");
- generator.@generatorState = @AsyncGeneratorStateExecuting;
- generator.@asyncGeneratorSuspendReason = @AsyncGeneratorSuspendReasonNone;
+ @putByIdDirectPrivate(generator, "generatorState", @AsyncGeneratorStateExecuting);
+ @putByIdDirectPrivate(generator, "asyncGeneratorSuspendReason", @AsyncGeneratorSuspendReasonNone);
try {
value = @getByIdDirectPrivate(generator, "generatorNext").@call(@getByIdDirectPrivate(generator, "generatorThis"), generator, state, resumeValue, resumeMode, @getByIdDirectPrivate(generator, "generatorFrame"));
if (@getByIdDirectPrivate(generator, "generatorState") === @AsyncGeneratorStateExecuting)
- generator.@generatorState = @AsyncGeneratorStateCompleted;
+ @putByIdDirectPrivate(generator, "generatorState", @AsyncGeneratorStateCompleted);
} catch (error) {
- generator.@generatorState = @AsyncGeneratorStateCompleted;
- generator.@asyncGeneratorSuspendReason = @AsyncGeneratorSuspendReasonNone;
+ @putByIdDirectPrivate(generator, "generatorState", @AsyncGeneratorStateCompleted);
+ @putByIdDirectPrivate(generator, "asyncGeneratorSuspendReason", @AsyncGeneratorSuspendReasonNone);
return @asyncGeneratorReject(generator, error);
}
@@ -196,7 +196,7 @@
return @asyncGeneratorYield(generator, value, resumeMode);
if (@getByIdDirectPrivate(generator, "generatorState") === @AsyncGeneratorStateCompleted) {
- generator.@asyncGeneratorSuspendReason = @AsyncGeneratorSuspendReasonNone;
+ @putByIdDirectPrivate(generator, "asyncGeneratorSuspendReason", @AsyncGeneratorSuspendReasonNone);
return @asyncGeneratorResolve(generator, value, true);
}
@@ -224,13 +224,13 @@
if (next.resumeMode !== @GeneratorResumeModeNormal) {
if (state === @AsyncGeneratorStateSuspendedStart) {
- generator.@generatorState = @AsyncGeneratorStateCompleted;
+ @putByIdDirectPrivate(generator, "generatorState", @AsyncGeneratorStateCompleted);
state = @AsyncGeneratorStateCompleted;
}
if (state === @AsyncGeneratorStateCompleted) {
if (next.resumeMode === @GeneratorResumeModeReturn) {
- generator.@generatorState = @AsyncGeneratorStateAwaitingReturn;
+ @putByIdDirectPrivate(generator, "generatorState", @AsyncGeneratorStateAwaitingReturn);
const promiseCapability = @newPromiseCapability(@Promise);
promiseCapability.@resolve.@call(@undefined, next.value);
@@ -239,7 +239,7 @@
function (result) { generator.@generatorState = @AsyncGeneratorStateCompleted; @asyncGeneratorResolve(generator, result, true); },
function (error) { generator.@generatorState = @AsyncGeneratorStateCompleted; @asyncGeneratorReject(generator, error); });
- throwawayCapabilityPromise.@promiseIsHandled = true;
+ @putByIdDirectPrivate(throwawayCapabilityPromise, "promiseIsHandled", true);
return @undefined;
}
Modified: trunk/Source/_javascript_Core/builtins/GeneratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/GeneratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/GeneratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -34,14 +34,14 @@
var done = state === @GeneratorStateCompleted;
if (!done) {
try {
- generator.@generatorState = @GeneratorStateExecuting;
+ @putByIdDirectPrivate(generator, "generatorState", @GeneratorStateExecuting);
value = @getByIdDirectPrivate(generator, "generatorNext").@call(generatorThis, generator, state, sentValue, resumeMode, @getByIdDirectPrivate(generator, "generatorFrame"));
if (@getByIdDirectPrivate(generator, "generatorState") === @GeneratorStateExecuting) {
- generator.@generatorState = @GeneratorStateCompleted;
+ @putByIdDirectPrivate(generator, "generatorState", @GeneratorStateCompleted);
done = true;
}
} catch (error) {
- generator.@generatorState = @GeneratorStateCompleted;
+ @putByIdDirectPrivate(generator, "generatorState", @GeneratorStateCompleted);
throw error;
}
}
Modified: trunk/Source/_javascript_Core/builtins/MapIteratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/MapIteratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/MapIteratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -31,7 +31,7 @@
var value;
bucket = @mapBucketNext(bucket);
- this.@mapBucket = bucket;
+ @putByIdDirectPrivate(this, "mapBucket", bucket);
var done = bucket === @sentinelMapBucket;
if (!done) {
var key = @mapBucketKey(bucket);
Modified: trunk/Source/_javascript_Core/builtins/MapPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/MapPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/MapPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -30,9 +30,9 @@
"use strict";
@assert(@isMap(iteratedObject));
- this.@iteratedObject = iteratedObject;
- this.@mapIteratorKind = kind;
- this.@mapBucket = @mapBucketHead(iteratedObject);
+ @putByIdDirectPrivate(this, "iteratedObject", iteratedObject);
+ @putByIdDirectPrivate(this, "mapIteratorKind", kind);
+ @putByIdDirectPrivate(this, "mapBucket", @mapBucketHead(iteratedObject));
}
function values()
Modified: trunk/Source/_javascript_Core/builtins/ModuleLoaderPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/ModuleLoaderPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/ModuleLoaderPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -123,7 +123,7 @@
{
"use strict";
- if (promise.@promiseState === @promiseStatePending)
+ if (@getByIdDirectPrivate(promise, "promiseState") === @promiseStatePending)
@fulfillPromise(promise, value);
}
Modified: trunk/Source/_javascript_Core/builtins/PromiseOperations.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/PromiseOperations.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/PromiseOperations.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -88,7 +88,7 @@
function newHandledRejectedPromise(error)
{
let promise = @Promise.@reject(error);
- promise.@promiseIsHandled = true;
+ @putByIdDirectPrivate(promise, "promiseIsHandled", true);
return promise;
}
@@ -107,9 +107,9 @@
"use strict";
var reactions = @getByIdDirectPrivate(promise, "promiseReactions");
- promise.@promiseResult = reason;
- promise.@promiseReactions = @undefined;
- promise.@promiseState = @promiseStateRejected;
+ @putByIdDirectPrivate(promise, "promiseResult", reason);
+ @putByIdDirectPrivate(promise, "promiseReactions", @undefined);
+ @putByIdDirectPrivate(promise, "promiseState", @promiseStateRejected);
@InspectorInstrumentation.promiseRejected(promise, reason, reactions);
@@ -125,9 +125,9 @@
"use strict";
var reactions = @getByIdDirectPrivate(promise, "promiseReactions");
- promise.@promiseResult = value;
- promise.@promiseReactions = @undefined;
- promise.@promiseState = @promiseStateFulfilled;
+ @putByIdDirectPrivate(promise, "promiseResult", value);
+ @putByIdDirectPrivate(promise, "promiseReactions", @undefined);
+ @putByIdDirectPrivate(promise, "promiseState", @promiseStateFulfilled);
@InspectorInstrumentation.promiseFulfilled(promise, value, reactions);
@@ -218,9 +218,9 @@
if (typeof executor !== 'function')
@throwTypeError("Promise constructor takes a function argument");
- this.@promiseState = @promiseStatePending;
- this.@promiseReactions = [];
- this.@promiseIsHandled = false;
+ @putByIdDirectPrivate(this, "promiseState", @promiseStatePending);
+ @putByIdDirectPrivate(this, "promiseReactions", []);
+ @putByIdDirectPrivate(this, "promiseIsHandled", false);
var resolvingFunctions = @createResolvingFunctions(this);
try {
Modified: trunk/Source/_javascript_Core/builtins/PromisePrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/PromisePrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/PromisePrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -59,7 +59,7 @@
@enqueueJob(@promiseReactionJob, [state, reaction, @getByIdDirectPrivate(this, "promiseResult")]);
}
- this.@promiseIsHandled = true;
+ @putByIdDirectPrivate(this, "promiseIsHandled", true);
return resultCapability.@promise;
}
Modified: trunk/Source/_javascript_Core/builtins/SetIteratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/SetIteratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/SetIteratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -31,7 +31,7 @@
var value;
bucket = @setBucketNext(bucket);
- this.@setBucket = bucket;
+ @putByIdDirectPrivate(this, "setBucket", bucket);
var done = bucket === @sentinelSetBucket;
if (!done) {
value = @setBucketKey(bucket);
Modified: trunk/Source/_javascript_Core/builtins/SetPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/SetPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/SetPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -30,9 +30,9 @@
"use strict";
@assert(@isSet(iteratedObject));
- this.@iteratedObject = iteratedObject;
- this.@setIteratorKind = kind;
- this.@setBucket = @setBucketHead(iteratedObject);
+ @putByIdDirectPrivate(this, "iteratedObject", iteratedObject);
+ @putByIdDirectPrivate(this, "setIteratorKind", kind);
+ @putByIdDirectPrivate(this, "setBucket", @setBucketHead(iteratedObject));
}
function values()
Modified: trunk/Source/_javascript_Core/builtins/StringIteratorPrototype.js (230458 => 230459)
--- trunk/Source/_javascript_Core/builtins/StringIteratorPrototype.js 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/builtins/StringIteratorPrototype.js 2018-04-10 01:05:40 UTC (rev 230459)
@@ -40,9 +40,9 @@
var string = @getByIdDirectPrivate(this, "iteratedString");
if (string !== @undefined) {
var length = string.length >>> 0;
- if (position >= length) {
- this.@iteratedString = @undefined;
- } else {
+ if (position >= length)
+ @putByIdDirectPrivate(this, "iteratedString", @undefined);
+ else {
done = false;
var first = string.@charCodeAt(position);
@@ -56,7 +56,7 @@
value = string[position] + string[position + 1];
}
- this.@stringIteratorNextIndex = position + value.length;
+ @putByIdDirectPrivate(this, "stringIteratorNextIndex", position + value.length);
}
}
Modified: trunk/Source/_javascript_Core/bytecode/BytecodeIntrinsicRegistry.h (230458 => 230459)
--- trunk/Source/_javascript_Core/bytecode/BytecodeIntrinsicRegistry.h 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/bytecode/BytecodeIntrinsicRegistry.h 2018-04-10 01:05:40 UTC (rev 230459)
@@ -55,6 +55,8 @@
macro(throwRangeError) \
macro(throwOutOfMemoryError) \
macro(tryGetById) \
+ macro(putByIdDirect) \
+ macro(putByIdDirectPrivate) \
macro(putByValDirect) \
macro(toNumber) \
macro(toString) \
Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (230458 => 230459)
--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2018-04-10 00:31:02 UTC (rev 230458)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2018-04-10 01:05:40 UTC (rev 230459)
@@ -991,6 +991,37 @@
return generator.emitUnaryNoDstOp(op_argument_count, generator.finalDestination(dst));
}
+RegisterID* BytecodeIntrinsicNode::emit_intrinsic_putByIdDirect(BytecodeGenerator& generator, RegisterID* dst)
+{
+ ArgumentListNode* node = m_args->m_listNode;
+ RefPtr<RegisterID> base = generator.emitNode(node);
+ node = node->m_next;
+ ASSERT(node->m_expr->isString());
+ const Identifier& ident = static_cast<StringNode*>(node->m_expr)->value();
+ node = node->m_next;
+ RefPtr<RegisterID> value = generator.emitNode(node);
+
+ ASSERT(!node->m_next);
+
+ return generator.moveToDestinationIfNeeded(dst, generator.emitDirectPutById(base.get(), ident, value.get(), PropertyNode::KnownDirect));
+}
+
+RegisterID* BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate(BytecodeGenerator& generator, RegisterID* dst)
+{
+ ArgumentListNode* node = m_args->m_listNode;
+ RefPtr<RegisterID> base = generator.emitNode(node);
+ node = node->m_next;
+ ASSERT(node->m_expr->isString());
+ const Identifier* ident = generator.vm()->propertyNames->lookUpPrivateName(static_cast<StringNode*>(node->m_expr)->value());
+ ASSERT(ident);
+ node = node->m_next;
+ RefPtr<RegisterID> value = generator.emitNode(node);
+
+ ASSERT(!node->m_next);
+
+ return generator.moveToDestinationIfNeeded(dst, generator.emitDirectPutById(base.get(), *ident, value.get(), PropertyNode::KnownDirect));
+}
+
RegisterID* BytecodeIntrinsicNode::emit_intrinsic_putByValDirect(BytecodeGenerator& generator, RegisterID* dst)
{
ArgumentListNode* node = m_args->m_listNode;