blob: 303122fc3967c5f3abfc9a088885c958457aac98 [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
Ben Murdoch61f157c2016-09-16 13:49:30 +010091 if (super_class->IsTheHole(isolate)) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040092 prototype_parent = isolate->initial_object_prototype();
93 } else {
Ben Murdoch61f157c2016-09-16 13:49:30 +010094 if (super_class->IsNull(isolate)) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040095 prototype_parent = isolate->factory()->null_value();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000096 } else if (super_class->IsConstructor()) {
Ben Murdoch61f157c2016-09-16 13:49:30 +010097 DCHECK(!super_class->IsJSFunction() ||
98 !Handle<JSFunction>::cast(super_class)->shared()->is_resumable());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000099 ASSIGN_RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400100 isolate, prototype_parent,
101 Runtime::GetObjectProperty(isolate, super_class,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100102 isolate->factory()->prototype_string()),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000103 Object);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100104 if (!prototype_parent->IsNull(isolate) &&
105 !prototype_parent->IsJSReceiver()) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000106 THROW_NEW_ERROR(
107 isolate, NewTypeError(MessageTemplate::kPrototypeParentNotAnObject,
108 prototype_parent),
109 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400110 }
111 constructor_parent = super_class;
112 } else {
Ben Murdoch61f157c2016-09-16 13:49:30 +0100113 THROW_NEW_ERROR(isolate,
114 NewTypeError(MessageTemplate::kExtendsValueNotConstructor,
115 super_class),
116 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400117 }
118 }
119
120 Handle<Map> map =
121 isolate->factory()->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000122 map->set_is_prototype_map(true);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000123 Map::SetPrototype(map, prototype_parent);
124 map->SetConstructor(*constructor);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400125 Handle<JSObject> prototype = isolate->factory()->NewJSObjectFromMap(map);
126
Ben Murdoch61f157c2016-09-16 13:49:30 +0100127 if (!super_class->IsTheHole(isolate)) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000128 // Derived classes, just like builtins, don't create implicit receivers in
129 // [[construct]]. Instead they just set up new.target and call into the
130 // constructor. Hence we can reuse the builtins construct stub for derived
131 // classes.
Ben Murdoch097c5b22016-05-18 11:27:45 +0100132 Handle<Code> stub(isolate->builtins()->JSBuiltinsConstructStubForDerived());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133 constructor->shared()->set_construct_stub(*stub);
134 }
135
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400136 JSFunction::SetPrototype(constructor, prototype);
137 PropertyAttributes attribs =
138 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000139 RETURN_ON_EXCEPTION(isolate,
140 JSObject::SetOwnPropertyIgnoreAttributes(
141 constructor, isolate->factory()->prototype_string(),
142 prototype, attribs),
143 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400144
145 // TODO(arv): Only do this conditionally.
146 Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400148 isolate, JSObject::SetOwnPropertyIgnoreAttributes(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000149 constructor, home_object_symbol, prototype, DONT_ENUM),
150 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400151
152 if (!constructor_parent.is_null()) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000153 MAYBE_RETURN_NULL(JSObject::SetPrototype(constructor, constructor_parent,
154 false, Object::THROW_ON_ERROR));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400155 }
156
157 JSObject::AddProperty(prototype, isolate->factory()->constructor_string(),
158 constructor, DONT_ENUM);
159
160 // Install private properties that are used to construct the FunctionToString.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000161 RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400162 isolate,
163 Object::SetProperty(
164 constructor, isolate->factory()->class_start_position_symbol(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000165 handle(Smi::FromInt(start_position), isolate), STRICT),
166 Object);
167 RETURN_ON_EXCEPTION(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400168 isolate, Object::SetProperty(
169 constructor, isolate->factory()->class_end_position_symbol(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000170 handle(Smi::FromInt(end_position), isolate), STRICT),
171 Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400172
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173 return constructor;
174}
175
176
177RUNTIME_FUNCTION(Runtime_DefineClass) {
178 HandleScope scope(isolate);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100179 DCHECK(args.length() == 4);
180 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 0);
181 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 1);
182 CONVERT_SMI_ARG_CHECKED(start_position, 2);
183 CONVERT_SMI_ARG_CHECKED(end_position, 3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184
Ben Murdoch61f157c2016-09-16 13:49:30 +0100185 RETURN_RESULT_OR_FAILURE(
186 isolate, DefineClass(isolate, super_class, constructor, start_position,
187 end_position));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400188}
189
190
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000191static MaybeHandle<Object> LoadFromSuper(Isolate* isolate,
192 Handle<Object> receiver,
193 Handle<JSObject> home_object,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100194 Handle<Name> name) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400195 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000196 !isolate->MayAccess(handle(isolate->context()), home_object)) {
197 isolate->ReportFailedAccessCheck(home_object);
198 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400199 }
200
201 PrototypeIterator iter(isolate, home_object);
202 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000203 if (!proto->IsJSReceiver()) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100204 return Object::ReadAbsentProperty(isolate, proto, name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400206
207 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
208 Handle<Object> result;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100209 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, Object::GetProperty(&it), Object);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000210 return result;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400211}
212
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213static MaybeHandle<Object> LoadElementFromSuper(Isolate* isolate,
214 Handle<Object> receiver,
215 Handle<JSObject> home_object,
Ben Murdoch097c5b22016-05-18 11:27:45 +0100216 uint32_t index) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400217 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000218 !isolate->MayAccess(handle(isolate->context()), home_object)) {
219 isolate->ReportFailedAccessCheck(home_object);
220 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400221 }
222
223 PrototypeIterator iter(isolate, home_object);
224 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225 if (!proto->IsJSReceiver()) {
226 Handle<Object> name = isolate->factory()->NewNumberFromUint(index);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100227 return Object::ReadAbsentProperty(isolate, proto, name);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228 }
229
230 LookupIterator it(isolate, receiver, index, Handle<JSReceiver>::cast(proto));
231 Handle<Object> result;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100232 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, Object::GetProperty(&it), Object);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000233 return result;
234}
235
236
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000237RUNTIME_FUNCTION(Runtime_LoadFromSuper) {
238 HandleScope scope(isolate);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100239 DCHECK_EQ(3, args.length());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000240 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
241 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
242 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400243
Ben Murdoch61f157c2016-09-16 13:49:30 +0100244 RETURN_RESULT_OR_FAILURE(isolate,
245 LoadFromSuper(isolate, receiver, home_object, name));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400246}
247
248
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400249RUNTIME_FUNCTION(Runtime_LoadKeyedFromSuper) {
250 HandleScope scope(isolate);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100251 DCHECK_EQ(3, args.length());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400252 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
253 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
254 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
255
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000256 uint32_t index = 0;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000257
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400258 if (key->ToArrayIndex(&index)) {
Ben Murdoch61f157c2016-09-16 13:49:30 +0100259 RETURN_RESULT_OR_FAILURE(
260 isolate, LoadElementFromSuper(isolate, receiver, home_object, index));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400261 }
262
263 Handle<Name> name;
264 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000265 Object::ToName(isolate, key));
266 // TODO(verwaest): Unify using LookupIterator.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400267 if (name->AsArrayIndex(&index)) {
Ben Murdoch61f157c2016-09-16 13:49:30 +0100268 RETURN_RESULT_OR_FAILURE(
269 isolate, LoadElementFromSuper(isolate, receiver, home_object, index));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400270 }
Ben Murdoch61f157c2016-09-16 13:49:30 +0100271 RETURN_RESULT_OR_FAILURE(isolate,
272 LoadFromSuper(isolate, receiver, home_object, name));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400273}
274
275
276static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object,
277 Handle<Object> receiver, Handle<Name> name,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000278 Handle<Object> value, LanguageMode language_mode) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400279 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 !isolate->MayAccess(handle(isolate->context()), home_object)) {
281 isolate->ReportFailedAccessCheck(home_object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400282 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
283 }
284
285 PrototypeIterator iter(isolate, home_object);
286 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
287 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
288
289 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290 MAYBE_RETURN(Object::SetSuperProperty(&it, value, language_mode,
291 Object::CERTAINLY_NOT_STORE_FROM_KEYED),
292 isolate->heap()->exception());
293 return *value;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400294}
295
296
297static Object* StoreElementToSuper(Isolate* isolate,
298 Handle<JSObject> home_object,
299 Handle<Object> receiver, uint32_t index,
300 Handle<Object> value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000301 LanguageMode language_mode) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400302 if (home_object->IsAccessCheckNeeded() &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303 !isolate->MayAccess(handle(isolate->context()), home_object)) {
304 isolate->ReportFailedAccessCheck(home_object);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400305 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
306 }
307
308 PrototypeIterator iter(isolate, home_object);
309 Handle<Object> proto = PrototypeIterator::GetCurrent(iter);
310 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value();
311
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000312 LookupIterator it(isolate, receiver, index, Handle<JSReceiver>::cast(proto));
313 MAYBE_RETURN(Object::SetSuperProperty(&it, value, language_mode,
314 Object::MAY_BE_STORE_FROM_KEYED),
315 isolate->heap()->exception());
316 return *value;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400317}
318
319
320RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) {
321 HandleScope scope(isolate);
322 DCHECK(args.length() == 4);
323 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
324 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
325 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
326 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
327
328 return StoreToSuper(isolate, home_object, receiver, name, value, STRICT);
329}
330
331
332RUNTIME_FUNCTION(Runtime_StoreToSuper_Sloppy) {
333 HandleScope scope(isolate);
334 DCHECK(args.length() == 4);
335 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
336 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
337 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2);
338 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
339
340 return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY);
341}
342
343
344static Object* StoreKeyedToSuper(Isolate* isolate, Handle<JSObject> home_object,
345 Handle<Object> receiver, Handle<Object> key,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000346 Handle<Object> value,
347 LanguageMode language_mode) {
348 uint32_t index = 0;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400349
350 if (key->ToArrayIndex(&index)) {
351 return StoreElementToSuper(isolate, home_object, receiver, index, value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 language_mode);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400353 }
354 Handle<Name> name;
355 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 Object::ToName(isolate, key));
357 // TODO(verwaest): Unify using LookupIterator.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400358 if (name->AsArrayIndex(&index)) {
359 return StoreElementToSuper(isolate, home_object, receiver, index, value,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000360 language_mode);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400361 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 return StoreToSuper(isolate, home_object, receiver, name, value,
363 language_mode);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400364}
365
366
367RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Strict) {
368 HandleScope scope(isolate);
369 DCHECK(args.length() == 4);
370 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
371 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
372 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
373 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
374
375 return StoreKeyedToSuper(isolate, home_object, receiver, key, value, STRICT);
376}
377
378
379RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Sloppy) {
380 HandleScope scope(isolate);
381 DCHECK(args.length() == 4);
382 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0);
383 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1);
384 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2);
385 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3);
386
387 return StoreKeyedToSuper(isolate, home_object, receiver, key, value, SLOPPY);
388}
389
390
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000391RUNTIME_FUNCTION(Runtime_GetSuperConstructor) {
392 SealHandleScope shs(isolate);
393 DCHECK_EQ(1, args.length());
394 CONVERT_ARG_CHECKED(JSFunction, active_function, 0);
395 return active_function->map()->prototype();
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400396}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000397
398} // namespace internal
399} // namespace v8