OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <errno.h> | 5 #include <errno.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <string.h> | 7 #include <string.h> |
8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 | 219 |
220 | 220 |
221 v8::Platform* g_platform = NULL; | 221 v8::Platform* g_platform = NULL; |
222 | 222 |
223 static Local<Value> Throw(Isolate* isolate, const char* message) { | 223 static Local<Value> Throw(Isolate* isolate, const char* message) { |
224 return isolate->ThrowException( | 224 return isolate->ThrowException( |
225 String::NewFromUtf8(isolate, message, NewStringType::kNormal) | 225 String::NewFromUtf8(isolate, message, NewStringType::kNormal) |
226 .ToLocalChecked()); | 226 .ToLocalChecked()); |
227 } | 227 } |
228 | 228 |
229 | 229 Worker* GetWorkerFromEmbedderField(Isolate* isolate, Local<Object> object) { |
230 Worker* GetWorkerFromInternalField(Isolate* isolate, Local<Object> object) { | 230 if (object->EmbedderFieldCount() != 1) { |
231 if (object->InternalFieldCount() != 1) { | |
232 Throw(isolate, "this is not a Worker"); | 231 Throw(isolate, "this is not a Worker"); |
233 return NULL; | 232 return NULL; |
234 } | 233 } |
235 | 234 |
236 Worker* worker = | 235 Worker* worker = |
237 static_cast<Worker*>(object->GetAlignedPointerFromInternalField(0)); | 236 static_cast<Worker*>(object->GetAlignedPointerFromEmbedderField(0)); |
238 if (worker == NULL) { | 237 if (worker == NULL) { |
239 Throw(isolate, "Worker is defunct because main thread is terminating"); | 238 Throw(isolate, "Worker is defunct because main thread is terminating"); |
240 return NULL; | 239 return NULL; |
241 } | 240 } |
242 | 241 |
243 return worker; | 242 return worker; |
244 } | 243 } |
245 | 244 |
246 | 245 |
247 } // namespace | 246 } // namespace |
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 return; | 1139 return; |
1141 } | 1140 } |
1142 | 1141 |
1143 { | 1142 { |
1144 base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer()); | 1143 base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer()); |
1145 if (workers_.length() >= kMaxWorkers) { | 1144 if (workers_.length() >= kMaxWorkers) { |
1146 Throw(args.GetIsolate(), "Too many workers, I won't let you create more"); | 1145 Throw(args.GetIsolate(), "Too many workers, I won't let you create more"); |
1147 return; | 1146 return; |
1148 } | 1147 } |
1149 | 1148 |
1150 // Initialize the internal field to NULL; if we return early without | 1149 // Initialize the embedder field to NULL; if we return early without |
1151 // creating a new Worker (because the main thread is terminating) we can | 1150 // creating a new Worker (because the main thread is terminating) we can |
1152 // early-out from the instance calls. | 1151 // early-out from the instance calls. |
1153 args.Holder()->SetAlignedPointerInInternalField(0, NULL); | 1152 args.Holder()->SetAlignedPointerInEmbedderField(0, NULL); |
1154 | 1153 |
1155 if (!allow_new_workers_) return; | 1154 if (!allow_new_workers_) return; |
1156 | 1155 |
1157 Worker* worker = new Worker; | 1156 Worker* worker = new Worker; |
1158 args.Holder()->SetAlignedPointerInInternalField(0, worker); | 1157 args.Holder()->SetAlignedPointerInEmbedderField(0, worker); |
1159 workers_.Add(worker); | 1158 workers_.Add(worker); |
1160 | 1159 |
1161 String::Utf8Value script(args[0]); | 1160 String::Utf8Value script(args[0]); |
1162 if (!*script) { | 1161 if (!*script) { |
1163 Throw(args.GetIsolate(), "Can't get worker script"); | 1162 Throw(args.GetIsolate(), "Can't get worker script"); |
1164 return; | 1163 return; |
1165 } | 1164 } |
1166 worker->StartExecuteInThread(*script); | 1165 worker->StartExecuteInThread(*script); |
1167 } | 1166 } |
1168 } | 1167 } |
1169 | 1168 |
1170 | 1169 |
1171 void Shell::WorkerPostMessage(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1170 void Shell::WorkerPostMessage(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1172 Isolate* isolate = args.GetIsolate(); | 1171 Isolate* isolate = args.GetIsolate(); |
1173 HandleScope handle_scope(isolate); | 1172 HandleScope handle_scope(isolate); |
1174 | 1173 |
1175 if (args.Length() < 1) { | 1174 if (args.Length() < 1) { |
1176 Throw(isolate, "Invalid argument"); | 1175 Throw(isolate, "Invalid argument"); |
1177 return; | 1176 return; |
1178 } | 1177 } |
1179 | 1178 |
1180 Worker* worker = GetWorkerFromInternalField(isolate, args.Holder()); | 1179 Worker* worker = GetWorkerFromEmbedderField(isolate, args.Holder()); |
1181 if (!worker) { | 1180 if (!worker) { |
1182 return; | 1181 return; |
1183 } | 1182 } |
1184 | 1183 |
1185 Local<Value> message = args[0]; | 1184 Local<Value> message = args[0]; |
1186 Local<Value> transfer = | 1185 Local<Value> transfer = |
1187 args.Length() >= 2 ? args[1] : Local<Value>::Cast(Undefined(isolate)); | 1186 args.Length() >= 2 ? args[1] : Local<Value>::Cast(Undefined(isolate)); |
1188 std::unique_ptr<SerializationData> data = | 1187 std::unique_ptr<SerializationData> data = |
1189 Shell::SerializeValue(isolate, message, transfer); | 1188 Shell::SerializeValue(isolate, message, transfer); |
1190 if (data) { | 1189 if (data) { |
1191 worker->PostMessage(std::move(data)); | 1190 worker->PostMessage(std::move(data)); |
1192 } | 1191 } |
1193 } | 1192 } |
1194 | 1193 |
1195 | 1194 |
1196 void Shell::WorkerGetMessage(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1195 void Shell::WorkerGetMessage(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1197 Isolate* isolate = args.GetIsolate(); | 1196 Isolate* isolate = args.GetIsolate(); |
1198 HandleScope handle_scope(isolate); | 1197 HandleScope handle_scope(isolate); |
1199 Worker* worker = GetWorkerFromInternalField(isolate, args.Holder()); | 1198 Worker* worker = GetWorkerFromEmbedderField(isolate, args.Holder()); |
1200 if (!worker) { | 1199 if (!worker) { |
1201 return; | 1200 return; |
1202 } | 1201 } |
1203 | 1202 |
1204 std::unique_ptr<SerializationData> data = worker->GetMessage(); | 1203 std::unique_ptr<SerializationData> data = worker->GetMessage(); |
1205 if (data) { | 1204 if (data) { |
1206 Local<Value> value; | 1205 Local<Value> value; |
1207 if (Shell::DeserializeValue(isolate, std::move(data)).ToLocal(&value)) { | 1206 if (Shell::DeserializeValue(isolate, std::move(data)).ToLocal(&value)) { |
1208 args.GetReturnValue().Set(value); | 1207 args.GetReturnValue().Set(value); |
1209 } | 1208 } |
1210 } | 1209 } |
1211 } | 1210 } |
1212 | 1211 |
1213 | 1212 |
1214 void Shell::WorkerTerminate(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1213 void Shell::WorkerTerminate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1215 Isolate* isolate = args.GetIsolate(); | 1214 Isolate* isolate = args.GetIsolate(); |
1216 HandleScope handle_scope(isolate); | 1215 HandleScope handle_scope(isolate); |
1217 Worker* worker = GetWorkerFromInternalField(isolate, args.Holder()); | 1216 Worker* worker = GetWorkerFromEmbedderField(isolate, args.Holder()); |
1218 if (!worker) { | 1217 if (!worker) { |
1219 return; | 1218 return; |
1220 } | 1219 } |
1221 | 1220 |
1222 worker->Terminate(); | 1221 worker->Terminate(); |
1223 } | 1222 } |
1224 | 1223 |
1225 | 1224 |
1226 void Shell::QuitOnce(v8::FunctionCallbackInfo<v8::Value>* args) { | 1225 void Shell::QuitOnce(v8::FunctionCallbackInfo<v8::Value>* args) { |
1227 int exit_code = (*args)[0] | 1226 int exit_code = (*args)[0] |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1559 worker_fun_template->PrototypeTemplate()->Set( | 1558 worker_fun_template->PrototypeTemplate()->Set( |
1560 String::NewFromUtf8(isolate, "postMessage", NewStringType::kNormal) | 1559 String::NewFromUtf8(isolate, "postMessage", NewStringType::kNormal) |
1561 .ToLocalChecked(), | 1560 .ToLocalChecked(), |
1562 FunctionTemplate::New(isolate, WorkerPostMessage, Local<Value>(), | 1561 FunctionTemplate::New(isolate, WorkerPostMessage, Local<Value>(), |
1563 worker_signature)); | 1562 worker_signature)); |
1564 worker_fun_template->PrototypeTemplate()->Set( | 1563 worker_fun_template->PrototypeTemplate()->Set( |
1565 String::NewFromUtf8(isolate, "getMessage", NewStringType::kNormal) | 1564 String::NewFromUtf8(isolate, "getMessage", NewStringType::kNormal) |
1566 .ToLocalChecked(), | 1565 .ToLocalChecked(), |
1567 FunctionTemplate::New(isolate, WorkerGetMessage, Local<Value>(), | 1566 FunctionTemplate::New(isolate, WorkerGetMessage, Local<Value>(), |
1568 worker_signature)); | 1567 worker_signature)); |
1569 worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1); | 1568 worker_fun_template->InstanceTemplate()->SetEmbedderFieldCount(1); |
1570 global_template->Set( | 1569 global_template->Set( |
1571 String::NewFromUtf8(isolate, "Worker", NewStringType::kNormal) | 1570 String::NewFromUtf8(isolate, "Worker", NewStringType::kNormal) |
1572 .ToLocalChecked(), | 1571 .ToLocalChecked(), |
1573 worker_fun_template); | 1572 worker_fun_template); |
1574 | 1573 |
1575 Local<ObjectTemplate> os_templ = ObjectTemplate::New(isolate); | 1574 Local<ObjectTemplate> os_templ = ObjectTemplate::New(isolate); |
1576 AddOSMethods(isolate, os_templ); | 1575 AddOSMethods(isolate, os_templ); |
1577 global_template->Set( | 1576 global_template->Set( |
1578 String::NewFromUtf8(isolate, "os", NewStringType::kNormal) | 1577 String::NewFromUtf8(isolate, "os", NewStringType::kNormal) |
1579 .ToLocalChecked(), | 1578 .ToLocalChecked(), |
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3035 } | 3034 } |
3036 | 3035 |
3037 } // namespace v8 | 3036 } // namespace v8 |
3038 | 3037 |
3039 | 3038 |
3040 #ifndef GOOGLE3 | 3039 #ifndef GOOGLE3 |
3041 int main(int argc, char* argv[]) { | 3040 int main(int argc, char* argv[]) { |
3042 return v8::Shell::Main(argc, argv); | 3041 return v8::Shell::Main(argc, argv); |
3043 } | 3042 } |
3044 #endif | 3043 #endif |
OLD | NEW |