blob: e27685dd3f7a5cc79c571795b30f5acdb0c59ad4 [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005#include "src/runtime/runtime-utils.h"
6
Emily Bernierd0a1eb72015-03-24 16:35:39 -04007#include <stdlib.h>
8#include <limits>
9
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010#include "src/arguments.h"
11#include "src/debug/debug.h"
12#include "src/frames-inl.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040013#include "src/isolate-inl.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014#include "src/messages.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040015#include "src/runtime/runtime.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040016
17namespace v8 {
18namespace internal {
19
20
21RUNTIME_FUNCTION(Runtime_ThrowNonMethodError) {
22 HandleScope scope(isolate);
23 DCHECK(args.length() == 0);
24 THROW_NEW_ERROR_RETURN_FAILURE(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025 isolate, NewReferenceError(MessageTemplate::kNonMethod));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040026}
27
28
29RUNTIME_FUNCTION(Runtime_ThrowUnsupportedSuperError) {
30 HandleScope scope(isolate);
31 DCHECK(args.length() == 0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000032 THROW_NEW_ERROR_RETURN_FAILURE(
33 isolate, NewReferenceError(MessageTemplate::kUnsupportedSuper));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040034}
35
36
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037RUNTIME_FUNCTION(Runtime_ThrowConstructorNonCallableError) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040038 HandleScope scope(isolate);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039 DCHECK(args.length() == 1);
40 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 0);
41 Handle<Object> name(constructor->shared()->name(), isolate);
42 THROW_NEW_ERROR_RETURN_FAILURE(
43 isolate, NewTypeError(MessageTemplate::kConstructorNonCallable, name));
44}
45
46
47RUNTIME_FUNCTION(Runtime_ThrowArrayNotSubclassableError) {
48 HandleScope scope(isolate);
49 DCHECK(args.length() == 0);
50 THROW_NEW_ERROR_RETURN_FAILURE(
51 isolate, NewTypeError(MessageTemplate::kArrayNotSubclassable));
52}
53
54
55static Object* ThrowStaticPrototypeError(Isolate* isolate) {
56 THROW_NEW_ERROR_RETURN_FAILURE(
57 isolate, NewTypeError(MessageTemplate::kStaticPrototype));
58}
59
60
61RUNTIME_FUNCTION(Runtime_ThrowStaticPrototypeError) {
62 HandleScope scope(isolate);
63 DCHECK(args.length() == 0);
64 return ThrowStaticPrototypeError(isolate);
65}
66
67
68RUNTIME_FUNCTION(Runtime_ThrowIfStaticPrototype) {
69 HandleScope scope(isolate);
70 DCHECK(args.length() == 1);
71 CONVERT_ARG_HANDLE_CHECKED(Name, name, 0);
72 if (Name::Equals(name, isolate->factory()->prototype_string())) {
73 return ThrowStaticPrototypeError(isolate);
74 }
75 return *name;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040076}
77
78
79RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) {
80 DCHECK(args.length() == 0);
81 return isolate->heap()->home_object_symbol();
82}
83
Ben Murdoch097c5b22016-05-18 11:27:45 +010084static MaybeHandle<Object> DefineClass(Isolate* isolate,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000085 Handle<Object> super_class,
86 Handle<JSFunction> constructor,
87 int start_position, int end_position) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040088 Handle<Object> prototype_parent;
89 Handle<Object> constructor_parent;
90
91 if (super_class->IsTheHole()) {
92 prototype_parent = isolate->initial_object_prototype();
93 } else {
94 if (super_class->IsNull()) {
95 prototype_parent = isolate->factory()->null_value();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000096 } else if (super_class->IsConstructor()) {
97 if (super_class->IsJSFunction() &&
98 Handle<JSFunction>::cast(super_class)->shared()->is_generator()) {
99 THROW_NEW_ERROR(
100 isolate,
101 NewTypeError(MessageTemplate::kExtendsValueGenerator, super_class),
102 Object);
103 }
104 ASSIGN_RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400105 isolate, prototype_parent,
106 Runtime::GetObjectProperty(isolate, super_class,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100107 isolate->factory()->prototype_string()),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108 Object);
109 if (!prototype_parent->IsNull() && !prototype_parent->IsJSReceiver()) {
110 THROW_NEW_ERROR(
111 isolate, NewTypeError(MessageTemplate::kPrototypeParentNotAnObject,
112 prototype_parent),
113 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400114 }
115 constructor_parent = super_class;
116 } else {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117 THROW_NEW_ERROR(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400118 isolate,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119 NewTypeError(MessageTemplate::kExtendsValueNotFunction, super_class),
120 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400121 }
122 }
123
124 Handle<Map> map =
125 isolate->factory()->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000126 map->set_is_prototype_map(true);
127 if (constructor->map()->is_strong()) {
128 map->set_is_strong();
129 if (super_class->IsNull()) {
130 // Strong class is not permitted to extend null.
131 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kStrongExtendNull),
132 Object);
133 }
134 }
135 Map::SetPrototype(map, prototype_parent);
136 map->SetConstructor(*constructor);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400137 Handle<JSObject> prototype = isolate->factory()->NewJSObjectFromMap(map);
138
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000139 if (!super_class->IsTheHole()) {
140 // Derived classes, just like builtins, don't create implicit receivers in
141 // [[construct]]. Instead they just set up new.target and call into the
142 // constructor. Hence we can reuse the builtins construct stub for derived
143 // classes.
Ben Murdoch097c5b22016-05-18 11:27:45 +0100144 Handle<Code> stub(isolate->builtins()->JSBuiltinsConstructStubForDerived());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000145 constructor->shared()->set_construct_stub(*stub);
146 }
147
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400148 JSFunction::SetPrototype(constructor, prototype);
149 PropertyAttributes attribs =
150 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000151 RETURN_ON_EXCEPTION(isolate,
152 JSObject::SetOwnPropertyIgnoreAttributes(
153 constructor, isolate->factory()->prototype_string(),
154 prototype, attribs),
155 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400156
157 // TODO(arv): Only do this conditionally.
158 Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000159 RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400160 isolate, JSObject::SetOwnPropertyIgnoreAttributes(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000161 constructor, home_object_symbol, prototype, DONT_ENUM),
162 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400163
164 if (!constructor_parent.is_null()) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000165 MAYBE_RETURN_NULL(JSObject::SetPrototype(constructor, constructor_parent,
166 false, Object::THROW_ON_ERROR));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400167 }
168
169 JSObject::AddProperty(prototype, isolate->factory()->constructor_string(),
170 constructor, DONT_ENUM);
171
172 // Install private properties that are used to construct the FunctionToString.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173 RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400174 isolate,
175 Object::SetProperty(
176 constructor, isolate->factory()->class_start_position_symbol(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000177 handle(Smi::FromInt(start_position), isolate), STRICT),
178 Object);
179 RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400180 isolate, Object::SetProperty(
181 constructor, isolate->factory()->class_end_position_symbol(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 handle(Smi::FromInt(end_position), isolate), STRICT),
183 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400184
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000185 return constructor;
186}
187
188
189RUNTIME_FUNCTION(Runtime_DefineClass) {
190 HandleScope scope(isolate);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100191 DCHECK(args.length() == 4);
192 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 0);
193 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 1);
194 CONVERT_SMI_ARG_CHECKED(start_position, 2);
195 CONVERT_SMI_ARG_CHECKED(end_position, 3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000196
197 Handle<Object> result;
198 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100199 isolate, result, DefineClass(isolate, super_class, constructor,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000200 start_position, end_position));
201 return *result;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400202}
203
204
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205RUNTIME_FUNCTION(Runtime_FinalizeClassDefinition) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400206 HandleScope scope(isolate);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207 DCHECK(args.length() == 2);
208 CONVERT_ARG_HANDLE_CHECKED(JSObject, constructor, 0);
209 CONVERT_ARG_HANDLE_CHECKED(JSObject, prototype, 1);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400210
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 JSObject::MigrateSlowToFast(constructor, 0, "RuntimeToFastProperties");
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400212
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213 if (constructor->map()->is_strong()) {
214 DCHECK(prototype->map()->is_strong());
215 MAYBE_RETURN(JSReceiver::SetIntegrityLevel(prototype, FROZEN,
216 Object::THROW_ON_ERROR),
217 isolate->heap()->exception());
218 MAYBE_RETURN(JSReceiver::SetIntegrityLevel(constructor, FROZEN,
219 Object::THROW_ON_ERROR),
220 isolate->heap()->exception());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400221 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000222 return *constructor;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400223}
224
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225static MaybeHandle<Object> LoadFromSuper(Isolate* isolate,
226 Handle<Object> receiver,
227 Handle<JSObject> home_object,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100228 Handle<Name> name) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400229 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000230 !isolate->MayAccess(handle(isolate->context()), home_object)) {
231 isolate->ReportFailedAccessCheck(home_object);
232 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400233 }
234
235 PrototypeIterator iter(isolate, home_object);
236 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000237 if (!proto->IsJSReceiver()) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100238 return Object::ReadAbsentProperty(isolate, proto, name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000239 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400240
241 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
242 Handle<Object> result;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100243 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, Object::GetProperty(&it), Object);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000244 return result;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400245}
246
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000247static MaybeHandle<Object> LoadElementFromSuper(Isolate* isolate,
248 Handle<Object> receiver,
249 Handle<JSObject> home_object,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100250 uint32_t index) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400251 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000252 !isolate->MayAccess(handle(isolate->context()), home_object)) {
253 isolate->ReportFailedAccessCheck(home_object);
254 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400255 }
256
257 PrototypeIterator iter(isolate, home_object);
258 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000259 if (!proto->IsJSReceiver()) {
260 Handle<Object> name = isolate->factory()->NewNumberFromUint(index);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100261 return Object::ReadAbsentProperty(isolate, proto, name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000262 }
263
264 LookupIterator it(isolate, receiver, index, Handle<JSReceiver>::cast(proto));
265 Handle<Object> result;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100266 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, Object::GetProperty(&it), Object);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267 return result;
268}
269
270
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000271RUNTIME_FUNCTION(Runtime_LoadFromSuper) {
272 HandleScope scope(isolate);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100273 DCHECK_EQ(3, args.length());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000274 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
275 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
276 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400277
278 Handle<Object> result;
279 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100280 isolate, result, LoadFromSuper(isolate, receiver, home_object, name));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400281 return *result;
282}
283
284
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400285RUNTIME_FUNCTION(Runtime_LoadKeyedFromSuper) {
286 HandleScope scope(isolate);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100287 DCHECK_EQ(3, args.length());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400288 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
289 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
290 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
291
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 uint32_t index = 0;
293 Handle<Object> result;
294
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400295 if (key->ToArrayIndex(&index)) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000296 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100297 isolate, result,
298 LoadElementFromSuper(isolate, receiver, home_object, index));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 return *result;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400300 }
301
302 Handle<Name> name;
303 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000304 Object::ToName(isolate, key));
305 // TODO(verwaest): Unify using LookupIterator.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400306 if (name->AsArrayIndex(&index)) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100308 isolate, result,
309 LoadElementFromSuper(isolate, receiver, home_object, index));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000310 return *result;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400311 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000312 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
Ben Murdoch097c5b22016-05-18 11:27:45 +0100313 isolate, result, LoadFromSuper(isolate, receiver, home_object, name));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314 return *result;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400315}
316
317
318static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object,
319 Handle<Object> receiver, Handle<Name> name,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000320 Handle<Object> value, LanguageMode language_mode) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400321 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322 !isolate->MayAccess(handle(isolate->context()), home_object)) {
323 isolate->ReportFailedAccessCheck(home_object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400324 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
325 }
326
327 PrototypeIterator iter(isolate, home_object);
328 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
329 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
330
331 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332 MAYBE_RETURN(Object::SetSuperProperty(&it, value, language_mode,
333 Object::CERTAINLY_NOT_STORE_FROM_KEYED),
334 isolate->heap()->exception());
335 return *value;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400336}
337
338
339static Object* StoreElementToSuper(Isolate* isolate,
340 Handle<JSObject> home_object,
341 Handle<Object> receiver, uint32_t index,
342 Handle<Object> value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343 LanguageMode language_mode) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400344 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345 !isolate->MayAccess(handle(isolate->context()), home_object)) {
346 isolate->ReportFailedAccessCheck(home_object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400347 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
348 }
349
350 PrototypeIterator iter(isolate, home_object);
351 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
352 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
353
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354 LookupIterator it(isolate, receiver, index, Handle<JSReceiver>::cast(proto));
355 MAYBE_RETURN(Object::SetSuperProperty(&it, value, language_mode,
356 Object::MAY_BE_STORE_FROM_KEYED),
357 isolate->heap()->exception());
358 return *value;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400359}
360
361
362RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) {
363 HandleScope scope(isolate);
364 DCHECK(args.length() == 4);
365 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
366 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
367 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
368 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
369
370 return StoreToSuper(isolate, home_object, receiver, name, value, STRICT);
371}
372
373
374RUNTIME_FUNCTION(Runtime_StoreToSuper_Sloppy) {
375 HandleScope scope(isolate);
376 DCHECK(args.length() == 4);
377 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
378 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
379 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
380 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
381
382 return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY);
383}
384
385
386static Object* StoreKeyedToSuper(Isolate* isolate, Handle<JSObject> home_object,
387 Handle<Object> receiver, Handle<Object> key,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000388 Handle<Object> value,
389 LanguageMode language_mode) {
390 uint32_t index = 0;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400391
392 if (key->ToArrayIndex(&index)) {
393 return StoreElementToSuper(isolate, home_object, receiver, index, value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394 language_mode);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400395 }
396 Handle<Name> name;
397 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000398 Object::ToName(isolate, key));
399 // TODO(verwaest): Unify using LookupIterator.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400400 if (name->AsArrayIndex(&index)) {
401 return StoreElementToSuper(isolate, home_object, receiver, index, value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000402 language_mode);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400403 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000404 return StoreToSuper(isolate, home_object, receiver, name, value,
405 language_mode);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400406}
407
408
409RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Strict) {
410 HandleScope scope(isolate);
411 DCHECK(args.length() == 4);
412 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
413 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
414 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
415 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
416
417 return StoreKeyedToSuper(isolate, home_object, receiver, key, value, STRICT);
418}
419
420
421RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Sloppy) {
422 HandleScope scope(isolate);
423 DCHECK(args.length() == 4);
424 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
425 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
426 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
427 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
428
429 return StoreKeyedToSuper(isolate, home_object, receiver, key, value, SLOPPY);
430}
431
432
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000433RUNTIME_FUNCTION(Runtime_GetSuperConstructor) {
434 SealHandleScope shs(isolate);
435 DCHECK_EQ(1, args.length());
436 CONVERT_ARG_CHECKED(JSFunction, active_function, 0);
437 return active_function->map()->prototype();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400438}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000439
440} // namespace internal
441} // namespace v8