OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 30 matching lines...) Expand all Loading... | |
41 | 41 |
42 template<typename Map> | 42 template<typename Map> |
43 static void disposeMapWithUnsafePersistentValues(Map* map) | 43 static void disposeMapWithUnsafePersistentValues(Map* map) |
44 { | 44 { |
45 typename Map::iterator it = map->begin(); | 45 typename Map::iterator it = map->begin(); |
46 for (; it != map->end(); ++it) | 46 for (; it != map->end(); ++it) |
47 it->value.dispose(); | 47 it->value.dispose(); |
48 map->clear(); | 48 map->clear(); |
49 } | 49 } |
50 | 50 |
51 V8PerContextData::V8PerContextData(v8::Handle<v8::Context> context, DOMWrapperWo rld* world) | |
52 : m_activityLogger(0) | |
53 , m_isolate(context->GetIsolate()) | |
54 , m_contextHolder(adoptPtr(new gin::ContextHolder(context->GetIsolate()))) | |
55 , m_world(world) | |
56 , m_context(m_isolate, context) | |
57 , m_customElementBindings(adoptPtr(new CustomElementBindingMap())) | |
58 { | |
59 m_contextHolder->SetContext(context); | |
60 context->SetAlignedPointerInEmbedderData(v8ContextPerContextDataIndex, this) ; | |
61 | |
62 v8::Context::Scope contextScope(context); | |
63 ASSERT(m_errorPrototype.isEmpty()); | |
64 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(context->Global ()->Get(v8AtomicString(m_isolate, "Error"))); | |
65 ASSERT(!object.IsEmpty()); | |
66 v8::Handle<v8::Value> prototypeValue = object->Get(v8AtomicString(m_isolate, "prototype")); | |
67 ASSERT(!prototypeValue.IsEmpty()); | |
68 m_errorPrototype.set(m_isolate, prototypeValue); | |
69 } | |
70 | |
51 V8PerContextData::~V8PerContextData() | 71 V8PerContextData::~V8PerContextData() |
52 { | 72 { |
53 v8::HandleScope handleScope(m_isolate); | 73 v8::HandleScope handleScope(m_isolate); |
54 V8PerContextDataHolder::from(m_context.newLocal(m_isolate))->setPerContextDa ta(0); | 74 context()->SetAlignedPointerInEmbedderData(v8ContextPerContextDataIndex, 0); |
55 | 75 |
56 disposeMapWithUnsafePersistentValues(&m_wrapperBoilerplates); | 76 disposeMapWithUnsafePersistentValues(&m_wrapperBoilerplates); |
57 disposeMapWithUnsafePersistentValues(&m_constructorMap); | 77 disposeMapWithUnsafePersistentValues(&m_constructorMap); |
58 m_customElementBindings.clear(); | 78 m_customElementBindings.clear(); |
59 } | 79 } |
60 | 80 |
61 #define V8_STORE_PRIMORDIAL(name, Name) \ | |
haraken
2014/02/28 11:14:05
This macro is used by only one place, so I inlined
| |
62 { \ | |
63 ASSERT(m_##name##Prototype.isEmpty()); \ | |
64 v8::Handle<v8::String> symbol = v8AtomicString(m_isolate, #Name); \ | |
65 if (symbol.IsEmpty()) \ | |
66 return false; \ | |
67 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(m_context.newLo cal(m_isolate)->Global()->Get(symbol)); \ | |
68 if (object.IsEmpty()) \ | |
69 return false; \ | |
70 v8::Handle<v8::Value> prototypeValue = object->Get(prototypeString); \ | |
71 if (prototypeValue.IsEmpty()) \ | |
72 return false; \ | |
73 m_##name##Prototype.set(m_isolate, prototypeValue); \ | |
74 } | |
75 | |
76 bool V8PerContextData::init() | |
haraken
2014/02/28 11:14:05
In reality, init() should not return false. Thus I
| |
77 { | |
78 v8::Handle<v8::Context> context = m_context.newLocal(m_isolate); | |
79 V8PerContextDataHolder::from(context)->setPerContextData(this); | |
80 | |
81 v8::Handle<v8::String> prototypeString = v8AtomicString(m_isolate, "prototyp e"); | |
82 if (prototypeString.IsEmpty()) | |
83 return false; | |
84 | |
85 V8_STORE_PRIMORDIAL(error, Error); | |
86 | |
87 return true; | |
88 } | |
89 | |
90 #undef V8_STORE_PRIMORDIAL | |
91 | |
92 v8::Local<v8::Object> V8PerContextData::createWrapperFromCacheSlowCase(const Wra pperTypeInfo* type) | 81 v8::Local<v8::Object> V8PerContextData::createWrapperFromCacheSlowCase(const Wra pperTypeInfo* type) |
93 { | 82 { |
94 ASSERT(!m_errorPrototype.isEmpty()); | 83 ASSERT(!m_errorPrototype.isEmpty()); |
95 | 84 |
96 v8::Context::Scope scope(m_context.newLocal(m_isolate)); | 85 v8::Context::Scope scope(context()); |
97 v8::Local<v8::Function> function = constructorForType(type); | 86 v8::Local<v8::Function> function = constructorForType(type); |
98 v8::Local<v8::Object> instanceTemplate = V8ObjectConstructor::newInstance(fu nction); | 87 v8::Local<v8::Object> instanceTemplate = V8ObjectConstructor::newInstance(fu nction); |
99 if (!instanceTemplate.IsEmpty()) { | 88 if (!instanceTemplate.IsEmpty()) { |
100 m_wrapperBoilerplates.set(type, UnsafePersistent<v8::Object>(m_isolate, instanceTemplate)); | 89 m_wrapperBoilerplates.set(type, UnsafePersistent<v8::Object>(m_isolate, instanceTemplate)); |
101 return instanceTemplate->Clone(); | 90 return instanceTemplate->Clone(); |
102 } | 91 } |
103 return v8::Local<v8::Object>(); | 92 return v8::Local<v8::Object>(); |
104 } | 93 } |
105 | 94 |
106 v8::Local<v8::Function> V8PerContextData::constructorForTypeSlowCase(const Wrapp erTypeInfo* type) | 95 v8::Local<v8::Function> V8PerContextData::constructorForTypeSlowCase(const Wrapp erTypeInfo* type) |
107 { | 96 { |
108 ASSERT(!m_errorPrototype.isEmpty()); | 97 ASSERT(!m_errorPrototype.isEmpty()); |
109 | 98 |
110 v8::Context::Scope scope(m_context.newLocal(m_isolate)); | 99 v8::Context::Scope scope(context()); |
111 v8::Handle<v8::FunctionTemplate> functionTemplate = type->domTemplate(m_isol ate, worldType(m_isolate)); | 100 v8::Handle<v8::FunctionTemplate> functionTemplate = type->domTemplate(m_isol ate, worldType(m_isolate)); |
112 // Getting the function might fail if we're running out of stack or memory. | 101 // Getting the function might fail if we're running out of stack or memory. |
113 v8::TryCatch tryCatch; | 102 v8::TryCatch tryCatch; |
114 v8::Local<v8::Function> function = functionTemplate->GetFunction(); | 103 v8::Local<v8::Function> function = functionTemplate->GetFunction(); |
115 if (function.IsEmpty()) | 104 if (function.IsEmpty()) |
116 return v8::Local<v8::Function>(); | 105 return v8::Local<v8::Function>(); |
117 | 106 |
118 if (type->parentClass) { | 107 if (type->parentClass) { |
119 v8::Local<v8::Object> prototypeTemplate = constructorForType(type->paren tClass); | 108 v8::Local<v8::Object> prototypeTemplate = constructorForType(type->paren tClass); |
120 if (prototypeTemplate.IsEmpty()) | 109 if (prototypeTemplate.IsEmpty()) |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
212 if (!data->IsString()) | 201 if (!data->IsString()) |
213 return -1; | 202 return -1; |
214 v8::String::Utf8Value utf8(data); | 203 v8::String::Utf8Value utf8(data); |
215 char* comma = strnstr(*utf8, ",", utf8.length()); | 204 char* comma = strnstr(*utf8, ",", utf8.length()); |
216 if (!comma) | 205 if (!comma) |
217 return -1; | 206 return -1; |
218 return atoi(comma + 1); | 207 return atoi(comma + 1); |
219 } | 208 } |
220 | 209 |
221 } // namespace WebCore | 210 } // namespace WebCore |
OLD | NEW |