Index: src/runtime/runtime-classes.cc |
diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc |
index 15a08b0cc179a83448ab0ab7c3b2582a89de1915..cc4e09b52f699a997809220bccf2393ea3a33d47 100644 |
--- a/src/runtime/runtime-classes.cc |
+++ b/src/runtime/runtime-classes.cc |
@@ -153,6 +153,84 @@ RUNTIME_FUNCTION(Runtime_DefineClass) { |
} |
+RUNTIME_FUNCTION(Runtime_DefineClassMethod) { |
+ HandleScope scope(isolate); |
+ DCHECK(args.length() == 3); |
+ CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 2); |
+ |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, JSObject::SetOwnPropertyIgnoreAttributes( |
+ function, isolate->factory()->home_object_symbol(), object, |
+ DONT_ENUM)); |
+ |
+ uint32_t index; |
+ if (key->ToArrayIndex(&index)) { |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, JSObject::SetOwnElement(object, index, function, STRICT)); |
+ } |
+ |
+ Handle<Name> name; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, |
+ Runtime::ToName(isolate, key)); |
+ if (name->AsArrayIndex(&index)) { |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, JSObject::SetOwnElement(object, index, function, STRICT)); |
+ } else { |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, |
+ JSObject::SetOwnPropertyIgnoreAttributes(object, name, function, NONE)); |
+ } |
+ return isolate->heap()->undefined_value(); |
+} |
+ |
+ |
+RUNTIME_FUNCTION(Runtime_DefineClassGetter) { |
+ HandleScope scope(isolate); |
+ DCHECK(args.length() == 3); |
+ CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(JSFunction, getter, 2); |
+ |
+ Handle<Name> name; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, |
+ Runtime::ToName(isolate, key)); |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, |
+ JSObject::SetOwnPropertyIgnoreAttributes( |
+ getter, isolate->factory()->home_object_symbol(), object, DONT_ENUM)); |
+ |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, |
+ JSObject::DefineAccessor(object, name, getter, |
+ isolate->factory()->null_value(), NONE)); |
+ return isolate->heap()->undefined_value(); |
+} |
+ |
+ |
+RUNTIME_FUNCTION(Runtime_DefineClassSetter) { |
+ HandleScope scope(isolate); |
+ DCHECK(args.length() == 3); |
+ CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2); |
+ |
+ Handle<Name> name; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, |
+ Runtime::ToName(isolate, key)); |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, |
+ JSObject::SetOwnPropertyIgnoreAttributes( |
+ setter, isolate->factory()->home_object_symbol(), object, DONT_ENUM)); |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, |
+ JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), |
+ setter, NONE)); |
+ return isolate->heap()->undefined_value(); |
+} |
+ |
+ |
RUNTIME_FUNCTION(Runtime_ClassGetSourceCode) { |
HandleScope shs(isolate); |
DCHECK(args.length() == 1); |