| 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 |