| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 85a9295 commit c342bda
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1304,45 +1304,48 @@ Local<Value> MakeCallback(Environment* env, | |||
| 1304 | 1304 | ||
| 1305 | 1305 | ||
| 1306 | 1306 | Local<Value> MakeCallback(Isolate* isolate, | |
| 1307 | - Local<Object> recv, | ||
| 1308 | - const char* method, | ||
| 1309 | - int argc, | ||
| 1310 | - Local<Value> argv[]) { | ||
| 1307 | + Local<Object> recv, | ||
| 1308 | + const char* method, | ||
| 1309 | + int argc, | ||
| 1310 | + Local<Value> argv[]) { | ||
| 1311 | 1311 | EscapableHandleScope handle_scope(isolate); | |
| 1312 | - Local<Context> context = recv->CreationContext(); | ||
| 1313 | - Environment* env = Environment::GetCurrent(context); | ||
| 1314 | - Context::Scope context_scope(context); | ||
| 1312 | + Local<String> method_string = OneByteString(isolate, method); | ||
| 1315 | 1313 | return handle_scope.Escape( | |
| 1316 | - Local<Value>::New(isolate, MakeCallback(env, recv, method, argc, argv))); | ||
| 1314 | + MakeCallback(isolate, recv, method_string, argc, argv)); | ||
| 1317 | 1315 | } | |
| 1318 | 1316 | ||
| 1319 | 1317 | ||
| 1320 | 1318 | Local<Value> MakeCallback(Isolate* isolate, | |
| 1321 | - Local<Object> recv, | ||
| 1322 | - Local<String> symbol, | ||
| 1323 | - int argc, | ||
| 1324 | - Local<Value> argv[]) { | ||
| 1319 | + Local<Object> recv, | ||
| 1320 | + Local<String> symbol, | ||
| 1321 | + int argc, | ||
| 1322 | + Local<Value> argv[]) { | ||
| 1325 | 1323 | EscapableHandleScope handle_scope(isolate); | |
| 1326 | - Local<Context> context = recv->CreationContext(); | ||
| 1327 | - Environment* env = Environment::GetCurrent(context); | ||
| 1328 | - Context::Scope context_scope(context); | ||
| 1329 | - return handle_scope.Escape( | ||
| 1330 | - Local<Value>::New(isolate, MakeCallback(env, recv, symbol, argc, argv))); | ||
| 1324 | + Local<Value> callback_v = recv->Get(symbol); | ||
| 1325 | + if (callback_v.IsEmpty()) return Local<Value>(); | ||
| 1326 | + if (!callback_v->IsFunction()) return Local<Value>(); | ||
| 1327 | + Local<Function> callback = callback_v.As<Function>(); | ||
| 1328 | + return handle_scope.Escape(MakeCallback(isolate, recv, callback, argc, argv)); | ||
| 1331 | 1329 | } | |
| 1332 | 1330 | ||
| 1333 | 1331 | ||
| 1334 | 1332 | Local<Value> MakeCallback(Isolate* isolate, | |
| 1335 | - Local<Object> recv, | ||
| 1336 | - Local<Function> callback, | ||
| 1337 | - int argc, | ||
| 1338 | - Local<Value> argv[]) { | ||
| 1333 | + Local<Object> recv, | ||
| 1334 | + Local<Function> callback, | ||
| 1335 | + int argc, | ||
| 1336 | + Local<Value> argv[]) { | ||
| 1337 | + // Observe the following two subtleties: | ||
| 1338 | + // | ||
| 1339 | + // 1. The environment is retrieved from the callback function's context. | ||
| 1340 | + // 2. The context to enter is retrieved from the environment. | ||
| 1341 | + // | ||
| 1342 | + // Because of the AssignToContext() call in src/node_contextify.cc, | ||
| 1343 | + // the two contexts need not be the same. | ||
| 1339 | 1344 | EscapableHandleScope handle_scope(isolate); | |
| 1340 | - Local<Context> context = recv->CreationContext(); | ||
| 1341 | - Environment* env = Environment::GetCurrent(context); | ||
| 1342 | - Context::Scope context_scope(context); | ||
| 1343 | - return handle_scope.Escape(Local<Value>::New( | ||
| 1344 | - isolate, | ||
| 1345 | - MakeCallback(env, recv.As<Value>(), callback, argc, argv))); | ||
| 1345 | + Environment* env = Environment::GetCurrent(callback->CreationContext()); | ||
| 1346 | + Context::Scope context_scope(env->context()); | ||
| 1347 | + return handle_scope.Escape( | ||
| 1348 | + MakeCallback(env, recv.As<Value>(), callback, argc, argv)); | ||
| 1346 | 1349 | } | |
| 1347 | 1350 | ||
| 1348 | 1351 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -36,6 +36,10 @@ const recv = { | |||
| 36 | 36 | assert.strictEqual(42, makeCallback(recv, 'one')); | |
| 37 | 37 | assert.strictEqual(42, makeCallback(recv, 'two', 1337)); | |
| 38 | 38 | ||
| 39 | + // Check that callbacks on a receiver from a different context works. | ||
| 40 | + const foreignObject = vm.runInNewContext('({ fortytwo() { return 42; } })'); | ||
| 41 | + assert.strictEqual(42, makeCallback(foreignObject, 'fortytwo')); | ||
| 42 | + | ||
| 39 | 43 | // Check that the callback is made in the context of the receiver. | |
| 40 | 44 | const target = vm.runInNewContext(` | |
| 41 | 45 | (function($Object) { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments