From 5a96cfda705e1762dc0671e26b0b78925ad97e29 Mon Sep 17 00:00:00 2001
From: tidwall <joshbaker77@gmail.com>
Date: Mon, 14 Jan 2019 08:40:04 -0700
Subject: [PATCH] Added GopherJS support

---
 gjson_gae.go  |  2 +-
 gjson_ngae.go | 66 ++++++++++++++++++++++++---------------------------
 gjson_test.go |  6 ++---
 3 files changed, 35 insertions(+), 39 deletions(-)

diff --git a/gjson_gae.go b/gjson_gae.go
index cbe2ab4..3a2b251 100644
--- a/gjson_gae.go
+++ b/gjson_gae.go
@@ -1,4 +1,4 @@
-//+build appengine
+//+build appengine js
 
 package gjson
 
diff --git a/gjson_ngae.go b/gjson_ngae.go
index ff313a7..59e944b 100644
--- a/gjson_ngae.go
+++ b/gjson_ngae.go
@@ -1,4 +1,5 @@
 //+build !appengine
+//+build !js
 
 package gjson
 
@@ -15,45 +16,40 @@ func getBytes(json []byte, path string) Result {
 	if json != nil {
 		// unsafe cast to string
 		result = Get(*(*string)(unsafe.Pointer(&json)), path)
-		result = fromBytesGet(result)
-	}
-	return result
-}
-
-func fromBytesGet(result Result) Result {
-	// safely get the string headers
-	rawhi := *(*reflect.StringHeader)(unsafe.Pointer(&result.Raw))
-	strhi := *(*reflect.StringHeader)(unsafe.Pointer(&result.Str))
-	// create byte slice headers
-	rawh := reflect.SliceHeader{Data: rawhi.Data, Len: rawhi.Len}
-	strh := reflect.SliceHeader{Data: strhi.Data, Len: strhi.Len}
-	if strh.Data == 0 {
-		// str is nil
-		if rawh.Data == 0 {
+		// safely get the string headers
+		rawhi := *(*reflect.StringHeader)(unsafe.Pointer(&result.Raw))
+		strhi := *(*reflect.StringHeader)(unsafe.Pointer(&result.Str))
+		// create byte slice headers
+		rawh := reflect.SliceHeader{Data: rawhi.Data, Len: rawhi.Len}
+		strh := reflect.SliceHeader{Data: strhi.Data, Len: strhi.Len}
+		if strh.Data == 0 {
+			// str is nil
+			if rawh.Data == 0 {
+				// raw is nil
+				result.Raw = ""
+			} else {
+				// raw has data, safely copy the slice header to a string
+				result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh)))
+			}
+			result.Str = ""
+		} else if rawh.Data == 0 {
 			// raw is nil
 			result.Raw = ""
-		} else {
-			// raw has data, safely copy the slice header to a string
+			// str has data, safely copy the slice header to a string
+			result.Str = string(*(*[]byte)(unsafe.Pointer(&strh)))
+		} else if strh.Data >= rawh.Data &&
+			int(strh.Data)+strh.Len <= int(rawh.Data)+rawh.Len {
+			// Str is a substring of Raw.
+			start := int(strh.Data - rawh.Data)
+			// safely copy the raw slice header
 			result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh)))
+			// substring the raw
+			result.Str = result.Raw[start : start+strh.Len]
+		} else {
+			// safely copy both the raw and str slice headers to strings
+			result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh)))
+			result.Str = string(*(*[]byte)(unsafe.Pointer(&strh)))
 		}
-		result.Str = ""
-	} else if rawh.Data == 0 {
-		// raw is nil
-		result.Raw = ""
-		// str has data, safely copy the slice header to a string
-		result.Str = string(*(*[]byte)(unsafe.Pointer(&strh)))
-	} else if strh.Data >= rawh.Data &&
-		int(strh.Data)+strh.Len <= int(rawh.Data)+rawh.Len {
-		// Str is a substring of Raw.
-		start := int(strh.Data - rawh.Data)
-		// safely copy the raw slice header
-		result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh)))
-		// substring the raw
-		result.Str = result.Raw[start : start+strh.Len]
-	} else {
-		// safely copy both the raw and str slice headers to strings
-		result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh)))
-		result.Str = string(*(*[]byte)(unsafe.Pointer(&strh)))
 	}
 	return result
 }
diff --git a/gjson_test.go b/gjson_test.go
index c994cef..31bd31f 100644
--- a/gjson_test.go
+++ b/gjson_test.go
@@ -1361,7 +1361,7 @@ null
 }
 
 func TestNumUint64String(t *testing.T) {
-	i := 9007199254740993 //2^53 + 1
+	var i int64 = 9007199254740993 //2^53 + 1
 	j := fmt.Sprintf(`{"data":  [  %d, "hello" ] }`, i)
 	res := Get(j, "data.0")
 	if res.String() != "9007199254740993" {
@@ -1370,7 +1370,7 @@ func TestNumUint64String(t *testing.T) {
 }
 
 func TestNumInt64String(t *testing.T) {
-	i := -9007199254740993
+	var i int64 = -9007199254740993
 	j := fmt.Sprintf(`{"data":[ "hello", %d ]}`, i)
 	res := Get(j, "data.1")
 	if res.String() != "-9007199254740993" {
@@ -1388,7 +1388,7 @@ func TestNumBigString(t *testing.T) {
 }
 
 func TestNumFloatString(t *testing.T) {
-	i := -9007199254740993
+	var i int64 = -9007199254740993
 	j := fmt.Sprintf(`{"data":[ "hello", %d ]}`, i) //No quotes around value!!
 	res := Get(j, "data.1")
 	if res.String() != "-9007199254740993" {