1 // 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 
5 #include "src/runtime/runtime-utils.h"
6 
7 #include "src/arguments.h"
8 #include "src/char-predicates-inl.h"
9 #include "src/isolate-inl.h"
10 #include "src/json-stringifier.h"
11 #include "src/objects-inl.h"
12 #include "src/parsing/json-parser.h"
13 
14 namespace v8 {
15 namespace internal {
16 
RUNTIME_FUNCTION(Runtime_QuoteJSONString)17 RUNTIME_FUNCTION(Runtime_QuoteJSONString) {
18   HandleScope scope(isolate);
19   CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
20   DCHECK(args.length() == 1);
21   Handle<Object> result;
22   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
23       isolate, result, BasicJsonStringifier::StringifyString(isolate, string));
24   return *result;
25 }
26 
27 
RUNTIME_FUNCTION(Runtime_BasicJSONStringify)28 RUNTIME_FUNCTION(Runtime_BasicJSONStringify) {
29   HandleScope scope(isolate);
30   DCHECK(args.length() == 1);
31   CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
32   BasicJsonStringifier stringifier(isolate);
33   Handle<Object> result;
34   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
35                                      stringifier.Stringify(object));
36   return *result;
37 }
38 
39 
RUNTIME_FUNCTION(Runtime_ParseJson)40 RUNTIME_FUNCTION(Runtime_ParseJson) {
41   HandleScope scope(isolate);
42   DCHECK_EQ(1, args.length());
43   CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
44   Handle<String> source;
45   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, source,
46                                      Object::ToString(isolate, object));
47   source = String::Flatten(source);
48   // Optimized fast case where we only have Latin1 characters.
49   Handle<Object> result;
50   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
51                                      source->IsSeqOneByteString()
52                                          ? JsonParser<true>::Parse(source)
53                                          : JsonParser<false>::Parse(source));
54   return *result;
55 }
56 
57 }  // namespace internal
58 }  // namespace v8
59