diff --git a/haxe/CallStack.hx b/haxe/CallStack.hx index 168a3838b..ae931b7ab 100644 --- a/haxe/CallStack.hx +++ b/haxe/CallStack.hx @@ -36,6 +36,40 @@ enum StackItem { Get informations about the call stack. **/ class CallStack { + #if js + static var lastException:js.Error; + + static function getStack(e:js.Error):Array { + if (e == null) return []; + // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + var oldValue = (untyped Error).prepareStackTrace; + (untyped Error).prepareStackTrace = function (error, callsites :Array) { + var stack = []; + for (site in callsites) { + if (wrapCallSite != null) site = wrapCallSite(site); + var method = null; + var fullName :String = site.getFunctionName(); + if (fullName != null) { + var idx = fullName.lastIndexOf("."); + if (idx >= 0) { + var className = fullName.substr(0, idx); + var methodName = fullName.substr(idx+1); + method = Method(className, methodName); + } + } + stack.push(FilePos(method, site.getFileName(), site.getLineNumber())); + } + return stack; + } + var a = makeStack(e.stack); + (untyped Error).prepareStackTrace = oldValue; + return a; + } + + // support for source-map-support module + @:noCompletion + public static var wrapCallSite:Dynamic->Dynamic; + #end /** Return the call stack elements, or an empty array if not available. @@ -45,45 +79,24 @@ class CallStack { var a = makeStack(untyped __dollar__callstack()); a.shift(); // remove Stack.callStack() return a; - #elseif flash9 + #elseif flash var a = makeStack( new flash.errors.Error().getStackTrace() ); a.shift(); // remove Stack.callStack() return a; - #elseif flash - return makeStack("$s"); #elseif php return makeStack("%s"); #elseif cpp var s:Array = untyped __global__.__hxcpp_get_call_stack(true); return makeStack(s); #elseif js - // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi - var oldValue = (untyped Error).prepareStackTrace; - (untyped Error).prepareStackTrace = function (error, callsites :Array) { - var stack = []; - for (site in callsites) { - var method = null; - var fullName :String = site.getFunctionName(); - if (fullName != null) { - var idx = fullName.lastIndexOf("."); - if (idx >= 0) { - var className = fullName.substr(0, idx); - var methodName = fullName.substr(idx+1); - method = Method(className, methodName); - } - } - stack.push(FilePos(method, site.getFileName(), site.getLineNumber())); - } - return stack; - } try { - throw untyped __new__("Error"); + throw new js.Error(); } catch( e : Dynamic ) { - var a = makeStack(e.stack); - if( a != null ) a.shift(); // remove Stack.callStack() - (untyped Error).prepareStackTrace = oldValue; + var a = getStack(e); + a.shift(); // remove Stack.callStack() return a; } + #elseif java var stack = []; for ( el in java.lang.Thread.currentThread().getStackTrace() ) { @@ -129,7 +142,7 @@ class CallStack { return makeStack(untyped __dollar__excstack()); #elseif as3 return new Array(); - #elseif flash9 + #elseif flash var err : flash.errors.Error = untyped flash.Boot.lastError; if( err == null ) return new Array(); var a = makeStack( err.getStackTrace() ); @@ -143,8 +156,6 @@ class CallStack { i--; } return a; - #elseif flash - return makeStack("$e"); #elseif php return makeStack("%e"); #elseif cpp @@ -182,6 +193,8 @@ class CallStack { stack.push(FilePos(null, elem._1, elem._2)); } return stack; + #elseif js + return untyped __define_feature__("haxe.CallStack.exceptionStack", getStack(lastException)); #else return []; // Unsupported #end @@ -245,7 +258,7 @@ class CallStack { a.unshift(FilePos(null,new String(untyped x[0]),untyped x[1])); } return a; - #elseif flash9 + #elseif flash var a = new Array(); var r = ~/at ([^\/]+?)\$?(\/[^\(]+)?\(\)(\[(.*?):([0-9]+)\])?/; var rlambda = ~/^MethodInfo-([0-9]+)$/g; @@ -266,14 +279,6 @@ class CallStack { s = r.matchedRight(); } return a; - #elseif flash - var a : Array = untyped __eval__(s); - var m = new Array(); - for( i in 0...a.length - if(s == "$s") 2 else 0 ) { - var d = a[i].split("::"); - m.unshift(Method(d[0],d[1])); - } - return m; #elseif php if (!untyped __call__("isset", __var__("GLOBALS", s))) return []; @@ -298,10 +303,12 @@ class CallStack { } return m; #elseif js - if ((untyped __js__("typeof"))(s) == "string") { + if (s == null) { + return []; + } else if ((untyped __js__("typeof"))(s) == "string") { // Return the raw lines in browsers that don't support prepareStackTrace var stack : Array = s.split("\n"); - if( stack[0] == "Error" ) stack.shift(); + if( stack[0] == "Error" ) stack.shift(); var m = []; var rie10 = ~/^ at ([A-Za-z0-9_. ]+) \(([^)]+):([0-9]+):([0-9]+)\)$/; for( line in stack ) { @@ -312,7 +319,7 @@ class CallStack { var line = Std.parseInt(rie10.matched(3)); m.push(FilePos( meth == "Anonymous function" ? LocalFunction() : meth == "Global code" ? null : Method(path.join("."),meth), file, line )); } else - m.push(Module(line)); // A little weird, but better than nothing + m.push(Module(StringTools.trim(line))); // A little weird, but better than nothing } return m; } else { diff --git a/haxe/Timer.hx b/haxe/Timer.hx index 4062c9d00..788bf2fef 100644 --- a/haxe/Timer.hx +++ b/haxe/Timer.hx @@ -62,12 +62,9 @@ class Timer { The accuracy of this may be platform-dependent. **/ public function new( time_ms : Int ){ - #if flash9 + #if flash var me = this; id = untyped __global__["flash.utils.setInterval"](function() { me.run(); },time_ms); - #elseif flash - var me = this; - id = untyped _global["setInterval"](function() { me.run(); },time_ms); #elseif js var me = this; id = untyped setInterval(function() me.run(),time_ms); @@ -89,10 +86,8 @@ class Timer { #if (flash || js) if( id == null ) return; - #if flash9 + #if flash untyped __global__["flash.utils.clearInterval"](id); - #elseif flash - untyped _global["clearInterval"](id); #elseif js untyped clearInterval(id); #end diff --git a/haxe/crypto/Hmac.hx b/haxe/crypto/Hmac.hx index 2afc65ec2..9a83f59e2 100644 --- a/haxe/crypto/Hmac.hx +++ b/haxe/crypto/Hmac.hx @@ -21,12 +21,18 @@ */ package haxe.crypto; +/** + Hash methods for Hmac calculation. +*/ enum HashMethod { MD5; SHA1; SHA256; } +/** + Calculates a Hmac of the given Bytes using a HashMethod. +*/ class Hmac { var method : HashMethod; @@ -82,4 +88,4 @@ class Hmac { return doHash(Ko.getBytes()); } -} \ No newline at end of file +} diff --git a/haxe/crypto/Sha256.hx b/haxe/crypto/Sha256.hx index 868bbe523..17292d573 100644 --- a/haxe/crypto/Sha256.hx +++ b/haxe/crypto/Sha256.hx @@ -21,6 +21,9 @@ */ package haxe.crypto; +/** + Creates a Sha256 of a String. +*/ class Sha256 { public static function encode( s:String ) : String { diff --git a/js/Boot.hx b/js/Boot.hx index 1db6fcb54..ef349f969 100644 --- a/js/Boot.hx +++ b/js/Boot.hx @@ -246,12 +246,9 @@ class Boot { return __nativeClassName(o) != null; } - // resolve native JS class (with window or global): + // resolve native JS class in the global scope: static function __resolveNativeClass(name:String) untyped { - if (__js__("typeof window") != "undefined") - return window[name]; - else - return global[name]; + return untyped Function('return typeof $name != "undefined" ? $name : null')(); } }