Browse Source

Use static methods for JS charCodeAt and substr instead of prototype patches.

Adding a new class may not be ideal, but this should be a huge step up for JS
interoperability.

From aszlig on github, part of issue #572.
Bruno Garcia 13 năm trước cách đây
mục cha
commit
96a78bc5ab
4 tập tin đã thay đổi với 99 bổ sung20 xóa
  1. 2 0
      std/StringTools.hx
  2. 0 20
      std/js/Boot.hx
  3. 51 0
      std/js/_std/HxOverrides.hx
  4. 46 0
      std/js/_std/String.hx

+ 2 - 0
std/StringTools.hx

@@ -296,6 +296,8 @@ class StringTools {
 			return 0;
 		else
 			return cast(untyped s[index], Int);
+		#elseif js
+		return (untyped s).charCodeAt(index);
 		#else
 		return s.cca(index);
 		#end

+ 0 - 20
std/js/Boot.hx

@@ -219,26 +219,6 @@ class Boot {
 					}
 				}
 			};
-			if( String.prototype.cca == null )
-				String.prototype.cca = String.prototype.charCodeAt;
-			String.prototype.charCodeAt = function(i) {
-				var x = __this__.cca(i);
-				if( x != x ) // fast isNaN
-					return __js__('undefined'); // isNaN will still return true
-				return x;
-			};
-			var oldsub = String.prototype.substr;
-			String.prototype.substr = function(pos,len){
-				if( pos != null && pos != 0 && len != null && len < 0 ) return "";
-				if( len == null ) len = __this__.length;
-				if( pos < 0 ){
-					pos = __this__.length + pos;
-					if( pos < 0 ) pos = 0;
-				}else if( len < 0 ){
-					len = __this__.length + len - pos;
-				}
-				return oldsub.apply(__this__,[pos,len]);
-			};
 			Function.prototype["$bind"] = function(o){
 				var f = function(){
 					return f.method.apply(f.scope, untyped __js__("arguments"));

+ 51 - 0
std/js/_std/HxOverrides.hx

@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2012, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+/**
+ * Static methods that override calls to built-in JS methods.
+ * @private
+ */
+class HxOverrides {
+
+	public static function String_charCodeAt( s : String, index : Int ) : Null<Int> {
+		var x = (untyped s).charCodeAt(index);
+		if( x != x ) // fast isNaN
+			return untyped undefined; // isNaN will still return true
+		return x;
+	}
+
+	public static function String_substr( s : String, pos : Int, ?len : Int ) : String {
+		if( pos != null && pos != 0 && len != null && len < 0 ) return "";
+		if( len == null ) len = s.length;
+		if( pos < 0 ){
+			pos = s.length + pos;
+			if( pos < 0 ) pos = 0;
+		}else if( len < 0 ){
+			len = s.length + len - pos;
+		}
+
+		return (untyped s).substr(pos, len);
+	}
+}

+ 46 - 0
std/js/_std/String.hx

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2012, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+
+@:core_api extern class String {
+	var length(default,null) : Int;
+	function new(string:String) : Void;
+	function toUpperCase() : String;
+	function toLowerCase() : String;
+	function charAt( index : Int) : String;
+	function indexOf( str : String, ?startIndex : Int ) : Int;
+	function lastIndexOf( str : String, ?startIndex : Int ) : Int;
+	function split( delimiter : String ) : Array<String>;
+	function toString() : String;
+	static function fromCharCode( code : Int ) : String;
+	function substring( startIndex : Int, ?endIndex : Int ) : String;
+
+	inline function charCodeAt( index : Int) : Null<Int> {
+		return HxOverrides.String_charCodeAt(this, index);
+	}
+
+	inline function substr( pos : Int, ?len : Int ) : String {
+		return HxOverrides.String_substr(this, pos, len);
+	}
+}