OLD | NEW |
---|---|
1 #!/usr/bin/env node | 1 #!/usr/bin/env node |
2 // ********** Library dart:core ************** | 2 // ********** Library dart:core ************** |
3 // ********** Natives core.js ************** | 3 // ********** Natives core.js ************** |
4 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 4 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
5 // for details. All rights reserved. Use of this source code is governed by a | 5 // for details. All rights reserved. Use of this source code is governed by a |
6 // BSD-style license that can be found in the LICENSE file. | 6 // BSD-style license that can be found in the LICENSE file. |
7 | 7 |
8 // TODO(jimhug): Completeness - see tests/corelib | 8 // TODO(jimhug): Completeness - see tests/corelib |
9 | 9 |
10 /** Implements extends for dart classes on javascript prototypes. */ | 10 /** Implements extends for dart classes on javascript prototypes. */ |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
325 } | 325 } |
326 | 326 |
327 function $varMethod(name, methods) { | 327 function $varMethod(name, methods) { |
328 Object.prototype[name] = function() { | 328 Object.prototype[name] = function() { |
329 $patchMethod(this, name, methods); | 329 $patchMethod(this, name, methods); |
330 this[name].apply(this, Array.prototype.slice.call(arguments)); | 330 this[name].apply(this, Array.prototype.slice.call(arguments)); |
331 }; | 331 }; |
332 } | 332 } |
333 | 333 |
334 Object.prototype.get$typeName = function() { | 334 Object.prototype.get$typeName = function() { |
335 // TODO(vsm): how can we make this go down the fast path for Chrome? | 335 // TODO(sigmund): find a way to make this work on all browsers, including |
336 //(for Chrome: return this.constructor.name;) | 336 // checking the typeName on prototype objects (so we can fix dynamic |
337 // dispatching on $varMethod). | |
338 if (window.constructor.name == 'DOMWindow') { // fast-path for Chrome | |
339 return this.constructor.name; | |
340 } | |
337 var str = Object.prototype.toString.call(this); | 341 var str = Object.prototype.toString.call(this); |
338 return str.substring(8, str.length - 1); | 342 return str.substring(8, str.length - 1); |
339 } | 343 } |
340 | 344 |
341 function $patchMethod(obj, name, methods) { | 345 function $patchMethod(obj, name, methods) { |
342 // Get the prototype to patch. | 346 // Get the prototype to patch. |
343 // Don't overwrite an existing stub, like the one on Object.prototype | 347 // Don't overwrite an existing stub, like the one on Object.prototype |
344 var proto = Object.getPrototypeOf(obj); | 348 var proto = Object.getPrototypeOf(obj); |
345 if (!proto || proto.hasOwnProperty(name)) proto = obj; | 349 if (!proto || proto.hasOwnProperty(name)) proto = obj; |
346 var method; | 350 var method; |
347 while (obj && !(method = methods[obj.get$typeName()])) { | 351 while (obj && !(method = methods[obj.get$typeName()])) { |
348 obj = Object.getPrototypeOf(obj); | 352 obj = Object.getPrototypeOf(obj); |
349 } | 353 } |
350 Object.defineProperty(proto, name, {value: method || methods['Object']}); | 354 obj[name] = method || methods['Object']; |
351 } | 355 } |
352 // ********** Code for Clock ************** | 356 // ********** Code for Clock ************** |
353 function Clock() {} | 357 function Clock() {} |
354 Clock.now = function() { | 358 Clock.now = function() { |
355 return new Date().getTime(); | 359 return new Date().getTime(); |
356 } | 360 } |
357 Clock.frequency = function() { | 361 Clock.frequency = function() { |
358 return 1000; | 362 return 1000; |
359 } | 363 } |
360 // ********** Code for AssertError ************** | 364 // ********** Code for AssertError ************** |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
508 function print(obj) { | 512 function print(obj) { |
509 if (typeof console == 'object') { | 513 if (typeof console == 'object') { |
510 if (obj) obj = obj.toString(); | 514 if (obj) obj = obj.toString(); |
511 console.log(obj); | 515 console.log(obj); |
512 } else { | 516 } else { |
513 write(obj); | 517 write(obj); |
514 write('\n'); | 518 write('\n'); |
515 } | 519 } |
516 } | 520 } |
517 // ********** Library dart:coreimpl ************** | 521 // ********** Library dart:coreimpl ************** |
522 // ********** Natives isolate.js ************** | |
523 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
524 // for details. All rights reserved. Use of this source code is governed by a | |
525 // BSD-style license that can be found in the LICENSE file. | |
526 | |
527 var isolate$current = null; | |
528 var isolate$rootIsolate = null; // Will only be set in the main worker. | |
529 var isolate$inits = []; | |
530 var isolate$globalThis = this; | |
531 | |
532 var isolate$inWorker = | |
533 (typeof isolate$globalThis['importScripts']) != "undefined"; | |
534 var isolate$supportsWorkers = | |
535 isolate$inWorker || ((typeof isolate$globalThis['Worker']) != 'undefined'); | |
536 | |
537 var isolate$MAIN_WORKER_ID = 0; | |
538 // Non-main workers will update the id variable. | |
539 var isolate$thisWorkerId = isolate$MAIN_WORKER_ID; | |
540 | |
541 // Whether to use web workers when implementing isolates. | |
542 var isolate$useWorkers = isolate$supportsWorkers; | |
543 // Uncomment this to not use web workers even if they're available. | |
544 // isolate$useWorkers = false; | |
545 | |
546 // Whether to use the web-worker JSON-based message serialization protocol, | |
547 // even if not using web workers. | |
548 var isolate$useWorkerSerializationProtocol = false; | |
549 // Uncomment this to always use the web-worker JSON-based message | |
550 // serialization protocol, e.g. for testing purposes. | |
551 // isolate$useWorkerSerializationProtocol = true; | |
552 | |
553 | |
554 // ------- SendPort ------- | |
555 | |
556 function isolate$receiveMessage(port, isolate, | |
557 serializedMessage, serializedReplyTo) { | |
558 isolate$IsolateEvent.enqueue(isolate, function() { | |
559 var message = isolate$deserializeMessage(serializedMessage); | |
560 var replyTo = isolate$deserializeMessage(serializedReplyTo); | |
561 port._callback(message, replyTo); | |
562 }); | |
563 } | |
564 | |
565 // -------- Registry --------- | |
566 function isolate$Registry() { | |
567 this.map = {}; | |
568 this.count = 0; | |
569 } | |
570 | |
571 isolate$Registry.prototype.register = function(id, val) { | |
572 if (this.map[id]) { | |
573 throw Error("Registry: Elements must be registered only once."); | |
574 } | |
575 this.map[id] = val; | |
576 this.count++; | |
577 }; | |
578 | |
579 isolate$Registry.prototype.unregister = function(id) { | |
580 if (id in this.map) { | |
581 delete this.map[id]; | |
582 this.count--; | |
583 } | |
584 }; | |
585 | |
586 isolate$Registry.prototype.get = function(id) { | |
587 return this.map[id]; | |
588 }; | |
589 | |
590 isolate$Registry.prototype.isEmpty = function() { | |
591 return this.count === 0; | |
592 }; | |
593 | |
594 | |
595 // ------- Worker registry ------- | |
596 // Only used in the main worker. | |
597 var isolate$workerRegistry = new isolate$Registry(); | |
598 | |
599 // ------- Isolate registry ------- | |
600 // Isolates must be registered if, and only if, receive ports are alive. | |
601 // Normally no open receive-ports means that the isolate is dead, but | |
602 // DOM callbacks could resurrect it. | |
603 var isolate$isolateRegistry = new isolate$Registry(); | |
604 | |
605 // ------- Debugging log function ------- | |
606 function isolate$log(msg) { | |
607 return; | |
608 if (isolate$inWorker) { | |
609 isolate$mainWorker.postMessage({ command: 'log', msg: msg }); | |
610 } else { | |
611 try { | |
612 isolate$globalThis.console.log(msg); | |
613 } catch(e) { | |
614 throw String(e.stack); | |
615 } | |
616 } | |
617 } | |
618 | |
619 function isolate$initializeWorker(workerId) { | |
620 isolate$thisWorkerId = workerId; | |
621 } | |
622 | |
623 var isolate$workerPrint = false; | |
624 if (isolate$inWorker) { | |
625 isolate$workerPrint = function(msg){ | |
626 isolate$mainWorker.postMessage({ command: 'print', msg: msg }); | |
627 } | |
628 } | |
629 | |
630 // ------- Message handler ------- | |
631 function isolate$processWorkerMessage(sender, e) { | |
632 var msg = e.data; | |
633 switch (msg.command) { | |
634 case 'start': | |
635 isolate$log("starting worker: " + msg.id + " " + msg.factoryName); | |
636 isolate$initializeWorker(msg.id); | |
637 var runnerObject = new (isolate$globalThis[msg.factoryName])(); | |
638 var serializedReplyTo = msg.replyTo; | |
639 isolate$IsolateEvent.enqueue(new isolate$Isolate(), function() { | |
640 var replyTo = isolate$deserializeMessage(serializedReplyTo); | |
641 _IsolateJsUtil._startIsolate(runnerObject, replyTo); | |
642 }); | |
643 isolate$runEventLoop(); | |
644 break; | |
645 case 'spawn-worker': | |
646 isolate$spawnWorker(msg.factoryName, msg.replyPort); | |
647 break; | |
648 case 'message': | |
649 IsolateNatives.sendMessage( | |
650 msg.workerId, msg.isolateId, msg.portId, msg.msg, msg.replyTo); | |
651 isolate$runEventLoop(); | |
652 break; | |
653 case 'close': | |
654 isolate$log("Closing Worker"); | |
655 isolate$workerRegistry.unregister(sender.id); | |
656 sender.terminate(); | |
657 isolate$runEventLoop(); | |
658 break; | |
659 case 'log': | |
660 isolate$log(msg.msg); | |
661 break; | |
662 case 'print': | |
663 _IsolateJsUtil._print(msg.msg); | |
664 break; | |
665 case 'error': | |
666 throw msg.msg; | |
667 break; | |
668 } | |
669 } | |
670 | |
671 | |
672 if (isolate$supportsWorkers) { | |
673 isolate$globalThis.onmessage = function(e) { | |
674 isolate$processWorkerMessage(isolate$mainWorker, e); | |
675 }; | |
676 } | |
677 | |
678 // ------- Default Worker ------- | |
679 function isolate$MainWorker() { | |
680 this.id = isolate$MAIN_WORKER_ID; | |
681 } | |
682 | |
683 var isolate$mainWorker = new isolate$MainWorker(); | |
684 isolate$mainWorker.postMessage = function(msg) { | |
685 isolate$globalThis.postMessage(msg); | |
686 }; | |
687 | |
688 var isolate$nextFreeIsolateId = 1; | |
689 | |
690 // Native methods for isolate functionality. | |
691 /** | |
692 * @constructor | |
693 */ | |
694 function isolate$Isolate() { | |
695 // The isolate ids is only unique within the current worker and frame. | |
696 this.id = isolate$nextFreeIsolateId++; | |
697 // When storing information on DOM nodes the isolate's id is not enough. | |
698 // We instead use a token with a hashcode. The token can be stored in the | |
699 // DOM node (since it is small and will not keep much data alive). | |
700 this.token = new Object(); | |
701 this.token.hashCode = (Math.random() * 0xFFFFFFF) >>> 0; | |
702 this.receivePorts = new isolate$Registry(); | |
703 this.run(function() { | |
704 // The Dart-to-JavaScript compiler builds a list of functions that | |
705 // need to run for each isolate to setup the state of static | |
706 // variables. Run through the list and execute each function. | |
707 for (var i = 0, len = isolate$inits.length; i < len; i++) { | |
708 isolate$inits[i](); | |
709 } | |
710 }); | |
711 } | |
712 | |
713 // It is allowed to stack 'run' calls. The stacked isolates can be different. | |
714 // That is Isolate1.run could call the DOM which then calls Isolate2.run. | |
715 isolate$Isolate.prototype.run = function(code) { | |
716 var old = isolate$current; | |
717 isolate$current = this; | |
718 var result = null; | |
719 try { | |
720 result = code(); | |
721 } finally { | |
722 isolate$current = old; | |
723 } | |
724 return result; | |
725 }; | |
726 | |
727 isolate$Isolate.prototype.registerReceivePort = function(id, port) { | |
728 if (this.receivePorts.isEmpty()) { | |
729 isolate$isolateRegistry.register(this.id, this); | |
730 } | |
731 this.receivePorts.register(id, port); | |
732 }; | |
733 | |
734 isolate$Isolate.prototype.unregisterReceivePort = function(id) { | |
735 this.receivePorts.unregister(id); | |
736 if (this.receivePorts.isEmpty()) { | |
737 isolate$isolateRegistry.unregister(this.id); | |
738 } | |
739 }; | |
740 | |
741 isolate$Isolate.prototype.getReceivePortForId = function(id) { | |
742 return this.receivePorts.get(id); | |
743 }; | |
744 | |
745 var isolate$events = []; | |
746 | |
747 /** | |
748 * @constructor | |
749 */ | |
750 function isolate$IsolateEvent(isolate, fn) { | |
751 this.isolate = isolate; | |
752 this.fn = fn; | |
753 } | |
754 | |
755 isolate$IsolateEvent.prototype.process = function() { | |
756 this.isolate.run(this.fn); | |
757 }; | |
758 | |
759 isolate$IsolateEvent.enqueue = function(isolate, fn) { | |
760 isolate$events.push(new isolate$IsolateEvent(isolate, fn)); | |
761 }; | |
762 | |
763 | |
764 isolate$IsolateEvent.dequeue = function() { | |
765 if (isolate$events.length == 0) return null; | |
766 var result = isolate$events[0]; | |
767 isolate$events.splice(0, 1); | |
768 return result; | |
769 }; | |
770 | |
771 function IsolateNatives() {} | |
772 | |
773 IsolateNatives.sendMessage = function (workerId, isolateId, receivePortId, | |
774 message, replyTo) { | |
775 // Both, the message and the replyTo are already serialized. | |
776 if (workerId == isolate$thisWorkerId) { | |
777 var isolate = isolate$isolateRegistry.get(isolateId); | |
778 if (!isolate) return; // Isolate has been closed. | |
779 var receivePort = isolate.getReceivePortForId(receivePortId); | |
780 if (!receivePort) return; // ReceivePort has been closed. | |
781 isolate$receiveMessage(receivePort, isolate, message, replyTo); | |
782 } else { | |
783 var worker; | |
784 if (isolate$inWorker) { | |
785 worker = isolate$mainWorker; | |
786 } else { | |
787 worker = isolate$workerRegistry.get(workerId); | |
788 } | |
789 worker.postMessage({ command: 'message', | |
790 workerId: workerId, | |
791 isolateId: isolateId, | |
792 portId: receivePortId, | |
793 msg: message, | |
794 replyTo: replyTo }); | |
795 } | |
796 } | |
797 | |
798 // Wrap a 0-arg dom-callback to bind it with the current isolate: | |
799 function $wrap_call$0(fn) { return fn && fn.wrap$call$0(); } | |
800 Function.prototype.wrap$call$0 = function() { | |
801 var isolate = isolate$current; | |
802 var self = this; | |
803 this.wrap$0 = function() { | |
804 isolate.run(function() { | |
805 self(); | |
806 }); | |
807 isolate$runEventLoop(); | |
808 }; | |
809 this.wrap$call$0 = function() { return this.wrap$0; }; | |
810 return this.wrap$0; | |
811 } | |
812 | |
813 // Wrap a 1-arg dom-callback to bind it with the current isolate: | |
814 function $wrap_call$1(fn) { return fn && fn.wrap$call$1(); } | |
815 Function.prototype.wrap$call$1 = function() { | |
816 var isolate = isolate$current; | |
817 var self = this; | |
818 this.wrap$1 = function(arg) { | |
819 isolate.run(function() { | |
820 self(arg); | |
821 }); | |
822 isolate$runEventLoop(); | |
823 }; | |
824 this.wrap$call$1 = function() { return this.wrap$1; }; | |
825 return this.wrap$1; | |
826 } | |
827 | |
828 IsolateNatives._spawn = function(runnable, light, replyPort) { | |
829 // TODO(floitsch): throw exception if runnable's class doesn't have a | |
830 // default constructor. | |
831 if (isolate$useWorkers && !light) { | |
832 isolate$startWorker(runnable, replyPort); | |
833 } else { | |
834 isolate$startNonWorker(runnable, replyPort); | |
835 } | |
836 } | |
837 | |
838 IsolateNatives.get$shouldSerialize = function() { | |
839 return isolate$useWorkers || isolate$useWorkerSerializationProtocol; | |
840 } | |
841 | |
842 IsolateNatives.registerPort = function(id, port) { | |
843 isolate$current.registerReceivePort(id, port); | |
844 } | |
845 | |
846 IsolateNatives.unregisterPort = function(id) { | |
847 isolate$current.unregisterReceivePort(id); | |
848 } | |
849 | |
850 IsolateNatives._currentWorkerId = function() { | |
851 return isolate$thisWorkerId; | |
852 } | |
853 | |
854 IsolateNatives._currentIsolateId = function() { | |
855 return isolate$current.id; | |
856 } | |
857 | |
858 function isolate$startNonWorker(runnable, replyTo) { | |
859 // Spawn a new isolate and create the receive port in it. | |
860 var spawned = new isolate$Isolate(); | |
861 | |
862 // Instead of just running the provided runnable, we create a | |
863 // new cloned instance of it with a fresh state in the spawned | |
864 // isolate. This way, we do not get cross-isolate references | |
865 // through the runnable. | |
866 var ctor = runnable.constructor; | |
867 isolate$IsolateEvent.enqueue(spawned, function() { | |
868 _IsolateJsUtil._startIsolate(new ctor(), replyTo); | |
869 }); | |
870 } | |
871 | |
872 // This field is only used by the main worker. | |
873 var isolate$nextFreeWorkerId = isolate$thisWorkerId + 1; | |
874 | |
875 var isolate$thisScript = function() { | |
876 if (!isolate$supportsWorkers || isolate$inWorker) return null; | |
877 | |
878 // TODO(5334778): Find a cross-platform non-brittle way of getting the | |
879 // currently running script. | |
880 var scripts = document.getElementsByTagName('script'); | |
881 // The scripts variable only contains the scripts that have already been | |
882 // executed. The last one is the currently running script. | |
883 var script = scripts[scripts.length - 1]; | |
884 var src = script.src; | |
885 if (!src) { | |
886 // TODO() | |
887 src = "FIXME:5407062" + "_" + Math.random().toString(); | |
888 script.src = src; | |
889 } | |
890 return src; | |
891 }(); | |
892 | |
893 function isolate$startWorker(runnable, replyPort) { | |
894 // TODO(sigmund): make this browser independent | |
895 var factoryName = runnable.constructor.name; | |
896 var serializedReplyPort = isolate$serializeMessage(replyPort); | |
897 if (isolate$inWorker) { | |
898 isolate$mainWorker.postMessage({ command: 'spawn-worker', | |
899 factoryName: factoryName, | |
900 replyPort: serializedReplyPort } ); | |
901 } else { | |
902 isolate$spawnWorker(factoryName, serializedReplyPort); | |
903 } | |
904 } | |
905 | |
906 function isolate$spawnWorker(factoryName, serializedReplyPort) { | |
907 var worker = new Worker(isolate$thisScript); | |
908 worker.onmessage = function(e) { | |
909 isolate$processWorkerMessage(worker, e); | |
910 }; | |
911 var workerId = isolate$nextFreeWorkerId++; | |
912 // We also store the id on the worker itself so that we can unregister it. | |
913 worker.id = workerId; | |
914 isolate$workerRegistry.register(workerId, worker); | |
915 worker.postMessage({ command: 'start', | |
916 id: workerId, | |
917 replyTo: serializedReplyPort, | |
918 factoryName: factoryName }); | |
919 } | |
920 | |
921 function isolate$closeWorkerIfNecessary() { | |
922 if (!isolate$isolateRegistry.isEmpty()) return; | |
923 isolate$mainWorker.postMessage( { command: 'close' } ); | |
924 } | |
925 | |
926 function isolate$doOneEventLoopIteration() { | |
927 var CONTINUE_LOOP = true; | |
928 var STOP_LOOP = false; | |
929 var event = isolate$IsolateEvent.dequeue(); | |
930 if (!event) { | |
931 if (isolate$inWorker) { | |
932 isolate$closeWorkerIfNecessary(); | |
933 } else if (!isolate$isolateRegistry.isEmpty() && | |
934 isolate$workerRegistry.isEmpty() && | |
935 !isolate$supportsWorkers && (typeof(window) == 'undefined')) { | |
936 // This should only trigger when running on the command-line. | |
937 // We don't want this check to execute in the browser where the isolate | |
938 // might still be alive due to DOM callbacks. | |
939 // throw Error("Program exited with open ReceivePorts."); | |
940 } | |
941 return STOP_LOOP; | |
942 } else { | |
943 event.process(); | |
944 return CONTINUE_LOOP; | |
945 } | |
946 } | |
947 | |
948 function isolate$doRunEventLoop() { | |
949 if (typeof window != 'undefined' && window.setTimeout) { | |
950 (function next() { | |
951 var continueLoop = isolate$doOneEventLoopIteration(); | |
952 if (!continueLoop) return; | |
953 // TODO(kasperl): It might turn out to be too expensive to call | |
954 // setTimeout for every single event. This needs more investigation. | |
955 window.setTimeout(next, 0); | |
956 })(); | |
957 } else { | |
958 while (true) { | |
959 var continueLoop = isolate$doOneEventLoopIteration(); | |
960 if (!continueLoop) break; | |
961 } | |
962 } | |
963 } | |
964 | |
965 function isolate$runEventLoop() { | |
966 if (!isolate$inWorker) { | |
967 isolate$doRunEventLoop(); | |
968 } else { | |
969 try { | |
970 isolate$doRunEventLoop(); | |
971 } catch(e) { | |
972 // TODO(floitsch): try to send stack-trace to the other side. | |
973 isolate$mainWorker.postMessage({ command: 'error', msg: "" + e }); | |
974 } | |
975 } | |
976 } | |
977 | |
978 function RunEntry(entry, args) { | |
979 // Don't start the main loop again, if we are in a worker. | |
980 if (isolate$inWorker) return; | |
981 var isolate = new isolate$Isolate(); | |
982 isolate$rootIsolate = isolate; | |
983 isolate$IsolateEvent.enqueue(isolate, function() { | |
984 entry(args); | |
985 }); | |
986 isolate$runEventLoop(); | |
987 | |
988 // BUG(5151491): This should not be necessary, but because closures | |
989 // passed to the DOM as event handlers do not bind their isolate | |
990 // automatically we try to give them a reasonable context to live in | |
991 // by having a "default" isolate (the first one created). | |
992 isolate$current = isolate; | |
993 } | |
994 | |
995 // ------- Message Serializing and Deserializing ------- | |
996 | |
997 function isolate$serializeMessage(message) { | |
998 if (isolate$useWorkers || isolate$useWorkerSerializationProtocol) { | |
999 return _IsolateJsUtil._serializeObject(message); | |
1000 } else { | |
1001 return _IsolateJsUtil._copyObject(message); | |
1002 } | |
1003 } | |
1004 | |
1005 function isolate$deserializeMessage(message_) { | |
1006 if (isolate$useWorkers || isolate$useWorkerSerializationProtocol) { | |
1007 return _IsolateJsUtil._deserializeMessage(message_); | |
1008 } else { | |
1009 // Nothing more to do. | |
1010 return message_; | |
1011 } | |
1012 } | |
1013 | |
1014 function _IsolateJsUtil() {} | |
518 // ********** Code for ListFactory ************** | 1015 // ********** Code for ListFactory ************** |
519 ListFactory = Array; | 1016 ListFactory = Array; |
520 ListFactory.prototype.is$List = function(){return this;}; | 1017 ListFactory.prototype.is$List = function(){return this;}; |
521 ListFactory.prototype.is$List$ArgumentNode = function(){return this;}; | 1018 ListFactory.prototype.is$List$ArgumentNode = function(){return this;}; |
522 ListFactory.prototype.is$List$EvaluatedValue = function(){return this;}; | 1019 ListFactory.prototype.is$List$EvaluatedValue = function(){return this;}; |
523 ListFactory.prototype.is$List$HInstruction = function(){return this;}; | 1020 ListFactory.prototype.is$List$HInstruction = function(){return this;}; |
524 ListFactory.prototype.is$List$String = function(){return this;}; | 1021 ListFactory.prototype.is$List$String = function(){return this;}; |
525 ListFactory.prototype.is$List$T = function(){return this;}; | 1022 ListFactory.prototype.is$List$T = function(){return this;}; |
526 ListFactory.prototype.is$List$Value = function(){return this;}; | 1023 ListFactory.prototype.is$List$Value = function(){return this;}; |
527 ListFactory.prototype.is$List$int = function(){return this;}; | 1024 ListFactory.prototype.is$List$int = function(){return this;}; |
(...skipping 8086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8614 world.get$coreimpl().types.$index('NumImplementation').markUsed(); | 9111 world.get$coreimpl().types.$index('NumImplementation').markUsed(); |
8615 world.get$coreimpl().types.$index('StringImplementation').markUsed(); | 9112 world.get$coreimpl().types.$index('StringImplementation').markUsed(); |
8616 this.writeTypes(world.get$coreimpl()); | 9113 this.writeTypes(world.get$coreimpl()); |
8617 this.writeTypes(world.corelib); | 9114 this.writeTypes(world.corelib); |
8618 var matchConstructor = world.get$coreimpl().types.$index('MatchImplementation' ).getConstructor(''); | 9115 var matchConstructor = world.get$coreimpl().types.$index('MatchImplementation' ).getConstructor(''); |
8619 this.genMethod((matchConstructor && matchConstructor.is$Member())); | 9116 this.genMethod((matchConstructor && matchConstructor.is$Member())); |
8620 matchConstructor.generator.writeDefinition(this.writer, null); | 9117 matchConstructor.generator.writeDefinition(this.writer, null); |
8621 this.writeTypes(this.main.declaringType.get$library()); | 9118 this.writeTypes(this.main.declaringType.get$library()); |
8622 this._writeDynamicStubs(world.functionType); | 9119 this._writeDynamicStubs(world.functionType); |
8623 this._writeGlobals(); | 9120 this._writeGlobals(); |
8624 this.writer.writeln(('' + mainCall.code + ';')); | 9121 this.writer.writeln(('RunEntry(function () {' + mainCall.code + ';}, []);')); |
8625 } | 9122 } |
8626 WorldGenerator.prototype.globalForStaticField = function(field, fieldValue, depe ndencies) { | 9123 WorldGenerator.prototype.globalForStaticField = function(field, fieldValue, depe ndencies) { |
8627 var fullname = ("" + field.declaringType.get$jsname() + "." + field.get$jsname () + ""); | 9124 var fullname = ("" + field.declaringType.get$jsname() + "." + field.get$jsname () + ""); |
8628 if ($notnull_bool(!$notnull_bool(this.globals.containsKey(fullname)))) { | 9125 if ($notnull_bool(!$notnull_bool(this.globals.containsKey(fullname)))) { |
8629 this.globals.$setindex(fullname, GlobalValue.GlobalValue$fromStatic$factory( field, fieldValue, dependencies)); | 9126 this.globals.$setindex(fullname, GlobalValue.GlobalValue$fromStatic$factory( field, fieldValue, dependencies)); |
8630 } | 9127 } |
8631 return this.globals.$index(fullname); | 9128 return this.globals.$index(fullname); |
8632 } | 9129 } |
8633 WorldGenerator.prototype.globalForConst = function(exp, dependencies) { | 9130 WorldGenerator.prototype.globalForConst = function(exp, dependencies) { |
8634 var code = exp.canonicalCode; | 9131 var code = exp.canonicalCode; |
(...skipping 8834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17469 var checked = !$notnull_bool(isDynamic); | 17966 var checked = !$notnull_bool(isDynamic); |
17470 var callMethod = toType.getCallMethod(); | 17967 var callMethod = toType.getCallMethod(); |
17471 if ($notnull_bool($ne(callMethod, null))) { | 17968 if ($notnull_bool($ne(callMethod, null))) { |
17472 if ($notnull_bool(checked && !$notnull_bool(toType.isAssignable(this.type))) ) { | 17969 if ($notnull_bool(checked && !$notnull_bool(toType.isAssignable(this.type))) ) { |
17473 this.convertWarning(toType, node); | 17970 this.convertWarning(toType, node); |
17474 } | 17971 } |
17475 var arity = callMethod.get$parameters().length; | 17972 var arity = callMethod.get$parameters().length; |
17476 var myCall = this.type.getCallMethod(); | 17973 var myCall = this.type.getCallMethod(); |
17477 if ($notnull_bool(myCall == null || myCall.get$parameters().length != arity) ) { | 17974 if ($notnull_bool(myCall == null || myCall.get$parameters().length != arity) ) { |
17478 var stub = world.functionType.getCallStub(Arguments.Arguments$bare$factory (arity)); | 17975 var stub = world.functionType.getCallStub(Arguments.Arguments$bare$factory (arity)); |
17479 return new Value(toType, ('to\$' + stub.name + '(' + this.code + ')'), fal se, true, false); | 17976 var val = new Value(toType, ('to\$' + stub.name + '(' + this.code + ')'), false, true, false); |
17977 return $notnull_bool(this._isDomCallback(toType) && !$notnull_bool(this._i sDomCallback(this.type))) ? val._wrapDomCallback(toType, arity) : val; | |
17978 } | |
17979 else if ($notnull_bool(this._isDomCallback(toType) && !$notnull_bool(this._i sDomCallback(this.type)))) { | |
17980 return this._wrapDomCallback(toType, arity); | |
17480 } | 17981 } |
17481 } | 17982 } |
17482 if ($notnull_bool(!$notnull_bool(options.enableTypeChecks))) { | 17983 if ($notnull_bool(!$notnull_bool(options.enableTypeChecks))) { |
17483 return this; | 17984 return this; |
17484 } | 17985 } |
17485 var fromType = this.type; | 17986 var fromType = this.type; |
17486 if ($notnull_bool(this.type.get$isVar() && this.code != 'null')) { | 17987 if ($notnull_bool(this.type.get$isVar() && this.code != 'null')) { |
17487 fromType = world.objectType; | 17988 fromType = world.objectType; |
17488 } | 17989 } |
17489 var bothNum = this.type.get$isNum() && toType.get$isNum(); | 17990 var bothNum = this.type.get$isNum() && toType.get$isNum(); |
(...skipping 14 matching lines...) Expand all Loading... | |
17504 } | 18005 } |
17505 else { | 18006 else { |
17506 if ($notnull_bool(this.code.startsWith('\$notnull_bool'))) { | 18007 if ($notnull_bool(this.code.startsWith('\$notnull_bool'))) { |
17507 return this; | 18008 return this; |
17508 } | 18009 } |
17509 else { | 18010 else { |
17510 return new Value(world.boolType, ('\$notnull_bool(' + this.code + ')'), fa lse, true, false); | 18011 return new Value(world.boolType, ('\$notnull_bool(' + this.code + ')'), fa lse, true, false); |
17511 } | 18012 } |
17512 } | 18013 } |
17513 } | 18014 } |
18015 Value.prototype._isDomCallback = function(toType) { | |
18016 return ((toType.get$definition() instanceof FunctionTypeDefinition) && $eq(toT ype.get$library(), world.get$dom())); | |
18017 } | |
18018 Value.prototype._wrapDomCallback = function(toType, arity) { | |
18019 return new Value(toType, ('\$wrap_call\$' + arity + '(' + this.code + ')'), fa lse, true, false); | |
18020 } | |
17514 Value.prototype._typeAssert = function(context, toType, node) { | 18021 Value.prototype._typeAssert = function(context, toType, node) { |
17515 if ($notnull_bool((toType instanceof ParameterType))) { | 18022 if ($notnull_bool((toType instanceof ParameterType))) { |
17516 var p = toType; | 18023 var p = toType; |
17517 toType = p.extendsType; | 18024 toType = p.extendsType; |
17518 } | 18025 } |
17519 if ($notnull_bool(toType.get$isObject() || toType.get$isVar())) { | 18026 if ($notnull_bool(toType.get$isObject() || toType.get$isVar())) { |
17520 world.internalError(('We thought ' + this.type.name + ' is not a subtype of ' + toType.name + '?')); | 18027 world.internalError(('We thought ' + this.type.name + ' is not a subtype of ' + toType.name + '?')); |
17521 } | 18028 } |
17522 if ($notnull_bool(toType.get$isNum())) toType = world.numType; | 18029 if ($notnull_bool(toType.get$isNum())) toType = world.numType; |
17523 var check; | 18030 var check; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17583 for (var i = 0; | 18090 for (var i = 0; |
17584 $notnull_bool(i < args.get$length()); i++) { | 18091 $notnull_bool(i < args.get$length()); i++) { |
17585 argsCode.add(args.values.$index(i).code); | 18092 argsCode.add(args.values.$index(i).code); |
17586 } | 18093 } |
17587 pos = Strings.join((argsCode && argsCode.is$List$String()), ", "); | 18094 pos = Strings.join((argsCode && argsCode.is$List$String()), ", "); |
17588 } | 18095 } |
17589 var noSuchArgs = [new Value(world.stringType, ('"' + name + '"'), false, true, false), new Value(world.listType, ('[' + pos + ']'), false, true, false)]; | 18096 var noSuchArgs = [new Value(world.stringType, ('"' + name + '"'), false, true, false), new Value(world.listType, ('[' + pos + ']'), false, true, false)]; |
17590 return this._tryResolveMember(context, 'noSuchMethod').invoke$4(context, node, this, new Arguments(null, noSuchArgs)); | 18097 return this._tryResolveMember(context, 'noSuchMethod').invoke$4(context, node, this, new Arguments(null, noSuchArgs)); |
17591 } | 18098 } |
17592 Value.prototype.invokeSpecial = function(name, args, returnType) { | 18099 Value.prototype.invokeSpecial = function(name, args, returnType) { |
17593 $assert(name.startsWith('\$'), "name.startsWith('\\$')", "value.dart", 417, 12 ); | 18100 $assert(name.startsWith('\$'), "name.startsWith('\\$')", "value.dart", 431, 12 ); |
17594 $assert(!$notnull_bool(args.get$hasNames()), "!args.hasNames", "value.dart", 4 18, 12); | 18101 $assert(!$notnull_bool(args.get$hasNames()), "!args.hasNames", "value.dart", 4 32, 12); |
17595 var argsString = args.getCode(); | 18102 var argsString = args.getCode(); |
17596 if ($notnull_bool(name == '\$index' || name == '\$setindex')) { | 18103 if ($notnull_bool(name == '\$index' || name == '\$setindex')) { |
17597 return new Value(returnType, ('' + this.code + '.' + name + '(' + argsString + ')'), false, true, false); | 18104 return new Value(returnType, ('' + this.code + '.' + name + '(' + argsString + ')'), false, true, false); |
17598 } | 18105 } |
17599 else { | 18106 else { |
17600 if ($notnull_bool(argsString.length > 0)) argsString = (', ' + argsString + ''); | 18107 if ($notnull_bool(argsString.length > 0)) argsString = (', ' + argsString + ''); |
17601 return new Value(returnType, ('' + name + '(' + this.code + '' + argsString + ')'), false, true, false); | 18108 return new Value(returnType, ('' + name + '(' + this.code + '' + argsString + ')'), false, true, false); |
17602 } | 18109 } |
17603 } | 18110 } |
17604 Value.prototype.get_$3 = function($0, $1, $2) { | 18111 Value.prototype.get_$3 = function($0, $1, $2) { |
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18659 IMPORT, | 19166 IMPORT, |
18660 INTERFACE, | 19167 INTERFACE, |
18661 LIBRARY, | 19168 LIBRARY, |
18662 NATIVE, | 19169 NATIVE, |
18663 NEGATE, | 19170 NEGATE, |
18664 OPERATOR, | 19171 OPERATOR, |
18665 SET, | 19172 SET, |
18666 SOURCE, | 19173 SOURCE, |
18667 STATIC, | 19174 STATIC, |
18668 TYPEDEF ]*/; | 19175 TYPEDEF ]*/; |
18669 main(); | 19176 RunEntry(function () {main();}, []); |
jimhug
2011/11/08 15:39:01
500 lines is a lot to add - but considering that w
Siggi Cherem (dart-lang)
2011/11/08 17:56:42
Yeah - I'll be working this week on bringing this
| |
OLD | NEW |