คำแนะนำเกี่ยวกับตัวแปร

เกริ่นนำ

ตามที่อธิบายไว้ในหน้าภาพรวม โค้ดโฮสต์จะทำการเรียก RPC ไปยังไลบรารีแซนด์บ็อกซ์ แซนด์บ็อกซ์จะทำให้มีการแยกหน่วยความจำระหว่างกระบวนการต่างๆ ดังนั้นโค้ดโฮสต์จึงไม่สามารถเข้าถึงหน่วยความจำในไลบรารีแซนด์บ็อกซ์ได้โดยตรง

เพื่อให้มั่นใจว่าโค้ดโฮสต์สามารถเข้าถึงตัวแปรและบล็อกหน่วยความจำในกระบวนการระยะไกล และทำให้การติดตั้งใช้งานโค้ดตรรกะหลักง่ายขึ้น SAPI มีชุดคลาส C++ ที่ครอบคลุม อย่างไรก็ตาม ในหลายๆ กรณีคุณจะสามารถใช้ประเภท C แบบเนทีฟได้ด้วย

ความต้องการประเภทพิเศษ (ประเภท SAPI) เกิดขึ้นเมื่อส่งผ่านตัวชี้ไปยังประเภทอย่างง่ายและบล็อกหน่วยความจำ (โครงสร้าง อาร์เรย์)

เช่น เมื่อเรียกฟังก์ชันโดยใช้ตัวชี้ จะต้องมีการแปลงตัวชี้เป็นตัวชี้ที่สอดคล้องกันภายในหน่วยความจำของไลบรารีแซนด์บ็อกซ์ ข้อมูลโค้ดด้านล่างจะแสดงสถานการณ์นี้ ระบบจะสร้างออบเจ็กต์ ::sapi::v::Array<int> แทนอาร์เรย์ของจำนวนเต็ม 3 ตัว จากนั้นจะส่งผ่านการเรียก API ของไลบรารีแซนด์บ็อกซ์ได้ดังนี้

int arr[3] = {1, 2, 3};
sapi::v::Array<int> sarr(arr, ABSL_ARRAYSIZE(arr));

โปรดดูภาพรวมที่ครอบคลุมของประเภท SAPI ที่มีทั้งหมดโดยตรวจสอบไฟล์ส่วนหัว var_*.h ในซอร์สโค้ดโปรเจ็กต์ SAPI ไฟล์ส่วนหัวเหล่านี้มีคลาสและเทมเพลตที่แสดงข้อมูลประเภทต่างๆ เช่น

  • ::sapi::v::UChar แสดงถึงอักขระที่ไม่มีสัญลักษณ์ซึ่งเป็นที่รู้จัก
  • ::sapi::v::Array<int> แสดงอาร์เรย์ของจำนวนเต็ม

ประเภท SAPI

ส่วนนี้จะแนะนำ SAPI สามประเภทที่มักพบในโค้ดโฮสต์

ตัวชี้ SAPI

หากฟังก์ชันที่จะแซนด์บ็อกซ์จำเป็นต้องส่งตัวชี้ ควรได้รับตัวชี้นี้จากเมธอด PtrXXX() ด้านล่างรายการใดรายการหนึ่ง คลาสตัวแปร SAPI จะใช้วิธีการเหล่านี้

ประเภทตัวชี้
::PtrNone() ไม่ซิงค์หน่วยความจำที่สำคัญระหว่างกระบวนการโค้ดโฮสต์และกระบวนการของไลบรารีแซนด์บ็อกซ์เมื่อส่งผ่านไปยังฟังก์ชัน API ที่ทำแซนด์บ็อกซ์
::PtrBefore() ซิงค์ข้อมูลหน่วยความจำของออบเจ็กต์ที่ออบเจ็กต์ชี้ไปก่อนที่จะเรียกใช้ฟังก์ชัน API แบบแซนด์บ็อกซ์ ซึ่งหมายความว่าระบบจะโอนหน่วยความจำภายในของตัวแปรชี้ไปยังกระบวนการของไลบรารีแซนด์บ็อกซ์ก่อนที่จะเริ่มต้นการเรียกใช้
::PtrAfter() ซิงค์หน่วยความจำของออบเจ็กต์ที่ออบเจ็กต์ชี้ไปหลังจากที่มีการเรียกฟังก์ชัน API แซนด์บ็อกซ์ ซึ่งหมายความว่าระบบจะโอนหน่วยความจำระยะไกลของตัวแปรที่ชี้ไปยังหน่วยความจำการประมวลผลของโค้ดโฮสต์หลังจากการเรียกใช้เสร็จสิ้น
::PtrBoth() รวมฟังก์ชันของ ::PtrBefore() และ ::PtrAfter()

ดูเอกสารสำหรับตัวชี้ SAPI ได้ที่นี่

โครงสร้าง SAPI

เทมเพลต ::sapi::v::Struct มีการบันทึกไว้ใน var_struct.h โดยมีตัวสร้างที่ใช้เพื่อรวมโครงสร้างที่มีอยู่ได้ โครงสร้าง SAPI แสดงวิธีทั้งหมดที่ระบุไว้ในตัวชี้ SAPI ในการรับออบเจ็กต์ ::sapi::v::Ptr ที่สามารถใช้สำหรับการเรียกไลบรารีแบบแซนด์บ็อกซ์

ข้อมูลโค้ดด้านล่างแสดงโครงสร้างที่กำลังเริ่มต้นและส่งไปยังการเรียกใช้ฟังก์ชันแซนด์บ็อกซ์ในตัวอย่าง zlib

sapi::v::Struct<sapi::zlib::z_stream> strm;
…
if (ret = api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
                             version.PtrBefore(), sizeof(sapi::zlib::z_stream));
…

หากโครงสร้างที่มีอยู่มีตัวชี้ ตัวชี้เหล่านั้นจะชี้ไปยังที่อยู่ในแซนด์บ็อกซ์ ดังนั้น คุณจะต้องโอนข้อมูลแซนด์บ็อกซ์ก่อนจึงจะเข้าถึงโค้ดโฮสต์ได้

อาร์เรย์ SAPI

เทมเพลต ::sapi::v::Array มีการบันทึกไว้ใน var_array.h โดยมีตัวสร้าง 2 รายการ รายการหนึ่งสามารถใช้ตัดอาร์เรย์ขององค์ประกอบที่มีอยู่ และอีกรายการเพื่อสร้างอาร์เรย์แบบไดนามิก

ข้อมูลโค้ดนี้ (นำมาจากตัวอย่างผลรวม) แสดงการใช้ตัวสร้างที่ล้อมรอบอาร์เรย์ที่ไม่ได้เป็นของออบเจ็กต์นี้

int arr[10];
sapi::v::Array<int> iarr(arr, ABSL_ARRAYSIZE(arr));

ข้อมูลโค้ดนี้แสดงตัวอย่างตัวสร้างที่ใช้ในการสร้างอาร์เรย์แบบไดนามิก:

sapi::v::Array<uint8_t> buffer(PNG_IMAGE_SIZE(*image.mutable_data()));

อาร์เรย์ SAPI จะระบุเมธอดทั้งหมดที่ระบุไว้ในตัวชี้ SAPI เพื่อรับออบเจ็กต์ ::sapi::v::Ptr ที่สามารถใช้สำหรับการเรียกไลบรารีแบบแซนด์บ็อกซ์