# # Built-in strings # # String data is always quoted for clarity. Codepoints U+0000...U+00FF # are identified with bytes 1:1 to allow even invalid UTF-8 strings to # be represented. Internal strings are represented as Symbols with a # structured markup to avoid exposing the specific internal format (which # begins with a 0x82 byte since Duktape 2.2). # # Built-in strings can be mostly scanned automatically based on what # strings built-in objects need, but there are also dependencies on # certain built-in strings in C code (DUK_HTHREAD_STRING_XXX()) which # are scanned using an external utility src/scan_used_stridx.py. # Besides knowing the plain string values, metadata on some strings # matters for built-in data generation, e.g. some strings must have # an 8-bit string index. # strings: # --- Standard built-in object related strings --- # internal class values - str: "Undefined" # sort of class_name: true - str: "Null" # sort of class_name: true - str: "Object" class_name: true - str: "Function" class_name: true - str: "Array" class_name: true - str: "String" class_name: true - str: "Symbol" class_name: true es6: true - str: "Boolean" class_name: true - str: "Number" class_name: true - str: "Date" class_name: true - str: "RegExp" class_name: true - str: "Error" class_name: true - str: "Math" class_name: true - str: "JSON" class_name: true - str: "Arguments" class_name: true # built-in object names - str: "Object" - str: "Function" - str: "Array" - str: "String" - str: "Boolean" - str: "Number" - str: "Date" - str: "RegExp" - str: "Error" - str: "EvalError" - str: "RangeError" - str: "ReferenceError" - str: "SyntaxError" - str: "TypeError" - str: "URIError" - str: "Math" - str: "JSON" # Global object - str: "eval" - str: "parseInt" - str: "parseFloat" - str: "isNaN" - str: "isFinite" - str: "decodeURI" - str: "decodeURIComponent" - str: "encodeURI" - str: "encodeURIComponent" - str: "escape" - str: "unescape" # Object constructor - str: "length" - str: "prototype" - str: "getPrototypeOf" - str: "getOwnPropertyDescriptor" - str: "getOwnPropertyNames" - str: "create" - str: "defineProperty" - str: "defineProperties" - str: "seal" - str: "freeze" - str: "preventExtensions" - str: "isSealed" - str: "isFrozen" - str: "isExtensible" - str: "keys" # Property descriptors - str: "value" - str: "writable" - str: "configurable" - str: "enumerable" - str: "get" - str: "set" # Object prototype - str: "constructor" - str: "toString" - str: "toLocaleString" - str: "valueOf" - str: "hasOwnProperty" - str: "isPrototypeOf" - str: "propertyIsEnumerable" # Object instances - no special properties # Function constructor - str: "length" - str: "prototype" # Function prototype - str: "constructor" - str: "toString" - str: "apply" - str: "call" - str: "bind" # Function instances - str: "length" - str: "prototype" - str: "caller" # bind() generated instances - str: "arguments" # bind() generated instances # Array constructor - str: "length" - str: "prototype" - str: "isArray" # Array prototype - str: "constructor" - str: "toString" - str: "toLocaleString" - str: "concat" - str: "join" - str: "pop" - str: "push" - str: "reverse" - str: "shift" - str: "slice" - str: "sort" - str: "splice" - str: "unshift" - str: "indexOf" - str: "lastIndexOf" - str: "every" - str: "some" - str: "forEach" - str: "map" - str: "filter" - str: "reduce" - str: "reduceRight" # Array instances - str: "length" # String constructor - str: "length" - str: "prototype" - str: "fromCharCode" # String prototype - str: "constructor" - str: "toString" - str: "valueOf" - str: "charAt" - str: "charCodeAt" - str: "concat" - str: "indexOf" - str: "lastIndexOf" - str: "localeCompare" - str: "match" - str: "replace" - str: "search" - str: "slice" - str: "split" - str: "substring" - str: "toLowerCase" - str: "toLocaleLowerCase" - str: "toUpperCase" - str: "toLocaleUpperCase" - str: "trim" - str: "substr" section_b: true # String instances - str: "length" # Boolean constructor - str: "length" - str: "prototype" # Boolean prototype - str: "constructor" - str: "toString" - str: "valueOf" # Boolean instances - no special properties # Number constructor - str: "length" - str: "prototype" - str: "MAX_VALUE" - str: "MIN_VALUE" - str: "NaN" - str: "NEGATIVE_INFINITY" - str: "POSITIVE_INFINITY" # Number prototype - str: "constructor" - str: "toString" - str: "toLocaleString" - str: "valueOf" - str: "toFixed" - str: "toExponential" - str: "toPrecision" # Number instances - no special properties # Date constructor - str: "length" - str: "prototype" - str: "parse" - str: "UTC" - str: "now" # Date prototype - str: "constructor" - str: "toString" - str: "toDateString" - str: "toTimeString" - str: "toLocaleString" - str: "toLocaleDateString" - str: "toLocaleTimeString" - str: "valueOf" - str: "getTime" - str: "getFullYear" - str: "getUTCFullYear" - str: "getMonth" - str: "getUTCMonth" - str: "getDate" - str: "getUTCDate" - str: "getDay" - str: "getUTCDay" - str: "getHours" - str: "getUTCHours" - str: "getMinutes" - str: "getUTCMinutes" - str: "getSeconds" - str: "getUTCSeconds" - str: "getMilliseconds" - str: "getUTCMilliseconds" - str: "getTimezoneOffset" - str: "setTime" - str: "setMilliseconds" - str: "setUTCMilliseconds" - str: "setSeconds" - str: "setUTCSeconds" - str: "setMinutes" - str: "setUTCMinutes" - str: "setHours" - str: "setUTCHours" - str: "setDate" - str: "setUTCDate" - str: "setMonth" - str: "setUTCMonth" - str: "setFullYear" - str: "setUTCFullYear" - str: "toUTCString" - str: "toISOString" - str: "toJSON" - str: "getYear" section_b: true - str: "setYear" section_b: true - str: "toGMTString" section_b: true # Date instances - no special properties # RegExp constructor - str: "length" - str: "prototype" # RegExp prototype - str: "constructor" - str: "exec" - str: "test" - str: "toString" # RegExp instances - str: "source" - str: "global" - str: "ignoreCase" - str: "multiline" - str: "lastIndex" - str: "flags" # - str: "unicode" # - str: "sticky" # RegExp exec() results - str: "index" - str: "input" # Error constructor - str: "length" - str: "prototype" # Error prototype - str: "constructor" - str: "name" - str: "message" - str: "toString" # Error instances - no special properties # Error prototype / error fields (apply to all native errors in the spec) - str: "name" - str: "message" # Math object - str: "E" - str: "LN10" - str: "LN2" - str: "LOG2E" - str: "LOG10E" - str: "PI" - str: "SQRT1_2" - str: "SQRT2" - str: "abs" - str: "acos" - str: "asin" - str: "atan" - str: "atan2" - str: "ceil" - str: "cos" - str: "exp" - str: "floor" - str: "log" - str: "max" - str: "min" - str: "pow" - str: "random" - str: "round" - str: "sin" - str: "sqrt" - str: "tan" # JSON object - str: "parse" - str: "stringify" # --- Other standard related strings --- # typeof - these produce unfortunate naming conflicts like "Object" vs "object" - str: "undefined" - str: "boolean" - str: "number" - str: "string" - str: "symbol" es6: true - str: "object" # also returned for typeof null - str: "function" # type related - str: "undefined" - str: "null" - str: "true" - str: "false" # special values - str: "length" - str: "NaN" - str: "Infinity" - str: "+Infinity" - str: "-Infinity" - str: "0" - str: "+0" - str: "-0" - str: "" # used as a class name for unused/invalid class class_name: true - str: "," # for array joining - str: "\n " # for tracebacks - str: "[...]" # for tracebacks - str: "Invalid Date" # for invalid Date instances # arguments object (E5 Section 10.6) - str: "arguments" - str: "callee" - str: "caller" # "set" and "get" are strings we need in object literals but they are not # ReservedWords. - str: "get" - str: "set" # --- ES2015 specific strings --- # Proxy - str: "Proxy" es6: true #- str: "revocable" # es6: true # Proxy trap names (ES2015 Section 9.5) #- str: "getPrototypeOf" # es6: true #- str: "setPrototypeOf" # es6: true #- str: "isExtensible" # es6: true #- str: "preventExtensions" # es6: true #- str: "getOwnPropertyDescriptor" # es6: true - str: "has" es6: true - str: "get" es6: true - str: "set" es6: true - str: "deleteProperty" es6: true #- str: "defineProperty" # es6: true #- str: "enumerate" # obsoleted in ES2016 # es6: true - str: "ownKeys" es6: true - str: "apply" es6: true - str: "construct" es6: true - str: "Reflect" es6: true - str: "apply" es6: true - str: "construct" es6: true - str: "defineProperty" es6: true - str: "deleteProperty" es6: true - str: "get" es6: true - str: "getOwnPropertyDescriptor" es6: true - str: "getPrototypeOf" es6: true - str: "has" es6: true - str: "isExtensible" es6: true - str: "ownKeys" es6: true - str: "preventExtensions" es6: true - str: "set" es6: true - str: "setPrototypeOf" es6: true # Well-known symbols - str: type: symbol variant: wellknown string: "Symbol.toPrimitive" - str: type: symbol variant: wellknown string: "Symbol.hasInstance" - str: type: symbol variant: wellknown string: "Symbol.toStringTag" - str: type: symbol variant: wellknown string: "Symbol.isConcatSpreadable" # Misc - str: "setPrototypeOf" es6: true - str: "__proto__" es6: true # --- Node.js Buffer / TypedArray related strings --- # Node.js class - str: "Buffer" class_name: true nodejs_buffer: true # Node.js Buffer constructor - str: "concat" nodejs_buffer: true - str: "isEncoding" nodejs_buffer: true - str: "isBuffer" nodejs_buffer: true - str: "byteLength" nodejs_buffer: true - str: "compare" nodejs_buffer: true # Node.js Buffer prototype - str: "toString" nodejs_buffer: true - str: "toJSON" nodejs_buffer: true - str: "write" nodejs_buffer: true - str: "fill" nodejs_buffer: true - str: "equals" nodejs_buffer: true - str: "compare" nodejs_buffer: true - str: "copy" nodejs_buffer: true - str: "slice" nodejs_buffer: true - str: "readUInt8" nodejs_buffer: true - str: "readInt8" nodejs_buffer: true - str: "readUInt16LE" nodejs_buffer: true - str: "readUInt16BE" nodejs_buffer: true - str: "readInt16LE" nodejs_buffer: true - str: "readInt16BE" nodejs_buffer: true - str: "readUInt32LE" nodejs_buffer: true - str: "readUInt32BE" nodejs_buffer: true - str: "readInt32LE" nodejs_buffer: true - str: "readInt32BE" nodejs_buffer: true - str: "readFloatLE" nodejs_buffer: true - str: "readFloatBE" nodejs_buffer: true - str: "readDoubleLE" nodejs_buffer: true - str: "readDoubleBE" nodejs_buffer: true - str: "readUIntLE" nodejs_buffer: true - str: "readUIntBE" nodejs_buffer: true - str: "readIntLE" nodejs_buffer: true - str: "readIntBE" nodejs_buffer: true - str: "writeUInt8" nodejs_buffer: true - str: "writeInt8" nodejs_buffer: true - str: "writeUInt16LE" nodejs_buffer: true - str: "writeUInt16BE" nodejs_buffer: true - str: "writeInt16LE" nodejs_buffer: true - str: "writeInt16BE" nodejs_buffer: true - str: "writeUInt32LE" nodejs_buffer: true - str: "writeUInt32BE" nodejs_buffer: true - str: "writeInt32LE" nodejs_buffer: true - str: "writeInt32BE" nodejs_buffer: true - str: "writeFloatLE" nodejs_buffer: true - str: "writeFloatBE" nodejs_buffer: true - str: "writeDoubleLE" nodejs_buffer: true - str: "writeDoubleBE" nodejs_buffer: true - str: "writeUIntLE" nodejs_buffer: true - str: "writeUIntBE" nodejs_buffer: true - str: "writeIntLE" nodejs_buffer: true - str: "writeIntBE" nodejs_buffer: true # Node.js toJSON() - str: "type" nodejs_buffer: true - str: "data" nodejs_buffer: true # TypedArray classes - str: "ArrayBuffer" class_name: true typed_array: true - str: "DataView" class_name: true typed_array: true - str: "Int8Array" class_name: true typed_array: true - str: "Uint8Array" class_name: true typed_array: true - str: "Uint8ClampedArray" class_name: true typed_array: true - str: "Int16Array" class_name: true typed_array: true - str: "Uint16Array" class_name: true typed_array: true - str: "Int32Array" class_name: true typed_array: true - str: "Uint32Array" class_name: true typed_array: true - str: "Float32Array" class_name: true typed_array: true - str: "Float64Array" class_name: true typed_array: true # TypedArray ArrayBuffer constructor - str: "isView" typed_array: true # TypedArray ArrayBuffer instance - str: "slice" typed_array: true # TypedArray ArrayBufferView shared - str: "buffer" typed_array: true - str: "length" typed_array: true #- str: "byteLength" # typed_array: true #- str: "byteOffset" # typed_array: true #- str: "BYTES_PER_ELEMENT" # typed_array: true # TypedArray TypedArray (e.g. Uint8Array) - str: "set" typed_array: true - str: "subarray" typed_array: true # TypedArray DataView - str: "getInt8" typed_array: true - str: "getUint8" typed_array: true - str: "getInt16" typed_array: true - str: "getUint16" typed_array: true - str: "getInt32" typed_array: true - str: "getUint32" typed_array: true - str: "getFloat32" typed_array: true - str: "getFloat64" typed_array: true - str: "setInt8" typed_array: true - str: "setUint8" typed_array: true - str: "setInt16" typed_array: true - str: "setUint16" typed_array: true - str: "setInt32" typed_array: true - str: "setUint32" typed_array: true - str: "setFloat32" typed_array: true - str: "setFloat64" typed_array: true # --- Duktape specific strings --- # non-standard global properties - str: "Duktape" duktape: true # non-standard class values - str: "global" # implementation specific but shared by e.g. smjs and V8 duktape: true class_name: true - str: "ObjEnv" duktape: true class_name: true - str: "DecEnv" duktape: true class_name: true - str: "Buffer" duktape: true class_name: true - str: "Pointer" duktape: true class_name: true - str: "Thread" duktape: true class_name: true # non-standard built-in object names - str: "ThrowTypeError" # implementation specific, matches V8 duktape: true # non-standard error object (or Error.prototype) properties - str: "stack" duktape: true - str: "pc" duktape: true - str: "fileName" duktape: true - str: "lineNumber" duktape: true #- str: "code" # duktape: true - str: type: symbol variant: hidden string: "Tracedata" duktape: true internal: true # non-standard function instance properties - str: "name" # function declaration/expression name (or empty) duktape: true - str: "fileName" # filename associated with function (shown in tracebacks) duktape: true # typeof - these produce unfortunate naming conflicts like "Object" vs "object" #- str: "buffer" # no longer used in Duktape 2.x for typeof (typeof plainBuffer -> 'object' instead) # duktape: true - str: "pointer" duktape: true # GETPROPC delayed error, can use any shared hidden Symbol that can never # occur in used visible values (which may be thrown and thus trigger special # handling). At present, use _Target which is only used by enumerator # objects and nothing user visible. - str: type: symbol variant: hidden string: "Target" duktape: true internal: true # internal property for primitive value (Boolean, Number, String) - str: type: symbol variant: hidden string: "Value" duktape: true internal: true # internal properties for enumerator objects - str: type: symbol variant: hidden string: "Target" duktape: true internal: true - str: type: symbol variant: hidden string: "Next" duktape: true internal: true # internal properties for RegExp instances - str: type: symbol variant: hidden string: "Bytecode" duktape: true internal: true # internal properties for function objects - str: type: symbol variant: hidden string: "Formals" duktape: true internal: true - str: type: symbol variant: hidden string: "Varmap" duktape: true internal: true - str: type: symbol variant: hidden string: "Source" duktape: true internal: true - str: type: symbol variant: hidden string: "Pc2line" duktape: true internal: true # internal properties for thread objects # internal properties for argument objects - str: type: symbol variant: hidden string: "Map" duktape: true internal: true - str: type: symbol variant: hidden string: "Varenv" duktape: true internal: true - str: type: symbol variant: hidden string: "Callee" duktape: true internal: true # internal properties for general objects #- str: # type: symbol # variant: hidden # string: "Metatable" # duktape: true # internal: true - str: type: symbol variant: hidden string: "Finalizer" duktape: true internal: true # internal property used for GETPROPC created error objects to delay # their throwing (intentionally reuse an existing property name) - str: type: symbol variant: hidden string: "Value" duktape: true internal: true # fake filename for compiled functions - str: "compile" # used as a filename for functions created with Function constructor duktape: true - str: "input" # used as a filename for eval temp function duktape: true # Duktape object - str: "errCreate" duktape: true - str: "errThrow" duktape: true - str: "env" duktape: true - str: "version" duktape: true - str: "info" duktape: true - str: "act" duktape: true - str: "gc" duktape: true - str: "fin" duktape: true - str: "enc" duktape: true - str: "dec" duktape: true - str: "compact" duktape: true # enc/dec algorithms - str: "hex" duktape: true - str: "base64" duktape: true - str: "jx" duktape: true - str: "jc" duktape: true # Buffer constructor # Buffer prototype # Pointer constructor # Pointer prototype # Thread constructor - str: "yield" duktape: true - str: "resume" duktape: true - str: "current" duktape: true # Thread prototype # special literals for custom json encodings - str: "{\"_undef\":true}" duktape: true - str: "{\"_nan\":true}" duktape: true - str: "{\"_inf\":true}" duktape: true - str: "{\"_ninf\":true}" duktape: true - str: "{\"_func\":true}" duktape: true - str: "{_func:true}" duktape: true # --- Standard reserved words (non-strict mode + strict mode) --- # Note: order must match DUK_TOK_XXX reserved defines in duk_types.h # E5 Section 7.6.1 # Keyword - str: "break" reserved_word: true - str: "case" reserved_word: true - str: "catch" reserved_word: true - str: "continue" reserved_word: true - str: "debugger" reserved_word: true - str: "default" reserved_word: true - str: "delete" reserved_word: true - str: "do" reserved_word: true - str: "else" reserved_word: true - str: "finally" reserved_word: true - str: "for" reserved_word: true - str: "function" reserved_word: true - str: "if" reserved_word: true - str: "in" reserved_word: true - str: "instanceof" reserved_word: true - str: "new" reserved_word: true - str: "return" reserved_word: true - str: "switch" reserved_word: true - str: "this" reserved_word: true - str: "throw" reserved_word: true - str: "try" reserved_word: true - str: "typeof" reserved_word: true - str: "var" reserved_word: true - str: "const" # future reserved word in E5.1, now supported by Duktape so moved here reserved_word: true - str: "void" reserved_word: true - str: "while" reserved_word: true - str: "with" reserved_word: true # Future reserved word - str: "class" reserved_word: true future_reserved_word: true - str: "enum" reserved_word: true future_reserved_word: true - str: "export" reserved_word: true future_reserved_word: true - str: "extends" reserved_word: true future_reserved_word: true - str: "import" reserved_word: true future_reserved_word: true - str: "super" reserved_word: true future_reserved_word: true # E5 Section 7.8.1 and 7.8.2: special literals which the lexer # basically treats like keywords - str: "null" reserved_word: true special_literal: true - str: "true" reserved_word: true special_literal: true - str: "false" reserved_word: true special_literal: true # "set" and "get" are *NOT* reserved words and there is even code # in the wild with statements like "var set = 1;". They are thus # treated as ordinary identifiers and recognized by the compiler # as tokens in a special way. #- str: "get" #- str: "set" # --- Standard reserved words (strict mode only) --- # Note: order must match DUK_TOK_XXX reserved defines in duk_types.h # Future reserved word (additionally in strict mode) - str: "implements" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "interface" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "let" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "package" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "private" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "protected" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "public" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "static" reserved_word: true future_reserved_word: true future_reserved_word_strict: true - str: "yield" reserved_word: true future_reserved_word: true future_reserved_word_strict: true # Duktape duk_lexer.h expects these strings to be in this exact order # starting from "first reserved word". reserved_word_token_order: - "break" - "case" - "catch" - "continue" - "debugger" - "default" - "delete" - "do" - "else" - "finally" - "for" - "function" - "if" - "in" - "instanceof" - "new" - "return" - "switch" - "this" - "throw" - "try" - "typeof" - "var" - "const" - "void" - "while" - "with" - "class" - "enum" - "export" - "extends" - "import" - "super" - "null" - "true" - "false" - "implements" - "interface" - "let" - "package" - "private" - "protected" - "public" - "static" - "yield" # Forced define names for specific strings for which automatic name generation # does a bad job. special_define_names: # "typeof" has name conflicts like "object" and "Object", broken with # explicit LC/UC prefix. "undefined": "LC_UNDEFINED" "Undefined": "UC_UNDEFINED" "null": "LC_NULL" "Null": "UC_NULL" "object": "LC_OBJECT" "Object": "UC_OBJECT" "boolean": "LC_BOOLEAN" "Boolean": "UC_BOOLEAN" "number": "LC_NUMBER" "Number": "UC_NUMBER" "function": "LC_FUNCTION" "Function": "UC_FUNCTION" "string": "LC_STRING" "String": "UC_STRING" "array": "LC_ARRAY" "Array": "UC_ARRAY" "symbol": "LC_SYMBOL" "Symbol": "UC_SYMBOL" "arguments": "LC_ARGUMENTS" "Arguments": "UC_ARGUMENTS" "date": "LC_DATE" "Date": "UC_DATE" "buffer": "LC_BUFFER" "Buffer": "UC_BUFFER" "pointer": "LC_POINTER" "Pointer": "UC_POINTER" #"thread": "LC_THREAD" "Thread": "UC_THREAD" "error": "LC_ERROR" "Error": "UC_ERROR" # log levels "trace": "LC_TRACE" #"Trace": "UC_TRACE" "debug": "LC_DEBUG" #"Debug": "UC_DEBUG" "info": "LC_INFO" #"Info": "UC_INFO" "warn": "LC_WARN" #"Warn": "UC_WARN" #"error": "LC_ERROR" # already above #"Error": "UC_ERROR" "fatal": "LC_FATAL" #"Fatal": "UC_FATAL" "+Infinity": "PLUS_INFINITY" "-Infinity": "MINUS_INFINITY" "0": "ZERO" "+0": "PLUS_ZERO" "-0": "MINUS_ZERO" "NaN": "NAN" "isNaN": "IS_NAN" "MIN_VALUE": "MIN_VALUE" "MAX_VALUE": "MAX_VALUE" "NEGATIVE_INFINITY": "NEGATIVE_INFINITY" "POSITIVE_INFINITY": "POSITIVE_INFINITY" "Invalid Date": "INVALID_DATE" "decodeURIComponent": "DECODE_URI_COMPONENT" "encodeURIComponent": "ENCODE_URI_COMPONENT" "getUTCDate": "GET_UTC_DATE" "getUTCDay": "GET_UTC_DAY" "getUTCFullYear": "GET_UTC_FULL_YEAR" "getUTCHours": "GET_UTC_HOURS" "getUTCMilliseconds": "GET_UTC_MILLISECONDS" "getUTCMinutes": "GET_UTC_MINUTES" "getUTCMonth": "GET_UTC_MONTH" "getUTCSeconds": "GET_UTC_SECONDS" "setUTCDate": "SET_UTC_DATE" "setUTCDay": "SET_UTC_DAY" "setUTCFullYear": "SET_UTC_FULL_YEAR" "setUTCHours": "SET_UTC_HOURS" "setUTCMilliseconds": "SET_UTC_MILLISECONDS" "setUTCMinutes": "SET_UTC_MINUTES" "setUTCMonth": "SET_UTC_MONTH" "setUTCSeconds": "SET_UTC_SECONDS" "LOG10E": "LOG10E" "LOG2E": "LOG2E" "toISOString": "TO_ISO_STRING" "toUTCString": "TO_UTC_STRING" "toGMTString": "TO_GMT_STRING" "URIError": "URI_ERROR" "Duktape": "DUKTAPE" "": "EMPTY_STRING" ",": "COMMA" "\n ": "NEWLINE_4SPACE" "[...]": "BRACKETED_ELLIPSIS" "{\"_undef\":true}": "JSON_EXT_UNDEFINED" "{\"_nan\":true}": "JSON_EXT_NAN" "{\"_inf\":true}": "JSON_EXT_POSINF" "{\"_ninf\":true}": "JSON_EXT_NEGINF" "{\"_func\":true}": "JSON_EXT_FUNCTION1" "{_func:true}": "JSON_EXT_FUNCTION2" "BYTES_PER_ELEMENT": "BYTES_PER_ELEMENT"