|
42 | 42 | #include "module-engine.h" |
43 | 43 | #include "widget.h" |
44 | 44 | #include "libscript/script.h" |
| 45 | +#include "filepath.h" |
| 46 | +#include "osspec.h" |
45 | 47 |
|
46 | 48 | //////////////////////////////////////////////////////////////////////////////// |
47 | 49 |
|
@@ -541,14 +543,35 @@ extern "C" MC_DLLEXPORT_DEF MCValueRef MCEngineExecSendToScriptObject(bool p_is_ |
541 | 543 | extern MCWidgetRef MCcurrentwidget; |
542 | 544 | extern void MCWidgetExecPostToParentWithArguments(MCStringRef p_message, MCProperListRef p_arguments); |
543 | 545 |
|
544 | | -extern "C" MC_DLLEXPORT_DEF MCValueRef MCEngineExecSendWithArguments(bool p_is_function, MCStringRef p_message, MCProperListRef p_arguments) |
| 546 | +MCObject* MCEngineCurrentContextObject(void) |
545 | 547 | { |
546 | | - // PM-2017-10-31: [[ Bugfix 20625 ]] May have no default stack on startup |
547 | | - if (!MCdefaultstackptr) |
548 | | - return nil; |
549 | | - MCObject *t_target = MCdefaultstackptr -> getcurcard(); |
| 548 | + MCObject *t_object = nullptr; |
550 | 549 | if (MCcurrentwidget) |
551 | | - t_target = MCWidgetGetHost(MCcurrentwidget); |
| 550 | + { |
| 551 | + t_object = MCWidgetGetHost(MCcurrentwidget); |
| 552 | + } |
| 553 | + else if (MCdefaultstackptr) |
| 554 | + { |
| 555 | + t_object = MCdefaultstackptr->getcurcard(); |
| 556 | + } |
| 557 | + |
| 558 | + if (t_object == nullptr) |
| 559 | + { |
| 560 | + MCErrorCreateAndThrow(kMCGenericErrorTypeInfo, "reason", MCSTR("no default stack"), nil); |
| 561 | + return nullptr; |
| 562 | + } |
| 563 | + |
| 564 | + return t_object; |
| 565 | +} |
| 566 | + |
| 567 | +extern "C" MC_DLLEXPORT_DEF MCValueRef MCEngineExecSendWithArguments(bool p_is_function, MCStringRef p_message, MCProperListRef p_arguments) |
| 568 | +{ |
| 569 | + MCObject *t_target = MCEngineCurrentContextObject(); |
| 570 | + |
| 571 | + if (t_target == nullptr) |
| 572 | + { |
| 573 | + return nullptr; |
| 574 | + } |
552 | 575 |
|
553 | 576 | return MCEngineDoSendToObjectWithArguments(p_is_function, p_message, t_target, p_arguments); |
554 | 577 | } |
@@ -598,22 +621,18 @@ extern "C" MC_DLLEXPORT_DEF void MCEngineExecPostToScriptObject(MCStringRef p_me |
598 | 621 |
|
599 | 622 | extern "C" MC_DLLEXPORT_DEF void MCEngineExecPostWithArguments(MCStringRef p_message, MCProperListRef p_arguments) |
600 | 623 | { |
601 | | - // PM-2017-10-31: [[ Bugfix 20625 ]] May have no default stack on startup |
602 | | - if (!MCdefaultstackptr) |
603 | | - return; |
604 | | - |
605 | | - MCObject *t_target = MCdefaultstackptr -> getcurcard(); |
606 | | - if (MCcurrentwidget) |
| 624 | + if (MCcurrentwidget && !MCWidgetIsRoot(MCcurrentwidget)) |
607 | 625 | { |
608 | | - if (!MCWidgetIsRoot(MCcurrentwidget)) |
609 | | - { |
610 | | - MCWidgetExecPostToParentWithArguments(p_message, p_arguments); |
611 | | - return; |
612 | | - } |
613 | | - t_target = MCWidgetGetHost(MCcurrentwidget); |
| 626 | + MCWidgetExecPostToParentWithArguments(p_message, p_arguments); |
| 627 | + return; |
614 | 628 | } |
615 | 629 |
|
616 | | - MCEngineDoPostToObjectWithArguments(p_message, t_target, p_arguments); |
| 630 | + MCObject *t_target = MCEngineCurrentContextObject(); |
| 631 | + |
| 632 | + if (t_target != nullptr) |
| 633 | + { |
| 634 | + MCEngineDoPostToObjectWithArguments(p_message, t_target, p_arguments); |
| 635 | + } |
617 | 636 | } |
618 | 637 |
|
619 | 638 | extern "C" MC_DLLEXPORT_DEF void MCEngineExecPost(MCStringRef p_message) |
@@ -646,13 +665,12 @@ MCEngineDoExecuteScriptInObjectWithArguments(MCStringRef p_script, MCObject *p_o |
646 | 665 | { |
647 | 666 | if (p_object == nil) |
648 | 667 | { |
649 | | - if (!MCdefaultstackptr) |
650 | | - { |
651 | | - MCErrorCreateAndThrow(kMCGenericErrorTypeInfo, "reason", MCSTR("no default stack"), nil); |
652 | | - return nullptr; |
| 668 | + p_object = MCEngineCurrentContextObject(); |
| 669 | + |
| 670 | + if (p_object == nullptr) |
| 671 | + { |
| 672 | + return nullptr; |
653 | 673 | } |
654 | | - |
655 | | - p_object = MCdefaultstackptr->getcurcard(); |
656 | 674 | } |
657 | 675 |
|
658 | 676 | MCExecContext ctxt(p_object, nil, nil); |
@@ -1323,6 +1341,70 @@ MCEngineEvalKeyIsDown(uint8_t p_key, bool p_event, bool& r_down) |
1323 | 1341 |
|
1324 | 1342 | //////////////////////////////////////////////////////////////////////////////// |
1325 | 1343 |
|
| 1344 | + |
| 1345 | +static MCStringRef |
| 1346 | +MCEngineDoResolveFilePathRelativeToStack(MCStringRef p_filepath, MCStack *p_stack) |
| 1347 | +{ |
| 1348 | + if (!MCPathIsAbsolute(p_filepath)) |
| 1349 | + { |
| 1350 | + if (p_stack == nullptr) |
| 1351 | + { |
| 1352 | + MCObject *t_target = MCEngineCurrentContextObject(); |
| 1353 | + |
| 1354 | + if (t_target == nullptr) |
| 1355 | + { |
| 1356 | + return nullptr; |
| 1357 | + } |
| 1358 | + |
| 1359 | + p_stack = t_target->getstack(); |
| 1360 | + } |
| 1361 | + |
| 1362 | + // else try to resolve from stack file location |
| 1363 | + MCAutoStringRef t_resolved; |
| 1364 | + if (p_stack->resolve_relative_path(p_filepath, &t_resolved)) |
| 1365 | + { |
| 1366 | + return t_resolved.Take(); |
| 1367 | + } |
| 1368 | + |
| 1369 | + // else try to resolve from current folder |
| 1370 | + if (MCS_resolvepath(p_filepath, &t_resolved)) |
| 1371 | + { |
| 1372 | + return t_resolved.Take(); |
| 1373 | + } |
| 1374 | + } |
| 1375 | + |
| 1376 | + return MCValueRetain(p_filepath);; |
| 1377 | +} |
| 1378 | + |
| 1379 | +extern "C" MC_DLLEXPORT_DEF MCStringRef MCEngineExecResolveFilePathRelativeToObject(MCStringRef p_filepath, MCScriptObjectRef p_object) |
| 1380 | +{ |
| 1381 | + if (!MCEngineEnsureScriptObjectAccessIsAllowed()) |
| 1382 | + return nullptr; |
| 1383 | + |
| 1384 | + MCStack *t_stack = nullptr; |
| 1385 | + if (p_object != nullptr) |
| 1386 | + { |
| 1387 | + MCObject *t_object = nullptr; |
| 1388 | + uint32_t t_part_id = 0; |
| 1389 | + if (!MCEngineEvalObjectOfScriptObject(p_object, t_object, t_part_id)) |
| 1390 | + return nullptr; |
| 1391 | + |
| 1392 | + t_stack = t_object->getstack(); |
| 1393 | + } |
| 1394 | + |
| 1395 | + return MCEngineDoResolveFilePathRelativeToStack(p_filepath, t_stack); |
| 1396 | +} |
| 1397 | + |
| 1398 | +extern "C" MC_DLLEXPORT_DEF MCStringRef MCEngineExecResolveFilePath(MCStringRef p_filepath) |
| 1399 | +{ |
| 1400 | + if (!MCEngineEnsureScriptObjectAccessIsAllowed()) |
| 1401 | + return nullptr; |
| 1402 | + |
| 1403 | + return MCEngineDoResolveFilePathRelativeToStack(p_filepath, nullptr); |
| 1404 | +} |
| 1405 | + |
| 1406 | +//////////////////////////////////////////////////////////////////////////////// |
| 1407 | + |
1326 | 1408 | MC_DLLEXPORT_DEF MCTypeInfoRef kMCEngineScriptObjectDoesNotExistErrorTypeInfo = nil; |
1327 | 1409 | MC_DLLEXPORT_DEF MCTypeInfoRef kMCEngineScriptObjectNoContextErrorTypeInfo = nil; |
1328 | 1410 |
|
|
0 commit comments