Commit 2625037d authored by Camillo Bruni's avatar Camillo Bruni Committed by Commit Bot

[cleanup] CSA: Add ThrowTypeError helper

Change-Id: I916696c1a15f1eaea1128b1d147bb3e5f50bca9a
Reviewed-on: https://chromium-review.googlesource.com/567000
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#46557}
parent 933a874e
......@@ -84,9 +84,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
void ReducePostLoopAction() {
Label ok(this);
GotoIf(WordNotEqual(a(), TheHoleConstant()), &ok);
CallRuntime(Runtime::kThrowTypeError, context(),
SmiConstant(MessageTemplate::kReduceNoInitial));
Unreachable();
ThrowTypeError(context(), MessageTemplate::kReduceNoInitial);
BIND(&ok);
}
......@@ -309,14 +307,9 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
Goto(&done);
BIND(&detached);
{
// tc39.github.io/ecma262/#sec-integerindexedelementset
// 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
CallRuntime(Runtime::kThrowTypeError, context_,
SmiConstant(MessageTemplate::kDetachedOperation),
name_string_);
Unreachable();
}
// tc39.github.io/ecma262/#sec-integerindexedelementset
// 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
ThrowTypeError(context_, MessageTemplate::kDetachedOperation, name_);
BIND(&done);
return a();
......@@ -400,21 +393,11 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
Branch(IsCallableMap(LoadMap(callbackfn())), &done, &type_exception);
BIND(&throw_null_undefined_exception);
{
CallRuntime(
Runtime::kThrowTypeError, context(),
SmiConstant(MessageTemplate::kCalledOnNullOrUndefined),
HeapConstant(isolate()->factory()->NewStringFromAsciiChecked(name)));
Unreachable();
}
ThrowTypeError(context(), MessageTemplate::kCalledOnNullOrUndefined, name);
BIND(&type_exception);
{
CallRuntime(Runtime::kThrowTypeError, context(),
SmiConstant(MessageTemplate::kCalledNonCallable),
callbackfn());
Unreachable();
}
ThrowTypeError(context(), MessageTemplate::kCalledNonCallable,
callbackfn());
BIND(&done);
......@@ -460,8 +443,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
const char* name, const BuiltinResultGenerator& generator,
const CallResultProcessor& processor, const PostLoopAction& action,
ForEachDirection direction = ForEachDirection::kForward) {
name_string_ =
HeapConstant(isolate()->factory()->NewStringFromAsciiChecked(name));
name_ = name;
// ValidateTypedArray: tc39.github.io/ecma262/#sec-validatetypedarray
......@@ -485,27 +467,13 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
&throw_not_callable);
BIND(&throw_not_typed_array);
{
CallRuntime(Runtime::kThrowTypeError, context_,
SmiConstant(MessageTemplate::kNotTypedArray));
Unreachable();
}
ThrowTypeError(context_, MessageTemplate::kNotTypedArray);
BIND(&throw_detached);
{
CallRuntime(Runtime::kThrowTypeError, context_,
SmiConstant(MessageTemplate::kDetachedOperation),
name_string_);
Unreachable();
}
ThrowTypeError(context_, MessageTemplate::kDetachedOperation, name_);
BIND(&throw_not_callable);
{
CallRuntime(Runtime::kThrowTypeError, context_,
SmiConstant(MessageTemplate::kCalledNonCallable),
callbackfn_);
Unreachable();
}
ThrowTypeError(context_, MessageTemplate::kCalledNonCallable, callbackfn_);
Label unexpected_instance_type(this);
BIND(&unexpected_instance_type);
......@@ -828,7 +796,7 @@ class ArrayBuiltinCodeStubAssembler : public CodeStubAssembler {
Node* new_target_ = nullptr;
Node* argc_ = nullptr;
Node* fast_typed_array_target_ = nullptr;
Node* name_string_ = nullptr;
const char* name_ = nullptr;
Variable k_;
Variable a_;
Variable to_;
......@@ -2520,12 +2488,8 @@ TF_BUILTIN(ArrayIteratorPrototypeNext, CodeStubAssembler) {
}
BIND(&if_isdetached);
{
Node* message = SmiConstant(MessageTemplate::kDetachedOperation);
CallRuntime(Runtime::kThrowTypeError, context, message,
HeapConstant(operation));
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kDetachedOperation,
HeapConstant(operation));
}
} // namespace internal
......
......@@ -284,21 +284,14 @@ TF_BUILTIN(MapConstructor, CollectionsBuiltinsAssembler) {
BIND(&if_notcallable);
{
Node* const message_id = SmiConstant(MessageTemplate::kPropertyNotFunction);
Node* const receiver_str = HeapConstant(isolate()->factory()->add_string());
CallRuntime(Runtime::kThrowTypeError, context, message_id, adder,
receiver_str, var_result.value());
Unreachable();
ThrowTypeError(context, MessageTemplate::kPropertyNotFunction, adder,
receiver_str, var_result.value());
}
BIND(&if_target_is_undefined);
{
Node* const message_id =
SmiConstant(MessageTemplate::kConstructorNotFunction);
CallRuntime(Runtime::kThrowTypeError, context, message_id,
HeapConstant(isolate()->factory()->Map_string()));
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kConstructorNotFunction,
HeapConstant(isolate()->factory()->Map_string()));
BIND(&exit);
args.PopAndReturn(var_result.value());
......@@ -392,22 +385,13 @@ TF_BUILTIN(SetConstructor, CollectionsBuiltinsAssembler) {
}
BIND(&if_notcallable);
{
Node* const message_id = SmiConstant(MessageTemplate::kPropertyNotFunction);
Node* const receiver_str = HeapConstant(isolate()->factory()->add_string());
CallRuntime(Runtime::kThrowTypeError, context, message_id, adder,
receiver_str, var_result.value());
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kPropertyNotFunction, adder,
HeapConstant(isolate()->factory()->add_string()),
var_result.value());
BIND(&if_target_is_undefined);
{
Node* const message_id =
SmiConstant(MessageTemplate::kConstructorNotFunction);
CallRuntime(Runtime::kThrowTypeError, context, message_id,
HeapConstant(isolate()->factory()->Set_string()));
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kConstructorNotFunction,
HeapConstant(isolate()->factory()->Set_string()));
BIND(&exit);
args.PopAndReturn(var_result.value());
......
......@@ -183,23 +183,17 @@ Node* PromiseBuiltinsAssembler::NewPromiseCapability(Node* context,
Goto(&out);
BIND(&if_notcallable);
Node* message = SmiConstant(MessageTemplate::kPromiseNonCallable);
StoreObjectField(capability, JSPromiseCapability::kPromiseOffset,
UndefinedConstant());
StoreObjectField(capability, JSPromiseCapability::kResolveOffset,
UndefinedConstant());
StoreObjectField(capability, JSPromiseCapability::kRejectOffset,
UndefinedConstant());
CallRuntime(Runtime::kThrowTypeError, context, message);
Unreachable();
ThrowTypeError(context, MessageTemplate::kPromiseNonCallable);
}
BIND(&if_not_constructor);
{
Node* const message_id = SmiConstant(MessageTemplate::kNotConstructor);
CallRuntime(Runtime::kThrowTypeError, context, message_id, constructor);
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kNotConstructor, constructor);
BIND(&out);
return var_result.value();
......@@ -269,16 +263,7 @@ Node* PromiseBuiltinsAssembler::ThrowIfNotJSReceiver(
// The {value} is not a compatible receiver for this method.
BIND(&throw_exception);
{
Node* const method =
method_name == nullptr
? UndefinedConstant()
: HeapConstant(
isolate()->factory()->NewStringFromAsciiChecked(method_name));
Node* const message_id = SmiConstant(msg_template);
CallRuntime(Runtime::kThrowTypeError, context, message_id, method);
Unreachable();
}
ThrowTypeError(context, msg_template, method_name);
BIND(&out);
return var_value_map.value();
......@@ -338,12 +323,7 @@ Node* PromiseBuiltinsAssembler::SpeciesConstructor(Node* context, Node* object,
// 8. Throw a TypeError exception.
BIND(&throw_error);
{
Node* const message_id =
SmiConstant(MessageTemplate::kSpeciesNotConstructor);
CallRuntime(Runtime::kThrowTypeError, context, message_id);
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kSpeciesNotConstructor);
BIND(&out);
return var_result.value();
......@@ -1153,20 +1133,11 @@ TF_BUILTIN(PromiseConstructor, PromiseBuiltinsAssembler) {
// 1. If NewTarget is undefined, throw a TypeError exception.
BIND(&if_targetisundefined);
{
Node* const message_id = SmiConstant(MessageTemplate::kNotAPromise);
CallRuntime(Runtime::kThrowTypeError, context, message_id, new_target);
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kNotAPromise, new_target);
// 2. If IsCallable(executor) is false, throw a TypeError exception.
BIND(&if_notcallable);
{
Node* const message_id =
SmiConstant(MessageTemplate::kResolverNotAFunction);
CallRuntime(Runtime::kThrowTypeError, context, message_id, executor);
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kResolverNotAFunction, executor);
// Silently fail if the stack looks fishy.
BIND(&if_noaccess);
......@@ -1527,9 +1498,7 @@ TF_BUILTIN(PromiseGetCapabilitiesExecutor, PromiseBuiltinsAssembler) {
Return(UndefinedConstant());
BIND(&if_alreadyinvoked);
Node* message = SmiConstant(MessageTemplate::kPromiseExecutorAlreadyInvoked);
CallRuntime(Runtime::kThrowTypeError, context, message);
Unreachable();
ThrowTypeError(context, MessageTemplate::kPromiseExecutorAlreadyInvoked);
}
// ES6 #sec-newpromisecapability
......
......@@ -18,11 +18,7 @@ using compiler::CodeAssembler;
// ES6 section 26.2.1.1 Proxy ( target, handler ) for the [[Call]] case.
TF_BUILTIN(ProxyConstructor, CodeStubAssembler) {
Node* context = Parameter(Descriptor::kContext);
CallRuntime(Runtime::kThrowTypeError, context,
SmiConstant(MessageTemplate::kConstructorNotFunction),
CStringConstant("Proxy"));
Unreachable();
ThrowTypeError(context, MessageTemplate::kConstructorNotFunction, "Proxy");
}
class ProxiesCodeStubAssembler : public CodeStubAssembler {
......@@ -121,18 +117,10 @@ TF_BUILTIN(ProxyConstructor_ConstructStub, ProxiesCodeStubAssembler) {
args.PopAndReturn(AllocateProxy(target, handler, context));
BIND(&throw_proxy_non_object);
{
CallRuntime(Runtime::kThrowTypeError, context,
SmiConstant(MessageTemplate::kProxyNonObject));
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kProxyNonObject);
BIND(&throw_proxy_handler_or_target_revoked);
{
CallRuntime(Runtime::kThrowTypeError, context,
SmiConstant(MessageTemplate::kProxyHandlerOrTargetRevoked));
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kProxyHandlerOrTargetRevoked);
}
} // namespace internal
......
......@@ -755,16 +755,10 @@ Node* RegExpBuiltinsAssembler::ThrowIfNotJSReceiver(
// The {value} is not a compatible receiver for this method.
BIND(&throw_exception);
{
Node* const message_id = SmiConstant(msg_template);
Node* const method_name_str = HeapConstant(
isolate()->factory()->NewStringFromAsciiChecked(method_name, TENURED));
Node* const value_str =
CallBuiltin(Builtins::kToString, context, maybe_receiver);
CallRuntime(Runtime::kThrowTypeError, context, message_id, method_name_str,
value_str);
Unreachable();
ThrowTypeError(context, msg_template, CStringConstant(method_name),
value_str);
}
BIND(&out);
......@@ -1499,8 +1493,6 @@ Node* RegExpBuiltinsAssembler::FlagGetter(Node* const context,
void RegExpBuiltinsAssembler::FlagGetter(Node* context, Node* receiver,
JSRegExp::Flag flag, int counter,
const char* method_name) {
Isolate* isolate = this->isolate();
// Check whether we have an unmodified regexp instance.
Label if_isunmodifiedjsregexp(this),
if_isnotunmodifiedjsregexp(this, Label::kDeferred);
......@@ -1539,14 +1531,7 @@ void RegExpBuiltinsAssembler::FlagGetter(Node* context, Node* receiver,
}
BIND(&if_isnotprototype);
{
Node* const message_id = SmiConstant(MessageTemplate::kRegExpNonRegExp);
Node* const method_name_str = HeapConstant(
isolate->factory()->NewStringFromAsciiChecked(method_name));
CallRuntime(Runtime::kThrowTypeError, context, message_id,
method_name_str);
Unreachable();
}
ThrowTypeError(context, MessageTemplate::kRegExpNonRegExp, method_name);
}
}
......
......@@ -3127,10 +3127,8 @@ Node* CodeStubAssembler::ToThisValue(Node* context, Node* value,
CHECK_NOT_NULL(primitive_name);
// The {value} is not a compatible receiver for this method.
CallRuntime(Runtime::kThrowTypeError, context,
SmiConstant(MessageTemplate::kNotGeneric),
CStringConstant(method_name), CStringConstant(primitive_name));
Unreachable();
ThrowTypeError(context, MessageTemplate::kNotGeneric, method_name,
primitive_name);
}
BIND(&done_loop);
......@@ -3168,6 +3166,33 @@ Node* CodeStubAssembler::ThrowIfNotInstanceType(Node* context, Node* value,
return var_value_map.value();
}
void CodeStubAssembler::ThrowTypeError(Node* context,
MessageTemplate::Template message,
char const* arg0, char const* arg1) {
Node* arg0_node = nullptr;
if (arg0) arg0_node = CStringConstant(arg0);
Node* arg1_node = nullptr;
if (arg1) arg1_node = CStringConstant(arg1);
ThrowTypeError(context, message, arg0_node, arg1_node);
}
void CodeStubAssembler::ThrowTypeError(Node* context,
MessageTemplate::Template message,
Node* arg0, Node* arg1, Node* arg2) {
Node* template_index = SmiConstant(message);
if (arg0 == nullptr) {
CallRuntime(Runtime::kThrowTypeError, context, template_index);
} else if (arg1 == nullptr) {
CallRuntime(Runtime::kThrowTypeError, context, template_index, arg0);
} else if (arg2 == nullptr) {
CallRuntime(Runtime::kThrowTypeError, context, template_index, arg0, arg1);
} else {
CallRuntime(Runtime::kThrowTypeError, context, template_index, arg0, arg1,
arg2);
}
Unreachable();
}
Node* CodeStubAssembler::InstanceTypeEqual(Node* instance_type, int type) {
return Word32Equal(instance_type, Int32Constant(type));
}
......
......@@ -767,6 +767,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* ThrowIfNotInstanceType(Node* context, Node* value,
InstanceType instance_type,
char const* method_name);
void ThrowTypeError(Node* context, MessageTemplate::Template message,
char const* arg0 = nullptr, char const* arg1 = nullptr);
void ThrowTypeError(Node* context, MessageTemplate::Template message,
Node* arg0, Node* arg1 = nullptr, Node* arg2 = nullptr);
// Type checks.
// Check whether the map is for an object with special properties, such as a
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment