• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_FACTORY_H_
29 #define V8_FACTORY_H_
30 
31 #include "globals.h"
32 #include "handles.h"
33 #include "heap.h"
34 
35 namespace v8 {
36 namespace internal {
37 
38 // Interface for handle based allocation.
39 
40 class Factory {
41  public:
42   // Allocate a new fixed array with undefined entries.
43   Handle<FixedArray> NewFixedArray(
44       int size,
45       PretenureFlag pretenure = NOT_TENURED);
46 
47   // Allocate a new fixed array with non-existing entries (the hole).
48   Handle<FixedArray> NewFixedArrayWithHoles(
49       int size,
50       PretenureFlag pretenure = NOT_TENURED);
51 
52   Handle<NumberDictionary> NewNumberDictionary(int at_least_space_for);
53 
54   Handle<StringDictionary> NewStringDictionary(int at_least_space_for);
55 
56   Handle<DescriptorArray> NewDescriptorArray(int number_of_descriptors);
57   Handle<DeoptimizationInputData> NewDeoptimizationInputData(
58       int deopt_entry_count,
59       PretenureFlag pretenure);
60   Handle<DeoptimizationOutputData> NewDeoptimizationOutputData(
61       int deopt_entry_count,
62       PretenureFlag pretenure);
63 
64   Handle<String> LookupSymbol(Vector<const char> str);
65   Handle<String> LookupAsciiSymbol(Vector<const char> str);
66   Handle<String> LookupTwoByteSymbol(Vector<const uc16> str);
LookupAsciiSymbol(const char * str)67   Handle<String> LookupAsciiSymbol(const char* str) {
68     return LookupSymbol(CStrVector(str));
69   }
70 
71 
72   // String creation functions.  Most of the string creation functions take
73   // a Heap::PretenureFlag argument to optionally request that they be
74   // allocated in the old generation.  The pretenure flag defaults to
75   // DONT_TENURE.
76   //
77   // Creates a new String object.  There are two String encodings: ASCII and
78   // two byte.  One should choose between the three string factory functions
79   // based on the encoding of the string buffer that the string is
80   // initialized from.
81   //   - ...FromAscii initializes the string from a buffer that is ASCII
82   //     encoded (it does not check that the buffer is ASCII encoded) and
83   //     the result will be ASCII encoded.
84   //   - ...FromUtf8 initializes the string from a buffer that is UTF-8
85   //     encoded.  If the characters are all single-byte characters, the
86   //     result will be ASCII encoded, otherwise it will converted to two
87   //     byte.
88   //   - ...FromTwoByte initializes the string from a buffer that is two
89   //     byte encoded.  If the characters are all single-byte characters,
90   //     the result will be converted to ASCII, otherwise it will be left as
91   //     two byte.
92   //
93   // ASCII strings are pretenured when used as keys in the SourceCodeCache.
94   Handle<String> NewStringFromAscii(
95       Vector<const char> str,
96       PretenureFlag pretenure = NOT_TENURED);
97 
98   // UTF8 strings are pretenured when used for regexp literal patterns and
99   // flags in the parser.
100   Handle<String> NewStringFromUtf8(
101       Vector<const char> str,
102       PretenureFlag pretenure = NOT_TENURED);
103 
104   Handle<String> NewStringFromTwoByte(
105       Vector<const uc16> str,
106       PretenureFlag pretenure = NOT_TENURED);
107 
108   // Allocates and partially initializes an ASCII or TwoByte String. The
109   // characters of the string are uninitialized. Currently used in regexp code
110   // only, where they are pretenured.
111   Handle<String> NewRawAsciiString(
112       int length,
113       PretenureFlag pretenure = NOT_TENURED);
114   Handle<String> NewRawTwoByteString(
115       int length,
116       PretenureFlag pretenure = NOT_TENURED);
117 
118   // Create a new cons string object which consists of a pair of strings.
119   Handle<String> NewConsString(Handle<String> first,
120                                Handle<String> second);
121 
122   // Create a new string object which holds a substring of a string.
123   Handle<String> NewSubString(Handle<String> str,
124                               int begin,
125                               int end);
126 
127   // Creates a new external String object.  There are two String encodings
128   // in the system: ASCII and two byte.  Unlike other String types, it does
129   // not make sense to have a UTF-8 factory function for external strings,
130   // because we cannot change the underlying buffer.
131   Handle<String> NewExternalStringFromAscii(
132       ExternalAsciiString::Resource* resource);
133   Handle<String> NewExternalStringFromTwoByte(
134       ExternalTwoByteString::Resource* resource);
135 
136   // Create a global (but otherwise uninitialized) context.
137   Handle<Context> NewGlobalContext();
138 
139   // Create a function context.
140   Handle<Context> NewFunctionContext(int length,
141                                      Handle<JSFunction> closure);
142 
143   // Create a 'with' context.
144   Handle<Context> NewWithContext(Handle<Context> previous,
145                                  Handle<JSObject> extension,
146                                  bool is_catch_context);
147 
148   // Return the Symbol matching the passed in string.
149   Handle<String> SymbolFromString(Handle<String> value);
150 
151   // Allocate a new struct.  The struct is pretenured (allocated directly in
152   // the old generation).
153   Handle<Struct> NewStruct(InstanceType type);
154 
155   Handle<AccessorInfo> NewAccessorInfo();
156 
157   Handle<Script> NewScript(Handle<String> source);
158 
159   // Proxies are pretenured when allocated by the bootstrapper.
160   Handle<Proxy> NewProxy(Address addr,
161                          PretenureFlag pretenure = NOT_TENURED);
162 
163   // Allocate a new proxy.  The proxy is pretenured (allocated directly in
164   // the old generation).
165   Handle<Proxy> NewProxy(const AccessorDescriptor* proxy);
166 
167   Handle<ByteArray> NewByteArray(int length,
168                                  PretenureFlag pretenure = NOT_TENURED);
169 
170   Handle<ExternalArray> NewExternalArray(
171       int length,
172       ExternalArrayType array_type,
173       void* external_pointer,
174       PretenureFlag pretenure = NOT_TENURED);
175 
176   Handle<JSGlobalPropertyCell> NewJSGlobalPropertyCell(
177       Handle<Object> value);
178 
179   Handle<Map> NewMap(InstanceType type, int instance_size);
180 
181   Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
182 
183   Handle<Map> CopyMapDropDescriptors(Handle<Map> map);
184 
185   // Copy the map adding more inobject properties if possible without
186   // overflowing the instance size.
187   Handle<Map> CopyMap(Handle<Map> map, int extra_inobject_props);
188 
189   Handle<Map> CopyMapDropTransitions(Handle<Map> map);
190 
191   Handle<Map> GetFastElementsMap(Handle<Map> map);
192 
193   Handle<Map> GetSlowElementsMap(Handle<Map> map);
194 
195   Handle<Map> GetExternalArrayElementsMap(Handle<Map> map,
196                                           ExternalArrayType array_type,
197                                           bool safe_to_add_transition);
198 
199   Handle<FixedArray> CopyFixedArray(Handle<FixedArray> array);
200 
201   // Numbers (eg, literals) are pretenured by the parser.
202   Handle<Object> NewNumber(double value,
203                            PretenureFlag pretenure = NOT_TENURED);
204 
205   Handle<Object> NewNumberFromInt(int value);
206   Handle<Object> NewNumberFromUint(uint32_t value);
207 
208   // These objects are used by the api to create env-independent data
209   // structures in the heap.
210   Handle<JSObject> NewNeanderObject();
211 
212   Handle<JSObject> NewArgumentsObject(Handle<Object> callee, int length);
213 
214   // JS objects are pretenured when allocated by the bootstrapper and
215   // runtime.
216   Handle<JSObject> NewJSObject(Handle<JSFunction> constructor,
217                                PretenureFlag pretenure = NOT_TENURED);
218 
219   // Global objects are pretenured.
220   Handle<GlobalObject> NewGlobalObject(Handle<JSFunction> constructor);
221 
222   // JS objects are pretenured when allocated by the bootstrapper and
223   // runtime.
224   Handle<JSObject> NewJSObjectFromMap(Handle<Map> map);
225 
226   // JS arrays are pretenured when allocated by the parser.
227   Handle<JSArray> NewJSArray(int capacity,
228                              PretenureFlag pretenure = NOT_TENURED);
229 
230   Handle<JSArray> NewJSArrayWithElements(
231       Handle<FixedArray> elements,
232       PretenureFlag pretenure = NOT_TENURED);
233 
234   Handle<JSFunction> NewFunction(Handle<String> name,
235                                  Handle<Object> prototype);
236 
237   Handle<JSFunction> NewFunctionWithoutPrototype(
238       Handle<String> name,
239       StrictModeFlag strict_mode);
240 
241   Handle<JSFunction> NewFunction(Handle<Object> super, bool is_global);
242 
243   Handle<JSFunction> BaseNewFunctionFromSharedFunctionInfo(
244       Handle<SharedFunctionInfo> function_info,
245       Handle<Map> function_map,
246       PretenureFlag pretenure);
247 
248   Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
249       Handle<SharedFunctionInfo> function_info,
250       Handle<Context> context,
251       PretenureFlag pretenure = TENURED);
252 
253   Handle<Code> NewCode(const CodeDesc& desc,
254                        Code::Flags flags,
255                        Handle<Object> self_reference,
256                        bool immovable = false);
257 
258   Handle<Code> CopyCode(Handle<Code> code);
259 
260   Handle<Code> CopyCode(Handle<Code> code, Vector<byte> reloc_info);
261 
262   Handle<Object> ToObject(Handle<Object> object);
263   Handle<Object> ToObject(Handle<Object> object,
264                           Handle<Context> global_context);
265 
266   // Interface for creating error objects.
267 
268   Handle<Object> NewError(const char* maker, const char* type,
269                           Handle<JSArray> args);
270   Handle<Object> NewError(const char* maker, const char* type,
271                           Vector< Handle<Object> > args);
272   Handle<Object> NewError(const char* type,
273                           Vector< Handle<Object> > args);
274   Handle<Object> NewError(Handle<String> message);
275   Handle<Object> NewError(const char* constructor,
276                           Handle<String> message);
277 
278   Handle<Object> NewTypeError(const char* type,
279                               Vector< Handle<Object> > args);
280   Handle<Object> NewTypeError(Handle<String> message);
281 
282   Handle<Object> NewRangeError(const char* type,
283                                Vector< Handle<Object> > args);
284   Handle<Object> NewRangeError(Handle<String> message);
285 
286   Handle<Object> NewSyntaxError(const char* type, Handle<JSArray> args);
287   Handle<Object> NewSyntaxError(Handle<String> message);
288 
289   Handle<Object> NewReferenceError(const char* type,
290                                    Vector< Handle<Object> > args);
291   Handle<Object> NewReferenceError(Handle<String> message);
292 
293   Handle<Object> NewEvalError(const char* type,
294                               Vector< Handle<Object> > args);
295 
296 
297   Handle<JSFunction> NewFunction(Handle<String> name,
298                                  InstanceType type,
299                                  int instance_size,
300                                  Handle<Code> code,
301                                  bool force_initial_map);
302 
303   Handle<JSFunction> NewFunction(Handle<Map> function_map,
304       Handle<SharedFunctionInfo> shared, Handle<Object> prototype);
305 
306 
307   Handle<JSFunction> NewFunctionWithPrototype(Handle<String> name,
308                                               InstanceType type,
309                                               int instance_size,
310                                               Handle<JSObject> prototype,
311                                               Handle<Code> code,
312                                               bool force_initial_map);
313 
314   Handle<JSFunction> NewFunctionWithoutPrototype(Handle<String> name,
315                                                  Handle<Code> code);
316 
317   Handle<DescriptorArray> CopyAppendProxyDescriptor(
318       Handle<DescriptorArray> array,
319       Handle<String> key,
320       Handle<Object> value,
321       PropertyAttributes attributes);
322 
323   Handle<String> NumberToString(Handle<Object> number);
324 
325   enum ApiInstanceType {
326     JavaScriptObject,
327     InnerGlobalObject,
328     OuterGlobalObject
329   };
330 
331   Handle<JSFunction> CreateApiFunction(
332       Handle<FunctionTemplateInfo> data,
333       ApiInstanceType type = JavaScriptObject);
334 
335   Handle<JSFunction> InstallMembers(Handle<JSFunction> function);
336 
337   // Installs interceptors on the instance.  'desc' is a function template,
338   // and instance is an object instance created by the function of this
339   // function template.
340   void ConfigureInstance(Handle<FunctionTemplateInfo> desc,
341                          Handle<JSObject> instance,
342                          bool* pending_exception);
343 
344 #define ROOT_ACCESSOR(type, name, camel_name)                                  \
345   inline Handle<type> name() {                                                 \
346     return Handle<type>(BitCast<type**>(                                       \
347         &isolate()->heap()->roots_[Heap::k##camel_name##RootIndex]));          \
348   }
349   ROOT_LIST(ROOT_ACCESSOR)
350 #undef ROOT_ACCESSOR_ACCESSOR
351 
352 #define SYMBOL_ACCESSOR(name, str)                                             \
353   inline Handle<String> name() {                                               \
354     return Handle<String>(BitCast<String**>(                                   \
355         &isolate()->heap()->roots_[Heap::k##name##RootIndex]));                \
356   }
SYMBOL_LIST(SYMBOL_ACCESSOR)357   SYMBOL_LIST(SYMBOL_ACCESSOR)
358 #undef SYMBOL_ACCESSOR
359 
360   Handle<String> hidden_symbol() {
361     return Handle<String>(&isolate()->heap()->hidden_symbol_);
362   }
363 
364   Handle<SharedFunctionInfo> NewSharedFunctionInfo(
365       Handle<String> name,
366       int number_of_literals,
367       Handle<Code> code,
368       Handle<SerializedScopeInfo> scope_info);
369   Handle<SharedFunctionInfo> NewSharedFunctionInfo(Handle<String> name);
370 
371   Handle<JSMessageObject> NewJSMessageObject(
372       Handle<String> type,
373       Handle<JSArray> arguments,
374       int start_position,
375       int end_position,
376       Handle<Object> script,
377       Handle<Object> stack_trace,
378       Handle<Object> stack_frames);
379 
380   Handle<NumberDictionary> DictionaryAtNumberPut(
381       Handle<NumberDictionary>,
382       uint32_t key,
383       Handle<Object> value);
384 
385 #ifdef ENABLE_DEBUGGER_SUPPORT
386   Handle<DebugInfo> NewDebugInfo(Handle<SharedFunctionInfo> shared);
387 #endif
388 
389   // Return a map using the map cache in the global context.
390   // The key the an ordered set of property names.
391   Handle<Map> ObjectLiteralMapFromCache(Handle<Context> context,
392                                         Handle<FixedArray> keys);
393 
394   // Creates a new FixedArray that holds the data associated with the
395   // atom regexp and stores it in the regexp.
396   void SetRegExpAtomData(Handle<JSRegExp> regexp,
397                          JSRegExp::Type type,
398                          Handle<String> source,
399                          JSRegExp::Flags flags,
400                          Handle<Object> match_pattern);
401 
402   // Creates a new FixedArray that holds the data associated with the
403   // irregexp regexp and stores it in the regexp.
404   void SetRegExpIrregexpData(Handle<JSRegExp> regexp,
405                              JSRegExp::Type type,
406                              Handle<String> source,
407                              JSRegExp::Flags flags,
408                              int capture_count);
409 
410  private:
isolate()411   Isolate* isolate() { return reinterpret_cast<Isolate*>(this); }
412 
413   Handle<JSFunction> NewFunctionHelper(Handle<String> name,
414                                        Handle<Object> prototype);
415 
416   Handle<JSFunction> NewFunctionWithoutPrototypeHelper(
417       Handle<String> name,
418       StrictModeFlag strict_mode);
419 
420   Handle<DescriptorArray> CopyAppendCallbackDescriptors(
421       Handle<DescriptorArray> array,
422       Handle<Object> descriptors);
423 
424   // Create a new map cache.
425   Handle<MapCache> NewMapCache(int at_least_space_for);
426 
427   // Update the map cache in the global context with (keys, map)
428   Handle<MapCache> AddToMapCache(Handle<Context> context,
429                                  Handle<FixedArray> keys,
430                                  Handle<Map> map);
431 };
432 
433 
434 } }  // namespace v8::internal
435 
436 #endif  // V8_FACTORY_H_
437