From c0ef743d0baf58cb51838808e8c7aae409c22a58 Mon Sep 17 00:00:00 2001 From: Peter Kanev Date: Tue, 22 Aug 2017 10:53:33 +0300 Subject: [PATCH] add android studio project --- calclib/.gitignore | 1 + .../2.14.1/taskArtifacts/cache.properties | 1 + .../taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .../2.14.1/taskArtifacts/compilationState.bin | Bin 0 -> 23912 bytes .../2.14.1/taskArtifacts/fileHashes.bin | Bin 0 -> 24620 bytes .../2.14.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 233009 bytes .../fileSnapshotsToTreeSnapshotsIndex.bin | Bin 0 -> 56634 bytes .../2.14.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 174472 bytes .../localClassSetAnalysis.bin | Bin 0 -> 19124 bytes .../localClassSetAnalysis.lock | Bin 0 -> 17 bytes .../localJarClasspathSnapshot.bin | Bin 0 -> 18542 bytes .../localJarClasspathSnapshot.lock | Bin 0 -> 17 bytes .../localClassSetAnalysis.bin | Bin 0 -> 19124 bytes .../localClassSetAnalysis.lock | Bin 0 -> 17 bytes .../localJarClasspathSnapshot.bin | Bin 0 -> 18542 bytes .../localJarClasspathSnapshot.lock | Bin 0 -> 17 bytes calclib/.idea/compiler.xml | 22 + calclib/.idea/copyright/profiles_settings.xml | 3 + calclib/.idea/gradle.xml | 17 + calclib/.idea/misc.xml | 36 + calclib/.idea/modules.xml | 8 + calclib/.idea/runConfigurations.xml | 12 + calclib/.idea/workspace.xml | 2025 ++++ calclib/build.gradle | 104 + calclib/build.properties | 1 + calclib/calclib.iml | 109 + calclib/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + calclib/gradlew | 164 + calclib/gradlew.bat | 90 + calclib/local.properties | 12 + calclib/proguard-rules.pro | 25 + calclib/src/main/AndroidManifest.xml | 13 + calclib/src/main/cpp/Calc.cpp | 54 + .../cpp/include/V8NativeScriptExtension.h | 25 + .../include/libplatform/libplatform-export.h | 29 + .../cpp/include/libplatform/libplatform.h | 66 + .../main/cpp/include/libplatform/v8-tracing.h | 270 + calclib/src/main/cpp/include/v8-debug.h | 287 + .../src/main/cpp/include/v8-experimental.h | 58 + calclib/src/main/cpp/include/v8-platform.h | 219 + calclib/src/main/cpp/include/v8-profiler.h | 897 ++ calclib/src/main/cpp/include/v8-testing.h | 48 + calclib/src/main/cpp/include/v8-util.h | 659 ++ .../src/main/cpp/include/v8-version-string.h | 33 + calclib/src/main/cpp/include/v8-version.h | 20 + calclib/src/main/cpp/include/v8.h | 9660 +++++++++++++++++ calclib/src/main/cpp/include/v8config.h | 428 + .../main/libs/arm64-v8a/libNativeScript.so | Bin 0 -> 14883360 bytes .../main/libs/armeabi-v7a/libNativeScript.so | Bin 0 -> 9028172 bytes calclib/src/main/libs/x86/libNativeScript.so | Bin 0 -> 16040444 bytes calclib/src/main/res/values/strings.xml | 3 + 52 files changed, 15405 insertions(+) create mode 100644 calclib/.gitignore create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/cache.properties create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/cache.properties.lock create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/compilationState.bin create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/fileHashes.bin create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/fileSnapshotsToTreeSnapshotsIndex.bin create mode 100644 calclib/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin create mode 100644 calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.bin create mode 100644 calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.lock create mode 100644 calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin create mode 100644 calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock create mode 100644 calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.bin create mode 100644 calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.lock create mode 100644 calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin create mode 100644 calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock create mode 100644 calclib/.idea/compiler.xml create mode 100644 calclib/.idea/copyright/profiles_settings.xml create mode 100644 calclib/.idea/gradle.xml create mode 100644 calclib/.idea/misc.xml create mode 100644 calclib/.idea/modules.xml create mode 100644 calclib/.idea/runConfigurations.xml create mode 100644 calclib/.idea/workspace.xml create mode 100644 calclib/build.gradle create mode 100644 calclib/build.properties create mode 100644 calclib/calclib.iml create mode 100644 calclib/gradle/wrapper/gradle-wrapper.jar create mode 100644 calclib/gradle/wrapper/gradle-wrapper.properties create mode 100644 calclib/gradlew create mode 100644 calclib/gradlew.bat create mode 100644 calclib/local.properties create mode 100644 calclib/proguard-rules.pro create mode 100644 calclib/src/main/AndroidManifest.xml create mode 100644 calclib/src/main/cpp/Calc.cpp create mode 100644 calclib/src/main/cpp/include/V8NativeScriptExtension.h create mode 100644 calclib/src/main/cpp/include/libplatform/libplatform-export.h create mode 100644 calclib/src/main/cpp/include/libplatform/libplatform.h create mode 100644 calclib/src/main/cpp/include/libplatform/v8-tracing.h create mode 100644 calclib/src/main/cpp/include/v8-debug.h create mode 100644 calclib/src/main/cpp/include/v8-experimental.h create mode 100644 calclib/src/main/cpp/include/v8-platform.h create mode 100644 calclib/src/main/cpp/include/v8-profiler.h create mode 100644 calclib/src/main/cpp/include/v8-testing.h create mode 100644 calclib/src/main/cpp/include/v8-util.h create mode 100644 calclib/src/main/cpp/include/v8-version-string.h create mode 100644 calclib/src/main/cpp/include/v8-version.h create mode 100644 calclib/src/main/cpp/include/v8.h create mode 100644 calclib/src/main/cpp/include/v8config.h create mode 100644 calclib/src/main/libs/arm64-v8a/libNativeScript.so create mode 100644 calclib/src/main/libs/armeabi-v7a/libNativeScript.so create mode 100644 calclib/src/main/libs/x86/libNativeScript.so create mode 100644 calclib/src/main/res/values/strings.xml diff --git a/calclib/.gitignore b/calclib/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/calclib/.gitignore @@ -0,0 +1 @@ +/build diff --git a/calclib/.gradle/2.14.1/taskArtifacts/cache.properties b/calclib/.gradle/2.14.1/taskArtifacts/cache.properties new file mode 100644 index 0000000..786abcc --- /dev/null +++ b/calclib/.gradle/2.14.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Tue Aug 08 14:58:38 EEST 2017 diff --git a/calclib/.gradle/2.14.1/taskArtifacts/cache.properties.lock b/calclib/.gradle/2.14.1/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..874e3d77e16503981e825844d9a99ae9adce3a6b GIT binary patch literal 17 VcmZSPGSmF{P`*!?0Sx&50{|tw1PlNG literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/taskArtifacts/compilationState.bin b/calclib/.gradle/2.14.1/taskArtifacts/compilationState.bin new file mode 100644 index 0000000000000000000000000000000000000000..33d1060cfa7d6afc420d27cfaf76803075604a28 GIT binary patch literal 23912 zcmeI%PiWIn90%~1)eUELv{S~WNZEbu1i{sTf1m}29vrfNN)C%@y2hnRo1~c?p4Z8& z9<)dC&-9>|f#Aizu%ScjHblon)Pqb>P{D&DPC%dcd-Wn2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz!2ckSZKqkR zvofjOQD&#)%JvbmZ9Uzsc>8HmIzQsPY8`56wf{+&zjy6|{JrYB6+iIIjypFzYN@RL zdfJK~dTGal!_Hfeqx}t5{P3(DkKD~RSC0?wvf>@xcH9_l^TfZrsk7n-yX?5Vw&LV+ zevK6bAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00IR9+3kcl4Em9+4`Jv*=60}|?NiiVR^y^EN$|>?E*gS2s)Q1f z!1A2LOX5*hQ+YPZi89N_Vr+m0eRPAKzUBe*`{#=?FC{_(YxsFZ4vRg$h->4_htb_r z9)~|Y^X_wfdQZODj#FAvYve;hSo1{)$+U55kDvz>IV9?$B6CtMJQNlgKn88$3h$?E5 zc2YtYB~hnaDMR3OMWww}m?vQh8knmzdU?l*q8gNF2sK#zo3dJJ&=qe_Jt;re`*Gmn z{<_wQF*m&za!ZLN=rSDfnoDPnzvy`WExos*X)C=bDloE8f&EKrkdB3@!6oDRYNtd@@EW0^=a&qJL*DigEDYR3OH|pFiJX94v7%is!+FXYOBl9>iR9`8y`mAZqXr Hzmxd^m=*L7 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/taskArtifacts/fileHashes.bin b/calclib/.gradle/2.14.1/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..869a17251c615618c9a40ec025b9204f0b21fa41 GIT binary patch literal 24620 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 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin b/calclib/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin new file mode 100644 index 0000000000000000000000000000000000000000..c0d6115df47839b6b8bf1b6a58895befb080d7df GIT binary patch literal 174472 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 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.bin b/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..52d643f746806fafe03dfb6e7e6d3edb419397fe GIT binary patch literal 19124 zcmeI)ze>a~9Ki8k4qe3Ia5|hs4iSeSC_aEXc-wK{1N7?Ii}YG)|_y)p{Hu;78J{?O^or?_m-%S(Wln)nU5w+jE+ifBN0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009J6T%fvi1#I{t1}D9?ntt^la=7Up)$`40^8Wc{{m|&K{gcqf zCgq?_B_e$eym2qKit&XEKPR&%G-kJ33EYGe@ zQr|fA+BtJFjI1q|=MU6N_oQEjmZ`na`fuG!4@+B^ED6sD?a_ZBwNpE3SI?gBvi^6c br#N5ea$)CsJS*pUeJmqXTWDV^WOw`n7vAu2 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.lock b/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localClassSetAnalysis/localClassSetAnalysis.lock new file mode 100644 index 0000000000000000000000000000000000000000..6142967d09c3818a0b937e79885c9920d0b96bf7 GIT binary patch literal 17 UcmZQh^b)-FR+4=S0|c-E04aF`VE_OC literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin b/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb29afb1c2c832a9ead692348ffe9718fb4bf5bc GIT binary patch literal 18542 zcmeI%u?a#!3;@t*C1P>a=g(jz2u@((??iA3Yr#pJz;&*46nj1Rci^8ukQWFc9D(Gu zm-i8Ude?|)bkkNxfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF{DVL~mn)XzCH-#RPD=R} zv00UNcE1d#$Mba^pAN_NlhA4%S+`M@009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs o0RjXF5FkK+009C72oNAZfB*pk1PBoLy+GcU9a70f&F_`E4^S;4vH$=8 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock b/calclib/.gradle/2.14.1/tasks/_compileDebugJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock new file mode 100644 index 0000000000000000000000000000000000000000..b9d17be413544ae849939c4aac0233c3a3967836 GIT binary patch literal 17 UcmZRc{!`$5^RY+e3=qHu06$#?8vpt<8 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin b/calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb29afb1c2c832a9ead692348ffe9718fb4bf5bc GIT binary patch literal 18542 zcmeI%u?a#!3;@t*C1P>a=g(jz2u@((??iA3Yr#pJz;&*46nj1Rci^8ukQWFc9D(Gu zm-i8Ude?|)bkkNxfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF{DVL~mn)XzCH-#RPD=R} zv00UNcE1d#$Mba^pAN_NlhA4%S+`M@009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs o0RjXF5FkK+009C72oNAZfB*pk1PBoLy+GcU9a70f&F_`E4^S;4vH$=8 literal 0 HcmV?d00001 diff --git a/calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock b/calclib/.gradle/2.14.1/tasks/_compileReleaseJavaWithJavac/localJarClasspathSnapshot/localJarClasspathSnapshot.lock new file mode 100644 index 0000000000000000000000000000000000000000..e9ad769c93325293f3881ea98d81075327d01243 GIT binary patch literal 17 UcmZS1)>WHzlxglH1_%%W04OB`WB>pF literal 0 HcmV?d00001 diff --git a/calclib/.idea/compiler.xml b/calclib/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/calclib/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calclib/.idea/copyright/profiles_settings.xml b/calclib/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/calclib/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/calclib/.idea/gradle.xml b/calclib/.idea/gradle.xml new file mode 100644 index 0000000..47bd81f --- /dev/null +++ b/calclib/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/calclib/.idea/misc.xml b/calclib/.idea/misc.xml new file mode 100644 index 0000000..7e15d9d --- /dev/null +++ b/calclib/.idea/misc.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calclib/.idea/modules.xml b/calclib/.idea/modules.xml new file mode 100644 index 0000000..edd743e --- /dev/null +++ b/calclib/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/calclib/.idea/runConfigurations.xml b/calclib/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/calclib/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/calclib/.idea/workspace.xml b/calclib/.idea/workspace.xml new file mode 100644 index 0000000..bf22917 --- /dev/null +++ b/calclib/.idea/workspace.xml @@ -0,0 +1,2025 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1502194549378 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calclib/build.gradle b/calclib/build.gradle new file mode 100644 index 0000000..b505838 --- /dev/null +++ b/calclib/build.gradle @@ -0,0 +1,104 @@ +apply plugin: 'com.android.model.library' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle-experimental:0.8.1' + } +} + +allprojects { + repositories { + jcenter() + } +} + +model { + android { + compileSdkVersion = 23 + buildToolsVersion = "25.0.2" + + defaultConfig.with { + minSdkVersion.apiLevel = 17 + targetSdkVersion.apiLevel = 25 + } + + lintOptions.with { + abortOnError = false + } + } + + android.buildTypes { + release { + minifyEnabled = false + } + } + + android.ndk { + cppFlags.addAll(["-I${file("src/main/")}".toString(), + "-I${file("src/main/cpp/include")}".toString() + ]) + + CFlags.addAll(["-I${file("src/main/cpp")}".toString(), + "-I${file("src/main/cpp/include")}".toString() + ]) + + cppFlags.addAll(["-std=c++11", ])//"-fexceptions", "-fno-builtin-stpcpy",]) + + CFlags.addAll(["-Wno-error=format-security", "-g", "-fno-builtin-stpcpy"]) + +// ldLibs.addAll(["android", "dl", "log", "atomic", "z"]) + + ldFlags.addAll(["-Wl,--allow-multiple-definition"]) + + toolchain = "clang" + stl = "c++_static" + +// abiFilters.addAll(["armeabi-v7a", "x86", "arm64-v8a"]) + abiFilters.addAll(["x86"]) +// abiFilters.addAll(["arm64-v8a", "x86", "armeabi-v7a"]) + moduleName = "calcLib" + } + + android.sources { + main { + java { + source { + srcDirs 'src/main/java' + } + } + + jni { + source { + srcDirs 'src/main/cpp' + } + + exportedHeaders { + srcDir "src/main/cpp/include" + } + + dependencies { + library "NativeScript" linkage "shared" + } + } + } + } + + repositories { + prebuilt(PrebuiltLibraries) { + NativeScript { + headers.srcDir "src/main/cpp/include" + binaries.withType(SharedLibraryBinary) { + def filep = file("src/main/libs/${targetPlatform.getName()}/libNativeScript.so") + def exists = filep.exists() + if (exists) { + sharedLibraryFile = filep + } + println "~~~~~ FILE PATH: src/main/libs/${targetPlatform.getName()}/libNativeScript.so exists: ${exists}" + } + } + } + } +} diff --git a/calclib/build.properties b/calclib/build.properties new file mode 100644 index 0000000..715fd3b --- /dev/null +++ b/calclib/build.properties @@ -0,0 +1 @@ +android.useDeprecatedNdk = true \ No newline at end of file diff --git a/calclib/calclib.iml b/calclib/calclib.iml new file mode 100644 index 0000000..fab99ca --- /dev/null +++ b/calclib/calclib.iml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/calclib/gradle/wrapper/gradle-wrapper.jar b/calclib/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd GIT binary patch literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/calclib/gradlew.bat b/calclib/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/calclib/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/calclib/local.properties b/calclib/local.properties new file mode 100644 index 0000000..2f47f64 --- /dev/null +++ b/calclib/local.properties @@ -0,0 +1,12 @@ +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Tue Aug 08 15:19:46 EEST 2017 +ndk.dir=C\:\\NDK\\ndk12b +sdk.dir=C\:\\Android\\sdk_2.0 diff --git a/calclib/proguard-rules.pro b/calclib/proguard-rules.pro new file mode 100644 index 0000000..28b3f2a --- /dev/null +++ b/calclib/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Android\sdk_2.0/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/calclib/src/main/AndroidManifest.xml b/calclib/src/main/AndroidManifest.xml new file mode 100644 index 0000000..41b0ef3 --- /dev/null +++ b/calclib/src/main/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/calclib/src/main/cpp/Calc.cpp b/calclib/src/main/cpp/Calc.cpp new file mode 100644 index 0000000..3c90a0c --- /dev/null +++ b/calclib/src/main/cpp/Calc.cpp @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include "include/v8.h" + +void AddFuncCallback(const v8::FunctionCallbackInfo& args); + +extern "C" void NSMain(const v8::FunctionCallbackInfo& args) +{ + auto isolate = args.GetIsolate(); + + auto len = args.Length(); + + if (len != 5) + { + auto errMsg = v8::String::NewFromUtf8(isolate, "Wrong number of arguments (expected 5)"); + auto err = v8::Exception::Error(errMsg); + isolate->ThrowException(err); + return; + } + + auto exports = args[1].As(); + + auto ft = v8::FunctionTemplate::New(isolate, AddFuncCallback); + auto ctx = isolate->GetCurrentContext(); + auto maybeFunc = ft->GetFunction(ctx); + if (maybeFunc.IsEmpty()) + { + auto errMsg = v8::String::NewFromUtf8(isolate, "Cannot create 'add' function"); + auto err = v8::Exception::Error(errMsg); + isolate->ThrowException(err); + return; + } + + auto func = maybeFunc.ToLocalChecked(); + + auto propName = v8::String::NewFromUtf8(isolate, "add"); + auto result = exports->Set(ctx, propName, func); +} + +void AddFuncCallback(const v8::FunctionCallbackInfo& args) +{ + int result = 0; + + auto len = args.Length(); + + if ((len == 2) && args[0]->IsInt32() && args[1]->IsInt32()) + { + result = args[0]->Int32Value() + args[1]->Int32Value(); + } + + args.GetReturnValue().Set(v8::Int32::New(args.GetIsolate(), result)); +} \ No newline at end of file diff --git a/calclib/src/main/cpp/include/V8NativeScriptExtension.h b/calclib/src/main/cpp/include/V8NativeScriptExtension.h new file mode 100644 index 0000000..53b721d --- /dev/null +++ b/calclib/src/main/cpp/include/V8NativeScriptExtension.h @@ -0,0 +1,25 @@ +#include "v8.h" + +namespace v8 { + + class NativeScriptExtension { + public: + static uint8_t* GetAddress(const v8::Local& obj); + + static v8::Local* GetClosureObjects(v8::Isolate *isolate, const v8::Local& func, int *length); + + static void ReleaseClosureObjects(v8::Local* closureObjects); + + static void GetAssessorPair(v8::Isolate *isolate, const v8::Local& obj, const v8::Local& propName, v8::Local& getter, v8::Local& setter); + + static v8::Local GetPropertyKeys(v8::Isolate *isolate, const v8::Local& context, const v8::Local& object, bool& success); + + static int GetInternalFieldCount(const v8::Local& object); + + static void CpuFeaturesProbe(bool cross_compile); + private: + NativeScriptExtension(); + + // static v8::internal::Handle GetEnumPropertyKeys(const v8::internal::Handle& object, bool cache_result); + }; +} diff --git a/calclib/src/main/cpp/include/libplatform/libplatform-export.h b/calclib/src/main/cpp/include/libplatform/libplatform-export.h new file mode 100644 index 0000000..1561843 --- /dev/null +++ b/calclib/src/main/cpp/include/libplatform/libplatform-export.h @@ -0,0 +1,29 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_LIBPLATFORM_LIBPLATFORM_EXPORT_H_ +#define V8_LIBPLATFORM_LIBPLATFORM_EXPORT_H_ + +#if defined(_WIN32) + +#ifdef BUILDING_V8_PLATFORM_SHARED +#define V8_PLATFORM_EXPORT __declspec(dllexport) +#elif USING_V8_PLATFORM_SHARED +#define V8_PLATFORM_EXPORT __declspec(dllimport) +#else +#define V8_PLATFORM_EXPORT +#endif // BUILDING_V8_PLATFORM_SHARED + +#else // defined(_WIN32) + +// Setup for Linux shared library export. +#ifdef BUILDING_V8_PLATFORM_SHARED +#define V8_PLATFORM_EXPORT __attribute__((visibility("default"))) +#else +#define V8_PLATFORM_EXPORT +#endif + +#endif // defined(_WIN32) + +#endif // V8_LIBPLATFORM_LIBPLATFORM_EXPORT_H_ diff --git a/calclib/src/main/cpp/include/libplatform/libplatform.h b/calclib/src/main/cpp/include/libplatform/libplatform.h new file mode 100644 index 0000000..55a1020 --- /dev/null +++ b/calclib/src/main/cpp/include/libplatform/libplatform.h @@ -0,0 +1,66 @@ +// Copyright 2014 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_LIBPLATFORM_LIBPLATFORM_H_ +#define V8_LIBPLATFORM_LIBPLATFORM_H_ + +#include "libplatform/libplatform-export.h" +#include "libplatform/v8-tracing.h" +#include "v8-platform.h" // NOLINT(build/include) + +namespace v8 { +namespace platform { + +enum class IdleTaskSupport { kDisabled, kEnabled }; + +/** + * Returns a new instance of the default v8::Platform implementation. + * + * The caller will take ownership of the returned pointer. |thread_pool_size| + * is the number of worker threads to allocate for background jobs. If a value + * of zero is passed, a suitable default based on the current number of + * processors online will be chosen. + * If |idle_task_support| is enabled then the platform will accept idle + * tasks (IdleTasksEnabled will return true) and will rely on the embedder + * calling v8::platform::RunIdleTasks to process the idle tasks. + */ +V8_PLATFORM_EXPORT v8::Platform* CreateDefaultPlatform( + int thread_pool_size = 0, + IdleTaskSupport idle_task_support = IdleTaskSupport::kDisabled); + +/** + * Pumps the message loop for the given isolate. + * + * The caller has to make sure that this is called from the right thread. + * Returns true if a task was executed, and false otherwise. This call does + * not block if no task is pending. The |platform| has to be created using + * |CreateDefaultPlatform|. + */ +V8_PLATFORM_EXPORT bool PumpMessageLoop(v8::Platform* platform, + v8::Isolate* isolate); + +/** + * Runs pending idle tasks for at most |idle_time_in_seconds| seconds. + * + * The caller has to make sure that this is called from the right thread. + * This call does not block if no task is pending. The |platform| has to be + * created using |CreateDefaultPlatform|. + */ +V8_PLATFORM_EXPORT void RunIdleTasks(v8::Platform* platform, + v8::Isolate* isolate, + double idle_time_in_seconds); + +/** + * Attempts to set the tracing controller for the given platform. + * + * The |platform| has to be created using |CreateDefaultPlatform|. + */ +V8_PLATFORM_EXPORT void SetTracingController( + v8::Platform* platform, + v8::platform::tracing::TracingController* tracing_controller); + +} // namespace platform +} // namespace v8 + +#endif // V8_LIBPLATFORM_LIBPLATFORM_H_ diff --git a/calclib/src/main/cpp/include/libplatform/v8-tracing.h b/calclib/src/main/cpp/include/libplatform/v8-tracing.h new file mode 100644 index 0000000..902f8ea --- /dev/null +++ b/calclib/src/main/cpp/include/libplatform/v8-tracing.h @@ -0,0 +1,270 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_LIBPLATFORM_V8_TRACING_H_ +#define V8_LIBPLATFORM_V8_TRACING_H_ + +#include +#include +#include +#include + +#include "libplatform/libplatform-export.h" +#include "v8-platform.h" // NOLINT(build/include) + +namespace v8 { + +namespace base { +class Mutex; +} // namespace base + +namespace platform { +namespace tracing { + +const int kTraceMaxNumArgs = 2; + +class V8_PLATFORM_EXPORT TraceObject { + public: + union ArgValue { + bool as_bool; + uint64_t as_uint; + int64_t as_int; + double as_double; + const void* as_pointer; + const char* as_string; + }; + + TraceObject() {} + ~TraceObject(); + void Initialize( + char phase, const uint8_t* category_enabled_flag, const char* name, + const char* scope, uint64_t id, uint64_t bind_id, int num_args, + const char** arg_names, const uint8_t* arg_types, + const uint64_t* arg_values, + std::unique_ptr* arg_convertables, + unsigned int flags); + void UpdateDuration(); + void InitializeForTesting( + char phase, const uint8_t* category_enabled_flag, const char* name, + const char* scope, uint64_t id, uint64_t bind_id, int num_args, + const char** arg_names, const uint8_t* arg_types, + const uint64_t* arg_values, + std::unique_ptr* arg_convertables, + unsigned int flags, int pid, int tid, int64_t ts, int64_t tts, + uint64_t duration, uint64_t cpu_duration); + + int pid() const { return pid_; } + int tid() const { return tid_; } + char phase() const { return phase_; } + const uint8_t* category_enabled_flag() const { + return category_enabled_flag_; + } + const char* name() const { return name_; } + const char* scope() const { return scope_; } + uint64_t id() const { return id_; } + uint64_t bind_id() const { return bind_id_; } + int num_args() const { return num_args_; } + const char** arg_names() { return arg_names_; } + uint8_t* arg_types() { return arg_types_; } + ArgValue* arg_values() { return arg_values_; } + std::unique_ptr* arg_convertables() { + return arg_convertables_; + } + unsigned int flags() const { return flags_; } + int64_t ts() { return ts_; } + int64_t tts() { return tts_; } + uint64_t duration() { return duration_; } + uint64_t cpu_duration() { return cpu_duration_; } + + private: + int pid_; + int tid_; + char phase_; + const char* name_; + const char* scope_; + const uint8_t* category_enabled_flag_; + uint64_t id_; + uint64_t bind_id_; + int num_args_ = 0; + const char* arg_names_[kTraceMaxNumArgs]; + uint8_t arg_types_[kTraceMaxNumArgs]; + ArgValue arg_values_[kTraceMaxNumArgs]; + std::unique_ptr + arg_convertables_[kTraceMaxNumArgs]; + char* parameter_copy_storage_ = nullptr; + unsigned int flags_; + int64_t ts_; + int64_t tts_; + uint64_t duration_; + uint64_t cpu_duration_; + + // Disallow copy and assign + TraceObject(const TraceObject&) = delete; + void operator=(const TraceObject&) = delete; +}; + +class V8_PLATFORM_EXPORT TraceWriter { + public: + TraceWriter() {} + virtual ~TraceWriter() {} + virtual void AppendTraceEvent(TraceObject* trace_event) = 0; + virtual void Flush() = 0; + + static TraceWriter* CreateJSONTraceWriter(std::ostream& stream); + + private: + // Disallow copy and assign + TraceWriter(const TraceWriter&) = delete; + void operator=(const TraceWriter&) = delete; +}; + +class V8_PLATFORM_EXPORT TraceBufferChunk { + public: + explicit TraceBufferChunk(uint32_t seq); + + void Reset(uint32_t new_seq); + bool IsFull() const { return next_free_ == kChunkSize; } + TraceObject* AddTraceEvent(size_t* event_index); + TraceObject* GetEventAt(size_t index) { return &chunk_[index]; } + + uint32_t seq() const { return seq_; } + size_t size() const { return next_free_; } + + static const size_t kChunkSize = 64; + + private: + size_t next_free_ = 0; + TraceObject chunk_[kChunkSize]; + uint32_t seq_; + + // Disallow copy and assign + TraceBufferChunk(const TraceBufferChunk&) = delete; + void operator=(const TraceBufferChunk&) = delete; +}; + +class V8_PLATFORM_EXPORT TraceBuffer { + public: + TraceBuffer() {} + virtual ~TraceBuffer() {} + + virtual TraceObject* AddTraceEvent(uint64_t* handle) = 0; + virtual TraceObject* GetEventByHandle(uint64_t handle) = 0; + virtual bool Flush() = 0; + + static const size_t kRingBufferChunks = 1024; + + static TraceBuffer* CreateTraceBufferRingBuffer(size_t max_chunks, + TraceWriter* trace_writer); + + private: + // Disallow copy and assign + TraceBuffer(const TraceBuffer&) = delete; + void operator=(const TraceBuffer&) = delete; +}; + +// Options determines how the trace buffer stores data. +enum TraceRecordMode { + // Record until the trace buffer is full. + RECORD_UNTIL_FULL, + + // Record until the user ends the trace. The trace buffer is a fixed size + // and we use it as a ring buffer during recording. + RECORD_CONTINUOUSLY, + + // Record until the trace buffer is full, but with a huge buffer size. + RECORD_AS_MUCH_AS_POSSIBLE, + + // Echo to console. Events are discarded. + ECHO_TO_CONSOLE, +}; + +class V8_PLATFORM_EXPORT TraceConfig { + public: + typedef std::vector StringList; + + static TraceConfig* CreateDefaultTraceConfig(); + + TraceConfig() : enable_systrace_(false), enable_argument_filter_(false) {} + TraceRecordMode GetTraceRecordMode() const { return record_mode_; } + bool IsSystraceEnabled() const { return enable_systrace_; } + bool IsArgumentFilterEnabled() const { return enable_argument_filter_; } + + void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; } + void EnableSystrace() { enable_systrace_ = true; } + void EnableArgumentFilter() { enable_argument_filter_ = true; } + + void AddIncludedCategory(const char* included_category); + + bool IsCategoryGroupEnabled(const char* category_group) const; + + private: + TraceRecordMode record_mode_; + bool enable_systrace_ : 1; + bool enable_argument_filter_ : 1; + StringList included_categories_; + + // Disallow copy and assign + TraceConfig(const TraceConfig&) = delete; + void operator=(const TraceConfig&) = delete; +}; + +class V8_PLATFORM_EXPORT TracingController { + public: + enum Mode { DISABLED = 0, RECORDING_MODE }; + + // The pointer returned from GetCategoryGroupEnabledInternal() points to a + // value with zero or more of the following bits. Used in this class only. + // The TRACE_EVENT macros should only use the value as a bool. + // These values must be in sync with macro values in TraceEvent.h in Blink. + enum CategoryGroupEnabledFlags { + // Category group enabled for the recording mode. + ENABLED_FOR_RECORDING = 1 << 0, + // Category group enabled by SetEventCallbackEnabled(). + ENABLED_FOR_EVENT_CALLBACK = 1 << 2, + // Category group enabled to export events to ETW. + ENABLED_FOR_ETW_EXPORT = 1 << 3 + }; + + TracingController(); + ~TracingController(); + void Initialize(TraceBuffer* trace_buffer); + const uint8_t* GetCategoryGroupEnabled(const char* category_group); + static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag); + uint64_t AddTraceEvent( + char phase, const uint8_t* category_enabled_flag, const char* name, + const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args, + const char** arg_names, const uint8_t* arg_types, + const uint64_t* arg_values, + std::unique_ptr* arg_convertables, + unsigned int flags); + void UpdateTraceEventDuration(const uint8_t* category_enabled_flag, + const char* name, uint64_t handle); + + void StartTracing(TraceConfig* trace_config); + void StopTracing(); + + void AddTraceStateObserver(Platform::TraceStateObserver* observer); + void RemoveTraceStateObserver(Platform::TraceStateObserver* observer); + + private: + const uint8_t* GetCategoryGroupEnabledInternal(const char* category_group); + void UpdateCategoryGroupEnabledFlag(size_t category_index); + void UpdateCategoryGroupEnabledFlags(); + + std::unique_ptr trace_buffer_; + std::unique_ptr trace_config_; + std::unique_ptr mutex_; + std::unordered_set observers_; + Mode mode_ = DISABLED; + + // Disallow copy and assign + TracingController(const TracingController&) = delete; + void operator=(const TracingController&) = delete; +}; + +} // namespace tracing +} // namespace platform +} // namespace v8 + +#endif // V8_LIBPLATFORM_V8_TRACING_H_ diff --git a/calclib/src/main/cpp/include/v8-debug.h b/calclib/src/main/cpp/include/v8-debug.h new file mode 100644 index 0000000..6385a31 --- /dev/null +++ b/calclib/src/main/cpp/include/v8-debug.h @@ -0,0 +1,287 @@ +// Copyright 2008 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_V8_DEBUG_H_ +#define V8_V8_DEBUG_H_ + +#include "v8.h" // NOLINT(build/include) + +/** + * Debugger support for the V8 JavaScript engine. + */ +namespace v8 { + +// Debug events which can occur in the V8 JavaScript engine. +enum DebugEvent { + Break = 1, + Exception = 2, + NewFunction = 3, + BeforeCompile = 4, + AfterCompile = 5, + CompileError = 6, + AsyncTaskEvent = 7, +}; + +class V8_EXPORT Debug { + public: + /** + * A client object passed to the v8 debugger whose ownership will be taken by + * it. v8 is always responsible for deleting the object. + */ + class ClientData { + public: + virtual ~ClientData() {} + }; + + + /** + * A message object passed to the debug message handler. + */ + class Message { + public: + /** + * Check type of message. + */ + virtual bool IsEvent() const = 0; + virtual bool IsResponse() const = 0; + virtual DebugEvent GetEvent() const = 0; + + /** + * Indicate whether this is a response to a continue command which will + * start the VM running after this is processed. + */ + virtual bool WillStartRunning() const = 0; + + /** + * Access to execution state and event data. Don't store these cross + * callbacks as their content becomes invalid. These objects are from the + * debugger event that started the debug message loop. + */ + virtual Local GetExecutionState() const = 0; + virtual Local GetEventData() const = 0; + + /** + * Get the debugger protocol JSON. + */ + virtual Local GetJSON() const = 0; + + /** + * Get the context active when the debug event happened. Note this is not + * the current active context as the JavaScript part of the debugger is + * running in its own context which is entered at this point. + */ + virtual Local GetEventContext() const = 0; + + /** + * Client data passed with the corresponding request if any. This is the + * client_data data value passed into Debug::SendCommand along with the + * request that led to the message or NULL if the message is an event. The + * debugger takes ownership of the data and will delete it even if there is + * no message handler. + */ + virtual ClientData* GetClientData() const = 0; + + virtual Isolate* GetIsolate() const = 0; + + virtual ~Message() {} + }; + + + /** + * An event details object passed to the debug event listener. + */ + class EventDetails { + public: + /** + * Event type. + */ + virtual DebugEvent GetEvent() const = 0; + + /** + * Access to execution state and event data of the debug event. Don't store + * these cross callbacks as their content becomes invalid. + */ + virtual Local GetExecutionState() const = 0; + virtual Local GetEventData() const = 0; + + /** + * Get the context active when the debug event happened. Note this is not + * the current active context as the JavaScript part of the debugger is + * running in its own context which is entered at this point. + */ + virtual Local GetEventContext() const = 0; + + /** + * Client data passed with the corresponding callback when it was + * registered. + */ + virtual Local GetCallbackData() const = 0; + + /** + * Client data passed to DebugBreakForCommand function. The + * debugger takes ownership of the data and will delete it even if + * there is no message handler. + */ + virtual ClientData* GetClientData() const = 0; + + virtual Isolate* GetIsolate() const = 0; + + virtual ~EventDetails() {} + }; + + /** + * Debug event callback function. + * + * \param event_details object providing information about the debug event + * + * A EventCallback2 does not take possession of the event data, + * and must not rely on the data persisting after the handler returns. + */ + typedef void (*EventCallback)(const EventDetails& event_details); + + /** + * Debug message callback function. + * + * \param message the debug message handler message object + * + * A MessageHandler2 does not take possession of the message data, + * and must not rely on the data persisting after the handler returns. + */ + typedef void (*MessageHandler)(const Message& message); + + /** + * Callback function for the host to ensure debug messages are processed. + */ + typedef void (*DebugMessageDispatchHandler)(); + + static bool SetDebugEventListener(Isolate* isolate, EventCallback that, + Local data = Local()); + + // Schedule a debugger break to happen when JavaScript code is run + // in the given isolate. + static void DebugBreak(Isolate* isolate); + + // Remove scheduled debugger break in given isolate if it has not + // happened yet. + static void CancelDebugBreak(Isolate* isolate); + + // Check if a debugger break is scheduled in the given isolate. + static bool CheckDebugBreak(Isolate* isolate); + + // Message based interface. The message protocol is JSON. + static void SetMessageHandler(Isolate* isolate, MessageHandler handler); + + static void SendCommand(Isolate* isolate, + const uint16_t* command, int length, + ClientData* client_data = NULL); + + /** + * Run a JavaScript function in the debugger. + * \param fun the function to call + * \param data passed as second argument to the function + * With this call the debugger is entered and the function specified is called + * with the execution state as the first argument. This makes it possible to + * get access to information otherwise not available during normal JavaScript + * execution e.g. details on stack frames. Receiver of the function call will + * be the debugger context global object, however this is a subject to change. + * The following example shows a JavaScript function which when passed to + * v8::Debug::Call will return the current line of JavaScript execution. + * + * \code + * function frame_source_line(exec_state) { + * return exec_state.frame(0).sourceLine(); + * } + * \endcode + */ + // TODO(dcarney): data arg should be a MaybeLocal + static MaybeLocal Call(Local context, + v8::Local fun, + Local data = Local()); + + /** + * Returns a mirror object for the given object. + */ + static MaybeLocal GetMirror(Local context, + v8::Local obj); + + /** + * Makes V8 process all pending debug messages. + * + * From V8 point of view all debug messages come asynchronously (e.g. from + * remote debugger) but they all must be handled synchronously: V8 cannot + * do 2 things at one time so normal script execution must be interrupted + * for a while. + * + * Generally when message arrives V8 may be in one of 3 states: + * 1. V8 is running script; V8 will automatically interrupt and process all + * pending messages; + * 2. V8 is suspended on debug breakpoint; in this state V8 is dedicated + * to reading and processing debug messages; + * 3. V8 is not running at all or has called some long-working C++ function; + * by default it means that processing of all debug messages will be deferred + * until V8 gets control again; however, embedding application may improve + * this by manually calling this method. + * + * Technically this method in many senses is equivalent to executing empty + * script: + * 1. It does nothing except for processing all pending debug messages. + * 2. It should be invoked with the same precautions and from the same context + * as V8 script would be invoked from, because: + * a. with "evaluate" command it can do whatever normal script can do, + * including all native calls; + * b. no other thread should call V8 while this method is running + * (v8::Locker may be used here). + * + * "Evaluate" debug command behavior currently is not specified in scope + * of this method. + */ + static void ProcessDebugMessages(Isolate* isolate); + + /** + * Debugger is running in its own context which is entered while debugger + * messages are being dispatched. This is an explicit getter for this + * debugger context. Note that the content of the debugger context is subject + * to change. The Context exists only when the debugger is active, i.e. at + * least one DebugEventListener or MessageHandler is set. + */ + static Local GetDebugContext(Isolate* isolate); + + /** + * While in the debug context, this method returns the top-most non-debug + * context, if it exists. + */ + static MaybeLocal GetDebuggedContext(Isolate* isolate); + + /** + * Enable/disable LiveEdit functionality for the given Isolate + * (default Isolate if not provided). V8 will abort if LiveEdit is + * unexpectedly used. LiveEdit is enabled by default. + */ + static void SetLiveEditEnabled(Isolate* isolate, bool enable); + + /** + * Returns array of internal properties specific to the value type. Result has + * the following format: [, ,...,, ]. Result array + * will be allocated in the current context. + */ + static MaybeLocal GetInternalProperties(Isolate* isolate, + Local value); + + /** + * Defines if the ES2015 tail call elimination feature is enabled or not. + * The change of this flag triggers deoptimization of all functions that + * contain calls at tail position. + */ + static bool IsTailCallEliminationEnabled(Isolate* isolate); + static void SetTailCallEliminationEnabled(Isolate* isolate, bool enabled); +}; + + +} // namespace v8 + + +#undef EXPORT + + +#endif // V8_V8_DEBUG_H_ diff --git a/calclib/src/main/cpp/include/v8-experimental.h b/calclib/src/main/cpp/include/v8-experimental.h new file mode 100644 index 0000000..1773345 --- /dev/null +++ b/calclib/src/main/cpp/include/v8-experimental.h @@ -0,0 +1,58 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * This header contains a set of experimental V8 APIs. We hope these will + * become a part of standard V8, but they may also be removed if we deem the + * experiment to not be successul. + */ +#ifndef V8_INCLUDE_V8_EXPERIMENTAL_H_ +#define V8_INCLUDE_V8_EXPERIMENTAL_H_ + +#include "v8.h" // NOLINT(build/include) + +namespace v8 { +namespace experimental { + +// Allow the embedder to construct accessors that V8 can compile and use +// directly, without jumping into the runtime. +class V8_EXPORT FastAccessorBuilder { + public: + struct ValueId { + size_t value_id; + }; + struct LabelId { + size_t label_id; + }; + + static FastAccessorBuilder* New(Isolate* isolate); + + ValueId IntegerConstant(int int_constant); + ValueId GetReceiver(); + ValueId LoadInternalField(ValueId value_id, int field_no); + ValueId LoadInternalFieldUnchecked(ValueId value_id, int field_no); + ValueId LoadValue(ValueId value_id, int offset); + ValueId LoadObject(ValueId value_id, int offset); + ValueId ToSmi(ValueId value_id); + + void ReturnValue(ValueId value_id); + void CheckFlagSetOrReturnNull(ValueId value_id, int mask); + void CheckNotZeroOrReturnNull(ValueId value_id); + LabelId MakeLabel(); + void SetLabel(LabelId label_id); + void Goto(LabelId label_id); + void CheckNotZeroOrJump(ValueId value_id, LabelId label_id); + ValueId Call(v8::FunctionCallback callback, ValueId value_id); + + private: + FastAccessorBuilder() = delete; + FastAccessorBuilder(const FastAccessorBuilder&) = delete; + ~FastAccessorBuilder() = delete; + void operator=(const FastAccessorBuilder&) = delete; +}; + +} // namespace experimental +} // namespace v8 + +#endif // V8_INCLUDE_V8_EXPERIMENTAL_H_ diff --git a/calclib/src/main/cpp/include/v8-platform.h b/calclib/src/main/cpp/include/v8-platform.h new file mode 100644 index 0000000..e115674 --- /dev/null +++ b/calclib/src/main/cpp/include/v8-platform.h @@ -0,0 +1,219 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_V8_PLATFORM_H_ +#define V8_V8_PLATFORM_H_ + +#include +#include +#include +#include + +namespace v8 { + +class Isolate; + +/** + * A Task represents a unit of work. + */ +class Task { + public: + virtual ~Task() = default; + + virtual void Run() = 0; +}; + +/** + * An IdleTask represents a unit of work to be performed in idle time. + * The Run method is invoked with an argument that specifies the deadline in + * seconds returned by MonotonicallyIncreasingTime(). + * The idle task is expected to complete by this deadline. + */ +class IdleTask { + public: + virtual ~IdleTask() = default; + virtual void Run(double deadline_in_seconds) = 0; +}; + +/** + * The interface represents complex arguments to trace events. + */ +class ConvertableToTraceFormat { + public: + virtual ~ConvertableToTraceFormat() = default; + + /** + * Append the class info to the provided |out| string. The appended + * data must be a valid JSON object. Strings must be properly quoted, and + * escaped. There is no processing applied to the content after it is + * appended. + */ + virtual void AppendAsTraceFormat(std::string* out) const = 0; +}; + +/** + * V8 Platform abstraction layer. + * + * The embedder has to provide an implementation of this interface before + * initializing the rest of V8. + */ +class Platform { + public: + /** + * This enum is used to indicate whether a task is potentially long running, + * or causes a long wait. The embedder might want to use this hint to decide + * whether to execute the task on a dedicated thread. + */ + enum ExpectedRuntime { + kShortRunningTask, + kLongRunningTask + }; + + virtual ~Platform() = default; + + /** + * Gets the number of threads that are used to execute background tasks. Is + * used to estimate the number of tasks a work package should be split into. + * A return value of 0 means that there are no background threads available. + * Note that a value of 0 won't prohibit V8 from posting tasks using + * |CallOnBackgroundThread|. + */ + virtual size_t NumberOfAvailableBackgroundThreads() { return 0; } + + /** + * Schedules a task to be invoked on a background thread. |expected_runtime| + * indicates that the task will run a long time. The Platform implementation + * takes ownership of |task|. There is no guarantee about order of execution + * of tasks wrt order of scheduling, nor is there a guarantee about the + * thread the task will be run on. + */ + virtual void CallOnBackgroundThread(Task* task, + ExpectedRuntime expected_runtime) = 0; + + /** + * Schedules a task to be invoked on a foreground thread wrt a specific + * |isolate|. Tasks posted for the same isolate should be execute in order of + * scheduling. The definition of "foreground" is opaque to V8. + */ + virtual void CallOnForegroundThread(Isolate* isolate, Task* task) = 0; + + /** + * Schedules a task to be invoked on a foreground thread wrt a specific + * |isolate| after the given number of seconds |delay_in_seconds|. + * Tasks posted for the same isolate should be execute in order of + * scheduling. The definition of "foreground" is opaque to V8. + */ + virtual void CallDelayedOnForegroundThread(Isolate* isolate, Task* task, + double delay_in_seconds) = 0; + + /** + * Schedules a task to be invoked on a foreground thread wrt a specific + * |isolate| when the embedder is idle. + * Requires that SupportsIdleTasks(isolate) is true. + * Idle tasks may be reordered relative to other task types and may be + * starved for an arbitrarily long time if no idle time is available. + * The definition of "foreground" is opaque to V8. + */ + virtual void CallIdleOnForegroundThread(Isolate* isolate, IdleTask* task) { + // TODO(ulan): Make this function abstract after V8 roll in Chromium. + } + + /** + * Returns true if idle tasks are enabled for the given |isolate|. + */ + virtual bool IdleTasksEnabled(Isolate* isolate) { + // TODO(ulan): Make this function abstract after V8 roll in Chromium. + return false; + } + + /** + * Monotonically increasing time in seconds from an arbitrary fixed point in + * the past. This function is expected to return at least + * millisecond-precision values. For this reason, + * it is recommended that the fixed point be no further in the past than + * the epoch. + **/ + virtual double MonotonicallyIncreasingTime() = 0; + + /** + * Called by TRACE_EVENT* macros, don't call this directly. + * The name parameter is a category group for example: + * TRACE_EVENT0("v8,parse", "V8.Parse") + * The pointer returned points to a value with zero or more of the bits + * defined in CategoryGroupEnabledFlags. + **/ + virtual const uint8_t* GetCategoryGroupEnabled(const char* name) { + static uint8_t no = 0; + return &no; + } + + /** + * Gets the category group name of the given category_enabled_flag pointer. + * Usually used while serliazing TRACE_EVENTs. + **/ + virtual const char* GetCategoryGroupName( + const uint8_t* category_enabled_flag) { + static const char dummy[] = "dummy"; + return dummy; + } + + /** + * Adds a trace event to the platform tracing system. This function call is + * usually the result of a TRACE_* macro from trace_event_common.h when + * tracing and the category of the particular trace are enabled. It is not + * advisable to call this function on its own; it is really only meant to be + * used by the trace macros. The returned handle can be used by + * UpdateTraceEventDuration to update the duration of COMPLETE events. + */ + virtual uint64_t AddTraceEvent( + char phase, const uint8_t* category_enabled_flag, const char* name, + const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args, + const char** arg_names, const uint8_t* arg_types, + const uint64_t* arg_values, unsigned int flags) { + return 0; + } + + /** + * Adds a trace event to the platform tracing system. This function call is + * usually the result of a TRACE_* macro from trace_event_common.h when + * tracing and the category of the particular trace are enabled. It is not + * advisable to call this function on its own; it is really only meant to be + * used by the trace macros. The returned handle can be used by + * UpdateTraceEventDuration to update the duration of COMPLETE events. + */ + virtual uint64_t AddTraceEvent( + char phase, const uint8_t* category_enabled_flag, const char* name, + const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args, + const char** arg_names, const uint8_t* arg_types, + const uint64_t* arg_values, + std::unique_ptr* arg_convertables, + unsigned int flags) { + return AddTraceEvent(phase, category_enabled_flag, name, scope, id, bind_id, + num_args, arg_names, arg_types, arg_values, flags); + } + + /** + * Sets the duration field of a COMPLETE trace event. It must be called with + * the handle returned from AddTraceEvent(). + **/ + virtual void UpdateTraceEventDuration(const uint8_t* category_enabled_flag, + const char* name, uint64_t handle) {} + + class TraceStateObserver { + public: + virtual ~TraceStateObserver() = default; + virtual void OnTraceEnabled() = 0; + virtual void OnTraceDisabled() = 0; + }; + + /** Adds tracing state change observer. */ + virtual void AddTraceStateObserver(TraceStateObserver*) {} + + /** Removes tracing state change observer. */ + virtual void RemoveTraceStateObserver(TraceStateObserver*) {} +}; + +} // namespace v8 + +#endif // V8_V8_PLATFORM_H_ diff --git a/calclib/src/main/cpp/include/v8-profiler.h b/calclib/src/main/cpp/include/v8-profiler.h new file mode 100644 index 0000000..6ee0340 --- /dev/null +++ b/calclib/src/main/cpp/include/v8-profiler.h @@ -0,0 +1,897 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_V8_PROFILER_H_ +#define V8_V8_PROFILER_H_ + +#include +#include "v8.h" // NOLINT(build/include) + +/** + * Profiler support for the V8 JavaScript engine. + */ +namespace v8 { + +class HeapGraphNode; +struct HeapStatsUpdate; + +typedef uint32_t SnapshotObjectId; + + +struct CpuProfileDeoptFrame { + int script_id; + size_t position; +}; + +} // namespace v8 + +#ifdef V8_OS_WIN +template class V8_EXPORT std::vector; +#endif + +namespace v8 { + +struct V8_EXPORT CpuProfileDeoptInfo { + /** A pointer to a static string owned by v8. */ + const char* deopt_reason; + std::vector stack; +}; + +} // namespace v8 + +#ifdef V8_OS_WIN +template class V8_EXPORT std::vector; +#endif + +namespace v8 { + +/** + * TracingCpuProfiler monitors tracing being enabled/disabled + * and emits CpuProfile trace events once v8.cpu_profile2 tracing category + * is enabled. It has no overhead unless the category is enabled. + */ +class V8_EXPORT TracingCpuProfiler { + public: + static std::unique_ptr Create(Isolate*); + virtual ~TracingCpuProfiler() = default; + + protected: + TracingCpuProfiler() = default; +}; + +// TickSample captures the information collected for each sample. +struct TickSample { + // Internal profiling (with --prof + tools/$OS-tick-processor) wants to + // include the runtime function we're calling. Externally exposed tick + // samples don't care. + enum RecordCEntryFrame { kIncludeCEntryFrame, kSkipCEntryFrame }; + + TickSample() + : state(OTHER), + pc(nullptr), + external_callback_entry(nullptr), + frames_count(0), + has_external_callback(false), + update_stats(true) {} + + /** + * Initialize a tick sample from the isolate. + * \param isolate The isolate. + * \param state Execution state. + * \param record_c_entry_frame Include or skip the runtime function. + * \param update_stats Whether update the sample to the aggregated stats. + * \param use_simulator_reg_state When set to true and V8 is running under a + * simulator, the method will use the simulator + * register state rather than the one provided + * with |state| argument. Otherwise the method + * will use provided register |state| as is. + */ + void Init(Isolate* isolate, const v8::RegisterState& state, + RecordCEntryFrame record_c_entry_frame, bool update_stats, + bool use_simulator_reg_state = true); + /** + * Get a call stack sample from the isolate. + * \param isolate The isolate. + * \param state Register state. + * \param record_c_entry_frame Include or skip the runtime function. + * \param frames Caller allocated buffer to store stack frames. + * \param frames_limit Maximum number of frames to capture. The buffer must + * be large enough to hold the number of frames. + * \param sample_info The sample info is filled up by the function + * provides number of actual captured stack frames and + * the current VM state. + * \param use_simulator_reg_state When set to true and V8 is running under a + * simulator, the method will use the simulator + * register state rather than the one provided + * with |state| argument. Otherwise the method + * will use provided register |state| as is. + * \note GetStackSample is thread and signal safe and should only be called + * when the JS thread is paused or interrupted. + * Otherwise the behavior is undefined. + */ + static bool GetStackSample(Isolate* isolate, v8::RegisterState* state, + RecordCEntryFrame record_c_entry_frame, + void** frames, size_t frames_limit, + v8::SampleInfo* sample_info, + bool use_simulator_reg_state = true); + StateTag state; // The state of the VM. + void* pc; // Instruction pointer. + union { + void* tos; // Top stack value (*sp). + void* external_callback_entry; + }; + static const unsigned kMaxFramesCountLog2 = 8; + static const unsigned kMaxFramesCount = (1 << kMaxFramesCountLog2) - 1; + void* stack[kMaxFramesCount]; // Call stack. + unsigned frames_count : kMaxFramesCountLog2; // Number of captured frames. + bool has_external_callback : 1; + bool update_stats : 1; // Whether the sample should update aggregated stats. +}; + +/** + * CpuProfileNode represents a node in a call graph. + */ +class V8_EXPORT CpuProfileNode { + public: + struct LineTick { + /** The 1-based number of the source line where the function originates. */ + int line; + + /** The count of samples associated with the source line. */ + unsigned int hit_count; + }; + + /** Returns function name (empty string for anonymous functions.) */ + Local GetFunctionName() const; + + /** + * Returns function name (empty string for anonymous functions.) + * The string ownership is *not* passed to the caller. It stays valid until + * profile is deleted. The function is thread safe. + */ + const char* GetFunctionNameStr() const; + + /** Returns id of the script where function is located. */ + int GetScriptId() const; + + /** Returns resource name for script from where the function originates. */ + Local GetScriptResourceName() const; + + /** + * Returns resource name for script from where the function originates. + * The string ownership is *not* passed to the caller. It stays valid until + * profile is deleted. The function is thread safe. + */ + const char* GetScriptResourceNameStr() const; + + /** + * Returns the number, 1-based, of the line where the function originates. + * kNoLineNumberInfo if no line number information is available. + */ + int GetLineNumber() const; + + /** + * Returns 1-based number of the column where the function originates. + * kNoColumnNumberInfo if no column number information is available. + */ + int GetColumnNumber() const; + + /** + * Returns the number of the function's source lines that collect the samples. + */ + unsigned int GetHitLineCount() const; + + /** Returns the set of source lines that collect the samples. + * The caller allocates buffer and responsible for releasing it. + * True if all available entries are copied, otherwise false. + * The function copies nothing if buffer is not large enough. + */ + bool GetLineTicks(LineTick* entries, unsigned int length) const; + + /** Returns bailout reason for the function + * if the optimization was disabled for it. + */ + const char* GetBailoutReason() const; + + /** + * Returns the count of samples where the function was currently executing. + */ + unsigned GetHitCount() const; + + /** Returns function entry UID. */ + V8_DEPRECATE_SOON( + "Use GetScriptId, GetLineNumber, and GetColumnNumber instead.", + unsigned GetCallUid() const); + + /** Returns id of the node. The id is unique within the tree */ + unsigned GetNodeId() const; + + /** Returns child nodes count of the node. */ + int GetChildrenCount() const; + + /** Retrieves a child node by index. */ + const CpuProfileNode* GetChild(int index) const; + + /** Retrieves deopt infos for the node. */ + const std::vector& GetDeoptInfos() const; + + static const int kNoLineNumberInfo = Message::kNoLineNumberInfo; + static const int kNoColumnNumberInfo = Message::kNoColumnInfo; +}; + + +/** + * CpuProfile contains a CPU profile in a form of top-down call tree + * (from main() down to functions that do all the work). + */ +class V8_EXPORT CpuProfile { + public: + /** Returns CPU profile title. */ + Local GetTitle() const; + + /** Returns the root node of the top down call tree. */ + const CpuProfileNode* GetTopDownRoot() const; + + /** + * Returns number of samples recorded. The samples are not recorded unless + * |record_samples| parameter of CpuProfiler::StartCpuProfiling is true. + */ + int GetSamplesCount() const; + + /** + * Returns profile node corresponding to the top frame the sample at + * the given index. + */ + const CpuProfileNode* GetSample(int index) const; + + /** + * Returns the timestamp of the sample. The timestamp is the number of + * microseconds since some unspecified starting point. + * The point is equal to the starting point used by GetStartTime. + */ + int64_t GetSampleTimestamp(int index) const; + + /** + * Returns time when the profile recording was started (in microseconds) + * since some unspecified starting point. + */ + int64_t GetStartTime() const; + + /** + * Returns time when the profile recording was stopped (in microseconds) + * since some unspecified starting point. + * The point is equal to the starting point used by GetStartTime. + */ + int64_t GetEndTime() const; + + /** + * Deletes the profile and removes it from CpuProfiler's list. + * All pointers to nodes previously returned become invalid. + */ + void Delete(); +}; + +/** + * Interface for controlling CPU profiling. Instance of the + * profiler can be created using v8::CpuProfiler::New method. + */ +class V8_EXPORT CpuProfiler { + public: + /** + * Creates a new CPU profiler for the |isolate|. The isolate must be + * initialized. The profiler object must be disposed after use by calling + * |Dispose| method. + */ + static CpuProfiler* New(Isolate* isolate); + + /** + * Disposes the CPU profiler object. + */ + void Dispose(); + + /** + * Changes default CPU profiler sampling interval to the specified number + * of microseconds. Default interval is 1000us. This method must be called + * when there are no profiles being recorded. + */ + void SetSamplingInterval(int us); + + /** + * Starts collecting CPU profile. Title may be an empty string. It + * is allowed to have several profiles being collected at + * once. Attempts to start collecting several profiles with the same + * title are silently ignored. While collecting a profile, functions + * from all security contexts are included in it. The token-based + * filtering is only performed when querying for a profile. + * + * |record_samples| parameter controls whether individual samples should + * be recorded in addition to the aggregated tree. + */ + void StartProfiling(Local title, bool record_samples = false); + + /** + * Stops collecting CPU profile with a given title and returns it. + * If the title given is empty, finishes the last profile started. + */ + CpuProfile* StopProfiling(Local title); + + /** + * Force collection of a sample. Must be called on the VM thread. + * Recording the forced sample does not contribute to the aggregated + * profile statistics. + */ + void CollectSample(); + + /** + * Tells the profiler whether the embedder is idle. + */ + void SetIdle(bool is_idle); + + private: + CpuProfiler(); + ~CpuProfiler(); + CpuProfiler(const CpuProfiler&); + CpuProfiler& operator=(const CpuProfiler&); +}; + + +/** + * HeapSnapshotEdge represents a directed connection between heap + * graph nodes: from retainers to retained nodes. + */ +class V8_EXPORT HeapGraphEdge { + public: + enum Type { + kContextVariable = 0, // A variable from a function context. + kElement = 1, // An element of an array. + kProperty = 2, // A named object property. + kInternal = 3, // A link that can't be accessed from JS, + // thus, its name isn't a real property name + // (e.g. parts of a ConsString). + kHidden = 4, // A link that is needed for proper sizes + // calculation, but may be hidden from user. + kShortcut = 5, // A link that must not be followed during + // sizes calculation. + kWeak = 6 // A weak reference (ignored by the GC). + }; + + /** Returns edge type (see HeapGraphEdge::Type). */ + Type GetType() const; + + /** + * Returns edge name. This can be a variable name, an element index, or + * a property name. + */ + Local GetName() const; + + /** Returns origin node. */ + const HeapGraphNode* GetFromNode() const; + + /** Returns destination node. */ + const HeapGraphNode* GetToNode() const; +}; + + +/** + * HeapGraphNode represents a node in a heap graph. + */ +class V8_EXPORT HeapGraphNode { + public: + enum Type { + kHidden = 0, // Hidden node, may be filtered when shown to user. + kArray = 1, // An array of elements. + kString = 2, // A string. + kObject = 3, // A JS object (except for arrays and strings). + kCode = 4, // Compiled code. + kClosure = 5, // Function closure. + kRegExp = 6, // RegExp. + kHeapNumber = 7, // Number stored in the heap. + kNative = 8, // Native object (not from V8 heap). + kSynthetic = 9, // Synthetic object, usualy used for grouping + // snapshot items together. + kConsString = 10, // Concatenated string. A pair of pointers to strings. + kSlicedString = 11, // Sliced string. A fragment of another string. + kSymbol = 12, // A Symbol (ES6). + kSimdValue = 13 // A SIMD value stored in the heap (Proposed ES7). + }; + + /** Returns node type (see HeapGraphNode::Type). */ + Type GetType() const; + + /** + * Returns node name. Depending on node's type this can be the name + * of the constructor (for objects), the name of the function (for + * closures), string value, or an empty string (for compiled code). + */ + Local GetName() const; + + /** + * Returns node id. For the same heap object, the id remains the same + * across all snapshots. + */ + SnapshotObjectId GetId() const; + + /** Returns node's own size, in bytes. */ + size_t GetShallowSize() const; + + /** Returns child nodes count of the node. */ + int GetChildrenCount() const; + + /** Retrieves a child by index. */ + const HeapGraphEdge* GetChild(int index) const; +}; + + +/** + * An interface for exporting data from V8, using "push" model. + */ +class V8_EXPORT OutputStream { // NOLINT + public: + enum WriteResult { + kContinue = 0, + kAbort = 1 + }; + virtual ~OutputStream() {} + /** Notify about the end of stream. */ + virtual void EndOfStream() = 0; + /** Get preferred output chunk size. Called only once. */ + virtual int GetChunkSize() { return 1024; } + /** + * Writes the next chunk of snapshot data into the stream. Writing + * can be stopped by returning kAbort as function result. EndOfStream + * will not be called in case writing was aborted. + */ + virtual WriteResult WriteAsciiChunk(char* data, int size) = 0; + /** + * Writes the next chunk of heap stats data into the stream. Writing + * can be stopped by returning kAbort as function result. EndOfStream + * will not be called in case writing was aborted. + */ + virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) { + return kAbort; + } +}; + + +/** + * HeapSnapshots record the state of the JS heap at some moment. + */ +class V8_EXPORT HeapSnapshot { + public: + enum SerializationFormat { + kJSON = 0 // See format description near 'Serialize' method. + }; + + /** Returns the root node of the heap graph. */ + const HeapGraphNode* GetRoot() const; + + /** Returns a node by its id. */ + const HeapGraphNode* GetNodeById(SnapshotObjectId id) const; + + /** Returns total nodes count in the snapshot. */ + int GetNodesCount() const; + + /** Returns a node by index. */ + const HeapGraphNode* GetNode(int index) const; + + /** Returns a max seen JS object Id. */ + SnapshotObjectId GetMaxSnapshotJSObjectId() const; + + /** + * Deletes the snapshot and removes it from HeapProfiler's list. + * All pointers to nodes, edges and paths previously returned become + * invalid. + */ + void Delete(); + + /** + * Prepare a serialized representation of the snapshot. The result + * is written into the stream provided in chunks of specified size. + * The total length of the serialized snapshot is unknown in + * advance, it can be roughly equal to JS heap size (that means, + * it can be really big - tens of megabytes). + * + * For the JSON format, heap contents are represented as an object + * with the following structure: + * + * { + * snapshot: { + * title: "...", + * uid: nnn, + * meta: { meta-info }, + * node_count: nnn, + * edge_count: nnn + * }, + * nodes: [nodes array], + * edges: [edges array], + * strings: [strings array] + * } + * + * Nodes reference strings, other nodes, and edges by their indexes + * in corresponding arrays. + */ + void Serialize(OutputStream* stream, + SerializationFormat format = kJSON) const; +}; + + +/** + * An interface for reporting progress and controlling long-running + * activities. + */ +class V8_EXPORT ActivityControl { // NOLINT + public: + enum ControlOption { + kContinue = 0, + kAbort = 1 + }; + virtual ~ActivityControl() {} + /** + * Notify about current progress. The activity can be stopped by + * returning kAbort as the callback result. + */ + virtual ControlOption ReportProgressValue(int done, int total) = 0; +}; + + +/** + * AllocationProfile is a sampled profile of allocations done by the program. + * This is structured as a call-graph. + */ +class V8_EXPORT AllocationProfile { + public: + struct Allocation { + /** + * Size of the sampled allocation object. + */ + size_t size; + + /** + * The number of objects of such size that were sampled. + */ + unsigned int count; + }; + + /** + * Represents a node in the call-graph. + */ + struct Node { + /** + * Name of the function. May be empty for anonymous functions or if the + * script corresponding to this function has been unloaded. + */ + Local name; + + /** + * Name of the script containing the function. May be empty if the script + * name is not available, or if the script has been unloaded. + */ + Local script_name; + + /** + * id of the script where the function is located. May be equal to + * v8::UnboundScript::kNoScriptId in cases where the script doesn't exist. + */ + int script_id; + + /** + * Start position of the function in the script. + */ + int start_position; + + /** + * 1-indexed line number where the function starts. May be + * kNoLineNumberInfo if no line number information is available. + */ + int line_number; + + /** + * 1-indexed column number where the function starts. May be + * kNoColumnNumberInfo if no line number information is available. + */ + int column_number; + + /** + * List of callees called from this node for which we have sampled + * allocations. The lifetime of the children is scoped to the containing + * AllocationProfile. + */ + std::vector children; + + /** + * List of self allocations done by this node in the call-graph. + */ + std::vector allocations; + }; + + /** + * Returns the root node of the call-graph. The root node corresponds to an + * empty JS call-stack. The lifetime of the returned Node* is scoped to the + * containing AllocationProfile. + */ + virtual Node* GetRootNode() = 0; + + virtual ~AllocationProfile() {} + + static const int kNoLineNumberInfo = Message::kNoLineNumberInfo; + static const int kNoColumnNumberInfo = Message::kNoColumnInfo; +}; + + +/** + * Interface for controlling heap profiling. Instance of the + * profiler can be retrieved using v8::Isolate::GetHeapProfiler. + */ +class V8_EXPORT HeapProfiler { + public: + enum SamplingFlags { + kSamplingNoFlags = 0, + kSamplingForceGC = 1 << 0, + }; + + /** + * Callback function invoked for obtaining RetainedObjectInfo for + * the given JavaScript wrapper object. It is prohibited to enter V8 + * while the callback is running: only getters on the handle and + * GetPointerFromInternalField on the objects are allowed. + */ + typedef RetainedObjectInfo* (*WrapperInfoCallback)(uint16_t class_id, + Local wrapper); + + /** Returns the number of snapshots taken. */ + int GetSnapshotCount(); + + /** Returns a snapshot by index. */ + const HeapSnapshot* GetHeapSnapshot(int index); + + /** + * Returns SnapshotObjectId for a heap object referenced by |value| if + * it has been seen by the heap profiler, kUnknownObjectId otherwise. + */ + SnapshotObjectId GetObjectId(Local value); + + /** + * Returns heap object with given SnapshotObjectId if the object is alive, + * otherwise empty handle is returned. + */ + Local FindObjectById(SnapshotObjectId id); + + /** + * Clears internal map from SnapshotObjectId to heap object. The new objects + * will not be added into it unless a heap snapshot is taken or heap object + * tracking is kicked off. + */ + void ClearObjectIds(); + + /** + * A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return + * it in case heap profiler cannot find id for the object passed as + * parameter. HeapSnapshot::GetNodeById will always return NULL for such id. + */ + static const SnapshotObjectId kUnknownObjectId = 0; + + /** + * Callback interface for retrieving user friendly names of global objects. + */ + class ObjectNameResolver { + public: + /** + * Returns name to be used in the heap snapshot for given node. Returned + * string must stay alive until snapshot collection is completed. + */ + virtual const char* GetName(Local object) = 0; + + protected: + virtual ~ObjectNameResolver() {} + }; + + /** + * Takes a heap snapshot and returns it. + */ + const HeapSnapshot* TakeHeapSnapshot( + ActivityControl* control = NULL, + ObjectNameResolver* global_object_name_resolver = NULL); + + /** + * Starts tracking of heap objects population statistics. After calling + * this method, all heap objects relocations done by the garbage collector + * are being registered. + * + * |track_allocations| parameter controls whether stack trace of each + * allocation in the heap will be recorded and reported as part of + * HeapSnapshot. + */ + void StartTrackingHeapObjects(bool track_allocations = false); + + /** + * Adds a new time interval entry to the aggregated statistics array. The + * time interval entry contains information on the current heap objects + * population size. The method also updates aggregated statistics and + * reports updates for all previous time intervals via the OutputStream + * object. Updates on each time interval are provided as a stream of the + * HeapStatsUpdate structure instances. + * If |timestamp_us| is supplied, timestamp of the new entry will be written + * into it. The return value of the function is the last seen heap object Id. + * + * StartTrackingHeapObjects must be called before the first call to this + * method. + */ + SnapshotObjectId GetHeapStats(OutputStream* stream, + int64_t* timestamp_us = NULL); + + /** + * Stops tracking of heap objects population statistics, cleans up all + * collected data. StartHeapObjectsTracking must be called again prior to + * calling GetHeapStats next time. + */ + void StopTrackingHeapObjects(); + + /** + * Starts gathering a sampling heap profile. A sampling heap profile is + * similar to tcmalloc's heap profiler and Go's mprof. It samples object + * allocations and builds an online 'sampling' heap profile. At any point in + * time, this profile is expected to be a representative sample of objects + * currently live in the system. Each sampled allocation includes the stack + * trace at the time of allocation, which makes this really useful for memory + * leak detection. + * + * This mechanism is intended to be cheap enough that it can be used in + * production with minimal performance overhead. + * + * Allocations are sampled using a randomized Poisson process. On average, one + * allocation will be sampled every |sample_interval| bytes allocated. The + * |stack_depth| parameter controls the maximum number of stack frames to be + * captured on each allocation. + * + * NOTE: This is a proof-of-concept at this point. Right now we only sample + * newspace allocations. Support for paged space allocation (e.g. pre-tenured + * objects, large objects, code objects, etc.) and native allocations + * doesn't exist yet, but is anticipated in the future. + * + * Objects allocated before the sampling is started will not be included in + * the profile. + * + * Returns false if a sampling heap profiler is already running. + */ + bool StartSamplingHeapProfiler(uint64_t sample_interval = 512 * 1024, + int stack_depth = 16, + SamplingFlags flags = kSamplingNoFlags); + + /** + * Stops the sampling heap profile and discards the current profile. + */ + void StopSamplingHeapProfiler(); + + /** + * Returns the sampled profile of allocations allocated (and still live) since + * StartSamplingHeapProfiler was called. The ownership of the pointer is + * transfered to the caller. Returns nullptr if sampling heap profiler is not + * active. + */ + AllocationProfile* GetAllocationProfile(); + + /** + * Deletes all snapshots taken. All previously returned pointers to + * snapshots and their contents become invalid after this call. + */ + void DeleteAllHeapSnapshots(); + + /** Binds a callback to embedder's class ID. */ + void SetWrapperClassInfoProvider( + uint16_t class_id, + WrapperInfoCallback callback); + + /** + * Default value of persistent handle class ID. Must not be used to + * define a class. Can be used to reset a class of a persistent + * handle. + */ + static const uint16_t kPersistentHandleNoClassId = 0; + + /** Returns memory used for profiler internal data and snapshots. */ + size_t GetProfilerMemorySize(); + + /** + * Sets a RetainedObjectInfo for an object group (see V8::SetObjectGroupId). + */ + void SetRetainedObjectInfo(UniqueId id, RetainedObjectInfo* info); + + private: + HeapProfiler(); + ~HeapProfiler(); + HeapProfiler(const HeapProfiler&); + HeapProfiler& operator=(const HeapProfiler&); +}; + +/** + * Interface for providing information about embedder's objects + * held by global handles. This information is reported in two ways: + * + * 1. When calling AddObjectGroup, an embedder may pass + * RetainedObjectInfo instance describing the group. To collect + * this information while taking a heap snapshot, V8 calls GC + * prologue and epilogue callbacks. + * + * 2. When a heap snapshot is collected, V8 additionally + * requests RetainedObjectInfos for persistent handles that + * were not previously reported via AddObjectGroup. + * + * Thus, if an embedder wants to provide information about native + * objects for heap snapshots, it can do it in a GC prologue + * handler, and / or by assigning wrapper class ids in the following way: + * + * 1. Bind a callback to class id by calling SetWrapperClassInfoProvider. + * 2. Call SetWrapperClassId on certain persistent handles. + * + * V8 takes ownership of RetainedObjectInfo instances passed to it and + * keeps them alive only during snapshot collection. Afterwards, they + * are freed by calling the Dispose class function. + */ +class V8_EXPORT RetainedObjectInfo { // NOLINT + public: + /** Called by V8 when it no longer needs an instance. */ + virtual void Dispose() = 0; + + /** Returns whether two instances are equivalent. */ + virtual bool IsEquivalent(RetainedObjectInfo* other) = 0; + + /** + * Returns hash value for the instance. Equivalent instances + * must have the same hash value. + */ + virtual intptr_t GetHash() = 0; + + /** + * Returns human-readable label. It must be a null-terminated UTF-8 + * encoded string. V8 copies its contents during a call to GetLabel. + */ + virtual const char* GetLabel() = 0; + + /** + * Returns human-readable group label. It must be a null-terminated UTF-8 + * encoded string. V8 copies its contents during a call to GetGroupLabel. + * Heap snapshot generator will collect all the group names, create + * top level entries with these names and attach the objects to the + * corresponding top level group objects. There is a default + * implementation which is required because embedders don't have their + * own implementation yet. + */ + virtual const char* GetGroupLabel() { return GetLabel(); } + + /** + * Returns element count in case if a global handle retains + * a subgraph by holding one of its nodes. + */ + virtual intptr_t GetElementCount() { return -1; } + + /** Returns embedder's object size in bytes. */ + virtual intptr_t GetSizeInBytes() { return -1; } + + protected: + RetainedObjectInfo() {} + virtual ~RetainedObjectInfo() {} + + private: + RetainedObjectInfo(const RetainedObjectInfo&); + RetainedObjectInfo& operator=(const RetainedObjectInfo&); +}; + + +/** + * A struct for exporting HeapStats data from V8, using "push" model. + * See HeapProfiler::GetHeapStats. + */ +struct HeapStatsUpdate { + HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size) + : index(index), count(count), size(size) { } + uint32_t index; // Index of the time interval that was changed. + uint32_t count; // New value of count field for the interval with this index. + uint32_t size; // New value of size field for the interval with this index. +}; + + +} // namespace v8 + + +#endif // V8_V8_PROFILER_H_ diff --git a/calclib/src/main/cpp/include/v8-testing.h b/calclib/src/main/cpp/include/v8-testing.h new file mode 100644 index 0000000..f67bf25 --- /dev/null +++ b/calclib/src/main/cpp/include/v8-testing.h @@ -0,0 +1,48 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_V8_TEST_H_ +#define V8_V8_TEST_H_ + +#include "v8.h" // NOLINT(build/include) + +/** + * Testing support for the V8 JavaScript engine. + */ +namespace v8 { + +class V8_EXPORT Testing { + public: + enum StressType { + kStressTypeOpt, + kStressTypeDeopt + }; + + /** + * Set the type of stressing to do. The default if not set is kStressTypeOpt. + */ + static void SetStressRunType(StressType type); + + /** + * Get the number of runs of a given test that is required to get the full + * stress coverage. + */ + static int GetStressRuns(); + + /** + * Indicate the number of the run which is about to start. The value of run + * should be between 0 and one less than the result from GetStressRuns() + */ + static void PrepareStressRun(int run); + + /** + * Force deoptimization of all functions. + */ + static void DeoptimizeAll(Isolate* isolate); +}; + + +} // namespace v8 + +#endif // V8_V8_TEST_H_ diff --git a/calclib/src/main/cpp/include/v8-util.h b/calclib/src/main/cpp/include/v8-util.h new file mode 100644 index 0000000..99c59fe --- /dev/null +++ b/calclib/src/main/cpp/include/v8-util.h @@ -0,0 +1,659 @@ +// Copyright 2014 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_UTIL_H_ +#define V8_UTIL_H_ + +#include "v8.h" // NOLINT(build/include) +#include +#include + +/** + * Support for Persistent containers. + * + * C++11 embedders can use STL containers with Global values, + * but pre-C++11 does not support the required move semantic and hence + * may want these container classes. + */ +namespace v8 { + +typedef uintptr_t PersistentContainerValue; +static const uintptr_t kPersistentContainerNotFound = 0; +enum PersistentContainerCallbackType { + kNotWeak, + // These correspond to v8::WeakCallbackType + kWeakWithParameter, + kWeakWithInternalFields, + kWeak = kWeakWithParameter // For backwards compatibility. Deprecate. +}; + + +/** + * A default trait implemenation for PersistentValueMap which uses std::map + * as a backing map. + * + * Users will have to implement their own weak callbacks & dispose traits. + */ +template +class StdMapTraits { + public: + // STL map & related: + typedef std::map Impl; + typedef typename Impl::iterator Iterator; + + static bool Empty(Impl* impl) { return impl->empty(); } + static size_t Size(Impl* impl) { return impl->size(); } + static void Swap(Impl& a, Impl& b) { std::swap(a, b); } // NOLINT + static Iterator Begin(Impl* impl) { return impl->begin(); } + static Iterator End(Impl* impl) { return impl->end(); } + static K Key(Iterator it) { return it->first; } + static PersistentContainerValue Value(Iterator it) { return it->second; } + static PersistentContainerValue Set(Impl* impl, K key, + PersistentContainerValue value) { + std::pair res = impl->insert(std::make_pair(key, value)); + PersistentContainerValue old_value = kPersistentContainerNotFound; + if (!res.second) { + old_value = res.first->second; + res.first->second = value; + } + return old_value; + } + static PersistentContainerValue Get(Impl* impl, K key) { + Iterator it = impl->find(key); + if (it == impl->end()) return kPersistentContainerNotFound; + return it->second; + } + static PersistentContainerValue Remove(Impl* impl, K key) { + Iterator it = impl->find(key); + if (it == impl->end()) return kPersistentContainerNotFound; + PersistentContainerValue value = it->second; + impl->erase(it); + return value; + } +}; + + +/** + * A default trait implementation for PersistentValueMap, which inherits + * a std:map backing map from StdMapTraits and holds non-weak persistent + * objects and has no special Dispose handling. + * + * You should not derive from this class, since MapType depends on the + * surrounding class, and hence a subclass cannot simply inherit the methods. + */ +template +class DefaultPersistentValueMapTraits : public StdMapTraits { + public: + // Weak callback & friends: + static const PersistentContainerCallbackType kCallbackType = kNotWeak; + typedef PersistentValueMap > + MapType; + typedef void WeakCallbackDataType; + + static WeakCallbackDataType* WeakCallbackParameter( + MapType* map, const K& key, Local value) { + return NULL; + } + static MapType* MapFromWeakCallbackInfo( + const WeakCallbackInfo& data) { + return NULL; + } + static K KeyFromWeakCallbackInfo( + const WeakCallbackInfo& data) { + return K(); + } + static void DisposeCallbackData(WeakCallbackDataType* data) { } + static void Dispose(Isolate* isolate, Global value, K key) {} +}; + + +template +class DefaultGlobalMapTraits : public StdMapTraits { + private: + template + struct RemovePointer; + + public: + // Weak callback & friends: + static const PersistentContainerCallbackType kCallbackType = kNotWeak; + typedef GlobalValueMap > MapType; + typedef void WeakCallbackDataType; + + static WeakCallbackDataType* WeakCallbackParameter(MapType* map, const K& key, + Local value) { + return nullptr; + } + static MapType* MapFromWeakCallbackInfo( + const WeakCallbackInfo& data) { + return nullptr; + } + static K KeyFromWeakCallbackInfo( + const WeakCallbackInfo& data) { + return K(); + } + static void DisposeCallbackData(WeakCallbackDataType* data) {} + static void OnWeakCallback( + const WeakCallbackInfo& data) {} + static void Dispose(Isolate* isolate, Global value, K key) {} + // This is a second pass callback, so SetSecondPassCallback cannot be called. + static void DisposeWeak(const WeakCallbackInfo& data) {} + + private: + template + struct RemovePointer { + typedef T Type; + }; +}; + + +/** + * A map wrapper that allows using Global as a mapped value. + * C++11 embedders don't need this class, as they can use Global + * directly in std containers. + * + * The map relies on a backing map, whose type and accessors are described + * by the Traits class. The backing map will handle values of type + * PersistentContainerValue, with all conversion into and out of V8 + * handles being transparently handled by this class. + */ +template +class PersistentValueMapBase { + public: + Isolate* GetIsolate() { return isolate_; } + + /** + * Return size of the map. + */ + size_t Size() { return Traits::Size(&impl_); } + + /** + * Return whether the map holds weak persistents. + */ + bool IsWeak() { return Traits::kCallbackType != kNotWeak; } + + /** + * Get value stored in map. + */ + Local Get(const K& key) { + return Local::New(isolate_, FromVal(Traits::Get(&impl_, key))); + } + + /** + * Check whether a value is contained in the map. + */ + bool Contains(const K& key) { + return Traits::Get(&impl_, key) != kPersistentContainerNotFound; + } + + /** + * Get value stored in map and set it in returnValue. + * Return true if a value was found. + */ + bool SetReturnValue(const K& key, + ReturnValue returnValue) { + return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key)); + } + + /** + * Call Isolate::SetReference with the given parent and the map value. + */ + void SetReference(const K& key, + const Persistent& parent) { + GetIsolate()->SetReference( + reinterpret_cast(parent.val_), + reinterpret_cast(FromVal(Traits::Get(&impl_, key)))); + } + + /** + * Deprecated. Call V8::RegisterExternallyReferencedObject with the map value + * for given key. + * TODO(hlopko) Remove once migration to reporter is finished. + */ + void RegisterExternallyReferencedObject(K& key) {} + + /** + * Use EmbedderReachableReferenceReporter with the map value for given key. + */ + void RegisterExternallyReferencedObject( + EmbedderReachableReferenceReporter* reporter, K& key) { + DCHECK(Contains(key)); + reporter->ReportExternalReference(FromVal(Traits::Get(&impl_, key))); + } + + /** + * Return value for key and remove it from the map. + */ + Global Remove(const K& key) { + return Release(Traits::Remove(&impl_, key)).Pass(); + } + + /** + * Traverses the map repeatedly, + * in case side effects of disposal cause insertions. + **/ + void Clear() { + typedef typename Traits::Iterator It; + HandleScope handle_scope(isolate_); + // TODO(dcarney): figure out if this swap and loop is necessary. + while (!Traits::Empty(&impl_)) { + typename Traits::Impl impl; + Traits::Swap(impl_, impl); + for (It i = Traits::Begin(&impl); i != Traits::End(&impl); ++i) { + Traits::Dispose(isolate_, Release(Traits::Value(i)).Pass(), + Traits::Key(i)); + } + } + } + + /** + * Helper class for GetReference/SetWithReference. Do not use outside + * that context. + */ + class PersistentValueReference { + public: + PersistentValueReference() : value_(kPersistentContainerNotFound) { } + PersistentValueReference(const PersistentValueReference& other) + : value_(other.value_) { } + + Local NewLocal(Isolate* isolate) const { + return Local::New(isolate, FromVal(value_)); + } + bool IsEmpty() const { + return value_ == kPersistentContainerNotFound; + } + template + bool SetReturnValue(ReturnValue returnValue) { + return SetReturnValueFromVal(&returnValue, value_); + } + void Reset() { + value_ = kPersistentContainerNotFound; + } + void operator=(const PersistentValueReference& other) { + value_ = other.value_; + } + + private: + friend class PersistentValueMapBase; + friend class PersistentValueMap; + friend class GlobalValueMap; + + explicit PersistentValueReference(PersistentContainerValue value) + : value_(value) { } + + void operator=(PersistentContainerValue value) { + value_ = value; + } + + PersistentContainerValue value_; + }; + + /** + * Get a reference to a map value. This enables fast, repeated access + * to a value stored in the map while the map remains unchanged. + * + * Careful: This is potentially unsafe, so please use with care. + * The value will become invalid if the value for this key changes + * in the underlying map, as a result of Set or Remove for the same + * key; as a result of the weak callback for the same key; or as a + * result of calling Clear() or destruction of the map. + */ + PersistentValueReference GetReference(const K& key) { + return PersistentValueReference(Traits::Get(&impl_, key)); + } + + protected: + explicit PersistentValueMapBase(Isolate* isolate) : isolate_(isolate) {} + + ~PersistentValueMapBase() { Clear(); } + + Isolate* isolate() { return isolate_; } + typename Traits::Impl* impl() { return &impl_; } + + static V* FromVal(PersistentContainerValue v) { + return reinterpret_cast(v); + } + + static PersistentContainerValue ClearAndLeak(Global* persistent) { + V* v = persistent->val_; + persistent->val_ = 0; + return reinterpret_cast(v); + } + + static PersistentContainerValue Leak(Global* persistent) { + return reinterpret_cast(persistent->val_); + } + + /** + * Return a container value as Global and make sure the weak + * callback is properly disposed of. All remove functionality should go + * through this. + */ + static Global Release(PersistentContainerValue v) { + Global p; + p.val_ = FromVal(v); + if (Traits::kCallbackType != kNotWeak && p.IsWeak()) { + Traits::DisposeCallbackData( + p.template ClearWeak()); + } + return p.Pass(); + } + + void RemoveWeak(const K& key) { + Global p; + p.val_ = FromVal(Traits::Remove(&impl_, key)); + p.Reset(); + } + + private: + PersistentValueMapBase(PersistentValueMapBase&); + void operator=(PersistentValueMapBase&); + + static bool SetReturnValueFromVal(ReturnValue* returnValue, + PersistentContainerValue value) { + bool hasValue = value != kPersistentContainerNotFound; + if (hasValue) { + returnValue->SetInternal( + *reinterpret_cast(FromVal(value))); + } + return hasValue; + } + + Isolate* isolate_; + typename Traits::Impl impl_; +}; + + +template +class PersistentValueMap : public PersistentValueMapBase { + public: + explicit PersistentValueMap(Isolate* isolate) + : PersistentValueMapBase(isolate) {} + + typedef + typename PersistentValueMapBase::PersistentValueReference + PersistentValueReference; + + /** + * Put value into map. Depending on Traits::kIsWeak, the value will be held + * by the map strongly or weakly. + * Returns old value as Global. + */ + Global Set(const K& key, Local value) { + Global persistent(this->isolate(), value); + return SetUnique(key, &persistent); + } + + /** + * Put value into map, like Set(const K&, Local). + */ + Global Set(const K& key, Global value) { + return SetUnique(key, &value); + } + + /** + * Put the value into the map, and set the 'weak' callback when demanded + * by the Traits class. + */ + Global SetUnique(const K& key, Global* persistent) { + if (Traits::kCallbackType != kNotWeak) { + Local value(Local::New(this->isolate(), *persistent)); + persistent->template SetWeak( + Traits::WeakCallbackParameter(this, key, value), WeakCallback); + } + PersistentContainerValue old_value = + Traits::Set(this->impl(), key, this->ClearAndLeak(persistent)); + return this->Release(old_value).Pass(); + } + + /** + * Put a value into the map and update the reference. + * Restrictions of GetReference apply here as well. + */ + Global Set(const K& key, Global value, + PersistentValueReference* reference) { + *reference = this->Leak(&value); + return SetUnique(key, &value); + } + + private: + static void WeakCallback( + const WeakCallbackInfo& data) { + if (Traits::kCallbackType != kNotWeak) { + PersistentValueMap* persistentValueMap = + Traits::MapFromWeakCallbackInfo(data); + K key = Traits::KeyFromWeakCallbackInfo(data); + Traits::Dispose(data.GetIsolate(), + persistentValueMap->Remove(key).Pass(), key); + Traits::DisposeCallbackData(data.GetParameter()); + } + } +}; + + +template +class GlobalValueMap : public PersistentValueMapBase { + public: + explicit GlobalValueMap(Isolate* isolate) + : PersistentValueMapBase(isolate) {} + + typedef + typename PersistentValueMapBase::PersistentValueReference + PersistentValueReference; + + /** + * Put value into map. Depending on Traits::kIsWeak, the value will be held + * by the map strongly or weakly. + * Returns old value as Global. + */ + Global Set(const K& key, Local value) { + Global persistent(this->isolate(), value); + return SetUnique(key, &persistent); + } + + /** + * Put value into map, like Set(const K&, Local). + */ + Global Set(const K& key, Global value) { + return SetUnique(key, &value); + } + + /** + * Put the value into the map, and set the 'weak' callback when demanded + * by the Traits class. + */ + Global SetUnique(const K& key, Global* persistent) { + if (Traits::kCallbackType != kNotWeak) { + WeakCallbackType callback_type = + Traits::kCallbackType == kWeakWithInternalFields + ? WeakCallbackType::kInternalFields + : WeakCallbackType::kParameter; + Local value(Local::New(this->isolate(), *persistent)); + persistent->template SetWeak( + Traits::WeakCallbackParameter(this, key, value), OnWeakCallback, + callback_type); + } + PersistentContainerValue old_value = + Traits::Set(this->impl(), key, this->ClearAndLeak(persistent)); + return this->Release(old_value).Pass(); + } + + /** + * Put a value into the map and update the reference. + * Restrictions of GetReference apply here as well. + */ + Global Set(const K& key, Global value, + PersistentValueReference* reference) { + *reference = this->Leak(&value); + return SetUnique(key, &value); + } + + private: + static void OnWeakCallback( + const WeakCallbackInfo& data) { + if (Traits::kCallbackType != kNotWeak) { + auto map = Traits::MapFromWeakCallbackInfo(data); + K key = Traits::KeyFromWeakCallbackInfo(data); + map->RemoveWeak(key); + Traits::OnWeakCallback(data); + data.SetSecondPassCallback(SecondWeakCallback); + } + } + + static void SecondWeakCallback( + const WeakCallbackInfo& data) { + Traits::DisposeWeak(data); + } +}; + + +/** + * A map that uses Global as value and std::map as the backing + * implementation. Persistents are held non-weak. + * + * C++11 embedders don't need this class, as they can use + * Global directly in std containers. + */ +template > +class StdPersistentValueMap : public PersistentValueMap { + public: + explicit StdPersistentValueMap(Isolate* isolate) + : PersistentValueMap(isolate) {} +}; + + +/** + * A map that uses Global as value and std::map as the backing + * implementation. Globals are held non-weak. + * + * C++11 embedders don't need this class, as they can use + * Global directly in std containers. + */ +template > +class StdGlobalValueMap : public GlobalValueMap { + public: + explicit StdGlobalValueMap(Isolate* isolate) + : GlobalValueMap(isolate) {} +}; + + +class DefaultPersistentValueVectorTraits { + public: + typedef std::vector Impl; + + static void Append(Impl* impl, PersistentContainerValue value) { + impl->push_back(value); + } + static bool IsEmpty(const Impl* impl) { + return impl->empty(); + } + static size_t Size(const Impl* impl) { + return impl->size(); + } + static PersistentContainerValue Get(const Impl* impl, size_t i) { + return (i < impl->size()) ? impl->at(i) : kPersistentContainerNotFound; + } + static void ReserveCapacity(Impl* impl, size_t capacity) { + impl->reserve(capacity); + } + static void Clear(Impl* impl) { + impl->clear(); + } +}; + + +/** + * A vector wrapper that safely stores Global values. + * C++11 embedders don't need this class, as they can use Global + * directly in std containers. + * + * This class relies on a backing vector implementation, whose type and methods + * are described by the Traits class. The backing map will handle values of type + * PersistentContainerValue, with all conversion into and out of V8 + * handles being transparently handled by this class. + */ +template +class PersistentValueVector { + public: + explicit PersistentValueVector(Isolate* isolate) : isolate_(isolate) { } + + ~PersistentValueVector() { + Clear(); + } + + /** + * Append a value to the vector. + */ + void Append(Local value) { + Global persistent(isolate_, value); + Traits::Append(&impl_, ClearAndLeak(&persistent)); + } + + /** + * Append a persistent's value to the vector. + */ + void Append(Global persistent) { + Traits::Append(&impl_, ClearAndLeak(&persistent)); + } + + /** + * Are there any values in the vector? + */ + bool IsEmpty() const { + return Traits::IsEmpty(&impl_); + } + + /** + * How many elements are in the vector? + */ + size_t Size() const { + return Traits::Size(&impl_); + } + + /** + * Retrieve the i-th value in the vector. + */ + Local Get(size_t index) const { + return Local::New(isolate_, FromVal(Traits::Get(&impl_, index))); + } + + /** + * Remove all elements from the vector. + */ + void Clear() { + size_t length = Traits::Size(&impl_); + for (size_t i = 0; i < length; i++) { + Global p; + p.val_ = FromVal(Traits::Get(&impl_, i)); + } + Traits::Clear(&impl_); + } + + /** + * Reserve capacity in the vector. + * (Efficiency gains depend on the backing implementation.) + */ + void ReserveCapacity(size_t capacity) { + Traits::ReserveCapacity(&impl_, capacity); + } + + private: + static PersistentContainerValue ClearAndLeak(Global* persistent) { + V* v = persistent->val_; + persistent->val_ = 0; + return reinterpret_cast(v); + } + + static V* FromVal(PersistentContainerValue v) { + return reinterpret_cast(v); + } + + Isolate* isolate_; + typename Traits::Impl impl_; +}; + +} // namespace v8 + +#endif // V8_UTIL_H diff --git a/calclib/src/main/cpp/include/v8-version-string.h b/calclib/src/main/cpp/include/v8-version-string.h new file mode 100644 index 0000000..075282d --- /dev/null +++ b/calclib/src/main/cpp/include/v8-version-string.h @@ -0,0 +1,33 @@ +// Copyright 2017 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_VERSION_STRING_H_ +#define V8_VERSION_STRING_H_ + +#include "v8-version.h" // NOLINT(build/include) + +// This is here rather than v8-version.h to keep that file simple and +// machine-processable. + +#if V8_IS_CANDIDATE_VERSION +#define V8_CANDIDATE_STRING " (candidate)" +#else +#define V8_CANDIDATE_STRING "" +#endif + +#define V8_SX(x) #x +#define V8_S(x) V8_SX(x) + +#if V8_PATCH_LEVEL > 0 +#define V8_VERSION_STRING \ + V8_S(V8_MAJOR_VERSION) \ + "." V8_S(V8_MINOR_VERSION) "." V8_S(V8_BUILD_NUMBER) "." V8_S( \ + V8_PATCH_LEVEL) V8_CANDIDATE_STRING +#else +#define V8_VERSION_STRING \ + V8_S(V8_MAJOR_VERSION) \ + "." V8_S(V8_MINOR_VERSION) "." V8_S(V8_BUILD_NUMBER) V8_CANDIDATE_STRING +#endif + +#endif // V8_VERSION_STRING_H_ diff --git a/calclib/src/main/cpp/include/v8-version.h b/calclib/src/main/cpp/include/v8-version.h new file mode 100644 index 0000000..16133c3 --- /dev/null +++ b/calclib/src/main/cpp/include/v8-version.h @@ -0,0 +1,20 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INCLUDE_VERSION_H_ // V8_VERSION_H_ conflicts with src/version.h +#define V8_INCLUDE_VERSION_H_ + +// These macros define the version number for the current version. +// NOTE these macros are used by some of the tool scripts and the build +// system so their names cannot be changed without changing the scripts. +#define V8_MAJOR_VERSION 5 +#define V8_MINOR_VERSION 5 +#define V8_BUILD_NUMBER 372 +#define V8_PATCH_LEVEL 32 + +// Use 1 for candidates and 0 otherwise. +// (Boolean macro values are not supported by all preprocessors.) +#define V8_IS_CANDIDATE_VERSION 0 + +#endif // V8_INCLUDE_VERSION_H_ diff --git a/calclib/src/main/cpp/include/v8.h b/calclib/src/main/cpp/include/v8.h new file mode 100644 index 0000000..36edf53 --- /dev/null +++ b/calclib/src/main/cpp/include/v8.h @@ -0,0 +1,9660 @@ +// Copyright 2012 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** \mainpage V8 API Reference Guide + * + * V8 is Google's open source JavaScript engine. + * + * This set of documents provides reference material generated from the + * V8 header file, include/v8.h. + * + * For other documentation see http://code.google.com/apis/v8/ + */ + +#ifndef INCLUDE_V8_H_ +#define INCLUDE_V8_H_ + +#include +#include +#include +#include +#include +#include + +#include "v8-version.h" // NOLINT(build/include) +#include "v8config.h" // NOLINT(build/include) + +// We reserve the V8_* prefix for macros defined in V8 public API and +// assume there are no name conflicts with the embedder's code. + +#ifdef V8_OS_WIN + +// Setup for Windows DLL export/import. When building the V8 DLL the +// BUILDING_V8_SHARED needs to be defined. When building a program which uses +// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8 +// static library or building a program which uses the V8 static library neither +// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined. +#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED) +#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\ + build configuration to ensure that at most one of these is set +#endif + +#ifdef BUILDING_V8_SHARED +# define V8_EXPORT __declspec(dllexport) +#elif USING_V8_SHARED +# define V8_EXPORT __declspec(dllimport) +#else +# define V8_EXPORT +#endif // BUILDING_V8_SHARED + +#else // V8_OS_WIN + +// Setup for Linux shared library export. +#if V8_HAS_ATTRIBUTE_VISIBILITY +# ifdef BUILDING_V8_SHARED +# define V8_EXPORT __attribute__ ((visibility("default"))) +# else +# define V8_EXPORT +# endif +#else +# define V8_EXPORT +#endif + +#endif // V8_OS_WIN + +/** + * The v8 JavaScript engine. + */ +namespace v8 { + +class AccessorSignature; +class Array; +class ArrayBuffer; +class Boolean; +class BooleanObject; +class Context; +class CpuProfiler; +class Data; +class Date; +class External; +class Function; +class FunctionTemplate; +class HeapProfiler; +class ImplementationUtilities; +class Int32; +class Integer; +class Isolate; +template +class Maybe; +class Name; +class Number; +class NumberObject; +class Object; +class ObjectOperationDescriptor; +class ObjectTemplate; +class Platform; +class Primitive; +class Promise; +class PropertyDescriptor; +class Proxy; +class RawOperationDescriptor; +class Script; +class SharedArrayBuffer; +class Signature; +class StartupData; +class StackFrame; +class StackTrace; +class String; +class StringObject; +class Symbol; +class SymbolObject; +class Private; +class Uint32; +class Utils; +class Value; +template class Local; +template +class MaybeLocal; +template class Eternal; +template class NonCopyablePersistentTraits; +template class PersistentBase; +template > +class Persistent; +template +class Global; +template class PersistentValueMap; +template +class PersistentValueMapBase; +template +class GlobalValueMap; +template class PersistentValueVector; +template class WeakCallbackObject; +class FunctionTemplate; +class ObjectTemplate; +class Data; +template class FunctionCallbackInfo; +template class PropertyCallbackInfo; +class StackTrace; +class StackFrame; +class Isolate; +class CallHandlerHelper; +class EscapableHandleScope; +template class ReturnValue; + +namespace experimental { +class FastAccessorBuilder; +} // namespace experimental + +namespace internal { +class Arguments; +class Heap; +class HeapObject; +class Isolate; +class Object; +struct StreamedSource; +template class CustomArguments; +class PropertyCallbackArguments; +class FunctionCallbackArguments; +class GlobalHandles; +} // namespace internal + + +/** + * General purpose unique identifier. + */ +class UniqueId { + public: + explicit UniqueId(intptr_t data) + : data_(data) {} + + bool operator==(const UniqueId& other) const { + return data_ == other.data_; + } + + bool operator!=(const UniqueId& other) const { + return data_ != other.data_; + } + + bool operator<(const UniqueId& other) const { + return data_ < other.data_; + } + + private: + intptr_t data_; +}; + +// --- Handles --- + +#define TYPE_CHECK(T, S) \ + while (false) { \ + *(static_cast(0)) = static_cast(0); \ + } + + +/** + * An object reference managed by the v8 garbage collector. + * + * All objects returned from v8 have to be tracked by the garbage + * collector so that it knows that the objects are still alive. Also, + * because the garbage collector may move objects, it is unsafe to + * point directly to an object. Instead, all objects are stored in + * handles which are known by the garbage collector and updated + * whenever an object moves. Handles should always be passed by value + * (except in cases like out-parameters) and they should never be + * allocated on the heap. + * + * There are two types of handles: local and persistent handles. + * Local handles are light-weight and transient and typically used in + * local operations. They are managed by HandleScopes. Persistent + * handles can be used when storing objects across several independent + * operations and have to be explicitly deallocated when they're no + * longer used. + * + * It is safe to extract the object stored in the handle by + * dereferencing the handle (for instance, to extract the Object* from + * a Local); the value will still be governed by a handle + * behind the scenes and the same rules apply to these values as to + * their handles. + */ +template +class Local { + public: + V8_INLINE Local() : val_(0) {} + template + V8_INLINE Local(Local that) + : val_(reinterpret_cast(*that)) { + /** + * This check fails when trying to convert between incompatible + * handles. For example, converting from a Local to a + * Local. + */ + TYPE_CHECK(T, S); + } + + /** + * Returns true if the handle is empty. + */ + V8_INLINE bool IsEmpty() const { return val_ == 0; } + + /** + * Sets the handle to be empty. IsEmpty() will then return true. + */ + V8_INLINE void Clear() { val_ = 0; } + + V8_INLINE T* operator->() const { return val_; } + + V8_INLINE T* operator*() const { return val_; } + + /** + * Checks whether two handles are the same. + * Returns true if both are empty, or if the objects + * to which they refer are identical. + * The handles' references are not checked. + */ + template + V8_INLINE bool operator==(const Local& that) const { + internal::Object** a = reinterpret_cast(this->val_); + internal::Object** b = reinterpret_cast(that.val_); + if (a == 0) return b == 0; + if (b == 0) return false; + return *a == *b; + } + + template V8_INLINE bool operator==( + const PersistentBase& that) const { + internal::Object** a = reinterpret_cast(this->val_); + internal::Object** b = reinterpret_cast(that.val_); + if (a == 0) return b == 0; + if (b == 0) return false; + return *a == *b; + } + + /** + * Checks whether two handles are different. + * Returns true if only one of the handles is empty, or if + * the objects to which they refer are different. + * The handles' references are not checked. + */ + template + V8_INLINE bool operator!=(const Local& that) const { + return !operator==(that); + } + + template V8_INLINE bool operator!=( + const Persistent& that) const { + return !operator==(that); + } + + template V8_INLINE static Local Cast(Local that) { +#ifdef V8_ENABLE_CHECKS + // If we're going to perform the type check then we have to check + // that the handle isn't empty before doing the checked cast. + if (that.IsEmpty()) return Local(); +#endif + return Local(T::Cast(*that)); + } + + template + V8_INLINE Local As() const { + return Local::Cast(*this); + } + + /** + * Create a local handle for the content of another handle. + * The referee is kept alive by the local handle even when + * the original handle is destroyed/disposed. + */ + V8_INLINE static Local New(Isolate* isolate, Local that); + V8_INLINE static Local New(Isolate* isolate, + const PersistentBase& that); + + private: + friend class Utils; + template friend class Eternal; + template friend class PersistentBase; + template friend class Persistent; + template friend class Local; + template + friend class MaybeLocal; + template friend class FunctionCallbackInfo; + template friend class PropertyCallbackInfo; + friend class String; + friend class Object; + friend class Context; + friend class Private; + template friend class internal::CustomArguments; + friend Local Undefined(Isolate* isolate); + friend Local Null(Isolate* isolate); + friend Local True(Isolate* isolate); + friend Local False(Isolate* isolate); + friend class HandleScope; + friend class EscapableHandleScope; + template + friend class PersistentValueMapBase; + template friend class PersistentValueVector; + template + friend class ReturnValue; + + explicit V8_INLINE Local(T* that) : val_(that) {} + V8_INLINE static Local New(Isolate* isolate, T* that); + T* val_; +}; + + +#if !defined(V8_IMMINENT_DEPRECATION_WARNINGS) +// Handle is an alias for Local for historical reasons. +template +using Handle = Local; +#endif + + +/** + * A MaybeLocal<> is a wrapper around Local<> that enforces a check whether + * the Local<> is empty before it can be used. + * + * If an API method returns a MaybeLocal<>, the API method can potentially fail + * either because an exception is thrown, or because an exception is pending, + * e.g. because a previous API call threw an exception that hasn't been caught + * yet, or because a TerminateExecution exception was thrown. In that case, an + * empty MaybeLocal is returned. + */ +template +class MaybeLocal { + public: + V8_INLINE MaybeLocal() : val_(nullptr) {} + template + V8_INLINE MaybeLocal(Local that) + : val_(reinterpret_cast(*that)) { + TYPE_CHECK(T, S); + } + + V8_INLINE bool IsEmpty() const { return val_ == nullptr; } + + template + V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local* out) const { + out->val_ = IsEmpty() ? nullptr : this->val_; + return !IsEmpty(); + } + + // Will crash if the MaybeLocal<> is empty. + V8_INLINE Local ToLocalChecked(); + + template + V8_INLINE Local FromMaybe(Local default_value) const { + return IsEmpty() ? default_value : Local(val_); + } + + private: + T* val_; +}; + + +// Eternal handles are set-once handles that live for the life of the isolate. +template class Eternal { + public: + V8_INLINE Eternal() : index_(kInitialValue) { } + template + V8_INLINE Eternal(Isolate* isolate, Local handle) : index_(kInitialValue) { + Set(isolate, handle); + } + // Can only be safely called if already set. + V8_INLINE Local Get(Isolate* isolate); + V8_INLINE bool IsEmpty() { return index_ == kInitialValue; } + template V8_INLINE void Set(Isolate* isolate, Local handle); + + private: + static const int kInitialValue = -1; + int index_; +}; + + +static const int kInternalFieldsInWeakCallback = 2; + + +template +class WeakCallbackInfo { + public: + typedef void (*Callback)(const WeakCallbackInfo& data); + + WeakCallbackInfo(Isolate* isolate, T* parameter, + void* internal_fields[kInternalFieldsInWeakCallback], + Callback* callback) + : isolate_(isolate), parameter_(parameter), callback_(callback) { + for (int i = 0; i < kInternalFieldsInWeakCallback; ++i) { + internal_fields_[i] = internal_fields[i]; + } + } + + V8_INLINE Isolate* GetIsolate() const { return isolate_; } + V8_INLINE T* GetParameter() const { return parameter_; } + V8_INLINE void* GetInternalField(int index) const; + + V8_INLINE V8_DEPRECATED("use indexed version", + void* GetInternalField1() const) { + return internal_fields_[0]; + } + V8_INLINE V8_DEPRECATED("use indexed version", + void* GetInternalField2() const) { + return internal_fields_[1]; + } + + V8_DEPRECATED("Not realiable once SetSecondPassCallback() was used.", + bool IsFirstPass() const) { + return callback_ != nullptr; + } + + // When first called, the embedder MUST Reset() the Global which triggered the + // callback. The Global itself is unusable for anything else. No v8 other api + // calls may be called in the first callback. Should additional work be + // required, the embedder must set a second pass callback, which will be + // called after all the initial callbacks are processed. + // Calling SetSecondPassCallback on the second pass will immediately crash. + void SetSecondPassCallback(Callback callback) const { *callback_ = callback; } + + private: + Isolate* isolate_; + T* parameter_; + Callback* callback_; + void* internal_fields_[kInternalFieldsInWeakCallback]; +}; + + +// kParameter will pass a void* parameter back to the callback, kInternalFields +// will pass the first two internal fields back to the callback, kFinalizer +// will pass a void* parameter back, but is invoked before the object is +// actually collected, so it can be resurrected. In the last case, it is not +// possible to request a second pass callback. +enum class WeakCallbackType { kParameter, kInternalFields, kFinalizer }; + +/** + * A reporter class that embedder will use to report reachable references found + * by EmbedderHeapTracer. + */ +class V8_EXPORT EmbedderReachableReferenceReporter { + public: + virtual void ReportExternalReference(Value* object) = 0; + virtual ~EmbedderReachableReferenceReporter() = default; +}; + +/** + * An object reference that is independent of any handle scope. Where + * a Local handle only lives as long as the HandleScope in which it was + * allocated, a PersistentBase handle remains valid until it is explicitly + * disposed. + * + * A persistent handle contains a reference to a storage cell within + * the v8 engine which holds an object value and which is updated by + * the garbage collector whenever the object is moved. A new storage + * cell can be created using the constructor or PersistentBase::Reset and + * existing handles can be disposed using PersistentBase::Reset. + * + */ +template class PersistentBase { + public: + /** + * If non-empty, destroy the underlying storage cell + * IsEmpty() will return true after this call. + */ + V8_INLINE void Reset(); + /** + * If non-empty, destroy the underlying storage cell + * and create a new one with the contents of other if other is non empty + */ + template + V8_INLINE void Reset(Isolate* isolate, const Local& other); + + /** + * If non-empty, destroy the underlying storage cell + * and create a new one with the contents of other if other is non empty + */ + template + V8_INLINE void Reset(Isolate* isolate, const PersistentBase& other); + + V8_INLINE bool IsEmpty() const { return val_ == NULL; } + V8_INLINE void Empty() { val_ = 0; } + + V8_INLINE Local Get(Isolate* isolate) const { + return Local::New(isolate, *this); + } + + template + V8_INLINE bool operator==(const PersistentBase& that) const { + internal::Object** a = reinterpret_cast(this->val_); + internal::Object** b = reinterpret_cast(that.val_); + if (a == NULL) return b == NULL; + if (b == NULL) return false; + return *a == *b; + } + + template + V8_INLINE bool operator==(const Local& that) const { + internal::Object** a = reinterpret_cast(this->val_); + internal::Object** b = reinterpret_cast(that.val_); + if (a == NULL) return b == NULL; + if (b == NULL) return false; + return *a == *b; + } + + template + V8_INLINE bool operator!=(const PersistentBase& that) const { + return !operator==(that); + } + + template + V8_INLINE bool operator!=(const Local& that) const { + return !operator==(that); + } + + /** + * Install a finalization callback on this object. + * NOTE: There is no guarantee as to *when* or even *if* the callback is + * invoked. The invocation is performed solely on a best effort basis. + * As always, GC-based finalization should *not* be relied upon for any + * critical form of resource management! + */ + template + V8_INLINE void SetWeak(P* parameter, + typename WeakCallbackInfo

::Callback callback, + WeakCallbackType type); + + /** + * Turns this handle into a weak phantom handle without finalization callback. + * The handle will be reset automatically when the garbage collector detects + * that the object is no longer reachable. + * A related function Isolate::NumberOfPhantomHandleResetsSinceLastCall + * returns how many phantom handles were reset by the garbage collector. + */ + V8_INLINE void SetWeak(); + + template + V8_INLINE P* ClearWeak(); + + // TODO(dcarney): remove this. + V8_INLINE void ClearWeak() { ClearWeak(); } + + /** + * Deprecated. + * TODO(hlopko): remove once migration to reporter is finished. + */ + V8_INLINE void RegisterExternalReference(Isolate* isolate) const {} + + /** + * Allows the embedder to tell the v8 garbage collector that a certain object + * is alive. Only allowed when the embedder is asked to trace its heap by + * EmbedderHeapTracer. + */ + V8_INLINE void RegisterExternalReference( + EmbedderReachableReferenceReporter* reporter) const; + + /** + * Marks the reference to this object independent. Garbage collector is free + * to ignore any object groups containing this object. Weak callback for an + * independent handle should not assume that it will be preceded by a global + * GC prologue callback or followed by a global GC epilogue callback. + */ + V8_INLINE void MarkIndependent(); + + /** + * Marks the reference to this object partially dependent. Partially dependent + * handles only depend on other partially dependent handles and these + * dependencies are provided through object groups. It provides a way to build + * smaller object groups for young objects that represent only a subset of all + * external dependencies. This mark is automatically cleared after each + * garbage collection. + */ + V8_INLINE V8_DEPRECATED( + "deprecated optimization, do not use partially dependent groups", + void MarkPartiallyDependent()); + + /** + * Marks the reference to this object as active. The scavenge garbage + * collection should not reclaim the objects marked as active. + * This bit is cleared after the each garbage collection pass. + */ + V8_INLINE void MarkActive(); + + V8_INLINE bool IsIndependent() const; + + /** Checks if the handle holds the only reference to an object. */ + V8_INLINE bool IsNearDeath() const; + + /** Returns true if the handle's reference is weak. */ + V8_INLINE bool IsWeak() const; + + /** + * Assigns a wrapper class ID to the handle. See RetainedObjectInfo interface + * description in v8-profiler.h for details. + */ + V8_INLINE void SetWrapperClassId(uint16_t class_id); + + /** + * Returns the class ID previously assigned to this handle or 0 if no class ID + * was previously assigned. + */ + V8_INLINE uint16_t WrapperClassId() const; + + PersistentBase(const PersistentBase& other) = delete; // NOLINT + void operator=(const PersistentBase&) = delete; + + private: + friend class Isolate; + friend class Utils; + template friend class Local; + template friend class Persistent; + template + friend class Global; + template friend class PersistentBase; + template friend class ReturnValue; + template + friend class PersistentValueMapBase; + template friend class PersistentValueVector; + friend class Object; + + explicit V8_INLINE PersistentBase(T* val) : val_(val) {} + V8_INLINE static T* New(Isolate* isolate, T* that); + + T* val_; +}; + + +/** + * Default traits for Persistent. This class does not allow + * use of the copy constructor or assignment operator. + * At present kResetInDestructor is not set, but that will change in a future + * version. + */ +template +class NonCopyablePersistentTraits { + public: + typedef Persistent > NonCopyablePersistent; + static const bool kResetInDestructor = false; + template + V8_INLINE static void Copy(const Persistent& source, + NonCopyablePersistent* dest) { + Uncompilable(); + } + // TODO(dcarney): come up with a good compile error here. + template V8_INLINE static void Uncompilable() { + TYPE_CHECK(O, Primitive); + } +}; + + +/** + * Helper class traits to allow copying and assignment of Persistent. + * This will clone the contents of storage cell, but not any of the flags, etc. + */ +template +struct CopyablePersistentTraits { + typedef Persistent > CopyablePersistent; + static const bool kResetInDestructor = true; + template + static V8_INLINE void Copy(const Persistent& source, + CopyablePersistent* dest) { + // do nothing, just allow copy + } +}; + + +/** + * A PersistentBase which allows copy and assignment. + * + * Copy, assignment and destructor bevavior is controlled by the traits + * class M. + * + * Note: Persistent class hierarchy is subject to future changes. + */ +template class Persistent : public PersistentBase { + public: + /** + * A Persistent with no storage cell. + */ + V8_INLINE Persistent() : PersistentBase(0) { } + /** + * Construct a Persistent from a Local. + * When the Local is non-empty, a new storage cell is created + * pointing to the same object, and no flags are set. + */ + template + V8_INLINE Persistent(Isolate* isolate, Local that) + : PersistentBase(PersistentBase::New(isolate, *that)) { + TYPE_CHECK(T, S); + } + /** + * Construct a Persistent from a Persistent. + * When the Persistent is non-empty, a new storage cell is created + * pointing to the same object, and no flags are set. + */ + template + V8_INLINE Persistent(Isolate* isolate, const Persistent& that) + : PersistentBase(PersistentBase::New(isolate, *that)) { + TYPE_CHECK(T, S); + } + /** + * The copy constructors and assignment operator create a Persistent + * exactly as the Persistent constructor, but the Copy function from the + * traits class is called, allowing the setting of flags based on the + * copied Persistent. + */ + V8_INLINE Persistent(const Persistent& that) : PersistentBase(0) { + Copy(that); + } + template + V8_INLINE Persistent(const Persistent& that) : PersistentBase(0) { + Copy(that); + } + V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT + Copy(that); + return *this; + } + template + V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT + Copy(that); + return *this; + } + /** + * The destructor will dispose the Persistent based on the + * kResetInDestructor flags in the traits class. Since not calling dispose + * can result in a memory leak, it is recommended to always set this flag. + */ + V8_INLINE ~Persistent() { + if (M::kResetInDestructor) this->Reset(); + } + + // TODO(dcarney): this is pretty useless, fix or remove + template + V8_INLINE static Persistent& Cast(const Persistent& that) { // NOLINT +#ifdef V8_ENABLE_CHECKS + // If we're going to perform the type check then we have to check + // that the handle isn't empty before doing the checked cast. + if (!that.IsEmpty()) T::Cast(*that); +#endif + return reinterpret_cast&>(const_cast&>(that)); + } + + // TODO(dcarney): this is pretty useless, fix or remove + template + V8_INLINE Persistent& As() const { // NOLINT + return Persistent::Cast(*this); + } + + private: + friend class Isolate; + friend class Utils; + template friend class Local; + template friend class Persistent; + template friend class ReturnValue; + + explicit V8_INLINE Persistent(T* that) : PersistentBase(that) {} + V8_INLINE T* operator*() const { return this->val_; } + template + V8_INLINE void Copy(const Persistent& that); +}; + + +/** + * A PersistentBase which has move semantics. + * + * Note: Persistent class hierarchy is subject to future changes. + */ +template +class Global : public PersistentBase { + public: + /** + * A Global with no storage cell. + */ + V8_INLINE Global() : PersistentBase(nullptr) {} + /** + * Construct a Global from a Local. + * When the Local is non-empty, a new storage cell is created + * pointing to the same object, and no flags are set. + */ + template + V8_INLINE Global(Isolate* isolate, Local that) + : PersistentBase(PersistentBase::New(isolate, *that)) { + TYPE_CHECK(T, S); + } + /** + * Construct a Global from a PersistentBase. + * When the Persistent is non-empty, a new storage cell is created + * pointing to the same object, and no flags are set. + */ + template + V8_INLINE Global(Isolate* isolate, const PersistentBase& that) + : PersistentBase(PersistentBase::New(isolate, that.val_)) { + TYPE_CHECK(T, S); + } + /** + * Move constructor. + */ + V8_INLINE Global(Global&& other) : PersistentBase(other.val_) { // NOLINT + other.val_ = nullptr; + } + V8_INLINE ~Global() { this->Reset(); } + /** + * Move via assignment. + */ + template + V8_INLINE Global& operator=(Global&& rhs) { // NOLINT + TYPE_CHECK(T, S); + if (this != &rhs) { + this->Reset(); + this->val_ = rhs.val_; + rhs.val_ = nullptr; + } + return *this; + } + /** + * Pass allows returning uniques from functions, etc. + */ + Global Pass() { return static_cast(*this); } // NOLINT + + /* + * For compatibility with Chromium's base::Bind (base::Passed). + */ + typedef void MoveOnlyTypeForCPP03; + + Global(const Global&) = delete; + void operator=(const Global&) = delete; + + private: + template + friend class ReturnValue; + V8_INLINE T* operator*() const { return this->val_; } +}; + + +// UniquePersistent is an alias for Global for historical reason. +template +using UniquePersistent = Global; + + + /** + * A stack-allocated class that governs a number of local handles. + * After a handle scope has been created, all local handles will be + * allocated within that handle scope until either the handle scope is + * deleted or another handle scope is created. If there is already a + * handle scope and a new one is created, all allocations will take + * place in the new handle scope until it is deleted. After that, + * new handles will again be allocated in the original handle scope. + * + * After the handle scope of a local handle has been deleted the + * garbage collector will no longer track the object stored in the + * handle and may deallocate it. The behavior of accessing a handle + * for which the handle scope has been deleted is undefined. + */ +class V8_EXPORT HandleScope { + public: + explicit HandleScope(Isolate* isolate); + + ~HandleScope(); + + /** + * Counts the number of allocated handles. + */ + static int NumberOfHandles(Isolate* isolate); + + V8_INLINE Isolate* GetIsolate() const { + return reinterpret_cast(isolate_); + } + + HandleScope(const HandleScope&) = delete; + void operator=(const HandleScope&) = delete; + void* operator new(size_t size) = delete; + void operator delete(void*, size_t) = delete; + + protected: + V8_INLINE HandleScope() {} + + void Initialize(Isolate* isolate); + + static internal::Object** CreateHandle(internal::Isolate* isolate, + internal::Object* value); + + private: + // Uses heap_object to obtain the current Isolate. + static internal::Object** CreateHandle(internal::HeapObject* heap_object, + internal::Object* value); + + internal::Isolate* isolate_; + internal::Object** prev_next_; + internal::Object** prev_limit_; + + // Local::New uses CreateHandle with an Isolate* parameter. + template friend class Local; + + // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with + // a HeapObject* in their shortcuts. + friend class Object; + friend class Context; +}; + + +/** + * A HandleScope which first allocates a handle in the current scope + * which will be later filled with the escape value. + */ +class V8_EXPORT EscapableHandleScope : public HandleScope { + public: + explicit EscapableHandleScope(Isolate* isolate); + V8_INLINE ~EscapableHandleScope() {} + + /** + * Pushes the value into the previous scope and returns a handle to it. + * Cannot be called twice. + */ + template + V8_INLINE Local Escape(Local value) { + internal::Object** slot = + Escape(reinterpret_cast(*value)); + return Local(reinterpret_cast(slot)); + } + + EscapableHandleScope(const EscapableHandleScope&) = delete; + void operator=(const EscapableHandleScope&) = delete; + void* operator new(size_t size) = delete; + void operator delete(void*, size_t) = delete; + + private: + internal::Object** Escape(internal::Object** escape_value); + internal::Object** escape_slot_; +}; + +class V8_EXPORT SealHandleScope { + public: + SealHandleScope(Isolate* isolate); + ~SealHandleScope(); + + SealHandleScope(const SealHandleScope&) = delete; + void operator=(const SealHandleScope&) = delete; + void* operator new(size_t size) = delete; + void operator delete(void*, size_t) = delete; + + private: + internal::Isolate* const isolate_; + internal::Object** prev_limit_; + int prev_sealed_level_; +}; + + +// --- Special objects --- + + +/** + * The superclass of values and API object templates. + */ +class V8_EXPORT Data { + private: + Data(); +}; + + +/** + * The optional attributes of ScriptOrigin. + */ +class ScriptOriginOptions { + public: + V8_INLINE ScriptOriginOptions(bool is_embedder_debug_script = false, + bool is_shared_cross_origin = false, + bool is_opaque = false) + : flags_((is_embedder_debug_script ? kIsEmbedderDebugScript : 0) | + (is_shared_cross_origin ? kIsSharedCrossOrigin : 0) | + (is_opaque ? kIsOpaque : 0)) {} + V8_INLINE ScriptOriginOptions(int flags) + : flags_(flags & + (kIsEmbedderDebugScript | kIsSharedCrossOrigin | kIsOpaque)) {} + bool IsEmbedderDebugScript() const { + return (flags_ & kIsEmbedderDebugScript) != 0; + } + bool IsSharedCrossOrigin() const { + return (flags_ & kIsSharedCrossOrigin) != 0; + } + bool IsOpaque() const { return (flags_ & kIsOpaque) != 0; } + int Flags() const { return flags_; } + + private: + enum { + kIsEmbedderDebugScript = 1, + kIsSharedCrossOrigin = 1 << 1, + kIsOpaque = 1 << 2 + }; + const int flags_; +}; + +/** + * The origin, within a file, of a script. + */ +class ScriptOrigin { + public: + V8_INLINE ScriptOrigin( + Local resource_name, + Local resource_line_offset = Local(), + Local resource_column_offset = Local(), + Local resource_is_shared_cross_origin = Local(), + Local script_id = Local(), + Local resource_is_embedder_debug_script = Local(), + Local source_map_url = Local(), + Local resource_is_opaque = Local()); + V8_INLINE Local ResourceName() const; + V8_INLINE Local ResourceLineOffset() const; + V8_INLINE Local ResourceColumnOffset() const; + /** + * Returns true for embedder's debugger scripts + */ + V8_INLINE Local ScriptID() const; + V8_INLINE Local SourceMapUrl() const; + V8_INLINE ScriptOriginOptions Options() const { return options_; } + + private: + Local resource_name_; + Local resource_line_offset_; + Local resource_column_offset_; + ScriptOriginOptions options_; + Local script_id_; + Local source_map_url_; +}; + + +/** + * A compiled JavaScript script, not yet tied to a Context. + */ +class V8_EXPORT UnboundScript { + public: + /** + * Binds the script to the currently entered context. + */ + Local