| Index: src/factory.cc
|
| diff --git a/src/factory.cc b/src/factory.cc
|
| index 3865aa851aa6400aa9403512423ca5ff3b32e9b6..3f0f1b86888a2fa4d290d446f2fe9f548f645984 100644
|
| --- a/src/factory.cc
|
| +++ b/src/factory.cc
|
| @@ -559,19 +559,45 @@ Handle<String> Factory::NewProperSubString(Handle<String> str,
|
|
|
| MaybeHandle<String> Factory::NewExternalStringFromAscii(
|
| const ExternalAsciiString::Resource* resource) {
|
| - CALL_HEAP_FUNCTION(
|
| - isolate(),
|
| - isolate()->heap()->AllocateExternalStringFromAscii(resource),
|
| - String);
|
| + size_t length = resource->length();
|
| + if (length > static_cast<size_t>(String::kMaxLength)) {
|
| + isolate()->ThrowInvalidStringLength();
|
| + return MaybeHandle<String>();
|
| + }
|
| +
|
| + Handle<Map> map = external_ascii_string_map();
|
| + Handle<ExternalAsciiString> external_string =
|
| + New<ExternalAsciiString>(map, NEW_SPACE);
|
| + external_string->set_length(static_cast<int>(length));
|
| + external_string->set_hash_field(String::kEmptyHashField);
|
| + external_string->set_resource(resource);
|
| +
|
| + return external_string;
|
| }
|
|
|
|
|
| MaybeHandle<String> Factory::NewExternalStringFromTwoByte(
|
| const ExternalTwoByteString::Resource* resource) {
|
| - CALL_HEAP_FUNCTION(
|
| - isolate(),
|
| - isolate()->heap()->AllocateExternalStringFromTwoByte(resource),
|
| - String);
|
| + size_t length = resource->length();
|
| + if (length > static_cast<size_t>(String::kMaxLength)) {
|
| + isolate()->ThrowInvalidStringLength();
|
| + return MaybeHandle<String>();
|
| + }
|
| +
|
| + // For small strings we check whether the resource contains only
|
| + // one byte characters. If yes, we use a different string map.
|
| + static const size_t kOneByteCheckLengthLimit = 32;
|
| + bool is_one_byte = length <= kOneByteCheckLengthLimit &&
|
| + String::IsOneByte(resource->data(), static_cast<int>(length));
|
| + Handle<Map> map = is_one_byte ?
|
| + external_string_with_one_byte_data_map() : external_string_map();
|
| + Handle<ExternalTwoByteString> external_string =
|
| + New<ExternalTwoByteString>(map, NEW_SPACE);
|
| + external_string->set_length(static_cast<int>(length));
|
| + external_string->set_hash_field(String::kEmptyHashField);
|
| + external_string->set_resource(resource);
|
| +
|
| + return external_string;
|
| }
|
|
|
|
|
| @@ -1614,10 +1640,18 @@ Handle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type) {
|
|
|
| Handle<JSProxy> Factory::NewJSProxy(Handle<Object> handler,
|
| Handle<Object> prototype) {
|
| - CALL_HEAP_FUNCTION(
|
| - isolate(),
|
| - isolate()->heap()->AllocateJSProxy(*handler, *prototype),
|
| - JSProxy);
|
| + // Allocate map.
|
| + // TODO(rossberg): Once we optimize proxies, think about a scheme to share
|
| + // maps. Will probably depend on the identity of the handler object, too.
|
| + Handle<Map> map = NewMap(JS_PROXY_TYPE, JSProxy::kSize);
|
| + map->set_prototype(*prototype);
|
| +
|
| + // Allocate the proxy object.
|
| + Handle<JSProxy> result = New<JSProxy>(map, NEW_SPACE);
|
| + result->InitializeBody(map->instance_size(), Smi::FromInt(0));
|
| + result->set_handler(*handler);
|
| + result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER);
|
| + return result;
|
| }
|
|
|
|
|
| @@ -1625,11 +1659,20 @@ Handle<JSProxy> Factory::NewJSFunctionProxy(Handle<Object> handler,
|
| Handle<Object> call_trap,
|
| Handle<Object> construct_trap,
|
| Handle<Object> prototype) {
|
| - CALL_HEAP_FUNCTION(
|
| - isolate(),
|
| - isolate()->heap()->AllocateJSFunctionProxy(
|
| - *handler, *call_trap, *construct_trap, *prototype),
|
| - JSProxy);
|
| + // Allocate map.
|
| + // TODO(rossberg): Once we optimize proxies, think about a scheme to share
|
| + // maps. Will probably depend on the identity of the handler object, too.
|
| + Handle<Map> map = NewMap(JS_FUNCTION_PROXY_TYPE, JSFunctionProxy::kSize);
|
| + map->set_prototype(*prototype);
|
| +
|
| + // Allocate the proxy object.
|
| + Handle<JSFunctionProxy> result = New<JSFunctionProxy>(map, NEW_SPACE);
|
| + result->InitializeBody(map->instance_size(), Smi::FromInt(0));
|
| + result->set_handler(*handler);
|
| + result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER);
|
| + result->set_call_trap(*call_trap);
|
| + result->set_construct_trap(*construct_trap);
|
| + return result;
|
| }
|
|
|
|
|
| @@ -1757,21 +1800,57 @@ Handle<JSMessageObject> Factory::NewJSMessageObject(
|
| int end_position,
|
| Handle<Object> script,
|
| Handle<Object> stack_frames) {
|
| - CALL_HEAP_FUNCTION(isolate(),
|
| - isolate()->heap()->AllocateJSMessageObject(*type,
|
| - *arguments,
|
| - start_position,
|
| - end_position,
|
| - *script,
|
| - *stack_frames),
|
| - JSMessageObject);
|
| + Handle<Map> map = message_object_map();
|
| + Handle<JSMessageObject> message = New<JSMessageObject>(map, NEW_SPACE);
|
| + message->set_properties(*empty_fixed_array(), SKIP_WRITE_BARRIER);
|
| + message->initialize_elements();
|
| + message->set_elements(*empty_fixed_array(), SKIP_WRITE_BARRIER);
|
| + message->set_type(*type);
|
| + message->set_arguments(*arguments);
|
| + message->set_start_position(start_position);
|
| + message->set_end_position(end_position);
|
| + message->set_script(*script);
|
| + message->set_stack_frames(*stack_frames);
|
| + return message;
|
| }
|
|
|
|
|
| Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(Handle<String> name) {
|
| - CALL_HEAP_FUNCTION(isolate(),
|
| - isolate()->heap()->AllocateSharedFunctionInfo(*name),
|
| - SharedFunctionInfo);
|
| + Handle<Map> map = shared_function_info_map();
|
| + Handle<SharedFunctionInfo> share = New<SharedFunctionInfo>(map,
|
| + OLD_POINTER_SPACE);
|
| +
|
| + // Set pointer fields.
|
| + share->set_name(*name);
|
| + Code* illegal = isolate()->builtins()->builtin(Builtins::kIllegal);
|
| + share->set_code(illegal);
|
| + share->set_optimized_code_map(Smi::FromInt(0));
|
| + share->set_scope_info(ScopeInfo::Empty(isolate()));
|
| + Code* construct_stub =
|
| + isolate()->builtins()->builtin(Builtins::kJSConstructStubGeneric);
|
| + share->set_construct_stub(construct_stub);
|
| + share->set_instance_class_name(*Object_string());
|
| + share->set_function_data(*undefined_value(), SKIP_WRITE_BARRIER);
|
| + share->set_script(*undefined_value(), SKIP_WRITE_BARRIER);
|
| + share->set_debug_info(*undefined_value(), SKIP_WRITE_BARRIER);
|
| + share->set_inferred_name(*empty_string(), SKIP_WRITE_BARRIER);
|
| + share->set_initial_map(*undefined_value(), SKIP_WRITE_BARRIER);
|
| + share->set_ast_node_count(0);
|
| + share->set_counters(0);
|
| +
|
| + // Set integer fields (smi or int, depending on the architecture).
|
| + share->set_length(0);
|
| + share->set_formal_parameter_count(0);
|
| + share->set_expected_nof_properties(0);
|
| + share->set_num_literals(0);
|
| + share->set_start_position_and_type(0);
|
| + share->set_end_position(0);
|
| + share->set_function_token_position(0);
|
| + // All compiler hints default to false or 0.
|
| + share->set_compiler_hints(0);
|
| + share->set_opt_count_and_bailout_reason(0);
|
| +
|
| + return share;
|
| }
|
|
|
|
|
|
|