Reland "[torque] Port some constructor builtins to Torque."
This is a reland of ce249dbb2fd358afb660236c6a191e930453dbc1
As it's unchanged,
TBR=leszeks@chromium.org,tebbi@chromium.org
Original change's description:
> [torque] Port some constructor builtins to Torque.
>
> - FastNewFunctionContextEval
> - FastNewFunctionContextFunction
> - CreateEmptyLiteralObject
> - CreateRegExpLiteral
> - CreateEmptyArrayLiteral
> - CreateShallowArrayLiteral
> - CreateShallowObjectLiteral
> - NumberConstructor
> - ObjectConstructor
> - GenericLazyDeoptContinuation
>
> Bug: v8:9891
>
> Change-Id: Idd4bf035d8dbeec03b9ef727e1bfb80eab4bc43c
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2311411
> Commit-Queue: Bill Budge <bbudge@chromium.org>
> Reviewed-by: Leszek Swirski <leszeks@chromium.org>
> Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#69082}
Bug: v8:9891
Change-Id: I566d4167c02488ef6a9a1c73015af5e2f484a31d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2330382
Commit-Queue: Bill Budge <bbudge@chromium.org>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#69281}
diff --git a/BUILD.gn b/BUILD.gn
index 768ec61..ec5f78a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1115,6 +1115,7 @@
"src/builtins/builtins-string.tq",
"src/builtins/cast.tq",
"src/builtins/collections.tq",
+ "src/builtins/constructor.tq",
"src/builtins/conversion.tq",
"src/builtins/convert.tq",
"src/builtins/console.tq",
diff --git a/src/ast/ast.h b/src/ast/ast.h
index ce54ee2..f0e4328 100644
--- a/src/ast/ast.h
+++ b/src/ast/ast.h
@@ -1107,6 +1107,7 @@
kIsShallow = 1,
kDisableMementos = 1 << 1,
kNeedsInitialAllocationSite = 1 << 2,
+ kIsShallowAndDisableMementos = kIsShallow | kDisableMementos,
};
bool is_initialized() const { return 0 < depth_; }
diff --git a/src/builtins/base.tq b/src/builtins/base.tq
index e85769e..fc35c2a 100644
--- a/src/builtins/base.tq
+++ b/src/builtins/base.tq
@@ -523,6 +523,12 @@
}
}
+extern enum BigIntHandling extends int32
+constexpr 'CodeStubAssembler::BigIntHandling' { kConvertToNumber, kThrow }
+
+extern transitioning macro ToNumber(implicit context: Context)(
+ JSAny, constexpr BigIntHandling): Number;
+
extern transitioning macro ToLength_Inline(implicit context: Context)(JSAny):
Number;
extern transitioning macro ToNumber_Inline(implicit context: Context)(JSAny):
diff --git a/src/builtins/builtins-collections-gen.cc b/src/builtins/builtins-collections-gen.cc
index a2e818d..a8f9820 100644
--- a/src/builtins/builtins-collections-gen.cc
+++ b/src/builtins/builtins-collections-gen.cc
@@ -413,8 +413,7 @@
TNode<Context> context, TNode<JSFunction> constructor,
TNode<JSReceiver> new_target) {
ConstructorBuiltinsAssembler constructor_assembler(this->state());
- return constructor_assembler.EmitFastNewObject(context, constructor,
- new_target);
+ return constructor_assembler.FastNewObject(context, constructor, new_target);
}
void BaseCollectionsAssembler::GenerateConstructor(
diff --git a/src/builtins/builtins-constructor-gen.cc b/src/builtins/builtins-constructor-gen.cc
index 4079bc7..c313d77 100644
--- a/src/builtins/builtins-constructor-gen.cc
+++ b/src/builtins/builtins-constructor-gen.cc
@@ -226,20 +226,20 @@
Label call_runtime(this);
TNode<JSObject> result =
- EmitFastNewObject(context, target, new_target, &call_runtime);
+ FastNewObject(context, target, new_target, &call_runtime);
Return(result);
BIND(&call_runtime);
TailCallRuntime(Runtime::kNewObject, context, target, new_target);
}
-TNode<JSObject> ConstructorBuiltinsAssembler::EmitFastNewObject(
+TNode<JSObject> ConstructorBuiltinsAssembler::FastNewObject(
TNode<Context> context, TNode<JSFunction> target,
TNode<JSReceiver> new_target) {
TVARIABLE(JSObject, var_obj);
Label call_runtime(this), end(this);
- var_obj = EmitFastNewObject(context, target, new_target, &call_runtime);
+ var_obj = FastNewObject(context, target, new_target, &call_runtime);
Goto(&end);
BIND(&call_runtime);
@@ -250,7 +250,7 @@
return var_obj.value();
}
-TNode<JSObject> ConstructorBuiltinsAssembler::EmitFastNewObject(
+TNode<JSObject> ConstructorBuiltinsAssembler::FastNewObject(
TNode<Context> context, TNode<JSFunction> target,
TNode<JSReceiver> new_target, Label* call_runtime) {
// Verify that the new target is a JSFunction.
@@ -292,7 +292,7 @@
kNone, kWithSlackTracking);
}
-TNode<Context> ConstructorBuiltinsAssembler::EmitFastNewFunctionContext(
+TNode<Context> ConstructorBuiltinsAssembler::FastNewFunctionContext(
TNode<ScopeInfo> scope_info, TNode<Uint32T> slots, TNode<Context> context,
ScopeType scope_type) {
TNode<IntPtrT> slots_intptr = Signed(ChangeUint32ToWord(slots));
@@ -341,23 +341,7 @@
return function_context;
}
-TF_BUILTIN(FastNewFunctionContextEval, ConstructorBuiltinsAssembler) {
- TNode<ScopeInfo> scope_info = CAST(Parameter(Descriptor::kScopeInfo));
- TNode<Uint32T> slots = UncheckedCast<Uint32T>(Parameter(Descriptor::kSlots));
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- Return(EmitFastNewFunctionContext(scope_info, slots, context,
- ScopeType::EVAL_SCOPE));
-}
-
-TF_BUILTIN(FastNewFunctionContextFunction, ConstructorBuiltinsAssembler) {
- TNode<ScopeInfo> scope_info = CAST(Parameter(Descriptor::kScopeInfo));
- TNode<Uint32T> slots = UncheckedCast<Uint32T>(Parameter(Descriptor::kSlots));
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- Return(EmitFastNewFunctionContext(scope_info, slots, context,
- ScopeType::FUNCTION_SCOPE));
-}
-
-TNode<JSRegExp> ConstructorBuiltinsAssembler::EmitCreateRegExpLiteral(
+TNode<JSRegExp> ConstructorBuiltinsAssembler::CreateRegExpLiteral(
TNode<HeapObject> maybe_feedback_vector, TNode<TaggedIndex> slot,
TNode<Object> pattern, TNode<Smi> flags, TNode<Context> context) {
Label call_runtime(this, Label::kDeferred), end(this);
@@ -393,22 +377,10 @@
return result.value();
}
-TF_BUILTIN(CreateRegExpLiteral, ConstructorBuiltinsAssembler) {
- TNode<HeapObject> maybe_feedback_vector =
- CAST(Parameter(Descriptor::kFeedbackVector));
- TNode<TaggedIndex> slot = CAST(Parameter(Descriptor::kSlot));
- TNode<Object> pattern = CAST(Parameter(Descriptor::kPattern));
- TNode<Smi> flags = CAST(Parameter(Descriptor::kFlags));
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- TNode<JSRegExp> result = EmitCreateRegExpLiteral(maybe_feedback_vector, slot,
- pattern, flags, context);
- Return(result);
-}
-
-TNode<JSArray> ConstructorBuiltinsAssembler::EmitCreateShallowArrayLiteral(
+TNode<JSArray> ConstructorBuiltinsAssembler::CreateShallowArrayLiteral(
TNode<FeedbackVector> feedback_vector, TNode<TaggedIndex> slot,
- TNode<Context> context, Label* call_runtime,
- AllocationSiteMode allocation_site_mode) {
+ TNode<Context> context, AllocationSiteMode allocation_site_mode,
+ Label* call_runtime) {
Label zero_capacity(this), cow_elements(this), fast_elements(this),
return_result(this);
@@ -426,29 +398,7 @@
}
}
-TF_BUILTIN(CreateShallowArrayLiteral, ConstructorBuiltinsAssembler) {
- TNode<FeedbackVector> feedback_vector =
- CAST(Parameter(Descriptor::kFeedbackVector));
- TNode<TaggedIndex> slot = CAST(Parameter(Descriptor::kSlot));
- TNode<ArrayBoilerplateDescription> constant_elements =
- CAST(Parameter(Descriptor::kConstantElements));
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- Label call_runtime(this, Label::kDeferred);
- Return(EmitCreateShallowArrayLiteral(feedback_vector, slot, context,
- &call_runtime,
- DONT_TRACK_ALLOCATION_SITE));
-
- BIND(&call_runtime);
- {
- Comment("call runtime");
- int const flags =
- AggregateLiteral::kDisableMementos | AggregateLiteral::kIsShallow;
- Return(CallRuntime(Runtime::kCreateArrayLiteral, context, feedback_vector,
- slot, constant_elements, SmiConstant(flags)));
- }
-}
-
-TNode<JSArray> ConstructorBuiltinsAssembler::EmitCreateEmptyArrayLiteral(
+TNode<JSArray> ConstructorBuiltinsAssembler::CreateEmptyArrayLiteral(
TNode<FeedbackVector> feedback_vector, TNode<TaggedIndex> slot,
TNode<Context> context) {
// Array literals always have a valid AllocationSite to properly track
@@ -492,17 +442,7 @@
return result;
}
-TF_BUILTIN(CreateEmptyArrayLiteral, ConstructorBuiltinsAssembler) {
- TNode<FeedbackVector> feedback_vector =
- CAST(Parameter(Descriptor::kFeedbackVector));
- TNode<TaggedIndex> slot = CAST(Parameter(Descriptor::kSlot));
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- TNode<JSArray> result =
- EmitCreateEmptyArrayLiteral(feedback_vector, slot, context);
- Return(result);
-}
-
-TNode<HeapObject> ConstructorBuiltinsAssembler::EmitCreateShallowObjectLiteral(
+TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
TNode<FeedbackVector> feedback_vector, TNode<TaggedIndex> slot,
Label* call_runtime) {
TNode<Object> maybe_allocation_site =
@@ -679,26 +619,8 @@
return copy;
}
-TF_BUILTIN(CreateShallowObjectLiteral, ConstructorBuiltinsAssembler) {
- Label call_runtime(this);
- TNode<FeedbackVector> feedback_vector =
- CAST(Parameter(Descriptor::kFeedbackVector));
- TNode<TaggedIndex> slot = CAST(Parameter(Descriptor::kSlot));
- TNode<HeapObject> copy =
- EmitCreateShallowObjectLiteral(feedback_vector, slot, &call_runtime);
- Return(copy);
-
- BIND(&call_runtime);
- TNode<ObjectBoilerplateDescription> object_boilerplate_description =
- CAST(Parameter(Descriptor::kObjectBoilerplateDescription));
- TNode<Smi> flags = CAST(Parameter(Descriptor::kFlags));
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- TailCallRuntime(Runtime::kCreateObjectLiteral, context, feedback_vector, slot,
- object_boilerplate_description, flags);
-}
-
// Used by the CreateEmptyObjectLiteral bytecode and the Object constructor.
-TNode<JSObject> ConstructorBuiltinsAssembler::EmitCreateEmptyObjectLiteral(
+TNode<JSObject> ConstructorBuiltinsAssembler::CreateEmptyObjectLiteral(
TNode<Context> context) {
TNode<NativeContext> native_context = LoadNativeContext(context);
TNode<JSFunction> object_function =
@@ -715,115 +637,5 @@
return result;
}
-// ES #sec-object-constructor
-TF_BUILTIN(ObjectConstructor, ConstructorBuiltinsAssembler) {
- int const kValueArg = 0;
- TNode<IntPtrT> argc = ChangeInt32ToIntPtr(
- UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount)));
- CodeStubArguments args(this, argc);
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- TNode<Object> new_target = CAST(Parameter(Descriptor::kJSNewTarget));
-
- TVARIABLE(Object, var_result);
- Label if_subclass(this, Label::kDeferred), if_notsubclass(this),
- return_result(this);
- GotoIf(IsUndefined(new_target), &if_notsubclass);
- TNode<JSFunction> target = CAST(Parameter(Descriptor::kJSTarget));
- Branch(TaggedEqual(new_target, target), &if_notsubclass, &if_subclass);
-
- BIND(&if_subclass);
- {
- var_result =
- CallBuiltin(Builtins::kFastNewObject, context, target, new_target);
- Goto(&return_result);
- }
-
- BIND(&if_notsubclass);
- {
- Label if_newobject(this, Label::kDeferred), if_toobject(this);
-
- TNode<IntPtrT> value_index = IntPtrConstant(kValueArg);
- GotoIf(UintPtrGreaterThanOrEqual(value_index, argc), &if_newobject);
- TNode<Object> value = args.AtIndex(value_index);
- GotoIf(IsNull(value), &if_newobject);
- Branch(IsUndefined(value), &if_newobject, &if_toobject);
-
- BIND(&if_newobject);
- {
- var_result = EmitCreateEmptyObjectLiteral(context);
- Goto(&return_result);
- }
-
- BIND(&if_toobject);
- {
- var_result = CallBuiltin(Builtins::kToObject, context, value);
- Goto(&return_result);
- }
- }
-
- BIND(&return_result);
- args.PopAndReturn(var_result.value());
-}
-
-TF_BUILTIN(CreateEmptyLiteralObject, ConstructorBuiltinsAssembler) {
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- Return(EmitCreateEmptyObjectLiteral(context));
-}
-
-// ES #sec-number-constructor
-TF_BUILTIN(NumberConstructor, ConstructorBuiltinsAssembler) {
- TNode<Context> context = CAST(Parameter(Descriptor::kContext));
- TNode<IntPtrT> argc = ChangeInt32ToIntPtr(
- UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount)));
- CodeStubArguments args(this, argc);
-
- // 1. If no arguments were passed to this function invocation, let n be +0.
- TVARIABLE(Number, var_n, SmiConstant(0));
- Label if_nloaded(this, &var_n);
- GotoIf(IntPtrEqual(argc, IntPtrConstant(0)), &if_nloaded);
-
- // 2. Else,
- // a. Let prim be ? ToNumeric(value).
- // b. If Type(prim) is BigInt, let n be the Number value for prim.
- // c. Otherwise, let n be prim.
- TNode<Object> value = args.AtIndex(0);
- var_n = ToNumber(context, value, BigIntHandling::kConvertToNumber);
- Goto(&if_nloaded);
-
- BIND(&if_nloaded);
- {
- // 3. If NewTarget is undefined, return n.
- TNode<Number> n_value = var_n.value();
- TNode<Object> new_target = CAST(Parameter(Descriptor::kJSNewTarget));
- Label return_n(this), constructnumber(this, Label::kDeferred);
- Branch(IsUndefined(new_target), &return_n, &constructnumber);
-
- BIND(&return_n);
- { args.PopAndReturn(n_value); }
-
- BIND(&constructnumber);
- {
- // 4. Let O be ? OrdinaryCreateFromConstructor(NewTarget,
- // "%NumberPrototype%", « [[NumberData]] »).
- // 5. Set O.[[NumberData]] to n.
- // 6. Return O.
-
- // We are not using Parameter(Descriptor::kJSTarget) and loading the value
- // from the current frame here in order to reduce register pressure on the
- // fast path.
- TNode<JSFunction> target = LoadTargetFromFrame();
- TNode<HeapObject> result = CAST(
- CallBuiltin(Builtins::kFastNewObject, context, target, new_target));
- StoreObjectField(result, JSPrimitiveWrapper::kValueOffset, n_value);
- args.PopAndReturn(result);
- }
- }
-}
-
-TF_BUILTIN(GenericLazyDeoptContinuation, ConstructorBuiltinsAssembler) {
- TNode<Object> result = CAST(Parameter(Descriptor::kResult));
- Return(result);
-}
-
} // namespace internal
} // namespace v8
diff --git a/src/builtins/builtins-constructor-gen.h b/src/builtins/builtins-constructor-gen.h
index d6a698d..2ed8322 100644
--- a/src/builtins/builtins-constructor-gen.h
+++ b/src/builtins/builtins-constructor-gen.h
@@ -15,37 +15,38 @@
explicit ConstructorBuiltinsAssembler(compiler::CodeAssemblerState* state)
: CodeStubAssembler(state) {}
- TNode<Context> EmitFastNewFunctionContext(TNode<ScopeInfo> scope_info,
- TNode<Uint32T> slots,
- TNode<Context> context,
- ScopeType scope_type);
+ TNode<Context> FastNewFunctionContext(TNode<ScopeInfo> scope_info,
+ TNode<Uint32T> slots,
+ TNode<Context> context,
+ ScopeType scope_type);
- TNode<JSRegExp> EmitCreateRegExpLiteral(
- TNode<HeapObject> maybe_feedback_vector, TNode<TaggedIndex> slot,
- TNode<Object> pattern, TNode<Smi> flags, TNode<Context> context);
+ TNode<JSRegExp> CreateRegExpLiteral(TNode<HeapObject> maybe_feedback_vector,
+ TNode<TaggedIndex> slot,
+ TNode<Object> pattern, TNode<Smi> flags,
+ TNode<Context> context);
- TNode<JSArray> EmitCreateShallowArrayLiteral(
+ TNode<JSArray> CreateShallowArrayLiteral(
TNode<FeedbackVector> feedback_vector, TNode<TaggedIndex> slot,
- TNode<Context> context, Label* call_runtime,
- AllocationSiteMode allocation_site_mode);
+ TNode<Context> context, AllocationSiteMode allocation_site_mode,
+ Label* call_runtime);
- TNode<JSArray> EmitCreateEmptyArrayLiteral(
- TNode<FeedbackVector> feedback_vector, TNode<TaggedIndex> slot,
- TNode<Context> context);
+ TNode<JSArray> CreateEmptyArrayLiteral(TNode<FeedbackVector> feedback_vector,
+ TNode<TaggedIndex> slot,
+ TNode<Context> context);
- TNode<HeapObject> EmitCreateShallowObjectLiteral(
+ TNode<HeapObject> CreateShallowObjectLiteral(
TNode<FeedbackVector> feedback_vector, TNode<TaggedIndex> slot,
Label* call_runtime);
- TNode<JSObject> EmitCreateEmptyObjectLiteral(TNode<Context> context);
+ TNode<JSObject> CreateEmptyObjectLiteral(TNode<Context> context);
- TNode<JSObject> EmitFastNewObject(TNode<Context> context,
- TNode<JSFunction> target,
- TNode<JSReceiver> new_target);
+ TNode<JSObject> FastNewObject(TNode<Context> context,
+ TNode<JSFunction> target,
+ TNode<JSReceiver> new_target);
- TNode<JSObject> EmitFastNewObject(TNode<Context> context,
- TNode<JSFunction> target,
- TNode<JSReceiver> new_target,
- Label* call_runtime);
+ TNode<JSObject> FastNewObject(TNode<Context> context,
+ TNode<JSFunction> target,
+ TNode<JSReceiver> new_target,
+ Label* call_runtime);
};
} // namespace internal
diff --git a/src/builtins/builtins-definitions.h b/src/builtins/builtins-definitions.h
index e51f057..ac18dfc 100644
--- a/src/builtins/builtins-definitions.h
+++ b/src/builtins/builtins-definitions.h
@@ -94,14 +94,6 @@
ASM(JSBuiltinsConstructStub, Dummy) \
TFC(FastNewObject, FastNewObject) \
TFS(FastNewClosure, kSharedFunctionInfo, kFeedbackCell) \
- TFC(FastNewFunctionContextEval, FastNewFunctionContext) \
- TFC(FastNewFunctionContextFunction, FastNewFunctionContext) \
- TFS(CreateEmptyLiteralObject) \
- TFS(CreateRegExpLiteral, kFeedbackVector, kSlot, kPattern, kFlags) \
- TFS(CreateEmptyArrayLiteral, kFeedbackVector, kSlot) \
- TFS(CreateShallowArrayLiteral, kFeedbackVector, kSlot, kConstantElements) \
- TFS(CreateShallowObjectLiteral, kFeedbackVector, kSlot, \
- kObjectBoilerplateDescription, kFlags) \
/* ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget) */ \
TFC(ConstructProxy, JSTrampoline) \
\
@@ -599,7 +591,6 @@
TFS(MapIteratorToList, kSource) \
\
/* ES #sec-number-constructor */ \
- TFJ(NumberConstructor, kDontAdaptArgumentsSentinel) \
CPP(NumberPrototypeToExponential) \
CPP(NumberPrototypeToFixed) \
CPP(NumberPrototypeToLocaleString) \
@@ -637,7 +628,6 @@
\
/* Object */ \
/* ES #sec-object-constructor */ \
- TFJ(ObjectConstructor, kDontAdaptArgumentsSentinel) \
TFJ(ObjectAssign, kDontAdaptArgumentsSentinel) \
/* ES #sec-object.create */ \
TFJ(ObjectCreate, kDontAdaptArgumentsSentinel) \
@@ -788,7 +778,6 @@
/* TypedArray */ \
/* ES #sec-typedarray-constructors */ \
TFJ(TypedArrayBaseConstructor, 0, kReceiver) \
- TFJ(GenericLazyDeoptContinuation, 1, kReceiver, kResult) \
TFJ(TypedArrayConstructor, kDontAdaptArgumentsSentinel) \
CPP(TypedArrayPrototypeBuffer) \
/* ES6 #sec-get-%typedarray%.prototype.bytelength */ \
diff --git a/src/builtins/builtins-regexp-gen.cc b/src/builtins/builtins-regexp-gen.cc
index 584111c..58eaca4 100644
--- a/src/builtins/builtins-regexp-gen.cc
+++ b/src/builtins/builtins-regexp-gen.cc
@@ -1104,7 +1104,7 @@
BIND(&allocate_generic);
{
ConstructorBuiltinsAssembler constructor_assembler(this->state());
- var_regexp = CAST(constructor_assembler.EmitFastNewObject(
+ var_regexp = CAST(constructor_assembler.FastNewObject(
context, regexp_function, CAST(var_new_target.value())));
Goto(&next);
}
diff --git a/src/builtins/constructor.tq b/src/builtins/constructor.tq
new file mode 100644
index 0000000..ba68e19
--- /dev/null
+++ b/src/builtins/constructor.tq
@@ -0,0 +1,157 @@
+// Copyright 2020 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/ast/ast.h"
+
+namespace runtime {
+extern runtime CreateArrayLiteral(
+ Context, FeedbackVector, TaggedIndex, ArrayBoilerplateDescription,
+ Smi): HeapObject;
+extern runtime CreateObjectLiteral(
+ Context, FeedbackVector, TaggedIndex, ObjectBoilerplateDescription,
+ Smi): HeapObject;
+}
+
+namespace constructor {
+
+extern builtin FastNewObject(Context, JSFunction, JSReceiver): JSObject;
+
+extern enum AllocationSiteMode constexpr 'AllocationSiteMode' {
+ DONT_TRACK_ALLOCATION_SITE,
+ TRACK_ALLOCATION_SITE
+}
+
+const kIsShallowAndDisableMementos: constexpr int31
+ generates 'AggregateLiteral::Flags::kIsShallowAndDisableMementos';
+const kEvalScope: constexpr ScopeType generates 'ScopeType::EVAL_SCOPE';
+const kFunctionScope:
+ constexpr ScopeType generates 'ScopeType::FUNCTION_SCOPE';
+
+extern macro ConstructorBuiltinsAssembler::FastNewFunctionContext(
+ ScopeInfo, uint32, Context, constexpr ScopeType): Context;
+extern macro ConstructorBuiltinsAssembler::CreateRegExpLiteral(
+ HeapObject, TaggedIndex, Object, Smi, Context): JSRegExp;
+extern macro ConstructorBuiltinsAssembler::CreateShallowArrayLiteral(
+ FeedbackVector, TaggedIndex, Context,
+ constexpr AllocationSiteMode): HeapObject labels CallRuntime;
+extern macro ConstructorBuiltinsAssembler::CreateEmptyArrayLiteral(
+ FeedbackVector, TaggedIndex, Context): HeapObject;
+extern macro ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
+ FeedbackVector, TaggedIndex): HeapObject labels CallRuntime;
+extern macro ConstructorBuiltinsAssembler::CreateEmptyObjectLiteral(Context):
+ JSObject;
+
+builtin FastNewFunctionContextEval(implicit context: Context)(
+ scopeInfo: ScopeInfo, slots: uint32): Context {
+ return FastNewFunctionContext(scopeInfo, slots, context, kEvalScope);
+}
+
+builtin FastNewFunctionContextFunction(implicit context: Context)(
+ scopeInfo: ScopeInfo, slots: uint32): Context {
+ return FastNewFunctionContext(scopeInfo, slots, context, kFunctionScope);
+}
+
+builtin CreateRegExpLiteral(implicit context: Context)(
+ maybeFeedbackVector: HeapObject, slot: TaggedIndex, pattern: Object,
+ flags: Smi): JSRegExp {
+ return CreateRegExpLiteral(
+ maybeFeedbackVector, slot, pattern, flags, context);
+}
+
+builtin CreateShallowArrayLiteral(implicit context: Context)(
+ feedbackVector: FeedbackVector, slot: TaggedIndex,
+ constantElements: ArrayBoilerplateDescription): HeapObject {
+ try {
+ return CreateShallowArrayLiteral(
+ feedbackVector, slot, context,
+ AllocationSiteMode::DONT_TRACK_ALLOCATION_SITE)
+ otherwise CallRuntime;
+ } label CallRuntime deferred {
+ tail runtime::CreateArrayLiteral(
+ context, feedbackVector, slot, constantElements,
+ SmiConstant(kIsShallowAndDisableMementos));
+ }
+}
+
+builtin CreateEmptyArrayLiteral(implicit context: Context)(
+ feedbackVector: FeedbackVector, slot: TaggedIndex): HeapObject {
+ return CreateEmptyArrayLiteral(feedbackVector, slot, context);
+}
+
+builtin CreateShallowObjectLiteral(implicit context: Context)(
+ feedbackVector: FeedbackVector, slot: TaggedIndex,
+ desc: ObjectBoilerplateDescription, flags: Smi): HeapObject {
+ try {
+ return CreateShallowObjectLiteral(feedbackVector, slot)
+ otherwise CallRuntime;
+ } label CallRuntime deferred {
+ tail runtime::CreateObjectLiteral(
+ context, feedbackVector, slot, desc, flags);
+ }
+}
+
+// ES #sec-object-constructor
+transitioning javascript builtin
+ObjectConstructor(
+ js-implicit context: NativeContext, receiver: JSAny, newTarget: JSAny,
+ target: JSFunction)(...arguments): JSAny {
+ if (newTarget == Undefined || newTarget == target) {
+ // Not Subclass.
+ const value = arguments[0];
+ if (arguments.length <= 0 || value == Undefined || value == Null) {
+ // New object.
+ return CreateEmptyObjectLiteral(context);
+ } else {
+ return ToObject(context, value);
+ }
+ } else {
+ // Subclass.
+ return FastNewObject(context, target, UnsafeCast<JSReceiver>(newTarget));
+ }
+}
+
+builtin CreateEmptyLiteralObject(implicit context: Context)(): JSAny {
+ return CreateEmptyObjectLiteral(context);
+}
+
+// ES #sec-number-constructor
+transitioning javascript builtin
+NumberConstructor(
+ js-implicit context: NativeContext, receiver: JSAny, newTarget: JSAny,
+ target: JSFunction)(...arguments): JSAny {
+ // 1. If no arguments were passed to this function invocation, let n be +0.
+ let n: Number = 0;
+ if (arguments.length > 0) {
+ // 2. Else,
+ // a. Let prim be ? ToNumeric(value).
+ // b. If Type(prim) is BigInt, let n be the Number value for prim.
+ // c. Otherwise, let n be prim.
+ const value = arguments[0];
+ n = ToNumber(value, BigIntHandling::kConvertToNumber);
+ }
+
+ // 3. If NewTarget is undefined, return n.
+ if (newTarget == Undefined) return n;
+
+ // 4. Let O be ? OrdinaryCreateFromConstructor(NewTarget,
+ // "%NumberPrototype%", « [[NumberData]] »).
+ // 5. Set O.[[NumberData]] to n.
+ // 6. Return O.
+
+ // We ignore the normal target parameter and load the value from the
+ // current frame here in order to reduce register pressure on the fast path.
+ const target: JSFunction = LoadTargetFromFrame();
+ const result = UnsafeCast<JSPrimitiveWrapper>(
+ FastNewObject(context, target, UnsafeCast<JSReceiver>(newTarget)));
+ result.value = n;
+ return result;
+}
+
+javascript builtin
+GenericLazyDeoptContinuation(js-implicit context: NativeContext)(result: JSAny):
+ JSAny {
+ return result;
+}
+
+} // namespace constructor
diff --git a/src/builtins/promise-constructor.tq b/src/builtins/promise-constructor.tq
index d0ae852..32de19f 100644
--- a/src/builtins/promise-constructor.tq
+++ b/src/builtins/promise-constructor.tq
@@ -36,7 +36,7 @@
return false;
}
-extern macro ConstructorBuiltinsAssembler::EmitFastNewObject(
+extern macro ConstructorBuiltinsAssembler::FastNewObject(
Context, JSFunction, JSReceiver): JSObject;
extern macro
@@ -70,8 +70,8 @@
if (promiseFun == newTarget) {
result = NewJSPromise();
} else {
- result = UnsafeCast<JSPromise>(EmitFastNewObject(
- context, promiseFun, UnsafeCast<JSReceiver>(newTarget)));
+ result = UnsafeCast<JSPromise>(
+ FastNewObject(context, promiseFun, UnsafeCast<JSReceiver>(newTarget)));
PromiseInit(result);
if (IsPromiseHookEnabledOrHasAsyncEventDelegate()) {
runtime::PromiseHookInit(result, Undefined);
diff --git a/src/codegen/arm/interface-descriptors-arm.cc b/src/codegen/arm/interface-descriptors-arm.cc
index 09b80af..b457376 100644
--- a/src/codegen/arm/interface-descriptors-arm.cc
+++ b/src/codegen/arm/interface-descriptors-arm.cc
@@ -46,11 +46,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return r1;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return r0; }
-
const Register LoadDescriptor::ReceiverRegister() { return r1; }
const Register LoadDescriptor::NameRegister() { return r2; }
const Register LoadDescriptor::SlotRegister() { return r0; }
diff --git a/src/codegen/arm64/interface-descriptors-arm64.cc b/src/codegen/arm64/interface-descriptors-arm64.cc
index 2c60ea2..61c8947 100644
--- a/src/codegen/arm64/interface-descriptors-arm64.cc
+++ b/src/codegen/arm64/interface-descriptors-arm64.cc
@@ -46,11 +46,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return x1;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return x0; }
-
const Register LoadDescriptor::ReceiverRegister() { return x1; }
const Register LoadDescriptor::NameRegister() { return x2; }
const Register LoadDescriptor::SlotRegister() { return x0; }
diff --git a/src/codegen/ia32/interface-descriptors-ia32.cc b/src/codegen/ia32/interface-descriptors-ia32.cc
index ee9c391..9b96dc1 100644
--- a/src/codegen/ia32/interface-descriptors-ia32.cc
+++ b/src/codegen/ia32/interface-descriptors-ia32.cc
@@ -49,11 +49,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return edi;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return eax; }
-
const Register LoadDescriptor::ReceiverRegister() { return edx; }
const Register LoadDescriptor::NameRegister() { return ecx; }
const Register LoadDescriptor::SlotRegister() { return eax; }
diff --git a/src/codegen/interface-descriptors.cc b/src/codegen/interface-descriptors.cc
index 269ef72..00f774f 100644
--- a/src/codegen/interface-descriptors.cc
+++ b/src/codegen/interface-descriptors.cc
@@ -177,12 +177,6 @@
InterpreterCEntryDescriptor_InitializePlatformSpecific(data);
}
-void FastNewFunctionContextDescriptor::InitializePlatformSpecific(
- CallInterfaceDescriptorData* data) {
- Register registers[] = {ScopeInfoRegister(), SlotsRegister()};
- data->InitializePlatformSpecific(arraysize(registers), registers);
-}
-
void FastNewObjectDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {TargetRegister(), NewTargetRegister()};
diff --git a/src/codegen/interface-descriptors.h b/src/codegen/interface-descriptors.h
index 231fe04..1f025d3 100644
--- a/src/codegen/interface-descriptors.h
+++ b/src/codegen/interface-descriptors.h
@@ -59,7 +59,6 @@
V(ContextOnly) \
V(CppBuiltinAdaptor) \
V(EphemeronKeyBarrier) \
- V(FastNewFunctionContext) \
V(FastNewObject) \
V(FrameDropperTrampoline) \
V(GetIteratorStackParameter) \
@@ -837,17 +836,6 @@
#endif
};
-class FastNewFunctionContextDescriptor : public CallInterfaceDescriptor {
- public:
- DEFINE_PARAMETERS(kScopeInfo, kSlots)
- DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kScopeInfo
- MachineType::Uint32()) // kSlots
- DECLARE_DESCRIPTOR(FastNewFunctionContextDescriptor, CallInterfaceDescriptor)
-
- static const Register ScopeInfoRegister();
- static const Register SlotsRegister();
-};
-
class FastNewObjectDescriptor : public CallInterfaceDescriptor {
public:
DEFINE_PARAMETERS(kTarget, kNewTarget)
diff --git a/src/codegen/mips/interface-descriptors-mips.cc b/src/codegen/mips/interface-descriptors-mips.cc
index c092ebc..4945ce4 100644
--- a/src/codegen/mips/interface-descriptors-mips.cc
+++ b/src/codegen/mips/interface-descriptors-mips.cc
@@ -72,11 +72,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return a1;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return a0; }
-
const Register LoadDescriptor::ReceiverRegister() { return a1; }
const Register LoadDescriptor::NameRegister() { return a2; }
const Register LoadDescriptor::SlotRegister() { return a0; }
diff --git a/src/codegen/mips64/interface-descriptors-mips64.cc b/src/codegen/mips64/interface-descriptors-mips64.cc
index 0006745..9e33d39 100644
--- a/src/codegen/mips64/interface-descriptors-mips64.cc
+++ b/src/codegen/mips64/interface-descriptors-mips64.cc
@@ -72,11 +72,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return a1;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return a0; }
-
const Register LoadDescriptor::ReceiverRegister() { return a1; }
const Register LoadDescriptor::NameRegister() { return a2; }
const Register LoadDescriptor::SlotRegister() { return a0; }
diff --git a/src/codegen/ppc/interface-descriptors-ppc.cc b/src/codegen/ppc/interface-descriptors-ppc.cc
index 65f574d..cab95e2 100644
--- a/src/codegen/ppc/interface-descriptors-ppc.cc
+++ b/src/codegen/ppc/interface-descriptors-ppc.cc
@@ -46,11 +46,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return r4;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return r3; }
-
const Register LoadDescriptor::ReceiverRegister() { return r4; }
const Register LoadDescriptor::NameRegister() { return r5; }
const Register LoadDescriptor::SlotRegister() { return r3; }
diff --git a/src/codegen/s390/interface-descriptors-s390.cc b/src/codegen/s390/interface-descriptors-s390.cc
index b23ecb7..9e341c3 100644
--- a/src/codegen/s390/interface-descriptors-s390.cc
+++ b/src/codegen/s390/interface-descriptors-s390.cc
@@ -46,11 +46,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return r3;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return r2; }
-
const Register LoadDescriptor::ReceiverRegister() { return r3; }
const Register LoadDescriptor::NameRegister() { return r4; }
const Register LoadDescriptor::SlotRegister() { return r2; }
diff --git a/src/codegen/x64/interface-descriptors-x64.cc b/src/codegen/x64/interface-descriptors-x64.cc
index 31b2b67..d86089c 100644
--- a/src/codegen/x64/interface-descriptors-x64.cc
+++ b/src/codegen/x64/interface-descriptors-x64.cc
@@ -48,11 +48,6 @@
data->InitializePlatformSpecific(kParameterCount, default_stub_registers);
}
-const Register FastNewFunctionContextDescriptor::ScopeInfoRegister() {
- return rdi;
-}
-const Register FastNewFunctionContextDescriptor::SlotsRegister() { return rax; }
-
const Register LoadDescriptor::ReceiverRegister() { return rdx; }
const Register LoadDescriptor::NameRegister() { return rcx; }
const Register LoadDescriptor::SlotRegister() { return rax; }
diff --git a/src/interpreter/interpreter-generator.cc b/src/interpreter/interpreter-generator.cc
index 42e4587..c4ca458 100644
--- a/src/interpreter/interpreter-generator.cc
+++ b/src/interpreter/interpreter-generator.cc
@@ -2239,8 +2239,8 @@
TVARIABLE(JSRegExp, result);
ConstructorBuiltinsAssembler constructor_assembler(state());
- result = constructor_assembler.EmitCreateRegExpLiteral(
- feedback_vector, slot, pattern, flags, context);
+ result = constructor_assembler.CreateRegExpLiteral(feedback_vector, slot,
+ pattern, flags, context);
SetAccumulator(result.value());
Dispatch();
}
@@ -2266,9 +2266,9 @@
BIND(&fast_shallow_clone);
{
ConstructorBuiltinsAssembler constructor_assembler(state());
- TNode<JSArray> result = constructor_assembler.EmitCreateShallowArrayLiteral(
- CAST(feedback_vector), slot, context, &call_runtime,
- TRACK_ALLOCATION_SITE);
+ TNode<JSArray> result = constructor_assembler.CreateShallowArrayLiteral(
+ CAST(feedback_vector), slot, context, TRACK_ALLOCATION_SITE,
+ &call_runtime);
SetAccumulator(result);
Dispatch();
}
@@ -2301,7 +2301,7 @@
GotoIf(IsUndefined(maybe_feedback_vector), &no_feedback);
ConstructorBuiltinsAssembler constructor_assembler(state());
- result = constructor_assembler.EmitCreateEmptyArrayLiteral(
+ result = constructor_assembler.CreateEmptyArrayLiteral(
CAST(maybe_feedback_vector), slot, context);
Goto(&end);
@@ -2356,9 +2356,8 @@
{
// If we can do a fast clone do the fast-path in CreateShallowObjectLiteral.
ConstructorBuiltinsAssembler constructor_assembler(state());
- TNode<HeapObject> result =
- constructor_assembler.EmitCreateShallowObjectLiteral(
- CAST(feedback_vector), slot, &if_not_fast_clone);
+ TNode<HeapObject> result = constructor_assembler.CreateShallowObjectLiteral(
+ CAST(feedback_vector), slot, &if_not_fast_clone);
SetAccumulator(result);
Dispatch();
}
@@ -2391,7 +2390,7 @@
TNode<Context> context = GetContext();
ConstructorBuiltinsAssembler constructor_assembler(state());
TNode<JSObject> result =
- constructor_assembler.EmitCreateEmptyObjectLiteral(context);
+ constructor_assembler.CreateEmptyObjectLiteral(context);
SetAccumulator(result);
Dispatch();
}
@@ -2521,7 +2520,7 @@
TNode<Uint32T> slots = BytecodeOperandUImm(1);
TNode<Context> context = GetContext();
ConstructorBuiltinsAssembler constructor_assembler(state());
- SetAccumulator(constructor_assembler.EmitFastNewFunctionContext(
+ SetAccumulator(constructor_assembler.FastNewFunctionContext(
scope_info, slots, context, FUNCTION_SCOPE));
Dispatch();
}
@@ -2535,7 +2534,7 @@
TNode<Uint32T> slots = BytecodeOperandUImm(1);
TNode<Context> context = GetContext();
ConstructorBuiltinsAssembler constructor_assembler(state());
- SetAccumulator(constructor_assembler.EmitFastNewFunctionContext(
+ SetAccumulator(constructor_assembler.FastNewFunctionContext(
scope_info, slots, context, EVAL_SCOPE));
Dispatch();
}