Skip to content

Commit 9302f51

Browse files
Matt Loringjasnell
Matt Loring
authored andcommitted
deps: cherry-pick 6803eef from V8 upstream
Original commit message: Allow embedder to set promise internal field count Asynchronous context tracking mechanisms in Node.js need to store some state on all promise objects. This change will allow embedders to configure the number of internal fields on promises as is already done for ArrayBuffers. BUG=v8:6435 Review-Url: https://codereview.chromium.org/2889863002 Cr-Commit-Position: refs/heads/master@{#45496} PR-URL: #13175 Reviewed-By: Ali Ijaz Sheikh <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 3becb02 commit 9302f51

File tree

7 files changed

+32
-4
lines changed

7 files changed

+32
-4
lines changed

deps/v8/BUILD.gn

+7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ declare_args() {
3838
# Sets -dENABLE_DISASSEMBLER.
3939
v8_enable_disassembler = ""
4040

41+
# Sets the number of internal fields on promise objects.
42+
v8_promise_internal_field_count = 0
43+
4144
# Sets -dENABLE_GDB_JIT_INTERFACE.
4245
v8_enable_gdbjit = ""
4346

@@ -197,6 +200,10 @@ config("features") {
197200
if (v8_enable_disassembler) {
198201
defines += [ "ENABLE_DISASSEMBLER" ]
199202
}
203+
if (v8_promise_internal_field_count != 0) {
204+
defines +=
205+
[ "V8_PROMISE_INTERNAL_FIELD_COUNT=${v8_promise_internal_field_count}" ]
206+
}
200207
if (v8_enable_gdbjit) {
201208
defines += [ "ENABLE_GDB_JIT_INTERFACE" ]
202209
}

deps/v8/gypfiles/features.gypi

+5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
'variables': {
3232
'v8_enable_disassembler%': 0,
3333

34+
'v8_promise_internal_field_count%': 0,
35+
3436
'v8_enable_gdbjit%': 0,
3537

3638
'v8_enable_verify_csa%': 0,
@@ -77,6 +79,9 @@
7779
['v8_enable_disassembler==1', {
7880
'defines': ['ENABLE_DISASSEMBLER',],
7981
}],
82+
['v8_promise_internal_field_count!=0', {
83+
'defines': ['V8_PROMISE_INTERNAL_FIELD_COUNT','v8_promise_internal_field_count'],
84+
}],
8085
['v8_enable_gdbjit==1', {
8186
'defines': ['ENABLE_GDB_JIT_INTERFACE',],
8287
}],

deps/v8/include/v8-version.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define V8_MAJOR_VERSION 5
1212
#define V8_MINOR_VERSION 8
1313
#define V8_BUILD_NUMBER 283
14-
#define V8_PATCH_LEVEL 40
14+
#define V8_PATCH_LEVEL 41
1515

1616
// Use 1 for candidates and 0 otherwise.
1717
// (Boolean macro values are not supported by all preprocessors.)

deps/v8/include/v8.h

+6
Original file line numberDiff line numberDiff line change
@@ -3743,6 +3743,10 @@ class V8_EXPORT Function : public Object {
37433743
static void CheckCast(Value* obj);
37443744
};
37453745

3746+
#ifndef V8_PROMISE_INTERNAL_FIELD_COUNT
3747+
// The number of required internal fields can be defined by embedder.
3748+
#define V8_PROMISE_INTERNAL_FIELD_COUNT 0
3749+
#endif
37463750

37473751
/**
37483752
* An instance of the built-in Promise constructor (ES6 draft).
@@ -3824,6 +3828,8 @@ class V8_EXPORT Promise : public Object {
38243828

38253829
V8_INLINE static Promise* Cast(Value* obj);
38263830

3831+
static const int kEmbedderFieldCount = V8_PROMISE_INTERNAL_FIELD_COUNT;
3832+
38273833
private:
38283834
Promise();
38293835
static void CheckCast(Value* obj);

deps/v8/src/bootstrapper.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -1945,9 +1945,9 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
19451945

19461946
Handle<JSObject> prototype =
19471947
factory->NewJSObject(isolate->object_function(), TENURED);
1948-
Handle<JSFunction> promise_fun =
1949-
InstallFunction(global, "Promise", JS_PROMISE_TYPE, JSPromise::kSize,
1950-
prototype, Builtins::kPromiseConstructor);
1948+
Handle<JSFunction> promise_fun = InstallFunction(
1949+
global, "Promise", JS_PROMISE_TYPE, JSPromise::kSizeWithEmbedderFields,
1950+
prototype, Builtins::kPromiseConstructor);
19511951
InstallWithIntrinsicDefaultProto(isolate, promise_fun,
19521952
Context::PROMISE_FUNCTION_INDEX);
19531953

deps/v8/src/builtins/builtins-promise.cc

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ void PromiseBuiltinsAssembler::PromiseInit(Node* promise) {
3131
StoreObjectField(promise, JSPromise::kStatusOffset,
3232
SmiConstant(v8::Promise::kPending));
3333
StoreObjectField(promise, JSPromise::kFlagsOffset, SmiConstant(0));
34+
for (int i = 0; i < v8::Promise::kEmbedderFieldCount; i++) {
35+
int offset = JSPromise::kSize + i * kPointerSize;
36+
StoreObjectFieldNoWriteBarrier(promise, offset, SmiConstant(Smi::kZero));
37+
}
3438
}
3539

3640
Node* PromiseBuiltinsAssembler::AllocateAndInitJSPromise(Node* context) {
@@ -62,6 +66,10 @@ Node* PromiseBuiltinsAssembler::AllocateAndSetJSPromise(Node* context,
6266
StoreObjectFieldNoWriteBarrier(instance, JSPromise::kResultOffset, result);
6367
StoreObjectFieldNoWriteBarrier(instance, JSPromise::kFlagsOffset,
6468
SmiConstant(0));
69+
for (int i = 0; i < v8::Promise::kEmbedderFieldCount; i++) {
70+
int offset = JSPromise::kSize + i * kPointerSize;
71+
StoreObjectFieldNoWriteBarrier(instance, offset, SmiConstant(Smi::kZero));
72+
}
6573

6674
Label out(this);
6775
GotoIfNot(IsPromiseHookEnabledOrDebugIsActive(), &out);

deps/v8/src/objects.h

+2
Original file line numberDiff line numberDiff line change
@@ -8447,6 +8447,8 @@ class JSPromise : public JSObject {
84478447
kFulfillReactionsOffset + kPointerSize;
84488448
static const int kFlagsOffset = kRejectReactionsOffset + kPointerSize;
84498449
static const int kSize = kFlagsOffset + kPointerSize;
8450+
static const int kSizeWithEmbedderFields =
8451+
kSize + v8::Promise::kEmbedderFieldCount * kPointerSize;
84508452

84518453
// Flags layout.
84528454
static const int kHasHandlerBit = 0;

0 commit comments

Comments
 (0)