Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: src/objects.cc

Issue 1516843002: [proxy] fixing harmony/proxy.js tests and improving error messages + some drive-by fixes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: WIP fix protoype walks with access checks Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 } 979 }
980 // 7. Let handlerProto be ? Call(trap, handler, «target»). 980 // 7. Let handlerProto be ? Call(trap, handler, «target»).
981 Handle<Object> argv[] = {target}; 981 Handle<Object> argv[] = {target};
982 Handle<Object> handler_proto; 982 Handle<Object> handler_proto;
983 ASSIGN_RETURN_ON_EXCEPTION( 983 ASSIGN_RETURN_ON_EXCEPTION(
984 isolate, handler_proto, 984 isolate, handler_proto,
985 Execution::Call(isolate, trap, handler, arraysize(argv), argv), Object); 985 Execution::Call(isolate, trap, handler, arraysize(argv), argv), Object);
986 // 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError. 986 // 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError.
987 if (!(handler_proto->IsJSReceiver() || handler_proto->IsNull())) { 987 if (!(handler_proto->IsJSReceiver() || handler_proto->IsNull())) {
988 THROW_NEW_ERROR(isolate, 988 THROW_NEW_ERROR(isolate,
989 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing, 989 NewTypeError(MessageTemplate::kProxyTrapReturnedNonObject,
990 handler, trap_name), 990 handler, handler_proto, trap_name),
991 Object); 991 Object);
992 } 992 }
993 // 9. Let extensibleTarget be ? IsExtensible(target). 993 // 9. Let extensibleTarget be ? IsExtensible(target).
994 Maybe<bool> is_extensible = JSReceiver::IsExtensible(target); 994 Maybe<bool> is_extensible = JSReceiver::IsExtensible(target);
995 MAYBE_RETURN_NULL(is_extensible); 995 MAYBE_RETURN_NULL(is_extensible);
996 // 10. If extensibleTarget is true, return handlerProto. 996 // 10. If extensibleTarget is true, return handlerProto.
997 if (is_extensible.FromJust()) return handler_proto; 997 if (is_extensible.FromJust()) return handler_proto;
998 // 11. Let targetProto be ? target.[[GetPrototypeOf]](). 998 // 11. Let targetProto be ? target.[[GetPrototypeOf]]().
999 Handle<Object> target_proto; 999 Handle<Object> target_proto;
1000 ASSIGN_RETURN_ON_EXCEPTION(isolate, target_proto, 1000 ASSIGN_RETURN_ON_EXCEPTION(isolate, target_proto,
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 } 1312 }
1313 } 1313 }
1314 } 1314 }
1315 1315
1316 1316
1317 Maybe<bool> Object::HasInPrototypeChain(Isolate* isolate, Handle<Object> object, 1317 Maybe<bool> Object::HasInPrototypeChain(Isolate* isolate, Handle<Object> object,
1318 Handle<Object> proto) { 1318 Handle<Object> proto) {
1319 PrototypeIterator iter(isolate, object, PrototypeIterator::START_AT_RECEIVER); 1319 PrototypeIterator iter(isolate, object, PrototypeIterator::START_AT_RECEIVER);
1320 while (true) { 1320 while (true) {
1321 if (!iter.AdvanceFollowingProxies()) return Nothing<bool>(); 1321 if (!iter.AdvanceFollowingProxies()) return Nothing<bool>();
1322 if (!iter.HasAccess()) {
1323 isolate->ReportFailedAccessCheck(
1324 PrototypeIterator::GetCurrent<JSObject>(iter));
1325 return Nothing<bool>();
1326 }
1322 if (iter.IsAtEnd()) return Just(false); 1327 if (iter.IsAtEnd()) return Just(false);
1323 if (iter.IsAtEnd(proto)) return Just(true); 1328 if (iter.IsAtEnd(proto)) return Just(true);
1324 } 1329 }
1325 } 1330 }
1326 1331
1327 1332
1328 Map* Object::GetRootMap(Isolate* isolate) { 1333 Map* Object::GetRootMap(Isolate* isolate) {
1329 DisallowHeapAllocation no_alloc; 1334 DisallowHeapAllocation no_alloc;
1330 if (IsSmi()) { 1335 if (IsSmi()) {
1331 Context* native_context = isolate->context()->native_context(); 1336 Context* native_context = isolate->context()->native_context();
(...skipping 3385 matching lines...) Expand 10 before | Expand all | Expand 10 after
4717 } 4722 }
4718 4723
4719 Handle<Object> trap_result; 4724 Handle<Object> trap_result;
4720 Handle<Object> args[] = {target, name, value, receiver}; 4725 Handle<Object> args[] = {target, name, value, receiver};
4721 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 4726 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
4722 isolate, trap_result, 4727 isolate, trap_result,
4723 Execution::Call(isolate, trap, handler, arraysize(args), args), 4728 Execution::Call(isolate, trap, handler, arraysize(args), args),
4724 Nothing<bool>()); 4729 Nothing<bool>());
4725 if (!trap_result->BooleanValue()) { 4730 if (!trap_result->BooleanValue()) {
4726 RETURN_FAILURE(isolate, should_throw, 4731 RETURN_FAILURE(isolate, should_throw,
4727 NewTypeError(MessageTemplate::kProxyHandlerReturned, handler, 4732 NewTypeError(MessageTemplate::kProxyTrapReturnedFalseish,
4728 factory->false_string(), trap_name)); 4733 handler, trap_result, trap_name));
4729 } 4734 }
4730 4735
4731 // Enforce the invariant. 4736 // Enforce the invariant.
4732 PropertyDescriptor target_desc; 4737 PropertyDescriptor target_desc;
4733 Maybe<bool> owned = 4738 Maybe<bool> owned =
4734 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc); 4739 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc);
4735 MAYBE_RETURN(owned, Nothing<bool>()); 4740 MAYBE_RETURN(owned, Nothing<bool>());
4736 if (owned.FromJust()) { 4741 if (owned.FromJust()) {
4737 bool inconsistent = 4742 bool inconsistent =
4738 (PropertyDescriptor::IsDataDescriptor(&target_desc) && 4743 (PropertyDescriptor::IsDataDescriptor(&target_desc) &&
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4775 } 4780 }
4776 4781
4777 Handle<Object> trap_result; 4782 Handle<Object> trap_result;
4778 Handle<Object> args[] = {target, name}; 4783 Handle<Object> args[] = {target, name};
4779 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 4784 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
4780 isolate, trap_result, 4785 isolate, trap_result,
4781 Execution::Call(isolate, trap, handler, arraysize(args), args), 4786 Execution::Call(isolate, trap, handler, arraysize(args), args),
4782 Nothing<bool>()); 4787 Nothing<bool>());
4783 if (!trap_result->BooleanValue()) { 4788 if (!trap_result->BooleanValue()) {
4784 RETURN_FAILURE(isolate, should_throw, 4789 RETURN_FAILURE(isolate, should_throw,
4785 NewTypeError(MessageTemplate::kProxyHandlerReturned, handler, 4790 NewTypeError(MessageTemplate::kProxyTrapReturnedFalseish,
4786 factory->false_string(), trap_name)); 4791 handler, trap_result, trap_name));
4787 } 4792 }
4788 4793
4789 // Enforce the invariant. 4794 // Enforce the invariant.
4790 PropertyDescriptor target_desc; 4795 PropertyDescriptor target_desc;
4791 Maybe<bool> owned = 4796 Maybe<bool> owned =
4792 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc); 4797 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc);
4793 MAYBE_RETURN(owned, Nothing<bool>()); 4798 MAYBE_RETURN(owned, Nothing<bool>());
4794 if (owned.FromJust() && !target_desc.configurable()) { 4799 if (owned.FromJust() && !target_desc.configurable()) {
4795 isolate->Throw(*factory->NewTypeError( 4800 isolate->Throw(*factory->NewTypeError(
4796 MessageTemplate::kProxyDeletePropertyViolatesInvariant, name)); 4801 MessageTemplate::kProxyDeletePropertyViolatesInvariant, name));
(...skipping 2031 matching lines...) Expand 10 before | Expand all | Expand 10 after
6828 ? Handle<Name>::cast(key) 6833 ? Handle<Name>::cast(key)
6829 : Handle<Name>::cast(isolate->factory()->NumberToString(key)); 6834 : Handle<Name>::cast(isolate->factory()->NumberToString(key));
6830 Handle<Object> trap_result_obj; 6835 Handle<Object> trap_result_obj;
6831 Handle<Object> args[] = {target, property_name, desc_obj}; 6836 Handle<Object> args[] = {target, property_name, desc_obj};
6832 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 6837 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
6833 isolate, trap_result_obj, 6838 isolate, trap_result_obj,
6834 Execution::Call(isolate, trap, handler, arraysize(args), args), 6839 Execution::Call(isolate, trap, handler, arraysize(args), args),
6835 Nothing<bool>()); 6840 Nothing<bool>());
6836 // 10. If booleanTrapResult is false, return false. 6841 // 10. If booleanTrapResult is false, return false.
6837 if (!trap_result_obj->BooleanValue()) { 6842 if (!trap_result_obj->BooleanValue()) {
6838 // TODO(jkummerow): Better error message?
6839 RETURN_FAILURE(isolate, should_throw, 6843 RETURN_FAILURE(isolate, should_throw,
6840 NewTypeError(MessageTemplate::kProxyHandlerReturned, handler, 6844 NewTypeError(MessageTemplate::kProxyTrapReturnedFalseish,
6841 trap_result_obj, trap_name)); 6845 handler, trap_result_obj, trap_name));
6842 } 6846 }
6843 // 11. Let targetDesc be ? target.[[GetOwnProperty]](P). 6847 // 11. Let targetDesc be ? target.[[GetOwnProperty]](P).
6844 PropertyDescriptor target_desc; 6848 PropertyDescriptor target_desc;
6845 Maybe<bool> target_found = 6849 Maybe<bool> target_found =
6846 JSReceiver::GetOwnPropertyDescriptor(isolate, target, key, &target_desc); 6850 JSReceiver::GetOwnPropertyDescriptor(isolate, target, key, &target_desc);
6847 MAYBE_RETURN(target_found, Nothing<bool>()); 6851 MAYBE_RETURN(target_found, Nothing<bool>());
6848 // 12. Let extensibleTarget be ? IsExtensible(target). 6852 // 12. Let extensibleTarget be ? IsExtensible(target).
6849 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target); 6853 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target);
6850 MAYBE_RETURN(maybe_extensible, Nothing<bool>()); 6854 MAYBE_RETURN(maybe_extensible, Nothing<bool>());
6851 bool extensible_target = maybe_extensible.FromJust(); 6855 bool extensible_target = maybe_extensible.FromJust();
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
6998 Handle<Object> trap_result_obj; 7002 Handle<Object> trap_result_obj;
6999 Handle<Object> args[] = {target, name}; 7003 Handle<Object> args[] = {target, name};
7000 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 7004 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
7001 isolate, trap_result_obj, 7005 isolate, trap_result_obj,
7002 Execution::Call(isolate, trap, handler, arraysize(args), args), 7006 Execution::Call(isolate, trap, handler, arraysize(args), args),
7003 Nothing<bool>()); 7007 Nothing<bool>());
7004 // 9. If Type(trapResultObj) is neither Object nor Undefined, throw a 7008 // 9. If Type(trapResultObj) is neither Object nor Undefined, throw a
7005 // TypeError exception. 7009 // TypeError exception.
7006 if (!trap_result_obj->IsJSReceiver() && !trap_result_obj->IsUndefined()) { 7010 if (!trap_result_obj->IsJSReceiver() && !trap_result_obj->IsUndefined()) {
7007 isolate->Throw(*isolate->factory()->NewTypeError( 7011 isolate->Throw(*isolate->factory()->NewTypeError(
7008 MessageTemplate::kProxyHandlerReturned, handler, trap_result_obj, 7012 MessageTemplate::kProxyTrapReturnedFalseish, handler, trap_result_obj,
7009 name)); 7013 trap_name));
7010 return Nothing<bool>(); 7014 return Nothing<bool>();
7011 } 7015 }
7012 // 10. Let targetDesc be ? target.[[GetOwnProperty]](P). 7016 // 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
7013 PropertyDescriptor target_desc; 7017 PropertyDescriptor target_desc;
7014 Maybe<bool> found = 7018 Maybe<bool> found =
7015 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc); 7019 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc);
7016 MAYBE_RETURN(found, Nothing<bool>()); 7020 MAYBE_RETURN(found, Nothing<bool>());
7017 // 11. If trapResultObj is undefined, then 7021 // 11. If trapResultObj is undefined, then
7018 if (trap_result_obj->IsUndefined()) { 7022 if (trap_result_obj->IsUndefined()) {
7019 // 11a. If targetDesc is undefined, return undefined. 7023 // 11a. If targetDesc is undefined, return undefined.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
7055 isolate, extensible_target.FromJust(), desc, &target_desc, name); 7059 isolate, extensible_target.FromJust(), desc, &target_desc, name);
7056 // 16. If valid is false, throw a TypeError exception. 7060 // 16. If valid is false, throw a TypeError exception.
7057 MAYBE_RETURN(valid, Nothing<bool>()); 7061 MAYBE_RETURN(valid, Nothing<bool>());
7058 DCHECK(valid.FromJust()); 7062 DCHECK(valid.FromJust());
7059 // 17. If resultDesc.[[Configurable]] is false, then 7063 // 17. If resultDesc.[[Configurable]] is false, then
7060 if (!desc->configurable()) { 7064 if (!desc->configurable()) {
7061 // 17a. If targetDesc is undefined or targetDesc.[[Configurable]] is true: 7065 // 17a. If targetDesc is undefined or targetDesc.[[Configurable]] is true:
7062 if (target_desc.is_empty() || target_desc.configurable()) { 7066 if (target_desc.is_empty() || target_desc.configurable()) {
7063 // 17a i. Throw a TypeError exception. 7067 // 17a i. Throw a TypeError exception.
7064 isolate->Throw(*isolate->factory()->NewTypeError( 7068 isolate->Throw(*isolate->factory()->NewTypeError(
7065 MessageTemplate::kRedefineDisallowed, name)); 7069 MessageTemplate::kProxyTrapDescriptorNonConfigurable, trap_name,
7070 name));
7066 return Nothing<bool>(); 7071 return Nothing<bool>();
7067 } 7072 }
7068 } 7073 }
7069 // 18. Return resultDesc. 7074 // 18. Return resultDesc.
7070 return Just(true); 7075 return Just(true);
7071 } 7076 }
7072 7077
7073 7078
7074 bool JSObject::ReferencesObjectFromElements(FixedArray* elements, 7079 bool JSObject::ReferencesObjectFromElements(FixedArray* elements,
7075 ElementsKind kind, 7080 ElementsKind kind,
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
7338 } 7343 }
7339 7344
7340 Handle<Object> trap_result; 7345 Handle<Object> trap_result;
7341 Handle<Object> args[] = {target}; 7346 Handle<Object> args[] = {target};
7342 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 7347 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
7343 isolate, trap_result, 7348 isolate, trap_result,
7344 Execution::Call(isolate, trap, handler, arraysize(args), args), 7349 Execution::Call(isolate, trap, handler, arraysize(args), args),
7345 Nothing<bool>()); 7350 Nothing<bool>());
7346 if (!trap_result->BooleanValue()) { 7351 if (!trap_result->BooleanValue()) {
7347 RETURN_FAILURE(isolate, should_throw, 7352 RETURN_FAILURE(isolate, should_throw,
7348 NewTypeError(MessageTemplate::kProxyHandlerReturned, handler, 7353 NewTypeError(MessageTemplate::kProxyTrapReturned, handler,
7349 factory->false_string(), trap_name)); 7354 trap_result, trap_name));
7350 } 7355 }
7351 7356
7352 // Enforce the invariant. 7357 // Enforce the invariant.
7353 Maybe<bool> target_result = JSReceiver::IsExtensible(target); 7358 Maybe<bool> target_result = JSReceiver::IsExtensible(target);
7354 MAYBE_RETURN(target_result, Nothing<bool>()); 7359 MAYBE_RETURN(target_result, Nothing<bool>());
7355 if (target_result.FromJust()) { 7360 if (target_result.FromJust()) {
7356 isolate->Throw(*factory->NewTypeError( 7361 isolate->Throw(*factory->NewTypeError(
7357 MessageTemplate::kProxyPreventExtensionsViolatesInvariant)); 7362 MessageTemplate::kProxyPreventExtensionsViolatesInvariant));
7358 return Nothing<bool>(); 7363 return Nothing<bool>();
7359 } 7364 }
(...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after
8577 unchecked_result_keys.Set(trap_result->get(i), kPresent); 8582 unchecked_result_keys.Set(trap_result->get(i), kPresent);
8578 } 8583 }
8579 // 17. Repeat, for each key that is an element of targetNonconfigurableKeys: 8584 // 17. Repeat, for each key that is an element of targetNonconfigurableKeys:
8580 for (int i = 0; i < nonconfigurable_keys_length; ++i) { 8585 for (int i = 0; i < nonconfigurable_keys_length; ++i) {
8581 Object* key = target_nonconfigurable_keys->get(i); 8586 Object* key = target_nonconfigurable_keys->get(i);
8582 // 17a. If key is not an element of uncheckedResultKeys, throw a 8587 // 17a. If key is not an element of uncheckedResultKeys, throw a
8583 // TypeError exception. 8588 // TypeError exception.
8584 int* found = unchecked_result_keys.Find(key); 8589 int* found = unchecked_result_keys.Find(key);
8585 if (found == nullptr || *found == kGone) { 8590 if (found == nullptr || *found == kGone) {
8586 isolate->Throw(*isolate->factory()->NewTypeError( 8591 isolate->Throw(*isolate->factory()->NewTypeError(
8587 MessageTemplate::kProxyTrapResultMustInclude, handle(key, isolate))); 8592 MessageTemplate::kProxyTrapOwnKeysResultMustInclude,
8593 handle(key, isolate)));
8588 return Nothing<bool>(); 8594 return Nothing<bool>();
8589 } 8595 }
8590 // 17b. Remove key from uncheckedResultKeys. 8596 // 17b. Remove key from uncheckedResultKeys.
8591 *found = kGone; 8597 *found = kGone;
8592 unchecked_result_keys_size--; 8598 unchecked_result_keys_size--;
8593 } 8599 }
8594 // 18. If extensibleTarget is true, return trapResult. 8600 // 18. If extensibleTarget is true, return trapResult.
8595 if (extensible_target) { 8601 if (extensible_target) {
8596 return accumulator->AddKeysFromProxy(proxy, trap_result); 8602 return accumulator->AddKeysFromProxy(proxy, trap_result);
8597 } 8603 }
8598 // 19. Repeat, for each key that is an element of targetConfigurableKeys: 8604 // 19. Repeat, for each key that is an element of targetConfigurableKeys:
8599 for (int i = 0; i < target_configurable_keys->length(); ++i) { 8605 for (int i = 0; i < target_configurable_keys->length(); ++i) {
8600 Object* key = target_configurable_keys->get(i); 8606 Object* key = target_configurable_keys->get(i);
8601 if (key->IsSmi()) continue; // Zapped entry, was nonconfigurable. 8607 if (key->IsSmi()) continue; // Zapped entry, was nonconfigurable.
8602 // 19a. If key is not an element of uncheckedResultKeys, throw a 8608 // 19a. If key is not an element of uncheckedResultKeys, throw a
8603 // TypeError exception. 8609 // TypeError exception.
8604 int* found = unchecked_result_keys.Find(key); 8610 int* found = unchecked_result_keys.Find(key);
8605 if (found == nullptr || *found == kGone) { 8611 if (found == nullptr || *found == kGone) {
8606 isolate->Throw(*isolate->factory()->NewTypeError( 8612 isolate->Throw(*isolate->factory()->NewTypeError(
8607 MessageTemplate::kProxyTrapResultMustInclude, handle(key, isolate))); 8613 MessageTemplate::kProxyTrapOwnKeysResultMustInclude,
8614 handle(key, isolate)));
8608 return Nothing<bool>(); 8615 return Nothing<bool>();
8609 } 8616 }
8610 // 19b. Remove key from uncheckedResultKeys. 8617 // 19b. Remove key from uncheckedResultKeys.
8611 *found = kGone; 8618 *found = kGone;
8612 unchecked_result_keys_size--; 8619 unchecked_result_keys_size--;
8613 } 8620 }
8614 // 20. If uncheckedResultKeys is not empty, throw a TypeError exception. 8621 // 20. If uncheckedResultKeys is not empty, throw a TypeError exception.
8615 if (unchecked_result_keys_size != 0) { 8622 if (unchecked_result_keys_size != 0) {
8616 DCHECK_GT(unchecked_result_keys_size, 0); 8623 DCHECK_GT(unchecked_result_keys_size, 0);
8617 isolate->Throw(*isolate->factory()->NewTypeError( 8624 isolate->Throw(*isolate->factory()->NewTypeError(
(...skipping 10607 matching lines...) Expand 10 before | Expand all | Expand 10 after
19225 if (cell->value() != *new_value) { 19232 if (cell->value() != *new_value) {
19226 cell->set_value(*new_value); 19233 cell->set_value(*new_value);
19227 Isolate* isolate = cell->GetIsolate(); 19234 Isolate* isolate = cell->GetIsolate();
19228 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19235 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19229 isolate, DependentCode::kPropertyCellChangedGroup); 19236 isolate, DependentCode::kPropertyCellChangedGroup);
19230 } 19237 }
19231 } 19238 }
19232 19239
19233 } // namespace internal 19240 } // namespace internal
19234 } // namespace v8 19241 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698