OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 <stdlib.h> | 5 #include <stdlib.h> |
6 #include <limits> | 6 #include <limits> |
7 | 7 |
8 #include "v8.h" | 8 #include "v8.h" |
9 | 9 |
10 #include "accessors.h" | 10 #include "accessors.h" |
(...skipping 3024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3035 ASSERT(args.length() == 2); | 3035 ASSERT(args.length() == 2); |
3036 | 3036 |
3037 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 3037 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
3038 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); | 3038 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); |
3039 ASSERT(fun->should_have_prototype()); | 3039 ASSERT(fun->should_have_prototype()); |
3040 Accessors::FunctionSetPrototype(fun, value); | 3040 Accessors::FunctionSetPrototype(fun, value); |
3041 return args[0]; // return TOS | 3041 return args[0]; // return TOS |
3042 } | 3042 } |
3043 | 3043 |
3044 | 3044 |
3045 RUNTIME_FUNCTION(Runtime_FunctionSetReadOnlyPrototype) { | |
3046 HandleScope shs(isolate); | |
3047 RUNTIME_ASSERT(args.length() == 1); | |
3048 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | |
3049 | |
3050 Handle<String> name = isolate->factory()->prototype_string(); | |
3051 | |
3052 if (function->HasFastProperties()) { | |
3053 // Construct a new field descriptor with updated attributes. | |
3054 Handle<DescriptorArray> instance_desc = | |
3055 handle(function->map()->instance_descriptors()); | |
3056 | |
3057 int index = instance_desc->SearchWithCache(*name, function->map()); | |
3058 ASSERT(index != DescriptorArray::kNotFound); | |
3059 PropertyDetails details = instance_desc->GetDetails(index); | |
3060 | |
3061 CallbacksDescriptor new_desc( | |
3062 name, | |
3063 handle(instance_desc->GetValue(index), isolate), | |
3064 static_cast<PropertyAttributes>(details.attributes() | READ_ONLY)); | |
3065 | |
3066 // Create a new map featuring the new field descriptors array. | |
3067 Handle<Map> map = handle(function->map()); | |
3068 Handle<Map> new_map = Map::CopyReplaceDescriptor( | |
3069 map, instance_desc, &new_desc, index, OMIT_TRANSITION); | |
3070 | |
3071 JSObject::MigrateToMap(function, new_map); | |
3072 } else { // Dictionary properties. | |
3073 // Directly manipulate the property details. | |
3074 DisallowHeapAllocation no_gc; | |
3075 int entry = function->property_dictionary()->FindEntry(name); | |
3076 ASSERT(entry != NameDictionary::kNotFound); | |
3077 PropertyDetails details = function->property_dictionary()->DetailsAt(entry); | |
3078 PropertyDetails new_details( | |
3079 static_cast<PropertyAttributes>(details.attributes() | READ_ONLY), | |
3080 details.type(), | |
3081 details.dictionary_index()); | |
3082 function->property_dictionary()->DetailsAtPut(entry, new_details); | |
3083 } | |
3084 return *function; | |
3085 } | |
3086 | |
3087 | |
3088 RUNTIME_FUNCTION(Runtime_FunctionIsAPIFunction) { | 3045 RUNTIME_FUNCTION(Runtime_FunctionIsAPIFunction) { |
3089 SealHandleScope shs(isolate); | 3046 SealHandleScope shs(isolate); |
3090 ASSERT(args.length() == 1); | 3047 ASSERT(args.length() == 1); |
3091 | 3048 |
3092 CONVERT_ARG_CHECKED(JSFunction, f, 0); | 3049 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
3093 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); | 3050 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); |
3094 } | 3051 } |
3095 | 3052 |
3096 | 3053 |
3097 RUNTIME_FUNCTION(Runtime_FunctionIsBuiltin) { | 3054 RUNTIME_FUNCTION(Runtime_FunctionIsBuiltin) { |
(...skipping 12161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15259 } | 15216 } |
15260 return NULL; | 15217 return NULL; |
15261 } | 15218 } |
15262 | 15219 |
15263 | 15220 |
15264 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 15221 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
15265 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 15222 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
15266 } | 15223 } |
15267 | 15224 |
15268 } } // namespace v8::internal | 15225 } } // namespace v8::internal |
OLD | NEW |